shiplightai 0.1.11 → 0.1.13
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.
- package/dist/agentHelpers-MOO2YPML.js +3 -0
- package/dist/{agentLogin-U7QWF4AY.js → agentLogin-2SSRFZ2U.js} +1 -1
- package/dist/{chunk-HECRJRKW.js → chunk-4JBGAENP.js} +9 -9
- package/dist/{chunk-LZ2F7OA3.js → chunk-ESJGKHJ4.js} +5 -5
- package/dist/chunk-JY6U4L7Q.js +216 -0
- package/dist/{chunk-JNVFLK5Q.js → chunk-NDYQF4WM.js} +5 -5
- package/dist/chunk-QU5HYOUM.js +5 -0
- package/dist/chunk-SGXLY5OU.js +33 -0
- package/dist/chunk-SUZXLRAA.js +18 -0
- package/dist/{chunk-OM5W5GBC.js → chunk-VXL4KP4U.js} +31 -28
- package/dist/cjs/debugger-pw.cjs +7 -0
- package/dist/cjs/fixture.cjs +236 -258
- package/dist/cjs/index.cjs +230 -252
- package/dist/cli.js +1027 -1683
- package/dist/copilot-7JTVJQXP.js +5 -0
- package/dist/debugger-pw.d.ts +145 -0
- package/dist/debugger-pw.js +3 -0
- package/dist/dist-HN2P3FRX.js +14 -0
- package/dist/dist-OOFTSMK3.js +3 -0
- package/dist/dist-WQ66EMT6.js +3 -0
- package/dist/fixture.js +1 -1
- package/dist/{handler-YM2CNJMM.js → handler-XD2P4DE3.js} +1 -1
- package/dist/index.js +11 -11
- package/dist/intRunner-5A6M6JSJ.js +7 -0
- package/dist/{multipart-parser-IEIT2KXO.js → multipart-parser-KQFLHJKK.js} +1 -1
- package/dist/src-CXU6MEQY.js +5 -0
- package/dist/{task-SZERT63E.js → task-7OWMRRUU.js} +1 -1
- package/dist/testFlow-OQWWSEQT.js +3 -0
- package/package.json +7 -1
- package/dist/agentHelpers-YAPGMNDU.js +0 -3
- package/dist/chunk-5OEE46TI.js +0 -230
- package/dist/chunk-A2VNNKWB.js +0 -18
- package/dist/chunk-CYBAFQLF.js +0 -5
- package/dist/chunk-IMX7PO3X.js +0 -18
- package/dist/chunk-STSHJEMG.js +0 -3
- package/dist/chunk-SWUSVR2K.js +0 -30
- package/dist/chunk-Y2QWBQXE.js +0 -8
- package/dist/dist-5LVWKFH4.js +0 -3
- package/dist/dist-DAIQ7AOS.js +0 -14
- package/dist/dist-IH5NPMQ7.js +0 -3
- package/dist/fileFromPath-ROF7A3FH.js +0 -3
- package/dist/src-2RQUBO3W.js +0 -5
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import"./chunk-CSINHOOD.js";import{Router as u}from"express";function p(i){let n=u();return n.post("/api/int-runner/copilot/init",async(o,s)=>{try{let{session:e,initialTestFlow:t}=o.body;if(!e?.sessionId)return s.status(400).json({success:!1,message:"Missing session"});await i.initializeCopilot(e.sessionId,t),s.json({success:!0,status:"success"})}catch(e){console.error("[debugger] copilot/init error:",e),s.status(500).json({success:!1,message:e.message})}}),n.post("/api/int-runner/copilot/send",async(o,s)=>{let{session:e,message:t,testFlow:c}=o.body;if(!e?.sessionId||!t)return s.status(400).json({success:!1,message:"Session and message required"});s.setHeader("Content-Type","text/event-stream"),s.setHeader("Cache-Control","no-cache"),s.setHeader("Connection","keep-alive"),s.flushHeaders();let a=r=>{s.write(`data: ${JSON.stringify(r)}
|
|
4
|
+
|
|
5
|
+
`)};try{await i.sendCopilotMessage(e.sessionId,t,a,c)}catch(r){a({type:"copilot_message",data:{type:"error",message:r.message},sequenceNumber:0,timestamp:new Date().toISOString()})}finally{s.end()}}),n.post("/api/int-runner/copilot/abort",async(o,s)=>{try{let{session:e}=o.body;if(!e?.sessionId)return s.status(400).json({success:!1,message:"Missing session"});let t=i.abortCopilot(e.sessionId);s.json({success:!0,status:"success",aborted:t})}catch(e){console.error("[debugger] copilot/abort error:",e),s.status(500).json({success:!1,message:e.message})}}),n.post("/api/int-runner/copilot/status",async(o,s)=>{try{let{session:e}=o.body;if(!e?.sessionId)return s.status(400).json({status:"error",message:"Missing session"});let t=i.getCopilotTestFlow(e.sessionId);s.json({status:"success",copilotInitialized:!0,testFlow:t})}catch(e){s.status(500).json({status:"error",details:e.message})}}),n}export{p as createCopilotRouter};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Page } from 'playwright';
|
|
2
|
+
import { WebAgent } from './agent/webAgent.js';
|
|
3
|
+
import { ActionEntity } from './test-flow/actionEntity.js';
|
|
4
|
+
import { TestFlow } from './test-flow/testFlow.js';
|
|
5
|
+
import { AgentStepEvent } from 'sdk-internal';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SandboxService Interface
|
|
9
|
+
*
|
|
10
|
+
* Common interface for debugger sandbox services.
|
|
11
|
+
* Implemented by LocalSandboxService (standalone) and PlaywrightSandboxService (Playwright-bootstrapped).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
type AgentStepEventCallback = (event: AgentStepEvent) => void;
|
|
15
|
+
interface DebugInfo {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
liveviewUrl: string;
|
|
18
|
+
browserWsUrl: string;
|
|
19
|
+
}
|
|
20
|
+
interface RunStepResult {
|
|
21
|
+
success: boolean;
|
|
22
|
+
actions: ActionEntity[];
|
|
23
|
+
details?: string;
|
|
24
|
+
}
|
|
25
|
+
interface SandboxService {
|
|
26
|
+
createSession(config?: {
|
|
27
|
+
startingUrl?: string;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
sessionId: string;
|
|
30
|
+
}>;
|
|
31
|
+
executeLogin(sessionId: string): Promise<{
|
|
32
|
+
status: string;
|
|
33
|
+
details?: string;
|
|
34
|
+
}>;
|
|
35
|
+
ensureBrowser(sessionId: string): Promise<{
|
|
36
|
+
page: Page;
|
|
37
|
+
liveviewUrl: string;
|
|
38
|
+
}>;
|
|
39
|
+
startDebug(sessionId: string): Promise<DebugInfo>;
|
|
40
|
+
terminateSession(sessionId: string): Promise<void>;
|
|
41
|
+
cleanupAll(): Promise<void>;
|
|
42
|
+
executeAction(sessionId: string, actionEntity: ActionEntity, stepId: string, options?: {
|
|
43
|
+
withSelfHealing?: boolean;
|
|
44
|
+
stmtUid?: string;
|
|
45
|
+
executionHistory?: Array<[string, string]>;
|
|
46
|
+
}): Promise<any>;
|
|
47
|
+
runStep(sessionId: string, statement: string, stepId: string, onEvent: AgentStepEventCallback, executionHistory?: Array<[string, string]>): Promise<RunStepResult>;
|
|
48
|
+
stopRunStep(sessionId: string): boolean;
|
|
49
|
+
evaluate(sessionId: string, statement: string, executionHistory?: Array<[string, string]>): Promise<Record<string, any>>;
|
|
50
|
+
generateAction(sessionId: string, statement: string, stepId: string, options?: {
|
|
51
|
+
executionHistory?: Array<[string, string]>;
|
|
52
|
+
usePureVision?: boolean;
|
|
53
|
+
includeDebugInfo?: boolean;
|
|
54
|
+
}): Promise<any>;
|
|
55
|
+
takeScreenshot(sessionId: string): Promise<{
|
|
56
|
+
screenshot: string;
|
|
57
|
+
screenshotPath?: string;
|
|
58
|
+
}>;
|
|
59
|
+
initializeCopilot(sessionId: string, initialTestFlow?: TestFlow): Promise<void>;
|
|
60
|
+
sendCopilotMessage(sessionId: string, message: string, onEvent: any, testFlow?: TestFlow): Promise<void>;
|
|
61
|
+
abortCopilot(sessionId: string): boolean;
|
|
62
|
+
getCopilotTestFlow(sessionId: string): TestFlow | undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Playwright Sandbox Service
|
|
67
|
+
*
|
|
68
|
+
* Lightweight sandbox that wraps an externally-provided Playwright page and
|
|
69
|
+
* WebAgent. Used when the debugger runs inside a Playwright test context,
|
|
70
|
+
* inheriting all Playwright config features (baseURL, storageState, viewport, etc.).
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A sandbox backed by a Playwright-provided page and agent.
|
|
75
|
+
* Since Playwright handles browser lifecycle, auth, baseURL, etc.,
|
|
76
|
+
* this service just delegates to the agent for test operations.
|
|
77
|
+
*/
|
|
78
|
+
declare class PlaywrightSandboxService implements SandboxService {
|
|
79
|
+
private page;
|
|
80
|
+
private agent;
|
|
81
|
+
private sessionId;
|
|
82
|
+
private abortController;
|
|
83
|
+
constructor(page: Page, agent: WebAgent);
|
|
84
|
+
createSession(_config?: {
|
|
85
|
+
startingUrl?: string;
|
|
86
|
+
}): Promise<{
|
|
87
|
+
sessionId: string;
|
|
88
|
+
}>;
|
|
89
|
+
executeLogin(_sessionId: string): Promise<{
|
|
90
|
+
status: string;
|
|
91
|
+
details?: string;
|
|
92
|
+
}>;
|
|
93
|
+
ensureBrowser(_sessionId: string): Promise<{
|
|
94
|
+
page: Page;
|
|
95
|
+
liveviewUrl: string;
|
|
96
|
+
}>;
|
|
97
|
+
startDebug(_sessionId: string): Promise<DebugInfo>;
|
|
98
|
+
executeAction(_sessionId: string, actionEntity: ActionEntity, stepId: string, options?: {
|
|
99
|
+
withSelfHealing?: boolean;
|
|
100
|
+
stmtUid?: string;
|
|
101
|
+
executionHistory?: Array<[string, string]>;
|
|
102
|
+
}): Promise<any>;
|
|
103
|
+
runStep(_sessionId: string, statement: string, stepId: string, onEvent: AgentStepEventCallback, executionHistory?: Array<[string, string]>): Promise<RunStepResult>;
|
|
104
|
+
stopRunStep(_sessionId: string): boolean;
|
|
105
|
+
evaluate(_sessionId: string, statement: string, _executionHistory?: Array<[string, string]>): Promise<Record<string, any>>;
|
|
106
|
+
generateAction(_sessionId: string, statement: string, stepId: string, options?: {
|
|
107
|
+
executionHistory?: Array<[string, string]>;
|
|
108
|
+
usePureVision?: boolean;
|
|
109
|
+
includeDebugInfo?: boolean;
|
|
110
|
+
}): Promise<any>;
|
|
111
|
+
takeScreenshot(_sessionId: string): Promise<{
|
|
112
|
+
screenshot: string;
|
|
113
|
+
screenshotPath?: string;
|
|
114
|
+
}>;
|
|
115
|
+
initializeCopilot(_sessionId: string, _initialTestFlow?: TestFlow): Promise<void>;
|
|
116
|
+
sendCopilotMessage(_sessionId: string, _message: string, _onEvent: any, _testFlow?: TestFlow): Promise<void>;
|
|
117
|
+
abortCopilot(_sessionId: string): boolean;
|
|
118
|
+
getCopilotTestFlow(_sessionId: string): TestFlow | undefined;
|
|
119
|
+
terminateSession(_sessionId: string): Promise<void>;
|
|
120
|
+
cleanupAll(): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Playwright Debugger — public entry point for `shiplightai/debugger-pw`.
|
|
125
|
+
*
|
|
126
|
+
* Imported by the generated debug test file inside a Playwright test context.
|
|
127
|
+
* Starts an internal HTTP server with int-runner and copilot routes,
|
|
128
|
+
* backed by PlaywrightSandboxService.
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
interface PlaywrightDebugOptions {
|
|
132
|
+
yamlFilePath: string;
|
|
133
|
+
port: number;
|
|
134
|
+
page: Page;
|
|
135
|
+
agent: WebAgent;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Start the internal sandbox server backed by a Playwright-provided page and agent.
|
|
139
|
+
*/
|
|
140
|
+
declare function startPlaywrightDebugServer(options: PlaywrightDebugOptions): Promise<{
|
|
141
|
+
url: string;
|
|
142
|
+
close: () => Promise<void>;
|
|
143
|
+
}>;
|
|
144
|
+
|
|
145
|
+
export { type PlaywrightDebugOptions, PlaywrightSandboxService, startPlaywrightDebugServer };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import"./chunk-CSINHOOD.js";import w from"express";import*as m from"path";import*as h from"fs/promises";import*as y from"os";var g=class{page;agent;sessionId="pw-"+Math.random().toString(36).slice(2,10);abortController=null;constructor(e,t){this.page=e,this.agent=t}async createSession(e){return{sessionId:this.sessionId}}async executeLogin(e){return{status:"success",details:"Handled by Playwright"}}async ensureBrowser(e){return{page:this.page,liveviewUrl:""}}async startDebug(e){return{sessionId:this.sessionId,liveviewUrl:"",browserWsUrl:""}}async executeAction(e,t,s,n){let r=t.action_data||t.action;if(!r)throw new Error("ActionEntity has no action_data");if(console.error(`[pw-sandbox] executeAction stepId=${JSON.stringify(s)} action_name=${JSON.stringify(r.action_name)} locator=${JSON.stringify(t.locator)} kwargs=${JSON.stringify(r.kwargs)}`),r.action_name==="js_code"&&s==="prelude"){if(this.page.url()==="about:blank"){let l=r.kwargs?.code?.match(/PLAYWRIGHT_STARTING_URL \|\| '([^']*)'/)?.[1];l&&await this.page.goto(l,{waitUntil:"domcontentloaded"})}return{status:"success"}}let o=t.action_description||r.action_name;return{status:"success",...await this.agent.step(this.page,async()=>{await this.agent.execAction(r.action_name,this.page,t)},o,s,n?.stmtUid,!!n?.withSelfHealing)}}async runStep(e,t,s,n,r){let o=[],p={},l=this.agent._actionHandler;this.abortController=new AbortController;try{let u=await this.agent.execute(this.page,t,s,!1);return{success:u?.success??!0,actions:o,details:u?.details}}finally{this.abortController=null}}stopRunStep(e){return this.abortController?(this.abortController.abort(),!0):!1}async evaluate(e,t,s){try{let n=await this.agent.assert(this.page,t);return{conclusion:n?"pass":"fail",explanation:n?"Assertion passed":"Assertion failed"}}catch(n){return{conclusion:"fail",explanation:n.message}}}async generateAction(e,t,s,n){return this.agent.generate(this.page,t,s,n?.usePureVision)}async takeScreenshot(e){let t=await this.page.screenshot(),s=m.join(y.tmpdir(),`shiplight-screenshot-${Date.now()}.png`);return await h.writeFile(s,t),{screenshot:t.toString("base64"),screenshotPath:s}}async initializeCopilot(e,t){}async sendCopilotMessage(e,t,s,n){throw new Error("Copilot not supported in Playwright debug mode")}abortCopilot(e){return!1}getCopilotTestFlow(e){}async terminateSession(e){console.error("[debugger] Playwright session released")}async cleanupAll(){}};async function S(d){let{yamlFilePath:e,port:t,page:s,agent:n}=d,r=new g(s,n),o=w();o.use(w.json({limit:"10mb"})),o.use((c,i,a)=>{if(i.setHeader("Access-Control-Allow-Origin","*"),i.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),i.setHeader("Access-Control-Allow-Headers","Content-Type"),c.method==="OPTIONS")return i.sendStatus(204);a()});let{createTestFlowRouter:p}=await import("./testFlow-OQWWSEQT.js"),{createIntRunnerRouter:l}=await import("./intRunner-5A6M6JSJ.js"),{createCopilotRouter:u}=await import("./copilot-7JTVJQXP.js");o.use(p(e)),o.use(l(r)),o.use(u(r));let b=await new Promise((c,i)=>{let a=o.listen(t,"localhost",()=>c(a));a.on("error",i)});return{url:`http://localhost:${t}`,close:async()=>{await r.cleanupAll(),await new Promise((c,i)=>{b.close(a=>a?i(a):c())})}}}export{g as PlaywrightSandboxService,S as startPlaywrightDebugServer};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import{a as b,c as v}from"./chunk-CSINHOOD.js";var re=v((yt,te)=>{"use strict";var N=1e3,L=N*60,B=L*60,j=B*24,Ee=j*7,xe=j*365.25;te.exports=function(e,r){r=r||{};var t=typeof e;if(t==="string"&&e.length>0)return Pe(e);if(t==="number"&&isFinite(e))return r.long?Re(e):Ie(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function Pe(e){if(e=String(e),!(e.length>100)){var r=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(r){var t=parseFloat(r[1]),n=(r[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return t*xe;case"weeks":case"week":case"w":return t*Ee;case"days":case"day":case"d":return t*j;case"hours":case"hour":case"hrs":case"hr":case"h":return t*B;case"minutes":case"minute":case"mins":case"min":case"m":return t*L;case"seconds":case"second":case"secs":case"sec":case"s":return t*N;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function Ie(e){var r=Math.abs(e);return r>=j?Math.round(e/j)+"d":r>=B?Math.round(e/B)+"h":r>=L?Math.round(e/L)+"m":r>=N?Math.round(e/N)+"s":e+"ms"}function Re(e){var r=Math.abs(e);return r>=j?$(e,r,j,"day"):r>=B?$(e,r,B,"hour"):r>=L?$(e,r,L,"minute"):r>=N?$(e,r,N,"second"):e+" ms"}function $(e,r,t,n){var s=r>=t*1.5;return Math.round(e/t)+" "+n+(s?"s":"")}});var W=v((gt,ne)=>{"use strict";function Ae(e){t.debug=t,t.default=t,t.coerce=x,t.disable=y,t.enable=s,t.enabled=g,t.humanize=re(),t.destroy=R,Object.keys(e).forEach(o=>{t[o]=e[o]}),t.names=[],t.skips=[],t.formatters={};function r(o){let i=0;for(let c=0;c<o.length;c++)i=(i<<5)-i+o.charCodeAt(c),i|=0;return t.colors[Math.abs(i)%t.colors.length]}t.selectColor=r;function t(o){let i,c=null,a,w;function d(...p){if(!d.enabled)return;let E=d,F=Number(new Date),A=F-(i||F);E.diff=A,E.prev=i,E.curr=F,i=F,p[0]=t.coerce(p[0]),typeof p[0]!="string"&&p.unshift("%O");let P=0;p[0]=p[0].replace(/%([a-zA-Z%])/g,(M,T)=>{if(M==="%%")return"%";P++;let ee=t.formatters[T];if(typeof ee=="function"){let Se=p[P];M=ee.call(E,Se),p.splice(P,1),P--}return M}),t.formatArgs.call(E,p),(E.log||t.log).apply(E,p)}return d.namespace=o,d.useColors=t.useColors(),d.color=t.selectColor(o),d.extend=n,d.destroy=t.destroy,Object.defineProperty(d,"enabled",{enumerable:!0,configurable:!1,get:()=>c!==null?c:(a!==t.namespaces&&(a=t.namespaces,w=t.enabled(o)),w),set:p=>{c=p}}),typeof t.init=="function"&&t.init(d),d}function n(o,i){let c=t(this.namespace+(typeof i>"u"?":":i)+o);return c.log=this.log,c}function s(o){t.save(o),t.namespaces=o,t.names=[],t.skips=[];let i=(typeof o=="string"?o:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let c of i)c[0]==="-"?t.skips.push(c.slice(1)):t.names.push(c)}function u(o,i){let c=0,a=0,w=-1,d=0;for(;c<o.length;)if(a<i.length&&(i[a]===o[c]||i[a]==="*"))i[a]==="*"?(w=a,d=c,a++):(c++,a++);else if(w!==-1)a=w+1,d++,c=d;else return!1;for(;a<i.length&&i[a]==="*";)a++;return a===i.length}function y(){let o=[...t.names,...t.skips.map(i=>"-"+i)].join(",");return t.enable(""),o}function g(o){for(let i of t.skips)if(u(o,i))return!1;for(let i of t.names)if(u(o,i))return!0;return!1}function x(o){return o instanceof Error?o.stack||o.message:o}function R(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return t.enable(t.load()),t}ne.exports=Ae});var se=v((h,U)=>{"use strict";h.formatArgs=je;h.save=Te;h.load=Ne;h.useColors=Me;h.storage=Le();h.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();h.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Me(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function je(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+U.exports.humanize(this.diff),!this.useColors)return;let r="color: "+this.color;e.splice(1,0,r,"color: inherit");let t=0,n=0;e[0].replace(/%[a-zA-Z%]/g,s=>{s!=="%%"&&(t++,s==="%c"&&(n=t))}),e.splice(n,0,r)}h.log=console.debug||console.log||(()=>{});function Te(e){try{e?h.storage.setItem("debug",e):h.storage.removeItem("debug")}catch{}}function Ne(){let e;try{e=h.storage.getItem("debug")||h.storage.getItem("DEBUG")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function Le(){try{return localStorage}catch{}}U.exports=W()(h);var{formatters:Be}=U.exports;Be.j=function(e){try{return JSON.stringify(e)}catch(r){return"[UnexpectedJSONParseError]: "+r.message}}});var ie=v((bt,oe)=>{"use strict";oe.exports=(e,r=process.argv)=>{let t=e.startsWith("-")?"":e.length===1?"-":"--",n=r.indexOf(t+e),s=r.indexOf("--");return n!==-1&&(s===-1||n<s)}});var ae=v((mt,ue)=>{"use strict";var qe=b("os"),ce=b("tty"),_=ie(),{env:f}=process,I;_("no-color")||_("no-colors")||_("color=false")||_("color=never")?I=0:(_("color")||_("colors")||_("color=true")||_("color=always"))&&(I=1);"FORCE_COLOR"in f&&(f.FORCE_COLOR==="true"?I=1:f.FORCE_COLOR==="false"?I=0:I=f.FORCE_COLOR.length===0?1:Math.min(parseInt(f.FORCE_COLOR,10),3));function Y(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function K(e,r){if(I===0)return 0;if(_("color=16m")||_("color=full")||_("color=truecolor"))return 3;if(_("color=256"))return 2;if(e&&!r&&I===void 0)return 0;let t=I||0;if(f.TERM==="dumb")return t;if(process.platform==="win32"){let n=qe.release().split(".");return Number(n[0])>=10&&Number(n[2])>=10586?Number(n[2])>=14931?3:2:1}if("CI"in f)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(n=>n in f)||f.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in f)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(f.TEAMCITY_VERSION)?1:0;if(f.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in f){let n=parseInt((f.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(f.TERM_PROGRAM){case"iTerm.app":return n>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(f.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(f.TERM)||"COLORTERM"in f?1:t}function De(e){let r=K(e,e&&e.isTTY);return Y(r)}ue.exports={supportsColor:De,stdout:Y(K(!0,ce.isatty(1))),stderr:Y(K(!0,ce.isatty(2)))}});var le=v((l,G)=>{"use strict";var ke=b("tty"),H=b("util");l.init=Je;l.log=Ge;l.formatArgs=Ue;l.save=ze;l.load=Ve;l.useColors=$e;l.destroy=H.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");l.colors=[6,2,3,4,5,1];try{let e=ae();e&&(e.stderr||e).level>=2&&(l.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}l.inspectOpts=Object.keys(process.env).filter(e=>/^debug_/i.test(e)).reduce((e,r)=>{let t=r.substring(6).toLowerCase().replace(/_([a-z])/g,(s,u)=>u.toUpperCase()),n=process.env[r];return/^(yes|on|true|enabled)$/i.test(n)?n=!0:/^(no|off|false|disabled)$/i.test(n)?n=!1:n==="null"?n=null:n=Number(n),e[t]=n,e},{});function $e(){return"colors"in l.inspectOpts?!!l.inspectOpts.colors:ke.isatty(process.stderr.fd)}function Ue(e){let{namespace:r,useColors:t}=this;if(t){let n=this.color,s="\x1B[3"+(n<8?n:"8;5;"+n),u=` ${s};1m${r} \x1B[0m`;e[0]=u+e[0].split(`
|
|
4
|
+
`).join(`
|
|
5
|
+
`+u),e.push(s+"m+"+G.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=He()+r+" "+e[0]}function He(){return l.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Ge(...e){return process.stderr.write(H.formatWithOptions(l.inspectOpts,...e)+`
|
|
6
|
+
`)}function ze(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function Ve(){return process.env.DEBUG}function Je(e){e.inspectOpts={};let r=Object.keys(l.inspectOpts);for(let t=0;t<r.length;t++)e.inspectOpts[r[t]]=l.inspectOpts[r[t]]}G.exports=W()(l);var{formatters:fe}=G.exports;fe.o=function(e){return this.inspectOpts.colors=this.useColors,H.inspect(e,this.inspectOpts).split(`
|
|
7
|
+
`).map(r=>r.trim()).join(" ")};fe.O=function(e){return this.inspectOpts.colors=this.useColors,H.inspect(e,this.inspectOpts)}});var Q=v((_t,Z)=>{"use strict";typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Z.exports=se():Z.exports=le()});var he=v(C=>{"use strict";var We=C&&C.__createBinding||(Object.create?function(e,r,t,n){n===void 0&&(n=t);var s=Object.getOwnPropertyDescriptor(r,t);(!s||("get"in s?!r.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,n,s)}:function(e,r,t,n){n===void 0&&(n=t),e[n]=r[t]}),Ye=C&&C.__setModuleDefault||(Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r}),de=C&&C.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&We(r,e,t);return Ye(r,e),r};Object.defineProperty(C,"__esModule",{value:!0});C.req=C.json=C.toBuffer=void 0;var Ke=de(b("http")),Ze=de(b("https"));async function pe(e){let r=0,t=[];for await(let n of e)r+=n.length,t.push(n);return Buffer.concat(t,r)}C.toBuffer=pe;async function Qe(e){let t=(await pe(e)).toString("utf8");try{return JSON.parse(t)}catch(n){let s=n;throw s.message+=` (input: ${t})`,s}}C.json=Qe;function Xe(e,r={}){let n=((typeof e=="string"?e:e.href).startsWith("https:")?Ze:Ke).request(e,r),s=new Promise((u,y)=>{n.once("response",u).once("error",y).end()});return n.then=s.then.bind(s),n}C.req=Xe});var be=v(m=>{"use strict";var ye=m&&m.__createBinding||(Object.create?function(e,r,t,n){n===void 0&&(n=t);var s=Object.getOwnPropertyDescriptor(r,t);(!s||("get"in s?!r.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,n,s)}:function(e,r,t,n){n===void 0&&(n=t),e[n]=r[t]}),et=m&&m.__setModuleDefault||(Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r}),ge=m&&m.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&ye(r,e,t);return et(r,e),r},tt=m&&m.__exportStar||function(e,r){for(var t in e)t!=="default"&&!Object.prototype.hasOwnProperty.call(r,t)&&ye(r,e,t)};Object.defineProperty(m,"__esModule",{value:!0});m.Agent=void 0;var rt=ge(b("net")),Ce=ge(b("http")),nt=b("https");tt(he(),m);var S=Symbol("AgentBaseInternalState"),X=class extends Ce.Agent{constructor(r){super(r),this[S]={}}isSecureEndpoint(r){if(r){if(typeof r.secureEndpoint=="boolean")return r.secureEndpoint;if(typeof r.protocol=="string")return r.protocol==="https:"}let{stack:t}=new Error;return typeof t!="string"?!1:t.split(`
|
|
8
|
+
`).some(n=>n.indexOf("(https.js:")!==-1||n.indexOf("node:https:")!==-1)}incrementSockets(r){if(this.maxSockets===1/0&&this.maxTotalSockets===1/0)return null;this.sockets[r]||(this.sockets[r]=[]);let t=new rt.Socket({writable:!1});return this.sockets[r].push(t),this.totalSocketCount++,t}decrementSockets(r,t){if(!this.sockets[r]||t===null)return;let n=this.sockets[r],s=n.indexOf(t);s!==-1&&(n.splice(s,1),this.totalSocketCount--,n.length===0&&delete this.sockets[r])}getName(r){return this.isSecureEndpoint(r)?nt.Agent.prototype.getName.call(this,r):super.getName(r)}createSocket(r,t,n){let s={...t,secureEndpoint:this.isSecureEndpoint(t)},u=this.getName(s),y=this.incrementSockets(u);Promise.resolve().then(()=>this.connect(r,s)).then(g=>{if(this.decrementSockets(u,y),g instanceof Ce.Agent)try{return g.addRequest(r,s)}catch(x){return n(x)}this[S].currentSocket=g,super.createSocket(r,t,n)},g=>{this.decrementSockets(u,y),n(g)})}createConnection(){let r=this[S].currentSocket;if(this[S].currentSocket=void 0,!r)throw new Error("No socket was returned in the `connect()` function");return r}get defaultPort(){return this[S].defaultPort??(this.protocol==="https:"?443:80)}set defaultPort(r){this[S]&&(this[S].defaultPort=r)}get protocol(){return this[S].protocol??(this.isSecureEndpoint()?"https:":"http:")}set protocol(r){this[S]&&(this[S].protocol=r)}};m.Agent=X});var me=v(q=>{"use strict";var st=q&&q.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(q,"__esModule",{value:!0});q.parseProxyResponse=void 0;var ot=st(Q()),z=(0,ot.default)("https-proxy-agent:parse-proxy-response");function it(e){return new Promise((r,t)=>{let n=0,s=[];function u(){let o=e.read();o?R(o):e.once("readable",u)}function y(){e.removeListener("end",g),e.removeListener("error",x),e.removeListener("readable",u)}function g(){y(),z("onend"),t(new Error("Proxy connection ended before receiving CONNECT response"))}function x(o){y(),z("onerror %o",o),t(o)}function R(o){s.push(o),n+=o.length;let i=Buffer.concat(s,n),c=i.indexOf(`\r
|
|
9
|
+
\r
|
|
10
|
+
`);if(c===-1){z("have not received end of HTTP headers yet..."),u();return}let a=i.slice(0,c).toString("ascii").split(`\r
|
|
11
|
+
`),w=a.shift();if(!w)return e.destroy(),t(new Error("No header received from proxy CONNECT response"));let d=w.split(" "),p=+d[1],E=d.slice(2).join(" "),F={};for(let A of a){if(!A)continue;let P=A.indexOf(":");if(P===-1)return e.destroy(),t(new Error(`Invalid header from proxy CONNECT response: "${A}"`));let k=A.slice(0,P).toLowerCase(),M=A.slice(P+1).trimStart(),T=F[k];typeof T=="string"?F[k]=[T,M]:Array.isArray(T)?T.push(M):F[k]=M}z("got proxy server response: %o %o",w,F),y(),r({connect:{statusCode:p,statusText:E,headers:F},buffered:i})}e.on("error",x),e.on("end",g),u()})}q.parseProxyResponse=it});var Ct=v(O=>{var ct=O&&O.__createBinding||(Object.create?function(e,r,t,n){n===void 0&&(n=t);var s=Object.getOwnPropertyDescriptor(r,t);(!s||("get"in s?!r.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,n,s)}:function(e,r,t,n){n===void 0&&(n=t),e[n]=r[t]}),ut=O&&O.__setModuleDefault||(Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r}),we=O&&O.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&ct(r,e,t);return ut(r,e),r},Fe=O&&O.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(O,"__esModule",{value:!0});O.HttpsProxyAgent=void 0;var V=we(b("net")),_e=we(b("tls")),at=Fe(b("assert")),ft=Fe(Q()),lt=be(),dt=b("url"),pt=me(),D=(0,ft.default)("https-proxy-agent"),Oe=e=>e.servername===void 0&&e.host&&!V.isIP(e.host)?{...e,servername:e.host}:e,J=class extends lt.Agent{constructor(r,t){super(t),this.options={path:void 0},this.proxy=typeof r=="string"?new dt.URL(r):r,this.proxyHeaders=t?.headers??{},D("Creating new HttpsProxyAgent instance: %o",this.proxy.href);let n=(this.proxy.hostname||this.proxy.host).replace(/^\[|\]$/g,""),s=this.proxy.port?parseInt(this.proxy.port,10):this.proxy.protocol==="https:"?443:80;this.connectOpts={ALPNProtocols:["http/1.1"],...t?ve(t,"headers"):null,host:n,port:s}}async connect(r,t){let{proxy:n}=this;if(!t.host)throw new TypeError('No "host" provided');let s;n.protocol==="https:"?(D("Creating `tls.Socket`: %o",this.connectOpts),s=_e.connect(Oe(this.connectOpts))):(D("Creating `net.Socket`: %o",this.connectOpts),s=V.connect(this.connectOpts));let u=typeof this.proxyHeaders=="function"?this.proxyHeaders():{...this.proxyHeaders},y=V.isIPv6(t.host)?`[${t.host}]`:t.host,g=`CONNECT ${y}:${t.port} HTTP/1.1\r
|
|
12
|
+
`;if(n.username||n.password){let c=`${decodeURIComponent(n.username)}:${decodeURIComponent(n.password)}`;u["Proxy-Authorization"]=`Basic ${Buffer.from(c).toString("base64")}`}u.Host=`${y}:${t.port}`,u["Proxy-Connection"]||(u["Proxy-Connection"]=this.keepAlive?"Keep-Alive":"close");for(let c of Object.keys(u))g+=`${c}: ${u[c]}\r
|
|
13
|
+
`;let x=(0,pt.parseProxyResponse)(s);s.write(`${g}\r
|
|
14
|
+
`);let{connect:R,buffered:o}=await x;if(r.emit("proxyConnect",R),this.emit("proxyConnect",R,r),R.statusCode===200)return r.once("socket",ht),t.secureEndpoint?(D("Upgrading socket connection to TLS"),_e.connect({...ve(Oe(t),"host","path","port"),socket:s})):s;s.destroy();let i=new V.Socket({writable:!1});return i.readable=!0,r.once("socket",c=>{D("Replaying proxy buffer for failed request"),(0,at.default)(c.listenerCount("data")>0),c.push(o),c.push(null)}),i}};J.protocols=["http","https"];O.HttpsProxyAgent=J;function ht(e){e.resume()}function ve(e,...r){let t={},n;for(n in e)r.includes(n)||(t[n]=e[n]);return t}});export default Ct();
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import{a as d,b as e,c as f,d as g,e as h,f as O,g as P,h as Q,i as R,j as S,k as T,l as U,m as Z,n as _,o as $,p as aa,q as ba,r as ca,s as da,t as ea,u as fa}from"./chunk-NDYQF4WM.js";import{b as i,e as K,f as L,g as M,h as N}from"./chunk-JY6U4L7Q.js";import{C,E as D}from"./chunk-ESJGKHJ4.js";import{a as m,b as n,c as o,d as p,g as s,h as t,i as u,j as v,k as w,l as x,m as y,n as z,o as A}from"./chunk-VXL4KP4U.js";import"./chunk-YU3XZJIJ.js";import{a as c,h as j,i as k,j as l,l as q,m as r}from"./chunk-QU5HYOUM.js";import{a as V,j as W,k as X,l as Y}from"./chunk-4JBGAENP.js";import{a as E,c as F,d as G,e as H,f as I,g as J}from"./chunk-FL4TL6US.js";import"./chunk-BVOD5VWH.js";import{b as a,c as b,i as B}from"./chunk-FBJSHHRD.js";import"./chunk-CSINHOOD.js";export{D as ActionHandler,C as ActionHelper,ca as Agent,$ as AgentServices,aa as AgentStepEventTypes,ba as AgentTaskFailedError,Z as BrowserManager,v as DEFAULT_EVENT_LISTENER_LIMIT,z as DomService,u as EVENT_LISTENER_CANDIDATE_SELECTORS,A as HistoryTreeProcessor,E as INIT_SCRIPT,t as INTERACTION_EVENT_TYPES,s as INTERACTIVE_ROLES,B as LogLevel,W as LoginType,T as MCPToolProvider,i as OpenAIToolProvider,fa as SDK_VERSION,m as ToolRegistry,X as TwoFactorAuthType,Y as VariableStore,ca as WebAgent,a as configureSdk,ea as createAgent,da as createAgentContext,Q as createToolRegistry,R as createToolRegistryWithCapabilities,O as ensureToolsRegistered,M as evaluateStatement,L as executeStep,U as exportMCPTools,y as filterInteractionListeners,K as generateActionStep,r as getActionEntityLocatorInfo,G as getBrowserCdpUrl,S as getCapabilitySummary,q as getFramePath,o as getModel,I as getPageInfo,H as getPageWsUrl,_ as getPlatformFromDeviceName,p as getProviderOptions,b as getSdkConfig,P as getToolRegistry,d as injectUserFunction,x as isInteractionEventType,w as isInteractiveRole,g as loadKnowledgeMappings,f as loadKnowledges,e as loadUserFunctions,c as logger,F as newBrowserContext,h as parseSSEStream,j as pickBestLocator,k as pickBestLocatorForElement,l as pickBestLocators,V as replaceVariables,N as runTask,J as setWindowBounds,n as toolRegistry};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import{$,A,Aa,B,Ba,C,Ca,D,Da,E,Ea,F,Fa,G,Ga,H,Ha,I,Ia,J,Ja,K,Ka,L,La,M,Ma,N,Na,O,Oa,P,Pa,Q,Qa,R,Ra,S,Sa,T,Ta,U,Ua,V,Va,W,X,Y,Z,_,a,aa,b,ba,c,ca,d,da,e,ea,f,fa,g,ga,h,ha,i,ia,j,ja,k,ka,l,la,m,ma,n,na,o,oa,p,pa,q,qa,r,ra,s,sa,t,ta,u,ua,v,va,w,wa,x,xa,y,ya,z,za}from"./chunk-SUZXLRAA.js";import"./chunk-CSINHOOD.js";export{u as ADDRESS_BAR_HEIGHT,d as ANDROID_DEVICE_PREFIX,Y as ActionEntitySchema,_ as ActionSchema,Sa as AgentStatus,X as BaseStatementSchema,E as BrowserType,V as ConditionSchema,Ja as ConditionType,U as ConditionTypeSchema,Oa as DEFAULT_ANTHROPIC_MODEL,Ma as DEFAULT_COPILOT_MODEL,D as DEFAULT_DEVICE_NAME,Pa as DEFAULT_GOOGLE_MODEL,Na as DEFAULT_WEBAGENT_MODEL,Ka as DEFAULT_WHILE_LOOP_TIMEOUT_MS,H as DEVICE_CATEGORIES,G as DeviceType,Z as DraftSchema,e as IOS_DEVICE_PREFIX,S as LoginType,C as MIN_WINDOW_HEIGHT,B as MIN_WINDOW_WIDTH,c as NodeJSCodeCommon,F as PLAYWRIGHT_DEVICES,A as RECORD_VIDEO_HEIGHT,z as RECORD_VIDEO_WIDTH,$ as StatementSchema,Ia as StatementType,W as StatementTypeSchema,aa as TestFlowSchema,T as TwoFactorAuthType,L as UI_DEVICE_CATEGORIES,M as UI_DEVICE_CATEGORIES_ELECTRON,t as USER_AGENT,y as VIEWPORT_HEIGHT,x as VIEWPORT_WIDTH,La as VariableStore,w as WINDOW_HEIGHT,v as WINDOW_WIDTH,ya as actionStepsMapToTestFlowSections,va as allowPureVisionAction,ia as applyPatchToYaml,ja as applyPatchToYamlString,wa as collectActionSteps,k as createAndroidDeviceName,Aa as createEmptyStore,l as createIOSDeviceName,Ba as createRunnerStoreEntry,xa as extractActionStepsFromTestFlow,j as extractDeviceIdentifier,fa as extractYamlMetadata,oa as findNextAfterContainer,na as findNextSibling,ma as findNextStatement,ra as findPathBetweenStatements,la as findStatementPathById,J as getAllDeviceNames,ta as getAllReferenceIds,pa as getAllStatementsInOrder,Va as getAndroidDeviceDisplayName,O as getBrowserWindowSize,o as getCompatiblePlatforms,R as getDeviceBrowserType,K as getDeviceByName,Q as getDeviceChannel,N as getDeviceOptions,I as getDevicesByCategory,r as getIOSDeviceDisplayName,a as getLoginConfigPlatform,P as getRecordVideoSize,ka as getStatementContainers,Ga as getStoreSize,f as getTestPlatformFromDeviceName,sa as hasReferenceIds,h as isAndroidDevice,n as isAppPackage,ua as isDynamicAction,qa as isExecutableStatement,i as isIOSDevice,g as isNativeDevice,s as isPhysicalDeviceUDID,p as isPlatformCompatibleWithUrl,Fa as isStoreEmpty,m as isWebUrl,Ha as mergeActionEntitiesIntoTestFlow,Ea as mergeStoreUpdates,Ta as parseAdbDeviceLine,ea as parseYamlArrayItems,b as replaceVariables,Ca as resolveActionEntity,Ra as resolveModelFromEnv,Qa as resolveModels,ca as testFlowToYaml,ba as testFlowToYamlObject,Ua as toAndroidDeviceName,q as toIOSDeviceName,Da as updateStoreEntry,ha as validatePatch,za as validateTestYaml,da as yamlObjectsToString,ga as yamlToTestFlow};
|
package/dist/fixture.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import"./chunk-CSINHOOD.js";import*as u from"path";import{test as w,expect as I}from"@playwright/test";import*as c from"fs";import*as o from"path";function v(s){let e=o.resolve(s),r=o.resolve(process.cwd());for(;;){for(let n of["shiplight.config.json","login.config.json"]){let a=o.join(e,n);if(c.existsSync(a)){try{let i=JSON.parse(c.readFileSync(a,"utf-8"));if(i.variables&&typeof i.variables=="object")return _(i.variables)}catch{}return[]}}if(e===r)break;let t=o.dirname(e);if(t===e)break;e=t}return[]}function _(s){let e=[];for(let[r,t]of Object.entries(s))if(typeof t=="string")e.push({key:r,value:t,sensitive:!1});else if(t&&typeof t=="object"&&"value"in t){let n=t;e.push({key:r,value:String(n.value),sensitive:n.sensitive===!0})}return e}var f;async function k(){return f||(f=await import("./dist-
|
|
3
|
+
import"./chunk-CSINHOOD.js";import*as u from"path";import{test as w,expect as I}from"@playwright/test";import*as c from"fs";import*as o from"path";function v(s){let e=o.resolve(s),r=o.resolve(process.cwd());for(;;){for(let n of["shiplight.config.json","login.config.json"]){let a=o.join(e,n);if(c.existsSync(a)){try{let i=JSON.parse(c.readFileSync(a,"utf-8"));if(i.variables&&typeof i.variables=="object")return _(i.variables)}catch{}return[]}}if(e===r)break;let t=o.dirname(e);if(t===e)break;e=t}return[]}function _(s){let e=[];for(let[r,t]of Object.entries(s))if(typeof t=="string")e.push({key:r,value:t,sensitive:!1});else if(t&&typeof t=="object"&&"value"in t){let n=t;e.push({key:r,value:String(n.value),sensitive:n.sensitive===!0})}return e}var f;async function k(){return f||(f=await import("./dist-OOFTSMK3.js"),f)}var j=w.extend({agent:async({},s,e)=>{let{WebAgent:r,createAgentContext:t,configureSdk:n,VariableStore:a}=await k();n({env:{GOOGLE_API_KEY:process.env.GOOGLE_API_KEY??"",ANTHROPIC_API_KEY:process.env.ANTHROPIC_API_KEY??""}});let{resolveModelFromEnv:i}=await import("./dist-WQ66EMT6.js"),l=i(process.env);if(!l)throw new Error("No AI model configured. Set WEB_AGENT_MODEL, ANTHROPIC_API_KEY, or GOOGLE_API_KEY.");let p=new a,b=e.project.testDir||process.cwd(),g=e.file,m=g?u.dirname(g):b,d=v(m);for(let{key:h,value:y,sensitive:E}of d)p.set(h,y,E);let A=new r(t({model:l,variableStore:p}));await s(A)}});export{I as expect,j as test};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import{D as o,E as r}from"./chunk-
|
|
3
|
+
import{D as o,E as r}from"./chunk-ESJGKHJ4.js";import"./chunk-QU5HYOUM.js";import"./chunk-FBJSHHRD.js";import"./chunk-CSINHOOD.js";export{o as ActionHandler,r as default};
|
package/dist/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import{r as
|
|
4
|
-
`);let
|
|
5
|
-
`);for(let s of r)n.push(` ${s}`);return n.push("}"),n});l("function",(e,t,n)=>{let r=e.action_data?.kwargs||{},s=r.functionName;if(s&&s.includes("#")){let[o,i]=s.split("#");if(o&&i){let p=o.replace(/\.(ts|js|mjs)$/,""),c=`import { ${i} } from '${p}';`;n?.imports?.add(c);let u={...r,functionName:i},f=X(u);return f?[f.endsWith(";")?f:`${f};`]:["// Skipping function: invalid export pattern"]}}let a=X(r);return a?[a.endsWith(";")?a:`${a};`]:["// Skipping function: missing functionName"]});l("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});l("upload_file",e=>{let t=e.action_data?.kwargs||{},n=[],r={};return t.paths?r.paths=t.paths:t.path&&(r.path=t.path),t.use_file_input&&(r.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(r)} }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(s=>` ${s},`),"});"]});l("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);l("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);l("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});l("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(r=>` ${r},`),"});"]});l("done",()=>["// Done - no action needed"]);function X(e){let t=e.functionName;if(!t)return null;let n={},r=e.parameterNames||[],s=e.parameterValues||e.args||[];if(r.forEach((p,c)=>{c<s.length&&(n[p]=s[c])}),Object.keys(n).length===0)return`await ${t}()`;let a=["page","testContext","request","agentServices"],o=["undefined","null","true","false"],i=Object.entries(n).map(([p,c])=>{let u=String(c);return c==null?"undefined":a.includes(p)&&a.includes(u)||o.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${i.join(", ")})`}function w(e,t,n,r="main"){let s=[];for(let a=0;a<e.length;a++){let o=e[a],i=`${r}.${a}`,p=Pe(o,t,i,n);p.length>0&&(s.push(...p),a<e.length-1&&s.push(""))}return s}function Pe(e,t,n,r){let s=" ".repeat(t);switch(e.type){case"DRAFT":return Ne(e,t,n,r);case"ACTION":return Le(e,t,n,r);case"STEP":return Ce(e,t,n,r);case"IF_ELSE":return Ie(e,t,n,r);case"WHILE_LOOP":return je(e,t,n,r);default:return[`${s}// Unknown statement type: ${e.type}`]}}function Ne(e,t,n,r){let s=" ".repeat(t),a=e.description?.trim()||"";if(!a)return[`${s}// ${n}: Skipping - no description`];if(r.noAgent)return[`${s}// ${n}: ${m(a)}`,`${s}// DRAFT: ${m(a)} (requires agent - skipped in hook)`];let o=JSON.stringify(a);return[`${s}// ${n}: ${m(a)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.run(page, ${o}, '${n}');`]}function Le(e,t,n,r){let s=" ".repeat(t),a=e.description,o=e.uid,p=r.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!p){if(!a)return[`${s}// ${n}: Skipping - no description`];if(r.noAgent)return[`${s}// ${n}: ${m(a)}`,`${s}// DRAFT: ${m(a)} (requires agent - skipped in hook)`];let _=JSON.stringify(a),P=!!e.use_pure_vision;return[`${s}// ${n}: ${m(a)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.execute(page, ${_}, '${n}', ${P});`]}let c=e.locator?{...p,locator:e.locator}:p;a&&a!==c.action_description&&(c={...c,action_description:a});let u=c.action_data?.action_name||"",f=c.action_description||"",d=Z(u);if(!d)return[`${s}// ${n}: Unknown action: ${u}`];let y={imports:r.imports},g=d(c,n,y);if(r.noAgent){if(H(c))return[`${s}// ${n}: ${m(f)}`,`${s}// AI action: ${m(f)} (requires agent - skipped in hook)`];let _=Fe(c,u,s,n);return _||[`${s}// ${n}: ${m(f)}`,...g.map(P=>`${s}${P}`)]}if(H(c))return[`${s}// ${n}: ${m(f)}`,`${s}page = agent.agentServices.validatePage(page);`,...g.map(_=>`${s}${_}`)];let x=JSON.stringify(f),S=g.map(_=>`${s} ${_}`),E=z(c),C=o?`'${o}'`:"undefined";return[`${s}// ${n}: ${m(f)}`,`${s}page = agent.agentServices.validatePage(page);`,`${s}await agent.step(page, async () => {`,...S,`${s}}, ${x}, '${n}', ${C}, ${E});`]}function Ce(e,t,n,r){let s=" ".repeat(t),a=[];e.description&&e.description.trim()&&a.push(`${s}// Step: ${m(e.description)}`);let o=w(e.statements,t,r,n);return a.push(...o),a}function Ie(e,t,n,r){let s=" ".repeat(t),a=[];if(a.push(`${s}// ${n}: Conditional check`),e.condition.type==="JS_CODE")a.push(`${s}if (${e.condition.expression}) {`);else{a.push(`${s}// AI Condition: ${m(e.condition.expression)}`);let i=JSON.stringify(e.condition.expression);a.push(`${s}if (await agent.evaluate(page, ${i}, "${n}")) {`)}let o=w(e.then,t+1,r,`${n}.then`);if(a.push(...o),e.else&&e.else.length>0){a.push(`${s}} else {`);let i=w(e.else,t+1,r,`${n}.else`);a.push(...i)}return a.push(`${s}}`),a}function je(e,t,n,r){let s=" ".repeat(t),a=[];a.push(`${s}// ${n}: Loop`);let o=e.timeout_ms??W,i=o/1e3,p=e.timeout_ms?`While loop exceeded timeout of ${i}s`:`While loop exceeded default timeout of ${i}s`,c=`loop_${n.replace(/\./g,"_")}`;if(a.push(`${s}const ${c}_start = Date.now();`),a.push(`${s}const ${c}_timeout = ${o};`),a.push(`${s}const ${c}_check = () => {`),a.push(`${s} if (Date.now() - ${c}_start > ${c}_timeout) {`),a.push(`${s} throw new Error('${p}');`),a.push(`${s} }`),a.push(`${s} return true;`),a.push(`${s}};`),e.condition.type==="JS_CODE")a.push(`${s}while (${c}_check() && (${e.condition.expression})) {`);else{a.push(`${s}// AI Loop Condition: ${m(e.condition.expression)}`);let f=JSON.stringify(e.condition.expression);a.push(`${s}while (${c}_check() && await agent.evaluate(page, ${f}, "${n}")) {`)}let u=w(e.body,t+1,r,`${n}.body`);return a.push(...u),a.push(`${s}}`),a}function Fe(e,t,n,r){let s=e.action_description||"",a=e.action_data?.kwargs||{};switch(t){case"go_to_url":case"open_tab":{let o=a.url||"";return[`${n}// ${r}: ${m(s)}`,`${n}await page.goto(${JSON.stringify(o)}, { waitUntil: 'domcontentloaded' });`]}case"go_back":return[`${n}// ${r}: ${m(s)}`,`${n}await page.goBack();`];case"go_forward":return[`${n}// ${r}: ${m(s)}`,`${n}await page.goForward();`];case"input_text":{let o=a.text||"",i=getPageLocatorExpression(e);return i?[`${n}// ${r}: ${m(s)}`,`${n}await ${i}.fill(${JSON.stringify(o)}, { timeout: ${ACTION_TIMEOUT} });`]:null}case"select_dropdown_option":{let o=a.text||a.label||"",i=getPageLocatorExpression(e);return i?[`${n}// ${r}: ${m(s)}`,`${n}await ${i}.selectOption({ label: ${JSON.stringify(o)} }, { timeout: ${ACTION_TIMEOUT} });`]:null}default:return null}}var ee={name:"shiplightai",version:"0.1.11",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var N=ee.version;function re(e,t){let n=[];n.push(`// @generated by shiplightai v${N}`),n.push(...oe()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let r=new Set,s={imports:r};t?.beforeEach&&t.beforeEach.length>0&&(n.push(...te("beforeEach",t.beforeEach,s)),n.push(""));let a=t?.timeout||t?.skip!==void 0||t?.fail!==void 0||t?.only||t?.slow?{timeout:t.timeout,skip:t.skip,fail:t.fail,only:t.only,slow:t.slow}:void 0;if(t?.parameters&&t.parameters.length>0){let o=t?.testName||e.goal||"Generated test",i=M(t?.tags);for(let p of t.parameters){let c=ie(e,p.values);n.push(...j(c,`${i}${$(o)} [${$(p.name)}]`,t?.startingUrl,s,0,a)),n.push("")}}else{let o=t?.testName||e.goal||"Generated test",i=M(t?.tags);n.push(...j(e,`${i}${$(o)}`,t?.startingUrl,s,0,a))}return t?.afterEach&&t.afterEach.length>0&&(n.push(""),n.push(...te("afterEach",t.afterEach,s))),ce(n,r),n.join(`
|
|
6
|
-
`)}function
|
|
7
|
-
`)}function M(e){return e&&e.length>0?e.map(t=>`@${t}`).join(" ")+" ":""}function j(e,t,n,
|
|
8
|
-
`,1)[0]!==
|
|
9
|
-
`+n.map(
|
|
10
|
-
`))}import*as
|
|
3
|
+
import{r as $e,s as ye}from"./chunk-NDYQF4WM.js";import"./chunk-JY6U4L7Q.js";import"./chunk-ESJGKHJ4.js";import"./chunk-VXL4KP4U.js";import"./chunk-YU3XZJIJ.js";import"./chunk-QU5HYOUM.js";import{l as _e}from"./chunk-4JBGAENP.js";import"./chunk-FL4TL6US.js";import"./chunk-BVOD5VWH.js";import{b as he}from"./chunk-FBJSHHRD.js";import{Ka as D,ga as N}from"./chunk-SUZXLRAA.js";import"./chunk-CSINHOOD.js";import*as x from"fs";import*as S from"path";import Xe from"dotenv";import{globSync as Qe}from"glob";import{readFileSync as pe,writeFileSync as Ue,statSync as De,existsSync as Ge}from"fs";import{resolve as We}from"path";import{globSync as Ye}from"glob";import{parse as Te,stringify as V}from"yaml";import{readFileSync as we}from"fs";import{resolve as Y,dirname as Se}from"path";import{parse as G,stringify as be}from"yaml";var W=5;function R(e,t){let n={expandingPaths:new Set([Y(t)]),depth:0,referencedPaths:new Set},s={...e};Array.isArray(s.statements)&&(s.statements=k(s.statements,t,n)),Array.isArray(s.teardown)&&(s.teardown=k(s.teardown,t,n));for(let r of["beforeAll","afterAll","beforeEach","afterEach"])Array.isArray(s[r])&&(s[r]=k(s[r],t,n));return{doc:s,referencedTemplatePaths:Array.from(n.referencedPaths)}}function k(e,t,n){let s=[];for(let r of e)if(Ae(r)){let a=xe(r,t,n);s.push(...a)}else s.push(ke(r,t,n));return s}function Ae(e){return typeof e=="object"&&e!==null&&typeof e.template=="string"}function xe(e,t,n){if(n.depth>=W)throw new Error(`Template expansion exceeded maximum depth of ${W}. Check for deeply nested or circular template references.`);let s=Y(Se(t),e.template);if(n.expandingPaths.has(s))throw new Error(`Circular template reference detected: ${s} is already being expanded. Stack: ${Array.from(n.expandingPaths).join(" \u2192 ")} \u2192 ${s}`);n.referencedPaths.add(s);let r;try{r=we(s,"utf-8")}catch(u){throw new Error(`Failed to read template file: ${s} (referenced from ${t}): ${u.message}`)}let a=G(r);if(!a||typeof a!="object")throw new Error(`Invalid template file: ${s} \u2014 expected a YAML object`);let i=a.params||[],o=e.params||{};for(let u of i)if(!(u in o))throw new Error(`Template ${e.template} requires param "${u}" but it was not provided. Required params: [${i.join(", ")}]`);let l=a.statements;if(!Array.isArray(l))throw new Error(`Template ${e.template} must have a "statements" array`);if(Object.keys(o).length>0){let f=be(l);for(let[h,g]of Object.entries(o))f=f.replaceAll(`<<${h}>>`,String(g));l=G(f)}let c={expandingPaths:new Set([...n.expandingPaths,s]),depth:n.depth+1,referencedPaths:n.referencedPaths};return k(l,s,c)}function ke(e,t,n){if(typeof e!="object"||e===null)return e;let s={...e};return Array.isArray(s.statements)&&(s.statements=k(s.statements,t,n)),Array.isArray(s.THEN)&&(s.THEN=k(s.THEN,t,n)),Array.isArray(s.ELSE)&&(s.ELSE=k(s.ELSE,t,n)),Array.isArray(s.DO)&&(s.DO=k(s.DO,t,n)),s}function K(e,t){let n=Te(e),s=n?.name,r=n?.tags,a=n?.use;if(n&&(n.name!==void 0||n.tags!==void 0||n.use!==void 0)&&(delete n.name,delete n.tags,delete n.use),n?.suite){if(n.goal||n.statements)throw new Error('YAML file cannot have both "suite" and top-level "goal"/"statements". Use either suite format or single-test format.');return Oe(n,s,r,a,t)}return Ee(n,s,r,a,t)}function Ee(e,t,n,s,r){let a=e?.beforeEach,i=e?.afterEach,o=q(e?.parameters),l=e?.timeout,c=e?.skip,u=e?.fail,f=e?.only,h=e?.slow;e&&(delete e.beforeEach,delete e.afterEach,delete e.parameters,delete e.timeout,delete e.skip,delete e.fail,delete e.only,delete e.slow),e&&!e.goal&&t&&(e.goal=t);let g=[];if(r&&e&&typeof e=="object"){let b=R(e,r);e=b.doc,g=b.referencedTemplatePaths}let _=V(e);return{testFlow:N(_),name:t,tags:n,use:s,beforeEach:a,afterEach:i,parameters:o,timeout:l,skip:c,fail:u,only:f,slow:h,referencedTemplatePaths:g}}function Oe(e,t,n,s,r){let a=e.suite;if(!Array.isArray(a.tests)||a.tests.length===0)throw new Error('Suite must have a non-empty "tests" array.');let i=a.serial,o=a.beforeAll,l=a.afterAll,c=a.beforeEach,u=a.afterEach,f=[],h=a.tests.map(g=>{if(!g.name)throw new Error('Each test in a suite must have a "name" field.');if(!Array.isArray(g.statements)||g.statements.length===0)throw new Error(`Suite test "${g.name}" must have a non-empty "statements" array.`);let _={goal:g.name,statements:g.statements};g.teardown&&(_.teardown=g.teardown);let T=[],b=_;if(r&&typeof _=="object"){let A=R(_,r);b=A.doc,T=A.referencedTemplatePaths,f.push(...T)}let P=V(b),L=N(P),y=q(g.parameters);return{testFlow:L,name:g.name,parameters:y,timeout:g.timeout,skip:g.skip,fail:g.fail,only:g.only,slow:g.slow}});return{suite:{serial:i,beforeAll:o,afterAll:l,beforeEach:c,afterEach:u,tests:h},name:t,tags:n,use:s,referencedTemplatePaths:f}}function q(e){if(!(!Array.isArray(e)||e.length===0))return e.map((t,n)=>{if(!t.name)throw new Error(`Parameter set at index ${n} must have a "name" field.`);if(!t.values||typeof t.values!="object")throw new Error(`Parameter set "${t.name}" must have a "values" object.`);return{name:t.name,values:t.values}})}import{stringify as te}from"yaml";function w(e){return e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function d(e){return e.replace(/\r\n/g," ").replace(/\n/g," ").replace(/\r/g," ").trim()}function ve(e){let t=e.frame_path;return!t||t.length===0?"page":`page.frameLocator('${t[0]}')`}function Pe(e){let t=e.xpath;return typeof t=="string"&&t.trim()?!t.startsWith("xpath=")&&!t.startsWith("/")&&!t.startsWith("//")?`xpath=//${t}`:t.startsWith("xpath=")?t:`xpath=${t}`:null}function J(e){let t=ve(e),n=e.locator;if(typeof n=="string"&&n.trim())return n=n.trim(),n.endsWith("first()")?`${t}.${n}`:`${t}.${n}.first()`;let s=Pe(e);if(s){let r=JSON.stringify(s);return`${t}.locator(${r}).first()`}return null}var Ne=["ai_action","ai_step","ai_assert","ai_extract","ai_wait_until","verify","assert"],Le=["js_code","function","wait","wait_for_download_complete","wait_for_page_ready","extract_email_content","extract_activation_code"];function H(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:Ne.includes(t)}function B(e){let t=e.action_data?.action_name;return!t||(t==="verify"||t==="ai_assert"||t==="assert")&&e.action_data?.kwargs?.code?!1:!Le.includes(t)}var m=new Map;function p(e,t){m.set(e,t)}function Q(e){return m.get(e)}function E(e,t,n=[]){let s=[...n];return t.locator?s.push(`locator: ${JSON.stringify(t.locator)}`):t.xpath&&s.push(`xpath: ${JSON.stringify(t.xpath)}`),t.frame_path&&t.frame_path.length>0&&s.push(`frame_path: ${JSON.stringify(t.frame_path)}`),s.length===0?[`await agent.execAction("${e}", page, {});`]:[`await agent.execAction("${e}", page, {`,...s.map(r=>` ${r},`),"});"]}p("click",e=>{let t=J(e);return t?[`await ${t}.click({ timeout: ${5e3} });`]:['await agent.execAction("click", page, {});']});p("click_element",m.get("click"));p("click_element_by_index",m.get("click"));p("double_click",e=>E("double_click",e));p("double_click_on_element",m.get("double_click"));p("right_click",e=>E("right_click",e));p("right_click_on_element",m.get("right_click"));p("hover",e=>E("hover",e));p("hover_element_by_index",m.get("hover"));p("input_text",e=>{let t=e.action_data?.kwargs?.text??e.action_data?.kwargs?.value??"";return E("input_text",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("fill",m.get("input_text"));p("clear_input",e=>E("clear_input",e));p("press",e=>{let t=e.action_data?.kwargs?.keys;return[`await page.keyboard.press(${JSON.stringify(t)});`]});p("send_keys",m.get("press"));p("send_keys_on_element",e=>{let t=J(e),n=e.action_data?.kwargs?.keys||"";return t?[`await ${t}.press(${JSON.stringify(n)}, { timeout: ${5e3} });`]:['await agent.execAction("send_keys_on_element", page, {',` action_data: { kwargs: { keys: ${JSON.stringify(n)} } },`,"});"]});p("select_dropdown_option",e=>{let t=e.action_data?.kwargs?.text||e.action_data?.kwargs?.option||"";return E("select_dropdown_option",e,[`action_data: { kwargs: { text: ${JSON.stringify(t)} } }`])});p("scroll",e=>{let t=e.action_data?.kwargs?.down??!0;return[`await page.evaluate('window.scrollBy(0, window.innerHeight * ${(e.action_data?.kwargs?.num_pages??1)*(t?1:-1)})');`]});p("scroll_down",m.get("scroll"));p("scroll_up",m.get("scroll"));p("scroll_element",m.get("scroll"));p("scroll_to_text",e=>{let t=e.action_data?.kwargs?.text||"";return[`await page.getByText(${JSON.stringify(t)}, { exact: false }).first().scrollIntoViewIfNeeded();`]});p("scroll_on_element",e=>E("scroll_on_element",e,[`action_data: { kwargs: ${JSON.stringify(e.action_data?.kwargs||{})} }`]));p("go_to_url",e=>{let t=e.action_data?.kwargs?.url||"";return e.action_data?.kwargs?.new_tab===!0?['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)}, new_tab: true } },`,"});"]:['await agent.execAction("go_to_url", page, {',` action_data: { kwargs: { url: ${JSON.stringify(t)} } },`,"});"]});p("open_tab",m.get("go_to_url"));p("go_back",()=>['await agent.execAction("go_back", page, {});']);p("reload_page",()=>['await agent.execAction("reload_page", page, {});']);p("wait",e=>[`await page.waitForTimeout(${(e.action_data?.kwargs?.seconds||1)*1e3});`]);p("wait_for_page_ready",()=>["await page.waitForLoadState('domcontentloaded');"]);p("verify",(e,t)=>{let n=e.action_data?.kwargs;if(n?.code)return n.code.split(`
|
|
4
|
+
`);let s=n?.statement||e.action_description;return s?[`await agent.assert(page, ${JSON.stringify(s)}, '${t||""}');`]:["// Skipping verify: missing statement or code"]});p("ai_assert",m.get("verify"));p("assert",m.get("verify"));p("ai_action",(e,t)=>{let n=e.action_data?.kwargs?.statement;if(!n)return["// Skipping ai_action: missing statement"];let s=JSON.stringify(n),r=e.action_data?.kwargs?.use_pure_vision;return[`await agent.execute(page, ${s}, '${t||""}', ${r});`]});p("ai_step",(e,t)=>{let n=e.action_data?.kwargs?.statement;return n?[`await agent.run(page, ${JSON.stringify(n)}, '${t||""}');`]:["// Skipping ai_step: missing statement"]});p("ai_extract",(e,t)=>{let n=e.action_data?.kwargs?.element_description,s=e.action_data?.kwargs?.variable_name;if(!n||!s)return["// Skipping ai_extract: missing element_description or variable_name"];let r=JSON.stringify(n),a=JSON.stringify(s);return[`await agent.extract(page, ${r}, ${a}, '${t||""}');`]});p("ai_wait_until",(e,t)=>{let n=e.action_data?.kwargs?.condition,s=e.action_data?.kwargs?.timeout_seconds||60;return n?[`await agent.waitUntilCondition(page, ${JSON.stringify(n)}, ${s}, '${t||""}');`]:["// Skipping ai_wait_until: missing condition"]});p("save_variable",e=>{let t=e.action_data?.kwargs?.name||"",n=e.action_data?.kwargs?.value;return['await agent.execAction("save_variable", page, {',` action_data: { kwargs: { name: ${JSON.stringify(t)}, value: ${JSON.stringify(n)} } },`,"});"]});p("js_code",e=>{let t=e.action_data?.kwargs?.code;if(!t)return["// Skipping js_code: missing code"];let n=["{"],s=t.split(`
|
|
5
|
+
`);for(let r of s)n.push(` ${r}`);return n.push("}"),n});p("function",(e,t,n)=>{let s=e.action_data?.kwargs||{},r=s.functionName;if(r&&r.includes("#")){let[i,o]=r.split("#");if(i&&o){let l=i.replace(/\.(ts|js|mjs)$/,""),c=`import { ${o} } from '${l}';`;n?.imports?.add(c);let u={...s,functionName:o},f=z(u);return f?[f.endsWith(";")?f:`${f};`]:["// Skipping function: invalid export pattern"]}}let a=z(s);return a?[a.endsWith(";")?a:`${a};`]:["// Skipping function: missing functionName"]});p("generate_2fa_code",e=>{let t=e.action_data?.kwargs?.otp_secret_key||"";return['await agent.execAction("generate_2fa_code", page, {',` action_data: { kwargs: { otp_secret_key: ${JSON.stringify(t)} } },`,"});"]});p("upload_file",e=>{let t=e.action_data?.kwargs||{},n=[],s={};return t.paths?s.paths=t.paths:t.path&&(s.path=t.path),t.use_file_input&&(s.use_file_input=!0),n.push(`action_data: { kwargs: ${JSON.stringify(s)} }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("upload_file", page, {',...n.map(r=>` ${r},`),"});"]});p("wait_for_download_complete",e=>['await agent.execAction("wait_for_download_complete", page, {',` action_data: { kwargs: { timeout_seconds: ${e.action_data?.kwargs?.timeout_seconds||10} } },`,"});"]);p("switch_tab",e=>['await agent.execAction("switch_tab", page, {',` action_data: { kwargs: { page_id: ${e.action_data?.kwargs?.page_id??0} } },`,"});"]);p("close_tab",e=>{let t=e.action_data?.kwargs?.page_id;return t=t??e.action_data?.kwargs?.index,['await agent.execAction("close_tab", page, {',` action_data: { kwargs: { page_id: ${t} } },`,"});"]});p("set_date_for_native_date_picker",e=>{let t=e.action_data?.kwargs?.date??"",n=[];return n.push(`action_data: { kwargs: { date: ${JSON.stringify(t)} } }`),e.locator?n.push(`locator: ${JSON.stringify(e.locator)}`):e.xpath&&n.push(`xpath: ${JSON.stringify(e.xpath)}`),e.frame_path&&e.frame_path.length>0&&n.push(`frame_path: ${JSON.stringify(e.frame_path)}`),['await agent.execAction("set_date_for_native_date_picker", page, {',...n.map(s=>` ${s},`),"});"]});p("done",()=>["// Done - no action needed"]);function z(e){let t=e.functionName;if(!t)return null;let n={},s=e.parameterNames||[],r=e.parameterValues||e.args||[];if(s.forEach((l,c)=>{c<r.length&&(n[l]=r[c])}),Object.keys(n).length===0)return`await ${t}()`;let a=["page","testContext","request","agentServices"],i=["undefined","null","true","false"],o=Object.entries(n).map(([l,c])=>{let u=String(c);return c==null?"undefined":a.includes(l)&&a.includes(u)||i.includes(u)||/^-?\d+(\.\d+)?$/.test(u)?u:u.startsWith("$")?`agent.agentServices.readVariable('${u.substring(1)}')`:`"${u}"`});return`await ${t}(${o.join(", ")})`}function $(e,t,n,s="main"){let r=[];for(let a=0;a<e.length;a++){let i=e[a],o=`${s}.${a}`,l=Ce(i,t,o,n);l.length>0&&(r.push(...l),a<e.length-1&&r.push(""))}return r}function Ce(e,t,n,s){let r=" ".repeat(t);switch(e.type){case"DRAFT":return Ie(e,t,n,s);case"ACTION":return je(e,t,n,s);case"STEP":return Fe(e,t,n,s);case"IF_ELSE":return Re(e,t,n,s);case"WHILE_LOOP":return Je(e,t,n,s);default:return[`${r}// Unknown statement type: ${e.type}`]}}function Ie(e,t,n,s){let r=" ".repeat(t),a=e.description?.trim()||"";if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let i=JSON.stringify(a);return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.run(page, ${i}, '${n}');`]}function je(e,t,n,s){let r=" ".repeat(t),a=e.description,i=e.uid,l=s.actionEntityStore?.entries[e.uid]?.action_entity??e.action_entity;if(!l){if(!a)return[`${r}// ${n}: Skipping - no description`];if(s.noAgent)return[`${r}// ${n}: ${d(a)}`,`${r}// DRAFT: ${d(a)} (requires agent - skipped in hook)`];let y=JSON.stringify(a),A=!!e.use_pure_vision;return[`${r}// ${n}: ${d(a)}`,`${r}// \u26A0 DRAFT: AI-resolved at runtime (~5-10s). Add a locator to make this <1s.`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.execute(page, ${y}, '${n}', ${A});`]}let c=e.locator?{...l,locator:e.locator}:l;a&&a!==c.action_description&&(c={...c,action_description:a});let u=c.action_data?.action_name||"",f=c.action_description||"",h=Q(u);if(!h)return[`${r}// ${n}: Unknown action: ${u}`];let g={imports:s.imports},_=h(c,n,g);if(s.noAgent){if(H(c))return[`${r}// ${n}: ${d(f)}`,`${r}// AI action: ${d(f)} (requires agent - skipped in hook)`];let y=He(c,u,r,n);return y||[`${r}// ${n}: ${d(f)}`,..._.map(A=>`${r}${A}`)]}if(H(c))return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,..._.map(y=>`${r}${y}`)];let T=JSON.stringify(f),b=_.map(y=>`${r} ${y}`),P=B(c),L=i?`'${i}'`:"undefined";return[`${r}// ${n}: ${d(f)}`,`${r}page = agent.agentServices.validatePage(page);`,`${r}await agent.step(page, async () => {`,...b,`${r}}, ${T}, '${n}', ${L}, ${P});`]}function Fe(e,t,n,s){let r=" ".repeat(t),a=[];e.description&&e.description.trim()&&a.push(`${r}// Step: ${d(e.description)}`);let i=$(e.statements,t,s,n);return a.push(...i),a}function Re(e,t,n,s){let r=" ".repeat(t),a=[];if(a.push(`${r}// ${n}: Conditional check`),e.condition.type==="JS_CODE")a.push(`${r}if (${e.condition.expression}) {`);else{a.push(`${r}// AI Condition: ${d(e.condition.expression)}`);let o=JSON.stringify(e.condition.expression);a.push(`${r}if (await agent.evaluate(page, ${o}, "${n}")) {`)}let i=$(e.then,t+1,s,`${n}.then`);if(a.push(...i),e.else&&e.else.length>0){a.push(`${r}} else {`);let o=$(e.else,t+1,s,`${n}.else`);a.push(...o)}return a.push(`${r}}`),a}function Je(e,t,n,s){let r=" ".repeat(t),a=[];a.push(`${r}// ${n}: Loop`);let i=e.timeout_ms??D,o=i/1e3,l=e.timeout_ms?`While loop exceeded timeout of ${o}s`:`While loop exceeded default timeout of ${o}s`,c=`loop_${n.replace(/\./g,"_")}`;if(a.push(`${r}const ${c}_start = Date.now();`),a.push(`${r}const ${c}_timeout = ${i};`),a.push(`${r}const ${c}_check = () => {`),a.push(`${r} if (Date.now() - ${c}_start > ${c}_timeout) {`),a.push(`${r} throw new Error('${l}');`),a.push(`${r} }`),a.push(`${r} return true;`),a.push(`${r}};`),e.condition.type==="JS_CODE")a.push(`${r}while (${c}_check() && (${e.condition.expression})) {`);else{a.push(`${r}// AI Loop Condition: ${d(e.condition.expression)}`);let f=JSON.stringify(e.condition.expression);a.push(`${r}while (${c}_check() && await agent.evaluate(page, ${f}, "${n}")) {`)}let u=$(e.body,t+1,s,`${n}.body`);return a.push(...u),a.push(`${r}}`),a}function He(e,t,n,s){let r=e.action_description||"",a=e.action_data?.kwargs||{};switch(t){case"go_to_url":case"open_tab":{let i=a.url||"";return[`${n}// ${s}: ${d(r)}`,`${n}await page.goto(${JSON.stringify(i)}, { waitUntil: 'domcontentloaded' });`]}case"go_back":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goBack();`];case"go_forward":return[`${n}// ${s}: ${d(r)}`,`${n}await page.goForward();`];case"input_text":{let i=a.text||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.fill(${JSON.stringify(i)}, { timeout: ${ACTION_TIMEOUT} });`]:null}case"select_dropdown_option":{let i=a.text||a.label||"",o=getPageLocatorExpression(e);return o?[`${n}// ${s}: ${d(r)}`,`${n}await ${o}.selectOption({ label: ${JSON.stringify(i)} }, { timeout: ${ACTION_TIMEOUT} });`]:null}default:return null}}var Z={name:"shiplightai",version:"0.1.13",type:"module",description:"Shiplight CLI for running and debugging .test.yaml files",main:"dist/index.js",types:"dist/index.d.ts",bin:{shiplight:"dist/cli.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/cjs/index.cjs",default:"./dist/index.js"},"./fixture":{types:"./dist/fixture.d.ts",import:"./dist/fixture.js",require:"./dist/cjs/fixture.cjs",default:"./dist/fixture.js"},"./debugger-pw":{types:"./dist/debugger-pw.d.ts",import:"./dist/debugger-pw.js",require:"./dist/cjs/debugger-pw.cjs",default:"./dist/debugger-pw.js"}},files:["dist","README.md"],publishConfig:{registry:"https://registry.npmjs.org",access:"public"},scripts:{build:"tsup","build:cli":"tsup",clean:"rm -rf dist",dev:"tsup --watch",test:"playwright test",typecheck:"tsc --noEmit"},dependencies:{"@babel/plugin-transform-typescript":"^7.27.0","@babel/preset-env":"^7.26.9","@babel/preset-typescript":"^7.27.0","@anthropic-ai/claude-agent-sdk":"^0.1.72","@modelcontextprotocol/sdk":"^0.5.0",axios:"^1.6.0",dotenv:"^16.0.3",express:"^4.21.0",glob:"^13.0.0",open:"^10.1.0",sharp:"^0.34.5",uuid:"^11.1.0",yaml:"^2.8.0",zod:"^3.22.0","zod-to-json-schema":"^3.24.6"},devDependencies:{"@playwright/test":"1.55.0","@types/express":"^4.17.21","@types/node":"^24.0.0",copilot3:"workspace:*","mcp-tools":"workspace:*","sdk-core":"workspace:*","sdk-internal":"workspace:*","shiplight-types":"workspace:*",tsup:"^8.3.5",typescript:"5.5.4","web-session":"workspace:*"},peerDependencies:{"@playwright/test":">=1.40.0"},engines:{node:">=22.0.0"},keywords:["playwright","yaml","testing","automation","ai","shiplight","mcp"],author:"Shiplight",license:"MIT"};var C=Z.version;function ne(e,t){let n=[];n.push(`// @generated by shiplightai v${C}`),n.push(...ie()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let s=new Set,r={imports:s};t?.beforeEach&&t.beforeEach.length>0&&(n.push(...ee("beforeEach",t.beforeEach,r)),n.push(""));let a=t?.timeout||t?.skip!==void 0||t?.fail!==void 0||t?.only||t?.slow?{timeout:t.timeout,skip:t.skip,fail:t.fail,only:t.only,slow:t.slow}:void 0;if(t?.parameters&&t.parameters.length>0){let i=t?.testName||e.goal||"Generated test",o=M(t?.tags);for(let l of t.parameters){let c=ae(e,l.values);n.push(...j(c,`${o}${w(i)} [${w(l.name)}]`,r,0,a)),n.push("")}}else{let i=t?.testName||e.goal||"Generated test",o=M(t?.tags);n.push(...j(e,`${o}${w(i)}`,r,0,a))}return t?.afterEach&&t.afterEach.length>0&&(n.push(""),n.push(...ee("afterEach",t.afterEach,r))),oe(n,s),n.join(`
|
|
6
|
+
`)}function re(e,t){let n=[];n.push(`// @generated by shiplightai v${C}`),n.push(...ie()),n.push(""),t?.use&&Object.keys(t.use).length>0&&(n.push(`test.use(${JSON.stringify(t.use,null,2)});`),n.push(""));let s=new Set,r={imports:s},a=t?.testName||"Test Suite",i=M(t?.tags),o=e.serial?"test.describe.serial":"test.describe";n.push(`${o}('${i}${w(a)}', () => {`),e.beforeAll&&e.beforeAll.length>0&&(n.push(...I("beforeAll",e.beforeAll,r,1)),n.push("")),e.beforeEach&&e.beforeEach.length>0&&(n.push(...I("beforeEach",e.beforeEach,r,1)),n.push(""));for(let l=0;l<e.tests.length;l++){let c=e.tests[l],u=c.timeout||c.skip!==void 0||c.fail!==void 0||c.only||c.slow?{timeout:c.timeout,skip:c.skip,fail:c.fail,only:c.only,slow:c.slow}:void 0;if(c.parameters&&c.parameters.length>0)for(let f of c.parameters){let h=ae(c.testFlow,f.values);n.push(...j(h,`${w(c.name)} [${w(f.name)}]`,r,1,u)),n.push("")}else n.push(...j(c.testFlow,w(c.name),r,1,u)),(l<e.tests.length-1||e.afterEach||e.afterAll)&&n.push("")}return e.afterEach&&e.afterEach.length>0&&(n.push(...I("afterEach",e.afterEach,r,1)),n.push("")),e.afterAll&&e.afterAll.length>0&&n.push(...I("afterAll",e.afterAll,r,1)),n.push("});"),oe(n,s),n.join(`
|
|
7
|
+
`)}function M(e){return e&&e.length>0?e.map(t=>`@${t}`).join(" ")+" ":""}function j(e,t,n,s=0,r){let a=" ".repeat(s),i=[],o=r?.only?"test.only":"test";i.push(`${a}${o}('${t}', async ({ page, agent }) => {`),r?.skip===!0?i.push(`${a} test.skip();`):typeof r?.skip=="string"&&i.push(`${a} test.skip(true, '${w(r.skip)}');`),r?.fail===!0?i.push(`${a} test.fail();`):typeof r?.fail=="string"&&i.push(`${a} test.fail(true, '${w(r.fail)}');`),r?.slow&&i.push(`${a} test.slow();`),r?.timeout&&i.push(`${a} test.setTimeout(${r.timeout});`);let l=e.teardown&&e.teardown.length>0,c=s+1;if(l){if(i.push(`${a} try {`),e.statements&&e.statements.length>0){i.push(`${a} // Test steps`);let f=$(e.statements,c+1,n);i.push(...f)}i.push(`${a} } finally {`),i.push(`${a} // Teardown`);let u=$(e.teardown,c+1,n,"teardown");i.push(...u),i.push(`${a} }`)}else if(e.statements&&e.statements.length>0){i.push(`${a} // Test steps`);let u=$(e.statements,c,n);i.push(...u)}return i.push(`${a}});`),i}function ee(e,t,n){let s=[],r=se(t);return s.push(`test.${e}(async ({ page, agent }) => {`),s.push(...$(r,1,n,e)),s.push("});"),s}function I(e,t,n,s){let r=" ".repeat(s),a=[],i=se(t);if(e==="beforeAll"||e==="afterAll"){let l={...n,noAgent:!0};a.push(`${r}test.${e}(async ({ browser }, workerInfo) => {`),a.push(`${r} const page = await browser.newPage({ baseURL: workerInfo.project.use.baseURL });`),a.push(...$(i,s+1,l,e)),a.push(`${r} await page.close();`),a.push(`${r}});`)}else a.push(`${r}test.${e}(async ({ page, agent }) => {`),a.push(...$(i,s+1,n,e)),a.push(`${r}});`);return a}function se(e){let n=te({goal:"_hook",statements:e});return N(n).statements}function ae(e,t){let n=te({goal:e.goal,statements:e.statements,teardown:e.teardown});for(let[s,r]of Object.entries(t))n=n.replaceAll(`<<${s}>>`,String(r));return N(n)}function ie(){return["import { test, expect } from 'shiplightai/fixture';"]}function oe(e,t){if(t.size>0){let n=0;for(let r=0;r<e.length;r++)e[r].startsWith("import ")&&(n=r+1);let s=Array.from(t);e.splice(n,0,...s)}}function ce(e){try{return De(e).mtimeMs}catch{return 0}}var Ve=`// @generated by shiplightai v${C}`;function Ke(e,t){if(!Ge(e)||pe(e,"utf-8").split(`
|
|
8
|
+
`,1)[0]!==Ve)return!1;let s=ce(e);for(let r of t)if(ce(r)>s)return!1;return!0}function le(e){let t=Ye("**/*.test.yaml",{cwd:e.cwd,ignore:["**/node_modules/**"]}),n=[];for(let s of t){let r=We(e.cwd,s),a=r.replace(/\.test\.yaml$/,".yaml.spec.ts"),i=pe(r,"utf-8");try{let o=K(i,r);if(Ke(a,[r,...o.referencedTemplatePaths]))continue;let l;o.suite?l=re(o.suite,{testName:o.name,tags:o.tags,use:o.use}):l=ne(o.testFlow,{testName:o.name,tags:o.tags,use:o.use,beforeEach:o.beforeEach,afterEach:o.afterEach,parameters:o.parameters,timeout:o.timeout,skip:o.skip,fail:o.fail,only:o.only,slow:o.slow}),Ue(a,l)}catch(o){console.error(`[shiplight] Failed to transpile ${s}:`,o),n.push({file:s,error:o})}}if(n.length>0)throw new Error(`[shiplight] Transpilation failed for ${n.length} file(s):
|
|
9
|
+
`+n.map(s=>` - ${s.file}`).join(`
|
|
10
|
+
`))}import*as v from"path";import*as ge from"fs";import{mkdir as Be}from"fs/promises";import*as F from"fs";import*as O from"path";function U(e){let t=null,n=process.env.SHIPLIGHT_LOGIN_EMAIL,s=process.env.SHIPLIGHT_LOGIN_PASSWORD;return n&&s&&(t={username:n,password:s}),t||(t=qe(e)),t?(process.env.SHIPLIGHT_LOGIN_URL&&(t.loginUrl=process.env.SHIPLIGHT_LOGIN_URL),process.env.SHIPLIGHT_LOGIN_TOTP_SECRET&&(t.totpSecret=process.env.SHIPLIGHT_LOGIN_TOTP_SECRET),t):null}function qe(e){let t=O.resolve(e),n=O.resolve(process.cwd());for(;;){for(let r of["shiplight.config.json","login.config.json"]){let a=O.join(t,r);if(F.existsSync(a))try{let i=JSON.parse(F.readFileSync(a,"utf-8"));if(i.username&&i.password)return{username:i.username,password:i.password,loginUrl:i.url,totpSecret:i.totp_secret}}catch{}}if(t===n)break;let s=O.dirname(t);if(s===t)break;t=s}return null}var de="auth.setup.ts",ue=".auth",fe="storage-state.json";async function ze(e,t){let n=v.resolve(t),s=v.join(n,ue,fe);if(ge.existsSync(s)){console.log("[INFO] Storage state exists, skipping login. Delete",s,"to force re-auth.");return}let r=U(n);if(!r)return;let{WebAgent:a,createAgentContext:i,configureSdk:o,VariableStore:l,LoginType:c,TwoFactorAuthType:u}=await import("./dist-OOFTSMK3.js");o({env:{GOOGLE_API_KEY:process.env.GOOGLE_API_KEY??"",ANTHROPIC_API_KEY:process.env.ANTHROPIC_API_KEY??""}});let{resolveModelFromEnv:f}=await import("./dist-WQ66EMT6.js"),h=f(process.env);if(!h)throw new Error("No AI model configured. Set WEB_AGENT_MODEL, ANTHROPIC_API_KEY, or GOOGLE_API_KEY.");let g=new a(i({model:h,variableStore:new l})),{username:_,password:T,loginUrl:b,totpSecret:P}=r,L=b||e.url()||"about:blank";if(!(await g.loginPage(e,{site_url:L,num_verification_exprs:0,account:{type:c.PASSWORD,username:_,password:T,...P&&{two_factor_auth_config:{type:u.TOTP,data:P}}}})).success)throw new Error("Login failed.");let A=v.join(n,ue);await Be(A,{recursive:!0}),await e.context().storageState({path:v.join(A,fe)})}function me(){return`// @generated by shiplightai \u2014 do not edit
|
|
11
11
|
import { test as setup } from '@playwright/test';
|
|
12
|
+
import { authSetup } from 'shiplightai';
|
|
12
13
|
|
|
13
14
|
setup('authenticate', async ({ page }) => {
|
|
14
|
-
|
|
15
|
-
await authSetup(page, __dirname);
|
|
15
|
+
await authSetup(page, import.meta.dirname);
|
|
16
16
|
});
|
|
17
|
-
`}function
|
|
17
|
+
`}function Ze(e={}){e.dotenv!==!1&&et(e.scanDir||process.cwd());let t=e.scanDir||process.cwd();return le({cwd:t}),tt(t),e.apiKey&&(process.env.__SHIPLIGHT_API_KEY=e.apiKey),{}}function et(e){let t=[],n=S.resolve(e),s=S.resolve(process.cwd());for(;;){let r=S.join(n,".env");if(x.existsSync(r)&&t.push(r),n===s)break;let a=S.dirname(n);if(a===n)break;n=a}for(let r of t)Xe.config({path:r})}function tt(e){let t=Qe("**/shiplight.config.json",{cwd:e,ignore:["**/node_modules/**"]});for(let n of t){let s=S.resolve(e,n),r=S.dirname(s),a=S.join(r,de),i=!1;try{let o=JSON.parse(x.readFileSync(s,"utf-8"));i=!!(o.username&&o.password)}catch{}if(!i&&process.env.SHIPLIGHT_LOGIN_EMAIL&&process.env.SHIPLIGHT_LOGIN_PASSWORD&&(i=!0),!!i){try{let o=x.statSync(s).mtimeMs;if(x.statSync(a).mtimeMs>o)continue}catch{}x.writeFileSync(a,me())}}}export{_e as VariableStore,$e as WebAgent,ze as authSetup,he as configureSdk,ye as createAgentContext,U as resolveLoginConfig,Ze as shiplightConfig};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import"./chunk-CSINHOOD.js";import{Router as g}from"express";function p(o){let r=g();return r.post("/api/int-runner/create-session",async(t,e)=>{try{let s=t.body.startingUrl||t.body.testFlow?.url||t.body.urlOverride,n=await o.createSession({startingUrl:s});e.json({status:"success",sessionId:n.sessionId,searchParams:""})}catch(s){console.error("[debugger] create-session error:",s),e.status(500).json({status:"error",message:s.message})}}),r.post("/api/int-runner/login",async(t,e)=>{try{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});let n=await o.executeLogin(s.sessionId);e.json(n)}catch(s){console.error("[debugger] login error:",s),e.status(500).json({status:"error",details:s.message})}}),r.post("/api/int-runner/liveview-url",async(t,e)=>{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});e.json({liveviewUrl:"",browserWsUrl:""})}),r.post("/api/int-runner/end-debug",async(t,e)=>{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});e.json({status:"success"})}),r.post("/api/int-runner/start-debug",async(t,e)=>{try{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});let n=await o.startDebug(s.sessionId);e.json({status:"success",...n})}catch(s){console.error("[debugger] start-debug error:",s),e.status(500).json({status:"error",message:s.message})}}),r.post("/api/int-runner/execute-action",async(t,e)=>{try{let{session:s,actionEntity:n,stepId:c,withSelfHealing:i,stmtUid:u,executionHistory:a}=t.body;if(!s?.sessionId||!n)return e.status(400).json({status:"error",message:"Missing session or actionEntity"});let d=await o.executeAction(s.sessionId,n,c,{withSelfHealing:i,stmtUid:u,executionHistory:a});e.json(d)}catch(s){console.error("[debugger] execute-action error:",s),e.status(500).json({status:"error",details:s.message})}}),r.post("/api/int-runner/run-step",async(t,e)=>{let{session:s,statement:n,stepId:c,executionHistory:i}=t.body;if(!s?.sessionId||!n)return e.status(400).json({success:!1,message:"Session and statement required"});e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.flushHeaders();let u=a=>{e.write(`data: ${JSON.stringify(a)}
|
|
4
|
+
|
|
5
|
+
`)};try{await o.runStep(s.sessionId,n,c,u,i)}catch(a){u({type:"error",data:{message:a.message}})}finally{e.end()}}),r.post("/api/int-runner/execute-step",async(t,e)=>{let{session:s,statement:n,stepId:c,executionHistory:i,maxSteps:u}=t.body;if(!s?.sessionId||!n)return e.status(400).json({success:!1,message:"Session and statement required"});e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.flushHeaders();let a=d=>{e.write(`data: ${JSON.stringify(d)}
|
|
6
|
+
|
|
7
|
+
`)};try{await o.runStep(s.sessionId,n,c,a,i)}catch(d){a({type:"error",data:{message:d.message}})}finally{e.end()}}),r.post("/api/int-runner/stop-run-step",async(t,e)=>{try{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});let n=o.stopRunStep(s.sessionId);e.json({status:"success",aborted:n})}catch(s){console.error("[debugger] stop-run-step error:",s),e.status(500).json({status:"error",aborted:!1,details:s.message})}}),r.post("/api/int-runner/evaluate",async(t,e)=>{try{let{session:s,statement:n,stepId:c,executionHistory:i}=t.body;if(!s?.sessionId||!n)return e.status(400).json({status:"error",message:"Missing session or statement"});let u=await o.evaluate(s.sessionId,n,i);e.json(u)}catch(s){console.error("[debugger] evaluate error:",s),e.status(500).json({status:"error",conclusion:"unknown",explanation:s.message})}}),r.post("/api/int-runner/generate-action",async(t,e)=>{try{let{session:s,statement:n,stepId:c,executionHistory:i,usePureVision:u,includeDebugInfo:a}=t.body;if(!s?.sessionId||!n)return e.status(400).json({status:"error",message:"Missing session or statement"});let d=await o.generateAction(s.sessionId,n,c,{executionHistory:i,usePureVision:u,includeDebugInfo:a});e.json(d)}catch(s){console.error("[debugger] generate-action error:",s),e.status(500).json({status:"error",details:s.message})}}),r.post("/api/int-runner/screenshot",async(t,e)=>{try{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});let n=await o.takeScreenshot(s.sessionId);e.json({status:"success",...n})}catch(s){console.error("[debugger] screenshot error:",s),e.status(500).json({status:"error",message:s.message})}}),r.post("/api/int-runner/terminate-session",async(t,e)=>{try{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"error",message:"Missing session"});await o.terminateSession(s.sessionId),e.json({status:"success",details:`Session ${s.sessionId} terminated`})}catch(s){console.error("[debugger] terminate-session error:",s),e.status(500).json({status:"error",details:s.message})}}),r.post("/api/int-runner/session-status",async(t,e)=>{let{session:s}=t.body;if(!s?.sessionId)return e.status(400).json({status:"timed_out"});e.json({status:"active",remainingSeconds:9999})}),r}export{p as createIntRunnerRouter};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import{c as F,d as U,f as V,k as Y}from"./chunk-
|
|
3
|
+
import{c as F,d as U,f as V,k as Y}from"./chunk-SGXLY5OU.js";import{b as B}from"./chunk-CSINHOOD.js";function v(u){let o=u.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);if(!o)return;let n=o[2]||o[3]||"",r=n.slice(n.lastIndexOf("\\")+1);return r=r.replace(/%22/g,'"'),r=r.replace(/&#(\d{4});/g,(E,l)=>String.fromCharCode(l)),r}async function z(u,o){if(!/multipart/i.test(o))throw new TypeError("Failed to fetch");let n=o.match(/boundary=(?:"([^"]+)"|([^;]+))/i);if(!n)throw new TypeError("no or bad content-type header, no multipart boundary");let r=new y(n[1]||n[2]),E,l,d,H,e,i,A=[],b=new U,p=s=>{d+=h.decode(s,{stream:!0})},N=s=>{A.push(s)},a=()=>{let s=new F(A,i,{type:e});b.append(H,s)},S=()=>{b.append(H,d)},h=new TextDecoder("utf-8");h.decode(),r.onPartBegin=function(){r.onPartData=p,r.onPartEnd=S,E="",l="",d="",H="",e="",i=null,A.length=0},r.onHeaderField=function(s){E+=h.decode(s,{stream:!0})},r.onHeaderValue=function(s){l+=h.decode(s,{stream:!0})},r.onHeaderEnd=function(){if(l+=h.decode(),E=E.toLowerCase(),E==="content-disposition"){let s=l.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);s&&(H=s[2]||s[3]||""),i=v(l),i&&(r.onPartData=N,r.onPartEnd=a)}else E==="content-type"&&(e=l);l="",E=""};for await(let s of u)r.write(s);return r.end(),b}var f,t,w,_,O,g,x,m,C,I,M,$,R,y,Z=B(()=>{Y();V();f=0,t={START_BOUNDARY:f++,HEADER_FIELD_START:f++,HEADER_FIELD:f++,HEADER_VALUE_START:f++,HEADER_VALUE:f++,HEADER_VALUE_ALMOST_DONE:f++,HEADERS_ALMOST_DONE:f++,PART_DATA_START:f++,PART_DATA:f++,END:f++},w=1,_={PART_BOUNDARY:w,LAST_BOUNDARY:w*=2},O=10,g=13,x=32,m=45,C=58,I=97,M=122,$=u=>u|32,R=()=>{},y=class{constructor(o){this.index=0,this.flags=0,this.onHeaderEnd=R,this.onHeaderField=R,this.onHeadersEnd=R,this.onHeaderValue=R,this.onPartBegin=R,this.onPartData=R,this.onPartEnd=R,this.boundaryChars={},o=`\r
|
|
4
4
|
--`+o;let n=new Uint8Array(o.length);for(let r=0;r<o.length;r++)n[r]=o.charCodeAt(r),this.boundaryChars[n[r]]=!0;this.boundary=n,this.lookbehind=new Uint8Array(this.boundary.length+8),this.state=t.START_BOUNDARY}write(o){let n=0,r=o.length,E=this.index,{lookbehind:l,boundary:d,boundaryChars:H,index:e,state:i,flags:A}=this,b=this.boundary.length,p=b-1,N=o.length,a,S,h=c=>{this[c+"Mark"]=n},s=c=>{delete this[c+"Mark"]},D=(c,P,T,k)=>{(P===void 0||P!==T)&&this[c](k&&k.subarray(P,T))},L=(c,P)=>{let T=c+"Mark";T in this&&(P?(D(c,this[T],n,o),delete this[T]):(D(c,this[T],o.length,o),this[T]=0))};for(n=0;n<r;n++)switch(a=o[n],i){case t.START_BOUNDARY:if(e===d.length-2){if(a===m)A|=_.LAST_BOUNDARY;else if(a!==g)return;e++;break}else if(e-1===d.length-2){if(A&_.LAST_BOUNDARY&&a===m)i=t.END,A=0;else if(!(A&_.LAST_BOUNDARY)&&a===O)e=0,D("onPartBegin"),i=t.HEADER_FIELD_START;else return;break}a!==d[e+2]&&(e=-2),a===d[e+2]&&e++;break;case t.HEADER_FIELD_START:i=t.HEADER_FIELD,h("onHeaderField"),e=0;case t.HEADER_FIELD:if(a===g){s("onHeaderField"),i=t.HEADERS_ALMOST_DONE;break}if(e++,a===m)break;if(a===C){if(e===1)return;L("onHeaderField",!0),i=t.HEADER_VALUE_START;break}if(S=$(a),S<I||S>M)return;break;case t.HEADER_VALUE_START:if(a===x)break;h("onHeaderValue"),i=t.HEADER_VALUE;case t.HEADER_VALUE:a===g&&(L("onHeaderValue",!0),D("onHeaderEnd"),i=t.HEADER_VALUE_ALMOST_DONE);break;case t.HEADER_VALUE_ALMOST_DONE:if(a!==O)return;i=t.HEADER_FIELD_START;break;case t.HEADERS_ALMOST_DONE:if(a!==O)return;D("onHeadersEnd"),i=t.PART_DATA_START;break;case t.PART_DATA_START:i=t.PART_DATA,h("onPartData");case t.PART_DATA:if(E=e,e===0){for(n+=p;n<N&&!(o[n]in H);)n+=b;n-=p,a=o[n]}if(e<d.length)d[e]===a?(e===0&&L("onPartData",!0),e++):e=0;else if(e===d.length)e++,a===g?A|=_.PART_BOUNDARY:a===m?A|=_.LAST_BOUNDARY:e=0;else if(e-1===d.length)if(A&_.PART_BOUNDARY){if(e=0,a===O){A&=~_.PART_BOUNDARY,D("onPartEnd"),D("onPartBegin"),i=t.HEADER_FIELD_START;break}}else A&_.LAST_BOUNDARY&&a===m?(D("onPartEnd"),i=t.END,A=0):e=0;if(e>0)l[e-1]=a;else if(E>0){let c=new Uint8Array(l.buffer,l.byteOffset,l.byteLength);D("onPartData",0,E,c),E=0,h("onPartData"),n--}break;case t.END:break;default:throw new Error(`Unexpected state entered: ${i}`)}L("onHeaderField"),L("onHeaderValue"),L("onPartData"),this.index=e,this.state=i,this.flags=A}end(){if(this.state===t.HEADER_FIELD_START&&this.index===0||this.state===t.PART_DATA&&this.index===this.boundary.length)this.onPartEnd();else if(this.state!==t.END)throw new Error("MultipartParser.end(): stream ended unexpectedly")}}});Z();export{z as toFormData};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import{a as j,b as Ie,c as ze,d as I,e as ae,f as fe,g as Ne,h as De,i as Me,j as We,k as Ve}from"./chunk-SGXLY5OU.js";import{b as y}from"./chunk-CSINHOOD.js";function Ge(r){if(!/^data:/i.test(r))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');r=r.replace(/\r?\n/g,"");let e=r.indexOf(",");if(e===-1||e<=4)throw new TypeError("malformed data: URI");let t=r.substring(5,e).split(";"),n="",o=!1,s=t[0]||"text/plain",i=s;for(let R=1;R<t.length;R++)t[R]==="base64"?o=!0:t[R]&&(i+=`;${t[R]}`,t[R].indexOf("charset=")===0&&(n=t[R].substring(8)));!t[0]&&!n.length&&(i+=";charset=US-ASCII",n="US-ASCII");let c=o?"base64":"ascii",l=unescape(r.substring(e+1)),a=Buffer.from(l,c);return a.type=s,a.typeFull=i,a.charset=n,a}var ce,le=y(()=>{"use strict";ce=Ge});var U,M=y(()=>{"use strict";U=class extends Error{constructor(e,t){super(e),Error.captureStackTrace(this,this.constructor),this.type=t}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}}});var p,q=y(()=>{"use strict";M();p=class extends U{constructor(e,t,n){super(e,t),n&&(this.code=this.errno=n.code,this.erroredSysCall=n.syscall)}}});var W,ee,z,ue,he,de,V=y(()=>{"use strict";W=Symbol.toStringTag,ee=r=>typeof r=="object"&&typeof r.append=="function"&&typeof r.delete=="function"&&typeof r.get=="function"&&typeof r.getAll=="function"&&typeof r.has=="function"&&typeof r.set=="function"&&typeof r.sort=="function"&&r[W]==="URLSearchParams",z=r=>r&&typeof r=="object"&&typeof r.arrayBuffer=="function"&&typeof r.type=="string"&&typeof r.stream=="function"&&typeof r.constructor=="function"&&/^(Blob|File)$/.test(r[W]),ue=r=>typeof r=="object"&&(r[W]==="AbortSignal"||r[W]==="EventTarget"),he=(r,e)=>{let t=new URL(e).hostname,n=new URL(r).hostname;return t===n||t.endsWith(`.${n}`)},de=(r,e)=>{let t=new URL(e).protocol,n=new URL(r).protocol;return t===n}});import v,{PassThrough as pe}from"node:stream";import{types as me,deprecate as te,promisify as Ke}from"node:util";import{Buffer as b}from"node:buffer";async function re(r){if(r[m].disturbed)throw new TypeError(`body used already for: ${r.url}`);if(r[m].disturbed=!0,r[m].error)throw r[m].error;let{body:e}=r;if(e===null)return b.alloc(0);if(!(e instanceof v))return b.alloc(0);let t=[],n=0;try{for await(let o of e){if(r.size>0&&n+o.length>r.size){let s=new p(`content size at ${r.url} over limit: ${r.size}`,"max-size");throw e.destroy(s),s}n+=o.length,t.push(o)}}catch(o){throw o instanceof U?o:new p(`Invalid response body while trying to fetch ${r.url}: ${o.message}`,"system",o)}if(e.readableEnded===!0||e._readableState.ended===!0)try{return t.every(o=>typeof o=="string")?b.from(t.join("")):b.concat(t,n)}catch(o){throw new p(`Could not create Buffer from response body for ${r.url}: ${o.message}`,"system",o)}else throw new p(`Premature close of server response while trying to fetch ${r.url}`)}var Ye,m,E,F,Je,G,ye,ge,K=y(()=>{"use strict";Ie();fe();q();M();V();Ye=Ke(v.pipeline),m=Symbol("Body internals"),E=class{constructor(e,{size:t=0}={}){let n=null;e===null?e=null:ee(e)?e=b.from(e.toString()):z(e)||b.isBuffer(e)||(me.isAnyArrayBuffer(e)?e=b.from(e):ArrayBuffer.isView(e)?e=b.from(e.buffer,e.byteOffset,e.byteLength):e instanceof v||(e instanceof I?(e=ae(e),n=e.type.split("=")[1]):e=b.from(String(e))));let o=e;b.isBuffer(e)?o=v.Readable.from(e):z(e)&&(o=v.Readable.from(e.stream())),this[m]={body:e,stream:o,boundary:n,disturbed:!1,error:null},this.size=t,e instanceof v&&e.on("error",s=>{let i=s instanceof U?s:new p(`Invalid response body while trying to fetch ${this.url}: ${s.message}`,"system",s);this[m].error=i})}get body(){return this[m].stream}get bodyUsed(){return this[m].disturbed}async arrayBuffer(){let{buffer:e,byteOffset:t,byteLength:n}=await re(this);return e.slice(t,t+n)}async formData(){let e=this.headers.get("content-type");if(e.startsWith("application/x-www-form-urlencoded")){let n=new I,o=new URLSearchParams(await this.text());for(let[s,i]of o)n.append(s,i);return n}let{toFormData:t}=await import("./multipart-parser-KQFLHJKK.js");return t(this.body,e)}async blob(){let e=this.headers&&this.headers.get("content-type")||this[m].body&&this[m].body.type||"",t=await this.arrayBuffer();return new j([t],{type:e})}async json(){let e=await this.text();return JSON.parse(e)}async text(){let e=await re(this);return new TextDecoder().decode(e)}buffer(){return re(this)}};E.prototype.buffer=te(E.prototype.buffer,"Please use 'response.arrayBuffer()' instead of 'response.buffer()'","node-fetch#buffer");Object.defineProperties(E.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0},data:{get:te(()=>{},"data doesn't exist, use json(), text(), arrayBuffer(), or body instead","https://github.com/node-fetch/node-fetch/issues/1000 (response)")}});F=(r,e)=>{let t,n,{body:o}=r[m];if(r.bodyUsed)throw new Error("cannot clone body after it is used");return o instanceof v&&typeof o.getBoundary!="function"&&(t=new pe({highWaterMark:e}),n=new pe({highWaterMark:e}),o.pipe(t),o.pipe(n),r[m].stream=t,o=n),o},Je=te(r=>r.getBoundary(),"form-data doesn't follow the spec and requires special treatment. Use alternative package","https://github.com/node-fetch/node-fetch/issues/1167"),G=(r,e)=>r===null?null:typeof r=="string"?"text/plain;charset=UTF-8":ee(r)?"application/x-www-form-urlencoded;charset=UTF-8":z(r)?r.type||null:b.isBuffer(r)||me.isAnyArrayBuffer(r)||ArrayBuffer.isView(r)?null:r instanceof I?`multipart/form-data; boundary=${e[m].boundary}`:r&&typeof r.getBoundary=="function"?`multipart/form-data;boundary=${Je(r)}`:r instanceof v?null:"text/plain;charset=UTF-8",ye=r=>{let{body:e}=r[m];return e===null?0:z(e)?e.size:b.isBuffer(e)?e.length:e&&typeof e.getLengthSync=="function"&&e.hasKnownLength&&e.hasKnownLength()?e.getLengthSync():null},ge=async(r,{body:e})=>{e===null?r.end():await Ye(e,r)}});import{types as we}from"node:util";import J from"node:http";function be(r=[]){return new g(r.reduce((e,t,n,o)=>(n%2===0&&e.push(o.slice(n,n+2)),e),[]).filter(([e,t])=>{try{return Y(e),oe(e,String(t)),!0}catch{return!1}}))}var Y,oe,g,_=y(()=>{"use strict";Y=typeof J.validateHeaderName=="function"?J.validateHeaderName:r=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(r)){let e=new TypeError(`Header name must be a valid HTTP token [${r}]`);throw Object.defineProperty(e,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),e}},oe=typeof J.validateHeaderValue=="function"?J.validateHeaderValue:(r,e)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(e)){let t=new TypeError(`Invalid character in header content ["${r}"]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_CHAR"}),t}},g=class r extends URLSearchParams{constructor(e){let t=[];if(e instanceof r){let n=e.raw();for(let[o,s]of Object.entries(n))t.push(...s.map(i=>[o,i]))}else if(e!=null)if(typeof e=="object"&&!we.isBoxedPrimitive(e)){let n=e[Symbol.iterator];if(n==null)t.push(...Object.entries(e));else{if(typeof n!="function")throw new TypeError("Header pairs must be iterable");t=[...e].map(o=>{if(typeof o!="object"||we.isBoxedPrimitive(o))throw new TypeError("Each header pair must be an iterable object");return[...o]}).map(o=>{if(o.length!==2)throw new TypeError("Each header pair must be a name/value tuple");return[...o]})}}else throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)");return t=t.length>0?t.map(([n,o])=>(Y(n),oe(n,String(o)),[String(n).toLowerCase(),String(o)])):void 0,super(t),new Proxy(this,{get(n,o,s){switch(o){case"append":case"set":return(i,c)=>(Y(i),oe(i,String(c)),URLSearchParams.prototype[o].call(n,String(i).toLowerCase(),String(c)));case"delete":case"has":case"getAll":return i=>(Y(i),URLSearchParams.prototype[o].call(n,String(i).toLowerCase()));case"keys":return()=>(n.sort(),new Set(URLSearchParams.prototype.keys.call(n)).keys());default:return Reflect.get(n,o,s)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(e){let t=this.getAll(e);if(t.length===0)return null;let n=t.join(", ");return/^content-encoding$/i.test(e)&&(n=n.toLowerCase()),n}forEach(e,t=void 0){for(let n of this.keys())Reflect.apply(e,t,[this.get(n),n,this])}*values(){for(let e of this.keys())yield this.get(e)}*entries(){for(let e of this.keys())yield[e,this.get(e)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce((e,t)=>(e[t]=this.getAll(t),e),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce((e,t)=>{let n=this.getAll(t);return t==="host"?e[t]=n[0]:e[t]=n.length>1?n:n[0],e},{})}};Object.defineProperties(g.prototype,["get","entries","forEach","values"].reduce((r,e)=>(r[e]={enumerable:!0},r),{}))});var _e,Z,ne=y(()=>{"use strict";_e=new Set([301,302,303,307,308]),Z=r=>_e.has(r)});var T,S,Se=y(()=>{"use strict";_();K();ne();T=Symbol("Response internals"),S=class r extends E{constructor(e=null,t={}){super(e,t);let n=t.status!=null?t.status:200,o=new g(t.headers);if(e!==null&&!o.has("Content-Type")){let s=G(e,this);s&&o.append("Content-Type",s)}this[T]={type:"default",url:t.url,status:n,statusText:t.statusText||"",headers:o,counter:t.counter,highWaterMark:t.highWaterMark}}get type(){return this[T].type}get url(){return this[T].url||""}get status(){return this[T].status}get ok(){return this[T].status>=200&&this[T].status<300}get redirected(){return this[T].counter>0}get statusText(){return this[T].statusText}get headers(){return this[T].headers}get highWaterMark(){return this[T].highWaterMark}clone(){return new r(F(this,this.highWaterMark),{type:this.type,url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size,highWaterMark:this.highWaterMark})}static redirect(e,t=302){if(!Z(t))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new r(null,{headers:{location:new URL(e).toString()},status:t})}static error(){let e=new r(null,{status:0,statusText:""});return e[T].type="error",e}static json(e=void 0,t={}){let n=JSON.stringify(e);if(n===void 0)throw new TypeError("data is not JSON serializable");let o=new g(t&&t.headers);return o.has("content-type")||o.set("content-type","application/json"),new r(n,{...t,headers:o})}get[Symbol.toStringTag](){return"Response"}};Object.defineProperties(S.prototype,{type:{enumerable:!0},url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}})});var Te,Re=y(()=>{"use strict";Te=r=>{if(r.search)return r.search;let e=r.href.length-1,t=r.hash||(r.href[e]==="#"?"#":"");return r.href[e-t.length]==="?"?"?":""}});import{isIP as Ze}from"node:net";function xe(r,e=!1){return r==null||(r=new URL(r),/^(about|blob|data):$/.test(r.protocol))?"no-referrer":(r.username="",r.password="",r.hash="",e&&(r.pathname="",r.search=""),r)}function Le(r){if(!Ee.has(r))throw new TypeError(`Invalid referrerPolicy: ${r}`);return r}function Qe(r){if(/^(http|ws)s:$/.test(r.protocol))return!0;let e=r.host.replace(/(^\[)|(]$)/g,""),t=Ze(e);return t===4&&/^127\./.test(e)||t===6&&/^(((0+:){7})|(::(0+:){0,6}))0*1$/.test(e)?!0:r.host==="localhost"||r.host.endsWith(".localhost")?!1:r.protocol==="file:"}function k(r){return/^about:(blank|srcdoc)$/.test(r)||r.protocol==="data:"||/^(blob|filesystem):$/.test(r.protocol)?!0:Qe(r)}function Ue(r,{referrerURLCallback:e,referrerOriginCallback:t}={}){if(r.referrer==="no-referrer"||r.referrerPolicy==="")return null;let n=r.referrerPolicy;if(r.referrer==="about:client")return"no-referrer";let o=r.referrer,s=xe(o),i=xe(o,!0);s.toString().length>4096&&(s=i),e&&(s=e(s)),t&&(i=t(i));let c=new URL(r.url);switch(n){case"no-referrer":return"no-referrer";case"origin":return i;case"unsafe-url":return s;case"strict-origin":return k(s)&&!k(c)?"no-referrer":i.toString();case"strict-origin-when-cross-origin":return s.origin===c.origin?s:k(s)&&!k(c)?"no-referrer":i;case"same-origin":return s.origin===c.origin?s:"no-referrer";case"origin-when-cross-origin":return s.origin===c.origin?s:i;case"no-referrer-when-downgrade":return k(s)&&!k(c)?"no-referrer":s;default:throw new TypeError(`Invalid referrerPolicy: ${n}`)}}function ve(r){let e=(r.get("referrer-policy")||"").split(/[,\s]+/),t="";for(let n of e)n&&Ee.has(n)&&(t=n);return t}var Ee,Pe,se=y(()=>{"use strict";Ee=new Set(["","no-referrer","no-referrer-when-downgrade","same-origin","origin","strict-origin","origin-when-cross-origin","strict-origin-when-cross-origin","unsafe-url"]),Pe="strict-origin-when-cross-origin"});import{format as Xe}from"node:url";import{deprecate as je}from"node:util";var u,N,qe,C,Be,Ae=y(()=>{"use strict";_();K();V();Re();se();u=Symbol("Request internals"),N=r=>typeof r=="object"&&typeof r[u]=="object",qe=je(()=>{},".data is not a valid RequestInit property, use .body instead","https://github.com/node-fetch/node-fetch/issues/1000 (request)"),C=class r extends E{constructor(e,t={}){let n;if(N(e)?n=new URL(e.url):(n=new URL(e),e={}),n.username!==""||n.password!=="")throw new TypeError(`${n} is an url with embedded credentials.`);let o=t.method||e.method||"GET";if(/^(delete|get|head|options|post|put)$/i.test(o)&&(o=o.toUpperCase()),!N(t)&&"data"in t&&qe(),(t.body!=null||N(e)&&e.body!==null)&&(o==="GET"||o==="HEAD"))throw new TypeError("Request with GET/HEAD method cannot have body");let s=t.body?t.body:N(e)&&e.body!==null?F(e):null;super(s,{size:t.size||e.size||0});let i=new g(t.headers||e.headers||{});if(s!==null&&!i.has("Content-Type")){let a=G(s,this);a&&i.set("Content-Type",a)}let c=N(e)?e.signal:null;if("signal"in t&&(c=t.signal),c!=null&&!ue(c))throw new TypeError("Expected signal to be an instanceof AbortSignal or EventTarget");let l=t.referrer==null?e.referrer:t.referrer;if(l==="")l="no-referrer";else if(l){let a=new URL(l);l=/^about:(\/\/)?client$/.test(a)?"client":a}else l=void 0;this[u]={method:o,redirect:t.redirect||e.redirect||"follow",headers:i,parsedURL:n,signal:c,referrer:l},this.follow=t.follow===void 0?e.follow===void 0?20:e.follow:t.follow,this.compress=t.compress===void 0?e.compress===void 0?!0:e.compress:t.compress,this.counter=t.counter||e.counter||0,this.agent=t.agent||e.agent,this.highWaterMark=t.highWaterMark||e.highWaterMark||16384,this.insecureHTTPParser=t.insecureHTTPParser||e.insecureHTTPParser||!1,this.referrerPolicy=t.referrerPolicy||e.referrerPolicy||""}get method(){return this[u].method}get url(){return Xe(this[u].parsedURL)}get headers(){return this[u].headers}get redirect(){return this[u].redirect}get signal(){return this[u].signal}get referrer(){if(this[u].referrer==="no-referrer")return"";if(this[u].referrer==="client")return"about:client";if(this[u].referrer)return this[u].referrer.toString()}get referrerPolicy(){return this[u].referrerPolicy}set referrerPolicy(e){this[u].referrerPolicy=Le(e)}clone(){return new r(this)}get[Symbol.toStringTag](){return"Request"}};Object.defineProperties(C.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0},referrer:{enumerable:!0},referrerPolicy:{enumerable:!0}});Be=r=>{let{parsedURL:e}=r[u],t=new g(r[u].headers);t.has("Accept")||t.set("Accept","*/*");let n=null;if(r.body===null&&/^(post|put)$/i.test(r.method)&&(n="0"),r.body!==null){let c=ye(r);typeof c=="number"&&!Number.isNaN(c)&&(n=String(c))}n&&t.set("Content-Length",n),r.referrerPolicy===""&&(r.referrerPolicy=Pe),r.referrer&&r.referrer!=="no-referrer"?r[u].referrer=Ue(r):r[u].referrer="no-referrer",r[u].referrer instanceof URL&&t.set("Referer",r.referrer),t.has("User-Agent")||t.set("User-Agent","node-fetch"),r.compress&&!t.has("Accept-Encoding")&&t.set("Accept-Encoding","gzip, deflate, br");let{agent:o}=r;typeof o=="function"&&(o=o(e));let s=Te(e),i={path:e.pathname+s,method:r.method,headers:t[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:r.insecureHTTPParser,agent:o};return{parsedURL:e,options:i}}});var Q,Ce=y(()=>{"use strict";M();Q=class extends U{constructor(e,t="aborted"){super(e,t)}}});import er from"node:http";import rr from"node:https";import O from"node:zlib";import $e,{PassThrough as Fe,pipeline as H}from"node:stream";import{Buffer as X}from"node:buffer";async function ke(r,e){return new Promise((t,n)=>{let o=new C(r,e),{parsedURL:s,options:i}=Be(o);if(!tr.has(s.protocol))throw new TypeError(`node-fetch cannot load ${r}. URL scheme "${s.protocol.replace(/:$/,"")}" is not supported.`);if(s.protocol==="data:"){let f=ce(o.url),P=new S(f,{headers:{"Content-Type":f.typeFull}});t(P);return}let c=(s.protocol==="https:"?rr:er).request,{signal:l}=o,a=null,R=()=>{let f=new Q("The operation was aborted.");n(f),o.body&&o.body instanceof $e.Readable&&o.body.destroy(f),!(!a||!a.body)&&a.body.emit("error",f)};if(l&&l.aborted){R();return}let D=()=>{R(),A()},B=c(s.toString(),i);l&&l.addEventListener("abort",D);let A=()=>{B.abort(),l&&l.removeEventListener("abort",D)};B.on("error",f=>{n(new p(`request to ${o.url} failed, reason: ${f.message}`,"system",f)),A()}),or(B,f=>{a&&a.body&&a.body.destroy(f)}),process.version<"v14"&&B.on("socket",f=>{let P;f.prependListener("end",()=>{P=f._eventsCount}),f.prependListener("close",h=>{if(a&&P<f._eventsCount&&!h){let L=new Error("Premature close");L.code="ERR_STREAM_PREMATURE_CLOSE",a.body.emit("error",L)}})}),B.on("response",f=>{B.setTimeout(0);let P=be(f.rawHeaders);if(Z(f.statusCode)){let d=P.get("Location"),x=null;try{x=d===null?null:new URL(d,o.url)}catch{if(o.redirect!=="manual"){n(new p(`uri requested responds with an invalid redirect URL: ${d}`,"invalid-redirect")),A();return}}switch(o.redirect){case"error":n(new p(`uri requested responds with a redirect, redirect mode is set to error: ${o.url}`,"no-redirect")),A();return;case"manual":break;case"follow":{if(x===null)break;if(o.counter>=o.follow){n(new p(`maximum redirect reached at: ${o.url}`,"max-redirect")),A();return}let w={headers:new g(o.headers),follow:o.follow,counter:o.counter+1,agent:o.agent,compress:o.compress,method:o.method,body:F(o),signal:o.signal,size:o.size,referrer:o.referrer,referrerPolicy:o.referrerPolicy};if(!he(o.url,x)||!de(o.url,x))for(let He of["authorization","www-authenticate","cookie","cookie2"])w.headers.delete(He);if(f.statusCode!==303&&o.body&&e.body instanceof $e.Readable){n(new p("Cannot follow redirect with body being a readable stream","unsupported-redirect")),A();return}(f.statusCode===303||(f.statusCode===301||f.statusCode===302)&&o.method==="POST")&&(w.method="GET",w.body=void 0,w.headers.delete("content-length"));let ie=ve(P);ie&&(w.referrerPolicy=ie),t(ke(new C(x,w))),A();return}default:return n(new TypeError(`Redirect option '${o.redirect}' is not a valid value of RequestRedirect`))}}l&&f.once("end",()=>{l.removeEventListener("abort",D)});let h=H(f,new Fe,d=>{d&&n(d)});process.version<"v12.10"&&f.on("aborted",D);let L={url:o.url,status:f.statusCode,statusText:f.statusMessage,headers:P,size:o.size,counter:o.counter,highWaterMark:o.highWaterMark},$=P.get("Content-Encoding");if(!o.compress||o.method==="HEAD"||$===null||f.statusCode===204||f.statusCode===304){a=new S(h,L),t(a);return}let Oe={flush:O.Z_SYNC_FLUSH,finishFlush:O.Z_SYNC_FLUSH};if($==="gzip"||$==="x-gzip"){h=H(h,O.createGunzip(Oe),d=>{d&&n(d)}),a=new S(h,L),t(a);return}if($==="deflate"||$==="x-deflate"){let d=H(f,new Fe,x=>{x&&n(x)});d.once("data",x=>{(x[0]&15)===8?h=H(h,O.createInflate(),w=>{w&&n(w)}):h=H(h,O.createInflateRaw(),w=>{w&&n(w)}),a=new S(h,L),t(a)}),d.once("end",()=>{a||(a=new S(h,L),t(a))});return}if($==="br"){h=H(h,O.createBrotliDecompress(),d=>{d&&n(d)}),a=new S(h,L),t(a);return}a=new S(h,L),t(a)}),ge(B,o).catch(n)})}function or(r,e){let t=X.from(`0\r
|
|
4
|
+
\r
|
|
5
|
+
`),n=!1,o=!1,s;r.on("response",i=>{let{headers:c}=i;n=c["transfer-encoding"]==="chunked"&&!c["content-length"]}),r.on("socket",i=>{let c=()=>{if(n&&!o){let a=new Error("Premature close");a.code="ERR_STREAM_PREMATURE_CLOSE",e(a)}},l=a=>{o=X.compare(a.slice(-5),t)===0,!o&&s&&(o=X.compare(s.slice(-3),t.slice(0,3))===0&&X.compare(a.slice(-2),t.slice(3))===0),s=a};i.prependListener("close",c),i.on("data",l),r.on("close",()=>{i.removeListener("close",c),i.removeListener("data",l)})})}var tr,nr=y(()=>{le();K();Se();_();Ae();q();Ce();ne();fe();V();se();Ve();tr=new Set(["data:","http:","https:"])});nr();export{Q as AbortError,j as Blob,p as FetchError,ze as File,I as FormData,g as Headers,C as Request,S as Response,De as blobFrom,Ne as blobFromSync,ke as default,Me as fileFrom,We as fileFromSync,Z as isRedirect};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "module";
|
|
2
2
|
const require = __createRequire(import.meta.url);
|
|
3
|
-
import{b as $,c as N,d as O,f as U,n as M}from"./chunk-
|
|
3
|
+
import{b as $,c as N,d as O,f as U,n as M}from"./chunk-VXL4KP4U.js";import"./chunk-YU3XZJIJ.js";import{m as R}from"./chunk-QU5HYOUM.js";import{h as E}from"./chunk-FL4TL6US.js";import{a as i}from"./chunk-BVOD5VWH.js";import"./chunk-FBJSHHRD.js";import"./chunk-CSINHOOD.js";import{z as b}from"zod";function _(t,o,e){let s=()=>t.stepHistory.length===0?"":`**Recent Steps**:
|
|
4
4
|
${t.stepHistory.slice(-3).map(a=>{let n=`${a.outcome.success?"\u2713":"\u2717"} Step ${a.stepNumber}: ${a.goal}`;if(a.actions.length>1)a.actions.forEach((c,l)=>{let h=c.action_description||"Unknown action";n+=`
|
|
5
5
|
\u2192 Action ${l+1}: ${h}`});else if(a.actions.length===1){let c=a.actions[0]?.action_description||"Unknown action";n+=`
|
|
6
6
|
\u2192 ${c}`}if(!a.outcome.success&&a.outcome.error){let c=a.outcome.error.substring(0,100);n+=`
|