@midscene/visualizer 1.5.2 → 1.5.3-beta-20260305031559.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 (40) hide show
  1. package/dist/es/component/blackboard/index.css +82 -4
  2. package/dist/es/component/blackboard/index.mjs +73 -301
  3. package/dist/es/component/player/index.css +144 -119
  4. package/dist/es/component/player/index.mjs +468 -830
  5. package/dist/es/component/player/remotion/StepScene.mjs +190 -0
  6. package/dist/es/component/player/remotion/derive-frame-state.mjs +207 -0
  7. package/dist/es/component/player/remotion/export-branded-video.mjs +210 -0
  8. package/dist/es/component/player/remotion/frame-calculator.mjs +149 -0
  9. package/dist/es/component/player/use-frame-player.mjs +88 -0
  10. package/dist/es/component/universal-playground/index.mjs +14 -1
  11. package/dist/es/hooks/usePlaygroundExecution.mjs +11 -7
  12. package/dist/es/store/store.mjs +9 -0
  13. package/dist/es/utils/replay-scripts.mjs +2 -1
  14. package/dist/lib/component/blackboard/index.css +82 -4
  15. package/dist/lib/component/blackboard/index.js +73 -307
  16. package/dist/lib/component/player/index.css +144 -119
  17. package/dist/lib/component/player/index.js +466 -828
  18. package/dist/lib/component/player/remotion/StepScene.js +224 -0
  19. package/dist/lib/component/player/remotion/derive-frame-state.js +241 -0
  20. package/dist/lib/component/player/remotion/export-branded-video.js +244 -0
  21. package/dist/lib/component/player/remotion/frame-calculator.js +186 -0
  22. package/dist/lib/component/player/use-frame-player.js +122 -0
  23. package/dist/lib/component/universal-playground/index.js +14 -1
  24. package/dist/lib/hooks/usePlaygroundExecution.js +11 -7
  25. package/dist/lib/store/store.js +9 -0
  26. package/dist/lib/utils/replay-scripts.js +2 -1
  27. package/dist/types/component/blackboard/index.d.ts +0 -4
  28. package/dist/types/component/player/index.d.ts +0 -1
  29. package/dist/types/component/player/remotion/StepScene.d.ts +9 -0
  30. package/dist/types/component/player/remotion/derive-frame-state.d.ts +38 -0
  31. package/dist/types/component/player/remotion/export-branded-video.d.ts +2 -0
  32. package/dist/types/component/player/remotion/frame-calculator.d.ts +35 -0
  33. package/dist/types/component/player/use-frame-player.d.ts +17 -0
  34. package/dist/types/hooks/usePlaygroundExecution.d.ts +15 -1
  35. package/dist/types/store/store.d.ts +2 -0
  36. package/dist/types/utils/replay-scripts.d.ts +1 -0
  37. package/package.json +5 -8
  38. package/dist/es/utils/pixi-loader.mjs +0 -42
  39. package/dist/lib/utils/pixi-loader.js +0 -82
  40. package/dist/types/utils/pixi-loader.d.ts +0 -5
@@ -1,9 +1,5 @@
1
- import 'pixi.js/unsafe-eval';
2
1
  import type { BaseElement, Rect, UIContext } from '@midscene/core';
3
- import * as PIXI from 'pixi.js';
4
2
  import './index.less';
