@godscene/core 1.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/es/agent/agent.mjs +767 -0
  4. package/dist/es/agent/common.mjs +0 -0
  5. package/dist/es/agent/execution-session.mjs +39 -0
  6. package/dist/es/agent/index.mjs +6 -0
  7. package/dist/es/agent/task-builder.mjs +343 -0
  8. package/dist/es/agent/task-cache.mjs +212 -0
  9. package/dist/es/agent/tasks.mjs +428 -0
  10. package/dist/es/agent/ui-utils.mjs +101 -0
  11. package/dist/es/agent/utils.mjs +167 -0
  12. package/dist/es/ai-model/auto-glm/actions.mjs +237 -0
  13. package/dist/es/ai-model/auto-glm/index.mjs +6 -0
  14. package/dist/es/ai-model/auto-glm/parser.mjs +237 -0
  15. package/dist/es/ai-model/auto-glm/planning.mjs +69 -0
  16. package/dist/es/ai-model/auto-glm/prompt.mjs +220 -0
  17. package/dist/es/ai-model/auto-glm/util.mjs +7 -0
  18. package/dist/es/ai-model/connectivity.mjs +136 -0
  19. package/dist/es/ai-model/conversation-history.mjs +193 -0
  20. package/dist/es/ai-model/index.mjs +12 -0
  21. package/dist/es/ai-model/inspect.mjs +395 -0
  22. package/dist/es/ai-model/llm-planning.mjs +231 -0
  23. package/dist/es/ai-model/prompt/common.mjs +5 -0
  24. package/dist/es/ai-model/prompt/describe.mjs +64 -0
  25. package/dist/es/ai-model/prompt/extraction.mjs +129 -0
  26. package/dist/es/ai-model/prompt/llm-locator.mjs +49 -0
  27. package/dist/es/ai-model/prompt/llm-planning.mjs +584 -0
  28. package/dist/es/ai-model/prompt/llm-section-locator.mjs +42 -0
  29. package/dist/es/ai-model/prompt/order-sensitive-judge.mjs +33 -0
  30. package/dist/es/ai-model/prompt/playwright-generator.mjs +115 -0
  31. package/dist/es/ai-model/prompt/ui-tars-planning.mjs +34 -0
  32. package/dist/es/ai-model/prompt/util.mjs +57 -0
  33. package/dist/es/ai-model/prompt/yaml-generator.mjs +201 -0
  34. package/dist/es/ai-model/service-caller/codex-app-server.mjs +573 -0
  35. package/dist/es/ai-model/service-caller/image-detail.mjs +4 -0
  36. package/dist/es/ai-model/service-caller/index.mjs +648 -0
  37. package/dist/es/ai-model/service-caller/request-timeout.mjs +47 -0
  38. package/dist/es/ai-model/ui-tars-planning.mjs +247 -0
  39. package/dist/es/common.mjs +382 -0
  40. package/dist/es/device/device-options.mjs +0 -0
  41. package/dist/es/device/index.mjs +340 -0
  42. package/dist/es/dump/html-utils.mjs +290 -0
  43. package/dist/es/dump/index.mjs +3 -0
  44. package/dist/es/dump/screenshot-restoration.mjs +30 -0
  45. package/dist/es/dump/screenshot-store.mjs +125 -0
  46. package/dist/es/index.mjs +17 -0
  47. package/dist/es/report-cli.mjs +149 -0
  48. package/dist/es/report-generator.mjs +203 -0
  49. package/dist/es/report-markdown.mjs +216 -0
  50. package/dist/es/report.mjs +287 -0
  51. package/dist/es/screenshot-item.mjs +120 -0
  52. package/dist/es/service/index.mjs +272 -0
  53. package/dist/es/service/utils.mjs +13 -0
  54. package/dist/es/skill/index.mjs +35 -0
  55. package/dist/es/task-runner.mjs +261 -0
  56. package/dist/es/task-timing.mjs +10 -0
  57. package/dist/es/tree.mjs +11 -0
  58. package/dist/es/types.mjs +202 -0
  59. package/dist/es/utils.mjs +232 -0
  60. package/dist/es/yaml/builder.mjs +11 -0
  61. package/dist/es/yaml/index.mjs +4 -0
  62. package/dist/es/yaml/player.mjs +425 -0
  63. package/dist/es/yaml/utils.mjs +100 -0
  64. package/dist/es/yaml.mjs +0 -0
  65. package/dist/lib/agent/agent.js +815 -0
  66. package/dist/lib/agent/common.js +5 -0
  67. package/dist/lib/agent/execution-session.js +73 -0
  68. package/dist/lib/agent/index.js +76 -0
  69. package/dist/lib/agent/task-builder.js +380 -0
  70. package/dist/lib/agent/task-cache.js +264 -0
  71. package/dist/lib/agent/tasks.js +471 -0
  72. package/dist/lib/agent/ui-utils.js +153 -0
  73. package/dist/lib/agent/utils.js +238 -0
  74. package/dist/lib/ai-model/auto-glm/actions.js +271 -0
  75. package/dist/lib/ai-model/auto-glm/index.js +64 -0
  76. package/dist/lib/ai-model/auto-glm/parser.js +280 -0
  77. package/dist/lib/ai-model/auto-glm/planning.js +103 -0
  78. package/dist/lib/ai-model/auto-glm/prompt.js +257 -0
  79. package/dist/lib/ai-model/auto-glm/util.js +44 -0
  80. package/dist/lib/ai-model/connectivity.js +180 -0
  81. package/dist/lib/ai-model/conversation-history.js +227 -0
  82. package/dist/lib/ai-model/index.js +127 -0
  83. package/dist/lib/ai-model/inspect.js +441 -0
  84. package/dist/lib/ai-model/llm-planning.js +268 -0
  85. package/dist/lib/ai-model/prompt/common.js +39 -0
  86. package/dist/lib/ai-model/prompt/describe.js +98 -0
  87. package/dist/lib/ai-model/prompt/extraction.js +169 -0
  88. package/dist/lib/ai-model/prompt/llm-locator.js +86 -0
  89. package/dist/lib/ai-model/prompt/llm-planning.js +621 -0
  90. package/dist/lib/ai-model/prompt/llm-section-locator.js +79 -0
  91. package/dist/lib/ai-model/prompt/order-sensitive-judge.js +70 -0
  92. package/dist/lib/ai-model/prompt/playwright-generator.js +176 -0
  93. package/dist/lib/ai-model/prompt/ui-tars-planning.js +71 -0
  94. package/dist/lib/ai-model/prompt/util.js +103 -0
  95. package/dist/lib/ai-model/prompt/yaml-generator.js +262 -0
  96. package/dist/lib/ai-model/service-caller/codex-app-server.js +622 -0
  97. package/dist/lib/ai-model/service-caller/image-detail.js +38 -0
  98. package/dist/lib/ai-model/service-caller/index.js +716 -0
  99. package/dist/lib/ai-model/service-caller/request-timeout.js +93 -0
  100. package/dist/lib/ai-model/ui-tars-planning.js +281 -0
  101. package/dist/lib/common.js +491 -0
  102. package/dist/lib/device/device-options.js +18 -0
  103. package/dist/lib/device/index.js +467 -0
  104. package/dist/lib/dump/html-utils.js +366 -0
  105. package/dist/lib/dump/index.js +58 -0
  106. package/dist/lib/dump/screenshot-restoration.js +64 -0
  107. package/dist/lib/dump/screenshot-store.js +165 -0
  108. package/dist/lib/index.js +184 -0
  109. package/dist/lib/report-cli.js +189 -0
  110. package/dist/lib/report-generator.js +244 -0
  111. package/dist/lib/report-markdown.js +253 -0
  112. package/dist/lib/report.js +333 -0
  113. package/dist/lib/screenshot-item.js +154 -0
  114. package/dist/lib/service/index.js +306 -0
  115. package/dist/lib/service/utils.js +47 -0
  116. package/dist/lib/skill/index.js +69 -0
  117. package/dist/lib/task-runner.js +298 -0
  118. package/dist/lib/task-timing.js +44 -0
  119. package/dist/lib/tree.js +51 -0
  120. package/dist/lib/types.js +298 -0
  121. package/dist/lib/utils.js +314 -0
  122. package/dist/lib/yaml/builder.js +55 -0
  123. package/dist/lib/yaml/index.js +79 -0
  124. package/dist/lib/yaml/player.js +459 -0
  125. package/dist/lib/yaml/utils.js +153 -0
  126. package/dist/lib/yaml.js +18 -0
  127. package/dist/types/agent/agent.d.ts +220 -0
  128. package/dist/types/agent/common.d.ts +0 -0
  129. package/dist/types/agent/execution-session.d.ts +36 -0
  130. package/dist/types/agent/index.d.ts +9 -0
  131. package/dist/types/agent/task-builder.d.ts +34 -0
  132. package/dist/types/agent/task-cache.d.ts +49 -0
  133. package/dist/types/agent/tasks.d.ts +70 -0
  134. package/dist/types/agent/ui-utils.d.ts +14 -0
  135. package/dist/types/agent/utils.d.ts +25 -0
  136. package/dist/types/ai-model/auto-glm/actions.d.ts +78 -0
  137. package/dist/types/ai-model/auto-glm/index.d.ts +6 -0
  138. package/dist/types/ai-model/auto-glm/parser.d.ts +18 -0
  139. package/dist/types/ai-model/auto-glm/planning.d.ts +12 -0
  140. package/dist/types/ai-model/auto-glm/prompt.d.ts +27 -0
  141. package/dist/types/ai-model/auto-glm/util.d.ts +13 -0
  142. package/dist/types/ai-model/connectivity.d.ts +20 -0
  143. package/dist/types/ai-model/conversation-history.d.ts +105 -0
  144. package/dist/types/ai-model/index.d.ts +16 -0
  145. package/dist/types/ai-model/inspect.d.ts +67 -0
  146. package/dist/types/ai-model/llm-planning.d.ts +19 -0
  147. package/dist/types/ai-model/prompt/common.d.ts +2 -0
  148. package/dist/types/ai-model/prompt/describe.d.ts +1 -0
  149. package/dist/types/ai-model/prompt/extraction.d.ts +7 -0
  150. package/dist/types/ai-model/prompt/llm-locator.d.ts +3 -0
  151. package/dist/types/ai-model/prompt/llm-planning.d.ts +10 -0
  152. package/dist/types/ai-model/prompt/llm-section-locator.d.ts +3 -0
  153. package/dist/types/ai-model/prompt/order-sensitive-judge.d.ts +2 -0
  154. package/dist/types/ai-model/prompt/playwright-generator.d.ts +26 -0
  155. package/dist/types/ai-model/prompt/ui-tars-planning.d.ts +2 -0
  156. package/dist/types/ai-model/prompt/util.d.ts +33 -0
  157. package/dist/types/ai-model/prompt/yaml-generator.d.ts +102 -0
  158. package/dist/types/ai-model/service-caller/codex-app-server.d.ts +42 -0
  159. package/dist/types/ai-model/service-caller/image-detail.d.ts +2 -0
  160. package/dist/types/ai-model/service-caller/index.d.ts +60 -0
  161. package/dist/types/ai-model/service-caller/request-timeout.d.ts +32 -0
  162. package/dist/types/ai-model/ui-tars-planning.d.ts +72 -0
  163. package/dist/types/common.d.ts +288 -0
  164. package/dist/types/device/device-options.d.ts +155 -0
  165. package/dist/types/device/index.d.ts +2565 -0
  166. package/dist/types/dump/html-utils.d.ts +75 -0
  167. package/dist/types/dump/index.d.ts +5 -0
  168. package/dist/types/dump/screenshot-restoration.d.ts +8 -0
  169. package/dist/types/dump/screenshot-store.d.ts +49 -0
  170. package/dist/types/index.d.ts +21 -0
  171. package/dist/types/report-cli.d.ts +36 -0
  172. package/dist/types/report-generator.d.ts +88 -0
  173. package/dist/types/report-markdown.d.ts +24 -0
  174. package/dist/types/report.d.ts +52 -0
  175. package/dist/types/screenshot-item.d.ts +67 -0
  176. package/dist/types/service/index.d.ts +24 -0
  177. package/dist/types/service/utils.d.ts +2 -0
  178. package/dist/types/skill/index.d.ts +25 -0
  179. package/dist/types/task-runner.d.ts +50 -0
  180. package/dist/types/task-timing.d.ts +8 -0
  181. package/dist/types/tree.d.ts +4 -0
  182. package/dist/types/types.d.ts +684 -0
  183. package/dist/types/utils.d.ts +45 -0
  184. package/dist/types/yaml/builder.d.ts +2 -0
  185. package/dist/types/yaml/index.d.ts +4 -0
  186. package/dist/types/yaml/player.d.ts +34 -0
  187. package/dist/types/yaml/utils.d.ts +9 -0
  188. package/dist/types/yaml.d.ts +215 -0
  189. package/package.json +130 -0
