@aiscene/aiserver 1.0.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/api/callback.d.ts +7 -0
- package/dist/api/callback.d.ts.map +1 -0
- package/dist/api/callback.js +116 -0
- package/dist/api/callback.js.map +1 -0
- package/dist/api/device-api.d.ts +13 -0
- package/dist/api/device-api.d.ts.map +1 -0
- package/dist/api/device-api.js +98 -0
- package/dist/api/device-api.js.map +1 -0
- package/dist/api/task-api.d.ts +9 -0
- package/dist/api/task-api.d.ts.map +1 -0
- package/dist/api/task-api.js +47 -0
- package/dist/api/task-api.js.map +1 -0
- package/dist/config/cli.d.ts +30 -0
- package/dist/config/cli.d.ts.map +1 -0
- package/dist/config/cli.js +129 -0
- package/dist/config/cli.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +142 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +66 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +2 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/event-bus.d.ts +14 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +33 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/logger.d.ts +24 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +52 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +134 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/debug/dump-manager.d.ts +10 -0
- package/dist/debug/dump-manager.d.ts.map +1 -0
- package/dist/debug/dump-manager.js +52 -0
- package/dist/debug/dump-manager.js.map +1 -0
- package/dist/debug/screencast.d.ts +11 -0
- package/dist/debug/screencast.d.ts.map +1 -0
- package/dist/debug/screencast.js +88 -0
- package/dist/debug/screencast.js.map +1 -0
- package/dist/debug/session-manager.d.ts +14 -0
- package/dist/debug/session-manager.d.ts.map +1 -0
- package/dist/debug/session-manager.js +76 -0
- package/dist/debug/session-manager.js.map +1 -0
- package/dist/debug/types.d.ts +76 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/types.js +2 -0
- package/dist/debug/types.js.map +1 -0
- package/dist/debug/web-screencast.d.ts +60 -0
- package/dist/debug/web-screencast.d.ts.map +1 -0
- package/dist/debug/web-screencast.js +146 -0
- package/dist/debug/web-screencast.js.map +1 -0
- package/dist/debug/websocket-server.d.ts +27 -0
- package/dist/debug/websocket-server.d.ts.map +1 -0
- package/dist/debug/websocket-server.js +681 -0
- package/dist/debug/websocket-server.js.map +1 -0
- package/dist/device/detector.d.ts +10 -0
- package/dist/device/detector.d.ts.map +1 -0
- package/dist/device/detector.js +100 -0
- package/dist/device/detector.js.map +1 -0
- package/dist/device/heartbeat.d.ts +26 -0
- package/dist/device/heartbeat.d.ts.map +1 -0
- package/dist/device/heartbeat.js +225 -0
- package/dist/device/heartbeat.js.map +1 -0
- package/dist/device/status-manager.d.ts +15 -0
- package/dist/device/status-manager.d.ts.map +1 -0
- package/dist/device/status-manager.js +58 -0
- package/dist/device/status-manager.js.map +1 -0
- package/dist/device/types.d.ts +30 -0
- package/dist/device/types.d.ts.map +1 -0
- package/dist/device/types.js +2 -0
- package/dist/device/types.js.map +1 -0
- package/dist/executor/action-executor.d.ts +25 -0
- package/dist/executor/action-executor.d.ts.map +1 -0
- package/dist/executor/action-executor.js +261 -0
- package/dist/executor/action-executor.js.map +1 -0
- package/dist/executor/android-executor.d.ts +12 -0
- package/dist/executor/android-executor.d.ts.map +1 -0
- package/dist/executor/android-executor.js +127 -0
- package/dist/executor/android-executor.js.map +1 -0
- package/dist/executor/base.d.ts +20 -0
- package/dist/executor/base.d.ts.map +1 -0
- package/dist/executor/base.js +91 -0
- package/dist/executor/base.js.map +1 -0
- package/dist/executor/cli-executor.d.ts +12 -0
- package/dist/executor/cli-executor.d.ts.map +1 -0
- package/dist/executor/cli-executor.js +94 -0
- package/dist/executor/cli-executor.js.map +1 -0
- package/dist/executor/code-executor.d.ts +13 -0
- package/dist/executor/code-executor.d.ts.map +1 -0
- package/dist/executor/code-executor.js +52 -0
- package/dist/executor/code-executor.js.map +1 -0
- package/dist/executor/code-instrument.d.ts +12 -0
- package/dist/executor/code-instrument.d.ts.map +1 -0
- package/dist/executor/code-instrument.js +116 -0
- package/dist/executor/code-instrument.js.map +1 -0
- package/dist/executor/executor-factory.d.ts +7 -0
- package/dist/executor/executor-factory.d.ts.map +1 -0
- package/dist/executor/executor-factory.js +24 -0
- package/dist/executor/executor-factory.js.map +1 -0
- package/dist/executor/ios-executor.d.ts +10 -0
- package/dist/executor/ios-executor.d.ts.map +1 -0
- package/dist/executor/ios-executor.js +91 -0
- package/dist/executor/ios-executor.js.map +1 -0
- package/dist/executor/types.d.ts +14 -0
- package/dist/executor/types.d.ts.map +1 -0
- package/dist/executor/types.js +2 -0
- package/dist/executor/types.js.map +1 -0
- package/dist/executor/worker-entry.d.ts +2 -0
- package/dist/executor/worker-entry.d.ts.map +1 -0
- package/dist/executor/worker-entry.js +61 -0
- package/dist/executor/worker-entry.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/node/service.d.ts +21 -0
- package/dist/node/service.d.ts.map +1 -0
- package/dist/node/service.js +178 -0
- package/dist/node/service.js.map +1 -0
- package/dist/node/types.d.ts +45 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/node/types.js +3 -0
- package/dist/node/types.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +154 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/repositories/debug-log-repo.d.ts +29 -0
- package/dist/storage/repositories/debug-log-repo.d.ts.map +1 -0
- package/dist/storage/repositories/debug-log-repo.js +90 -0
- package/dist/storage/repositories/debug-log-repo.js.map +1 -0
- package/dist/storage/repositories/device-repo.d.ts +12 -0
- package/dist/storage/repositories/device-repo.d.ts.map +1 -0
- package/dist/storage/repositories/device-repo.js +87 -0
- package/dist/storage/repositories/device-repo.js.map +1 -0
- package/dist/storage/repositories/execution-log-repo.d.ts +9 -0
- package/dist/storage/repositories/execution-log-repo.d.ts.map +1 -0
- package/dist/storage/repositories/execution-log-repo.js +49 -0
- package/dist/storage/repositories/execution-log-repo.js.map +1 -0
- package/dist/storage/repositories/task-repo.d.ts +13 -0
- package/dist/storage/repositories/task-repo.d.ts.map +1 -0
- package/dist/storage/repositories/task-repo.js +109 -0
- package/dist/storage/repositories/task-repo.js.map +1 -0
- package/dist/task/poller.d.ts +25 -0
- package/dist/task/poller.d.ts.map +1 -0
- package/dist/task/poller.js +153 -0
- package/dist/task/poller.js.map +1 -0
- package/dist/task/queue.d.ts +13 -0
- package/dist/task/queue.d.ts.map +1 -0
- package/dist/task/queue.js +38 -0
- package/dist/task/queue.js.map +1 -0
- package/dist/task/scheduler.d.ts +25 -0
- package/dist/task/scheduler.d.ts.map +1 -0
- package/dist/task/scheduler.js +274 -0
- package/dist/task/scheduler.js.map +1 -0
- package/dist/task/types.d.ts +31 -0
- package/dist/task/types.d.ts.map +1 -0
- package/dist/task/types.js +37 -0
- package/dist/task/types.js.map +1 -0
- package/dist/web/server.d.ts +14 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +478 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createLogger } from '../core/logger.js';
|
|
2
|
+
import { debugLogRepo } from '../storage/repositories/debug-log-repo.js';
|
|
3
|
+
const logger = createLogger('SessionManager');
|
|
4
|
+
export class SessionManager {
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
create(sessionId, ws, deviceId) {
|
|
7
|
+
const session = {
|
|
8
|
+
sessionId,
|
|
9
|
+
deviceId,
|
|
10
|
+
status: 'idle',
|
|
11
|
+
logs: [],
|
|
12
|
+
startTime: new Date(),
|
|
13
|
+
client: ws,
|
|
14
|
+
};
|
|
15
|
+
this.sessions.set(sessionId, session);
|
|
16
|
+
// Persist to database
|
|
17
|
+
try {
|
|
18
|
+
debugLogRepo.createSession({
|
|
19
|
+
sessionId,
|
|
20
|
+
deviceId,
|
|
21
|
+
status: 'idle',
|
|
22
|
+
startedAt: new Date(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
logger.warn(`Failed to persist session: ${error.message}`);
|
|
27
|
+
}
|
|
28
|
+
logger.info(`Session created: ${sessionId}`);
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
get(sessionId) {
|
|
32
|
+
return this.sessions.get(sessionId);
|
|
33
|
+
}
|
|
34
|
+
updateStatus(sessionId, status) {
|
|
35
|
+
const session = this.sessions.get(sessionId);
|
|
36
|
+
if (session) {
|
|
37
|
+
session.status = status;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
debugLogRepo.updateSessionStatus(sessionId, status);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.warn(`Failed to update session status: ${error.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
addLog(sessionId, content, type = 'log_output') {
|
|
47
|
+
const session = this.sessions.get(sessionId);
|
|
48
|
+
if (session) {
|
|
49
|
+
session.logs.push(content);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
debugLogRepo.addLog({ sessionId, type, content });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// ignore storage errors
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
remove(sessionId) {
|
|
59
|
+
this.sessions.delete(sessionId);
|
|
60
|
+
logger.info(`Session removed: ${sessionId}`);
|
|
61
|
+
}
|
|
62
|
+
getAll() {
|
|
63
|
+
return Array.from(this.sessions.values());
|
|
64
|
+
}
|
|
65
|
+
findByClient(ws) {
|
|
66
|
+
const sessionIds = [];
|
|
67
|
+
for (const [id, session] of this.sessions) {
|
|
68
|
+
if (session.client === ws) {
|
|
69
|
+
sessionIds.push(id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return sessionIds;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const sessionManager = new SessionManager();
|
|
76
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/debug/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export interface DebugRequest {
|
|
2
|
+
type: 'start_debug';
|
|
3
|
+
naturalLanguage: string;
|
|
4
|
+
runMode: 'browser' | 'device';
|
|
5
|
+
deviceId?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
platform?: 'android' | 'ios';
|
|
8
|
+
packageName?: string;
|
|
9
|
+
bundleId?: string;
|
|
10
|
+
mobileMode?: boolean;
|
|
11
|
+
isRnUrl?: boolean;
|
|
12
|
+
needLogin?: boolean;
|
|
13
|
+
modelName?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StopDebugRequest {
|
|
16
|
+
type: 'stop_debug';
|
|
17
|
+
sessionId: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GetLogsRequest {
|
|
20
|
+
type: 'get_logs';
|
|
21
|
+
sessionId: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ActionExecuteRequest {
|
|
24
|
+
type: 'execute_action';
|
|
25
|
+
actionType: string;
|
|
26
|
+
locatePrompt?: string;
|
|
27
|
+
actionParams?: Record<string, unknown>;
|
|
28
|
+
deviceId?: string;
|
|
29
|
+
platform?: 'android' | 'ios';
|
|
30
|
+
packageName?: string;
|
|
31
|
+
modelName?: string;
|
|
32
|
+
testUrl?: string;
|
|
33
|
+
modelConfig?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface AiActExecuteRequest {
|
|
36
|
+
type: 'execute_ai_act';
|
|
37
|
+
naturalLanguage: string;
|
|
38
|
+
deviceId?: string;
|
|
39
|
+
platform?: 'android' | 'ios';
|
|
40
|
+
packageName?: string;
|
|
41
|
+
deepLocate?: boolean;
|
|
42
|
+
deepThink?: boolean;
|
|
43
|
+
modelName?: string;
|
|
44
|
+
modelConfig?: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
export interface WebActionExecuteRequest {
|
|
47
|
+
type: 'execute_web_action';
|
|
48
|
+
actionType: string;
|
|
49
|
+
url?: string;
|
|
50
|
+
locatePrompt?: string;
|
|
51
|
+
actionParams?: Record<string, unknown>;
|
|
52
|
+
naturalLanguage?: string;
|
|
53
|
+
modelConfig?: Record<string, unknown>;
|
|
54
|
+
viewport?: {
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
};
|
|
58
|
+
headless?: boolean;
|
|
59
|
+
screencast?: Record<string, unknown> | boolean;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface StartScreencastRequest {
|
|
63
|
+
type: 'start_screencast';
|
|
64
|
+
sessionId: string;
|
|
65
|
+
options?: Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
export interface StopScreencastRequest {
|
|
68
|
+
type: 'stop_screencast';
|
|
69
|
+
sessionId: string;
|
|
70
|
+
}
|
|
71
|
+
export interface CloseWebSessionRequest {
|
|
72
|
+
type: 'close_web_session';
|
|
73
|
+
sessionId: string;
|
|
74
|
+
}
|
|
75
|
+
export type WebSocketMessage = DebugRequest | StopDebugRequest | GetLogsRequest | ActionExecuteRequest | AiActExecuteRequest | WebActionExecuteRequest | StartScreencastRequest | StopScreencastRequest | CloseWebSessionRequest;
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/debug/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { WebSocket } from 'ws';
|
|
2
|
+
/**
|
|
3
|
+
* Playwright / @midscene/web 的类型是通过动态 import 引入的,
|
|
4
|
+
* 这里用最小化的鸭子类型来避免主项目强依赖 playwright 的类型导出。
|
|
5
|
+
*/
|
|
6
|
+
export type PwBrowser = {
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
export type PwBrowserContext = {
|
|
10
|
+
newCDPSession(page: PwPage): Promise<PwCDPSession>;
|
|
11
|
+
on(event: 'page', listener: (page: PwPage) => void): void;
|
|
12
|
+
};
|
|
13
|
+
export type PwPage = Record<string, unknown>;
|
|
14
|
+
export type PwCDPSession = {
|
|
15
|
+
send(method: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
16
|
+
on(event: 'Page.screencastFrame', listener: (payload: {
|
|
17
|
+
data: string;
|
|
18
|
+
sessionId: number;
|
|
19
|
+
}) => void): void;
|
|
20
|
+
detach(): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export interface ScreencastOptions {
|
|
23
|
+
format?: 'jpeg' | 'png';
|
|
24
|
+
quality?: number;
|
|
25
|
+
maxWidth?: number;
|
|
26
|
+
maxHeight?: number;
|
|
27
|
+
everyNthFrame?: number;
|
|
28
|
+
}
|
|
29
|
+
interface ScreencastSession {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
browser: PwBrowser;
|
|
32
|
+
context: PwBrowserContext;
|
|
33
|
+
page: PwPage;
|
|
34
|
+
cdpSessions: Map<PwPage, PwCDPSession>;
|
|
35
|
+
viewers: Set<WebSocket>;
|
|
36
|
+
controlClient: WebSocket;
|
|
37
|
+
options: Required<ScreencastOptions>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Web 投屏管理器:
|
|
41
|
+
* - 为每个 session 管理一个 Playwright Browser + 多 Page 的 CDP 投屏
|
|
42
|
+
* - 将 JPEG 帧二进制广播到所有观看端 WebSocket
|
|
43
|
+
* - 背压保护:bufferedAmount 超阈值时丢帧
|
|
44
|
+
*/
|
|
45
|
+
export declare class WebScreencastManager {
|
|
46
|
+
private sessions;
|
|
47
|
+
attachScreencast(session: ScreencastSession, page: PwPage): Promise<PwCDPSession>;
|
|
48
|
+
createSession(sessionId: string, controlClient: WebSocket, browser: PwBrowser, context: PwBrowserContext, page: PwPage, options?: ScreencastOptions): Promise<ScreencastSession>;
|
|
49
|
+
/**
|
|
50
|
+
* 观看端 ws 加入 session
|
|
51
|
+
*/
|
|
52
|
+
addViewer(sessionId: string, ws: WebSocket): boolean;
|
|
53
|
+
getSession(sessionId: string): ScreencastSession | undefined;
|
|
54
|
+
hasSession(sessionId: string): boolean;
|
|
55
|
+
stopSession(sessionId: string): Promise<void>;
|
|
56
|
+
closeAll(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
export declare const webScreencastManager: WebScreencastManager;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=web-screencast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-screencast.d.ts","sourceRoot":"","sources":["../../src/debug/web-screencast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAK/B;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,EAAE,CACA,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC/D,IAAI,CAAC;IACR,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACvC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACxB,aAAa,EAAE,SAAS,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;CACtC;AAUD;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAA6C;IAEvD,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC;IA+ClB,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,SAAS,EACxB,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,iBAAiB,CAAC;IA+B7B;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO;IASpD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI5D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIhC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC;AAED,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { WebSocket } from 'ws';
|
|
2
|
+
import { createLogger } from '../core/logger.js';
|
|
3
|
+
const logger = createLogger('WebScreencastManager');
|
|
4
|
+
const DEFAULT_OPTIONS = {
|
|
5
|
+
format: 'jpeg',
|
|
6
|
+
quality: 75,
|
|
7
|
+
maxWidth: 1280,
|
|
8
|
+
maxHeight: 800,
|
|
9
|
+
everyNthFrame: 1,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Web 投屏管理器:
|
|
13
|
+
* - 为每个 session 管理一个 Playwright Browser + 多 Page 的 CDP 投屏
|
|
14
|
+
* - 将 JPEG 帧二进制广播到所有观看端 WebSocket
|
|
15
|
+
* - 背压保护:bufferedAmount 超阈值时丢帧
|
|
16
|
+
*/
|
|
17
|
+
export class WebScreencastManager {
|
|
18
|
+
sessions = new Map();
|
|
19
|
+
async attachScreencast(session, page) {
|
|
20
|
+
const cdp = await session.context.newCDPSession(page);
|
|
21
|
+
await cdp.send('Page.enable');
|
|
22
|
+
await cdp.send('Page.startScreencast', {
|
|
23
|
+
format: session.options.format,
|
|
24
|
+
quality: session.options.quality,
|
|
25
|
+
maxWidth: session.options.maxWidth,
|
|
26
|
+
maxHeight: session.options.maxHeight,
|
|
27
|
+
everyNthFrame: session.options.everyNthFrame,
|
|
28
|
+
});
|
|
29
|
+
cdp.on('Page.screencastFrame', async (payload) => {
|
|
30
|
+
const { data, sessionId: cdpSessionId } = payload;
|
|
31
|
+
let buf;
|
|
32
|
+
try {
|
|
33
|
+
buf = Buffer.from(data, 'base64');
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
logger.warn(`Decode frame failed: ${e.message}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
for (const ws of session.viewers) {
|
|
40
|
+
if (ws.readyState === WebSocket.OPEN &&
|
|
41
|
+
ws.bufferedAmount < 1_000_000) {
|
|
42
|
+
try {
|
|
43
|
+
ws.send(buf, { binary: true });
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
logger.warn(`Send frame failed: ${e.message}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
await cdp.send('Page.screencastFrameAck', {
|
|
52
|
+
sessionId: cdpSessionId,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore ack failure
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
session.cdpSessions.set(page, cdp);
|
|
60
|
+
return cdp;
|
|
61
|
+
}
|
|
62
|
+
async createSession(sessionId, controlClient, browser, context, page, options) {
|
|
63
|
+
// 如果已有同名 session,先停止
|
|
64
|
+
if (this.sessions.has(sessionId)) {
|
|
65
|
+
await this.stopSession(sessionId);
|
|
66
|
+
}
|
|
67
|
+
const session = {
|
|
68
|
+
sessionId,
|
|
69
|
+
browser,
|
|
70
|
+
context,
|
|
71
|
+
page,
|
|
72
|
+
cdpSessions: new Map(),
|
|
73
|
+
viewers: new Set(),
|
|
74
|
+
controlClient,
|
|
75
|
+
options: { ...DEFAULT_OPTIONS, ...(options || {}) },
|
|
76
|
+
};
|
|
77
|
+
this.sessions.set(sessionId, session);
|
|
78
|
+
await this.attachScreencast(session, page);
|
|
79
|
+
// 新开标签页自动跟进投屏
|
|
80
|
+
context.on('page', (np) => {
|
|
81
|
+
this.attachScreencast(session, np).catch((e) => {
|
|
82
|
+
logger.warn(`Attach new page failed: ${e.message}`);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
logger.info(`Web screencast session created: ${sessionId}`);
|
|
86
|
+
return session;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 观看端 ws 加入 session
|
|
90
|
+
*/
|
|
91
|
+
addViewer(sessionId, ws) {
|
|
92
|
+
const session = this.sessions.get(sessionId);
|
|
93
|
+
if (!session)
|
|
94
|
+
return false;
|
|
95
|
+
session.viewers.add(ws);
|
|
96
|
+
ws.on('close', () => session.viewers.delete(ws));
|
|
97
|
+
ws.on('error', () => session.viewers.delete(ws));
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
getSession(sessionId) {
|
|
101
|
+
return this.sessions.get(sessionId);
|
|
102
|
+
}
|
|
103
|
+
hasSession(sessionId) {
|
|
104
|
+
return this.sessions.has(sessionId);
|
|
105
|
+
}
|
|
106
|
+
async stopSession(sessionId) {
|
|
107
|
+
const session = this.sessions.get(sessionId);
|
|
108
|
+
if (!session)
|
|
109
|
+
return;
|
|
110
|
+
for (const [, cdp] of session.cdpSessions) {
|
|
111
|
+
try {
|
|
112
|
+
await cdp.send('Page.stopScreencast');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// ignore
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
await cdp.detach();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// ignore
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (const ws of session.viewers) {
|
|
125
|
+
try {
|
|
126
|
+
ws.close(1000, 'session stopped');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// ignore
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
await session.browser.close();
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// ignore
|
|
137
|
+
}
|
|
138
|
+
this.sessions.delete(sessionId);
|
|
139
|
+
logger.info(`Web screencast session stopped: ${sessionId}`);
|
|
140
|
+
}
|
|
141
|
+
async closeAll() {
|
|
142
|
+
await Promise.allSettled(Array.from(this.sessions.keys()).map((id) => this.stopSession(id)));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export const webScreencastManager = new WebScreencastManager();
|
|
146
|
+
//# sourceMappingURL=web-screencast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-screencast.js","sourceRoot":"","sources":["../../src/debug/web-screencast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DebugSession } from '../core/types.js';
|
|
2
|
+
import type { AIServerConfig } from '../config/schema.js';
|
|
3
|
+
export declare class DebugWebSocketServer {
|
|
4
|
+
private wss;
|
|
5
|
+
private config;
|
|
6
|
+
private port;
|
|
7
|
+
private isStarted;
|
|
8
|
+
constructor(port?: number);
|
|
9
|
+
start(config: AIServerConfig): Promise<void>;
|
|
10
|
+
private handleControlConnection;
|
|
11
|
+
private handleMessage;
|
|
12
|
+
private handleStartDebug;
|
|
13
|
+
private handleExecuteAction;
|
|
14
|
+
private handleExecuteAiAct;
|
|
15
|
+
private handleExecuteWebAction;
|
|
16
|
+
private handleStartScreencast;
|
|
17
|
+
private handleStopScreencast;
|
|
18
|
+
private handleCloseWebSession;
|
|
19
|
+
private handleStopDebug;
|
|
20
|
+
private handleGetLogs;
|
|
21
|
+
private sendMessage;
|
|
22
|
+
private sendError;
|
|
23
|
+
private cleanupSession;
|
|
24
|
+
getSessions(): DebugSession[];
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=websocket-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/debug/websocket-server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAcrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;gBAEvB,IAAI,GAAE,MAAa;IAIzB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDlD,OAAO,CAAC,uBAAuB;YAwBjB,aAAa;YAmCb,gBAAgB;YA4EhB,mBAAmB;YAyDnB,kBAAkB;YAwDlB,sBAAsB;YAgRtB,qBAAqB;YA4BrB,oBAAoB;YAuBpB,qBAAqB;YAoCrB,eAAe;YA6Bf,aAAa;IAU3B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAMtB,WAAW,IAAI,YAAY,EAAE;IAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
|