scordi-extension 1.19.4 → 1.19.5
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/.vite/manifest.json +11 -11
- package/dist/assets/index-FDAaFujh.js +1 -0
- package/dist/assets/{index.ts-DcCeJ-J8.js → index.ts-BymPxEF7.js} +2 -2
- package/dist/assets/{main.tsx-BzpuloEf.js → main.tsx-BZwGPGRu.js} +2 -2
- package/dist/assets/{main.tsx-loader-DznXfJFu.js → main.tsx-loader-B4mfQLzp.js} +1 -1
- package/dist/assets/{types-C0mfXxOQ.js → types-DYwoIzUt.js} +6 -6
- package/dist/blocks/ThrowErrorBlock.d.ts +55 -0
- package/dist/blocks/ThrowErrorBlock.d.ts.map +1 -0
- package/dist/blocks/index.d.ts +32 -0
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/manifest.json +5 -5
- package/dist/sdk/index.cjs +14 -14
- package/dist/sdk/index.js +1650 -1614
- package/dist/service-worker-loader.js +1 -1
- package/package.json +1 -1
- package/dist/assets/index-BvGKNGub.js +0 -1
package/dist/.vite/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"../../../../../../../@crx/manifest": {
|
|
3
|
-
"file": "assets/crx-manifest.js-
|
|
3
|
+
"file": "assets/crx-manifest.js-DCbNJiLz.js",
|
|
4
4
|
"name": "crx-manifest.js",
|
|
5
5
|
"src": "../../../../../../../@crx/manifest",
|
|
6
6
|
"isEntry": true
|
|
@@ -20,40 +20,40 @@
|
|
|
20
20
|
"file": "assets/internal-messages-qAjUU64a.js",
|
|
21
21
|
"name": "internal-messages"
|
|
22
22
|
},
|
|
23
|
-
"_main.tsx-loader-
|
|
24
|
-
"file": "assets/main.tsx-loader-
|
|
25
|
-
"src": "_main.tsx-loader-
|
|
23
|
+
"_main.tsx-loader-B4mfQLzp.js": {
|
|
24
|
+
"file": "assets/main.tsx-loader-B4mfQLzp.js",
|
|
25
|
+
"src": "_main.tsx-loader-B4mfQLzp.js"
|
|
26
26
|
},
|
|
27
|
-
"_types-
|
|
28
|
-
"file": "assets/types-
|
|
27
|
+
"_types-DYwoIzUt.js": {
|
|
28
|
+
"file": "assets/types-DYwoIzUt.js",
|
|
29
29
|
"name": "types",
|
|
30
30
|
"imports": [
|
|
31
31
|
"_index-KU1_HfMi.js"
|
|
32
32
|
]
|
|
33
33
|
},
|
|
34
34
|
"src/background/index.ts": {
|
|
35
|
-
"file": "assets/index.ts-
|
|
35
|
+
"file": "assets/index.ts-BymPxEF7.js",
|
|
36
36
|
"name": "index.ts",
|
|
37
37
|
"src": "src/background/index.ts",
|
|
38
38
|
"isEntry": true,
|
|
39
39
|
"imports": [
|
|
40
40
|
"_internal-messages-qAjUU64a.js",
|
|
41
|
-
"_types-
|
|
41
|
+
"_types-DYwoIzUt.js",
|
|
42
42
|
"_index-KU1_HfMi.js"
|
|
43
43
|
]
|
|
44
44
|
},
|
|
45
45
|
"src/blocks/index.ts": {
|
|
46
|
-
"file": "assets/index-
|
|
46
|
+
"file": "assets/index-FDAaFujh.js",
|
|
47
47
|
"name": "index",
|
|
48
48
|
"src": "src/blocks/index.ts",
|
|
49
49
|
"isDynamicEntry": true,
|
|
50
50
|
"imports": [
|
|
51
|
-
"_types-
|
|
51
|
+
"_types-DYwoIzUt.js",
|
|
52
52
|
"_index-KU1_HfMi.js"
|
|
53
53
|
]
|
|
54
54
|
},
|
|
55
55
|
"src/content/main.tsx": {
|
|
56
|
-
"file": "assets/main.tsx-
|
|
56
|
+
"file": "assets/main.tsx-BZwGPGRu.js",
|
|
57
57
|
"name": "main.tsx",
|
|
58
58
|
"src": "src/content/main.tsx",
|
|
59
59
|
"isEntry": true,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{v as t,h as l,d as s,f as r,i as c,j as o,k as i,m as n,p as d,q as B,r as v,t as k,w as h,x as u,y as m,z as S,A as w,B as p,D as E,E as x,F as A,G as F,H as V,I as f,J as C,K as D,L as G,M as y,N as g,O as T,P as N,Q as P,R as W,S as J,T as K,U as L,V as M,W as j,X as U,Y as q,_ as H,$,a0 as z,a1 as I,a2 as O,a3 as Q,a4 as R,a5 as X,a6 as Y,a7 as _}from"./types-DYwoIzUt.js";import{ao as sa,au as ra,a8 as ca,ad as oa,af as ia,ag as na,aw as da,ar as Ba,ap as va,aa as ka,am as ha,a9 as ua,ab as ma,ah as Sa,at as wa,ak as pa,as as Ea,av as xa,al as Aa,an as Fa,ae as Va,ac as fa,ax as Ca,aq as Da,ai as Ga,aj as ya}from"./types-DYwoIzUt.js";import"./index-KU1_HfMi.js";class ea{static async executeBlock(e){try{switch(e.name){case"get-text":{const a=Y(e);return await _(a)}case"attribute-value":{const a=R(e);return await X(a)}case"get-value-form":{const a=O(e);return await Q(a)}case"set-value-form":{const a=z(e);return await I(a)}case"set-contenteditable":{const a=H(e);return await $(a)}case"clear-value-form":{const a=U(e);return await q(a)}case"element-exists":{const a=M(e);return await j(a)}case"event-click":{const a=K(e);return await L(a)}case"keypress":{const a=W(e);return await J(a)}case"wait":{const a=N(e);return await P(a)}case"wait-for-condition":{const a=g(e);return await T(a)}case"navigate":{const a=G(e);return await y(a)}case"save-assets":{const a=C(e);return await D(a)}case"get-element-data":{const a=V(e);return await f(a)}case"scroll":{const a=A(e);return await F(a)}case"ai-parse-data":{const a=E(e);return await x(a)}case"fetch-api":{const a=w(e);return await p(a)}case"transform-data":{const a=m(e);return await S(a)}case"export-data":{const a=h(e);return await u(a)}case"network-catch":{const a=v(e);return await k(a)}case"mark-border":{const a=d(e);return await B(a)}case"apply-locale":{const a=i(e);return await n(a)}case"paste-value":{const a=c(e);return await o(a)}case"execute-javascript":{const a=s(e);return await r(a)}case"throw-error":{const a=t(e);return await l(a)}default:return{hasError:!0,message:`Unknown block type: ${e.name}`,data:null}}}catch(a){return{hasError:!0,message:a instanceof Error?a.message:"Unknown error in block execution",data:null}}}}export{sa as AiParseDataBlockSchema,ra as ApplyLocaleBlockSchema,ca as BaseBlockSchema,ea as BlockHandler,oa as ClearValueFormsBlockSchema,ia as ElementExistsBlockSchema,na as EventClickBlockSchema,da as ExecuteJavaScriptBlockSchema,Ba as ExportDataBlockSchema,va as FetchApiBlockSchema,ka as GetAttributeValueBlockSchema,ha as GetElementDataBlockSchema,ua as GetTextBlockSchema,ma as GetValueFormsBlockSchema,Sa as KeypressBlockSchema,wa as MarkBorderBlockSchema,pa as NavigateBlockSchema,Ea as NetworkCatchBlockSchema,xa as PasteValueBlockSchema,Aa as SaveAssetsBlockSchema,Fa as ScrollBlockSchema,Va as SetContentEditableBlockSchema,fa as SetValueFormsBlockSchema,Ca as ThrowErrorBlockSchema,Da as TransformDataBlockSchema,Ga as WaitBlockSchema,ya as WaitForConditionBlockSchema};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var fb=Object.defineProperty;var pb=(r,e,t)=>e in r?fb(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var b=(r,e,t)=>pb(r,typeof e!="symbol"?e+"":e,t);import{i as mb,g as gb,h as yb,j as _b,k as wb,l as bb,m as vb}from"./internal-messages-qAjUU64a.js";import{g as Qs,Z as M,a as kn,o as Nr,s as Mn,b as Kd,n as Zd,e as va,C as Do,c as Tb,l as Eb,u as Sb}from"./types-C0mfXxOQ.js";import"./index-KU1_HfMi.js";class xb{constructor(e){b(this,"activeTabs",new Map);b(this,"closedTabs",new Set);b(this,"executingWorkflowTabs",new Map);b(this,"cdpService");b(this,"tabOrigins",new Map);b(this,"trackedChildTabs",new Map);b(this,"workspaces",new Map);this.cdpService=e,this.initializeTabClosedListener(),this.initializeTabUpdatedListener(),this.initializeTabCreatedListener()}initializeTabClosedListener(){chrome.tabs.onRemoved.addListener(async e=>{if(console.log("[TabManager] Tab closed:",e),this.activeTabs.has(e)){console.log("[TabManager] Tracked tab was closed:",e);try{await this.cdpService.stopNetworkTracking(e),console.log("[TabManager] Network tracking stopped for closed tab:",e)}catch(t){console.warn("[TabManager] Failed to stop network tracking:",t)}try{await this.cdpService.detachDebugger(e),console.log("[TabManager] Debugger detached for closed tab:",e)}catch(t){console.warn("[TabManager] Failed to detach debugger:",t)}this.cdpService.clearNetworkRequests(e),this.activeTabs.delete(e),this.closedTabs.add(e),this.executingWorkflowTabs.delete(e),this.trackedChildTabs.delete(e),setTimeout(()=>{this.closedTabs.delete(e)},6e4)}this.trackedChildTabs.has(e)&&this.trackedChildTabs.delete(e),await this.focusSiblingOrParent(e)})}initializeTabUpdatedListener(){chrome.tabs.onUpdated.addListener(async(e,t)=>{if(t.status==="complete"&&this.executingWorkflowTabs.has(e)&&!this.trackedChildTabs.has(e)){const n=this.executingWorkflowTabs.get(e);n&&(console.log("[TabManager] Page loaded in executing workflow tab, re-showing UI:",e),setTimeout(async()=>{await this.showExecutionStatus(e,n.message)},500))}if(t.status==="complete"&&this.trackedChildTabs.has(e)){const n=this.trackedChildTabs.get(e);if(n){console.log(`[TabManager] Tracked child tab loaded, showing execution status and confirmation UI. Child: ${e}, Parent: ${n}`);const s=this.executingWorkflowTabs.get(n),a=(s==null?void 0:s.message)||"워크플로우 실행 중";setTimeout(async()=>{await this.showExecutionStatus(e,a,!1),await this.showConfirmation(e,n,void 0,void 0,"top")},1e3)}}})}initializeTabCreatedListener(){chrome.tabs.onCreated.addListener(async e=>{if(!e.id)return;const t=await chrome.tabs.query({windowId:e.windowId});let n;for(const s of t)if(s.id&&s.id!==e.id&&this.executingWorkflowTabs.has(s.id)){n=s.id;break}if(n){console.log(`[TabManager] New tab created from executing workflow tab. Child: ${e.id}, Parent: ${n}`),this.trackedChildTabs.set(e.id,n),this.tabOrigins.set(e.id,n);try{await this.cdpService.attachDebugger(e.id),await this.cdpService.startNetworkTracking(e.id),this.activeTabs.set(e.id,{url:e.url||"",createdAt:Date.now()}),console.log("[TabManager] Debugger attached for new child tab:",e.id)}catch(s){console.warn("[TabManager] Failed to attach debugger to new child tab:",s)}}})}isTabClosed(e){return this.closedTabs.has(e)}async createTab(e,t=!1,n=2e3,s=!0,a){const i=await chrome.tabs.create({url:e,active:t});if(!i.id)throw new Error("Failed to create new tab");try{await this.cdpService.attachDebugger(i.id),console.log("[TabManager] Debugger attached for tab:",i.id)}catch(o){throw await chrome.tabs.remove(i.id),o}if(this.activeTabs.set(i.id,{url:e,createdAt:Date.now()}),a!==void 0&&a!==i.id&&this.tabOrigins.set(i.id,a),s)try{await this.cdpService.startNetworkTracking(i.id),console.log("[TabManager] Network tracking started for tab:",i.id)}catch(o){console.warn("[TabManager] Failed to start network tracking:",o)}return await this.waitForTabLoad(i.id),await new Promise(o=>setTimeout(o,n)),i}async closeTab(e){await this.closeTabWithoutFocus(e),await this.focusParentTab(e)}async closeTabWithoutFocus(e){try{await this.cdpService.stopNetworkTracking(e),console.log("[TabManager] Network tracking stopped before closing tab:",e)}catch(s){console.warn("[TabManager] Failed to stop network tracking:",s)}try{await this.cdpService.detachDebugger(e),console.log("[TabManager] Debugger detached before closing tab:",e)}catch(s){console.warn("[TabManager] Failed to detach debugger before closing tab:",s)}this.cdpService.clearNetworkRequests(e),await chrome.tabs.remove(e),this.activeTabs.delete(e);const t=new Set;let n=e;for(;n&&!t.has(n);){t.add(n);const s=this.tabOrigins.get(n);this.tabOrigins.delete(n),this.trackedChildTabs.delete(n),n=s}}async waitForTabLoad(e,t=1e5){return new Promise((n,s)=>{const a=setTimeout(()=>{chrome.tabs.onUpdated.removeListener(i),s(new Error("Tab load timeout"))},t),i=(o,c)=>{o===e&&c.status==="complete"&&(clearTimeout(a),chrome.tabs.onUpdated.removeListener(i),console.log("[8G TabManager] Tab loaded successfully:",e),n())};chrome.tabs.onUpdated.addListener(i)})}async showExecutionStatus(e,t,n=!0,s,a,i){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show execution status - tab was closed:",e);return}const o=t||"워크플로우 실행 중";n&&this.executingWorkflowTabs.set(e,{message:o});const c={type:"SHOW_EXECUTION_STATUS",data:{message:o,statusType:s||"loading",icon:a||"default",position:i||"bottom-right"}};try{await chrome.tabs.sendMessage(e,c),n&&await this.showConfirmation(e,void 0,"데이터를 수집하고 있습니다. 잠시만 기다려 주세요.",void 0,"top","success","shield",!1),console.log("[TabManager] Execution status shown",{tabId:e,registerAsExecuting:n,statusType:s,icon:a,position:i})}catch(u){console.warn("[TabManager] Failed to show execution status:",u)}}async hideExecutionStatus(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot hide execution status - tab was closed:",e);return}this.executingWorkflowTabs.delete(e);const t={type:"HIDE_EXECUTION_STATUS"};try{await chrome.tabs.sendMessage(e,t),console.log("[TabManager] Execution status hidden")}catch(n){console.warn("[TabManager] Failed to hide execution status:",n)}}async showConfirmation(e,t,n,s,a,i,o,c){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show confirmation - tab was closed:",e);return}const u={type:"SHOW_CONFIRMATION",data:{message:n||"로그인 완료 후 확인 버튼을 클릭해주세요.",buttonText:s,position:a||"top",variant:i||"default",icon:o||"alert",showClose:c!==void 0?c:!0,parentTabId:t}};try{await chrome.tabs.sendMessage(e,u),console.log("[TabManager] Confirmation UI shown on child tab:",{tabId:e,position:a,variant:i,icon:o,showClose:c})}catch(l){console.warn("[TabManager] Failed to show confirmation UI:",l)}}async executeBlock(e,t){return this.isTabClosed(t)?(console.log("[TabManager] Cannot execute block - tab was closed:",t),{hasError:!0,message:"Tab was closed by user",data:null}):this.executeBlockWithRetry(e,t,0)}async executeBlockWithRetry(e,t,n){return new Promise((a,i)=>{const o={isBlock:!0,type:"EXECUTE_BLOCK",data:e};chrome.tabs.sendMessage(t,o,async c=>{if(chrome.runtime.lastError){const u=chrome.runtime.lastError.message||"";if(console.log("[TabManager] Error sending message:",u),this.isTabClosed(t)){i(new Error("Tab was closed by user"));return}if((u.includes("Receiving end does not exist")||u.includes("message channel closed")||u.includes("back/forward cache"))&&n<3){console.log(`[TabManager] Page transition detected, waiting for reload and retrying (${n+1}/3)...`);try{await this.waitForTabLoad(t,1e4),await new Promise(h=>setTimeout(h,1e3));const d=await this.executeBlockWithRetry(e,t,n+1);a(d)}catch{i(new Error("Page load timeout after transition"))}}else i(new Error(u||"Communication error"))}else mb(c)?(console.log("[TabManager] Content script error:",c.message),i(new Error(c.message))):(console.log("[TabManager] Received response from content script"),a(c||{data:null}))})})}findRootParentTab(e){const t=new Set;let n=e;for(;n;){if(t.has(n)){console.warn(`[TabManager] Circular reference detected in tab origins: ${n}`);return}t.add(n);const s=this.tabOrigins.get(n);if(!s)return n===e?void 0:n;n=s}}findAnyExecutingTab(e){for(const t of this.executingWorkflowTabs.keys())if(t!==e&&!this.closedTabs.has(t))return t}findRecentlyCreatedSiblingTab(e){const t=this.tabOrigins.get(e);if(t){for(const[n,s]of this.tabOrigins.entries())if(s===t&&n!==e&&!this.closedTabs.has(n)&&this.activeTabs.has(n)&&!this.executingWorkflowTabs.has(n))return n}}async focusSiblingOrParent(e){const t=this.tabOrigins.get(e),n=this.findAnyExecutingTab(e),s=this.findRecentlyCreatedSiblingTab(e);this.tabOrigins.delete(e),this.trackedChildTabs.delete(e);try{const a=await chrome.tabs.query({active:!0});for(const i of a)if(i.id&&i.id!==e&&this.executingWorkflowTabs.has(i.id)){console.log(`[TabManager] Skipping focus change - already active executing tab ${i.id} exists`);return}}catch(a){console.warn("[TabManager] Failed to check active tabs:",a)}if(s&&!n){console.log(`[TabManager] Found recently created sibling tab ${s}, waiting for workflow to start...`),setTimeout(async()=>{try{const i=await chrome.tabs.get(s);if(i){if(i.active){console.log(`[TabManager] Skipping focus change after delay - recently created sibling tab ${s} is still active`);return}if(this.executingWorkflowTabs.has(s)){if(console.log(`[TabManager] Found executing sibling tab ${s} after delay, focusing it`),!i.active&&(await chrome.tabs.update(s,{active:!0}),typeof i.windowId=="number"))try{await chrome.windows.update(i.windowId,{focused:!0})}catch(o){console.warn("[TabManager] Failed to focus sibling tab window:",o)}return}}}catch(i){console.warn("[TabManager] Failed to check sibling tab after delay:",i)}try{const i=await chrome.tabs.query({active:!0});for(const o of i)if(o.id&&o.id!==e&&this.executingWorkflowTabs.has(o.id)){console.log(`[TabManager] Skipping focus change after delay - active tab ${o.id} is executing`);return}}catch(i){console.warn("[TabManager] Failed to check active tabs after delay:",i)}const a=this.findAnyExecutingTab(e);if(a)try{const i=await chrome.tabs.get(a);if(i&&!i.active){if(await chrome.tabs.update(a,{active:!0}),typeof i.windowId=="number")try{await chrome.windows.update(i.windowId,{focused:!0})}catch(o){console.warn("[TabManager] Failed to focus executing tab window:",o)}console.log(`[TabManager] Focused executing tab ${a} after delay`);return}}catch(i){console.warn("[TabManager] Failed to focus executing tab after delay:",i)}t&&await this.focusParentTabById(t,e)},1e3);return}if(n)try{const a=await chrome.tabs.get(n);if(!a){console.log(`[TabManager] Executing tab ${n} not found`),t&&await this.focusParentTabById(t,e);return}if(a.active){console.log(`[TabManager] Skipping focus change - executing tab ${n} is already active`);return}if(await chrome.tabs.update(n,{active:!0}),typeof a.windowId=="number")try{await chrome.windows.update(a.windowId,{focused:!0})}catch(i){console.warn("[TabManager] Failed to focus executing tab window:",i)}console.log(`[TabManager] Focused executing tab ${n} after closing tab ${e}`);return}catch(a){console.warn(`[TabManager] Failed to focus executing tab ${n} after closing tab ${e}:`,a),t&&await this.focusParentTabById(t,e);return}t&&await this.focusParentTabById(t,e)}async focusParentTab(e){const t=this.tabOrigins.get(e);if(!t){console.log(`[TabManager] No direct parent tab found for tab ${e}`);return}await this.focusParentTabById(t,e)}async focusParentTabById(e,t){try{const n=await chrome.tabs.get(e);if(!n){console.log(`[TabManager] Direct parent tab ${e} not found`);return}if(await chrome.tabs.update(e,{active:!0}),typeof n.windowId=="number")try{await chrome.windows.update(n.windowId,{focused:!0})}catch(s){console.warn("[TabManager] Failed to focus parent window:",s)}console.log(`[TabManager] Focused direct parent tab ${e} after closing child tab ${t}`)}catch(n){console.warn(`[TabManager] Failed to focus direct parent tab ${e} after closing child tab ${t}:`,n)}}getDirectParentTabId(e){return this.tabOrigins.get(e)}isExecutingWorkflow(e){return this.executingWorkflowTabs.has(e)}isTrackedChildTab(e){return this.trackedChildTabs.has(e)}getRootParentTabId(e){return this.findRootParentTab(e)}async showSideModal(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show side modal - tab was closed:",e);return}const t=this.workspaces.get(e)||[];console.log("[TabManager] Showing side modal with workspaces:",t);try{await chrome.tabs.sendMessage(e,{type:"SHOW_SIDE_MODAL",data:{workspaces:t}}),console.log("[TabManager] Side modal shown for tab:",e)}catch(n){console.warn("[TabManager] Failed to show side modal:",n)}}async hideSideModal(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot hide side modal - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"HIDE_SIDE_MODAL"}),console.log("[TabManager] Side modal hidden for tab:",e)}catch(t){console.warn("[TabManager] Failed to hide side modal:",t)}}async openSideModal(e){await this.showSideModal(e)}async closeSideModal(e){await this.hideSideModal(e)}async setWorkspaces(e,t){if(console.log("[TabManager] Setting workspaces for tab:",e,t),this.workspaces.set(e,t),!this.isTabClosed(e))try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_WORKSPACES",data:{workspaces:t}}),console.log("[TabManager] Sent workspaces to tab:",e)}catch(n){console.warn(`[TabManager] Failed to update workspaces for tab ${e}:`,n)}}async updateSideModalSiteInfo(e,t,n){if(this.isTabClosed(e)){console.log("[TabManager] Cannot update site info - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_SITE_INFO",data:{siteName:t,favicon:n}}),console.log("[TabManager] Site info updated for tab:",e)}catch(s){console.warn("[TabManager] Failed to update site info:",s)}}async setSideModalLoginStatus(e,t){if(this.isTabClosed(e)){console.log("[TabManager] Cannot set login status - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_LOGIN_STATUS",data:{isLoggedIn:t}}),console.log("[TabManager] Login status updated for tab:",e)}catch(n){console.warn("[TabManager] Failed to update login status:",n)}}async isSideModalOpen(e){if(this.isTabClosed(e))return!1;try{const t=await chrome.tabs.sendMessage(e,{type:"GET_SIDE_MODAL_STATUS"});return(t==null?void 0:t.isOpen)||!1}catch(t){return console.warn("[TabManager] Failed to get side modal status:",t),!1}}async getSideModalData(e){const t=this.workspaces.get(e)||[];return console.log("[TabManager] Getting side modal data for tab:",e,t),{workspaces:t}}async reloadTab(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot reload tab - tab was closed:",e);return}try{await chrome.tabs.reload(e),console.log("[TabManager] Tab reloaded:",e)}catch(t){console.warn("[TabManager] Failed to reload tab:",t)}}findExecutingWorkflowTab(e){const t=new Set;let n=e;for(;n;){if(t.has(n))return;if(t.add(n),this.executingWorkflowTabs.has(n))return n;n=this.tabOrigins.get(n)}}getIntermediateTabs(e){const t=[],n=this.findRootParentTab(e);if(!n||n===e)return t;const s=new Set;let a=e;for(;a&&a!==n&&!s.has(a);){s.add(a);const i=this.tabOrigins.get(a);if(!i||i===n)break;this.executingWorkflowTabs.has(i)||t.push(i),a=i}return t}getNetworkRequests(e){return this.cdpService.getNetworkRequests(e)}async startNetworkTracking(e){await this.cdpService.startNetworkTracking(e)}async stopNetworkTracking(e){await this.cdpService.stopNetworkTracking(e)}}function Ta(r,e){return r.lc_error_code=e,r.message=`${r.message}
|
|
1
|
+
var fb=Object.defineProperty;var pb=(r,e,t)=>e in r?fb(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var b=(r,e,t)=>pb(r,typeof e!="symbol"?e+"":e,t);import{i as mb,g as gb,h as yb,j as _b,k as wb,l as bb,m as vb}from"./internal-messages-qAjUU64a.js";import{g as Qs,Z as M,a as kn,o as Nr,s as Mn,b as Kd,n as Zd,e as va,C as Do,c as Tb,l as Eb,u as Sb}from"./types-DYwoIzUt.js";import"./index-KU1_HfMi.js";class xb{constructor(e){b(this,"activeTabs",new Map);b(this,"closedTabs",new Set);b(this,"executingWorkflowTabs",new Map);b(this,"cdpService");b(this,"tabOrigins",new Map);b(this,"trackedChildTabs",new Map);b(this,"workspaces",new Map);this.cdpService=e,this.initializeTabClosedListener(),this.initializeTabUpdatedListener(),this.initializeTabCreatedListener()}initializeTabClosedListener(){chrome.tabs.onRemoved.addListener(async e=>{if(console.log("[TabManager] Tab closed:",e),this.activeTabs.has(e)){console.log("[TabManager] Tracked tab was closed:",e);try{await this.cdpService.stopNetworkTracking(e),console.log("[TabManager] Network tracking stopped for closed tab:",e)}catch(t){console.warn("[TabManager] Failed to stop network tracking:",t)}try{await this.cdpService.detachDebugger(e),console.log("[TabManager] Debugger detached for closed tab:",e)}catch(t){console.warn("[TabManager] Failed to detach debugger:",t)}this.cdpService.clearNetworkRequests(e),this.activeTabs.delete(e),this.closedTabs.add(e),this.executingWorkflowTabs.delete(e),this.trackedChildTabs.delete(e),setTimeout(()=>{this.closedTabs.delete(e)},6e4)}this.trackedChildTabs.has(e)&&this.trackedChildTabs.delete(e),await this.focusSiblingOrParent(e)})}initializeTabUpdatedListener(){chrome.tabs.onUpdated.addListener(async(e,t)=>{if(t.status==="complete"&&this.executingWorkflowTabs.has(e)&&!this.trackedChildTabs.has(e)){const n=this.executingWorkflowTabs.get(e);n&&(console.log("[TabManager] Page loaded in executing workflow tab, re-showing UI:",e),setTimeout(async()=>{await this.showExecutionStatus(e,n.message)},500))}if(t.status==="complete"&&this.trackedChildTabs.has(e)){const n=this.trackedChildTabs.get(e);if(n){console.log(`[TabManager] Tracked child tab loaded, showing execution status and confirmation UI. Child: ${e}, Parent: ${n}`);const s=this.executingWorkflowTabs.get(n),a=(s==null?void 0:s.message)||"워크플로우 실행 중";setTimeout(async()=>{await this.showExecutionStatus(e,a,!1),await this.showConfirmation(e,n,void 0,void 0,"top")},1e3)}}})}initializeTabCreatedListener(){chrome.tabs.onCreated.addListener(async e=>{if(!e.id)return;const t=await chrome.tabs.query({windowId:e.windowId});let n;for(const s of t)if(s.id&&s.id!==e.id&&this.executingWorkflowTabs.has(s.id)){n=s.id;break}if(n){console.log(`[TabManager] New tab created from executing workflow tab. Child: ${e.id}, Parent: ${n}`),this.trackedChildTabs.set(e.id,n),this.tabOrigins.set(e.id,n);try{await this.cdpService.attachDebugger(e.id),await this.cdpService.startNetworkTracking(e.id),this.activeTabs.set(e.id,{url:e.url||"",createdAt:Date.now()}),console.log("[TabManager] Debugger attached for new child tab:",e.id)}catch(s){console.warn("[TabManager] Failed to attach debugger to new child tab:",s)}}})}isTabClosed(e){return this.closedTabs.has(e)}async createTab(e,t=!1,n=2e3,s=!0,a){const i=await chrome.tabs.create({url:e,active:t});if(!i.id)throw new Error("Failed to create new tab");try{await this.cdpService.attachDebugger(i.id),console.log("[TabManager] Debugger attached for tab:",i.id)}catch(o){throw await chrome.tabs.remove(i.id),o}if(this.activeTabs.set(i.id,{url:e,createdAt:Date.now()}),a!==void 0&&a!==i.id&&this.tabOrigins.set(i.id,a),s)try{await this.cdpService.startNetworkTracking(i.id),console.log("[TabManager] Network tracking started for tab:",i.id)}catch(o){console.warn("[TabManager] Failed to start network tracking:",o)}return await this.waitForTabLoad(i.id),await new Promise(o=>setTimeout(o,n)),i}async closeTab(e){await this.closeTabWithoutFocus(e),await this.focusParentTab(e)}async closeTabWithoutFocus(e){try{await this.cdpService.stopNetworkTracking(e),console.log("[TabManager] Network tracking stopped before closing tab:",e)}catch(s){console.warn("[TabManager] Failed to stop network tracking:",s)}try{await this.cdpService.detachDebugger(e),console.log("[TabManager] Debugger detached before closing tab:",e)}catch(s){console.warn("[TabManager] Failed to detach debugger before closing tab:",s)}this.cdpService.clearNetworkRequests(e),await chrome.tabs.remove(e),this.activeTabs.delete(e);const t=new Set;let n=e;for(;n&&!t.has(n);){t.add(n);const s=this.tabOrigins.get(n);this.tabOrigins.delete(n),this.trackedChildTabs.delete(n),n=s}}async waitForTabLoad(e,t=1e5){return new Promise((n,s)=>{const a=setTimeout(()=>{chrome.tabs.onUpdated.removeListener(i),s(new Error("Tab load timeout"))},t),i=(o,c)=>{o===e&&c.status==="complete"&&(clearTimeout(a),chrome.tabs.onUpdated.removeListener(i),console.log("[8G TabManager] Tab loaded successfully:",e),n())};chrome.tabs.onUpdated.addListener(i)})}async showExecutionStatus(e,t,n=!0,s,a,i){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show execution status - tab was closed:",e);return}const o=t||"워크플로우 실행 중";n&&this.executingWorkflowTabs.set(e,{message:o});const c={type:"SHOW_EXECUTION_STATUS",data:{message:o,statusType:s||"loading",icon:a||"default",position:i||"bottom-right"}};try{await chrome.tabs.sendMessage(e,c),n&&await this.showConfirmation(e,void 0,"데이터를 수집하고 있습니다. 잠시만 기다려 주세요.",void 0,"top","success","shield",!1),console.log("[TabManager] Execution status shown",{tabId:e,registerAsExecuting:n,statusType:s,icon:a,position:i})}catch(u){console.warn("[TabManager] Failed to show execution status:",u)}}async hideExecutionStatus(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot hide execution status - tab was closed:",e);return}this.executingWorkflowTabs.delete(e);const t={type:"HIDE_EXECUTION_STATUS"};try{await chrome.tabs.sendMessage(e,t),console.log("[TabManager] Execution status hidden")}catch(n){console.warn("[TabManager] Failed to hide execution status:",n)}}async showConfirmation(e,t,n,s,a,i,o,c){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show confirmation - tab was closed:",e);return}const u={type:"SHOW_CONFIRMATION",data:{message:n||"로그인 완료 후 확인 버튼을 클릭해주세요.",buttonText:s,position:a||"top",variant:i||"default",icon:o||"alert",showClose:c!==void 0?c:!0,parentTabId:t}};try{await chrome.tabs.sendMessage(e,u),console.log("[TabManager] Confirmation UI shown on child tab:",{tabId:e,position:a,variant:i,icon:o,showClose:c})}catch(l){console.warn("[TabManager] Failed to show confirmation UI:",l)}}async executeBlock(e,t){return this.isTabClosed(t)?(console.log("[TabManager] Cannot execute block - tab was closed:",t),{hasError:!0,message:"Tab was closed by user",data:null}):this.executeBlockWithRetry(e,t,0)}async executeBlockWithRetry(e,t,n){return new Promise((a,i)=>{const o={isBlock:!0,type:"EXECUTE_BLOCK",data:e};chrome.tabs.sendMessage(t,o,async c=>{if(chrome.runtime.lastError){const u=chrome.runtime.lastError.message||"";if(console.log("[TabManager] Error sending message:",u),this.isTabClosed(t)){i(new Error("Tab was closed by user"));return}if((u.includes("Receiving end does not exist")||u.includes("message channel closed")||u.includes("back/forward cache"))&&n<3){console.log(`[TabManager] Page transition detected, waiting for reload and retrying (${n+1}/3)...`);try{await this.waitForTabLoad(t,1e4),await new Promise(h=>setTimeout(h,1e3));const d=await this.executeBlockWithRetry(e,t,n+1);a(d)}catch{i(new Error("Page load timeout after transition"))}}else i(new Error(u||"Communication error"))}else mb(c)?(console.log("[TabManager] Content script error:",c.message),i(new Error(c.message))):(console.log("[TabManager] Received response from content script"),a(c||{data:null}))})})}findRootParentTab(e){const t=new Set;let n=e;for(;n;){if(t.has(n)){console.warn(`[TabManager] Circular reference detected in tab origins: ${n}`);return}t.add(n);const s=this.tabOrigins.get(n);if(!s)return n===e?void 0:n;n=s}}findAnyExecutingTab(e){for(const t of this.executingWorkflowTabs.keys())if(t!==e&&!this.closedTabs.has(t))return t}findRecentlyCreatedSiblingTab(e){const t=this.tabOrigins.get(e);if(t){for(const[n,s]of this.tabOrigins.entries())if(s===t&&n!==e&&!this.closedTabs.has(n)&&this.activeTabs.has(n)&&!this.executingWorkflowTabs.has(n))return n}}async focusSiblingOrParent(e){const t=this.tabOrigins.get(e),n=this.findAnyExecutingTab(e),s=this.findRecentlyCreatedSiblingTab(e);this.tabOrigins.delete(e),this.trackedChildTabs.delete(e);try{const a=await chrome.tabs.query({active:!0});for(const i of a)if(i.id&&i.id!==e&&this.executingWorkflowTabs.has(i.id)){console.log(`[TabManager] Skipping focus change - already active executing tab ${i.id} exists`);return}}catch(a){console.warn("[TabManager] Failed to check active tabs:",a)}if(s&&!n){console.log(`[TabManager] Found recently created sibling tab ${s}, waiting for workflow to start...`),setTimeout(async()=>{try{const i=await chrome.tabs.get(s);if(i){if(i.active){console.log(`[TabManager] Skipping focus change after delay - recently created sibling tab ${s} is still active`);return}if(this.executingWorkflowTabs.has(s)){if(console.log(`[TabManager] Found executing sibling tab ${s} after delay, focusing it`),!i.active&&(await chrome.tabs.update(s,{active:!0}),typeof i.windowId=="number"))try{await chrome.windows.update(i.windowId,{focused:!0})}catch(o){console.warn("[TabManager] Failed to focus sibling tab window:",o)}return}}}catch(i){console.warn("[TabManager] Failed to check sibling tab after delay:",i)}try{const i=await chrome.tabs.query({active:!0});for(const o of i)if(o.id&&o.id!==e&&this.executingWorkflowTabs.has(o.id)){console.log(`[TabManager] Skipping focus change after delay - active tab ${o.id} is executing`);return}}catch(i){console.warn("[TabManager] Failed to check active tabs after delay:",i)}const a=this.findAnyExecutingTab(e);if(a)try{const i=await chrome.tabs.get(a);if(i&&!i.active){if(await chrome.tabs.update(a,{active:!0}),typeof i.windowId=="number")try{await chrome.windows.update(i.windowId,{focused:!0})}catch(o){console.warn("[TabManager] Failed to focus executing tab window:",o)}console.log(`[TabManager] Focused executing tab ${a} after delay`);return}}catch(i){console.warn("[TabManager] Failed to focus executing tab after delay:",i)}t&&await this.focusParentTabById(t,e)},1e3);return}if(n)try{const a=await chrome.tabs.get(n);if(!a){console.log(`[TabManager] Executing tab ${n} not found`),t&&await this.focusParentTabById(t,e);return}if(a.active){console.log(`[TabManager] Skipping focus change - executing tab ${n} is already active`);return}if(await chrome.tabs.update(n,{active:!0}),typeof a.windowId=="number")try{await chrome.windows.update(a.windowId,{focused:!0})}catch(i){console.warn("[TabManager] Failed to focus executing tab window:",i)}console.log(`[TabManager] Focused executing tab ${n} after closing tab ${e}`);return}catch(a){console.warn(`[TabManager] Failed to focus executing tab ${n} after closing tab ${e}:`,a),t&&await this.focusParentTabById(t,e);return}t&&await this.focusParentTabById(t,e)}async focusParentTab(e){const t=this.tabOrigins.get(e);if(!t){console.log(`[TabManager] No direct parent tab found for tab ${e}`);return}await this.focusParentTabById(t,e)}async focusParentTabById(e,t){try{const n=await chrome.tabs.get(e);if(!n){console.log(`[TabManager] Direct parent tab ${e} not found`);return}if(await chrome.tabs.update(e,{active:!0}),typeof n.windowId=="number")try{await chrome.windows.update(n.windowId,{focused:!0})}catch(s){console.warn("[TabManager] Failed to focus parent window:",s)}console.log(`[TabManager] Focused direct parent tab ${e} after closing child tab ${t}`)}catch(n){console.warn(`[TabManager] Failed to focus direct parent tab ${e} after closing child tab ${t}:`,n)}}getDirectParentTabId(e){return this.tabOrigins.get(e)}isExecutingWorkflow(e){return this.executingWorkflowTabs.has(e)}isTrackedChildTab(e){return this.trackedChildTabs.has(e)}getRootParentTabId(e){return this.findRootParentTab(e)}async showSideModal(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot show side modal - tab was closed:",e);return}const t=this.workspaces.get(e)||[];console.log("[TabManager] Showing side modal with workspaces:",t);try{await chrome.tabs.sendMessage(e,{type:"SHOW_SIDE_MODAL",data:{workspaces:t}}),console.log("[TabManager] Side modal shown for tab:",e)}catch(n){console.warn("[TabManager] Failed to show side modal:",n)}}async hideSideModal(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot hide side modal - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"HIDE_SIDE_MODAL"}),console.log("[TabManager] Side modal hidden for tab:",e)}catch(t){console.warn("[TabManager] Failed to hide side modal:",t)}}async openSideModal(e){await this.showSideModal(e)}async closeSideModal(e){await this.hideSideModal(e)}async setWorkspaces(e,t){if(console.log("[TabManager] Setting workspaces for tab:",e,t),this.workspaces.set(e,t),!this.isTabClosed(e))try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_WORKSPACES",data:{workspaces:t}}),console.log("[TabManager] Sent workspaces to tab:",e)}catch(n){console.warn(`[TabManager] Failed to update workspaces for tab ${e}:`,n)}}async updateSideModalSiteInfo(e,t,n){if(this.isTabClosed(e)){console.log("[TabManager] Cannot update site info - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_SITE_INFO",data:{siteName:t,favicon:n}}),console.log("[TabManager] Site info updated for tab:",e)}catch(s){console.warn("[TabManager] Failed to update site info:",s)}}async setSideModalLoginStatus(e,t){if(this.isTabClosed(e)){console.log("[TabManager] Cannot set login status - tab was closed:",e);return}try{await chrome.tabs.sendMessage(e,{type:"UPDATE_SIDE_MODAL_LOGIN_STATUS",data:{isLoggedIn:t}}),console.log("[TabManager] Login status updated for tab:",e)}catch(n){console.warn("[TabManager] Failed to update login status:",n)}}async isSideModalOpen(e){if(this.isTabClosed(e))return!1;try{const t=await chrome.tabs.sendMessage(e,{type:"GET_SIDE_MODAL_STATUS"});return(t==null?void 0:t.isOpen)||!1}catch(t){return console.warn("[TabManager] Failed to get side modal status:",t),!1}}async getSideModalData(e){const t=this.workspaces.get(e)||[];return console.log("[TabManager] Getting side modal data for tab:",e,t),{workspaces:t}}async reloadTab(e){if(this.isTabClosed(e)){console.log("[TabManager] Cannot reload tab - tab was closed:",e);return}try{await chrome.tabs.reload(e),console.log("[TabManager] Tab reloaded:",e)}catch(t){console.warn("[TabManager] Failed to reload tab:",t)}}findExecutingWorkflowTab(e){const t=new Set;let n=e;for(;n;){if(t.has(n))return;if(t.add(n),this.executingWorkflowTabs.has(n))return n;n=this.tabOrigins.get(n)}}getIntermediateTabs(e){const t=[],n=this.findRootParentTab(e);if(!n||n===e)return t;const s=new Set;let a=e;for(;a&&a!==n&&!s.has(a);){s.add(a);const i=this.tabOrigins.get(a);if(!i||i===n)break;this.executingWorkflowTabs.has(i)||t.push(i),a=i}return t}getNetworkRequests(e){return this.cdpService.getNetworkRequests(e)}async startNetworkTracking(e){await this.cdpService.startNetworkTracking(e)}async stopNetworkTracking(e){await this.cdpService.stopNetworkTracking(e)}}function Ta(r,e){return r.lc_error_code=e,r.message=`${r.message}
|
|
2
2
|
|
|
3
3
|
Troubleshooting URL: https://docs.langchain.com/oss/javascript/langchain/errors/${e}/
|
|
4
4
|
`,r}function te(r,e,t,n,s){if(typeof e=="function"?r!==e||!0:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(r,t),t}function O(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)}let km=function(){const{crypto:r}=globalThis;if(r!=null&&r.randomUUID)return km=r.randomUUID.bind(r),r.randomUUID();const e=new Uint8Array(1),t=r?()=>r.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,n=>(+n^t()&15>>+n/4).toString(16))};function Cu(r){return typeof r=="object"&&r!==null&&("name"in r&&r.name==="AbortError"||"message"in r&&String(r.message).includes("FetchRequestCanceledException"))}const Ru=r=>{if(r instanceof Error)return r;if(typeof r=="object"&&r!==null){try{if(Object.prototype.toString.call(r)==="[object Error]"){const e=new Error(r.message,r.cause?{cause:r.cause}:{});return r.stack&&(e.stack=r.stack),r.cause&&!e.cause&&(e.cause=r.cause),r.name&&(e.name=r.name),e}}catch{}try{return new Error(JSON.stringify(r))}catch{}}return new Error(r)};class Y extends Error{}let mt=class $u extends Y{constructor(e,t,n,s){super(`${$u.makeMessage(e,t,n)}`),this.status=e,this.headers=s,this.requestID=s==null?void 0:s.get("x-request-id"),this.error=t;const a=t;this.code=a==null?void 0:a.code,this.param=a==null?void 0:a.param,this.type=a==null?void 0:a.type}static makeMessage(e,t,n){const s=t!=null&&t.message?typeof t.message=="string"?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&s?`${e} ${s}`:e?`${e} status code (no body)`:s||"(no status code or body)"}static generate(e,t,n,s){if(!e||!s)return new to({message:n,cause:Ru(t)});const a=t==null?void 0:t.error;return e===400?new Am(e,a,n,s):e===401?new Cm(e,a,n,s):e===403?new Rm(e,a,n,s):e===404?new $m(e,a,n,s):e===409?new Pm(e,a,n,s):e===422?new Nm(e,a,n,s):e===429?new Mm(e,a,n,s):e>=500?new Lm(e,a,n,s):new $u(e,a,n,s)}},St=class extends mt{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},to=class extends mt{constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0),t&&(this.cause=t)}},ro=class extends to{constructor({message:e}={}){super({message:e??"Request timed out."})}},Am=class extends mt{},Cm=class extends mt{},Rm=class extends mt{},$m=class extends mt{},Pm=class extends mt{},Nm=class extends mt{},Mm=class extends mt{},Lm=class extends mt{};class jm extends Y{constructor(){super("Could not parse response content as the length limit was reached")}}class Fm extends Y{constructor(){super("Could not parse response content as the request was rejected by the content filter")}}class gs extends Error{constructor(e){super(e)}}const Ib=/^[a-z][a-z0-9+.-]*:/i,Ob=r=>Ib.test(r);let lt=r=>(lt=Array.isArray,lt(r)),Xd=lt;function Um(r){return typeof r!="object"?{}:r??{}}function kb(r){if(!r)return!0;for(const e in r)return!1;return!0}function Ab(r,e){return Object.prototype.hasOwnProperty.call(r,e)}function Bo(r){return r!=null&&typeof r=="object"&&!Array.isArray(r)}const Cb=(r,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new Y(`${r} must be an integer`);if(e<0)throw new Y(`${r} must be a positive integer`);return e},Rb=r=>{try{return JSON.parse(r)}catch{return}},ea=r=>new Promise(e=>setTimeout(e,r)),Tn="6.9.1",$b=()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u";function Pb(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}const Nb=()=>{var t;const r=Pb();if(r==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Tn,"X-Stainless-OS":Qd(Deno.build.os),"X-Stainless-Arch":Yd(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:((t=Deno.version)==null?void 0:t.deno)??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Tn,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(r==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Tn,"X-Stainless-OS":Qd(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Yd(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};const e=Mb();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Tn,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${e.browser}`,"X-Stainless-Runtime-Version":e.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Tn,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};function Mb(){if(typeof navigator>"u"||!navigator)return null;const r=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(const{key:e,pattern:t}of r){const n=t.exec(navigator.userAgent);if(n){const s=n[1]||0,a=n[2]||0,i=n[3]||0;return{browser:e,version:`${s}.${a}.${i}`}}}return null}const Yd=r=>r==="x32"?"x32":r==="x86_64"||r==="x64"?"x64":r==="arm"?"arm":r==="aarch64"||r==="arm64"?"arm64":r?`other:${r}`:"unknown",Qd=r=>(r=r.toLowerCase(),r.includes("ios")?"iOS":r==="android"?"Android":r==="darwin"?"MacOS":r==="win32"?"Windows":r==="freebsd"?"FreeBSD":r==="openbsd"?"OpenBSD":r==="linux"?"Linux":r?`Other:${r}`:"Unknown");let eh;const Lb=()=>eh??(eh=Nb());function jb(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new OpenAI({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function Dm(...r){const e=globalThis.ReadableStream;if(typeof e>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new e(...r)}function Bm(r){let e=Symbol.asyncIterator in r?r[Symbol.asyncIterator]():r[Symbol.iterator]();return Dm({start(){},async pull(t){const{done:n,value:s}=await e.next();n?t.close():t.enqueue(s)},async cancel(){var t;await((t=e.return)==null?void 0:t.call(e))}})}function qm(r){if(r[Symbol.asyncIterator])return r;const e=r.getReader();return{async next(){try{const t=await e.read();return t!=null&&t.done&&e.releaseLock(),t}catch(t){throw e.releaseLock(),t}},async return(){const t=e.cancel();return e.releaseLock(),await t,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function Fb(r){var n,s;if(r===null||typeof r!="object")return;if(r[Symbol.asyncIterator]){await((s=(n=r[Symbol.asyncIterator]()).return)==null?void 0:s.call(n));return}const e=r.getReader(),t=e.cancel();e.releaseLock(),await t}const Ub=({headers:r,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)}),zm="RFC3986",Wm=r=>String(r),th={RFC1738:r=>String(r).replace(/%20/g,"+"),RFC3986:Wm},Db="RFC1738";let Pu=(r,e)=>(Pu=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),Pu(r,e));const rr=(()=>{const r=[];for(let e=0;e<256;++e)r.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return r})(),qo=1024,Bb=(r,e,t,n,s)=>{if(r.length===0)return r;let a=r;if(typeof r=="symbol"?a=Symbol.prototype.toString.call(r):typeof r!="string"&&(a=String(r)),t==="iso-8859-1")return escape(a).replace(/%u[0-9a-f]{4}/gi,function(o){return"%26%23"+parseInt(o.slice(2),16)+"%3B"});let i="";for(let o=0;o<a.length;o+=qo){const c=a.length>=qo?a.slice(o,o+qo):a,u=[];for(let l=0;l<c.length;++l){let d=c.charCodeAt(l);if(d===45||d===46||d===95||d===126||d>=48&&d<=57||d>=65&&d<=90||d>=97&&d<=122||s===Db&&(d===40||d===41)){u[u.length]=c.charAt(l);continue}if(d<128){u[u.length]=rr[d];continue}if(d<2048){u[u.length]=rr[192|d>>6]+rr[128|d&63];continue}if(d<55296||d>=57344){u[u.length]=rr[224|d>>12]+rr[128|d>>6&63]+rr[128|d&63];continue}l+=1,d=65536+((d&1023)<<10|c.charCodeAt(l)&1023),u[u.length]=rr[240|d>>18]+rr[128|d>>12&63]+rr[128|d>>6&63]+rr[128|d&63]}i+=u.join("")}return i};function qb(r){return!r||typeof r!="object"?!1:!!(r.constructor&&r.constructor.isBuffer&&r.constructor.isBuffer(r))}function rh(r,e){if(lt(r)){const t=[];for(let n=0;n<r.length;n+=1)t.push(e(r[n]));return t}return e(r)}const Hm={brackets(r){return String(r)+"[]"},comma:"comma",indices(r,e){return String(r)+"["+e+"]"},repeat(r){return String(r)}},Gm=function(r,e){Array.prototype.push.apply(r,lt(e)?e:[e])};let nh;const ze={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Bb,encodeValuesOnly:!1,format:zm,formatter:Wm,indices:!1,serializeDate(r){return(nh??(nh=Function.prototype.call.bind(Date.prototype.toISOString)))(r)},skipNulls:!1,strictNullHandling:!1};function zb(r){return typeof r=="string"||typeof r=="number"||typeof r=="boolean"||typeof r=="symbol"||typeof r=="bigint"}const zo={};function Jm(r,e,t,n,s,a,i,o,c,u,l,d,h,f,p,m,g,w){let _=r,y=w,S=0,x=!1;for(;(y=y.get(zo))!==void 0&&!x;){const se=y.get(r);if(S+=1,typeof se<"u"){if(se===S)throw new RangeError("Cyclic object value");x=!0}typeof y.get(zo)>"u"&&(S=0)}if(typeof u=="function"?_=u(e,_):_ instanceof Date?_=h==null?void 0:h(_):t==="comma"&<(_)&&(_=rh(_,function(se){return se instanceof Date?h==null?void 0:h(se):se})),_===null){if(a)return c&&!m?c(e,ze.encoder,g,"key",f):e;_=""}if(zb(_)||qb(_)){if(c){const se=m?e:c(e,ze.encoder,g,"key",f);return[(p==null?void 0:p(se))+"="+(p==null?void 0:p(c(_,ze.encoder,g,"value",f)))]}return[(p==null?void 0:p(e))+"="+(p==null?void 0:p(String(_)))]}const k=[];if(typeof _>"u")return k;let C;if(t==="comma"&<(_))m&&c&&(_=rh(_,c)),C=[{value:_.length>0?_.join(",")||null:void 0}];else if(lt(u))C=u;else{const se=Object.keys(_);C=l?se.sort(l):se}const E=o?String(e).replace(/\./g,"%2E"):String(e),J=n&<(_)&&_.length===1?E+"[]":E;if(s&<(_)&&_.length===0)return J+"[]";for(let se=0;se<C.length;++se){const H=C[se],Oe=typeof H=="object"&&typeof H.value<"u"?H.value:_[H];if(i&&Oe===null)continue;const gt=d&&o?H.replace(/\./g,"%2E"):H,L=lt(_)?typeof t=="function"?t(J,gt):J:J+(d?"."+gt:"["+gt+"]");w.set(r,S);const P=new WeakMap;P.set(zo,w),Gm(k,Jm(Oe,L,t,n,s,a,i,o,t==="comma"&&m&<(_)?null:c,u,l,d,h,f,p,m,g,P))}return k}function Wb(r=ze){if(typeof r.allowEmptyArrays<"u"&&typeof r.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof r.encodeDotInKeys<"u"&&typeof r.encodeDotInKeys!="boolean")throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(r.encoder!==null&&typeof r.encoder<"u"&&typeof r.encoder!="function")throw new TypeError("Encoder has to be a function.");const e=r.charset||ze.charset;if(typeof r.charset<"u"&&r.charset!=="utf-8"&&r.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let t=zm;if(typeof r.format<"u"){if(!Pu(th,r.format))throw new TypeError("Unknown format option provided.");t=r.format}const n=th[t];let s=ze.filter;(typeof r.filter=="function"||lt(r.filter))&&(s=r.filter);let a;if(r.arrayFormat&&r.arrayFormat in Hm?a=r.arrayFormat:"indices"in r?a=r.indices?"indices":"repeat":a=ze.arrayFormat,"commaRoundTrip"in r&&typeof r.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");const i=typeof r.allowDots>"u"?r.encodeDotInKeys?!0:ze.allowDots:!!r.allowDots;return{addQueryPrefix:typeof r.addQueryPrefix=="boolean"?r.addQueryPrefix:ze.addQueryPrefix,allowDots:i,allowEmptyArrays:typeof r.allowEmptyArrays=="boolean"?!!r.allowEmptyArrays:ze.allowEmptyArrays,arrayFormat:a,charset:e,charsetSentinel:typeof r.charsetSentinel=="boolean"?r.charsetSentinel:ze.charsetSentinel,commaRoundTrip:!!r.commaRoundTrip,delimiter:typeof r.delimiter>"u"?ze.delimiter:r.delimiter,encode:typeof r.encode=="boolean"?r.encode:ze.encode,encodeDotInKeys:typeof r.encodeDotInKeys=="boolean"?r.encodeDotInKeys:ze.encodeDotInKeys,encoder:typeof r.encoder=="function"?r.encoder:ze.encoder,encodeValuesOnly:typeof r.encodeValuesOnly=="boolean"?r.encodeValuesOnly:ze.encodeValuesOnly,filter:s,format:t,formatter:n,serializeDate:typeof r.serializeDate=="function"?r.serializeDate:ze.serializeDate,skipNulls:typeof r.skipNulls=="boolean"?r.skipNulls:ze.skipNulls,sort:typeof r.sort=="function"?r.sort:null,strictNullHandling:typeof r.strictNullHandling=="boolean"?r.strictNullHandling:ze.strictNullHandling}}function Hb(r,e={}){let t=r;const n=Wb(e);let s,a;typeof n.filter=="function"?(a=n.filter,t=a("",t)):lt(n.filter)&&(a=n.filter,s=a);const i=[];if(typeof t!="object"||t===null)return"";const o=Hm[n.arrayFormat],c=o==="comma"&&n.commaRoundTrip;s||(s=Object.keys(t)),n.sort&&s.sort(n.sort);const u=new WeakMap;for(let h=0;h<s.length;++h){const f=s[h];n.skipNulls&&t[f]===null||Gm(i,Jm(t[f],f,o,c,n.allowEmptyArrays,n.strictNullHandling,n.skipNulls,n.encodeDotInKeys,n.encode?n.encoder:null,n.filter,n.sort,n.allowDots,n.serializeDate,n.format,n.formatter,n.encodeValuesOnly,n.charset,u))}const l=i.join(n.delimiter);let d=n.addQueryPrefix===!0?"?":"";return n.charsetSentinel&&(n.charset==="iso-8859-1"?d+="utf8=%26%2310003%3B&":d+="utf8=%E2%9C%93&"),l.length>0?d+l:""}function Gb(r){let e=0;for(const s of r)e+=s.length;const t=new Uint8Array(e);let n=0;for(const s of r)t.set(s,n),n+=s.length;return t}let sh;function Cl(r){let e;return(sh??(e=new globalThis.TextEncoder,sh=e.encode.bind(e)))(r)}let ah;function ih(r){let e;return(ah??(e=new globalThis.TextDecoder,ah=e.decode.bind(e)))(r)}var _t,wt;let no=class{constructor(){_t.set(this,void 0),wt.set(this,void 0),te(this,_t,new Uint8Array),te(this,wt,null)}decode(e){if(e==null)return[];const t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?Cl(e):e;te(this,_t,Gb([O(this,_t,"f"),t]));const n=[];let s;for(;(s=Jb(O(this,_t,"f"),O(this,wt,"f")))!=null;){if(s.carriage&&O(this,wt,"f")==null){te(this,wt,s.index);continue}if(O(this,wt,"f")!=null&&(s.index!==O(this,wt,"f")+1||s.carriage)){n.push(ih(O(this,_t,"f").subarray(0,O(this,wt,"f")-1))),te(this,_t,O(this,_t,"f").subarray(O(this,wt,"f"))),te(this,wt,null);continue}const a=O(this,wt,"f")!==null?s.preceding-1:s.preceding,i=ih(O(this,_t,"f").subarray(0,a));n.push(i),te(this,_t,O(this,_t,"f").subarray(s.index)),te(this,wt,null)}return n}flush(){return O(this,_t,"f").length?this.decode(`
|
|
@@ -260,7 +260,7 @@ Please parse the source data and return it in the exact format specified by the
|
|
|
260
260
|
|
|
261
261
|
IMPORTANT: Return the array in an object with "items" field: { items: [...your array here...] }`:""}`}describeSchema(e,t=0){const n=" ".repeat(t);if(e.type==="array"&&e.items)return`Array<${this.describeSchema(e.items,0)}>`;if(e.type==="object"&&e.shape){let s=`${n}{
|
|
262
262
|
`;for(const[a,i]of Object.entries(e.shape)){const o=i.optional?" (nullable)":"",c=i.description?` // ${i.description}`:"";s+=`${n} ${a}: ${this.describeSchema(i,t+1)}${o}${c}
|
|
263
|
-
`}return s+=`${n}}`,s}return e.type==="currency"?"{ code: string, symbol: string, format: string, amount: number, text: string }":e.enum&&Array.isArray(e.enum)?e.enum.map(a=>JSON.stringify(a)).join(" | "):e.type||"any"}}class tR{constructor(){b(this,"debuggerSessions",new Map);b(this,"networkRequests",new Map);b(this,"pendingExtraInfo",new Map);b(this,"debuggerListenerRegistered",!1);b(this,"handleDebuggerEvent",(e,t,n)=>{const s=e.tabId;if(!s||!this.networkRequests.has(s))return;const a=this.networkRequests.get(s);switch(t){case"Network.requestWillBeSent":this.handleRequestWillBeSent(s,n,a);break;case"Network.requestWillBeSentExtraInfo":this.handleRequestWillBeSentExtraInfo(s,n);break;case"Network.responseReceived":this.handleResponseReceived(n,a);break;case"Network.loadingFinished":this.handleLoadingFinished(s,n,a).catch(i=>console.warn("[CdpService] Error handling loadingFinished:",i));break;case"Network.loadingFailed":this.handleLoadingFailed(n,a);break}})}async handleClick(e,t){try{const{tabId:n,x:s,y:a}=e;await this.click(n,s,a),t({success:!0,data:{clicked:!0}})}catch(n){console.error("[CdpService] Click error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP click failed",data:null})}}async handleKeypress(e,t){try{const{tabId:n,key:s,code:a,keyCode:i,modifiers:o}=e;await this.keypress(n,s,a,i,o),t({success:!0,data:{pressed:!0}})}catch(n){console.error("[CdpService] Keypress error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP keypress failed",data:null})}}async handleExecuteJavaScript(e,t){try{const{tabId:n,code:s,returnResult:a,timeout:i}=e,o=await this.executeJavaScript(n,s,a,i);t({success:!0,data:o})}catch(n){console.error("[CdpService] ExecuteJavaScript error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP JavaScript execution failed",data:null})}}async click(e,t,n){await this.ensureAttached(e),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mouseMoved",x:t,y:n,button:"none",clickCount:0}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mousePressed",x:t,y:n,button:"left",clickCount:1}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mouseReleased",x:t,y:n,button:"left",clickCount:1})}async keypress(e,t,n,s,a=[]){await this.ensureAttached(e);const i=this.convertModifiersToCdp(a);await chrome.debugger.sendCommand({tabId:e},"Input.dispatchKeyEvent",{type:"keyDown",key:t,code:n,windowsVirtualKeyCode:s,nativeVirtualKeyCode:s,modifiers:i}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchKeyEvent",{type:"keyUp",key:t,code:n,windowsVirtualKeyCode:s,nativeVirtualKeyCode:s,modifiers:i})}async executeJavaScript(e,t,n=!0,s=5e3){var o;await this.ensureAttached(e);const i=await Promise.race([chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:t,returnByValue:n,awaitPromise:!0,userGesture:!0}),new Promise((c,u)=>setTimeout(()=>u(new Error(`Execution timeout after ${s}ms`)),s))]);if(i.exceptionDetails){const c=((o=i.exceptionDetails.exception)==null?void 0:o.description)||i.exceptionDetails.text||"Unknown JavaScript error";throw new Error(`JavaScript execution error: ${c}`)}return n&&i.result?i.result.value:null}async attachDebugger(e){await this.ensureAttached(e)}async detachDebugger(e){const t=this.debuggerSessions.get(e);if(t){if(t.networkEnabled)try{await chrome.debugger.sendCommand({tabId:e},"Network.disable",{})}catch(n){console.warn(`[CdpService] Failed to disable network for tab ${e}:`,n)}try{await chrome.debugger.detach({tabId:e})}catch(n){console.warn(`[CdpService] Failed to detach debugger for tab ${e}:`,n)}finally{this.debuggerSessions.delete(e),this.pendingExtraInfo.delete(e),this.detachNetworkListenersIfIdle()}}}convertModifiersToCdp(e){let t=0;return e.includes("Alt")&&(t|=1),e.includes("Control")&&(t|=2),e.includes("Meta")&&(t|=4),e.includes("Shift")&&(t|=8),t}async startNetworkTracking(e){try{await this.ensureAttached(e);const t=this.debuggerSessions.get(e);this.networkRequests.set(e,new Map),this.pendingExtraInfo.set(e,new Map),t.networkEnabled||(await chrome.debugger.sendCommand({tabId:e},"Network.enable",{maxTotalBufferSize:1e7,maxResourceBufferSize:5e6}),t.networkEnabled=!0),this.attachNetworkListeners()}catch(t){throw console.error("[CdpService] Failed to start network tracking:",t),t}}async stopNetworkTracking(e){try{const t=this.debuggerSessions.get(e);t!=null&&t.networkEnabled&&(await chrome.debugger.sendCommand({tabId:e},"Network.disable",{}),t.networkEnabled=!1),this.pendingExtraInfo.delete(e)}catch(t){console.error("[CdpService] Failed to stop network tracking:",t);const n=this.debuggerSessions.get(e);n&&(n.networkEnabled=!1),this.pendingExtraInfo.delete(e)}}attachNetworkListeners(){this.debuggerListenerRegistered||(chrome.debugger.onEvent.addListener(this.handleDebuggerEvent),this.debuggerListenerRegistered=!0)}detachNetworkListenersIfIdle(){this.debuggerListenerRegistered&&(this.debuggerSessions.size>0||(chrome.debugger.onEvent.removeListener(this.handleDebuggerEvent),this.debuggerListenerRegistered=!1))}handleRequestWillBeSent(e,t,n){const{requestId:s,request:a,timestamp:i,type:o}=t,c={requestId:s,url:a.url,method:a.method,type:o,timestamp:i,requestHeaders:a.headers,requestPostData:a.postData};this.injectCookieFromHeaders(c,a.headers),this.applyPendingExtraInfo(e,s,c),n.set(s,c)}handleRequestWillBeSentExtraInfo(e,t){const{requestId:n}=t,s=this.networkRequests.get(e),a=this.normalizeExtraInfo(t);if(s!=null&&s.has(n)){const i=s.get(n);this.applyExtraInfoToRequest(i,a)}else{const i=this.getOrCreatePendingExtraInfoMap(e),o=i.get(n);i.set(n,this.mergeExtraInfo(o,a))}}handleResponseReceived(e,t){const{requestId:n,response:s}=e,a=t.get(n);a&&(a.response={status:s.status,statusText:s.statusText,headers:s.headers,mimeType:s.mimeType,encodedDataLength:s.encodedDataLength})}async handleLoadingFinished(e,t,n){const{requestId:s,timestamp:a,encodedDataLength:i}=t,o=n.get(s);if(o){o.loadingFinished={timestamp:a,encodedDataLength:i};try{const c=await chrome.debugger.sendCommand({tabId:e},"Network.getResponseBody",{requestId:s});c&&(o.responseBody={body:c.body,base64Encoded:c.base64Encoded||!1})}catch(c){console.debug(`[CdpService] Could not get response body for ${o.url}:`,c)}}}handleLoadingFailed(e,t){const{requestId:n,timestamp:s,errorText:a,canceled:i}=e,o=t.get(n);o&&(o.loadingFailed={timestamp:s,errorText:a,canceled:i})}getNetworkRequests(e){const t=this.networkRequests.get(e);return t?Array.from(t.values()):[]}clearNetworkRequests(e){this.networkRequests.delete(e),this.pendingExtraInfo.delete(e)}applyPendingExtraInfo(e,t,n){const s=this.pendingExtraInfo.get(e);if(!s)return;const a=s.get(t);a&&(this.applyExtraInfoToRequest(n,a),s.delete(t))}normalizeExtraInfo(e){return{headers:e.headers,headersText:e.headersText}}mergeExtraInfo(e,t){return e?{headers:{...e.headers||{},...t.headers||{}},headersText:t.headersText??e.headersText}:{headers:t.headers?{...t.headers}:void 0,headersText:t.headersText}}applyExtraInfoToRequest(e,t){const n={...e.requestHeaders||{},...t.headers||{}};t.headersText&&Object.assign(n,this.parseHeadersText(t.headersText)),Object.keys(n).length>0&&(e.requestHeaders=n),this.injectCookieFromHeaders(e,n)}getOrCreatePendingExtraInfoMap(e){return this.pendingExtraInfo.has(e)||this.pendingExtraInfo.set(e,new Map),this.pendingExtraInfo.get(e)}parseHeadersText(e){return e?e.split(/\r?\n/).reduce((t,n)=>{const s=n.indexOf(":");if(s===-1)return t;const a=n.slice(0,s).trim(),i=n.slice(s+1).trim();return a&&(t[a]=i),t},{}):{}}injectCookieFromHeaders(e,t){if(!t)return;const n=t.Cookie||t.cookie;n&&(e.cookieHeader=n,e.parsedCookies=this.parseCookieHeader(n))}parseCookieHeader(e){return e.split(";").reduce((t,n)=>{const[s,...a]=n.split("=");if(!s)return t;const i=s.trim(),o=a.join("=").trim();return i&&(t[i]=o),t},{})}async ensureAttached(e){this.debuggerSessions.has(e)||(console.log("[CdpService] Attaching debugger for tab",e),await chrome.debugger.attach({tabId:e},"1.3"),this.debuggerSessions.set(e,{networkEnabled:!1}),this.attachNetworkListeners())}}const rR=()=>({steps:{}}),nR=(r,e,t)=>({steps:{...r.steps,[e]:t}}),sR=r=>r.startsWith("steps."),aR=(r,e)=>{if(!e.startsWith("steps."))return;const t=e.slice(6);if(t)return t.split(".").reduce((n,s)=>n==null?void 0:n[s],r.steps)},iR=()=>({vars:{}}),oR=(r,e)=>({vars:{...r.vars,...e}}),cR=r=>r.startsWith("vars."),uR=(r,e)=>{if(!e.startsWith("vars."))return;const t=e.slice(5);if(t)return t.split(".").reduce((n,s)=>n==null?void 0:n[s],r.vars)},lR=()=>({}),dR=(r,e,t,n)=>({...r,forEach:{item:e,index:t,total:n}}),hR=(r,e,t)=>({...r,loop:{index:e,count:t}}),fR=r=>{const{forEach:e,loop:t,...n}=r;return n},pR=r=>r.startsWith("forEach.")||r.startsWith("loop."),mR=(r,e)=>{if(!(!e.startsWith("forEach.")&&!e.startsWith("loop.")))return e.split(".").reduce((t,n)=>t==null?void 0:t[n],r)},wm=()=>({stepContext:rR(),varContext:iR(),loopContext:lR()}),ib=(r,e,t)=>({...r,stepContext:nR(r.stepContext,e,t)}),bm=(r,e)=>({...r,varContext:oR(r.varContext,e)}),ob=(r,e,t,n)=>({...r,loopContext:dR(r.loopContext,e,t,n)}),cb=(r,e,t)=>({...r,loopContext:hR(r.loopContext,e,t)}),Nn=r=>({...r,loopContext:fR(r.loopContext)}),ir=(r,e)=>{if(sR(e))return aR(r.stepContext,e);if(cR(e))return uR(r.varContext,e);if(pR(e))return mR(r.loopContext,e)},ub=(r,e)=>{const t=/^\$\{([^}]+)\}$/.exec(r);return t?ir(e,t[1].trim()):r.replace(/\$\{([^}]+)\}/g,(n,s)=>{const a=ir(e,s.trim());return a==null?"":typeof a=="object"?JSON.stringify(a):String(a)})},gR=(r,e)=>{console.log("resolveBinding",r,e);const{valueFrom:t,template:n,default:s}=r;console.log("resolveBinding",t,n,s);try{if(t!=null){const a=ir(e,t);return a===void 0?s:a}if(n!=null){const a=ub(n,e);return a==null||a===""?s:a}}catch{return s}return s},Yi=(r,e)=>{if(r==null)return r;if(typeof r=="string")return ub(r,e);if(Array.isArray(r))return r.map(t=>Yi(t,e));if(typeof r=="object"){if("valueFrom"in r||"template"in r)return gR(r,e);const t={};for(const n of Object.keys(r))t[n]=Yi(r[n],e);return t}return r},Bs=(r,e)=>{if("exists"in r)return ir(e,r.exists)!==void 0;if("equals"in r)return ir(e,r.equals.left)===r.equals.right;if("notEquals"in r)return ir(e,r.notEquals.left)!==r.notEquals.right;if("contains"in r){const t=ir(e,r.contains.value),n=String(r.contains.search);return Array.isArray(t)?t.some(s=>String(s).includes(n)):String(t).includes(n)}if("regex"in r){const t=String(ir(e,r.regex.value));return new RegExp(r.regex.pattern,r.regex.flags||"").test(t)}return"and"in r?r.and.every(t=>Bs(t,e)):"or"in r?r.or.some(t=>Bs(t,e)):"not"in r?!Bs(r.not,e):!1},yR=(r,e)=>{try{const t=e.varContext.vars,n=e.stepContext.steps,s=e.loopContext.forEach,a=e.loopContext.loop;return!!new Function("vars","steps","forEach","loop",`return (${r});`)(t,n,s,a)}catch{return!1}},_R=r=>typeof r=="object"&&r!==null&&("exists"in r||"equals"in r||"notEquals"in r||"contains"in r||"regex"in r||"and"in r||"or"in r||"not"in r),lb=(r,e)=>{if(!r)return!0;if(_R(r))return Bs(r,e);const t=r;return t.json?Bs(t.json,e):t.expr?yR(t.expr,e):!0},wR=async(r,e)=>!e||e<=0?r():new Promise((t,n)=>{const s=setTimeout(()=>n(new Error("Step timeout")),e);r().then(a=>{clearTimeout(s),t(a)}).catch(a=>{clearTimeout(s),n(a)})}),db=async(r,e,t,n,s={})=>{const a=Math.max(1,s.maxAttempts??1),i=s.baseDelay??0,o=s.backoff??1;let c=0,u=null,l=!1,d="";for(;c<a;){c++;try{let h=Yi(r,e);if(console.log("boundBlock",h),h.name==="transform-data"&&h.sourceData===void 0&&(h={...h,sourceData:e.stepContext.steps}),u=await wR(()=>t(h,n),s.timeoutMs),l=!(u!=null&&u.hasError),d=(u==null?void 0:u.message)||"",l)break}catch(h){l=!1,d=(h==null?void 0:h.message)||"Workflow step error",u={hasError:!0,message:d}}if(c<a){const h=i*Math.pow(o,c-1);h>0&&await new Promise(f=>setTimeout(f,h))}}return{result:u,success:l,message:d,attempts:c}},hb=(r,e)=>{if(r.forEach){const t=ir(e,r.forEach);return Array.isArray(t)?{items:t,isForEach:!0}:t!=null?{items:[t],isForEach:!0}:{items:[],isForEach:!0}}if(r.count!=null){let t;return typeof r.count=="string"?t=ir(e,r.count)??0:t=r.count,{items:Array.from({length:Math.max(0,t)},(s,a)=>a),isForEach:!1}}throw new Error("repeat requires either forEach or count")},bR=async(r,e,t,n,s,a={})=>{const i=[],o=[];let c=t;try{const{items:u,isForEach:l}=hb(e,t);for(let d=0;d<u.length;d++){const h=u[d];l?c=ob(c,h,d,u.length):c=cb(c,d,u.length);try{const f=await db(r,c,n,s,a);if(f.success)i.push(f.result);else if(o.push({index:d,item:h,error:f.result}),e.continueOnError)i.push(null);else return c=Nn(c),{result:{hasError:!0,message:`Repeat failed at index ${d}: ${f.message}`,data:{results:i,errors:o,stoppedAt:d}},context:c}}catch(f){if(o.push({index:d,item:h,error:f.message}),e.continueOnError)i.push(null);else return c=Nn(c),{result:{hasError:!0,message:`Repeat failed at index ${d}: ${f.message}`,data:{results:i,errors:o,stoppedAt:d}},context:c}}e.delayBetween&&d<u.length-1&&await new Promise(f=>setTimeout(f,e.delayBetween))}return c=Nn(c),{result:{hasError:o.length>0&&!e.continueOnError,message:o.length>0?`Completed with ${o.length} error(s) out of ${u.length}`:`Completed ${u.length} iteration(s)`,data:i},context:c}}catch(u){return{result:{hasError:!0,message:u.message||"repeat requires either forEach or count",data:null},context:c}}},vR=async(r,e,t,n)=>{var f,p,m,g,w,_,y,S;const s=new Date().toISOString();let a=!1,i=!0,o="",c=null,u=0,l=e;if(!lb(r.when,e))a=!0;else if(r.block)if(r.repeat&&r.repeat.scope!=="subtree"){const x=await bR(r.block,r.repeat,e,t,n,{maxAttempts:(f=r.retry)==null?void 0:f.attempts,baseDelay:(p=r.retry)==null?void 0:p.delayMs,backoff:(m=r.retry)==null?void 0:m.backoffFactor,timeoutMs:r.timeoutMs});c=x.result,i=!((g=x.result)!=null&&g.hasError),o=((w=x.result)==null?void 0:w.message)||"",l=x.context}else{const x=await db(r.block,e,t,n,{maxAttempts:(_=r.retry)==null?void 0:_.attempts,baseDelay:(y=r.retry)==null?void 0:y.delayMs,backoff:(S=r.retry)==null?void 0:S.backoffFactor,timeoutMs:r.timeoutMs});c=x.result,i=x.success,o=x.message,u=x.attempts}else a=!0;const h=new Date().toISOString();return l=ib(l,r.id,{result:c,success:i,skipped:a}),{stepId:r.id,skipped:a,success:i,message:o,result:c,startedAt:s,finishedAt:h,attempts:u,context:l}},TR=(r,e,t)=>{if(r.switch&&r.switch.length>0){const n=r.switch.find(s=>lb(s.when,t));if(n)return n.next}if(e&&r.onSuccess)return r.onSuccess;if(!e&&r.onFailure)return r.onFailure;if(r.next)return r.next},ER=async r=>{typeof r.delayAfterMs=="number"&&r.delayAfterMs>0&&await new Promise(e=>setTimeout(e,r.delayAfterMs))},kl=async r=>{var u;const{stepsById:e,tabId:t,stopBeforeStepId:n,skipRepeatStepIds:s,executeBlock:a}=r;let{currentId:i,context:o}=r;const c=[];for(;i&&i!==n;){const l=e.get(i);if(!l)break;if(console.log("step",l),((u=l.repeat)==null?void 0:u.scope)==="subtree"&&!(s!=null&&s.has(l.id))){const f=await SR({step:l,repeatConfig:l.repeat,context:o,stepsById:e,tabId:t,executeBlock:a,inheritedSkipSet:s});c.push(...f.results),o=f.context,i=f.nextStepId;continue}const d=await vR(l,o,a,t);console.log("stepResult",d),c.push(d),o=d.context;const h=TR(l,d.success,o);h&&!d.skipped&&await ER(l),i=h}return{results:c,context:o,nextStepId:i}},SR=async r=>{var f;const{step:e,repeatConfig:t,stepsById:n,tabId:s,executeBlock:a,inheritedSkipSet:i}=r;if(!t.subtreeEnd)throw new Error(`subtree repeat requires 'subtreeEnd' on step ${e.id}`);let o=r.context;const c=[],u=[],l=[],{items:d,isForEach:h}=hb(t,o);for(let p=0;p<d.length;p++){const m=d[p];o=h?ob(o,m,p,d.length):cb(o,p,d.length);try{const g=new Set(i??[]);g.add(e.id);const w=await kl({currentId:e.id,context:o,stepsById:n,tabId:s,executeBlock:a,stopBeforeStepId:t.subtreeEnd,skipRepeatStepIds:g});c.push(...w.results),o=w.context;const _=w.results.every(y=>y.success||y.skipped);if(u.push({index:p,success:_,steps:w.results.map(y=>({stepId:y.stepId,success:y.success,skipped:y.skipped,message:y.message,result:y.result}))}),!_&&(l.push({index:p,message:((f=w.results.find(y=>!y.success))==null?void 0:f.message)||"Subtree iteration failed"}),!t.continueOnError))return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})}catch(g){if(l.push({index:p,message:(g==null?void 0:g.message)||"Subtree iteration threw error"}),!t.continueOnError)return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})}t.delayBetween&&p<d.length-1&&await new Promise(g=>setTimeout(g,t.delayBetween))}return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})},ku=r=>{const{step:e,repeatConfig:t,aggregatedResults:n,iterationSummaries:s,errors:a,totalIterations:i}=r,o={hasError:a.length>0&&!t.continueOnError,message:a.length>0?`Subtree repeat completed with ${a.length} error(s) out of ${i}`:`Subtree repeat completed ${i} iteration(s)`,data:{iterations:s,errors:a}},c=ib(r.context,e.id,{result:o,success:!o.hasError,skipped:i===0}),u=xR(n,e.id);if(u>=0){const l={...n[u],result:o,success:!o.hasError,message:o.message};l.context=c,n[u]=l}else{const l=new Date().toISOString(),d={stepId:e.id,skipped:i===0,success:!o.hasError,message:o.message,result:o,startedAt:l,finishedAt:l,attempts:0};d.context=c,n.push(d)}return{results:n,context:c,nextStepId:t.subtreeEnd}},xR=(r,e)=>{for(let t=r.length-1;t>=0;t--)if(r[t].stepId===e)return t;return-1};class IR{constructor(e,t,n){this.executeBlock=e,this.createTab=t,this.executeWithHooks=n}async run(e,t,n=!1,s,a){let i=wm();e.vars&&(i=bm(i,e.vars)),console.log("context",e.vars),console.log("targetUrl",t),console.log(i);const o=typeof t=="string"?Yi(t,i):t;console.log("resolvedTargetUrl",o);const c=await this.createTab(o,n,s);return this.executeWithHooks(c,async()=>{const u=new Map(e.steps.map(h=>[h.id,h])),{results:l,context:d}=await kl({currentId:e.start,context:i,stepsById:u,tabId:c,executeBlock:this.executeBlock});return{steps:l,tabId:c,context:d}},e.workflowType,a)}async runInExistingTab(e,t,n){let s=wm();return e.vars&&(s=bm(s,e.vars)),this.executeWithHooks(t,async()=>{const a=new Map(e.steps.map(c=>[c.id,c])),{results:i,context:o}=await kl({currentId:e.start,context:s,stepsById:a,tabId:t,executeBlock:this.executeBlock});return{steps:i,tabId:t,context:o}},e.workflowType,n)}}class OR{constructor(e){b(this,"workflowRunner");b(this,"statusController");b(this,"sideModalController");b(this,"lastWorkflowResults",new Map);b(this,"lastWorkflowRequests",new Map);b(this,"workspacePromises",new Map);this.tabManager=e;const t=(a,i)=>this.tabManager.executeBlock(a,i),n=async(a,i,o)=>{const c=await this.tabManager.createTab(a,i,void 0,void 0,o);if(c.id===void 0)throw new Error("Failed to create tab or tab ID is missing");return c.id};this.statusController={show:(a,i)=>this.tabManager.showExecutionStatus(a,i),hide:a=>this.tabManager.hideExecutionStatus(a)},this.sideModalController={show:a=>this.tabManager.showSideModal(a),hide:a=>this.tabManager.hideSideModal(a),open:a=>this.tabManager.openSideModal(a),close:a=>this.tabManager.closeSideModal(a),setWorkspaces:(a,i)=>this.tabManager.setWorkspaces(a,i),updateSiteInfo:(a,i,o)=>this.tabManager.updateSideModalSiteInfo(a,i,o),setLoginStatus:(a,i)=>this.tabManager.setSideModalLoginStatus(a,i),isOpen:a=>this.tabManager.isSideModalOpen(a)};const s=async(a,i,o,c)=>{try{if(o==="getWorkspaces"){const u=await i();console.log("=== WORKFLOW RESULT ==="),console.log("Full result:",u),console.log("Last step:",u.steps[u.steps.length-1]),console.log("Last step result:",u.steps[u.steps.length-1].result);let l=[];const d=f=>{if(!Array.isArray(f)||f.length===0)return!0;const p=f[0];return typeof p=="object"&&p!==null&&"id"in p&&"name"in p&&typeof p.id=="string"&&typeof p.name=="string"&&!("url"in p&&"method"in p&&"status"in p)};for(let f=u.steps.length-1;f>=0;f--){const p=u.steps[f];if(p.success&&p.result){if(Array.isArray(p.result)&&d(p.result)){l=p.result,console.log(`Found workspaces in step ${f} (array):`,l);break}else if(p.result.data&&Array.isArray(p.result.data)&&d(p.result.data)){l=p.result.data,console.log(`Found workspaces in step ${f} (result.data):`,l);break}else if(typeof p.result=="object"&&p.result!==null&&p.result.workspaces&&Array.isArray(p.result.workspaces)&&d(p.result.workspaces)){l=p.result.workspaces,console.log(`Found workspaces in step ${f} (result.workspaces):`,l);break}}}return console.log("Final extracted workspaces:",l),this.lastWorkflowResults.set(a,u),this.lastWorkflowRequests.set(a,c||{}),this.workspacePromises.get(a)?u:(await this.sideModalController.setWorkspaces(a,l),await this.sideModalController.show(a),new Promise((f,p)=>{this.workspacePromises.set(a,{resolve:()=>{const m=this.lastWorkflowResults.get(a)||u;f(m)},reject:p})}))}else return await this.statusController.show(a,"워크플로우 실행 중"),await i()}finally{o!=="getWorkspaces"&&await this.statusController.hide(a)}};this.workflowRunner=new IR(t,n,s)}async handleCollectWorkflow(e,t){const n=this.validateRequest(e);if(!n.success){t({$isError:!0,message:n.error,data:{}});return}let s;try{console.log("[WorkflowService] Running workflow for:",e.targetUrl);const a=await this.workflowRunner.run(e.workflow,e.targetUrl,e.activateTab===!0,e.originTabId,e);s=a.tabId;const i={steps:a.context.stepContext.steps,vars:a.context.varContext.vars,forEach:a.context.loopContext.forEach,loop:a.context.loopContext.loop};t({success:!0,targetUrl:e.targetUrl,tabId:a.tabId,result:{steps:a.steps,context:i},timestamp:new Date().toISOString(),closeTabAfterCollection:e.closeTabAfterCollection!==!1});const o=e.closeTabAfterCollection!==!1;s!==void 0&&o&&await this.cleanup(s)}catch(a){console.error("[WorkflowService] Workflow execution error:",a),t({$isError:!0,message:a instanceof Error?a.message:"Workflow execution failed",data:{}})}}validateRequest(e){return e.targetUrl?e.workflow?{success:!0}:{success:!1,error:"Workflow is required"}:{success:!1,error:"Target URL is required for workflow"}}async cleanup(e){console.log("[WorkflowService] Cleanup - closing tab:",e),await new Promise(t=>setTimeout(t,1e3)),await this.tabManager.closeTab(e)}async completeWorkspaceSelection(e){console.log("[WorkflowService] Completing workspace selection for tab:",e);const t=this.workspacePromises.get(e);console.log("[WorkflowService] Promise:",t),console.log("[WorkflowService] Last workflow results:",this.lastWorkflowResults.get(e)),t&&(t.resolve(this.lastWorkflowResults.get(e)||{}),this.workspacePromises.delete(e)),await this.sideModalController.hide(e),this.lastWorkflowResults.delete(e),this.lastWorkflowRequests.delete(e)}async refreshWorkspaceWorkflow(e){const t=this.lastWorkflowRequests.get(e);if(t){console.log("[WorkflowService] Refreshing workspace workflow for tab:",e);try{const[n]=await Promise.all([this.workflowRunner.runInExistingTab(t.workflow,e,t),new Promise(i=>{setTimeout(()=>{i(void 0)},2e3)})]);this.lastWorkflowResults.set(e,n),console.log("[WorkflowService] Refresh complete, new result:",n),console.log("[WorkflowService] Refresh result.steps:",n.steps);let s=[];const a=i=>{if(!Array.isArray(i)||i.length===0)return!0;const o=i[0];return typeof o=="object"&&o!==null&&"id"in o&&"name"in o&&typeof o.id=="string"&&typeof o.name=="string"&&!("url"in o&&"method"in o&&"status"in o)};for(let i=n.steps.length-1;i>=0;i--){const o=n.steps[i];if(o.success&&o.result){if(Array.isArray(o.result)&&a(o.result)){s=o.result,console.log(`[Refresh] Found workspaces in step ${i} (array):`,s);break}else if(o.result.data&&Array.isArray(o.result.data)&&a(o.result.data)){s=o.result.data,console.log(`[Refresh] Found workspaces in step ${i} (result.data):`,s);break}else if(typeof o.result=="object"&&o.result!==null&&o.result.workspaces&&Array.isArray(o.result.workspaces)&&a(o.result.workspaces)){s=o.result.workspaces,console.log(`[Refresh] Found workspaces in step ${i} (result.workspaces):`,s);break}}}console.log("[Refresh] Final extracted workspaces:",s),await this.sideModalController.setWorkspaces(e,s),console.log("[WorkflowService] Updated workspaces after refresh")}catch(n){console.error("[WorkflowService] Failed to refresh workflow:",n)}}}}class kR{async handleRequest(e,t){try{console.log("[ApiService] Handle API request:",e.url),e.body&&console.log("requestData.body",e.body);const n=await this.fetchData(e);t({success:!0,data:n})}catch(n){console.error("[ApiService] API request error:",n),t({$isError:!0,message:n instanceof Error?n.message:"Unknown error in API request",data:null})}}async fetchData(e){const{url:t,method:n,headers:s,body:a,timeout:i,parseJson:o,returnHeaders:c}=e;console.log(`[ApiService] Fetching ${n} ${t}`);const u=new AbortController,l=setTimeout(()=>u.abort(),i);try{const d={method:n,headers:s,signal:u.signal};a&&!["GET","HEAD"].includes(n)&&(typeof a=="string"?d.body=a:(d.body=JSON.stringify(a),!s["Content-Type"]&&!s["content-type"]&&(d.headers={...s,"Content-Type":"application/json"})));const h=await fetch(t,d);clearTimeout(l);let f;const p=h.headers.get("content-type")||"";if(o&&p.includes("application/json"))try{f=await h.json()}catch{f=await h.text()}else f=await h.text();let m;c&&(m={},h.headers.forEach((w,_)=>{m[_]=w}));const g={status:h.status,statusText:h.statusText,data:f,headers:m};return console.log(`[ApiService] Response status: ${h.status}`),g}catch(d){throw clearTimeout(l),d instanceof Error&&d.name==="AbortError"?new Error(`Request timeout after ${i}ms`):d}}}function AR(r){return JSON.stringify(r,null,2)}function CR(r,e){const t=(e==null?void 0:e.delimiter)||",",n=(e==null?void 0:e.includeHeaders)!==!1,s=Array.isArray(r)?r:[r];if(s.length===0)return"";const a=new Set;s.forEach(c=>{typeof c=="object"&&c!==null&&Object.keys(c).forEach(u=>a.add(u))});const i=Array.from(a),o=[];return n&&i.length>0&&o.push(i.map(c=>Au(c,t)).join(t)),s.forEach(c=>{if(typeof c=="object"&&c!==null){const u=i.map(l=>{const d=c[l];return Au(d,t)});o.push(u.join(t))}else o.push(Au(c,t))}),o.join(`
|
|
263
|
+
`}return s+=`${n}}`,s}return e.type==="currency"?"{ code: string, symbol: string, format: string, amount: number, text: string }":e.enum&&Array.isArray(e.enum)?e.enum.map(a=>JSON.stringify(a)).join(" | "):e.type||"any"}}class tR{constructor(){b(this,"debuggerSessions",new Map);b(this,"networkRequests",new Map);b(this,"pendingExtraInfo",new Map);b(this,"debuggerListenerRegistered",!1);b(this,"handleDebuggerEvent",(e,t,n)=>{const s=e.tabId;if(!s||!this.networkRequests.has(s))return;const a=this.networkRequests.get(s);switch(t){case"Network.requestWillBeSent":this.handleRequestWillBeSent(s,n,a);break;case"Network.requestWillBeSentExtraInfo":this.handleRequestWillBeSentExtraInfo(s,n);break;case"Network.responseReceived":this.handleResponseReceived(n,a);break;case"Network.loadingFinished":this.handleLoadingFinished(s,n,a).catch(i=>console.warn("[CdpService] Error handling loadingFinished:",i));break;case"Network.loadingFailed":this.handleLoadingFailed(n,a);break}})}async handleClick(e,t){try{const{tabId:n,x:s,y:a}=e;await this.click(n,s,a),t({success:!0,data:{clicked:!0}})}catch(n){console.error("[CdpService] Click error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP click failed",data:null})}}async handleKeypress(e,t){try{const{tabId:n,key:s,code:a,keyCode:i,modifiers:o}=e;await this.keypress(n,s,a,i,o),t({success:!0,data:{pressed:!0}})}catch(n){console.error("[CdpService] Keypress error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP keypress failed",data:null})}}async handleExecuteJavaScript(e,t){try{const{tabId:n,code:s,returnResult:a,timeout:i}=e,o=await this.executeJavaScript(n,s,a,i);t({success:!0,data:o})}catch(n){console.error("[CdpService] ExecuteJavaScript error:",n),t({$isError:!0,message:n instanceof Error?n.message:"CDP JavaScript execution failed",data:null})}}async click(e,t,n){await this.ensureAttached(e),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mouseMoved",x:t,y:n,button:"none",clickCount:0}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mousePressed",x:t,y:n,button:"left",clickCount:1}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchMouseEvent",{type:"mouseReleased",x:t,y:n,button:"left",clickCount:1})}async keypress(e,t,n,s,a=[]){await this.ensureAttached(e);const i=this.convertModifiersToCdp(a);await chrome.debugger.sendCommand({tabId:e},"Input.dispatchKeyEvent",{type:"keyDown",key:t,code:n,windowsVirtualKeyCode:s,nativeVirtualKeyCode:s,modifiers:i}),await chrome.debugger.sendCommand({tabId:e},"Input.dispatchKeyEvent",{type:"keyUp",key:t,code:n,windowsVirtualKeyCode:s,nativeVirtualKeyCode:s,modifiers:i})}async executeJavaScript(e,t,n=!0,s=5e3){var o;await this.ensureAttached(e);const i=await Promise.race([chrome.debugger.sendCommand({tabId:e},"Runtime.evaluate",{expression:t,returnByValue:n,awaitPromise:!0,userGesture:!0}),new Promise((c,u)=>setTimeout(()=>u(new Error(`Execution timeout after ${s}ms`)),s))]);if(i.exceptionDetails){const c=((o=i.exceptionDetails.exception)==null?void 0:o.description)||i.exceptionDetails.text||"Unknown JavaScript error";throw new Error(`JavaScript execution error: ${c}`)}return console.log("[CdpService] executeJavaScript result:",i),n&&i.result?(console.log("[CdpService] returning value:",i.result.value),i.result.value):(console.log("[CdpService] returning null - returnResult:",n,"evalResult.result:",i.result),null)}async attachDebugger(e){await this.ensureAttached(e)}async detachDebugger(e){const t=this.debuggerSessions.get(e);if(t){if(t.networkEnabled)try{await chrome.debugger.sendCommand({tabId:e},"Network.disable",{})}catch(n){console.warn(`[CdpService] Failed to disable network for tab ${e}:`,n)}try{await chrome.debugger.detach({tabId:e})}catch(n){console.warn(`[CdpService] Failed to detach debugger for tab ${e}:`,n)}finally{this.debuggerSessions.delete(e),this.pendingExtraInfo.delete(e),this.detachNetworkListenersIfIdle()}}}convertModifiersToCdp(e){let t=0;return e.includes("Alt")&&(t|=1),e.includes("Control")&&(t|=2),e.includes("Meta")&&(t|=4),e.includes("Shift")&&(t|=8),t}async startNetworkTracking(e){try{await this.ensureAttached(e);const t=this.debuggerSessions.get(e);this.networkRequests.set(e,new Map),this.pendingExtraInfo.set(e,new Map),t.networkEnabled||(await chrome.debugger.sendCommand({tabId:e},"Network.enable",{maxTotalBufferSize:1e7,maxResourceBufferSize:5e6}),t.networkEnabled=!0),this.attachNetworkListeners()}catch(t){throw console.error("[CdpService] Failed to start network tracking:",t),t}}async stopNetworkTracking(e){try{const t=this.debuggerSessions.get(e);t!=null&&t.networkEnabled&&(await chrome.debugger.sendCommand({tabId:e},"Network.disable",{}),t.networkEnabled=!1),this.pendingExtraInfo.delete(e)}catch(t){console.error("[CdpService] Failed to stop network tracking:",t);const n=this.debuggerSessions.get(e);n&&(n.networkEnabled=!1),this.pendingExtraInfo.delete(e)}}attachNetworkListeners(){this.debuggerListenerRegistered||(chrome.debugger.onEvent.addListener(this.handleDebuggerEvent),this.debuggerListenerRegistered=!0)}detachNetworkListenersIfIdle(){this.debuggerListenerRegistered&&(this.debuggerSessions.size>0||(chrome.debugger.onEvent.removeListener(this.handleDebuggerEvent),this.debuggerListenerRegistered=!1))}handleRequestWillBeSent(e,t,n){const{requestId:s,request:a,timestamp:i,type:o}=t,c={requestId:s,url:a.url,method:a.method,type:o,timestamp:i,requestHeaders:a.headers,requestPostData:a.postData};this.injectCookieFromHeaders(c,a.headers),this.applyPendingExtraInfo(e,s,c),n.set(s,c)}handleRequestWillBeSentExtraInfo(e,t){const{requestId:n}=t,s=this.networkRequests.get(e),a=this.normalizeExtraInfo(t);if(s!=null&&s.has(n)){const i=s.get(n);this.applyExtraInfoToRequest(i,a)}else{const i=this.getOrCreatePendingExtraInfoMap(e),o=i.get(n);i.set(n,this.mergeExtraInfo(o,a))}}handleResponseReceived(e,t){const{requestId:n,response:s}=e,a=t.get(n);a&&(a.response={status:s.status,statusText:s.statusText,headers:s.headers,mimeType:s.mimeType,encodedDataLength:s.encodedDataLength})}async handleLoadingFinished(e,t,n){const{requestId:s,timestamp:a,encodedDataLength:i}=t,o=n.get(s);if(o){o.loadingFinished={timestamp:a,encodedDataLength:i};try{const c=await chrome.debugger.sendCommand({tabId:e},"Network.getResponseBody",{requestId:s});c&&(o.responseBody={body:c.body,base64Encoded:c.base64Encoded||!1})}catch(c){console.debug(`[CdpService] Could not get response body for ${o.url}:`,c)}}}handleLoadingFailed(e,t){const{requestId:n,timestamp:s,errorText:a,canceled:i}=e,o=t.get(n);o&&(o.loadingFailed={timestamp:s,errorText:a,canceled:i})}getNetworkRequests(e){const t=this.networkRequests.get(e);return t?Array.from(t.values()):[]}clearNetworkRequests(e){this.networkRequests.delete(e),this.pendingExtraInfo.delete(e)}applyPendingExtraInfo(e,t,n){const s=this.pendingExtraInfo.get(e);if(!s)return;const a=s.get(t);a&&(this.applyExtraInfoToRequest(n,a),s.delete(t))}normalizeExtraInfo(e){return{headers:e.headers,headersText:e.headersText}}mergeExtraInfo(e,t){return e?{headers:{...e.headers||{},...t.headers||{}},headersText:t.headersText??e.headersText}:{headers:t.headers?{...t.headers}:void 0,headersText:t.headersText}}applyExtraInfoToRequest(e,t){const n={...e.requestHeaders||{},...t.headers||{}};t.headersText&&Object.assign(n,this.parseHeadersText(t.headersText)),Object.keys(n).length>0&&(e.requestHeaders=n),this.injectCookieFromHeaders(e,n)}getOrCreatePendingExtraInfoMap(e){return this.pendingExtraInfo.has(e)||this.pendingExtraInfo.set(e,new Map),this.pendingExtraInfo.get(e)}parseHeadersText(e){return e?e.split(/\r?\n/).reduce((t,n)=>{const s=n.indexOf(":");if(s===-1)return t;const a=n.slice(0,s).trim(),i=n.slice(s+1).trim();return a&&(t[a]=i),t},{}):{}}injectCookieFromHeaders(e,t){if(!t)return;const n=t.Cookie||t.cookie;n&&(e.cookieHeader=n,e.parsedCookies=this.parseCookieHeader(n))}parseCookieHeader(e){return e.split(";").reduce((t,n)=>{const[s,...a]=n.split("=");if(!s)return t;const i=s.trim(),o=a.join("=").trim();return i&&(t[i]=o),t},{})}async ensureAttached(e){this.debuggerSessions.has(e)||(console.log("[CdpService] Attaching debugger for tab",e),await chrome.debugger.attach({tabId:e},"1.3"),this.debuggerSessions.set(e,{networkEnabled:!1}),this.attachNetworkListeners())}}const rR=()=>({steps:{}}),nR=(r,e,t)=>({steps:{...r.steps,[e]:t}}),sR=r=>r.startsWith("steps."),aR=(r,e)=>{if(!e.startsWith("steps."))return;const t=e.slice(6);if(t)return t.split(".").reduce((n,s)=>n==null?void 0:n[s],r.steps)},iR=()=>({vars:{}}),oR=(r,e)=>({vars:{...r.vars,...e}}),cR=r=>r.startsWith("vars."),uR=(r,e)=>{if(!e.startsWith("vars."))return;const t=e.slice(5);if(t)return t.split(".").reduce((n,s)=>n==null?void 0:n[s],r.vars)},lR=()=>({}),dR=(r,e,t,n)=>({...r,forEach:{item:e,index:t,total:n}}),hR=(r,e,t)=>({...r,loop:{index:e,count:t}}),fR=r=>{const{forEach:e,loop:t,...n}=r;return n},pR=r=>r.startsWith("forEach.")||r.startsWith("loop."),mR=(r,e)=>{if(!(!e.startsWith("forEach.")&&!e.startsWith("loop.")))return e.split(".").reduce((t,n)=>t==null?void 0:t[n],r)},wm=()=>({stepContext:rR(),varContext:iR(),loopContext:lR()}),ib=(r,e,t)=>({...r,stepContext:nR(r.stepContext,e,t)}),bm=(r,e)=>({...r,varContext:oR(r.varContext,e)}),ob=(r,e,t,n)=>({...r,loopContext:dR(r.loopContext,e,t,n)}),cb=(r,e,t)=>({...r,loopContext:hR(r.loopContext,e,t)}),Nn=r=>({...r,loopContext:fR(r.loopContext)}),ir=(r,e)=>{if(sR(e))return aR(r.stepContext,e);if(cR(e))return uR(r.varContext,e);if(pR(e))return mR(r.loopContext,e)},ub=(r,e)=>{const t=/^\$\{([^}]+)\}$/.exec(r);return t?ir(e,t[1].trim()):r.replace(/\$\{([^}]+)\}/g,(n,s)=>{const a=ir(e,s.trim());return a==null?"":typeof a=="object"?JSON.stringify(a):String(a)})},gR=(r,e)=>{console.log("resolveBinding",r,e);const{valueFrom:t,template:n,default:s}=r;console.log("resolveBinding",t,n,s);try{if(t!=null){const a=ir(e,t);return a===void 0?s:a}if(n!=null){const a=ub(n,e);return a==null||a===""?s:a}}catch{return s}return s},Yi=(r,e)=>{if(r==null)return r;if(typeof r=="string")return ub(r,e);if(Array.isArray(r))return r.map(t=>Yi(t,e));if(typeof r=="object"){if("valueFrom"in r||"template"in r)return gR(r,e);const t={};for(const n of Object.keys(r))t[n]=Yi(r[n],e);return t}return r},Bs=(r,e)=>{if("exists"in r)return ir(e,r.exists)!==void 0;if("equals"in r)return ir(e,r.equals.left)===r.equals.right;if("notEquals"in r)return ir(e,r.notEquals.left)!==r.notEquals.right;if("contains"in r){const t=ir(e,r.contains.value),n=String(r.contains.search);return Array.isArray(t)?t.some(s=>String(s).includes(n)):String(t).includes(n)}if("regex"in r){const t=String(ir(e,r.regex.value));return new RegExp(r.regex.pattern,r.regex.flags||"").test(t)}return"and"in r?r.and.every(t=>Bs(t,e)):"or"in r?r.or.some(t=>Bs(t,e)):"not"in r?!Bs(r.not,e):!1},yR=(r,e)=>{try{const t=e.varContext.vars,n=e.stepContext.steps,s=e.loopContext.forEach,a=e.loopContext.loop;return!!new Function("vars","steps","forEach","loop",`return (${r});`)(t,n,s,a)}catch{return!1}},_R=r=>typeof r=="object"&&r!==null&&("exists"in r||"equals"in r||"notEquals"in r||"contains"in r||"regex"in r||"and"in r||"or"in r||"not"in r),lb=(r,e)=>{if(!r)return!0;if(_R(r))return Bs(r,e);const t=r;return t.json?Bs(t.json,e):t.expr?yR(t.expr,e):!0},wR=async(r,e)=>!e||e<=0?r():new Promise((t,n)=>{const s=setTimeout(()=>n(new Error("Step timeout")),e);r().then(a=>{clearTimeout(s),t(a)}).catch(a=>{clearTimeout(s),n(a)})}),db=async(r,e,t,n,s={})=>{const a=Math.max(1,s.maxAttempts??1),i=s.baseDelay??0,o=s.backoff??1;let c=0,u=null,l=!1,d="";for(;c<a;){c++;try{let h=Yi(r,e);if(console.log("boundBlock",h),h.name==="transform-data"&&h.sourceData===void 0&&(h={...h,sourceData:e.stepContext.steps}),u=await wR(()=>t(h,n),s.timeoutMs),l=!(u!=null&&u.hasError),d=(u==null?void 0:u.message)||"",l)break}catch(h){l=!1,d=(h==null?void 0:h.message)||"Workflow step error",u={hasError:!0,message:d}}if(c<a){const h=i*Math.pow(o,c-1);h>0&&await new Promise(f=>setTimeout(f,h))}}return{result:u,success:l,message:d,attempts:c}},hb=(r,e)=>{if(r.forEach){const t=ir(e,r.forEach);return Array.isArray(t)?{items:t,isForEach:!0}:t!=null?{items:[t],isForEach:!0}:{items:[],isForEach:!0}}if(r.count!=null){let t;return typeof r.count=="string"?t=ir(e,r.count)??0:t=r.count,{items:Array.from({length:Math.max(0,t)},(s,a)=>a),isForEach:!1}}throw new Error("repeat requires either forEach or count")},bR=async(r,e,t,n,s,a={})=>{const i=[],o=[];let c=t;try{const{items:u,isForEach:l}=hb(e,t);for(let d=0;d<u.length;d++){const h=u[d];l?c=ob(c,h,d,u.length):c=cb(c,d,u.length);try{const f=await db(r,c,n,s,a);if(f.success)i.push(f.result);else if(o.push({index:d,item:h,error:f.result}),e.continueOnError)i.push(null);else return c=Nn(c),{result:{hasError:!0,message:`Repeat failed at index ${d}: ${f.message}`,data:{results:i,errors:o,stoppedAt:d}},context:c}}catch(f){if(o.push({index:d,item:h,error:f.message}),e.continueOnError)i.push(null);else return c=Nn(c),{result:{hasError:!0,message:`Repeat failed at index ${d}: ${f.message}`,data:{results:i,errors:o,stoppedAt:d}},context:c}}e.delayBetween&&d<u.length-1&&await new Promise(f=>setTimeout(f,e.delayBetween))}return c=Nn(c),{result:{hasError:o.length>0&&!e.continueOnError,message:o.length>0?`Completed with ${o.length} error(s) out of ${u.length}`:`Completed ${u.length} iteration(s)`,data:i},context:c}}catch(u){return{result:{hasError:!0,message:u.message||"repeat requires either forEach or count",data:null},context:c}}},vR=async(r,e,t,n)=>{var f,p,m,g,w,_,y,S;const s=new Date().toISOString();let a=!1,i=!0,o="",c=null,u=0,l=e;if(!lb(r.when,e))a=!0;else if(r.block)if(r.repeat&&r.repeat.scope!=="subtree"){const x=await bR(r.block,r.repeat,e,t,n,{maxAttempts:(f=r.retry)==null?void 0:f.attempts,baseDelay:(p=r.retry)==null?void 0:p.delayMs,backoff:(m=r.retry)==null?void 0:m.backoffFactor,timeoutMs:r.timeoutMs});c=x.result,i=!((g=x.result)!=null&&g.hasError),o=((w=x.result)==null?void 0:w.message)||"",l=x.context}else{const x=await db(r.block,e,t,n,{maxAttempts:(_=r.retry)==null?void 0:_.attempts,baseDelay:(y=r.retry)==null?void 0:y.delayMs,backoff:(S=r.retry)==null?void 0:S.backoffFactor,timeoutMs:r.timeoutMs});c=x.result,i=x.success,o=x.message,u=x.attempts}else a=!0;const h=new Date().toISOString();return l=ib(l,r.id,{result:c,success:i,skipped:a}),{stepId:r.id,skipped:a,success:i,message:o,result:c,startedAt:s,finishedAt:h,attempts:u,context:l}},TR=(r,e,t)=>{if(r.switch&&r.switch.length>0){const n=r.switch.find(s=>lb(s.when,t));if(n)return n.next}if(e&&r.onSuccess)return r.onSuccess;if(!e&&r.onFailure)return r.onFailure;if(r.next)return r.next},ER=async r=>{typeof r.delayAfterMs=="number"&&r.delayAfterMs>0&&await new Promise(e=>setTimeout(e,r.delayAfterMs))},kl=async r=>{var u;const{stepsById:e,tabId:t,stopBeforeStepId:n,skipRepeatStepIds:s,executeBlock:a}=r;let{currentId:i,context:o}=r;const c=[];for(;i&&i!==n;){const l=e.get(i);if(!l)break;if(console.log("step",l),((u=l.repeat)==null?void 0:u.scope)==="subtree"&&!(s!=null&&s.has(l.id))){const f=await SR({step:l,repeatConfig:l.repeat,context:o,stepsById:e,tabId:t,executeBlock:a,inheritedSkipSet:s});c.push(...f.results),o=f.context,i=f.nextStepId;continue}const d=await vR(l,o,a,t);console.log("stepResult",d),c.push(d),o=d.context;const h=TR(l,d.success,o);h&&!d.skipped&&await ER(l),i=h}return{results:c,context:o,nextStepId:i}},SR=async r=>{var f;const{step:e,repeatConfig:t,stepsById:n,tabId:s,executeBlock:a,inheritedSkipSet:i}=r;if(!t.subtreeEnd)throw new Error(`subtree repeat requires 'subtreeEnd' on step ${e.id}`);let o=r.context;const c=[],u=[],l=[],{items:d,isForEach:h}=hb(t,o);for(let p=0;p<d.length;p++){const m=d[p];o=h?ob(o,m,p,d.length):cb(o,p,d.length);try{const g=new Set(i??[]);g.add(e.id);const w=await kl({currentId:e.id,context:o,stepsById:n,tabId:s,executeBlock:a,stopBeforeStepId:t.subtreeEnd,skipRepeatStepIds:g});c.push(...w.results),o=w.context;const _=w.results.every(y=>y.success||y.skipped);if(u.push({index:p,success:_,steps:w.results.map(y=>({stepId:y.stepId,success:y.success,skipped:y.skipped,message:y.message,result:y.result}))}),!_&&(l.push({index:p,message:((f=w.results.find(y=>!y.success))==null?void 0:f.message)||"Subtree iteration failed"}),!t.continueOnError))return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})}catch(g){if(l.push({index:p,message:(g==null?void 0:g.message)||"Subtree iteration threw error"}),!t.continueOnError)return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})}t.delayBetween&&p<d.length-1&&await new Promise(g=>setTimeout(g,t.delayBetween))}return o=Nn(o),ku({step:e,repeatConfig:t,aggregatedResults:c,iterationSummaries:u,errors:l,totalIterations:d.length,context:o})},ku=r=>{const{step:e,repeatConfig:t,aggregatedResults:n,iterationSummaries:s,errors:a,totalIterations:i}=r,o={hasError:a.length>0&&!t.continueOnError,message:a.length>0?`Subtree repeat completed with ${a.length} error(s) out of ${i}`:`Subtree repeat completed ${i} iteration(s)`,data:{iterations:s,errors:a}},c=ib(r.context,e.id,{result:o,success:!o.hasError,skipped:i===0}),u=xR(n,e.id);if(u>=0){const l={...n[u],result:o,success:!o.hasError,message:o.message};l.context=c,n[u]=l}else{const l=new Date().toISOString(),d={stepId:e.id,skipped:i===0,success:!o.hasError,message:o.message,result:o,startedAt:l,finishedAt:l,attempts:0};d.context=c,n.push(d)}return{results:n,context:c,nextStepId:t.subtreeEnd}},xR=(r,e)=>{for(let t=r.length-1;t>=0;t--)if(r[t].stepId===e)return t;return-1};class IR{constructor(e,t,n){this.executeBlock=e,this.createTab=t,this.executeWithHooks=n}async run(e,t,n=!1,s,a){let i=wm();e.vars&&(i=bm(i,e.vars)),console.log("context",e.vars),console.log("targetUrl",t),console.log(i);const o=typeof t=="string"?Yi(t,i):t;console.log("resolvedTargetUrl",o);const c=await this.createTab(o,n,s);return this.executeWithHooks(c,async()=>{const u=new Map(e.steps.map(h=>[h.id,h])),{results:l,context:d}=await kl({currentId:e.start,context:i,stepsById:u,tabId:c,executeBlock:this.executeBlock});return{steps:l,tabId:c,context:d}},e.workflowType,a)}async runInExistingTab(e,t,n){let s=wm();return e.vars&&(s=bm(s,e.vars)),this.executeWithHooks(t,async()=>{const a=new Map(e.steps.map(c=>[c.id,c])),{results:i,context:o}=await kl({currentId:e.start,context:s,stepsById:a,tabId:t,executeBlock:this.executeBlock});return{steps:i,tabId:t,context:o}},e.workflowType,n)}}class OR{constructor(e){b(this,"workflowRunner");b(this,"statusController");b(this,"sideModalController");b(this,"lastWorkflowResults",new Map);b(this,"lastWorkflowRequests",new Map);b(this,"workspacePromises",new Map);this.tabManager=e;const t=(a,i)=>this.tabManager.executeBlock(a,i),n=async(a,i,o)=>{const c=await this.tabManager.createTab(a,i,void 0,void 0,o);if(c.id===void 0)throw new Error("Failed to create tab or tab ID is missing");return c.id};this.statusController={show:(a,i)=>this.tabManager.showExecutionStatus(a,i),hide:a=>this.tabManager.hideExecutionStatus(a)},this.sideModalController={show:a=>this.tabManager.showSideModal(a),hide:a=>this.tabManager.hideSideModal(a),open:a=>this.tabManager.openSideModal(a),close:a=>this.tabManager.closeSideModal(a),setWorkspaces:(a,i)=>this.tabManager.setWorkspaces(a,i),updateSiteInfo:(a,i,o)=>this.tabManager.updateSideModalSiteInfo(a,i,o),setLoginStatus:(a,i)=>this.tabManager.setSideModalLoginStatus(a,i),isOpen:a=>this.tabManager.isSideModalOpen(a)};const s=async(a,i,o,c)=>{try{if(o==="getWorkspaces"){const u=await i();console.log("=== WORKFLOW RESULT ==="),console.log("Full result:",u),console.log("Last step:",u.steps[u.steps.length-1]),console.log("Last step result:",u.steps[u.steps.length-1].result);let l=[];const d=f=>{if(!Array.isArray(f)||f.length===0)return!0;const p=f[0];return typeof p=="object"&&p!==null&&"id"in p&&"name"in p&&typeof p.id=="string"&&typeof p.name=="string"&&!("url"in p&&"method"in p&&"status"in p)};for(let f=u.steps.length-1;f>=0;f--){const p=u.steps[f];if(p.success&&p.result){if(Array.isArray(p.result)&&d(p.result)){l=p.result,console.log(`Found workspaces in step ${f} (array):`,l);break}else if(p.result.data&&Array.isArray(p.result.data)&&d(p.result.data)){l=p.result.data,console.log(`Found workspaces in step ${f} (result.data):`,l);break}else if(typeof p.result=="object"&&p.result!==null&&p.result.workspaces&&Array.isArray(p.result.workspaces)&&d(p.result.workspaces)){l=p.result.workspaces,console.log(`Found workspaces in step ${f} (result.workspaces):`,l);break}}}return console.log("Final extracted workspaces:",l),this.lastWorkflowResults.set(a,u),this.lastWorkflowRequests.set(a,c||{}),this.workspacePromises.get(a)?u:(await this.sideModalController.setWorkspaces(a,l),await this.sideModalController.show(a),new Promise((f,p)=>{this.workspacePromises.set(a,{resolve:()=>{const m=this.lastWorkflowResults.get(a)||u;f(m)},reject:p})}))}else return await this.statusController.show(a,"워크플로우 실행 중"),await i()}finally{o!=="getWorkspaces"&&await this.statusController.hide(a)}};this.workflowRunner=new IR(t,n,s)}async handleCollectWorkflow(e,t){const n=this.validateRequest(e);if(!n.success){t({$isError:!0,message:n.error,data:{}});return}let s;try{console.log("[WorkflowService] Running workflow for:",e.targetUrl);const a=await this.workflowRunner.run(e.workflow,e.targetUrl,e.activateTab===!0,e.originTabId,e);s=a.tabId;const i={steps:a.context.stepContext.steps,vars:a.context.varContext.vars,forEach:a.context.loopContext.forEach,loop:a.context.loopContext.loop};t({success:!0,targetUrl:e.targetUrl,tabId:a.tabId,result:{steps:a.steps,context:i},timestamp:new Date().toISOString(),closeTabAfterCollection:e.closeTabAfterCollection!==!1});const o=e.closeTabAfterCollection!==!1;s!==void 0&&o&&await this.cleanup(s)}catch(a){console.error("[WorkflowService] Workflow execution error:",a),t({$isError:!0,message:a instanceof Error?a.message:"Workflow execution failed",data:{}})}}validateRequest(e){return e.targetUrl?e.workflow?{success:!0}:{success:!1,error:"Workflow is required"}:{success:!1,error:"Target URL is required for workflow"}}async cleanup(e){console.log("[WorkflowService] Cleanup - closing tab:",e),await new Promise(t=>setTimeout(t,1e3)),await this.tabManager.closeTab(e)}async completeWorkspaceSelection(e){console.log("[WorkflowService] Completing workspace selection for tab:",e);const t=this.workspacePromises.get(e);console.log("[WorkflowService] Promise:",t),console.log("[WorkflowService] Last workflow results:",this.lastWorkflowResults.get(e)),t&&(t.resolve(this.lastWorkflowResults.get(e)||{}),this.workspacePromises.delete(e)),await this.sideModalController.hide(e),this.lastWorkflowResults.delete(e),this.lastWorkflowRequests.delete(e)}async refreshWorkspaceWorkflow(e){const t=this.lastWorkflowRequests.get(e);if(t){console.log("[WorkflowService] Refreshing workspace workflow for tab:",e);try{const[n]=await Promise.all([this.workflowRunner.runInExistingTab(t.workflow,e,t),new Promise(i=>{setTimeout(()=>{i(void 0)},2e3)})]);this.lastWorkflowResults.set(e,n),console.log("[WorkflowService] Refresh complete, new result:",n),console.log("[WorkflowService] Refresh result.steps:",n.steps);let s=[];const a=i=>{if(!Array.isArray(i)||i.length===0)return!0;const o=i[0];return typeof o=="object"&&o!==null&&"id"in o&&"name"in o&&typeof o.id=="string"&&typeof o.name=="string"&&!("url"in o&&"method"in o&&"status"in o)};for(let i=n.steps.length-1;i>=0;i--){const o=n.steps[i];if(o.success&&o.result){if(Array.isArray(o.result)&&a(o.result)){s=o.result,console.log(`[Refresh] Found workspaces in step ${i} (array):`,s);break}else if(o.result.data&&Array.isArray(o.result.data)&&a(o.result.data)){s=o.result.data,console.log(`[Refresh] Found workspaces in step ${i} (result.data):`,s);break}else if(typeof o.result=="object"&&o.result!==null&&o.result.workspaces&&Array.isArray(o.result.workspaces)&&a(o.result.workspaces)){s=o.result.workspaces,console.log(`[Refresh] Found workspaces in step ${i} (result.workspaces):`,s);break}}}console.log("[Refresh] Final extracted workspaces:",s),await this.sideModalController.setWorkspaces(e,s),console.log("[WorkflowService] Updated workspaces after refresh")}catch(n){console.error("[WorkflowService] Failed to refresh workflow:",n)}}}}class kR{async handleRequest(e,t){try{console.log("[ApiService] Handle API request:",e.url),e.body&&console.log("requestData.body",e.body);const n=await this.fetchData(e);t({success:!0,data:n})}catch(n){console.error("[ApiService] API request error:",n),t({$isError:!0,message:n instanceof Error?n.message:"Unknown error in API request",data:null})}}async fetchData(e){const{url:t,method:n,headers:s,body:a,timeout:i,parseJson:o,returnHeaders:c}=e;console.log(`[ApiService] Fetching ${n} ${t}`);const u=new AbortController,l=setTimeout(()=>u.abort(),i);try{const d={method:n,headers:s,signal:u.signal};a&&!["GET","HEAD"].includes(n)&&(typeof a=="string"?d.body=a:(d.body=JSON.stringify(a),!s["Content-Type"]&&!s["content-type"]&&(d.headers={...s,"Content-Type":"application/json"})));const h=await fetch(t,d);clearTimeout(l);let f;const p=h.headers.get("content-type")||"";if(o&&p.includes("application/json"))try{f=await h.json()}catch{f=await h.text()}else f=await h.text();let m;c&&(m={},h.headers.forEach((w,_)=>{m[_]=w}));const g={status:h.status,statusText:h.statusText,data:f,headers:m};return console.log(`[ApiService] Response status: ${h.status}`),g}catch(d){throw clearTimeout(l),d instanceof Error&&d.name==="AbortError"?new Error(`Request timeout after ${i}ms`):d}}}function AR(r){return JSON.stringify(r,null,2)}function CR(r,e){const t=(e==null?void 0:e.delimiter)||",",n=(e==null?void 0:e.includeHeaders)!==!1,s=Array.isArray(r)?r:[r];if(s.length===0)return"";const a=new Set;s.forEach(c=>{typeof c=="object"&&c!==null&&Object.keys(c).forEach(u=>a.add(u))});const i=Array.from(a),o=[];return n&&i.length>0&&o.push(i.map(c=>Au(c,t)).join(t)),s.forEach(c=>{if(typeof c=="object"&&c!==null){const u=i.map(l=>{const d=c[l];return Au(d,t)});o.push(u.join(t))}else o.push(Au(c,t))}),o.join(`
|
|
264
264
|
`)}function Au(r,e){if(r==null)return"";let t=String(r);return(t.includes(e)||t.includes('"')||t.includes(`
|
|
265
265
|
`)||t.includes("\r"))&&(t='"'+t.replace(/"/g,'""')+'"'),t}function RR(r){const e=Array.isArray(r)?r:[r];if(e.length===0)return vm([]);const t=new Set;e.forEach(a=>{typeof a=="object"&&a!==null&&Object.keys(a).forEach(i=>t.add(i))});const n=Array.from(t),s=[];return n.length>0&&s.push(n),e.forEach(a=>{if(typeof a=="object"&&a!==null){const i=n.map(o=>a[o]);s.push(i)}else s.push([a])}),vm(s)}function vm(r){return`<?xml version="1.0"?>
|
|
266
266
|
<?mso-application progid="Excel.Sheet"?>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-
|
|
2
|
-
import{r as z,j as t,c as j}from"./client-D3QgHmk0.js";import{i as D,a as U,b as B,c as N,d as F,e as P,f as q}from"./internal-messages-qAjUU64a.js";import{r as m,g as M,a as L,b as G}from"./index-KU1_HfMi.js";const $="modulepreload",K=function(a){return"/"+a},_={},I=function(e,n,r){let i=Promise.resolve();if(n&&n.length>0){let l=function(d){return Promise.all(d.map(f=>Promise.resolve(f).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),c=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));i=l(n.map(d=>{if(d=K(d),d in _)return;_[d]=!0;const f=d.endsWith(".css"),y=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${y}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":$,f||(h.as="script"),h.crossOrigin="",h.href=d,c&&h.setAttribute("nonce",c),document.head.appendChild(h),f)return new Promise((x,b)=>{h.addEventListener("load",x),h.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${d}`)))})}))}function p(l){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=l,window.dispatchEvent(s),!s.defaultPrevented)throw l}return i.then(l=>{for(const s of l||[])s.status==="rejected"&&p(s.reason);return e().catch(p)})};class Y{async sendToBackground(e){return new Promise((n,r)=>{chrome.runtime.sendMessage(e,i=>{chrome.runtime.lastError?r(new Error(chrome.runtime.lastError.message||"Communication error")):D(i)?r(new Error(i.message)):n(i)})})}async executeBlock(e){const{BlockHandler:n}=await I(async()=>{const{BlockHandler:i}=await import("./index-BvGKNGub.js");return{BlockHandler:i}},__vite__mapDeps([0,1,2])),{synchronizedLock:r}=await I(async()=>{const{synchronizedLock:i}=await import("./index-CYVwV_2L.js");return{synchronizedLock:i}},[]);await r.getLock();try{return await n.executeBlock(e)}finally{r.releaseLock()}}async handleRuntimeMessage(e){if(e!=null&&e.isBlock&&(e==null?void 0:e.type)==="EXECUTE_BLOCK")try{return await this.executeBlock(e.data)}catch(n){return{$isError:!0,message:n instanceof Error?n.message:"Unknown error",data:{}}}throw new Error("Invalid message type")}sendToWebpage(e){window.postMessage(e,"*")}createErrorResponse(e,n){return{type:"8G_COLLECT_RESPONSE",requestId:e,success:!1,result:{error:n instanceof Error?n.message:"Unknown error",timestamp:new Date().toISOString()}}}createSuccessResponse(e,n){return{type:"8G_COLLECT_RESPONSE",requestId:e,success:!0,result:n}}}class X{constructor(e){this.kernel=e}initializeMessageListener(){chrome.runtime.onMessage.addListener((e,n,r)=>{if(U(e))return this.kernel.handleRuntimeMessage(e).then(i=>r(i)).catch(i=>r(this.kernel.createErrorResponse("",i))),!0;if(B(e))return console.log("[InternalMessageHandler] Show execution status:",e.data),window.dispatchEvent(new CustomEvent("8g-show-execution-status",{detail:{message:e.data.message||"워크플로우 실행 중",statusType:e.data.statusType||"loading",icon:e.data.icon||"default"}})),r({success:!0}),!1;if(N(e))return console.log("[InternalMessageHandler] Hide execution status"),window.dispatchEvent(new CustomEvent("8g-hide-execution-status")),window.dispatchEvent(new CustomEvent("8g-hide-execution-status")),r({success:!0}),!1;if(F(e)){console.log("[InternalMessageHandler] Show confirmation:",e.data);const{message:i,buttonText:p,variant:l="default",icon:s="alert",showClose:c=!0,parentTabId:d}=e.data,f=p&&d?()=>{console.log("[InternalMessageHandler] User confirmed, closing tab and focusing parent:",d),chrome.runtime.sendMessage({type:"CLOSE_TAB_AND_FOCUS_PARENT",data:{parentTabId:d}}),window.dispatchEvent(new CustomEvent("8g-hide-execution-status"))}:void 0,y=()=>{console.log("[InternalMessageHandler] User closed confirmation UI"),window.dispatchEvent(new CustomEvent("8g-hide-execution-status"))};return window.dispatchEvent(new CustomEvent("8g-show-execution-status",{detail:{message:i,buttonText:p,variant:l,icon:s,showClose:c,onConfirm:f,onClose:y}})),r({success:!0}),!1}if(P(e)){console.log("[InternalMessageHandler] Close tab message received");const{parentTabId:i}=e.data;return chrome.runtime.sendMessage({type:"CLOSE_TAB_AND_FOCUS_PARENT",data:{parentTabId:i}}),r({success:!0}),!1}if(q(e))return console.log("[InternalMessageHandler] Trigger confirmation message received"),window.dispatchEvent(new CustomEvent("8g-trigger-confirmation")),r({success:!0}),!1;if(e.type==="SHOW_SIDE_MODAL")return console.log("[InternalMessageHandler] Show side modal with data:",e.data),window.dispatchEvent(new CustomEvent("8g-mount-side-modal")),setTimeout(()=>{window.dispatchEvent(new CustomEvent("8g-show-side-modal",{detail:e.data}))},50),r({success:!0}),!1;if(e.type==="HIDE_SIDE_MODAL")return console.log("[InternalMessageHandler] Hide side modal"),window.dispatchEvent(new CustomEvent("8g-hide-side-modal")),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_WORKSPACES")return console.log("[InternalMessageHandler] Update side modal workspaces:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-workspaces",{detail:e.data})),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_SITE_INFO")return console.log("[InternalMessageHandler] Update side modal site info:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-site-info",{detail:e.data})),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_LOGIN_STATUS")return console.log("[InternalMessageHandler] Update side modal login status:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-login-status",{detail:e.data})),r({success:!0}),!1;if(e.type==="GET_SIDE_MODAL_STATUS"){console.log("[InternalMessageHandler] Get side modal status");let i=!1;const p=l=>{i||(i=!0,r(l))};return window.dispatchEvent(new CustomEvent("8g-get-side-modal-status",{detail:{callback:p}})),setTimeout(()=>{i||(i=!0,r({isOpen:!1}))},2e3),!0}if(e.type==="GET_SIDE_MODAL_DATA")return console.log("[InternalMessageHandler] Get side modal data"),chrome.runtime.sendMessage({type:"GET_SIDE_MODAL_DATA"}).then(i=>r(i)).catch(i=>{console.warn("Failed to get side modal data from background:",i),r({workspaces:[]})}),!0;if(e.type==="CHECK_STATUS_DISMISSED"){const{notificationId:i,message:p}=e.payload||{};return window.dispatchEvent(new CustomEvent("8g-notification-dismissed",{detail:{notificationId:i,message:p}})),r({success:!0}),!1}if(e.type==="GET_ACCOUNT_INFO"){console.log("[InternalMessageHandler] Get account info message received");const i=this.extractAccountInfo();return r(i),!1}return!1})}extractAccountInfo(){const e=document.querySelector("[data-email]")||document.querySelector(".user-email")||document.querySelector('input[type="email"][disabled]'),n=document.querySelector("[data-name]")||document.querySelector(".user-name")||document.querySelector(".profile-name");return{email:(e==null?void 0:e.textContent)||(e==null?void 0:e.value)||null,name:(n==null?void 0:n.textContent)||null}}}class V{constructor(e){this.kernel=e}initializeMessageListener(){window.addEventListener("message",this.handleWindowMessage.bind(this))}async handleWindowMessage(e){if(e.source!==window)return;const n=e.data;switch(n.type){case"8G_EXTENSION_CHECK":this.handleExtensionCheck();break;case"8G_COLLECT_WORKFLOW":await this.handleCollectWorkflow(n);break}}handleExtensionCheck(){const e={type:"8G_EXTENSION_RESPONSE",installed:!0,version:"1.0.0"};this.kernel.sendToWebpage(e)}async handleCollectWorkflow(e){try{this.validateCollectWorkflowMessage(e);const n={type:"COLLECT_WORKFLOW_NEW_TAB",data:{targetUrl:e.targetUrl,workflow:e.workflow,closeTabAfterCollection:e.closeTabAfterCollection!==!1,activateTab:e.activateTab===!0}};try{const r=await this.kernel.sendToBackground(n),i=this.kernel.createSuccessResponse(e.requestId,r);this.kernel.sendToWebpage(i)}catch(r){const i=this.kernel.createErrorResponse(e.requestId,r);this.kernel.sendToWebpage(i)}}catch(n){const r=this.kernel.createErrorResponse(e.requestId,n);this.kernel.sendToWebpage(r)}}validateCollectWorkflowMessage(e){if(!e.targetUrl)throw new Error("Target URL is required");if(!e.workflow)throw new Error("Workflow is required");if(!e.workflow.start||!Array.isArray(e.workflow.steps))throw new Error("Workflow must have start and steps")}}var J=z();function Q({visible:a}){const[e,n]=m.useState(!1),r=s=>{try{return M(s,L())}catch(c){return console.warn("Translation failed:",s,c),s}};if(m.useEffect(()=>{a?setTimeout(()=>n(!0),10):n(!1)},[a]),!a)return null;const i={position:"fixed",left:0,right:0,top:0,zIndex:2147483647,backgroundColor:"#10b981",boxShadow:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)",pointerEvents:"auto",transform:e?"translateY(0)":"translateY(-100%)",opacity:e?1:0,transition:"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1)"},p={maxWidth:"100%",margin:"0 auto",padding:"16px",display:"flex",alignItems:"center",justifyContent:"center",gap:"16px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'},l={margin:0,fontSize:"14px",lineHeight:"1.5",color:"#ffffff",fontWeight:500};return J.createPortal(t.jsx("div",{style:i,onClick:s=>s.stopPropagation(),children:t.jsxs("div",{style:p,children:[t.jsx("div",{style:{flexShrink:0,color:"#ffffff"},children:t.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[t.jsx("circle",{cx:"12",cy:"12",r:"10"}),t.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),t.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]})}),t.jsx("p",{style:l,children:r("ui.workflow.executing")})]})}),document.body)}function Z(){const[a,e]=m.useState(!1);return m.useEffect(()=>{const n=()=>e(!0),r=()=>e(!1);return window.addEventListener("8g-show-execution-status",n),window.addEventListener("8g-hide-execution-status",r),()=>{window.removeEventListener("8g-show-execution-status",n),window.removeEventListener("8g-hide-execution-status",r)}},[]),t.jsx(Q,{visible:a})}const E=({workspace:a,isLast:e})=>{const n=a.isAdmin===!1;return t.jsx("div",{style:{background:"white",padding:"0.7rem 1rem",borderRadius:"0.5rem",border:n?"1px solid #f87171":"1px solid #10b981",marginBottom:e?"0":"0.5rem",opacity:n?.4:1,boxShadow:"0 1px 3px rgba(0, 0, 0, 0.1)",cursor:"default"},children:t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[t.jsx("div",{style:{width:"2rem",height:"2rem",borderRadius:"0.375rem",flexShrink:0,overflow:"hidden",background:a.image?"transparent":"#f3f4f6",display:"flex",alignItems:"center",justifyContent:"center",border:"1px solid #e5e7eb"},children:a.image?t.jsx("img",{src:a.image,alt:"workspace",style:{width:"100%",height:"100%",objectFit:"cover"},onError:r=>{const i=r.currentTarget.parentElement;i.style.background="#f3f4f6",i.innerHTML=`
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-FDAaFujh.js","assets/types-DYwoIzUt.js","assets/index-KU1_HfMi.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as z,j as t,c as j}from"./client-D3QgHmk0.js";import{i as D,a as U,b as B,c as N,d as F,e as P,f as q}from"./internal-messages-qAjUU64a.js";import{r as m,g as M,a as L,b as G}from"./index-KU1_HfMi.js";const $="modulepreload",K=function(a){return"/"+a},_={},I=function(e,n,r){let i=Promise.resolve();if(n&&n.length>0){let l=function(d){return Promise.all(d.map(f=>Promise.resolve(f).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),c=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));i=l(n.map(d=>{if(d=K(d),d in _)return;_[d]=!0;const f=d.endsWith(".css"),y=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${y}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":$,f||(h.as="script"),h.crossOrigin="",h.href=d,c&&h.setAttribute("nonce",c),document.head.appendChild(h),f)return new Promise((x,b)=>{h.addEventListener("load",x),h.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${d}`)))})}))}function p(l){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=l,window.dispatchEvent(s),!s.defaultPrevented)throw l}return i.then(l=>{for(const s of l||[])s.status==="rejected"&&p(s.reason);return e().catch(p)})};class Y{async sendToBackground(e){return new Promise((n,r)=>{chrome.runtime.sendMessage(e,i=>{chrome.runtime.lastError?r(new Error(chrome.runtime.lastError.message||"Communication error")):D(i)?r(new Error(i.message)):n(i)})})}async executeBlock(e){const{BlockHandler:n}=await I(async()=>{const{BlockHandler:i}=await import("./index-FDAaFujh.js");return{BlockHandler:i}},__vite__mapDeps([0,1,2])),{synchronizedLock:r}=await I(async()=>{const{synchronizedLock:i}=await import("./index-CYVwV_2L.js");return{synchronizedLock:i}},[]);await r.getLock();try{return await n.executeBlock(e)}finally{r.releaseLock()}}async handleRuntimeMessage(e){if(e!=null&&e.isBlock&&(e==null?void 0:e.type)==="EXECUTE_BLOCK")try{return await this.executeBlock(e.data)}catch(n){return{$isError:!0,message:n instanceof Error?n.message:"Unknown error",data:{}}}throw new Error("Invalid message type")}sendToWebpage(e){window.postMessage(e,"*")}createErrorResponse(e,n){return{type:"8G_COLLECT_RESPONSE",requestId:e,success:!1,result:{error:n instanceof Error?n.message:"Unknown error",timestamp:new Date().toISOString()}}}createSuccessResponse(e,n){return{type:"8G_COLLECT_RESPONSE",requestId:e,success:!0,result:n}}}class X{constructor(e){this.kernel=e}initializeMessageListener(){chrome.runtime.onMessage.addListener((e,n,r)=>{if(U(e))return this.kernel.handleRuntimeMessage(e).then(i=>r(i)).catch(i=>r(this.kernel.createErrorResponse("",i))),!0;if(B(e))return console.log("[InternalMessageHandler] Show execution status:",e.data),window.dispatchEvent(new CustomEvent("8g-show-execution-status",{detail:{message:e.data.message||"워크플로우 실행 중",statusType:e.data.statusType||"loading",icon:e.data.icon||"default"}})),r({success:!0}),!1;if(N(e))return console.log("[InternalMessageHandler] Hide execution status"),window.dispatchEvent(new CustomEvent("8g-hide-execution-status")),window.dispatchEvent(new CustomEvent("8g-hide-execution-status")),r({success:!0}),!1;if(F(e)){console.log("[InternalMessageHandler] Show confirmation:",e.data);const{message:i,buttonText:p,variant:l="default",icon:s="alert",showClose:c=!0,parentTabId:d}=e.data,f=p&&d?()=>{console.log("[InternalMessageHandler] User confirmed, closing tab and focusing parent:",d),chrome.runtime.sendMessage({type:"CLOSE_TAB_AND_FOCUS_PARENT",data:{parentTabId:d}}),window.dispatchEvent(new CustomEvent("8g-hide-execution-status"))}:void 0,y=()=>{console.log("[InternalMessageHandler] User closed confirmation UI"),window.dispatchEvent(new CustomEvent("8g-hide-execution-status"))};return window.dispatchEvent(new CustomEvent("8g-show-execution-status",{detail:{message:i,buttonText:p,variant:l,icon:s,showClose:c,onConfirm:f,onClose:y}})),r({success:!0}),!1}if(P(e)){console.log("[InternalMessageHandler] Close tab message received");const{parentTabId:i}=e.data;return chrome.runtime.sendMessage({type:"CLOSE_TAB_AND_FOCUS_PARENT",data:{parentTabId:i}}),r({success:!0}),!1}if(q(e))return console.log("[InternalMessageHandler] Trigger confirmation message received"),window.dispatchEvent(new CustomEvent("8g-trigger-confirmation")),r({success:!0}),!1;if(e.type==="SHOW_SIDE_MODAL")return console.log("[InternalMessageHandler] Show side modal with data:",e.data),window.dispatchEvent(new CustomEvent("8g-mount-side-modal")),setTimeout(()=>{window.dispatchEvent(new CustomEvent("8g-show-side-modal",{detail:e.data}))},50),r({success:!0}),!1;if(e.type==="HIDE_SIDE_MODAL")return console.log("[InternalMessageHandler] Hide side modal"),window.dispatchEvent(new CustomEvent("8g-hide-side-modal")),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_WORKSPACES")return console.log("[InternalMessageHandler] Update side modal workspaces:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-workspaces",{detail:e.data})),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_SITE_INFO")return console.log("[InternalMessageHandler] Update side modal site info:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-site-info",{detail:e.data})),r({success:!0}),!1;if(e.type==="UPDATE_SIDE_MODAL_LOGIN_STATUS")return console.log("[InternalMessageHandler] Update side modal login status:",e.data),window.dispatchEvent(new CustomEvent("8g-update-side-modal-login-status",{detail:e.data})),r({success:!0}),!1;if(e.type==="GET_SIDE_MODAL_STATUS"){console.log("[InternalMessageHandler] Get side modal status");let i=!1;const p=l=>{i||(i=!0,r(l))};return window.dispatchEvent(new CustomEvent("8g-get-side-modal-status",{detail:{callback:p}})),setTimeout(()=>{i||(i=!0,r({isOpen:!1}))},2e3),!0}if(e.type==="GET_SIDE_MODAL_DATA")return console.log("[InternalMessageHandler] Get side modal data"),chrome.runtime.sendMessage({type:"GET_SIDE_MODAL_DATA"}).then(i=>r(i)).catch(i=>{console.warn("Failed to get side modal data from background:",i),r({workspaces:[]})}),!0;if(e.type==="CHECK_STATUS_DISMISSED"){const{notificationId:i,message:p}=e.payload||{};return window.dispatchEvent(new CustomEvent("8g-notification-dismissed",{detail:{notificationId:i,message:p}})),r({success:!0}),!1}if(e.type==="GET_ACCOUNT_INFO"){console.log("[InternalMessageHandler] Get account info message received");const i=this.extractAccountInfo();return r(i),!1}return!1})}extractAccountInfo(){const e=document.querySelector("[data-email]")||document.querySelector(".user-email")||document.querySelector('input[type="email"][disabled]'),n=document.querySelector("[data-name]")||document.querySelector(".user-name")||document.querySelector(".profile-name");return{email:(e==null?void 0:e.textContent)||(e==null?void 0:e.value)||null,name:(n==null?void 0:n.textContent)||null}}}class V{constructor(e){this.kernel=e}initializeMessageListener(){window.addEventListener("message",this.handleWindowMessage.bind(this))}async handleWindowMessage(e){if(e.source!==window)return;const n=e.data;switch(n.type){case"8G_EXTENSION_CHECK":this.handleExtensionCheck();break;case"8G_COLLECT_WORKFLOW":await this.handleCollectWorkflow(n);break}}handleExtensionCheck(){const e={type:"8G_EXTENSION_RESPONSE",installed:!0,version:"1.0.0"};this.kernel.sendToWebpage(e)}async handleCollectWorkflow(e){try{this.validateCollectWorkflowMessage(e);const n={type:"COLLECT_WORKFLOW_NEW_TAB",data:{targetUrl:e.targetUrl,workflow:e.workflow,closeTabAfterCollection:e.closeTabAfterCollection!==!1,activateTab:e.activateTab===!0}};try{const r=await this.kernel.sendToBackground(n),i=this.kernel.createSuccessResponse(e.requestId,r);this.kernel.sendToWebpage(i)}catch(r){const i=this.kernel.createErrorResponse(e.requestId,r);this.kernel.sendToWebpage(i)}}catch(n){const r=this.kernel.createErrorResponse(e.requestId,n);this.kernel.sendToWebpage(r)}}validateCollectWorkflowMessage(e){if(!e.targetUrl)throw new Error("Target URL is required");if(!e.workflow)throw new Error("Workflow is required");if(!e.workflow.start||!Array.isArray(e.workflow.steps))throw new Error("Workflow must have start and steps")}}var J=z();function Q({visible:a}){const[e,n]=m.useState(!1),r=s=>{try{return M(s,L())}catch(c){return console.warn("Translation failed:",s,c),s}};if(m.useEffect(()=>{a?setTimeout(()=>n(!0),10):n(!1)},[a]),!a)return null;const i={position:"fixed",left:0,right:0,top:0,zIndex:2147483647,backgroundColor:"#10b981",boxShadow:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)",pointerEvents:"auto",transform:e?"translateY(0)":"translateY(-100%)",opacity:e?1:0,transition:"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1)"},p={maxWidth:"100%",margin:"0 auto",padding:"16px",display:"flex",alignItems:"center",justifyContent:"center",gap:"16px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'},l={margin:0,fontSize:"14px",lineHeight:"1.5",color:"#ffffff",fontWeight:500};return J.createPortal(t.jsx("div",{style:i,onClick:s=>s.stopPropagation(),children:t.jsxs("div",{style:p,children:[t.jsx("div",{style:{flexShrink:0,color:"#ffffff"},children:t.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[t.jsx("circle",{cx:"12",cy:"12",r:"10"}),t.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),t.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]})}),t.jsx("p",{style:l,children:r("ui.workflow.executing")})]})}),document.body)}function Z(){const[a,e]=m.useState(!1);return m.useEffect(()=>{const n=()=>e(!0),r=()=>e(!1);return window.addEventListener("8g-show-execution-status",n),window.addEventListener("8g-hide-execution-status",r),()=>{window.removeEventListener("8g-show-execution-status",n),window.removeEventListener("8g-hide-execution-status",r)}},[]),t.jsx(Q,{visible:a})}const E=({workspace:a,isLast:e})=>{const n=a.isAdmin===!1;return t.jsx("div",{style:{background:"white",padding:"0.7rem 1rem",borderRadius:"0.5rem",border:n?"1px solid #f87171":"1px solid #10b981",marginBottom:e?"0":"0.5rem",opacity:n?.4:1,boxShadow:"0 1px 3px rgba(0, 0, 0, 0.1)",cursor:"default"},children:t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[t.jsx("div",{style:{width:"2rem",height:"2rem",borderRadius:"0.375rem",flexShrink:0,overflow:"hidden",background:a.image?"transparent":"#f3f4f6",display:"flex",alignItems:"center",justifyContent:"center",border:"1px solid #e5e7eb"},children:a.image?t.jsx("img",{src:a.image,alt:"workspace",style:{width:"100%",height:"100%",objectFit:"cover"},onError:r=>{const i=r.currentTarget.parentElement;i.style.background="#f3f4f6",i.innerHTML=`
|
|
3
3
|
<div style="
|
|
4
4
|
font-size: 14px;
|
|
5
5
|
color: #6b7280;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
(async () => {
|
|
6
6
|
const { onExecute } = await import(
|
|
7
7
|
/* @vite-ignore */
|
|
8
|
-
chrome.runtime.getURL("assets/main.tsx-
|
|
8
|
+
chrome.runtime.getURL("assets/main.tsx-BZwGPGRu.js")
|
|
9
9
|
);
|
|
10
10
|
onExecute?.({ perf: { injectTime, loadTime: performance.now() - injectTime } });
|
|
11
11
|
})().catch(console.error);
|