@midscene/core 1.12.4-beta-20260904065253.0 → 1.12.4
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/agent/agent.mjs +72 -25
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/index.mjs +2 -1
- package/dist/es/agent/insight.mjs +26 -10
- package/dist/es/agent/insight.mjs.map +1 -1
- package/dist/es/agent/prompt-context.mjs +12 -7
- package/dist/es/agent/prompt-context.mjs.map +1 -1
- package/dist/es/agent/run-gherkin-scenario.mjs +1 -1
- package/dist/es/agent/run-gherkin-scenario.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +2 -1
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/test-runner-nodes.mjs +274 -0
- package/dist/es/agent/test-runner-nodes.mjs.map +1 -0
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/prompt/insight/user-prompt.mjs +1 -1
- package/dist/es/ai-model/prompt/insight/user-prompt.mjs.map +1 -1
- package/dist/es/ai-model/workflows/insight/extraction.mjs +3 -1
- package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -1
- package/dist/es/ai-model/workflows/planning/custom-planning.mjs +3 -3
- package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -1
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs +1 -1
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/es/yaml/player.mjs +0 -5
- package/dist/es/yaml/player.mjs.map +1 -1
- package/dist/es/yaml.mjs.map +1 -1
- package/dist/lib/agent/agent.js +72 -25
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/index.js +57 -8
- package/dist/lib/agent/insight.js +26 -10
- package/dist/lib/agent/insight.js.map +1 -1
- package/dist/lib/agent/prompt-context.js +16 -8
- package/dist/lib/agent/prompt-context.js.map +1 -1
- package/dist/lib/agent/run-gherkin-scenario.js +1 -1
- package/dist/lib/agent/run-gherkin-scenario.js.map +1 -1
- package/dist/lib/agent/tasks.js +2 -1
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/test-runner-nodes.js +353 -0
- package/dist/lib/agent/test-runner-nodes.js.map +1 -0
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/prompt/insight/user-prompt.js +1 -1
- package/dist/lib/ai-model/prompt/insight/user-prompt.js.map +1 -1
- package/dist/lib/ai-model/workflows/insight/extraction.js +3 -1
- package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -1
- package/dist/lib/ai-model/workflows/planning/custom-planning.js +3 -3
- package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -1
- package/dist/lib/ai-model/workflows/planning/standard-planning.js +1 -1
- package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/lib/yaml/player.js +0 -5
- package/dist/lib/yaml/player.js.map +1 -1
- package/dist/lib/yaml.js.map +1 -1
- package/dist/types/agent/agent.d.ts +26 -3
- package/dist/types/agent/index.d.ts +3 -1
- package/dist/types/agent/insight.d.ts +5 -1
- package/dist/types/agent/prompt-context.d.ts +2 -0
- package/dist/types/agent/run-gherkin-scenario.d.ts +1 -0
- package/dist/types/agent/test-runner-nodes.d.ts +192 -0
- package/dist/types/types.d.ts +28 -0
- package/dist/types/yaml.d.ts +12 -4
- package/package.json +10 -2
package/dist/lib/agent/agent.js
CHANGED
|
@@ -50,6 +50,7 @@ const external_utils_js_namespaceObject = require("../utils.js");
|
|
|
50
50
|
const external_yaml_index_js_namespaceObject = require("../yaml/index.js");
|
|
51
51
|
const promises_namespaceObject = require("node:fs/promises");
|
|
52
52
|
const external_node_path_namespaceObject = require("node:path");
|
|
53
|
+
const agent_context_namespaceObject = require("@midscene/shared/agent-tools/agent-context");
|
|
53
54
|
const error_formatter_namespaceObject = require("@midscene/shared/agent-tools/error-formatter");
|
|
54
55
|
const observation_artifact_namespaceObject = require("@midscene/shared/agent-tools/observation-artifact");
|
|
55
56
|
const env_namespaceObject = require("@midscene/shared/env");
|
|
@@ -67,6 +68,7 @@ const external_run_gherkin_scenario_js_namespaceObject = require("./run-gherkin-
|
|
|
67
68
|
const external_run_markdown_js_namespaceObject = require("./run-markdown.js");
|
|
68
69
|
const external_task_cache_js_namespaceObject = require("./task-cache.js");
|
|
69
70
|
const external_tasks_js_namespaceObject = require("./tasks.js");
|
|
71
|
+
const external_test_runner_nodes_js_namespaceObject = require("./test-runner-nodes.js");
|
|
70
72
|
const external_ui_observer_js_namespaceObject = require("./ui-observer.js");
|
|
71
73
|
const external_ui_utils_js_namespaceObject = require("./ui-utils.js");
|
|
72
74
|
const external_utils_js_namespaceObject_1 = require("./utils.js");
|
|
@@ -85,6 +87,9 @@ const warn = (0, logger_namespaceObject.getDebug)('agent', {
|
|
|
85
87
|
console: true
|
|
86
88
|
});
|
|
87
89
|
class Agent {
|
|
90
|
+
static getTestRunnerNodeDefinitions() {
|
|
91
|
+
return external_test_runner_nodes_js_namespaceObject.commonAgentTestRunnerNodeDefinitions;
|
|
92
|
+
}
|
|
88
93
|
get onDumpUpdate() {
|
|
89
94
|
return this.dumpUpdateListeners[0];
|
|
90
95
|
}
|
|
@@ -92,8 +97,24 @@ class Agent {
|
|
|
92
97
|
this.dumpUpdateListeners = [];
|
|
93
98
|
if (callback) this.dumpUpdateListeners.push(callback);
|
|
94
99
|
}
|
|
95
|
-
get
|
|
96
|
-
|
|
100
|
+
get aiContexts() {
|
|
101
|
+
if (!this.opts.aiContexts) this.opts.aiContexts = {};
|
|
102
|
+
return this.opts.aiContexts;
|
|
103
|
+
}
|
|
104
|
+
resolveUserContext(apiName, callContext) {
|
|
105
|
+
if (void 0 !== callContext) return callContext;
|
|
106
|
+
const apiContext = this.opts.aiContexts?.[apiName];
|
|
107
|
+
if (void 0 !== apiContext) return apiContext;
|
|
108
|
+
const defaultContext = this.opts.aiContexts?.default;
|
|
109
|
+
if (void 0 !== defaultContext) return defaultContext;
|
|
110
|
+
}
|
|
111
|
+
withContext(apiName, options) {
|
|
112
|
+
const resolvedContext = this.resolveUserContext(apiName, options?.context);
|
|
113
|
+
if (void 0 === resolvedContext) return options;
|
|
114
|
+
return {
|
|
115
|
+
...options ?? {},
|
|
116
|
+
context: resolvedContext
|
|
117
|
+
};
|
|
97
118
|
}
|
|
98
119
|
get page() {
|
|
99
120
|
return this.interface;
|
|
@@ -119,7 +140,7 @@ class Agent {
|
|
|
119
140
|
};
|
|
120
141
|
}
|
|
121
142
|
createInsight(getUIContext) {
|
|
122
|
-
return new external_insight_js_namespaceObject.Insight(this.taskExecutor, ()=>this.resolveModelRuntime('insight'), getUIContext);
|
|
143
|
+
return new external_insight_js_namespaceObject.Insight(this.taskExecutor, ()=>this.resolveModelRuntime('insight'), (apiName, callContext)=>this.resolveUserContext(apiName, callContext), getUIContext);
|
|
123
144
|
}
|
|
124
145
|
async getActionSpace() {
|
|
125
146
|
return this.fullActionSpace;
|
|
@@ -180,12 +201,24 @@ class Agent {
|
|
|
180
201
|
return observer;
|
|
181
202
|
}
|
|
182
203
|
async setAIActionContext(prompt) {
|
|
183
|
-
|
|
204
|
+
warn('setAIActionContext() is deprecated; use setAIContext("aiAct", context) instead.');
|
|
205
|
+
this.setAIContext('aiAct', prompt);
|
|
184
206
|
}
|
|
185
207
|
async setAIActContext(prompt) {
|
|
186
|
-
|
|
187
|
-
this.
|
|
188
|
-
|
|
208
|
+
warn('setAIActContext() is deprecated; use setAIContext("aiAct", context) instead.');
|
|
209
|
+
this.setAIContext('aiAct', prompt);
|
|
210
|
+
}
|
|
211
|
+
setAIContext(target, context) {
|
|
212
|
+
if (!(0, agent_context_namespaceObject.isAgentAIContextKey)(target)) throw new TypeError(`Unknown Agent context key: ${String(target)}`);
|
|
213
|
+
if (void 0 !== context && 'string' != typeof context) throw new TypeError('Agent context must be a string or undefined');
|
|
214
|
+
this.aiContexts[target] = context;
|
|
215
|
+
if ('aiAct' === target) if (void 0 === context) {
|
|
216
|
+
this.opts.aiActContext = void 0;
|
|
217
|
+
this.opts.aiActionContext = void 0;
|
|
218
|
+
} else {
|
|
219
|
+
this.opts.aiActContext = context;
|
|
220
|
+
this.opts.aiActionContext = context;
|
|
221
|
+
}
|
|
189
222
|
}
|
|
190
223
|
resetDump() {
|
|
191
224
|
this.dump = new external_types_js_namespaceObject.ReportActionDump({
|
|
@@ -289,7 +322,7 @@ class Agent {
|
|
|
289
322
|
}
|
|
290
323
|
async aiTap(locatePrompt, opt) {
|
|
291
324
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for tap');
|
|
292
|
-
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
|
|
325
|
+
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, this.withContext('aiTap', opt));
|
|
293
326
|
const fileChooserAccept = opt?.fileChooserAccept ? this.normalizeFileInput(opt.fileChooserAccept) : void 0;
|
|
294
327
|
await (0, external_tasks_js_namespaceObject.withFileChooser)(this.interface, fileChooserAccept, async ()=>{
|
|
295
328
|
await this.callActionInActionSpace('Tap', {
|
|
@@ -299,21 +332,21 @@ class Agent {
|
|
|
299
332
|
}
|
|
300
333
|
async aiRightClick(locatePrompt, opt) {
|
|
301
334
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for right click');
|
|
302
|
-
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
|
|
335
|
+
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, this.withContext('aiRightClick', opt));
|
|
303
336
|
await this.callActionInActionSpace('RightClick', {
|
|
304
337
|
locate: detailedLocateParam
|
|
305
338
|
});
|
|
306
339
|
}
|
|
307
340
|
async aiDoubleClick(locatePrompt, opt) {
|
|
308
341
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for double click');
|
|
309
|
-
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
|
|
342
|
+
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, this.withContext('aiDoubleClick', opt));
|
|
310
343
|
await this.callActionInActionSpace('DoubleClick', {
|
|
311
344
|
locate: detailedLocateParam
|
|
312
345
|
});
|
|
313
346
|
}
|
|
314
347
|
async aiHover(locatePrompt, opt) {
|
|
315
348
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for hover');
|
|
316
|
-
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
|
|
349
|
+
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, this.withContext('aiHover', opt));
|
|
317
350
|
await this.callActionInActionSpace('Hover', {
|
|
318
351
|
locate: detailedLocateParam
|
|
319
352
|
});
|
|
@@ -337,7 +370,7 @@ class Agent {
|
|
|
337
370
|
}
|
|
338
371
|
(0, utils_namespaceObject.assert)('string' == typeof value || 'number' == typeof value, 'input value must be a string or number, use empty string if you want to clear the input');
|
|
339
372
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for input');
|
|
340
|
-
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt, opt);
|
|
373
|
+
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt, this.withContext('aiInput', opt));
|
|
341
374
|
const stringValue = 'number' == typeof value ? String(value) : value;
|
|
342
375
|
const mode = opt?.mode === 'append' ? 'typeOnly' : opt?.mode;
|
|
343
376
|
await this.callActionInActionSpace('Input', {
|
|
@@ -363,7 +396,7 @@ class Agent {
|
|
|
363
396
|
};
|
|
364
397
|
}
|
|
365
398
|
(0, utils_namespaceObject.assert)(opt?.keyName, 'missing keyName for keyboard press');
|
|
366
|
-
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', opt);
|
|
399
|
+
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', this.withContext('aiKeyboardPress', opt));
|
|
367
400
|
await this.callActionInActionSpace('KeyboardPress', {
|
|
368
401
|
...restParams,
|
|
369
402
|
locate: locateParam
|
|
@@ -395,14 +428,14 @@ class Agent {
|
|
|
395
428
|
scrollType: normalizedScrollType
|
|
396
429
|
};
|
|
397
430
|
}
|
|
398
|
-
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', opt);
|
|
431
|
+
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', this.withContext('aiScroll', opt));
|
|
399
432
|
await this.callActionInActionSpace('Scroll', {
|
|
400
433
|
...restParams,
|
|
401
434
|
locate: locateParam
|
|
402
435
|
});
|
|
403
436
|
}
|
|
404
437
|
async aiPinch(locatePrompt, opt) {
|
|
405
|
-
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', opt);
|
|
438
|
+
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt || '', this.withContext('aiPinch', opt));
|
|
406
439
|
await this.callActionInActionSpace('Pinch', {
|
|
407
440
|
...restParams,
|
|
408
441
|
locate: locateParam
|
|
@@ -410,7 +443,7 @@ class Agent {
|
|
|
410
443
|
}
|
|
411
444
|
async aiLongPress(locatePrompt, opt) {
|
|
412
445
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for long press');
|
|
413
|
-
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt, opt);
|
|
446
|
+
const { locateParam, restParams } = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePrompt, this.withContext('aiLongPress', opt));
|
|
414
447
|
await this.callActionInActionSpace('LongPress', {
|
|
415
448
|
...restParams,
|
|
416
449
|
locate: locateParam
|
|
@@ -418,13 +451,14 @@ class Agent {
|
|
|
418
451
|
}
|
|
419
452
|
async aiClearInput(locatePrompt, opt) {
|
|
420
453
|
(0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for clear input');
|
|
421
|
-
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
|
|
454
|
+
const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, this.withContext('aiClearInput', opt));
|
|
422
455
|
await this.callActionInActionSpace('ClearInput', {
|
|
423
456
|
locate: detailedLocateParam
|
|
424
457
|
});
|
|
425
458
|
}
|
|
426
459
|
async aiAct(taskPrompt, opt) {
|
|
427
|
-
const
|
|
460
|
+
const internalOptions = opt;
|
|
461
|
+
const internalReportDisplay = internalOptions?._internalReportDisplay;
|
|
428
462
|
const taskPromptText = 'string' == typeof taskPrompt ? taskPrompt : taskPrompt.prompt;
|
|
429
463
|
const reportPrompt = internalReportDisplay?.prompt || taskPromptText;
|
|
430
464
|
const fileChooserAccept = opt?.fileChooserAccept ? this.normalizeFileInput(opt.fileChooserAccept) : void 0;
|
|
@@ -433,7 +467,7 @@ class Agent {
|
|
|
433
467
|
const runAiAct = async ()=>{
|
|
434
468
|
const planningModel = this.resolveModelRuntime('planning');
|
|
435
469
|
const defaultModel = this.resolveModelRuntime('default');
|
|
436
|
-
const aiActContext = opt?.context
|
|
470
|
+
const aiActContext = this.resolveUserContext('aiAct', opt?.context);
|
|
437
471
|
const cachePrompt = (0, external_prompt_context_js_namespaceObject.buildPromptWithContext)(taskPrompt, aiActContext);
|
|
438
472
|
const effort = (()=>{
|
|
439
473
|
const resolvedEffort = opt?.effort ?? (opt?.deepThink === true ? 'deepThink' : 'balance');
|
|
@@ -551,7 +585,7 @@ class Agent {
|
|
|
551
585
|
return this.createInsight().aiAsk(prompt, opt);
|
|
552
586
|
}
|
|
553
587
|
async aiLocate(prompt, opt) {
|
|
554
|
-
const locateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(prompt, opt);
|
|
588
|
+
const locateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(prompt, this.withContext('aiLocate', opt));
|
|
555
589
|
(0, utils_namespaceObject.assert)(locateParam, 'cannot get locate param for aiLocate');
|
|
556
590
|
const locatePlan = (0, external_tasks_js_namespaceObject.locatePlanForLocate)(locateParam);
|
|
557
591
|
const plans = [
|
|
@@ -574,10 +608,11 @@ class Agent {
|
|
|
574
608
|
}
|
|
575
609
|
async aiWaitFor(assertion, opt) {
|
|
576
610
|
const modelRuntime = this.resolveModelRuntime('insight');
|
|
611
|
+
const options = this.withContext('aiWaitFor', opt);
|
|
577
612
|
await this.taskExecutor.waitFor(assertion, {
|
|
578
|
-
...
|
|
579
|
-
timeoutMs:
|
|
580
|
-
checkIntervalMs:
|
|
613
|
+
...options,
|
|
614
|
+
timeoutMs: options?.timeoutMs || 15000,
|
|
615
|
+
checkIntervalMs: options?.checkIntervalMs || 3000
|
|
581
616
|
}, modelRuntime);
|
|
582
617
|
}
|
|
583
618
|
async ai(...args) {
|
|
@@ -846,11 +881,23 @@ class Agent {
|
|
|
846
881
|
groupDescription: ''
|
|
847
882
|
}, opts || {});
|
|
848
883
|
(0, external_report_generator_js_namespaceObject.assertReportGenerationOptions)(this.opts);
|
|
849
|
-
|
|
884
|
+
if (void 0 !== this.opts.aiContexts && ('object' != typeof this.opts.aiContexts || null === this.opts.aiContexts || Array.isArray(this.opts.aiContexts))) throw new TypeError('opts.aiContexts must be a plain object');
|
|
885
|
+
for (const [key, value] of Object.entries(this.opts.aiContexts ?? {})){
|
|
886
|
+
if (!(0, agent_context_namespaceObject.isAgentAIContextKey)(key)) throw new TypeError(`Unknown Agent context key: ${key}`);
|
|
887
|
+
if (void 0 !== value && 'string' != typeof value) throw new TypeError(`Agent context "${key}" must be a string`);
|
|
888
|
+
}
|
|
889
|
+
const deprecatedAiActContextOption = void 0 !== this.opts.aiActContext ? 'aiActContext' : void 0 !== this.opts.aiActionContext ? 'aiActionContext' : void 0;
|
|
890
|
+
if (deprecatedAiActContextOption) warn(`Agent option "${deprecatedAiActContextOption}" is deprecated; use "aiContexts.aiAct" instead. When both are provided, "aiContexts.aiAct" takes precedence.`);
|
|
891
|
+
const normalizedAIContexts = {
|
|
892
|
+
...this.opts.aiContexts
|
|
893
|
+
};
|
|
894
|
+
const resolvedAiActContext = normalizedAIContexts.aiAct ?? this.opts.aiActContext ?? this.opts.aiActionContext;
|
|
850
895
|
if (void 0 !== resolvedAiActContext) {
|
|
896
|
+
normalizedAIContexts.aiAct = resolvedAiActContext;
|
|
851
897
|
this.opts.aiActContext = resolvedAiActContext;
|
|
852
|
-
this.opts.aiActionContext
|
|
898
|
+
this.opts.aiActionContext = resolvedAiActContext;
|
|
853
899
|
}
|
|
900
|
+
this.opts.aiContexts = normalizedAIContexts;
|
|
854
901
|
if (opts?.modelConfig && ('object' != typeof opts?.modelConfig || Array.isArray(opts.modelConfig))) throw new Error(`opts.modelConfig must be a plain object map of env keys to values, but got ${typeof opts?.modelConfig}`);
|
|
855
902
|
const hasCustomConfig = opts?.modelConfig || opts?.createOpenAIClient;
|
|
856
903
|
this.modelConfigManager = hasCustomConfig ? new env_namespaceObject.ModelConfigManager(opts?.modelConfig, opts?.createOpenAIClient) : env_namespaceObject.globalModelConfigManager;
|