@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.
- package/dist/es/component/blackboard/index.css +82 -4
- package/dist/es/component/blackboard/index.mjs +73 -301
- package/dist/es/component/player/index.css +144 -119
- package/dist/es/component/player/index.mjs +468 -830
- package/dist/es/component/player/remotion/StepScene.mjs +190 -0
- package/dist/es/component/player/remotion/derive-frame-state.mjs +207 -0
- package/dist/es/component/player/remotion/export-branded-video.mjs +210 -0
- package/dist/es/component/player/remotion/frame-calculator.mjs +149 -0
- package/dist/es/component/player/use-frame-player.mjs +88 -0
- package/dist/es/component/universal-playground/index.mjs +14 -1
- package/dist/es/hooks/usePlaygroundExecution.mjs +11 -7
- package/dist/es/store/store.mjs +9 -0
- package/dist/es/utils/replay-scripts.mjs +2 -1
- package/dist/lib/component/blackboard/index.css +82 -4
- package/dist/lib/component/blackboard/index.js +73 -307
- package/dist/lib/component/player/index.css +144 -119
- package/dist/lib/component/player/index.js +466 -828
- package/dist/lib/component/player/remotion/StepScene.js +224 -0
- package/dist/lib/component/player/remotion/derive-frame-state.js +241 -0
- package/dist/lib/component/player/remotion/export-branded-video.js +244 -0
- package/dist/lib/component/player/remotion/frame-calculator.js +186 -0
- package/dist/lib/component/player/use-frame-player.js +122 -0
- package/dist/lib/component/universal-playground/index.js +14 -1
- package/dist/lib/hooks/usePlaygroundExecution.js +11 -7
- package/dist/lib/store/store.js +9 -0
- package/dist/lib/utils/replay-scripts.js +2 -1
- package/dist/types/component/blackboard/index.d.ts +0 -4
- package/dist/types/component/player/index.d.ts +0 -1
- package/dist/types/component/player/remotion/StepScene.d.ts +9 -0
- package/dist/types/component/player/remotion/derive-frame-state.d.ts +38 -0
- package/dist/types/component/player/remotion/export-branded-video.d.ts +2 -0
- package/dist/types/component/player/remotion/frame-calculator.d.ts +35 -0
- package/dist/types/component/player/use-frame-player.d.ts +17 -0
- package/dist/types/hooks/usePlaygroundExecution.d.ts +15 -1
- package/dist/types/store/store.d.ts +2 -0
- package/dist/types/utils/replay-scripts.d.ts +1 -0
- package/package.json +5 -8
- package/dist/es/utils/pixi-loader.mjs +0 -42
- package/dist/lib/utils/pixi-loader.js +0 -82
- 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[];
|
|
@@ -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,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(
|
|
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.
|
|
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/
|
|
64
|
-
"@midscene/
|
|
65
|
-
"@midscene/
|
|
66
|
-
"@midscene/
|
|
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>;
|