feat(companion): add typed canvas RPC helpers for runtime clients

This commit is contained in:
William Valentin
2026-02-16 18:33:59 -08:00
parent 2e07ae44a3
commit 97afc39e01
8 changed files with 268 additions and 2 deletions
+83
View File
@@ -185,6 +185,56 @@ export interface SetNodeLocationInput extends Omit<NodeLocationSetParams, 'conne
export interface SetNodePushTokenInput extends Omit<NodePushTokenSetParams, 'connectionId'> {}
export interface CanvasArtifact {
id: string;
type: string;
title?: string;
content: unknown;
metadata?: Record<string, unknown>;
createdAt: number;
updatedAt: number;
}
export interface PutCanvasArtifactInput {
sessionId: string;
artifactId?: string;
type: string;
title?: string;
content: unknown;
metadata?: Record<string, unknown>;
}
export interface GetCanvasArtifactInput {
sessionId: string;
artifactId: string;
}
export interface DeleteCanvasArtifactInput {
sessionId: string;
artifactId: string;
}
export interface CanvasPutResult {
artifact: CanvasArtifact;
upserted: boolean;
}
export interface CanvasGetResult {
artifact: CanvasArtifact;
}
export interface CanvasListResult {
artifacts: CanvasArtifact[];
}
export interface CanvasDeleteResult {
deleted: boolean;
}
export interface CanvasClearResult {
cleared: number;
}
export class GatewayRpcError extends Error {
readonly code: number;
@@ -378,6 +428,39 @@ export class CompanionRuntimeClient {
});
}
putCanvasArtifact(input: PutCanvasArtifactInput): Promise<CanvasPutResult> {
return this.call<CanvasPutResult>('canvas.put', {
sessionId: input.sessionId,
artifactId: input.artifactId,
type: input.type,
title: input.title,
content: input.content,
metadata: input.metadata,
});
}
getCanvasArtifact(input: GetCanvasArtifactInput): Promise<CanvasGetResult> {
return this.call<CanvasGetResult>('canvas.get', {
sessionId: input.sessionId,
artifactId: input.artifactId,
});
}
listCanvasArtifacts(sessionId: string): Promise<CanvasListResult> {
return this.call<CanvasListResult>('canvas.list', { sessionId });
}
deleteCanvasArtifact(input: DeleteCanvasArtifactInput): Promise<CanvasDeleteResult> {
return this.call<CanvasDeleteResult>('canvas.delete', {
sessionId: input.sessionId,
artifactId: input.artifactId,
});
}
clearCanvasArtifacts(sessionId: string): Promise<CanvasClearResult> {
return this.call<CanvasClearResult>('canvas.clear', { sessionId });
}
private handleMessage(raw: string): void {
let parsed: RpcMessage;
try {