import type { ComponentType } from "react"; import type { PaseoApi } from "@getpaseo/client"; import type { AgentTimelineItem } from "@getpaseo/protocol/agent-types"; import type { ZodType, input as ZodInput, output as ZodOutput } from "zod"; import type { PluginRpcContract } from "../rpc.js"; import type { PluginButtonRegistration, PluginHeaderButtonContribution, PluginComposerPillContribution, } from "./buttons.js"; import type { PluginTheme, PluginWorkspaceSnapshot, PluginAgentSnapshot, PluginThemeContribution, PluginAttachmentSourceContribution, PluginTimelineTransformResult, PluginCleanup, } from "../contracts.js"; export interface PluginHostProps { theme: PluginTheme; host: { id: string; label: string; }; layout: { compact: boolean; platform: "ios" | "android" | "web"; }; } interface PluginNavigableHostProps extends PluginHostProps { /** Client-owned navigation. Undefined on older hosts; hide dependent affordances when absent. */ readonly navigation?: { /** Present only on Electron. The browser runs locally; serverId selects workspace ownership. */ readonly openBrowser?: (input: { readonly url: string; readonly workspaceId: string; readonly serverId?: string; }) => void; readonly openAgent: (input: { readonly agentId: string; readonly serverId?: string }) => void; readonly openWorkspace: (input: { readonly workspaceId: string; readonly serverId?: string; }) => void; }; } export interface PluginSurfaceProps extends PluginNavigableHostProps {} export interface PluginIconProps { name: string; size?: number; color?: string; } export type PluginPanelLocation = "workspace" | "explorer"; export interface PluginOpenPanelOptions { location?: PluginPanelLocation; } interface PluginWorkspacePanelBase { id: string; title: string; icon: string; locations?: readonly PluginPanelLocation[]; } export interface PluginWorkspacePanelProps extends PluginNavigableHostProps { context: "workspace"; workspaceId: string; } export interface PluginAgentPanelProps extends PluginNavigableHostProps { context: "agent"; workspaceId: string; agentId: string; } export interface PluginClientOpenPanelOptions extends PluginOpenPanelOptions { workspaceId: string; agentId?: string; } export interface PluginClientContext extends PluginCommandCapabilities { addSettingsScreen(contribution: PluginSettingsScreenContribution): PluginCleanup; addSurface(id: string, Component: ComponentType): PluginCleanup; addSidebarItem(contribution: PluginSidebarContribution): PluginCleanup; addWorkspacePanel(contribution: PluginWorkspacePanelContribution): PluginCleanup; addCommandCenterItem(contribution: PluginCommandCenterItemContribution): PluginCleanup; addSlashCommand(contribution: PluginClientSlashCommandContribution): PluginCleanup; addHeaderButton(contribution: PluginHeaderButtonContribution): PluginButtonRegistration; addComposerPill(contribution: PluginComposerPillContribution): PluginButtonRegistration; addAttachmentSource(contribution: PluginAttachmentSourceContribution): PluginCleanup; addTheme(contribution: PluginThemeContribution): PluginCleanup; addTimelineTransformer( contribution: PluginTimelineTransformerContribution, ): PluginCleanup; addTimelineRenderer( contribution: PluginTimelineRendererContribution, ): PluginCleanup; openPanel(id: string, options: PluginClientOpenPanelOptions): void; } export type PluginClientContribution = (client: PluginClientContext) => PluginCleanup; export type PluginWorkspacePanelContribution = | (PluginWorkspacePanelBase & { context: "workspace"; Component: ComponentType; }) | (PluginWorkspacePanelBase & { context: "agent"; Component: ComponentType; }); export interface PluginSettingsScreenContribution { id: string; title: string; icon: string; Component: ComponentType; } export interface PluginSurfaceContribution { id: string; Component: ComponentType; } export interface PluginSidebarContribution { id: string; title: string; icon: string; surface: string; } export type PluginTimelineTransformerContribution< ItemType extends AgentTimelineItem["type"] = AgentTimelineItem["type"], > = ItemType extends AgentTimelineItem["type"] ? { id: string; query: { itemType: ItemType; }; transform(input: { item: Extract; phase: "streaming" | "complete"; }): PluginTimelineTransformResult | undefined; } : never; export interface PluginTimelineItemProps extends PluginHostProps { agentId: string; item: { type: "plugin"; kind: string; version: number; data: Data; }; timestamp: Date; } export interface PluginTimelineRendererContribution { kind: string; version: number; schema: Schema; Component: ComponentType>>; } export interface PluginCommandCapabilities { paseo: PaseoApi; rpc( contract: PluginRpcContract, input: ZodInput, ): Promise>; openSurface(id: string): void; openSettings(id: string): void; } export interface PluginGlobalCommandContext extends PluginCommandCapabilities { context: "global"; } export interface PluginWorkspaceCommandContext extends PluginCommandCapabilities { context: "workspace"; workspace: PluginWorkspaceSnapshot; openPanel(id: string, options?: PluginOpenPanelOptions): void; } export interface PluginAgentCommandContext extends PluginCommandCapabilities { context: "agent"; workspace: PluginWorkspaceSnapshot; agent: PluginAgentSnapshot; openPanel(id: string, options?: PluginOpenPanelOptions): void; } interface PluginCommandCenterItemBase { id: string; title: string; icon: string; keywords?: readonly string[]; } export type PluginCommandCenterItemContribution = | (PluginCommandCenterItemBase & { context: "global"; onSelect(context: PluginGlobalCommandContext): void | Promise; }) | (PluginCommandCenterItemBase & { context: "workspace"; onSelect(context: PluginWorkspaceCommandContext): void | Promise; }) | (PluginCommandCenterItemBase & { context: "agent"; onSelect(context: PluginAgentCommandContext): void | Promise; }); interface PluginClientSlashCommandBase { name: string; description: string; argumentHint: string; } export type PluginClientSlashCommandContribution = | (PluginClientSlashCommandBase & { context: "workspace"; onSubmit(context: PluginWorkspaceCommandContext & { args: string }): void | Promise; }) | (PluginClientSlashCommandBase & { context: "agent"; onSubmit(context: PluginAgentCommandContext & { args: string }): void | Promise; }); export type SettingsState = ( | { status: "loading" } | { status: "error"; error: string } | { status: "invalid"; error: string; revision: string } | { status: "ready"; values: ZodOutput; revision: string } ) & { saving: boolean; saveError: string | null; /** Save an entire document against the revision currently displayed. Never throws. */ save(values: ZodOutput, revision: string): Promise; reset(): Promise; reload(): Promise; };