mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-11-10 01:09:28 +08:00
[feat] add CrossDesk MCP with remote desktop panels
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import { z } from "zod";
|
||||
import { parse, uiConnect, Failure, type Data } from "./common.js";
|
||||
import { Sessions, type View } from "./sessions.js";
|
||||
|
||||
export const uiSchemas = {
|
||||
ready: z.strictObject({}),
|
||||
devices: z.strictObject({}),
|
||||
status: z.strictObject({}),
|
||||
connect: uiConnect,
|
||||
video_open: z.strictObject({}),
|
||||
control: z.strictObject({
|
||||
operation: z.enum(["pause", "resume", "disconnect"]),
|
||||
}),
|
||||
};
|
||||
export type UIAction = keyof typeof uiSchemas;
|
||||
export async function uiAction(
|
||||
sessions: Sessions,
|
||||
view: View,
|
||||
name: string,
|
||||
args: unknown,
|
||||
signal?: AbortSignal,
|
||||
): Promise<Data> {
|
||||
if (!Object.hasOwn(uiSchemas, name)) throw new Failure("UNKNOWN_ACTION");
|
||||
const p = parse(uiSchemas[name as UIAction], args) as Data;
|
||||
view.lastSeen = Date.now();
|
||||
switch (name) {
|
||||
case "ready":
|
||||
view.ready = true;
|
||||
return sessions.describe(view);
|
||||
case "devices": {
|
||||
const config = await sessions.store.config();
|
||||
return {
|
||||
devices: await sessions.store.list(),
|
||||
defaults: { server: config.server, port: config.port },
|
||||
};
|
||||
}
|
||||
case "status":
|
||||
return sessions.status(undefined, view.id);
|
||||
case "connect":
|
||||
return sessions.connectUI(view, p, signal);
|
||||
case "control":
|
||||
return sessions.viewerControl(view, p.operation);
|
||||
default:
|
||||
throw new Failure("UNKNOWN_ACTION");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user