@sqaitech/playground 0.30.10
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/es/adapters/base.mjs +131 -0
- package/dist/es/adapters/base.mjs.map +1 -0
- package/dist/es/adapters/local-execution.mjs +140 -0
- package/dist/es/adapters/local-execution.mjs.map +1 -0
- package/dist/es/adapters/remote-execution.mjs +308 -0
- package/dist/es/adapters/remote-execution.mjs.map +1 -0
- package/dist/es/common.mjs +148 -0
- package/dist/es/common.mjs.map +1 -0
- package/dist/es/index.browser.mjs +9 -0
- package/dist/es/index.browser.mjs.map +1 -0
- package/dist/es/index.mjs +8 -0
- package/dist/es/launcher.mjs +95 -0
- package/dist/es/launcher.mjs.map +1 -0
- package/dist/es/sdk/index.mjs +102 -0
- package/dist/es/sdk/index.mjs.map +1 -0
- package/dist/es/server.mjs +385 -0
- package/dist/es/server.mjs.map +1 -0
- package/dist/es/types.mjs +0 -0
- package/dist/lib/adapters/base.js +165 -0
- package/dist/lib/adapters/base.js.map +1 -0
- package/dist/lib/adapters/local-execution.js +174 -0
- package/dist/lib/adapters/local-execution.js.map +1 -0
- package/dist/lib/adapters/remote-execution.js +342 -0
- package/dist/lib/adapters/remote-execution.js.map +1 -0
- package/dist/lib/common.js +200 -0
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/index.browser.js +73 -0
- package/dist/lib/index.browser.js.map +1 -0
- package/dist/lib/index.js +77 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/launcher.js +140 -0
- package/dist/lib/launcher.js.map +1 -0
- package/dist/lib/sdk/index.js +136 -0
- package/dist/lib/sdk/index.js.map +1 -0
- package/dist/lib/server.js +435 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/types.js +20 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/types/adapters/base.d.ts +20 -0
- package/dist/types/adapters/local-execution.d.ts +31 -0
- package/dist/types/adapters/remote-execution.d.ts +38 -0
- package/dist/types/common.d.ts +9 -0
- package/dist/types/index.browser.d.ts +7 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/launcher.d.ts +97 -0
- package/dist/types/sdk/index.d.ts +31 -0
- package/dist/types/server.d.ts +75 -0
- package/dist/types/types.d.ts +49 -0
- package/package.json +51 -0
- package/static/favicon.ico +0 -0
- package/static/index.html +1 -0
- package/static/static/css/index.60c69390.css +2 -0
- package/static/static/css/index.60c69390.css.map +1 -0
- package/static/static/js/931.dc961e99.js +620 -0
- package/static/static/js/931.dc961e99.js.LICENSE.txt +146 -0
- package/static/static/js/931.dc961e99.js.map +1 -0
- package/static/static/js/async/173.9cf6b074.js +3 -0
- package/static/static/js/async/173.9cf6b074.js.map +1 -0
- package/static/static/js/async/212.e243c338.js +158 -0
- package/static/static/js/async/212.e243c338.js.map +1 -0
- package/static/static/js/async/329.f888b505.js +26 -0
- package/static/static/js/async/329.f888b505.js.map +1 -0
- package/static/static/js/async/364.1821e74b.js +30 -0
- package/static/static/js/async/364.1821e74b.js.map +1 -0
- package/static/static/js/async/544.b73fa603.js +2 -0
- package/static/static/js/async/544.b73fa603.js.map +1 -0
- package/static/static/js/async/582.5dccae2d.js +21 -0
- package/static/static/js/async/582.5dccae2d.js.map +1 -0
- package/static/static/js/async/624.45ee2b2c.js +3 -0
- package/static/static/js/async/624.45ee2b2c.js.map +1 -0
- package/static/static/js/async/644.6bdc4065.js +1 -0
- package/static/static/js/async/659.9afd03db.js +21 -0
- package/static/static/js/async/659.9afd03db.js.map +1 -0
- package/static/static/js/async/702.60261735.js +231 -0
- package/static/static/js/async/702.60261735.js.map +1 -0
- package/static/static/js/async/920.7d9a9aa8.js +2 -0
- package/static/static/js/async/920.7d9a9aa8.js.map +1 -0
- package/static/static/js/async/983.8b91303f.js +1 -0
- package/static/static/js/index.5cccbdaf.js +10 -0
- package/static/static/js/index.5cccbdaf.js.LICENSE.txt +7 -0
- package/static/static/js/index.5cccbdaf.js.map +1 -0
- package/static/static/js/index.8a10896b.js +10 -0
- package/static/static/js/index.8a10896b.js.LICENSE.txt +7 -0
- package/static/static/js/index.8a10896b.js.map +1 -0
- package/static/static/js/index.f21bb1df.js +10 -0
- package/static/static/js/index.f21bb1df.js.LICENSE.txt +7 -0
- package/static/static/js/index.f21bb1df.js.map +1 -0
- package/static/static/js/lib-react.f566a9ed.js +3 -0
- package/static/static/js/lib-react.f566a9ed.js.LICENSE.txt +39 -0
- package/static/static/js/lib-react.f566a9ed.js.map +1 -0
- package/static/static/svg/server-offline-foreground.3113df3c.svg +36 -0
- package/static/static/wasm/9e906fbf55e08f98.module.wasm +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
LocalExecutionAdapter: ()=>LocalExecutionAdapter
|
|
28
|
+
});
|
|
29
|
+
const env_namespaceObject = require("@sqaitech/shared/env");
|
|
30
|
+
const utils_namespaceObject = require("@sqaitech/shared/utils");
|
|
31
|
+
const external_common_js_namespaceObject = require("../common.js");
|
|
32
|
+
const external_base_js_namespaceObject = require("./base.js");
|
|
33
|
+
function _define_property(obj, key, value) {
|
|
34
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
35
|
+
value: value,
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true
|
|
39
|
+
});
|
|
40
|
+
else obj[key] = value;
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
class LocalExecutionAdapter extends external_base_js_namespaceObject.BasePlaygroundAdapter {
|
|
44
|
+
get id() {
|
|
45
|
+
return this._id;
|
|
46
|
+
}
|
|
47
|
+
setProgressCallback(callback) {
|
|
48
|
+
this.progressCallback = void 0;
|
|
49
|
+
this.progressCallback = callback;
|
|
50
|
+
}
|
|
51
|
+
cleanup(requestId) {
|
|
52
|
+
delete this.taskProgressTips[requestId];
|
|
53
|
+
}
|
|
54
|
+
async parseStructuredParams(action, params, options) {
|
|
55
|
+
return await (0, external_common_js_namespaceObject.parseStructuredParams)(action, params, options);
|
|
56
|
+
}
|
|
57
|
+
formatErrorMessage(error) {
|
|
58
|
+
const errorMessage = (null == error ? void 0 : error.message) || '';
|
|
59
|
+
if (errorMessage.includes('of different extension')) return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';
|
|
60
|
+
return this.formatBasicErrorMessage(error);
|
|
61
|
+
}
|
|
62
|
+
async getActionSpace(context) {
|
|
63
|
+
var _this_agent;
|
|
64
|
+
if (null == (_this_agent = this.agent) ? void 0 : _this_agent.getActionSpace) return await this.agent.getActionSpace();
|
|
65
|
+
if (this.agent && 'interface' in this.agent && 'object' == typeof this.agent.interface) {
|
|
66
|
+
const page = this.agent.interface;
|
|
67
|
+
if (null == page ? void 0 : page.actionSpace) return await page.actionSpace();
|
|
68
|
+
}
|
|
69
|
+
if (context && 'object' == typeof context && 'actionSpace' in context) {
|
|
70
|
+
const contextPage = context;
|
|
71
|
+
return await contextPage.actionSpace();
|
|
72
|
+
}
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
async checkStatus() {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
async overrideConfig(aiConfig) {
|
|
79
|
+
(0, env_namespaceObject.overrideAIConfig)(aiConfig);
|
|
80
|
+
}
|
|
81
|
+
async executeAction(actionType, value, options) {
|
|
82
|
+
const actionSpace = await this.getActionSpace();
|
|
83
|
+
let originalOnTaskStartTip;
|
|
84
|
+
if (options.requestId && this.agent) {
|
|
85
|
+
this.currentRequestId = options.requestId;
|
|
86
|
+
originalOnTaskStartTip = this.agent.onTaskStartTip;
|
|
87
|
+
this.agent.onTaskStartTip = (tip)=>{
|
|
88
|
+
if (this.currentRequestId !== options.requestId) return;
|
|
89
|
+
this.taskProgressTips[options.requestId] = tip;
|
|
90
|
+
if (this.progressCallback) this.progressCallback(tip);
|
|
91
|
+
if ('function' == typeof originalOnTaskStartTip) originalOnTaskStartTip(tip);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const result = await (0, external_common_js_namespaceObject.executeAction)(this.agent, actionType, actionSpace, value, options);
|
|
96
|
+
const response = {
|
|
97
|
+
result,
|
|
98
|
+
dump: null,
|
|
99
|
+
reportHTML: null,
|
|
100
|
+
error: null
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
if (this.agent.dumpDataString) {
|
|
104
|
+
const dumpString = this.agent.dumpDataString();
|
|
105
|
+
if (dumpString) response.dump = JSON.parse(dumpString);
|
|
106
|
+
}
|
|
107
|
+
if (this.agent.reportHTMLString) response.reportHTML = this.agent.reportHTMLString() || null;
|
|
108
|
+
if (this.agent.writeOutActionDumps) this.agent.writeOutActionDumps();
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error('Failed to get dump/reportHTML from agent:', error);
|
|
111
|
+
}
|
|
112
|
+
this.agent.resetDump();
|
|
113
|
+
return response;
|
|
114
|
+
} finally{
|
|
115
|
+
if (options.requestId) {
|
|
116
|
+
this.cleanup(options.requestId);
|
|
117
|
+
if (this.agent) this.agent.onTaskStartTip = originalOnTaskStartTip;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async getTaskProgress(requestId) {
|
|
122
|
+
return {
|
|
123
|
+
tip: this.taskProgressTips[requestId] || void 0
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async cancelTask(_requestId) {
|
|
127
|
+
if (!this.agent) return {
|
|
128
|
+
error: 'No active agent found for this requestId'
|
|
129
|
+
};
|
|
130
|
+
try {
|
|
131
|
+
var _this_agent_destroy, _this_agent;
|
|
132
|
+
await (null == (_this_agent_destroy = (_this_agent = this.agent).destroy) ? void 0 : _this_agent_destroy.call(_this_agent));
|
|
133
|
+
return {
|
|
134
|
+
success: true
|
|
135
|
+
};
|
|
136
|
+
} catch (error) {
|
|
137
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
138
|
+
console.error(`Failed to cancel agent: ${errorMessage}`);
|
|
139
|
+
return {
|
|
140
|
+
error: `Failed to cancel: ${errorMessage}`
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async getInterfaceInfo() {
|
|
145
|
+
var _this_agent;
|
|
146
|
+
if (!(null == (_this_agent = this.agent) ? void 0 : _this_agent.interface)) return null;
|
|
147
|
+
try {
|
|
148
|
+
var _this_agent_interface_describe, _this_agent_interface;
|
|
149
|
+
const type = this.agent.interface.interfaceType || 'Unknown';
|
|
150
|
+
const description = (null == (_this_agent_interface_describe = (_this_agent_interface = this.agent.interface).describe) ? void 0 : _this_agent_interface_describe.call(_this_agent_interface)) || void 0;
|
|
151
|
+
return {
|
|
152
|
+
type,
|
|
153
|
+
description
|
|
154
|
+
};
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('Failed to get interface info:', error);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
constructor(agent){
|
|
161
|
+
super(), _define_property(this, "agent", void 0), _define_property(this, "taskProgressTips", {}), _define_property(this, "progressCallback", void 0), _define_property(this, "_id", void 0), _define_property(this, "currentRequestId", void 0);
|
|
162
|
+
this.agent = agent;
|
|
163
|
+
this._id = (0, utils_namespaceObject.uuid)();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.LocalExecutionAdapter = __webpack_exports__.LocalExecutionAdapter;
|
|
167
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
168
|
+
"LocalExecutionAdapter"
|
|
169
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
170
|
+
Object.defineProperty(exports, '__esModule', {
|
|
171
|
+
value: true
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
//# sourceMappingURL=local-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters\\local-execution.js","sources":["webpack://@sqaitech/playground/webpack/runtime/define_property_getters","webpack://@sqaitech/playground/webpack/runtime/has_own_property","webpack://@sqaitech/playground/webpack/runtime/make_namespace_object","webpack://@sqaitech/playground/./src/adapters/local-execution.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { DeviceAction } from '@sqaitech/core';\r\nimport { overrideAIConfig } from '@sqaitech/shared/env';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\nimport { executeAction, parseStructuredParams } from '../common';\r\nimport type { ExecutionOptions, FormValue, PlaygroundAgent } from '../types';\r\nimport { BasePlaygroundAdapter } from './base';\r\n\r\nexport class LocalExecutionAdapter extends BasePlaygroundAdapter {\r\n private agent: PlaygroundAgent;\r\n private taskProgressTips: Record<string, string> = {};\r\n private progressCallback?: (tip: string) => void;\r\n private readonly _id: string; // Unique identifier for this local adapter instance\r\n private currentRequestId?: string; // Track current request to prevent stale callbacks\r\n\r\n constructor(agent: PlaygroundAgent) {\r\n super();\r\n this.agent = agent;\r\n this._id = uuid(); // Generate unique ID for local adapter\r\n }\r\n\r\n // Get adapter ID\r\n get id(): string {\r\n return this._id;\r\n }\r\n\r\n setProgressCallback(callback: (tip: string) => void): void {\r\n // Clear any existing callback before setting new one\r\n this.progressCallback = undefined;\r\n // Set the new callback\r\n this.progressCallback = callback;\r\n }\r\n\r\n private cleanup(requestId: string): void {\r\n delete this.taskProgressTips[requestId];\r\n }\r\n\r\n async parseStructuredParams(\r\n action: DeviceAction<unknown>,\r\n params: Record<string, unknown>,\r\n options: ExecutionOptions,\r\n ): Promise<unknown[]> {\r\n // Use shared implementation from common.ts\r\n return await parseStructuredParams(action, params, options);\r\n }\r\n\r\n formatErrorMessage(error: any): string {\r\n const errorMessage = error?.message || '';\r\n if (errorMessage.includes('of different extension')) {\r\n return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';\r\n }\r\n return this.formatBasicErrorMessage(error);\r\n }\r\n\r\n // Local execution - use base implementation\r\n // (inherits default executeAction from BasePlaygroundAdapter)\r\n\r\n // Local execution gets actionSpace from internal agent (parameter is for backward compatibility)\r\n async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\r\n // Priority 1: Use agent's getActionSpace method\r\n if (this.agent?.getActionSpace) {\r\n return await this.agent.getActionSpace();\r\n }\r\n\r\n // Priority 2: Use agent's interface.actionSpace method\r\n if (\r\n this.agent &&\r\n 'interface' in this.agent &&\r\n typeof this.agent.interface === 'object'\r\n ) {\r\n const page = this.agent.interface as {\r\n actionSpace?: () => Promise<DeviceAction<unknown>[]>;\r\n };\r\n if (page?.actionSpace) {\r\n return await page.actionSpace();\r\n }\r\n }\r\n\r\n // Priority 3: Fallback to context parameter (for backward compatibility with tests)\r\n if (context && typeof context === 'object' && 'actionSpace' in context) {\r\n const contextPage = context as {\r\n actionSpace: () => Promise<DeviceAction<unknown>[]>;\r\n };\r\n return await contextPage.actionSpace();\r\n }\r\n\r\n return [];\r\n }\r\n\r\n // Local execution doesn't use a server, so always return true\r\n async checkStatus(): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n async overrideConfig(aiConfig: Record<string, unknown>): Promise<void> {\r\n // For local execution, use the shared env override function\r\n overrideAIConfig(aiConfig);\r\n }\r\n\r\n async executeAction(\r\n actionType: string,\r\n value: FormValue,\r\n options: ExecutionOptions,\r\n ): Promise<unknown> {\r\n // Get actionSpace using our simplified getActionSpace method\r\n const actionSpace = await this.getActionSpace();\r\n let originalOnTaskStartTip: ((tip: string) => void) | undefined;\r\n\r\n // Setup progress tracking if requestId is provided\r\n if (options.requestId && this.agent) {\r\n // Track current request ID to prevent stale callbacks\r\n this.currentRequestId = options.requestId;\r\n originalOnTaskStartTip = this.agent.onTaskStartTip;\r\n\r\n // Set up a fresh callback\r\n this.agent.onTaskStartTip = (tip: string) => {\r\n // Only process if this is still the current request\r\n if (this.currentRequestId !== options.requestId) {\r\n return;\r\n }\r\n\r\n // Store tip for our progress tracking\r\n this.taskProgressTips[options.requestId!] = tip;\r\n\r\n // Call the direct progress callback set via setProgressCallback\r\n if (this.progressCallback) {\r\n this.progressCallback(tip);\r\n }\r\n\r\n if (typeof originalOnTaskStartTip === 'function') {\r\n originalOnTaskStartTip(tip);\r\n }\r\n };\r\n }\r\n\r\n try {\r\n // Call the base implementation with the original signature\r\n const result = await executeAction(\r\n this.agent,\r\n actionType,\r\n actionSpace,\r\n value,\r\n options,\r\n );\r\n\r\n // For local execution, we need to package the result with dump and reportHTML\r\n // similar to how the server does it\r\n const response = {\r\n result,\r\n dump: null as unknown,\r\n reportHTML: null as string | null,\r\n error: null as string | null,\r\n };\r\n\r\n try {\r\n // Get dump and reportHTML from agent like the server does\r\n if (this.agent.dumpDataString) {\r\n const dumpString = this.agent.dumpDataString();\r\n if (dumpString) {\r\n response.dump = JSON.parse(dumpString);\r\n }\r\n }\r\n\r\n if (this.agent.reportHTMLString) {\r\n response.reportHTML = this.agent.reportHTMLString() || null;\r\n }\r\n\r\n // Write out action dumps\r\n if (this.agent.writeOutActionDumps) {\r\n this.agent.writeOutActionDumps();\r\n }\r\n } catch (error: unknown) {\r\n console.error('Failed to get dump/reportHTML from agent:', error);\r\n }\r\n\r\n this.agent.resetDump();\r\n\r\n return response;\r\n } finally {\r\n // Always clean up progress tracking to prevent memory leaks\r\n if (options.requestId) {\r\n this.cleanup(options.requestId);\r\n // Clear the agent callback to prevent accumulation\r\n if (this.agent) {\r\n this.agent.onTaskStartTip = originalOnTaskStartTip;\r\n }\r\n }\r\n }\r\n }\r\n\r\n async getTaskProgress(requestId: string): Promise<{ tip?: string }> {\r\n // Return the stored tip for this requestId\r\n return { tip: this.taskProgressTips[requestId] || undefined };\r\n }\r\n\r\n // Local execution task cancellation - minimal implementation\r\n async cancelTask(\r\n _requestId: string,\r\n ): Promise<{ error?: string; success?: boolean }> {\r\n if (!this.agent) {\r\n return { error: 'No active agent found for this requestId' };\r\n }\r\n\r\n try {\r\n await this.agent.destroy?.();\r\n return { success: true };\r\n } catch (error: unknown) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error';\r\n console.error(`Failed to cancel agent: ${errorMessage}`);\r\n return { error: `Failed to cancel: ${errorMessage}` };\r\n }\r\n }\r\n\r\n // Get interface information from the agent\r\n async getInterfaceInfo(): Promise<{\r\n type: string;\r\n description?: string;\r\n } | null> {\r\n if (!this.agent?.interface) {\r\n return null;\r\n }\r\n\r\n try {\r\n const type = this.agent.interface.interfaceType || 'Unknown';\r\n const description = this.agent.interface.describe?.() || undefined;\r\n\r\n return {\r\n type,\r\n description,\r\n };\r\n } catch (error: unknown) {\r\n console.error('Failed to get interface info:', error);\r\n return null;\r\n }\r\n }\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","LocalExecutionAdapter","BasePlaygroundAdapter","callback","undefined","requestId","action","params","options","parseStructuredParams","error","errorMessage","context","_this_agent","page","contextPage","aiConfig","overrideAIConfig","actionType","value","actionSpace","originalOnTaskStartTip","tip","result","executeAction","response","dumpString","JSON","console","_requestId","Error","_this_agent_interface","type","description","agent","uuid"],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
RemoteExecutionAdapter: ()=>RemoteExecutionAdapter
|
|
28
|
+
});
|
|
29
|
+
const external_common_js_namespaceObject = require("../common.js");
|
|
30
|
+
const external_base_js_namespaceObject = require("./base.js");
|
|
31
|
+
function _define_property(obj, key, value) {
|
|
32
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
33
|
+
value: value,
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true
|
|
37
|
+
});
|
|
38
|
+
else obj[key] = value;
|
|
39
|
+
return obj;
|
|
40
|
+
}
|
|
41
|
+
class RemoteExecutionAdapter extends external_base_js_namespaceObject.BasePlaygroundAdapter {
|
|
42
|
+
get id() {
|
|
43
|
+
return this._id;
|
|
44
|
+
}
|
|
45
|
+
validateParams(value, action) {
|
|
46
|
+
if (!(null == action ? void 0 : action.paramSchema)) return {
|
|
47
|
+
valid: true
|
|
48
|
+
};
|
|
49
|
+
const needsStructuredParams = this.actionNeedsStructuredParams(action);
|
|
50
|
+
if (!needsStructuredParams) return {
|
|
51
|
+
valid: true
|
|
52
|
+
};
|
|
53
|
+
if (!value.params) return {
|
|
54
|
+
valid: false,
|
|
55
|
+
errorMessage: 'Parameters are required'
|
|
56
|
+
};
|
|
57
|
+
if (action.paramSchema && 'object' == typeof action.paramSchema) {
|
|
58
|
+
const schema = action.paramSchema;
|
|
59
|
+
if (schema.shape || 'ZodObject' === schema.type) {
|
|
60
|
+
const shape = schema.shape || {};
|
|
61
|
+
const missingFields = Object.keys(shape).filter((key)=>{
|
|
62
|
+
var _fieldDef__def, _fieldDef__def1;
|
|
63
|
+
const fieldDef = shape[key];
|
|
64
|
+
const isOptional = (null == fieldDef ? void 0 : fieldDef.isOptional) || (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.innerType) || (null == fieldDef ? void 0 : null == (_fieldDef__def1 = fieldDef._def) ? void 0 : _fieldDef__def1.typeName) === 'ZodOptional';
|
|
65
|
+
return !isOptional && (void 0 === value.params[key] || '' === value.params[key]);
|
|
66
|
+
});
|
|
67
|
+
if (missingFields.length > 0) return {
|
|
68
|
+
valid: false,
|
|
69
|
+
errorMessage: `Missing required parameters: ${missingFields.join(', ')}`
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
valid: true
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async parseStructuredParams(action, params, options) {
|
|
78
|
+
return await (0, external_common_js_namespaceObject.parseStructuredParams)(action, params, options);
|
|
79
|
+
}
|
|
80
|
+
formatErrorMessage(error) {
|
|
81
|
+
const message = (null == error ? void 0 : error.message) || '';
|
|
82
|
+
const androidErrors = [
|
|
83
|
+
{
|
|
84
|
+
keyword: 'adb',
|
|
85
|
+
message: 'ADB connection error. Please ensure device is connected and USB debugging is enabled.'
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
keyword: 'UIAutomator',
|
|
89
|
+
message: 'UIAutomator error. Please ensure the UIAutomator server is running on the device.'
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
const androidError = androidErrors.find(({ keyword })=>message.includes(keyword));
|
|
93
|
+
if (androidError) return androidError.message;
|
|
94
|
+
return this.formatBasicErrorMessage(error);
|
|
95
|
+
}
|
|
96
|
+
async executeAction(actionType, value, options) {
|
|
97
|
+
if (this.serverUrl && 'undefined' != typeof window) return this.executeViaServer(actionType, value, options);
|
|
98
|
+
throw new Error('Remote execution adapter requires server URL for execution');
|
|
99
|
+
}
|
|
100
|
+
async executeViaServer(actionType, value, options) {
|
|
101
|
+
const payload = {
|
|
102
|
+
type: actionType,
|
|
103
|
+
prompt: value.prompt,
|
|
104
|
+
...this.buildOptionalPayloadParams(options, value)
|
|
105
|
+
};
|
|
106
|
+
if (options.context) payload.context = options.context;
|
|
107
|
+
if (options.requestId && this.progressCallback) this.startProgressPolling(options.requestId, this.progressCallback);
|
|
108
|
+
try {
|
|
109
|
+
const response = await fetch(`${this.serverUrl}/execute`, {
|
|
110
|
+
method: 'POST',
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/json'
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify(payload)
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorText = await response.text().catch(()=>'Unknown error');
|
|
118
|
+
throw new Error(`Server request failed (${response.status}): ${errorText}`);
|
|
119
|
+
}
|
|
120
|
+
const result = await response.json();
|
|
121
|
+
if (options.requestId) this.stopProgressPolling(options.requestId);
|
|
122
|
+
return result;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (options.requestId) this.stopProgressPolling(options.requestId);
|
|
125
|
+
console.error('Execute via server failed:', error);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
buildOptionalPayloadParams(options, value) {
|
|
130
|
+
const optionalParams = {};
|
|
131
|
+
const optionalFields = [
|
|
132
|
+
{
|
|
133
|
+
key: 'requestId',
|
|
134
|
+
value: options.requestId
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: 'deepThink',
|
|
138
|
+
value: options.deepThink
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
key: 'screenshotIncluded',
|
|
142
|
+
value: options.screenshotIncluded
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
key: 'domIncluded',
|
|
146
|
+
value: options.domIncluded
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
key: 'params',
|
|
150
|
+
value: value.params
|
|
151
|
+
}
|
|
152
|
+
];
|
|
153
|
+
optionalFields.forEach(({ key, value })=>{
|
|
154
|
+
if (null != value && '' !== value) optionalParams[key] = value;
|
|
155
|
+
});
|
|
156
|
+
return optionalParams;
|
|
157
|
+
}
|
|
158
|
+
async getActionSpace(context) {
|
|
159
|
+
if (this.serverUrl && 'undefined' != typeof window) try {
|
|
160
|
+
const response = await fetch(`${this.serverUrl}/action-space`, {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
headers: {
|
|
163
|
+
'Content-Type': 'application/json'
|
|
164
|
+
},
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
context
|
|
167
|
+
})
|
|
168
|
+
});
|
|
169
|
+
if (!response.ok) throw new Error(`Failed to get action space: ${response.statusText}`);
|
|
170
|
+
const result = await response.json();
|
|
171
|
+
return Array.isArray(result) ? result : [];
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error('Failed to get action space from server:', error);
|
|
174
|
+
}
|
|
175
|
+
if (context && 'object' == typeof context && 'actionSpace' in context) try {
|
|
176
|
+
const actionSpaceMethod = context.actionSpace;
|
|
177
|
+
const result = await actionSpaceMethod();
|
|
178
|
+
return Array.isArray(result) ? result : [];
|
|
179
|
+
} catch (error) {
|
|
180
|
+
console.error('Failed to get action space from context:', error);
|
|
181
|
+
}
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
async checkStatus() {
|
|
185
|
+
if (!this.serverUrl) return false;
|
|
186
|
+
try {
|
|
187
|
+
const res = await fetch(`${this.serverUrl}/status`);
|
|
188
|
+
if (200 === res.status) {
|
|
189
|
+
try {
|
|
190
|
+
const data = await res.json();
|
|
191
|
+
if (data.id && 'string' == typeof data.id) this._id = data.id;
|
|
192
|
+
} catch (jsonError) {
|
|
193
|
+
console.debug('Failed to parse status response:', jsonError);
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.warn('Server status check failed:', error);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async overrideConfig(aiConfig) {
|
|
204
|
+
if (!this.serverUrl) throw new Error('Server URL not configured');
|
|
205
|
+
try {
|
|
206
|
+
const response = await fetch(`${this.serverUrl}/config`, {
|
|
207
|
+
method: 'POST',
|
|
208
|
+
headers: {
|
|
209
|
+
'Content-Type': 'application/json'
|
|
210
|
+
},
|
|
211
|
+
body: JSON.stringify({
|
|
212
|
+
aiConfig
|
|
213
|
+
})
|
|
214
|
+
});
|
|
215
|
+
if (!response.ok) throw new Error(`Failed to override server config: ${response.statusText}`);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
console.error('Failed to override server config:', error);
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async getTaskProgress(requestId) {
|
|
222
|
+
if (!this.serverUrl) return {
|
|
223
|
+
tip: void 0
|
|
224
|
+
};
|
|
225
|
+
if (!(null == requestId ? void 0 : requestId.trim())) {
|
|
226
|
+
console.warn('Invalid requestId provided for task progress');
|
|
227
|
+
return {
|
|
228
|
+
tip: void 0
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const response = await fetch(`${this.serverUrl}/task-progress/${encodeURIComponent(requestId)}`);
|
|
233
|
+
if (!response.ok) {
|
|
234
|
+
console.warn(`Task progress request failed: ${response.statusText}`);
|
|
235
|
+
return {
|
|
236
|
+
tip: void 0
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
return await response.json();
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error('Failed to poll task progress:', error);
|
|
242
|
+
return {
|
|
243
|
+
tip: void 0
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async cancelTask(requestId) {
|
|
248
|
+
this.stopProgressPolling(requestId);
|
|
249
|
+
if (!this.serverUrl) return {
|
|
250
|
+
error: 'No server URL configured'
|
|
251
|
+
};
|
|
252
|
+
if (!(null == requestId ? void 0 : requestId.trim())) return {
|
|
253
|
+
error: 'Invalid request ID'
|
|
254
|
+
};
|
|
255
|
+
try {
|
|
256
|
+
const res = await fetch(`${this.serverUrl}/cancel/${encodeURIComponent(requestId)}`, {
|
|
257
|
+
method: 'POST'
|
|
258
|
+
});
|
|
259
|
+
if (!res.ok) return {
|
|
260
|
+
error: `Cancel request failed: ${res.statusText}`
|
|
261
|
+
};
|
|
262
|
+
const result = await res.json();
|
|
263
|
+
return {
|
|
264
|
+
success: true,
|
|
265
|
+
...result
|
|
266
|
+
};
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.error('Failed to cancel task:', error);
|
|
269
|
+
return {
|
|
270
|
+
error: 'Failed to cancel task'
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
setProgressCallback(callback) {
|
|
275
|
+
this.progressCallback = callback;
|
|
276
|
+
}
|
|
277
|
+
startProgressPolling(requestId, callback) {
|
|
278
|
+
if (this.progressPolling.has(requestId)) return;
|
|
279
|
+
let lastTip = '';
|
|
280
|
+
const interval = setInterval(async ()=>{
|
|
281
|
+
try {
|
|
282
|
+
var _progress_tip_trim, _progress_tip;
|
|
283
|
+
const progress = await this.getTaskProgress(requestId);
|
|
284
|
+
if ((null == progress ? void 0 : null == (_progress_tip = progress.tip) ? void 0 : null == (_progress_tip_trim = _progress_tip.trim) ? void 0 : _progress_tip_trim.call(_progress_tip)) && progress.tip !== lastTip) {
|
|
285
|
+
lastTip = progress.tip;
|
|
286
|
+
callback(progress.tip);
|
|
287
|
+
}
|
|
288
|
+
} catch (error) {
|
|
289
|
+
console.debug('Progress polling error:', error);
|
|
290
|
+
}
|
|
291
|
+
}, 500);
|
|
292
|
+
this.progressPolling.set(requestId, interval);
|
|
293
|
+
}
|
|
294
|
+
stopProgressPolling(requestId) {
|
|
295
|
+
const interval = this.progressPolling.get(requestId);
|
|
296
|
+
if (interval) {
|
|
297
|
+
clearInterval(interval);
|
|
298
|
+
this.progressPolling.delete(requestId);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async getScreenshot() {
|
|
302
|
+
if (!this.serverUrl) return null;
|
|
303
|
+
try {
|
|
304
|
+
const response = await fetch(`${this.serverUrl}/screenshot`);
|
|
305
|
+
if (!response.ok) {
|
|
306
|
+
console.warn(`Screenshot request failed: ${response.statusText}`);
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
return await response.json();
|
|
310
|
+
} catch (error) {
|
|
311
|
+
console.error('Failed to get screenshot:', error);
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async getInterfaceInfo() {
|
|
316
|
+
if (!this.serverUrl) return null;
|
|
317
|
+
try {
|
|
318
|
+
const response = await fetch(`${this.serverUrl}/interface-info`);
|
|
319
|
+
if (!response.ok) {
|
|
320
|
+
console.warn(`Interface info request failed: ${response.statusText}`);
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
return await response.json();
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error('Failed to get interface info:', error);
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
constructor(serverUrl){
|
|
330
|
+
super(), _define_property(this, "serverUrl", void 0), _define_property(this, "progressPolling", new Map()), _define_property(this, "progressCallback", void 0), _define_property(this, "_id", void 0);
|
|
331
|
+
this.serverUrl = serverUrl;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
exports.RemoteExecutionAdapter = __webpack_exports__.RemoteExecutionAdapter;
|
|
335
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
336
|
+
"RemoteExecutionAdapter"
|
|
337
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
338
|
+
Object.defineProperty(exports, '__esModule', {
|
|
339
|
+
value: true
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
//# sourceMappingURL=remote-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters\\remote-execution.js","sources":["webpack://@sqaitech/playground/webpack/runtime/define_property_getters","webpack://@sqaitech/playground/webpack/runtime/has_own_property","webpack://@sqaitech/playground/webpack/runtime/make_namespace_object","webpack://@sqaitech/playground/./src/adapters/remote-execution.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { DeviceAction } from '@sqaitech/core';\r\nimport { parseStructuredParams } from '../common';\r\nimport type { ExecutionOptions, FormValue, ValidationResult } from '../types';\r\nimport { BasePlaygroundAdapter } from './base';\r\n\r\nexport class RemoteExecutionAdapter extends BasePlaygroundAdapter {\r\n private serverUrl?: string;\r\n private progressPolling = new Map<string, NodeJS.Timeout>();\r\n private progressCallback?: (tip: string) => void;\r\n private _id?: string;\r\n\r\n constructor(serverUrl: string) {\r\n super();\r\n this.serverUrl = serverUrl;\r\n }\r\n\r\n // Get adapter ID (cached after first status check for remote)\r\n get id(): string | undefined {\r\n return this._id;\r\n }\r\n\r\n // Override validateParams for remote execution\r\n // Since schemas from server are JSON-serialized and lack .parse() method\r\n validateParams(\r\n value: FormValue,\r\n action: DeviceAction<unknown> | undefined,\r\n ): ValidationResult {\r\n if (!action?.paramSchema) {\r\n return { valid: true };\r\n }\r\n\r\n const needsStructuredParams = this.actionNeedsStructuredParams(action);\r\n\r\n if (!needsStructuredParams) {\r\n return { valid: true };\r\n }\r\n\r\n if (!value.params) {\r\n return { valid: false, errorMessage: 'Parameters are required' };\r\n }\r\n\r\n // For remote execution, perform basic validation without .parse()\r\n // Check if required fields are present\r\n if (action.paramSchema && typeof action.paramSchema === 'object') {\r\n const schema = action.paramSchema as any;\r\n if (schema.shape || schema.type === 'ZodObject') {\r\n const shape = schema.shape || {};\r\n const missingFields = Object.keys(shape).filter((key) => {\r\n const fieldDef = shape[key];\r\n // Check if field is required (not optional)\r\n const isOptional =\r\n fieldDef?.isOptional ||\r\n fieldDef?._def?.innerType || // ZodOptional\r\n fieldDef?._def?.typeName === 'ZodOptional';\r\n return (\r\n !isOptional &&\r\n (value.params![key] === undefined || value.params![key] === '')\r\n );\r\n });\r\n\r\n if (missingFields.length > 0) {\r\n return {\r\n valid: false,\r\n errorMessage: `Missing required parameters: ${missingFields.join(', ')}`,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return { valid: true };\r\n }\r\n\r\n async parseStructuredParams(\r\n action: DeviceAction<unknown>,\r\n params: Record<string, unknown>,\r\n options: ExecutionOptions,\r\n ): Promise<unknown[]> {\r\n // Use shared implementation from common.ts\r\n return await parseStructuredParams(action, params, options);\r\n }\r\n\r\n formatErrorMessage(error: any): string {\r\n const message = error?.message || '';\r\n\r\n // Handle Android-specific errors\r\n const androidErrors = [\r\n {\r\n keyword: 'adb',\r\n message:\r\n 'ADB connection error. Please ensure device is connected and USB debugging is enabled.',\r\n },\r\n {\r\n keyword: 'UIAutomator',\r\n message:\r\n 'UIAutomator error. Please ensure the UIAutomator server is running on the device.',\r\n },\r\n ];\r\n\r\n const androidError = androidErrors.find(({ keyword }) =>\r\n message.includes(keyword),\r\n );\r\n if (androidError) {\r\n return androidError.message;\r\n }\r\n\r\n return this.formatBasicErrorMessage(error);\r\n }\r\n\r\n // Remote execution adapter - simplified interface\r\n async executeAction(\r\n actionType: string,\r\n value: FormValue,\r\n options: ExecutionOptions,\r\n ): Promise<unknown> {\r\n // If serverUrl is provided, use server-side execution\r\n if (this.serverUrl && typeof window !== 'undefined') {\r\n return this.executeViaServer(actionType, value, options);\r\n }\r\n\r\n throw new Error(\r\n 'Remote execution adapter requires server URL for execution',\r\n );\r\n }\r\n\r\n // Remote execution via server - uses same endpoint as requestPlaygroundServer\r\n private async executeViaServer(\r\n actionType: string,\r\n value: FormValue,\r\n options: ExecutionOptions,\r\n ): Promise<unknown> {\r\n const payload: Record<string, unknown> = {\r\n type: actionType,\r\n prompt: value.prompt,\r\n ...this.buildOptionalPayloadParams(options, value),\r\n };\r\n\r\n // Add context only if it exists (server can handle single agent case without context)\r\n if (options.context) {\r\n payload.context = options.context;\r\n }\r\n\r\n // Start progress polling if callback is set and requestId exists\r\n if (options.requestId && this.progressCallback) {\r\n this.startProgressPolling(options.requestId, this.progressCallback);\r\n }\r\n\r\n try {\r\n const response = await fetch(`${this.serverUrl}/execute`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => 'Unknown error');\r\n throw new Error(\r\n `Server request failed (${response.status}): ${errorText}`,\r\n );\r\n }\r\n\r\n const result = await response.json();\r\n\r\n // Stop progress polling when execution completes\r\n if (options.requestId) {\r\n this.stopProgressPolling(options.requestId);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n // Stop progress polling on error\r\n if (options.requestId) {\r\n this.stopProgressPolling(options.requestId);\r\n }\r\n console.error('Execute via server failed:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // Helper method to build optional payload parameters\r\n private buildOptionalPayloadParams(\r\n options: ExecutionOptions,\r\n value: FormValue,\r\n ): Record<string, unknown> {\r\n const optionalParams: Record<string, unknown> = {};\r\n\r\n // Add optional parameters only if they have meaningful values\r\n const optionalFields = [\r\n { key: 'requestId', value: options.requestId },\r\n { key: 'deepThink', value: options.deepThink },\r\n { key: 'screenshotIncluded', value: options.screenshotIncluded },\r\n { key: 'domIncluded', value: options.domIncluded },\r\n { key: 'params', value: value.params },\r\n ] as const;\r\n\r\n optionalFields.forEach(({ key, value }) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n optionalParams[key] = value;\r\n }\r\n });\r\n\r\n return optionalParams;\r\n }\r\n\r\n // Get action space from server with fallback\r\n async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\r\n // Try server first if available\r\n if (this.serverUrl && typeof window !== 'undefined') {\r\n try {\r\n const response = await fetch(`${this.serverUrl}/action-space`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ context }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to get action space: ${response.statusText}`);\r\n }\r\n\r\n const result = await response.json();\r\n return Array.isArray(result) ? result : [];\r\n } catch (error) {\r\n console.error('Failed to get action space from server:', error);\r\n // Fall through to context fallback\r\n }\r\n }\r\n\r\n // Fallback: try context.actionSpace if available\r\n if (context && typeof context === 'object' && 'actionSpace' in context) {\r\n try {\r\n const actionSpaceMethod = (\r\n context as { actionSpace: () => Promise<DeviceAction<unknown>[]> }\r\n ).actionSpace;\r\n const result = await actionSpaceMethod();\r\n return Array.isArray(result) ? result : [];\r\n } catch (error) {\r\n console.error('Failed to get action space from context:', error);\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n // Uses base implementation for validateParams and createDisplayContent\r\n\r\n // Server communication methods\r\n async checkStatus(): Promise<boolean> {\r\n if (!this.serverUrl) {\r\n return false;\r\n }\r\n\r\n try {\r\n const res = await fetch(`${this.serverUrl}/status`);\r\n if (res.status === 200) {\r\n // Try to extract id from response\r\n try {\r\n const data = await res.json();\r\n if (data.id && typeof data.id === 'string') {\r\n this._id = data.id;\r\n }\r\n } catch (jsonError) {\r\n // If JSON parsing fails, id remains undefined but status is still OK\r\n console.debug('Failed to parse status response:', jsonError);\r\n }\r\n return true;\r\n }\r\n return false;\r\n } catch (error) {\r\n console.warn('Server status check failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async overrideConfig(aiConfig: Record<string, unknown>): Promise<void> {\r\n if (!this.serverUrl) {\r\n throw new Error('Server URL not configured');\r\n }\r\n\r\n try {\r\n const response = await fetch(`${this.serverUrl}/config`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ aiConfig }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to override server config: ${response.statusText}`,\r\n );\r\n }\r\n } catch (error) {\r\n console.error('Failed to override server config:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async getTaskProgress(requestId: string): Promise<{ tip?: string }> {\r\n if (!this.serverUrl) {\r\n return { tip: undefined };\r\n }\r\n\r\n if (!requestId?.trim()) {\r\n console.warn('Invalid requestId provided for task progress');\r\n return { tip: undefined };\r\n }\r\n\r\n try {\r\n const response = await fetch(\r\n `${this.serverUrl}/task-progress/${encodeURIComponent(requestId)}`,\r\n );\r\n\r\n if (!response.ok) {\r\n console.warn(`Task progress request failed: ${response.statusText}`);\r\n return { tip: undefined };\r\n }\r\n\r\n return await response.json();\r\n } catch (error) {\r\n console.error('Failed to poll task progress:', error);\r\n return { tip: undefined };\r\n }\r\n }\r\n\r\n // Cancel task\r\n async cancelTask(\r\n requestId: string,\r\n ): Promise<{ error?: string; success?: boolean }> {\r\n // Stop progress polling\r\n this.stopProgressPolling(requestId);\r\n\r\n if (!this.serverUrl) {\r\n return { error: 'No server URL configured' };\r\n }\r\n\r\n if (!requestId?.trim()) {\r\n return { error: 'Invalid request ID' };\r\n }\r\n\r\n try {\r\n const res = await fetch(\r\n `${this.serverUrl}/cancel/${encodeURIComponent(requestId)}`,\r\n {\r\n method: 'POST',\r\n },\r\n );\r\n\r\n if (!res.ok) {\r\n return { error: `Cancel request failed: ${res.statusText}` };\r\n }\r\n\r\n const result = await res.json();\r\n return { success: true, ...result };\r\n } catch (error) {\r\n console.error('Failed to cancel task:', error);\r\n return { error: 'Failed to cancel task' };\r\n }\r\n }\r\n\r\n // Progress callback management\r\n setProgressCallback(callback: (tip: string) => void): void {\r\n this.progressCallback = callback;\r\n }\r\n\r\n // Start progress polling\r\n private startProgressPolling(\r\n requestId: string,\r\n callback: (tip: string) => void,\r\n ): void {\r\n // Don't start multiple polling for the same request\r\n if (this.progressPolling.has(requestId)) {\r\n return;\r\n }\r\n\r\n let lastTip = '';\r\n const interval = setInterval(async () => {\r\n try {\r\n const progress = await this.getTaskProgress(requestId);\r\n if (progress?.tip?.trim?.() && progress.tip !== lastTip) {\r\n lastTip = progress.tip;\r\n callback(progress.tip);\r\n }\r\n } catch (error) {\r\n // Silently ignore progress polling errors to avoid spam\r\n console.debug('Progress polling error:', error);\r\n }\r\n }, 500); // Poll every 500ms\r\n\r\n this.progressPolling.set(requestId, interval);\r\n }\r\n\r\n // Stop progress polling\r\n private stopProgressPolling(requestId: string): void {\r\n const interval = this.progressPolling.get(requestId);\r\n if (interval) {\r\n clearInterval(interval);\r\n this.progressPolling.delete(requestId);\r\n }\r\n }\r\n\r\n // Get screenshot from server\r\n async getScreenshot(): Promise<{\r\n screenshot: string;\r\n timestamp: number;\r\n } | null> {\r\n if (!this.serverUrl) {\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(`${this.serverUrl}/screenshot`);\r\n\r\n if (!response.ok) {\r\n console.warn(`Screenshot request failed: ${response.statusText}`);\r\n return null;\r\n }\r\n\r\n return await response.json();\r\n } catch (error) {\r\n console.error('Failed to get screenshot:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Get interface information from server\r\n async getInterfaceInfo(): Promise<{\r\n type: string;\r\n description?: string;\r\n } | null> {\r\n if (!this.serverUrl) {\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(`${this.serverUrl}/interface-info`);\r\n\r\n if (!response.ok) {\r\n console.warn(`Interface info request failed: ${response.statusText}`);\r\n return null;\r\n }\r\n\r\n return await response.json();\r\n } catch (error) {\r\n console.error('Failed to get interface info:', error);\r\n return null;\r\n }\r\n }\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","RemoteExecutionAdapter","BasePlaygroundAdapter","value","action","needsStructuredParams","schema","shape","missingFields","_fieldDef__def","_fieldDef__def1","fieldDef","isOptional","undefined","params","options","parseStructuredParams","error","message","androidErrors","androidError","keyword","actionType","window","Error","payload","response","fetch","JSON","errorText","result","console","optionalParams","optionalFields","context","Array","actionSpaceMethod","res","data","jsonError","aiConfig","requestId","encodeURIComponent","callback","lastTip","interval","setInterval","_progress_tip","progress","clearInterval","serverUrl","Map"],"mappings":"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"}
|