@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.
Files changed (65) hide show
  1. package/dist/es/agent/agent.mjs +72 -25
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/index.mjs +2 -1
  4. package/dist/es/agent/insight.mjs +26 -10
  5. package/dist/es/agent/insight.mjs.map +1 -1
  6. package/dist/es/agent/prompt-context.mjs +12 -7
  7. package/dist/es/agent/prompt-context.mjs.map +1 -1
  8. package/dist/es/agent/run-gherkin-scenario.mjs +1 -1
  9. package/dist/es/agent/run-gherkin-scenario.mjs.map +1 -1
  10. package/dist/es/agent/tasks.mjs +2 -1
  11. package/dist/es/agent/tasks.mjs.map +1 -1
  12. package/dist/es/agent/test-runner-nodes.mjs +274 -0
  13. package/dist/es/agent/test-runner-nodes.mjs.map +1 -0
  14. package/dist/es/agent/utils.mjs +1 -1
  15. package/dist/es/ai-model/prompt/insight/user-prompt.mjs +1 -1
  16. package/dist/es/ai-model/prompt/insight/user-prompt.mjs.map +1 -1
  17. package/dist/es/ai-model/workflows/insight/extraction.mjs +3 -1
  18. package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -1
  19. package/dist/es/ai-model/workflows/planning/custom-planning.mjs +3 -3
  20. package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -1
  21. package/dist/es/ai-model/workflows/planning/standard-planning.mjs +1 -1
  22. package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -1
  23. package/dist/es/report-html-template.mjs +1 -1
  24. package/dist/es/types.mjs.map +1 -1
  25. package/dist/es/utils.mjs +1 -1
  26. package/dist/es/yaml/player.mjs +0 -5
  27. package/dist/es/yaml/player.mjs.map +1 -1
  28. package/dist/es/yaml.mjs.map +1 -1
  29. package/dist/lib/agent/agent.js +72 -25
  30. package/dist/lib/agent/agent.js.map +1 -1
  31. package/dist/lib/agent/index.js +57 -8
  32. package/dist/lib/agent/insight.js +26 -10
  33. package/dist/lib/agent/insight.js.map +1 -1
  34. package/dist/lib/agent/prompt-context.js +16 -8
  35. package/dist/lib/agent/prompt-context.js.map +1 -1
  36. package/dist/lib/agent/run-gherkin-scenario.js +1 -1
  37. package/dist/lib/agent/run-gherkin-scenario.js.map +1 -1
  38. package/dist/lib/agent/tasks.js +2 -1
  39. package/dist/lib/agent/tasks.js.map +1 -1
  40. package/dist/lib/agent/test-runner-nodes.js +353 -0
  41. package/dist/lib/agent/test-runner-nodes.js.map +1 -0
  42. package/dist/lib/agent/utils.js +1 -1
  43. package/dist/lib/ai-model/prompt/insight/user-prompt.js +1 -1
  44. package/dist/lib/ai-model/prompt/insight/user-prompt.js.map +1 -1
  45. package/dist/lib/ai-model/workflows/insight/extraction.js +3 -1
  46. package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -1
  47. package/dist/lib/ai-model/workflows/planning/custom-planning.js +3 -3
  48. package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -1
  49. package/dist/lib/ai-model/workflows/planning/standard-planning.js +1 -1
  50. package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -1
  51. package/dist/lib/report-html-template.js +1 -1
  52. package/dist/lib/types.js.map +1 -1
  53. package/dist/lib/utils.js +1 -1
  54. package/dist/lib/yaml/player.js +0 -5
  55. package/dist/lib/yaml/player.js.map +1 -1
  56. package/dist/lib/yaml.js.map +1 -1
  57. package/dist/types/agent/agent.d.ts +26 -3
  58. package/dist/types/agent/index.d.ts +3 -1
  59. package/dist/types/agent/insight.d.ts +5 -1
  60. package/dist/types/agent/prompt-context.d.ts +2 -0
  61. package/dist/types/agent/run-gherkin-scenario.d.ts +1 -0
  62. package/dist/types/agent/test-runner-nodes.d.ts +192 -0
  63. package/dist/types/types.d.ts +28 -0
  64. package/dist/types/yaml.d.ts +12 -4
  65. package/package.json +10 -2
@@ -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 aiActContext() {
96
- return this.opts.aiActContext ?? this.opts.aiActionContext;
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
- await this.setAIActContext(prompt);
204
+ warn('setAIActionContext() is deprecated; use setAIContext("aiAct", context) instead.');
205
+ this.setAIContext('aiAct', prompt);
184
206
  }
185
207
  async setAIActContext(prompt) {
186
- if (this.aiActContext) console.warn('aiActContext is already set, and it is called again, will override the previous setting');
187
- this.opts.aiActContext = prompt;
188
- this.opts.aiActionContext = prompt;
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 internalReportDisplay = opt?._internalReportDisplay;
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 !== void 0 ? opt.context : this.aiActContext;
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
- ...opt,
579
- timeoutMs: opt?.timeoutMs || 15000,
580
- checkIntervalMs: opt?.checkIntervalMs || 3000
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
- const resolvedAiActContext = this.opts.aiActContext ?? this.opts.aiActionContext;
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 ??= resolvedAiActContext;
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;