feat: add provider ssh bridge

This commit is contained in:
Codex
2026-05-05 01:24:32 +00:00
parent 2d6829ed44
commit f6d0bd1e3b
18 changed files with 1014 additions and 34 deletions
+98 -4
View File
@@ -106,13 +106,48 @@ export interface ProviderTaskStatusMessage {
result?: JsonValue;
}
export type ProviderDispatchCommand = "docker.ps" | "provider.upgrade" | "host.ssh" | "echo";
export interface CoreDispatchMessage {
type: "dispatch";
taskId: string;
command: "docker.ps" | "provider.upgrade" | "echo";
command: ProviderDispatchCommand;
payload: Record<string, JsonValue>;
}
export interface CoreHostSshOpenMessage {
type: "host_ssh_open";
sessionId: string;
cwd?: string;
command?: string;
cols?: number;
rows?: number;
}
export interface CoreHostSshInputMessage {
type: "host_ssh_input";
sessionId: string;
data: string;
encoding: "base64";
}
export interface CoreHostSshResizeMessage {
type: "host_ssh_resize";
sessionId: string;
cols: number;
rows: number;
}
export interface CoreHostSshCloseMessage {
type: "host_ssh_close";
sessionId: string;
}
export interface CoreHostSshEofMessage {
type: "host_ssh_eof";
sessionId: string;
}
export interface CoreAcknowledgeMessage {
type: "ack";
requestId: string;
@@ -120,14 +155,59 @@ export interface CoreAcknowledgeMessage {
message: string;
}
export interface ProviderHostSshOpenedMessage {
type: "host_ssh_opened";
providerId: string;
sessionId: string;
at: string;
}
export interface ProviderHostSshDataMessage {
type: "host_ssh_data";
providerId: string;
sessionId: string;
stream: "stdout" | "stderr";
data: string;
encoding: "base64";
at: string;
}
export interface ProviderHostSshExitMessage {
type: "host_ssh_exit";
providerId: string;
sessionId: string;
exitCode: number | null;
signal: string | null;
at: string;
}
export interface ProviderHostSshErrorMessage {
type: "host_ssh_error";
providerId: string;
sessionId: string;
message: string;
at: string;
}
export type ProviderToCoreMessage =
| ProviderRegisterMessage
| ProviderHeartbeatMessage
| ProviderSystemStatusMessage
| ProviderDockerStatusMessage
| ProviderTaskStatusMessage;
| ProviderTaskStatusMessage
| ProviderHostSshOpenedMessage
| ProviderHostSshDataMessage
| ProviderHostSshExitMessage
| ProviderHostSshErrorMessage;
export type CoreToProviderMessage = CoreDispatchMessage | CoreAcknowledgeMessage;
export type CoreToProviderMessage =
| CoreDispatchMessage
| CoreHostSshOpenMessage
| CoreHostSshInputMessage
| CoreHostSshResizeMessage
| CoreHostSshCloseMessage
| CoreHostSshEofMessage
| CoreAcknowledgeMessage;
export interface ApiNode {
providerId: string;
@@ -190,11 +270,25 @@ export function parseJsonObject(value: string, name: string): Record<string, Jso
return parsed as Record<string, JsonValue>;
}
export function isProviderDispatchCommand(value: unknown): value is ProviderDispatchCommand {
return value === "docker.ps" || value === "provider.upgrade" || value === "host.ssh" || value === "echo";
}
export function isProviderToCoreMessage(value: unknown): value is ProviderToCoreMessage {
if (typeof value !== "object" || value === null || !("type" in value)) return false;
const msg = value as { type?: unknown; providerId?: unknown };
return (
(msg.type === "register" || msg.type === "heartbeat" || msg.type === "system_status" || msg.type === "docker_status" || msg.type === "task_status") &&
(
msg.type === "register" ||
msg.type === "heartbeat" ||
msg.type === "system_status" ||
msg.type === "docker_status" ||
msg.type === "task_status" ||
msg.type === "host_ssh_opened" ||
msg.type === "host_ssh_data" ||
msg.type === "host_ssh_exit" ||
msg.type === "host_ssh_error"
) &&
typeof msg.providerId === "string" &&
msg.providerId.length > 0
);