@@ -0,0 +1,459 @@
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 ("u" > 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
+ ScriptPlayer: ()=>ScriptPlayer
28
+ });
29
+ const external_node_fs_namespaceObject = require("node:fs");
30
+ const external_node_path_namespaceObject = require("node:path");
31
+ const utils_namespaceObject = require("@godscene/shared/utils");
32
+ const external_zod_namespaceObject = require("zod");
33
+ const common_namespaceObject = require("@godscene/shared/common");
34
+ const logger_namespaceObject = require("@godscene/shared/logger");
35
+ const external_utils_js_namespaceObject = require("./utils.js");
36
+ function _define_property(obj, key, value) {
37
+ if (key in obj) Object.defineProperty(obj, key, {
38
+ value: value,
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true
42
+ });
43
+ else obj[key] = value;
44
+ return obj;
45
+ }
46
+ const debug = (0, logger_namespaceObject.getDebug)('yaml-player');
47
+ const aiTaskHandlerMap = {
48
+ aiQuery: 'aiQuery',
49
+ aiNumber: 'aiNumber',
50
+ aiString: 'aiString',
51
+ aiBoolean: 'aiBoolean',
52
+ aiAsk: 'aiAsk',
53
+ aiLocate: 'aiLocate'
54
+ };
55
+ const isStringParamSchema = (schema)=>{
56
+ if (!schema) return false;
57
+ const schemaDef = schema?._def;
58
+ if (!schemaDef?.typeName) return false;
59
+ switch(schemaDef.typeName){
60
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodString:
61
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEnum:
62
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNativeEnum:
63
+ return true;
64
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodLiteral:
65
+ return 'string' == typeof schemaDef.value;
66
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodOptional:
67
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNullable:
68
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodDefault:
69
+ return isStringParamSchema(schemaDef.innerType);
70
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEffects:
71
+ return isStringParamSchema(schemaDef.schema);
72
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodPipeline:
73
+ return isStringParamSchema(schemaDef.out);
74
+ case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodUnion:
75
+ {
76
+ const options = schemaDef.options;
77
+ return Array.isArray(options) ? options.every((option)=>isStringParamSchema(option)) : false;
78
+ }
79
+ default:
80
+ return false;
81
+ }
82
+ };
83
+ const buildShortcutActionParam = (actionName, interfaceAlias, value)=>{
84
+ if ('Launch' === actionName || 'launch' === interfaceAlias) return {
85
+ uri: value
86
+ };
87
+ if ('Terminate' === actionName || 'terminate' === interfaceAlias) return {
88
+ uri: value
89
+ };
90
+ if ('RunAdbShell' === actionName || 'runAdbShell' === interfaceAlias) return {
91
+ command: value
92
+ };
93
+ };
94
+ class ScriptPlayer {
95
+ setResult(key, value) {
96
+ const keyToUse = key || this.unnamedResultIndex++;
97
+ if (this.result[keyToUse]) console.warn(`result key ${keyToUse} already exists, will overwrite`);
98
+ this.result[keyToUse] = value;
99
+ return this.flushResult();
100
+ }
101
+ setPlayerStatus(status, error) {
102
+ this.status = status;
103
+ this.errorInSetup = error;
104
+ }
105
+ notifyCurrentTaskStatusChange(taskIndex) {
106
+ const taskIndexToNotify = 'number' == typeof taskIndex ? taskIndex : this.currentTaskIndex;
107
+ if ('number' != typeof taskIndexToNotify) return;
108
+ const taskStatus = this.taskStatusList[taskIndexToNotify];
109
+ if (this.onTaskStatusChange) this.onTaskStatusChange(taskStatus);
110
+ }
111
+ async setTaskStatus(index, statusValue, error) {
112
+ this.taskStatusList[index].status = statusValue;
113
+ if (error) this.taskStatusList[index].error = error;
114
+ this.notifyCurrentTaskStatusChange(index);
115
+ }
116
+ setTaskIndex(taskIndex) {
117
+ this.currentTaskIndex = taskIndex;
118
+ }
119
+ flushResult() {
120
+ if (this.output) {
121
+ const output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.output);
122
+ const outputDir = (0, external_node_path_namespaceObject.dirname)(output);
123
+ if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
124
+ recursive: true
125
+ });
126
+ (0, external_node_fs_namespaceObject.writeFileSync)(output, JSON.stringify(this.result || {}, void 0, 2));
127
+ }
128
+ }
129
+ flushUnstableLogContent() {
130
+ if (this.unstableLogContent) {
131
+ const content = this.interfaceAgent?._unstableLogContent();
132
+ const filePath = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.unstableLogContent);
133
+ const outputDir = (0, external_node_path_namespaceObject.dirname)(filePath);
134
+ if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
135
+ recursive: true
136
+ });
137
+ (0, external_node_fs_namespaceObject.writeFileSync)(filePath, JSON.stringify(content, null, 2));
138
+ }
139
+ }
140
+ async playTask(taskStatus, agent) {
141
+ const { flow } = taskStatus;
142
+ (0, utils_namespaceObject.assert)(flow, 'missing flow in task');
143
+ for(const flowItemIndex in flow){
144
+ const currentStep = Number.parseInt(flowItemIndex, 10);
145
+ taskStatus.currentStep = currentStep;
146
+ const flowItem = flow[flowItemIndex];
147
+ if ('Finalize' in flowItem) continue;
148
+ debug(`playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`);
149
+ const simpleAIKey = Object.keys(aiTaskHandlerMap).find((key)=>Object.prototype.hasOwnProperty.call(flowItem, key));
150
+ if ('aiAct' in flowItem || 'aiAction' in flowItem || 'ai' in flowItem) {
151
+ const actionTask = flowItem;
152
+ const { aiAct, aiAction, ai, ...actionOptions } = actionTask;
153
+ const prompt = aiAct || aiAction || ai;
154
+ (0, utils_namespaceObject.assert)(prompt, 'missing prompt for ai (aiAct)');
155
+ await agent.aiAct(prompt, actionOptions);
156
+ } else if ('aiAssert' in flowItem) {
157
+ const assertTask = flowItem;
158
+ const { aiAssert: prompt, errorMessage: msg, name, ...restOpts } = assertTask;
159
+ (0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiAssert');
160
+ const { pass, thought, message } = await agent.aiAssert(prompt, msg, {
161
+ ...restOpts,
162
+ keepRawResponse: true
163
+ }) || {};
164
+ this.setResult(name, {
165
+ pass,
166
+ thought,
167
+ message
168
+ });
169
+ if (!pass) throw new Error(message);
170
+ } else if (simpleAIKey) {
171
+ const { [simpleAIKey]: prompt, name, ...options } = flowItem;
172
+ (0, utils_namespaceObject.assert)(prompt, `missing prompt for ${simpleAIKey}`);
173
+ const agentMethod = agent[aiTaskHandlerMap[simpleAIKey]];
174
+ (0, utils_namespaceObject.assert)('function' == typeof agentMethod, `missing agent method for ${simpleAIKey}`);
175
+ const aiResult = await agentMethod.call(agent, prompt, options);
176
+ this.setResult(name, aiResult);
177
+ } else if ('aiWaitFor' in flowItem) {
178
+ const waitForTask = flowItem;
179
+ const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;
180
+ const prompt = aiWaitFor;
181
+ (0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiWaitFor');
182
+ const waitForOptions = {
183
+ ...restWaitForOpts,
184
+ ...void 0 !== timeout ? {
185
+ timeout,
186
+ timeoutMs: timeout
187
+ } : {}
188
+ };
189
+ await agent.aiWaitFor(prompt, waitForOptions);
190
+ } else if ('sleep' in flowItem) {
191
+ const sleepTask = flowItem;
192
+ const ms = sleepTask.sleep;
193
+ let msNumber = ms;
194
+ if ('string' == typeof ms) msNumber = Number.parseInt(ms, 10);
195
+ (0, utils_namespaceObject.assert)(msNumber && msNumber > 0, `ms for sleep must be greater than 0, but got ${ms}`);
196
+ await new Promise((resolve)=>setTimeout(resolve, msNumber));
197
+ } else if ("javascript" in flowItem) {
198
+ const evaluateJavaScriptTask = flowItem;
199
+ const result = await agent.evaluateJavaScript(evaluateJavaScriptTask.javascript);
200
+ this.setResult(evaluateJavaScriptTask.name, result);
201
+ } else if ('logScreenshot' in flowItem || 'recordToReport' in flowItem) {
202
+ const recordTask = flowItem;
203
+ const title = recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';
204
+ const content = recordTask.content || '';
205
+ await agent.recordToReport(title, {
206
+ content
207
+ });
208
+ } else if ('aiInput' in flowItem) {
209
+ const { aiInput, value: rawValue, ...inputTask } = flowItem;
210
+ let locatePrompt;
211
+ let value;
212
+ if (inputTask.locate) {
213
+ value = aiInput || rawValue;
214
+ locatePrompt = inputTask.locate;
215
+ } else {
216
+ locatePrompt = aiInput || '';
217
+ value = rawValue;
218
+ }
219
+ await agent.callActionInActionSpace('Input', {
220
+ ...inputTask,
221
+ ...void 0 !== value ? {
222
+ value: String(value)
223
+ } : {},
224
+ ...locatePrompt ? {
225
+ locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, inputTask)
226
+ } : {}
227
+ });
228
+ } else if ('aiKeyboardPress' in flowItem) {
229
+ const { aiKeyboardPress, ...keyboardPressTask } = flowItem;
230
+ let locatePrompt;
231
+ let keyName;
232
+ if (keyboardPressTask.locate) {
233
+ keyName = aiKeyboardPress;
234
+ locatePrompt = keyboardPressTask.locate;
235
+ } else if (keyboardPressTask.keyName) {
236
+ keyName = keyboardPressTask.keyName;
237
+ locatePrompt = aiKeyboardPress;
238
+ } else keyName = aiKeyboardPress;
239
+ await agent.callActionInActionSpace('KeyboardPress', {
240
+ ...keyboardPressTask,
241
+ ...keyName ? {
242
+ keyName
243
+ } : {},
244
+ ...locatePrompt ? {
245
+ locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, keyboardPressTask)
246
+ } : {}
247
+ });
248
+ } else if ('aiScroll' in flowItem) {
249
+ const { aiScroll, ...scrollTask } = flowItem;
250
+ const { locate, ...scrollOptions } = scrollTask;
251
+ const locatePrompt = locate ?? aiScroll ?? void 0;
252
+ await agent.aiScroll(locatePrompt, scrollOptions);
253
+ } else if ('aiTap' in flowItem) {
254
+ const { aiTap, prompt, locate, ...tapOptions } = flowItem;
255
+ let locatePrompt;
256
+ let opts = tapOptions;
257
+ const locateObj = locate ?? ('object' == typeof aiTap && null !== aiTap ? aiTap.locate : void 0);
258
+ if ('string' == typeof aiTap && aiTap) locatePrompt = aiTap;
259
+ else if ('object' == typeof locateObj && locateObj?.prompt) {
260
+ const { prompt: lp, ...locateOpts } = locateObj;
261
+ locatePrompt = lp;
262
+ opts = {
263
+ ...locateOpts,
264
+ ...tapOptions
265
+ };
266
+ } else locatePrompt = aiTap?.prompt || prompt || locateObj;
267
+ (0, utils_namespaceObject.assert)(locatePrompt, 'missing prompt for aiTap');
268
+ await agent.aiTap(locatePrompt, opts);
269
+ } else {
270
+ const actionSpace = this.actionSpace;
271
+ let locatePromptShortcut;
272
+ let actionParamForMatchedAction;
273
+ const matchedAction = actionSpace.find((action)=>{
274
+ const actionInterfaceAlias = action.interfaceAlias;
275
+ if (actionInterfaceAlias && Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)) {
276
+ actionParamForMatchedAction = flowItem[actionInterfaceAlias];
277
+ if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
278
+ return true;
279
+ }
280
+ const keyOfActionInActionSpace = action.name;
281
+ if (Object.prototype.hasOwnProperty.call(flowItem, keyOfActionInActionSpace)) {
282
+ actionParamForMatchedAction = flowItem[keyOfActionInActionSpace];
283
+ if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
284
+ return true;
285
+ }
286
+ return false;
287
+ });
288
+ (0, utils_namespaceObject.assert)(matchedAction, `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`);
289
+ const schemaIsStringParam = isStringParamSchema(matchedAction.paramSchema);
290
+ let stringParamToCall;
291
+ const specialActionParamToCall = 'string' == typeof actionParamForMatchedAction ? buildShortcutActionParam(matchedAction.name, matchedAction.interfaceAlias, actionParamForMatchedAction) : void 0;
292
+ if (specialActionParamToCall) {
293
+ debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(specialActionParamToCall)}`);
294
+ const result = await agent.callActionInActionSpace(matchedAction.name, specialActionParamToCall);
295
+ const resultName = flowItem.name;
296
+ if (void 0 !== result) this.setResult(resultName, result);
297
+ } else if ('string' == typeof actionParamForMatchedAction && schemaIsStringParam) {
298
+ if (matchedAction.paramSchema) {
299
+ const parseResult = matchedAction.paramSchema.safeParse(actionParamForMatchedAction);
300
+ if (parseResult.success && 'string' == typeof parseResult.data) stringParamToCall = parseResult.data;
301
+ else if (!parseResult.success) {
302
+ debug(`parse failed for action ${matchedAction.name} with string param`, parseResult.error);
303
+ stringParamToCall = actionParamForMatchedAction;
304
+ }
305
+ } else stringParamToCall = actionParamForMatchedAction;
306
+ if (void 0 !== stringParamToCall) {
307
+ debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(stringParamToCall)}`);
308
+ const result = await agent.callActionInActionSpace(matchedAction.name, stringParamToCall);
309
+ const resultName = flowItem.name;
310
+ if (void 0 !== result) this.setResult(resultName, result);
311
+ }
312
+ } else {
313
+ const sourceForParams = locatePromptShortcut && 'string' == typeof actionParamForMatchedAction ? {
314
+ ...flowItem,
315
+ prompt: locatePromptShortcut
316
+ } : 'object' == typeof actionParamForMatchedAction && null !== actionParamForMatchedAction ? actionParamForMatchedAction : flowItem;
317
+ const { locateParam, restParams } = (0, external_utils_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePromptShortcut || '', sourceForParams, [
318
+ matchedAction.name,
319
+ matchedAction.interfaceAlias || '_never_mind_'
320
+ ]);
321
+ const flowParams = {
322
+ ...restParams,
323
+ locate: locateParam
324
+ };
325
+ debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(flowParams, null, 2)}`);
326
+ const result = await agent.callActionInActionSpace(matchedAction.name, flowParams);
327
+ const resultName = flowItem.name;
328
+ if (void 0 !== result) this.setResult(resultName, result);
329
+ }
330
+ }
331
+ }
332
+ this.reportFile = agent.reportFile;
333
+ await this.flushUnstableLogContent();
334
+ }
335
+ async run() {
336
+ const { target, web, android, ios, computer, tasks } = this.script;
337
+ const webEnv = web || target;
338
+ const androidEnv = android;
339
+ const iosEnv = ios;
340
+ const computerEnv = computer;
341
+ const platform = webEnv || androidEnv || iosEnv || computerEnv;
342
+ this.setPlayerStatus('running');
343
+ let agent = null;
344
+ let freeFn = [];
345
+ try {
346
+ const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(platform);
347
+ this.actionSpace = await newAgent.getActionSpace();
348
+ agent = newAgent;
349
+ const originalOnTaskStartTip = agent.onTaskStartTip;
350
+ agent.onTaskStartTip = (tip)=>{
351
+ if ('running' === this.status) this.agentStatusTip = tip;
352
+ originalOnTaskStartTip?.(tip);
353
+ };
354
+ freeFn = [
355
+ ...newFreeFn || [],
356
+ {
357
+ name: 'restore-agent-onTaskStartTip',
358
+ fn: ()=>{
359
+ if (agent) agent.onTaskStartTip = originalOnTaskStartTip;
360
+ }
361
+ }
362
+ ];
363
+ } catch (e) {
364
+ this.setPlayerStatus('error', e);
365
+ return;
366
+ }
367
+ this.interfaceAgent = agent;
368
+ let taskIndex = 0;
369
+ this.setPlayerStatus('running');
370
+ let errorFlag = false;
371
+ while(taskIndex < tasks.length){
372
+ const taskStatus = this.taskStatusList[taskIndex];
373
+ this.setTaskStatus(taskIndex, 'running');
374
+ this.setTaskIndex(taskIndex);
375
+ try {
376
+ await this.playTask(taskStatus, this.interfaceAgent);
377
+ this.setTaskStatus(taskIndex, 'done');
378
+ } catch (e) {
379
+ this.setTaskStatus(taskIndex, 'error', e);
380
+ if (taskStatus.continueOnError) ;
381
+ else {
382
+ this.reportFile = agent.reportFile;
383
+ errorFlag = true;
384
+ break;
385
+ }
386
+ }
387
+ this.reportFile = agent?.reportFile;
388
+ taskIndex++;
389
+ }
390
+ if (errorFlag) this.setPlayerStatus('error');
391
+ else this.setPlayerStatus('done');
392
+ this.agentStatusTip = '';
393
+ for (const fn of freeFn)try {
394
+ await fn.fn();
395
+ } catch (e) {}
396
+ }
397
+ constructor(script, setupAgent, onTaskStatusChange, scriptPath){
398
+ _define_property(this, "script", void 0);
399
+ _define_property(this, "setupAgent", void 0);
400
+ _define_property(this, "onTaskStatusChange", void 0);
401
+ _define_property(this, "currentTaskIndex", void 0);
402
+ _define_property(this, "taskStatusList", void 0);
403
+ _define_property(this, "status", void 0);
404
+ _define_property(this, "reportFile", void 0);
405
+ _define_property(this, "result", void 0);
406
+ _define_property(this, "unnamedResultIndex", void 0);
407
+ _define_property(this, "output", void 0);
408
+ _define_property(this, "unstableLogContent", void 0);
409
+ _define_property(this, "errorInSetup", void 0);
410
+ _define_property(this, "interfaceAgent", void 0);
411
+ _define_property(this, "agentStatusTip", void 0);
412
+ _define_property(this, "target", void 0);
413
+ _define_property(this, "actionSpace", void 0);
414
+ _define_property(this, "scriptPath", void 0);
415
+ this.script = script;
416
+ this.setupAgent = setupAgent;
417
+ this.onTaskStatusChange = onTaskStatusChange;
418
+ this.taskStatusList = [];
419
+ this.status = 'init';
420
+ this.unnamedResultIndex = 0;
421
+ this.interfaceAgent = null;
422
+ this.actionSpace = [];
423
+ this.scriptPath = scriptPath;
424
+ this.result = {};
425
+ const resolvedAiActContext = script.agent?.aiActContext ?? script.agent?.aiActionContext;
426
+ if (void 0 !== resolvedAiActContext && script.agent) {
427
+ if (void 0 === script.agent.aiActContext && void 0 !== script.agent.aiActionContext) console.warn('agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility.');
428
+ script.agent.aiActContext = resolvedAiActContext;
429
+ }
430
+ this.target = script.target || script.web || script.android || script.ios || script.computer || script.config;
431
+ if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) {
432
+ this.output = void 0;
433
+ debug('output is undefined in browser or worker');
434
+ } else if (this.target?.output) {
435
+ this.output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.output);
436
+ debug('setting output by config.output', this.output);
437
+ } else {
438
+ const scriptName = this.scriptPath ? (0, external_node_path_namespaceObject.basename)(this.scriptPath, '.yaml').replace(/\.(ya?ml)$/i, '') : "script";
439
+ this.output = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), `${scriptName}-${Date.now()}.json`);
440
+ debug("setting output by script path", this.output);
441
+ }
442
+ if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) this.unstableLogContent = void 0;
443
+ else if ('string' == typeof this.target?.unstableLogContent) this.unstableLogContent = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.unstableLogContent);
444
+ else if (this.target?.unstableLogContent === true) this.unstableLogContent = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), 'unstableLogContent.json');
445
+ this.taskStatusList = (script.tasks || []).map((task, taskIndex)=>({
446
+ ...task,
447
+ index: taskIndex,
448
+ status: 'init',
449
+ totalSteps: task.flow?.length || 0
450
+ }));
451
+ }
452
+ }
453
+ exports.ScriptPlayer = __webpack_exports__.ScriptPlayer;
454
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
455
+ "ScriptPlayer"
456
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
457
+ Object.defineProperty(exports, '__esModule', {
458
+ value: true
459
+ });
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ buildDetailedLocateParam: ()=>buildDetailedLocateParam,
37
+ buildDetailedLocateParamAndRestParams: ()=>buildDetailedLocateParamAndRestParams,
38
+ parseYamlScript: ()=>parseYamlScript,
39
+ interpolateEnvVars: ()=>interpolateEnvVars
40
+ });
41
+ const logger_namespaceObject = require("@godscene/shared/logger");
42
+ const utils_namespaceObject = require("@godscene/shared/utils");
43
+ const external_js_yaml_namespaceObject = require("js-yaml");
44
+ var external_js_yaml_default = /*#__PURE__*/ __webpack_require__.n(external_js_yaml_namespaceObject);
45
+ const debugUtils = (0, logger_namespaceObject.getDebug)('yaml:utils');
46
+ const multimodalLocateOptionFieldMap = {
47
+ images: true,
48
+ convertHttpImage2Base64: true
49
+ };
50
+ const multimodalLocateOptionKeys = Object.keys(multimodalLocateOptionFieldMap);
51
+ function extractMultimodalPrompt(opt) {
52
+ if ('object' != typeof opt || null === opt) return;
53
+ const entries = multimodalLocateOptionKeys.map((key)=>[
54
+ key,
55
+ opt[key]
56
+ ]).filter(([, value])=>void 0 !== value);
57
+ return entries.length ? Object.fromEntries(entries) : void 0;
58
+ }
59
+ function interpolateEnvVars(content) {
60
+ const lines = content.split('\n');
61
+ const processedLines = lines.map((line)=>{
62
+ const trimmedLine = line.trimStart();
63
+ if (trimmedLine.startsWith('#')) return line;
64
+ return line.replace(/\$\{([^}]+)\}/g, (_, envVar)=>{
65
+ const value = process.env[envVar.trim()];
66
+ if (void 0 === value) throw new Error(`Environment variable "${envVar.trim()}" is not defined`);
67
+ return value;
68
+ });
69
+ });
70
+ return processedLines.join('\n');
71
+ }
72
+ function parseYamlScript(content, filePath) {
73
+ let processedContent = content;
74
+ if (-1 !== content.indexOf('android') && content.match(/deviceId:\s*(\d+)/)) {
75
+ let matchedDeviceId;
76
+ processedContent = content.replace(/deviceId:\s*(\d+)/g, (match, deviceId)=>{
77
+ matchedDeviceId = deviceId;
78
+ return `deviceId: '${deviceId}'`;
79
+ });
80
+ console.warn(`please use string-style deviceId in yaml script, for example: deviceId: "${matchedDeviceId}"`);
81
+ }
82
+ const interpolatedContent = interpolateEnvVars(processedContent);
83
+ const obj = external_js_yaml_default().load(interpolatedContent, {
84
+ schema: external_js_yaml_default().JSON_SCHEMA
85
+ });
86
+ const pathTip = filePath ? `, failed to load ${filePath}` : '';
87
+ (0, utils_namespaceObject.assert)(obj.tasks, `property "tasks" is required in yaml script ${pathTip}`);
88
+ (0, utils_namespaceObject.assert)(Array.isArray(obj.tasks), `property "tasks" must be an array in yaml script, but got ${obj.tasks}`);
89
+ return obj;
90
+ }
91
+ function buildDetailedLocateParam(locatePrompt, opt) {
92
+ debugUtils('will call buildDetailedLocateParam', locatePrompt, opt);
93
+ let normalizedLocatePrompt = locatePrompt;
94
+ if ('object' == typeof locatePrompt && null !== locatePrompt && 'prompt' in locatePrompt) {
95
+ const { prompt: innerPrompt, ...rest } = locatePrompt;
96
+ const hasMultimodalFields = Object.keys(rest).length > 0;
97
+ normalizedLocatePrompt = hasMultimodalFields ? locatePrompt : innerPrompt;
98
+ }
99
+ let prompt = normalizedLocatePrompt || opt?.prompt || opt?.locate;
100
+ let deepLocate = false;
101
+ let cacheable = true;
102
+ let xpath;
103
+ if ('object' == typeof opt && null !== opt) {
104
+ deepLocate = opt.deepLocate ?? opt.deepThink ?? false;
105
+ cacheable = opt.cacheable ?? true;
106
+ xpath = opt.xpath;
107
+ if (locatePrompt && opt.prompt && locatePrompt !== opt.prompt) console.warn('conflict prompt for item', locatePrompt, opt, 'maybe you put the prompt in the wrong place');
108
+ prompt = prompt || opt.prompt;
109
+ }
110
+ if (!prompt) return void debugUtils('no prompt, will return undefined in buildDetailedLocateParam', opt);
111
+ const multimodalPrompt = extractMultimodalPrompt(opt);
112
+ if (multimodalPrompt) prompt = 'string' == typeof prompt ? {
113
+ prompt,
114
+ ...multimodalPrompt
115
+ } : {
116
+ ...prompt,
117
+ ...multimodalPrompt
118
+ };
119
+ return {
120
+ prompt,
121
+ deepLocate,
122
+ cacheable,
123
+ xpath
124
+ };
125
+ }
126
+ function buildDetailedLocateParamAndRestParams(locatePrompt, opt, excludeKeys = []) {
127
+ const multimodalPrompt = extractMultimodalPrompt(opt);
128
+ const locateParam = buildDetailedLocateParam(locatePrompt, opt);
129
+ const restParams = {};
130
+ if ('object' == typeof opt && null !== opt) {
131
+ const allKeys = Object.keys(opt);
132
+ const locateParamKeys = Object.keys(locateParam || {});
133
+ const multimodalPromptKeys = 'object' == typeof locateParam?.prompt && locateParam?.prompt !== null ? Object.keys(multimodalPrompt || {}) : [];
134
+ for (const key of allKeys)if (!locateParamKeys.includes(key) && !multimodalPromptKeys.includes(key) && !excludeKeys.includes(key) && 'locate' !== key) restParams[key] = opt[key];
135
+ }
136
+ return {
137
+ locateParam,
138
+ restParams
139
+ };
140
+ }
141
+ exports.buildDetailedLocateParam = __webpack_exports__.buildDetailedLocateParam;
142
+ exports.buildDetailedLocateParamAndRestParams = __webpack_exports__.buildDetailedLocateParamAndRestParams;
143
+ exports.interpolateEnvVars = __webpack_exports__.interpolateEnvVars;
144
+ exports.parseYamlScript = __webpack_exports__.parseYamlScript;
145
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
146
+ "buildDetailedLocateParam",
147
+ "buildDetailedLocateParamAndRestParams",
148
+ "interpolateEnvVars",
149
+ "parseYamlScript"
150
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
151
+ Object.defineProperty(exports, '__esModule', {
152
+ value: true
153
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });