@midscene/web 0.19.1 → 0.20.0

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 (73) hide show
  1. package/dist/es/agent.js +299 -247
  2. package/dist/es/agent.js.map +1 -1
  3. package/dist/es/bridge-mode-browser.js +3 -3
  4. package/dist/es/bridge-mode.js +301 -249
  5. package/dist/es/bridge-mode.js.map +1 -1
  6. package/dist/es/chrome-extension.js +342 -290
  7. package/dist/es/chrome-extension.js.map +1 -1
  8. package/dist/es/index.js +307 -247
  9. package/dist/es/index.js.map +1 -1
  10. package/dist/es/midscene-playground.js +341 -289
  11. package/dist/es/midscene-playground.js.map +1 -1
  12. package/dist/es/midscene-server.js +25 -12
  13. package/dist/es/midscene-server.js.map +1 -1
  14. package/dist/es/playground.js +341 -289
  15. package/dist/es/playground.js.map +1 -1
  16. package/dist/es/playwright-report.js +14 -1
  17. package/dist/es/playwright-report.js.map +1 -1
  18. package/dist/es/playwright-reporter.js +14 -1
  19. package/dist/es/playwright-reporter.js.map +1 -1
  20. package/dist/es/playwright.js +307 -247
  21. package/dist/es/playwright.js.map +1 -1
  22. package/dist/es/puppeteer-agent-launcher.js +299 -247
  23. package/dist/es/puppeteer-agent-launcher.js.map +1 -1
  24. package/dist/es/puppeteer.js +299 -247
  25. package/dist/es/puppeteer.js.map +1 -1
  26. package/dist/es/utils.js +42 -8
  27. package/dist/es/utils.js.map +1 -1
  28. package/dist/es/yaml.js +11 -4
  29. package/dist/es/yaml.js.map +1 -1
  30. package/dist/lib/agent.js +308 -256
  31. package/dist/lib/agent.js.map +1 -1
  32. package/dist/lib/bridge-mode-browser.js +3 -3
  33. package/dist/lib/bridge-mode.js +310 -258
  34. package/dist/lib/bridge-mode.js.map +1 -1
  35. package/dist/lib/chrome-extension.js +355 -303
  36. package/dist/lib/chrome-extension.js.map +1 -1
  37. package/dist/lib/index.js +316 -256
  38. package/dist/lib/index.js.map +1 -1
  39. package/dist/lib/midscene-playground.js +354 -302
  40. package/dist/lib/midscene-playground.js.map +1 -1
  41. package/dist/lib/midscene-server.js +28 -15
  42. package/dist/lib/midscene-server.js.map +1 -1
  43. package/dist/lib/playground.js +354 -302
  44. package/dist/lib/playground.js.map +1 -1
  45. package/dist/lib/playwright-report.js +20 -7
  46. package/dist/lib/playwright-report.js.map +1 -1
  47. package/dist/lib/playwright-reporter.js +20 -7
  48. package/dist/lib/playwright-reporter.js.map +1 -1
  49. package/dist/lib/playwright.js +316 -256
  50. package/dist/lib/playwright.js.map +1 -1
  51. package/dist/lib/puppeteer-agent-launcher.js +308 -256
  52. package/dist/lib/puppeteer-agent-launcher.js.map +1 -1
  53. package/dist/lib/puppeteer.js +308 -256
  54. package/dist/lib/puppeteer.js.map +1 -1
  55. package/dist/lib/utils.js +48 -13
  56. package/dist/lib/utils.js.map +1 -1
  57. package/dist/lib/yaml.js +11 -4
  58. package/dist/lib/yaml.js.map +1 -1
  59. package/dist/types/agent.d.ts +6 -102
  60. package/dist/types/bridge-mode-browser.d.ts +3 -2
  61. package/dist/types/bridge-mode.d.ts +4 -4
  62. package/dist/types/{browser-5dbb4bfb.d.ts → browser-118d886d.d.ts} +1 -1
  63. package/dist/types/chrome-extension.d.ts +2 -2
  64. package/dist/types/index.d.ts +1 -1
  65. package/dist/types/midscene-server.d.ts +2 -2
  66. package/dist/types/{page-90e9f9a7.d.ts → page-471361cd.d.ts} +102 -3
  67. package/dist/types/playground.d.ts +2 -2
  68. package/dist/types/playwright.d.ts +6 -2
  69. package/dist/types/puppeteer-agent-launcher.d.ts +1 -1
  70. package/dist/types/puppeteer.d.ts +3 -3
  71. package/dist/types/utils.d.ts +2 -1
  72. package/dist/types/yaml.d.ts +1 -1
  73. package/package.json +3 -3
