143 lines
2.9 KiB
TypeScript
143 lines
2.9 KiB
TypeScript
import type {
|
|
AgentSessionEvent,
|
|
RpcCommand,
|
|
RpcExtensionUIRequest,
|
|
RpcExtensionUIResponse,
|
|
RpcResponse,
|
|
} from "@earendil-works/pi-coding-agent";
|
|
import type { InstanceStatus } from "../types.ts";
|
|
|
|
export interface SpawnRequest {
|
|
type: "spawn";
|
|
cwd: string;
|
|
label?: string;
|
|
provider?: string;
|
|
model?: string;
|
|
}
|
|
|
|
export interface ListRequest {
|
|
type: "list";
|
|
}
|
|
|
|
export interface StopRequest {
|
|
type: "stop";
|
|
instanceId: string;
|
|
}
|
|
|
|
export interface StatusRequest {
|
|
type: "status";
|
|
instanceId: string;
|
|
}
|
|
|
|
export interface RpcRequest {
|
|
type: "rpc";
|
|
instanceId: string;
|
|
command: RpcCommand;
|
|
}
|
|
|
|
export interface RpcStreamRequest {
|
|
type: "rpc_stream";
|
|
instanceId: string;
|
|
}
|
|
|
|
export interface RequestMap {
|
|
spawn: SpawnRequest;
|
|
list: ListRequest;
|
|
stop: StopRequest;
|
|
status: StatusRequest;
|
|
rpc: RpcRequest;
|
|
rpc_stream: RpcStreamRequest;
|
|
}
|
|
|
|
export type ServerRequest = RequestMap[keyof RequestMap];
|
|
|
|
export interface InstanceSummary {
|
|
id: string;
|
|
status: InstanceStatus;
|
|
cwd: string;
|
|
label?: string;
|
|
sessionId?: string;
|
|
sessionFile?: string;
|
|
radiusPiId?: string;
|
|
}
|
|
|
|
export interface ResponseBase {
|
|
ok: boolean;
|
|
error?: string;
|
|
}
|
|
|
|
export interface SpawnResponse extends ResponseBase {
|
|
type: "spawn_result";
|
|
instance?: InstanceSummary;
|
|
}
|
|
|
|
export interface ListResponse extends ResponseBase {
|
|
type: "list_result";
|
|
instances?: InstanceSummary[];
|
|
}
|
|
|
|
export interface StopResponse extends ResponseBase {
|
|
type: "stop_result";
|
|
instanceId?: string;
|
|
}
|
|
|
|
export interface StatusResponse extends ResponseBase {
|
|
type: "status_result";
|
|
instance?: InstanceSummary;
|
|
}
|
|
|
|
export interface RpcBridgeResponse extends ResponseBase {
|
|
type: "rpc_result";
|
|
response: RpcResponse;
|
|
}
|
|
|
|
export interface RpcReadyResponse extends ResponseBase {
|
|
type: "rpc_ready";
|
|
instance?: InstanceSummary;
|
|
}
|
|
|
|
export interface ErrorResponse extends ResponseBase {
|
|
type: "error";
|
|
ok: false;
|
|
error: string;
|
|
}
|
|
|
|
export interface ResponseMap {
|
|
spawn: SpawnResponse;
|
|
list: ListResponse;
|
|
stop: StopResponse;
|
|
status: StatusResponse;
|
|
rpc: RpcBridgeResponse;
|
|
rpc_stream: RpcReadyResponse;
|
|
}
|
|
|
|
export type ServerResponse = ResponseMap[keyof ResponseMap] | ErrorResponse;
|
|
export type RpcClientMessage = RpcCommand | RpcExtensionUIResponse;
|
|
export type RpcServerMessage =
|
|
| RpcReadyResponse
|
|
| RpcResponse
|
|
| AgentSessionEvent
|
|
| RpcExtensionUIRequest
|
|
| ErrorResponse;
|
|
export type ProtocolMessage = ServerRequest | ServerResponse | RpcClientMessage | RpcServerMessage;
|
|
|
|
export type ResponseFor<T extends ServerRequest> = T extends { type: infer K }
|
|
? K extends keyof ResponseMap
|
|
? ResponseMap[K] | ErrorResponse
|
|
: ErrorResponse
|
|
: ErrorResponse;
|
|
|
|
export function encodeMessage(message: ProtocolMessage): string {
|
|
return `${JSON.stringify(message)}\n`;
|
|
}
|
|
|
|
export function parseRequestLine(line: string): ServerRequest {
|
|
const value = JSON.parse(line) as ServerRequest;
|
|
return value;
|
|
}
|
|
|
|
export function parseResponseLine(line: string): ServerResponse {
|
|
const value = JSON.parse(line) as ServerResponse;
|
|
return value;
|
|
}
|