qpilot 0.13.0 → 0.13.1

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 (23) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +14 -14
  3. package/.next/standalone/.next/app-path-routes-manifest.json +4 -4
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +11 -11
  6. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  8. package/.next/standalone/.next/server/app/api/run/route.js +16 -13
  9. package/.next/standalone/.next/server/app/index.html +1 -1
  10. package/.next/standalone/.next/server/app/index.rsc +1 -1
  11. package/.next/standalone/.next/server/app/settings.html +1 -1
  12. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  13. package/.next/standalone/.next/server/app-paths-manifest.json +4 -4
  14. package/.next/standalone/.next/server/functions-config-manifest.json +4 -4
  15. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  16. package/.next/standalone/.next/server/pages/404.html +1 -1
  17. package/.next/standalone/.next/server/pages/500.html +1 -1
  18. package/.next/standalone/package.json +1 -1
  19. package/package.json +1 -1
  20. /package/.next/standalone/.next/static/{bkJayQnTQRf05bk-k7JdG → 8LZWNHPSxSMg8e76XWfqO}/_buildManifest.js +0 -0
  21. /package/.next/standalone/.next/static/{bkJayQnTQRf05bk-k7JdG → 8LZWNHPSxSMg8e76XWfqO}/_ssgManifest.js +0 -0
  22. /package/.next/static/{bkJayQnTQRf05bk-k7JdG → 8LZWNHPSxSMg8e76XWfqO}/_buildManifest.js +0 -0
  23. /package/.next/static/{bkJayQnTQRf05bk-k7JdG → 8LZWNHPSxSMg8e76XWfqO}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- bkJayQnTQRf05bk-k7JdG
1
+ 8LZWNHPSxSMg8e76XWfqO
@@ -15,12 +15,12 @@
15
15
  "static/css/6a883a6c62470f9e.css",
16
16
  "static/chunks/app/layout-662806276d567675.js"
17
17
  ],