@@ -1,10 +1,11 @@
1
1
  import { Page as Page$2 } from 'playwright';
2
2
  import * as _midscene_core from '@midscene/core';
3
- import { BaseElement, Rect, UIContext, PlaywrightParserOpt, PlanningLocateParam, ElementTreeNode, ExecutionDump, Size, Point, PageType } from '@midscene/core';
3
+ import { BaseElement, Rect, Insight, ExecutionTaskProgressOptions, PlanningAction, ExecutionTaskApply, Executor, MidsceneYamlFlowItem, InsightExtractParam, InsightExtractOption, InsightAssertionResponse, PlanningActionParamWaitFor, UIContext, PlaywrightParserOpt, PlanningLocateParam, ElementTreeNode, ExecutionDump, Size, Point, PageType } from '@midscene/core';
4
4
  import { ElementInfo, ElementNode } from '@midscene/shared/extractor';
5
5
  import { Page as Page$1, KeyInput } from 'puppeteer';
6
6
  import { DebugFunction } from '@midscene/shared/logger';
7
7
  import { NodeType } from '@midscene/shared/constants';
8
+ import { ChatCompletionMessageParam } from '@midscene/core/ai-model';
8
9
 
9
10
  declare class WebElementInfo implements BaseElement {
10
11
  content: string;
@@ -32,6 +33,103 @@ declare class WebElementInfo implements BaseElement {
32
33
  });
33
34
  }
34
35
 
