import type { TemplateResult } from "lit"; import type { FileContentResponse, MachineKind, PiWebStatusResponse, TerminalCommandRunHandle } from "./shared/apiTypes.js"; export type { FileContentMediaType, FileContentResponse, FileTreeEntry, FileTreeResponse, MachineKind, PiWebComponentStatus, PiWebInstallationInfo, PiWebInstallationKind, PiWebReleaseStatus, PiWebServiceComponent, PiWebStatusMessage, PiWebStatusResponse, PiWebStatusSeverity, PiWebVersionResponse, TerminalCommandRun, TerminalCommandRunFilter, TerminalCommandRunHandle, TerminalCommandRunStatus, } from "./shared/apiTypes.js"; export type PluginId = string; export type LocalContributionId = string; export type QualifiedContributionId = string; export type HtmlTemplateTag = (strings: TemplateStringsArray, ...values: unknown[]) => TemplateResult; export type SvgTemplateTag = (strings: TemplateStringsArray, ...values: unknown[]) => TemplateResult; export interface PiWebPlugin { apiVersion: 1; name: string; activate: (context: PluginActivationContext) => PluginActivationResult; } export interface PluginActivationContext { apiVersion: 1; pluginId: PluginId; html: HtmlTemplateTag; svg: SvgTemplateTag; } export interface PluginActivationResult { contributions: PluginContributions; } export interface PluginContributions { actions?: PluginAction[]; workspacePanels?: WorkspacePanelContribution[]; workspaceLabels?: WorkspaceLabelContribution[]; themes?: ThemeContribution[]; themePairs?: ThemePairContribution[]; } export interface PluginMachine { id: string; name: string; kind: MachineKind; } export interface PluginRuntimeState { selectedWorkspace?: Workspace; selectedSession?: unknown; workspaceTool?: string; mainView?: string; piWebStatus?: PiWebStatusResponse; } export interface PluginRuntimeContext { state: PluginRuntimeState; openActionPalette: () => void; focusPrompt: () => void; addProject: () => void | Promise; configureAuth: () => void | Promise; logoutAuth: () => void | Promise; openThemePicker: () => void; selectMainView: (view: string) => void; selectWorkspaceTool: (tool: QualifiedContributionId) => void; openTerminal: (options?: { terminalId?: string | undefined; }) => void; refreshFiles: () => void | Promise; refreshGit: () => void | Promise; refreshAppData: () => void | Promise; reloadPage: () => void; startSession: () => void | Promise; archiveSession: () => void | Promise; stopActiveWork: () => void | Promise; } export interface PluginAction { id: LocalContributionId; title: string; description?: string; shortcut?: string; group?: string; enabled?: (context: PluginRuntimeContext) => boolean; run: (context: PluginRuntimeContext) => void | Promise; } export interface Workspace { id: string; projectId: string; path: string; label: string; branch?: string; isMain: boolean; isGitRepo: boolean; isGitWorktree: boolean; } export interface WorkspaceFiles { readFile(path: string): Promise; } export type WorkspacePanelFiles = WorkspaceFiles; export interface WorkspaceHost { requestRender(): void; } export type WorkspacePanelHost = WorkspaceHost; export interface WorkspaceContext { machine: PluginMachine; workspace: Workspace; state?: PluginRuntimeState; files: WorkspaceFiles; host: WorkspaceHost; } export interface WorkspaceTerminalCommandInput { title: string; command: string; metadata?: Record; open?: boolean; } export interface WorkspacePanelTerminal { open(options?: { terminalId?: string | undefined; }): void; runCommand(input: WorkspaceTerminalCommandInput): Promise; } export interface WorkspacePanelContext extends WorkspaceContext { terminal: WorkspacePanelTerminal; } export type WorkspacePanelIcon = TemplateResult; export interface WorkspacePanelContribution { id: LocalContributionId; title: string; icon?: WorkspacePanelIcon; order?: number; visible?: (context: WorkspacePanelContext) => boolean; badge?: (context: WorkspacePanelContext) => string | number | TemplateResult | undefined; render: (context: WorkspacePanelContext) => TemplateResult; } export interface WorkspaceLabelContext extends WorkspaceContext { machine: PluginMachine; workspace: Workspace; state?: PluginRuntimeState; files: WorkspaceFiles; host: WorkspaceHost; } export type WorkspaceLabelItem = WorkspaceLabelTextItem | WorkspaceLabelLinkItem | WorkspaceLabelRenderItem; export interface WorkspaceLabelTextItem { type: "text"; text: string; title?: string; } export interface WorkspaceLabelLinkItem { type: "link"; text: string; href: string; title?: string; target?: "_blank" | "_self"; } export interface WorkspaceLabelRenderItem { type: "render"; render: () => TemplateResult; } export interface WorkspaceLabelContribution { id: LocalContributionId; order?: number; visible?: (context: WorkspaceLabelContext) => boolean; items: (context: WorkspaceLabelContext) => WorkspaceLabelItem[]; } export type ThemeColorScheme = "dark" | "light"; export type ThemeTokens = Record; export interface ThemeContribution { id: LocalContributionId; name: string; description?: string; order?: number; colorScheme: ThemeColorScheme; tokens: ThemeTokens; } export interface ThemePairContribution { id: LocalContributionId; name: string; description?: string; order?: number; light: LocalContributionId; dark: LocalContributionId; }