5
- export declare const pointMarkForItem: (point: [number, number], type: "highlightPoint") => PIXI.Graphics;
6
- export declare const rectMarkForItem: (rect: Rect, name: string, type: "element" | "searchArea" | "highlight") => (PIXI.Graphics | PIXI.Text)[];
7
3
  export declare const Blackboard: (props: {
8
4
  uiContext: UIContext | undefined | null;
9
5
  highlightElements?: BaseElement[];
@@ -1,4 +1,3 @@
1
- import 'pixi.js/unsafe-eval';
2
1
  import './index.less';
3
2
  import type { AnimationScript } from '../../utils/replay-scripts';
4
3
  export declare function Player(props?: {
@@ -0,0 +1,9 @@
1
+ import type { FrameMap } from './frame-calculator';
2
+ export declare const StepsTimeline: React.FC<{
3
+ frameMap: FrameMap;
4
+ autoZoom: boolean;
5
+ frame: number;
6
+ width: number;
7
+ height: number;
8
+ fps: number;
9
+ }>;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared frame state derivation from ScriptFrame timeline.
3
+ * Used by both Remotion preview (StepScene.tsx) and Canvas export (export-branded-video.ts).
4
+ */
5
+ import type { ScriptFrame } from './frame-calculator';
6
+ export interface CameraState {
7
+ left: number;
8
+ top: number;
9
+ width: number;
10
+ pointerLeft: number;
11
+ pointerTop: number;
12
+ }
13
+ export interface InsightOverlay {
14
+ highlightElement?: ScriptFrame['highlightElement'];
15
+ searchArea?: ScriptFrame['searchArea'];
16
+ alpha: number;
17
+ }
18
+ export interface FrameState {
19
+ img: string;
20
+ imageWidth: number;
21
+ imageHeight: number;
22
+ prevImg: string | null;
23
+ camera: CameraState;
24
+ prevCamera: CameraState;
25
+ insights: InsightOverlay[];
26
+ spinning: boolean;
27
+ spinningElapsedMs: number;
28
+ currentPointerImg: string;
29
+ title: string;
30
+ subTitle: string;
31
+ taskId: string | undefined;
32
+ frameInScript: number;
33
+ scriptIndex: number;
34
+ imageChanged: boolean;
35
+ pointerMoved: boolean;
36
+ rawProgress: number;
37
+ }
38
+ export declare function deriveFrameState(scriptFrames: ScriptFrame[], frame: number, baseW: number, baseH: number, fps: number): FrameState;
@@ -0,0 +1,2 @@
1
+ import type { FrameMap } from './frame-calculator';
2
+ export declare function exportBrandedVideo(frameMap: FrameMap, onProgress?: (pct: number) => void): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import type { LocateResultElement, Rect } from '@midscene/core';
2
+ import type { AnimationScript } from '../../../utils/replay-scripts';
3
+ export declare const FPS = 30;
4
+ export interface ScriptFrame {
5
+ type: 'img' | 'insight' | 'clear-insight' | 'pointer' | 'spinning-pointer' | 'sleep';
6
+ startFrame: number;
7
+ durationInFrames: number;
8
+ img?: string;
9
+ imageWidth?: number;
10
+ imageHeight?: number;
11
+ cameraTarget?: {
12
+ left: number;
13
+ top: number;
14
+ width: number;
15
+ pointerLeft: number;
16
+ pointerTop: number;
17
+ };
18
+ insightPhaseFrames?: number;
19
+ cameraPhaseFrames?: number;
20
+ highlightElement?: LocateResultElement;
21
+ searchArea?: Rect;
22
+ pointerImg?: string;
23
+ title?: string;
24
+ subTitle?: string;
25
+ taskId?: string;
26
+ }
27
+ export interface FrameMap {
28
+ scriptFrames: ScriptFrame[];
29
+ totalDurationInFrames: number;
30
+ fps: number;
31
+ stepsDurationInFrames: number;
32
+ imageWidth: number;
33
+ imageHeight: number;
34
+ }
35
+ export declare function calculateFrameMap(scripts: AnimationScript[]): FrameMap;
@@ -0,0 +1,17 @@
1
+ interface UseFramePlayerOptions {
2
+ durationInFrames: number;
3
+ fps: number;
4
+ autoPlay?: boolean;
5
+ loop?: boolean;
6
+ playbackRate?: number;
7
+ }
8
+ interface FramePlayer {
9
+ currentFrame: number;
10
+ playing: boolean;
11
+ play: () => void;
12
+ pause: () => void;
13
+ toggle: () => void;
14
+ seekTo: (frame: number) => void;
15
+ }
16
+ export declare function useFramePlayer(options: UseFramePlayerOptions): FramePlayer;
17
+ export {};
@@ -1,9 +1,23 @@
1
1
  import type { DeviceAction } from '@midscene/core';
2
2
  import type { FormValue, InfoListItem, PlaygroundSDKLike, StorageProvider } from '../types';
3
+ export interface UsePlaygroundExecutionOptions {
4
+ playgroundSDK: PlaygroundSDKLike | null;
5
+ storage: StorageProvider | undefined | null;
6
+ actionSpace: DeviceAction<unknown>[];
7
+ loading: boolean;
8
+ setLoading: (loading: boolean) => void;
9
+ setInfoList: React.Dispatch<React.SetStateAction<InfoListItem[]>>;
10
+ replayCounter: number;
11
+ setReplayCounter: React.Dispatch<React.SetStateAction<number>>;
12
+ verticalMode: boolean;
13
+ currentRunningIdRef: React.MutableRefObject<number | null>;
14
+ interruptedFlagRef: React.MutableRefObject<Record<number, boolean>>;
15
+ deviceType?: string;
16
+ }
3
17
  /**
4
18
  * Hook for handling playground execution logic
5
19
  */
6
- export declare function usePlaygroundExecution(playgroundSDK: PlaygroundSDKLike | null, storage: StorageProvider | undefined | null, actionSpace: DeviceAction<unknown>[], loading: boolean, setLoading: (loading: boolean) => void, setInfoList: React.Dispatch<React.SetStateAction<InfoListItem[]>>, replayCounter: number, setReplayCounter: React.Dispatch<React.SetStateAction<number>>, verticalMode: boolean, currentRunningIdRef: React.MutableRefObject<number | null>, interruptedFlagRef: React.MutableRefObject<Record<number, boolean>>): {
20
+ export declare function usePlaygroundExecution(options: UsePlaygroundExecutionOptions): {
7
21
  handleRun: (value: FormValue) => Promise<void>;
8
22
  handleStop: () => Promise<void>;
9
23
  canStop: boolean;
@@ -7,12 +7,14 @@ export declare const useGlobalPreference: Z.UseBoundStore<Z.StoreApi<{
7
7
  modelCallDetailsEnabled: boolean;
8
8
  darkModeEnabled: boolean;
9
9
  playbackSpeed: PlaybackSpeedType;
10
+ subtitleEnabled: boolean;
10
11
  setBackgroundVisible: (visible: boolean) => void;
11
12
  setElementsVisible: (visible: boolean) => void;
12
13
  setAutoZoom: (enabled: boolean) => void;
13
14
  setModelCallDetailsEnabled: (enabled: boolean) => void;
14
15
  setDarkModeEnabled: (enabled: boolean) => void;
15
16
  setPlaybackSpeed: (speed: PlaybackSpeedType) => void;
17
+ setSubtitleEnabled: (enabled: boolean) => void;
16
18
  }>>;
17
19
  /**
18
20
  * Service Mode
@@ -30,6 +30,7 @@ export interface ReplayScriptsInfo {
30
30
  height?: number;
31
31
  sdkVersion?: string;
32
32
  modelBriefs: string[];
33
+ deviceType?: string;
33
34
  }
34
35
  export declare const allScriptsFromDump: (dump: GroupedActionDump | IGroupedActionDump | ExecutionDump | null | undefined) => ReplayScriptsInfo | null;
35
36
  export declare const generateAnimationScripts: (execution: ExecutionDump | IExecutionDump | null, task: ExecutionTask | number, imageWidth: number, imageHeight: number, executionIndex?: number) => AnimationScript[] | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/visualizer",
3
- "version": "1.5.2",
3
+ "version": "1.5.3-beta-20260305031559.0",
4
4
  "repository": "https://github.com/web-infra-dev/midscene",
5
5
  "homepage": "https://midscenejs.com/",
6
6
  "types": "./dist/types/index.d.ts",
@@ -23,7 +23,6 @@
23
23
  "react-dom": ">=19.1.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@pixi/unsafe-eval": "7.4.2",
27
26
  "@rsbuild/plugin-less": "^1.5.0",
28
27
  "@rsbuild/plugin-node-polyfill": "1.4.2",
29
28
  "@rsbuild/plugin-react": "^1.4.1",
@@ -35,8 +34,6 @@
35
34
  "@types/react-dom": "^18.3.1",
36
35
  "execa": "9.3.0",
37
36
  "http-server": "14.1.1",
38
- "pixi-filters": "6.0.5",
39
- "pixi.js": "8.1.1",
40
37
  "query-string": "9.1.1",
41
38
  "react": "18.3.1",
42
39
  "react-dom": "18.3.1",
@@ -60,10 +57,10 @@
60
57
  "antd": "^5.21.6",
61
58
  "buffer": "6.0.3",
62
59
  "dayjs": "^1.11.11",
63
- "@midscene/playground": "1.5.2",
64
- "@midscene/core": "1.5.2",
65
- "@midscene/shared": "1.5.2",
66
- "@midscene/web": "1.5.2"
60
+ "@midscene/core": "1.5.3-beta-20260305031559.0",
61
+ "@midscene/web": "1.5.3-beta-20260305031559.0",
62
+ "@midscene/playground": "1.5.3-beta-20260305031559.0",
63
+ "@midscene/shared": "1.5.3-beta-20260305031559.0"
67
64
  },
68
65
  "license": "MIT",
69
66
  "scripts": {
@@ -1,42 +0,0 @@
1
- import "pixi.js/unsafe-eval";
2
- import { Assets } from "pixi.js";
3
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
4
- try {
5
- var info = gen[key](arg);
6
- var value = info.value;
7
- } catch (error) {
8
- reject(error);
9
- return;
10
- }
11
- if (info.done) resolve(value);
12
- else Promise.resolve(value).then(_next, _throw);
13
- }
14
- function _async_to_generator(fn) {
15
- return function() {
16
- var self = this, args = arguments;
17
- return new Promise(function(resolve, reject) {
18
- var gen = fn.apply(self, args);
19
- function _next(value) {
20
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
21
- }
22
- function _throw(err) {
23
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
24
- }
25
- _next(void 0);
26
- });
27
- };
28
- }
29
- const globalTextureMap = new Map();
30
- const loadTexture = (img)=>_async_to_generator(function*() {
31
- if (globalTextureMap.has(img)) return;
32
- return Assets.load(img).then((texture)=>{
33
- globalTextureMap.set(img, texture);
34
- });
35
- })();
36
- const getTextureFromCache = (name)=>globalTextureMap.get(name);
37
- const getTexture = (name)=>_async_to_generator(function*() {
38
- if (globalTextureMap.has(name)) return globalTextureMap.get(name);
39
- yield loadTexture(name);
40
- return globalTextureMap.get(name);
41
- })();
42
- export { getTexture, getTextureFromCache, loadTexture };
@@ -1,82 +0,0 @@
1
- "use strict";
2
- var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
9
- };
10
- })();
11
- (()=>{
12
- __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
- })();
14
- (()=>{
15
- __webpack_require__.r = (exports1)=>{
16
- if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
- value: 'Module'
18
- });
19
- Object.defineProperty(exports1, '__esModule', {
20
- value: true
21
- });
22
- };
23
- })();
24
- var __webpack_exports__ = {};
25
- __webpack_require__.r(__webpack_exports__);
26
- __webpack_require__.d(__webpack_exports__, {
27
- loadTexture: ()=>loadTexture,
28
- getTexture: ()=>getTexture,
29
- getTextureFromCache: ()=>getTextureFromCache
30
- });
31
- require("pixi.js/unsafe-eval");
32
- const external_pixi_js_namespaceObject = require("pixi.js");
33
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
34
- try {
35
- var info = gen[key](arg);
36
- var value = info.value;
37
- } catch (error) {
38
- reject(error);
39
- return;
40
- }
41
- if (info.done) resolve(value);
42
- else Promise.resolve(value).then(_next, _throw);
43
- }
44
- function _async_to_generator(fn) {
45
- return function() {
46
- var self = this, args = arguments;
47
- return new Promise(function(resolve, reject) {
48
- var gen = fn.apply(self, args);
49
- function _next(value) {
50
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
51
- }
52
- function _throw(err) {
53
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
54
- }
55
- _next(void 0);
56
- });
57
- };
58
- }
59
- const globalTextureMap = new Map();
60
- const loadTexture = (img)=>_async_to_generator(function*() {
61
- if (globalTextureMap.has(img)) return;
62
- return external_pixi_js_namespaceObject.Assets.load(img).then((texture)=>{
63
- globalTextureMap.set(img, texture);
64
- });
65
- })();
66
- const getTextureFromCache = (name)=>globalTextureMap.get(name);
67
- const getTexture = (name)=>_async_to_generator(function*() {
68
- if (globalTextureMap.has(name)) return globalTextureMap.get(name);
69
- yield loadTexture(name);
70
- return globalTextureMap.get(name);
71
- })();
72
- exports.getTexture = __webpack_exports__.getTexture;
73
- exports.getTextureFromCache = __webpack_exports__.getTextureFromCache;
74
- exports.loadTexture = __webpack_exports__.loadTexture;
75
- for(var __rspack_i in __webpack_exports__)if (-1 === [
76
- "getTexture",
77
- "getTextureFromCache",
78
- "loadTexture"
79
- ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
80
- Object.defineProperty(exports, '__esModule', {
81
- value: true
82
- });
@@ -1,5 +0,0 @@
1
- import 'pixi.js/unsafe-eval';
2
- import * as PIXI from 'pixi.js';
3
- export declare const loadTexture: (img: string) => Promise<void>;
4
- export declare const getTextureFromCache: (name: string) => PIXI.Texture | undefined;
5
- export declare const getTexture: (name: string) => Promise<PIXI.Texture | undefined>;