36
+ interface PlanningCache {
37
+ type: 'plan';
38
+ prompt: string;
39
+ yamlWorkflow: string;
40
+ }
41
+ interface LocateCache {
42
+ type: 'locate';
43
+ prompt: string;
44
+ xpaths: string[];
45
+ }
46
+ interface MatchCacheResult<T extends PlanningCache | LocateCache> {
47
+ cacheContent: T;
48
+ updateFn: (cb: (cache: T) => void) => void;
49
+ }
50
+ type CacheFileContent = {
51
+ midsceneVersion: string;
52
+ cacheId: string;
53
+ caches: Array<PlanningCache | LocateCache>;
54
+ };
55
+ declare class TaskCache {
56
+ cacheId: string;
57
+ cacheFilePath?: string;
58
+ cache: CacheFileContent;
59
+ isCacheResultUsed: boolean;
60
+ cacheOriginalLength: number;
61
+ private matchedCacheIndices;
62
+ constructor(cacheId: string, isCacheResultUsed: boolean, cacheFilePath?: string);
63
+ matchCache(prompt: string, type: 'plan' | 'locate'): MatchCacheResult<PlanningCache | LocateCache> | undefined;
64
+ matchPlanCache(prompt: string): MatchCacheResult<PlanningCache> | undefined;
65
+ matchLocateCache(prompt: string): MatchCacheResult<LocateCache> | undefined;
66
+ appendCache(cache: PlanningCache | LocateCache): void;
67
+ loadCacheFromFile(): CacheFileContent | undefined;
68
+ flushCacheToFile(): void;
69
+ updateOrAppendCacheRecord(newRecord: PlanningCache | LocateCache, cachedRecord?: MatchCacheResult<PlanningCache | LocateCache>): void;
70
+ }
71
+
72
+ interface ExecutionResult<OutputType = any> {
73
+ output: OutputType;
74
+ executor: Executor;
75
+ }
76
+ declare class PageTaskExecutor {
77
+ page: WebPage$1;
78
+ insight: Insight<WebElementInfo, WebUIContext>;
79
+ taskCache?: TaskCache;
80
+ conversationHistory: ChatCompletionMessageParam[];
81
+ onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];
82
+ constructor(page: WebPage$1, insight: Insight<WebElementInfo, WebUIContext>, opts: {
83
+ taskCache?: TaskCache;
84
+ onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];
85
+ });
86
+ private recordScreenshot;
87
+ private getElementXpath;
88
+ private prependExecutorWithScreenshot;
89
+ convertPlanToExecutable(plans: PlanningAction[], opts?: {
90
+ cacheable?: boolean;
91
+ }): Promise<{
92
+ tasks: ExecutionTaskApply<any, any, any, any>[];
93
+ }>;
94
+ private setupPlanningContext;
95
+ loadYamlFlowAsPlanning(userInstruction: string, yamlString: string): Promise<{
96
+ executor: Executor;
97
+ }>;
98
+ private planningTaskFromPrompt;
99
+ private planningTaskToGoal;
100
+ runPlans(title: string, plans: PlanningAction[], opts?: {
101
+ cacheable?: boolean;
102
+ }): Promise<ExecutionResult>;
103
+ action(userPrompt: string, actionContext?: string, opts?: {
104
+ cacheable?: boolean;
105
+ }): Promise<ExecutionResult<{
106
+ yamlFlow?: MidsceneYamlFlowItem[];
107
+ } | undefined>>;
108
+ actionToGoal(userPrompt: string, opts?: {
109
+ cacheable?: boolean;
110
+ }): Promise<ExecutionResult<{
111
+ yamlFlow?: MidsceneYamlFlowItem[];
112
+ } | undefined>>;
113
+ private createTypeQueryTask;
114
+ query(demand: InsightExtractParam, opt?: InsightExtractOption): Promise<ExecutionResult>;
115
+ boolean(prompt: string, opt?: InsightExtractOption): Promise<ExecutionResult<boolean>>;
116
+ number(prompt: string, opt?: InsightExtractOption): Promise<ExecutionResult<number>>;
117
+ string(prompt: string, opt?: InsightExtractOption): Promise<ExecutionResult<string>>;
118
+ assert(assertion: string): Promise<ExecutionResult<InsightAssertionResponse>>;
119
+ /**
120
+ * Append a message to the conversation history
121
+ * For user messages with images:
122
+ * - Keep max 4 user image messages in history
123
+ * - Remove oldest user image message when limit reached
124
+ * For assistant messages:
125
+ * - Simply append to history
126
+ * @param conversationHistory Message to append
127
+ */
128
+ private appendConversationHistory;
129
+ private appendErrorPlan;
130
+ waitFor(assertion: string, opt: PlanningActionParamWaitFor): Promise<ExecutionResult<void>>;
131
+ }
132
+
35
133
  type WebUIContext = UIContext<WebElementInfo> & {
36
134
  url: string;
37
135
  };
@@ -48,6 +146,7 @@ declare const ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = "NOT_IMPLEMENTED_AS_DESIG
48
146
  declare function replaceIllegalPathCharsAndSpace(str: string): string;
49
147
  declare function forceClosePopup(page: Page$1 | Page$2, debug: DebugFunction): void;
50
148
  declare function matchElementFromPlan(planLocateParam: PlanningLocateParam, tree: ElementTreeNode<BaseElement>): any;