18
- "/api/run/[id]/shot/[num]/route": [
18
+ "/api/runs/route": [
19
19
  "static/chunks/webpack-f706f8e3ff0a415c.js",
20
20
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
21
21
  "static/chunks/255-4f84124391a7dac4.js",
22
22
  "static/chunks/main-app-e5551aeb6fccb28b.js",
23
- "static/chunks/app/api/run/[id]/shot/[num]/route-3d2cf3d88ec0f399.js"
23
+ "static/chunks/app/api/runs/route-3d2cf3d88ec0f399.js"
24
24
  ],
25
25
  "/api/run/[id]/pause/route": [
26
26
  "static/chunks/webpack-f706f8e3ff0a415c.js",
@@ -29,47 +29,47 @@
29
29
  "static/chunks/main-app-e5551aeb6fccb28b.js",
30
30
  "static/chunks/app/api/run/[id]/pause/route-3d2cf3d88ec0f399.js"
31
31
  ],
32
- "/api/run/[id]/stream/route": [
32
+ "/api/run/[id]/answer/route": [
33
33
  "static/chunks/webpack-f706f8e3ff0a415c.js",
34
34
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
35
35
  "static/chunks/255-4f84124391a7dac4.js",
36
36
  "static/chunks/main-app-e5551aeb6fccb28b.js",
37
- "static/chunks/app/api/run/[id]/stream/route-3d2cf3d88ec0f399.js"
37
+ "static/chunks/app/api/run/[id]/answer/route-3d2cf3d88ec0f399.js"
38
38
  ],
39
- "/api/run/[id]/answer/route": [
39
+ "/api/run/[id]/shot/[num]/route": [
40
40
  "static/chunks/webpack-f706f8e3ff0a415c.js",
41
41
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
42
42
  "static/chunks/255-4f84124391a7dac4.js",
43
43
  "static/chunks/main-app-e5551aeb6fccb28b.js",
44
- "static/chunks/app/api/run/[id]/answer/route-3d2cf3d88ec0f399.js"
44
+ "static/chunks/app/api/run/[id]/shot/[num]/route-3d2cf3d88ec0f399.js"
45
45
  ],
46
- "/api/runs/route": [
46
+ "/api/run/route": [
47
47
  "static/chunks/webpack-f706f8e3ff0a415c.js",
48
48
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
49
49
  "static/chunks/255-4f84124391a7dac4.js",
50
50
  "static/chunks/main-app-e5551aeb6fccb28b.js",
51
- "static/chunks/app/api/runs/route-3d2cf3d88ec0f399.js"
51
+ "static/chunks/app/api/run/route-3d2cf3d88ec0f399.js"
52
52
  ],
53
- "/api/settings/route": [
53
+ "/api/run/[id]/stream/route": [
54
54
  "static/chunks/webpack-f706f8e3ff0a415c.js",
55
55
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
56
56
  "static/chunks/255-4f84124391a7dac4.js",
57
57
  "static/chunks/main-app-e5551aeb6fccb28b.js",
58
- "static/chunks/app/api/settings/route-3d2cf3d88ec0f399.js"
58
+ "static/chunks/app/api/run/[id]/stream/route-3d2cf3d88ec0f399.js"
59
59
  ],
60
- "/api/settings/models/route": [
60
+ "/api/settings/route": [
61
61
  "static/chunks/webpack-f706f8e3ff0a415c.js",
62
62
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
63
63
  "static/chunks/255-4f84124391a7dac4.js",
64
64
  "static/chunks/main-app-e5551aeb6fccb28b.js",
65
- "static/chunks/app/api/settings/models/route-3d2cf3d88ec0f399.js"
65
+ "static/chunks/app/api/settings/route-3d2cf3d88ec0f399.js"
66
66
  ],
67
- "/api/run/route": [
67
+ "/api/settings/models/route": [
68
68
  "static/chunks/webpack-f706f8e3ff0a415c.js",
69
69
  "static/chunks/4bd1b696-c023c6e3521b1417.js",
70
70
  "static/chunks/255-4f84124391a7dac4.js",
71
71
  "static/chunks/main-app-e5551aeb6fccb28b.js",
72
- "static/chunks/app/api/run/route-3d2cf3d88ec0f399.js"
72
+ "static/chunks/app/api/settings/models/route-3d2cf3d88ec0f399.js"
73
73
  ],
74
74
  "/page": [
75
75
  "static/chunks/webpack-f706f8e3ff0a415c.js",
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/icon.svg/route": "/icon.svg",
4
- "/api/run/[id]/shot/[num]/route": "/api/run/[id]/shot/[num]",
4
+ "/api/runs/route": "/api/runs",
5
5
  "/api/run/[id]/pause/route": "/api/run/[id]/pause",
6
- "/api/run/[id]/stream/route": "/api/run/[id]/stream",
7
6
  "/api/run/[id]/answer/route": "/api/run/[id]/answer",
8
- "/api/runs/route": "/api/runs",
7
+ "/api/run/[id]/shot/[num]/route": "/api/run/[id]/shot/[num]",
8
+ "/api/run/route": "/api/run",
9
+ "/api/run/[id]/stream/route": "/api/run/[id]/stream",
9
10
  "/api/settings/route": "/api/settings",
10
11
  "/api/settings/models/route": "/api/settings/models",
11
- "/api/run/route": "/api/run",
12
12
  "/page": "/",
13
13
  "/settings/page": "/settings",
14
14
  "/run/[id]/page": "/run/[id]"
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/bkJayQnTQRf05bk-k7JdG/_buildManifest.js",
9
- "static/bkJayQnTQRf05bk-k7JdG/_ssgManifest.js"
8
+ "static/8LZWNHPSxSMg8e76XWfqO/_buildManifest.js",
9
+ "static/8LZWNHPSxSMg8e76XWfqO/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [
12
12
  "static/chunks/webpack-f706f8e3ff0a415c.js",
@@ -26,7 +26,12 @@
26
26
  "x-next-revalidate-tag-token"
27
27
  ]
28
28
  },
29
- "/": {
29
+ "/icon.svg": {
30
+ "initialHeaders": {
31
+ "cache-control": "public, immutable, no-transform, max-age=31536000",
32
+ "content-type": "image/svg+xml",
33
+ "x-next-cache-tags": "_N_T_/layout,_N_T_/icon.svg/layout,_N_T_/icon.svg/route,_N_T_/icon.svg"
34
+ },
30
35
  "experimentalBypassFor": [
31
36
  {
32
37
  "type": "header",
@@ -39,8 +44,8 @@
39
44
  }
40
45
  ],
41
46
  "initialRevalidateSeconds": false,
42
- "srcRoute": "/",
43
- "dataRoute": "/index.rsc",
47
+ "srcRoute": "/icon.svg",
48
+ "dataRoute": null,
44
49
  "allowHeader": [
45
50
  "host",
46
51
  "x-matched-path",
@@ -50,12 +55,7 @@
50
55
  "x-next-revalidate-tag-token"
51
56
  ]
52
57
  },
53
- "/icon.svg": {
54
- "initialHeaders": {
55
- "cache-control": "public, immutable, no-transform, max-age=31536000",
56
- "content-type": "image/svg+xml",
57
- "x-next-cache-tags": "_N_T_/layout,_N_T_/icon.svg/layout,_N_T_/icon.svg/route,_N_T_/icon.svg"
58
- },
58
+ "/": {
59
59
  "experimentalBypassFor": [
60
60
  {
61
61
  "type": "header",
@@ -68,8 +68,8 @@
68
68
  }
69
69
  ],
70
70
  "initialRevalidateSeconds": false,
71
- "srcRoute": "/icon.svg",
72
- "dataRoute": null,
71
+ "srcRoute": "/",
72
+ "dataRoute": "/index.rsc",
73
73
  "allowHeader": [
74
74
  "host",
75
75
  "x-matched-path",
@@ -1 +1 @@
1
- <!DOCTYPE html><!--bkJayQnTQRf05bk_k7JdG--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"bkJayQnTQRf05bk-k7JdG\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--8LZWNHPSxSMg8e76XWfqO--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"8LZWNHPSxSMg8e76XWfqO\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
@@ -10,7 +10,7 @@ d:I[7150,[],""]
10
10
  :HL["/_next/static/media/22a5144ee8d83bca-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
11
11
  :HL["/_next/static/media/7d4881bb7e1bf84d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
12
12
  :HL["/_next/static/css/6a883a6c62470f9e.css","style"]
13
- 0:{"P":null,"b":"bkJayQnTQRf05bk-k7JdG","p":"","c":["","_not-found"],"i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["/_not-found",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$L5",["$","$L6",null,{"promise":"$@7"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],[["$","$L8",null,{"children":"$L9"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$La",null,{"children":["$","div",null,{"hidden":true,"children":["$","$b",null,{"fallback":null,"children":"$Lc"}]}]}]]}],false]],"m":"$undefined","G":["$d",[]],"s":false,"S":true}
13
+ 0:{"P":null,"b":"8LZWNHPSxSMg8e76XWfqO","p":"","c":["","_not-found"],"i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["/_not-found",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$L5",["$","$L6",null,{"promise":"$@7"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],[["$","$L8",null,{"children":"$L9"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$La",null,{"children":["$","div",null,{"hidden":true,"children":["$","$b",null,{"fallback":null,"children":"$Lc"}]}]}]]}],false]],"m":"$undefined","G":["$d",[]],"s":false,"S":true}
14
14
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
15
15
  5:null
16
16
  e:I[622,[],"IconMark"]
@@ -1,4 +1,4 @@
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.
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:()=>D});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 E=new Set(["navigate","click","fill","select","hover","press","scroll","scroll_to","dismiss","wait","wait_for","upload_file","switch_tab"]),F=`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
2
 
3
3
  FLOW
4
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.
@@ -31,7 +31,10 @@ SCOPE — do exactly what the step says and nothing else
31
31
  ELEMENTS
32
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
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.
34
+ - <select> → select. Something that opens on hover (bell, avatar menu, tooltip, submenu) → hover, not click. An icon-only control has no name: the tree shows it as "(no name; class=…, icon=…, data-testid=…)" — pick the one whose hints fit (bell, notif…), never just the first unnamed button.
35
+ - After hover or click, check that it worked: the result must list the opened panel under "Changes". "NONE" means nothing opened — you hit the wrong element; try the next candidate. Do not report a step about a panel you did not see open.
36
+ - A panel opened by hover stays open only while the pointer is on it. Until you are done with it, act only inside it: click, hover and scroll with refs taken from inside the panel. dismiss, or an action on an element outside it, closes it.
37
+ - Lists that load more on scroll: scroll(ref of an item INSIDE the list, y) and repeat until the result says "bottom reached" — the next page is requested only near the bottom, and the list then grows. One scroll that did not reach the bottom proves nothing.
35
38
  - "intercepts pointer events" means an overlay covers the target: dismiss, then retry.
36
39
  - 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
40
  - 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.
@@ -42,26 +45,26 @@ FILES
42
45
  NETWORK — only when the test case asks to mock, break, slow down or inspect requests
43
46
  - 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
47
  - 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.
48
+ - "The request was sent / with this body / returned this status" → get_requests(find=endpoint or method name). Each request says after which of your actions it was sent: only requests sent after the step's own action count. The same request sent earlier (after navigate, by another widget on the page) proves nothing about the step. Quote method, URL, status and "sent after" as evidence. A mock that matched 0 requests has a wrong URL — fix it, do not report pass.
46
49
 
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}
50
+ 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.`,G=/^(?:f\d+)?e\d+$/;async function n(a,b){let c="string"==typeof b.ref?b.ref.trim():"";if(!G.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 H=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!!G.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
51
  (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
52
  … 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).
53
+ ${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}}function w(a){let b=a;for(;b&&b!==document.body&&b!==document.documentElement;){let a=getComputedStyle(b),c=/(auto|scroll|overlay)/.test(a.overflowY)&&b.scrollHeight>b.clientHeight+1,d=/(auto|scroll|overlay)/.test(a.overflowX)&&b.scrollWidth>b.clientWidth+1;if(c||d){let a=b.getBoundingClientRect(),c=Math.max(a.left,0),d=Math.max(a.top,0),e=Math.min(a.right,window.innerWidth),f=Math.min(a.bottom,window.innerHeight);if(e-c<4||f-d<4)return null;return{x:Math.round((c+e)/2),y:Math.round((d+f)/2)}}b=b.parentElement}return null}async function x(a,b,c){let d=Math.min(40,Math.max(1,Math.ceil(Math.max(Math.abs(b),Math.abs(c))/120)));for(let e=0;e<d;e++)await a.mouse.wheel(b/d,c/d),await a.waitForTimeout(50);await a.waitForTimeout(250)}async function y(a){try{return await a.screenshot({type:"jpeg",quality:55})}catch{return}}function z(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 A(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):
54
+ ${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);await a.hover({timeout:5e3});let e=await a.boundingBox().catch(()=>null);return e&&await d.mouse.move(e.x+e.width/2+1,e.y+e.height/2+1).catch(()=>{}),await d.waitForTimeout(600).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(G.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(G.test(g)){let b=d.locator(`aria-ref=${g}`);if(await b.count()===0)return{content:`ref ${g} not found — take a fresh snapshot`};let c=await b.evaluate(z,{x:0,y:0}),h=await b.evaluate(w);h&&(await d.mouse.move(h.x,h.y),await x(d,e,f));let i=await b.evaluate(z,{x:0,y:0}).catch(()=>c);a={...i,movedX:i.posX-c.posX,movedY:i.posY-c.posY},0===a.movedX&&0===a.movedY&&(0!==e||0!==f)&&(a=await b.evaluate(z,{x:e,y:f}))}else a=await d.evaluate(z,{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."),"container"===a.kind&&a.posY<a.maxY-2&&c>0&&e.push("Not at the bottom yet — a list that loads more on scroll does so only near its bottom."),e.push("Scrolling does not change the page tree by itself; it changes only if new content was loaded."),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(G.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
55
  ${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}
53
56
 
54
57
  Active mocks:
55
58
  ${d}`,observation:a.split("\n")[0]}}case"get_console":{let a=c.net.allConsoleErrors();return{content:a.length?`${a.length} console error(s):
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}
59
+ ${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 y(d);b&&((0,i.Se)(e,h,b),a=`/api/run/${e}/shot/${h}`)}let k=a=>o(c,H(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,H(String(b.summary??"")))}),{content:"OK: run finished",finished:!0}}default:return{content:`Unknown tool: ${a}`}}}let I=a=>new Promise(b=>setTimeout(b,a));async function B(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:F,cache_control:{type:"ephemeral"}}],messages:c,tools:k.It,tool_choice:{type:"auto"}});return await (0,l.nz)(a,F,c,k.It)}catch(b){d=b;let a=b.status;if(a&&a>=400&&a<500&&429!==a||4===e)break;await I(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 C(a,b){if(0===a.notices.length)return b;let c=a.notices.splice(0).map(a=>`NOTE: ${a}`).join("\n");return`${c}
57
60
 
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}
61
+ ${b}`}async function D(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,y=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 B(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,H(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=>E.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}if(E.has(d)){r=!0;let a=e.name??e.url??e.text??e.key??"";l.net.mark(`${d}${a?` "${String(a).slice(0,60)}"`:""}`)}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,y=0),"report_step"!==d&&"set_plan"!==d&&"finish"!==d&&(15==++y||y>15&&y%10==0)&&l.notices.push(`You have spent ${y} 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 A(d,e,l);n&&(0,i.FD)(a,{browserMs:Date.now()-n}),j.push({type:"tool_result",tool_use_id:c.id,content:C(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:C(l,e?`Error: ${d}
59
62
 
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??""}
63
+ ${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 z=(0,i.Mh)(a);z&&("running"===z.status||"waiting"===z.status||"paused"===z.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.marker="(nothing yet — before the first action)",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)}}mark(a){this.marker=a}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()),after:this.marker};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??""}
61
64
  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}
62
65
  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}
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?`
64
- (${e.length-g.length} earlier matches not shown — narrow the filter)`:"";return`${e.length} matching request(s), oldest first:
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"}
66
+ ${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]":""}`,` sent after: ${a.after}`];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?`
67
+ (${e.length-g.length} earlier matches not shown — narrow the filter)`:"";return`${e.length} matching request(s), oldest first. "sent after" is your action that preceded the request — a request sent after navigate, or before the step's own action, was not caused by that action:
68
+ ${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:()=>i,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 — moves the mouse over that element and turns the wheel, so the block scrolls like under a person's hand and a hover-opened panel stays open. Returns position and limits ('bottom reached'). Only for lazy-loaded content: scrolling never adds existing 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=/^\s*- (?:button|link|img|menuitem|tab) \[ref=((?:f\d+)?e\d+)\]/,d=b.split("\n").map(a=>a.match(c)?.[1]).filter(a=>!!a).slice(0,40);if(0===d.length)return b;let e=await Promise.all(d.map(b=>a.locator(`aria-ref=${b}`).evaluate(a=>{let b=[],c=(a,c)=>{let d=(c??"").trim().slice(0,60);d&&b.length<4&&!b.some(a=>a.endsWith(`=${d}`))&&b.push(`${a}=${d}`)},d=a=>(a??"").split(/\s+/).filter(a=>/[a-zA-Z]{4,}/.test(a)).slice(0,3).join(" ");for(let b of["data-testid","data-test-id","data-test","data-qa","data-name","id","name","title"])c(b,a.getAttribute(b));c("class",d(a.getAttribute("class")));let e=a.querySelector("use");c("icon",e?.getAttribute("href")??e?.getAttribute("xlink:href")),c("icon",a.querySelector("svg title")?.textContent);let f="IMG"===a.tagName?a:a.querySelector("img");f&&(c("alt",f.getAttribute("alt")),c("img",(f.getAttribute("src")??"").split("/").pop()?.split("?")[0]));let g=a.querySelector("[data-testid], [class]");return g&&c("inside",g.getAttribute("data-testid")??d(g.getAttribute("class"))),"A"===a.tagName&&c("href",a.getAttribute("href")),b.join(", ")},void 0,{timeout:800}).catch(()=>""))),f=new Map(d.map((a,b)=>[a,e[b]]));return b.split("\n").map(a=>{let b=a.match(c)?.[1],d=b?f.get(b):"";return d?a.replace(`[ref=${b}]`,`[ref=${b}] (no name; ${d})`):a}).join("\n")}async function i(a,b){let c=a.url();if(!c||"about:blank"===c)return`URL: ${c||"about:blank"}
66
69
 
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})();
70
+ 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="",i=b?.trim();if(i){let b=await d(a,i);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 "${i}")`):g=` ("${i}" not found — showing full page)`}let j="";try{j=await f.ariaSnapshot({mode:"ai",timeout:5e3})}catch(a){j=`(snapshot failed: ${a instanceof Error?a.message:String(a)})`}finally{i&&await a.evaluate(()=>document.querySelectorAll('[data-qa-scope="1"]').forEach(a=>a.removeAttribute("data-qa-scope"))).catch(()=>{})}return(j=await h(a,j)).length>16e3&&(j=j.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):",j].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
- <!DOCTYPE html><!--bkJayQnTQRf05bk_k7JdG--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><script src="/_next/static/chunks/628-c8e9b74cd568418b.js" async=""></script><script src="/_next/static/chunks/677-25363eac0e2b4fd1.js" async=""></script><script src="/_next/static/chunks/app/page-c306a6ca88010f4b.js" async=""></script><meta name="next-size-adjust" content=""/><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><main class="flex flex-col items-center min-h-screen px-6 pt-20 pb-24"><div class="absolute right-4 top-4 flex items-center gap-2 sm:right-6 sm:top-6"><a title="Settings" class="inline-flex items-center gap-1.5 rounded-lg border border-border bg-surface px-2.5 py-1.5 text-xs text-muted-foreground hover:text-foreground hover:bg-surface-hover transition-colors" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings size-3.5" aria-hidden="true"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"></path><circle cx="12" cy="12" r="3"></circle></svg><span class="hidden sm:inline">Settings</span></a></div><div class="flex items-center justify-center size-11 rounded-2xl border border-border bg-surface-hover mb-6 shadow-lg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot size-5 text-foreground/80" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg></div><h1 class="text-3xl font-semibold tracking-tight mb-2">qpilot</h1><p class="text-sm text-muted-foreground mb-10">Paste a test case. Watch it run.</p><div class="w-full space-y-3 max-w-2xl"><input type="file" webkitdirectory="" multiple="" class="hidden"/><input type="file" accept=".md,text/markdown" class="hidden"/><input type="file" multiple="" class="hidden"/><div class="flex items-center gap-2"><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 border-border bg-background hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder size-4" aria-hidden="true"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg>Choose folder</button><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 border-border bg-background hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-upload size-4" aria-hidden="true"><path d="M12 3v12"></path><path d="m17 8-5-5-5 5"></path><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path></svg>Upload .md</button></div><div class=""><form class="space-y-3"><div class="relative rounded-xl border transition-all duration-200 border-border"><textarea data-slot="textarea" class="flex field-sizing-content w-full border-input transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 min-h-[320px] font-mono text-[12.5px] leading-relaxed resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 rounded-xl p-4 overflow-y-auto max-h-[360px]" placeholder="Paste your test case here…" rows="16"></textarea></div><div class="flex items-center gap-2"><button type="submit" data-disabled="" tabindex="0" disabled="" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 bg-primary text-primary-foreground [a]:hover:bg-primary/80 h-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 gap-2 font-medium"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg>Run</button><button type="button" data-disabled="" tabindex="0" disabled="" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-eye size-4" aria-hidden="true"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>Run with preview</button><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50 h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 ml-auto text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text size-4" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path><path d="M14 2v5a1 1 0 0 0 1 1h5"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg>Example</button></div></form></div><div class="flex flex-wrap items-center gap-1.5"><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border border-transparent bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-paperclip size-3.5" aria-hidden="true"><path d="m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"></path></svg>Attach files</button><span class="text-[11px] text-subtle">optional — images, CSV or documents the test needs to upload</span></div></div></main><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[1959,[],\"ClientPageRoot\"]\n5:I[4166,[\"628\",\"static/chunks/628-c8e9b74cd568418b.js\",\"677\",\"static/chunks/677-25363eac0e2b4fd1.js\",\"974\",\"static/chunks/app/page-c306a6ca88010f4b.js\"],\"default\"]\n8:I[4431,[],\"OutletBoundary\"]\na:I[5278,[],\"AsyncMetadataOutlet\"]\nc:I[4431,[],\"ViewportBoundary\"]\ne:I[4431,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"bkJayQnTQRf05bk-k7JdG\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[622,[],\"IconMark\"]\nb:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L12\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--8LZWNHPSxSMg8e76XWfqO--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><script src="/_next/static/chunks/628-c8e9b74cd568418b.js" async=""></script><script src="/_next/static/chunks/677-25363eac0e2b4fd1.js" async=""></script><script src="/_next/static/chunks/app/page-c306a6ca88010f4b.js" async=""></script><meta name="next-size-adjust" content=""/><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><main class="flex flex-col items-center min-h-screen px-6 pt-20 pb-24"><div class="absolute right-4 top-4 flex items-center gap-2 sm:right-6 sm:top-6"><a title="Settings" class="inline-flex items-center gap-1.5 rounded-lg border border-border bg-surface px-2.5 py-1.5 text-xs text-muted-foreground hover:text-foreground hover:bg-surface-hover transition-colors" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings size-3.5" aria-hidden="true"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"></path><circle cx="12" cy="12" r="3"></circle></svg><span class="hidden sm:inline">Settings</span></a></div><div class="flex items-center justify-center size-11 rounded-2xl border border-border bg-surface-hover mb-6 shadow-lg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot size-5 text-foreground/80" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg></div><h1 class="text-3xl font-semibold tracking-tight mb-2">qpilot</h1><p class="text-sm text-muted-foreground mb-10">Paste a test case. Watch it run.</p><div class="w-full space-y-3 max-w-2xl"><input type="file" webkitdirectory="" multiple="" class="hidden"/><input type="file" accept=".md,text/markdown" class="hidden"/><input type="file" multiple="" class="hidden"/><div class="flex items-center gap-2"><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 border-border bg-background hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder size-4" aria-hidden="true"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg>Choose folder</button><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 border-border bg-background hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-upload size-4" aria-hidden="true"><path d="M12 3v12"></path><path d="m17 8-5-5-5 5"></path><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path></svg>Upload .md</button></div><div class=""><form class="space-y-3"><div class="relative rounded-xl border transition-all duration-200 border-border"><textarea data-slot="textarea" class="flex field-sizing-content w-full border-input transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 min-h-[320px] font-mono text-[12.5px] leading-relaxed resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 rounded-xl p-4 overflow-y-auto max-h-[360px]" placeholder="Paste your test case here…" rows="16"></textarea></div><div class="flex items-center gap-2"><button type="submit" data-disabled="" tabindex="0" disabled="" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 bg-primary text-primary-foreground [a]:hover:bg-primary/80 h-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 gap-2 font-medium"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg>Run</button><button type="button" data-disabled="" tabindex="0" disabled="" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 h-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-eye size-4" aria-hidden="true"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>Run with preview</button><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50 h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 ml-auto text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text size-4" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path><path d="M14 2v5a1 1 0 0 0 1 1h5"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg>Example</button></div></form></div><div class="flex flex-wrap items-center gap-1.5"><button type="button" tabindex="0" data-slot="button" class="group/button inline-flex shrink-0 items-center justify-center border border-transparent bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 hover:bg-muted aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50 h-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-3.5 gap-2 text-muted-foreground hover:text-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-paperclip size-3.5" aria-hidden="true"><path d="m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"></path></svg>Attach files</button><span class="text-[11px] text-subtle">optional — images, CSV or documents the test needs to upload</span></div></div></main><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[1959,[],\"ClientPageRoot\"]\n5:I[4166,[\"628\",\"static/chunks/628-c8e9b74cd568418b.js\",\"677\",\"static/chunks/677-25363eac0e2b4fd1.js\",\"974\",\"static/chunks/app/page-c306a6ca88010f4b.js\"],\"default\"]\n8:I[4431,[],\"OutletBoundary\"]\na:I[5278,[],\"AsyncMetadataOutlet\"]\nc:I[4431,[],\"ViewportBoundary\"]\ne:I[4431,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"8LZWNHPSxSMg8e76XWfqO\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[622,[],\"IconMark\"]\nb:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L12\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
@@ -12,7 +12,7 @@ f:"$Sreact.suspense"
12
12
  :HL["/_next/static/media/22a5144ee8d83bca-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
13
13
  :HL["/_next/static/media/7d4881bb7e1bf84d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
14
14
  :HL["/_next/static/css/6a883a6c62470f9e.css","style"]
15
- 0:{"P":null,"b":"bkJayQnTQRf05bk-k7JdG","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
15
+ 0:{"P":null,"b":"8LZWNHPSxSMg8e76XWfqO","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
16
16
  6:{}
17
17
  7:"$0:f:0:1:2:children:1:props:children:0:props:params"
18
18
  d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1 +1 @@
1
- <!DOCTYPE html><!--bkJayQnTQRf05bk_k7JdG--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><script src="/_next/static/chunks/628-c8e9b74cd568418b.js" async=""></script><script src="/_next/static/chunks/777-fd275b814609177f.js" async=""></script><script src="/_next/static/chunks/677-25363eac0e2b4fd1.js" async=""></script><script src="/_next/static/chunks/app/settings/page-cebc318548783c8b.js" async=""></script><meta name="next-size-adjust" content=""/><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[1959,[],\"ClientPageRoot\"]\n5:I[8036,[\"628\",\"static/chunks/628-c8e9b74cd568418b.js\",\"777\",\"static/chunks/777-fd275b814609177f.js\",\"677\",\"static/chunks/677-25363eac0e2b4fd1.js\",\"662\",\"static/chunks/app/settings/page-cebc318548783c8b.js\"],\"default\"]\n8:I[4431,[],\"OutletBoundary\"]\na:I[5278,[],\"AsyncMetadataOutlet\"]\nc:I[4431,[],\"ViewportBoundary\"]\ne:I[4431,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"bkJayQnTQRf05bk-k7JdG\",\"p\":\"\",\"c\":[\"\",\"settings\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"settings\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"settings\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[622,[],\"IconMark\"]\nb:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L12\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--8LZWNHPSxSMg8e76XWfqO--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><script src="/_next/static/chunks/628-c8e9b74cd568418b.js" async=""></script><script src="/_next/static/chunks/777-fd275b814609177f.js" async=""></script><script src="/_next/static/chunks/677-25363eac0e2b4fd1.js" async=""></script><script src="/_next/static/chunks/app/settings/page-cebc318548783c8b.js" async=""></script><meta name="next-size-adjust" content=""/><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[1959,[],\"ClientPageRoot\"]\n5:I[8036,[\"628\",\"static/chunks/628-c8e9b74cd568418b.js\",\"777\",\"static/chunks/777-fd275b814609177f.js\",\"677\",\"static/chunks/677-25363eac0e2b4fd1.js\",\"662\",\"static/chunks/app/settings/page-cebc318548783c8b.js\"],\"default\"]\n8:I[4431,[],\"OutletBoundary\"]\na:I[5278,[],\"AsyncMetadataOutlet\"]\nc:I[4431,[],\"ViewportBoundary\"]\ne:I[4431,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"8LZWNHPSxSMg8e76XWfqO\",\"p\":\"\",\"c\":[\"\",\"settings\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"settings\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"settings\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[622,[],\"IconMark\"]\nb:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$L12\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
@@ -12,7 +12,7 @@ f:"$Sreact.suspense"
12
12
  :HL["/_next/static/media/22a5144ee8d83bca-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
13
13
  :HL["/_next/static/media/7d4881bb7e1bf84d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
14
14
  :HL["/_next/static/css/6a883a6c62470f9e.css","style"]
15
- 0:{"P":null,"b":"bkJayQnTQRf05bk-k7JdG","p":"","c":["","settings"],"i":false,"f":[[["",{"children":["settings",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
15
+ 0:{"P":null,"b":"8LZWNHPSxSMg8e76XWfqO","p":"","c":["","settings"],"i":false,"f":[[["",{"children":["settings",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/6a883a6c62470f9e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_8eaea4 __variable_8c25df","suppressHydrationWarning":true,"children":[["$","head",null,{"children":["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"qpilot.theme\")||\"system\";var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme: dark)\").matches);var e=document.documentElement;e.classList.toggle(\"dark\",d);e.style.colorScheme=d?\"dark\":\"light\";}catch(_){}})();"}}]}],["$","body",null,{"className":"font-sans min-h-screen","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
16
16
  6:{}
17
17
  7:"$0:f:0:1:2:children:2:children:1:props:children:0:props:params"
18
18
  d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "/_not-found/page": "app/_not-found/page.js",
3
3
  "/icon.svg/route": "app/icon.svg/route.js",
4
- "/api/run/[id]/shot/[num]/route": "app/api/run/[id]/shot/[num]/route.js",
4
+ "/api/runs/route": "app/api/runs/route.js",
5
5
  "/api/run/[id]/pause/route": "app/api/run/[id]/pause/route.js",
6
- "/api/run/[id]/stream/route": "app/api/run/[id]/stream/route.js",
7
6
  "/api/run/[id]/answer/route": "app/api/run/[id]/answer/route.js",
8
- "/api/runs/route": "app/api/runs/route.js",
7
+ "/api/run/[id]/shot/[num]/route": "app/api/run/[id]/shot/[num]/route.js",
8
+ "/api/run/route": "app/api/run/route.js",
9
+ "/api/run/[id]/stream/route": "app/api/run/[id]/stream/route.js",
9
10
  "/api/settings/route": "app/api/settings/route.js",
10
11
  "/api/settings/models/route": "app/api/settings/models/route.js",
11
- "/api/run/route": "app/api/run/route.js",
12
12
  "/page": "app/page.js",
13
13
  "/settings/page": "app/settings/page.js",
14
14
  "/run/[id]/page": "app/run/[id]/page.js"
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "version": 1,
3
3
  "functions": {
4
- "/api/run/[id]/answer": {},
5
4
  "/api/run/[id]/pause": {},
6
- "/api/run/[id]/stream": {},
7
5
  "/api/run/[id]/shot/[num]": {},
6
+ "/api/run/[id]/answer": {},
7
+ "/api/runs": {},
8
+ "/api/run/[id]/stream": {},
8
9
  "/api/settings/models": {},
9
- "/api/run": {},
10
10
  "/api/settings": {},
11
- "/api/runs": {}
11
+ "/api/run": {}
12
12
  }
13
13
  }
@@ -17,7 +17,7 @@
17
17
  "wasm": [],
18
18
  "assets": [],
19
19
  "env": {
20
- "__NEXT_BUILD_ID": "bkJayQnTQRf05bk-k7JdG",
20
+ "__NEXT_BUILD_ID": "8LZWNHPSxSMg8e76XWfqO",
21
21
  "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "1qgd3LtcA5ogh3hTU7VpDFCNuGFYivBhwrflC2vxNgQ=",
22
22
  "__NEXT_PREVIEW_MODE_ID": "54962eccd877d38d33b880d50ebf9833",
23
23
  "__NEXT_PREVIEW_MODE_SIGNING_KEY": "37729d61a68ff756c926461501f381b93b7e8bdd185092998a1aeaced6040aa3",
@@ -1 +1 @@
1
- <!DOCTYPE html><!--bkJayQnTQRf05bk_k7JdG--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"bkJayQnTQRf05bk-k7JdG\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--8LZWNHPSxSMg8e76XWfqO--><html lang="en" class="__variable_8eaea4 __variable_8c25df"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/22a5144ee8d83bca-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/7d4881bb7e1bf84d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/6a883a6c62470f9e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f706f8e3ff0a415c.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-4f84124391a7dac4.js" async=""></script><script src="/_next/static/chunks/main-app-e5551aeb6fccb28b.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>qpilot</title><meta name="description" content="Run manual test cases with an AI agent in a real browser"/><link rel="icon" href="/icon.svg?9d47bb1b72d80a18" type="image/svg+xml" sizes="any"/><script>(function(){try{var t=localStorage.getItem("qpilot.theme")||"system";var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme: dark)").matches);var e=document.documentElement;e.classList.toggle("dark",d);e.style.colorScheme=d?"dark":"light";}catch(_){}})();</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-sans min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/22a5144ee8d83bca-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/7d4881bb7e1bf84d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/6a883a6c62470f9e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"8LZWNHPSxSMg8e76XWfqO\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6a883a6c62470f9e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_8eaea4 __variable_8c25df\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"qpilot.theme\\\")||\\\"system\\\";var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme: dark)\\\").matches);var e=document.documentElement;e.classList.toggle(\\\"dark\\\",d);e.style.colorScheme=d?\\\"dark\\\":\\\"light\\\";}catch(_){}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"font-sans min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"qpilot\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Run manual test cases with an AI agent in a real browser\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?9d47bb1b72d80a18\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" defer=""></script><script src="/_next/static/chunks/framework-1570c2e8a0b531a3.js" defer=""></script><script src="/_next/static/chunks/main-c56f7c24c865a153.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7d307437aca18ad4.js" defer=""></script><script src="/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js" defer=""></script><script src="/_next/static/bkJayQnTQRf05bk-k7JdG/_buildManifest.js" defer=""></script><script src="/_next/static/bkJayQnTQRf05bk-k7JdG/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"bkJayQnTQRf05bk-k7JdG","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-f706f8e3ff0a415c.js" defer=""></script><script src="/_next/static/chunks/framework-1570c2e8a0b531a3.js" defer=""></script><script src="/_next/static/chunks/main-c56f7c24c865a153.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7d307437aca18ad4.js" defer=""></script><script src="/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js" defer=""></script><script src="/_next/static/8LZWNHPSxSMg8e76XWfqO/_buildManifest.js" defer=""></script><script src="/_next/static/8LZWNHPSxSMg8e76XWfqO/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"8LZWNHPSxSMg8e76XWfqO","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qpilot",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "Run manual test cases with an AI agent in a real browser",
5
5
  "bin": {
6
6
  "qpilot": "bin/qa-agent.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qpilot",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "Run manual test cases with an AI agent in a real browser",
5
5
  "bin": {
6
6
  "qpilot": "bin/qa-agent.js"