149
+ declare function matchElementFromCache(taskExecutor: PageTaskExecutor, xpaths: string[] | undefined, cachePrompt: string, cacheable: boolean | undefined): Promise<any>;
51
150
  declare function trimContextByViewport(execution: ExecutionDump): {
52
151
  tasks: {
53
152
  type: any;
@@ -60,7 +159,7 @@ declare function trimContextByViewport(execution: ExecutionDump): {
60
159
  output?: any;
61
160
  log?: any;
62
161
  recorder?: _midscene_core.ExecutionRecorderItem[];
63
- cache?: _midscene_core.TaskCacheInfo;
162
+ hitBy?: _midscene_core.ExecutionTaskHitBy;
64
163
  status: "pending" | "running" | "finished" | "failed" | "cancelled";
65
164
  error?: string;
66
165
  errorStack?: string;
@@ -368,4 +467,4 @@ declare class WebPage extends Page<'playwright', Page$2> {
368
467
  constructor(page: Page$2);
369
468
  }
370
469
 
371
- export { type AndroidDevicePage as A, ChromeExtensionProxyPage as C, ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED as E, type PuppeteerPageOpt as P, StaticPage as S, type WebPage$1 as W, type AndroidDeviceInputOpt as a, AbstractPage as b, WebPage$2 as c, WebPage as d, WebElementInfo as e, type WebUIContext as f, type ChromePageDestroyOptions as g, printReportMsg as h, getCurrentExecutionFile as i, generateCacheId as j, replaceIllegalPathCharsAndSpace as k, forceClosePopup as l, matchElementFromPlan as m, parseContextFromWebPage as p, reportFileName as r, trimContextByViewport as t };
470
+ export { type AndroidDevicePage as A, ChromeExtensionProxyPage as C, ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED as E, type PuppeteerPageOpt as P, StaticPage as S, TaskCache as T, type WebPage$1 as W, type AndroidDeviceInputOpt as a, AbstractPage as b, WebPage$2 as c, WebElementInfo as d, type WebUIContext as e, PageTaskExecutor as f, WebPage as g, type ChromePageDestroyOptions as h, printReportMsg as i, getCurrentExecutionFile as j, generateCacheId as k, replaceIllegalPathCharsAndSpace as l, forceClosePopup as m, matchElementFromPlan as n, matchElementFromCache as o, parseContextFromWebPage as p, reportFileName as r, trimContextByViewport as t };
@@ -1,5 +1,5 @@
1
- import { S as StaticPage } from './page-90e9f9a7.js';
2
- export { E as ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from './page-90e9f9a7.js';
1
+ import { S as StaticPage } from './page-471361cd.js';
2
+ export { E as ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED } from './page-471361cd.js';
3
3
  import { PageAgent } from './agent.js';
4
4
  import 'playwright';
5
5
  import '@midscene/core';
@@ -1,14 +1,14 @@
1
1
  import { PageAgent, PageAgentOpt } from './agent.js';
2
2
  import { Page } from 'playwright';
3
- import { d as WebPage } from './page-90e9f9a7.js';
3
+ import { g as WebPage } from './page-471361cd.js';
4
4
  import { AgentWaitForOpt } from '@midscene/core';
5
5
  import { TestInfo } from '@playwright/test';
6
6
  export { overrideAIConfig } from '@midscene/shared/env';
7
- import '@midscene/core/ai-model';
8
7
  import '@midscene/shared/extractor';
9
8
  import 'puppeteer';
10
9
  import '@midscene/shared/logger';
11
10
  import '@midscene/shared/constants';
11
+ import '@midscene/core/ai-model';
12
12
 
13
13
  declare const PlaywrightAiFixture: (options?: {
14
14
  forceSameTabNavigation?: boolean;
@@ -62,6 +62,9 @@ declare const PlaywrightAiFixture: (options?: {
62
62
  aiBoolean: ({ page }: {
63
63
  page: Page;
64
64
  }, use: any, testInfo: TestInfo) => Promise<void>;
65
+ aiAsk: ({ page }: {
66
+ page: Page;
67
+ }, use: any, testInfo: TestInfo) => Promise<void>;
65
68
  };
66
69
  type PlayWrightAiFixtureType = {
67
70
  agentForPage: (page?: any, opts?: any) => Promise<PageAgent>;
@@ -80,6 +83,7 @@ type PlayWrightAiFixtureType = {
80
83
  aiNumber: (...args: Parameters<PageAgent['aiNumber']>) => ReturnType<PageAgent['aiNumber']>;
81
84
  aiString: (...args: Parameters<PageAgent['aiString']>) => ReturnType<PageAgent['aiString']>;
82
85
  aiBoolean: (...args: Parameters<PageAgent['aiBoolean']>) => ReturnType<PageAgent['aiBoolean']>;
86
+ aiAsk: (...args: Parameters<PageAgent['aiAsk']>) => ReturnType<PageAgent['aiAsk']>;
83
87
  };
84
88
 
85
89
  declare class PlaywrightAgent extends PageAgent<WebPage> {
@@ -2,7 +2,7 @@ import * as puppeteer from 'puppeteer';
2
2
  import { PuppeteerAgent } from './puppeteer.js';
3
3
  import { MidsceneYamlScriptWebEnv } from '@midscene/core';
4
4
  import './agent.js';
5
- import './page-90e9f9a7.js';
5
+ import './page-471361cd.js';
6
6
  import 'playwright';
7
7
  import '@midscene/shared/extractor';
8
8
  import '@midscene/shared/logger';
@@ -1,14 +1,14 @@
1
1
  import { PageAgentOpt, PageAgent } from './agent.js';
2
2
  import { Page } from 'puppeteer';
3
- import { P as PuppeteerPageOpt, c as WebPage } from './page-90e9f9a7.js';
4
- export { a as AndroidDeviceInputOpt } from './page-90e9f9a7.js';
3
+ import { P as PuppeteerPageOpt, c as WebPage } from './page-471361cd.js';
4
+ export { a as AndroidDeviceInputOpt } from './page-471361cd.js';
5
5
  export { overrideAIConfig } from '@midscene/shared/env';
6
6
  import '@midscene/core';
7
- import '@midscene/core/ai-model';
8
7
  import 'playwright';
9
8
  import '@midscene/shared/extractor';
10
9
  import '@midscene/shared/logger';
11
10
  import '@midscene/shared/constants';
11
+ import '@midscene/core/ai-model';
12
12
 
13
13
  type PuppeteerAgentOpt = PageAgentOpt & PuppeteerPageOpt;
14
14
  declare class PuppeteerAgent extends PageAgent<WebPage> {
@@ -2,6 +2,7 @@ import '@midscene/core';
2
2
  import '@midscene/shared/logger';
3
3
  import 'playwright';
4
4
  import 'puppeteer';
5
- export { E as ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, f as WebUIContext, l as forceClosePopup, j as generateCacheId, i as getCurrentExecutionFile, m as matchElementFromPlan, p as parseContextFromWebPage, h as printReportMsg, k as replaceIllegalPathCharsAndSpace, r as reportFileName, t as trimContextByViewport } from './page-90e9f9a7.js';
5
+ export { E as ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, e as WebUIContext, m as forceClosePopup, k as generateCacheId, j as getCurrentExecutionFile, o as matchElementFromCache, n as matchElementFromPlan, p as parseContextFromWebPage, i as printReportMsg, l as replaceIllegalPathCharsAndSpace, r as reportFileName, t as trimContextByViewport } from './page-471361cd.js';
6
6
  import '@midscene/shared/extractor';
7
7
  import '@midscene/shared/constants';
8
+ import '@midscene/core/ai-model';
@@ -1,7 +1,7 @@
1
1
  export { S as ScriptPlayer, p as parseYamlScript } from './utils-399ab32c.js';
2
2
  import { MidsceneYamlScriptWebEnv, MidsceneYamlTask } from '@midscene/core';
3
3
  import './agent.js';
4
- import './page-90e9f9a7.js';
4
+ import './page-471361cd.js';
5
5
  import 'playwright';
6
6
  import '@midscene/shared/extractor';
7
7
  import 'puppeteer';
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "Browser use",
9
9
  "Android use"
10
10
  ],
11
- "version": "0.19.1",
11
+ "version": "0.20.0",
12
12
  "repository": "https://github.com/web-infra-dev/midscene",
13
13
  "homepage": "https://midscenejs.com/",
14
14
  "jsnext:source": "./src/index.ts",
@@ -167,8 +167,8 @@
167
167
  "semver": "7.5.2",
168
168
  "socket.io": "^4.8.1",
169
169
  "socket.io-client": "4.8.1",
170
- "@midscene/core": "0.19.1",
171
- "@midscene/shared": "0.19.1"
170
+ "@midscene/core": "0.20.0",
171
+ "@midscene/shared": "0.20.0"
172
172
  },
173
173
  "devDependencies": {
174
174
  "@modern-js/module-tools": "2.60.6",