feat(plugins): add live timeline rows and client slash commands

Plugins can transform live timeline source items at render time, append durable plugin rows from daemon handlers, and register client-only slash commands in the composer.

Related to #3940 and #3952.
This commit is contained in:
Mohamed Boudra
2026-09-02 13:12:09 +02:00
committed by GitHub
parent 49784fac15
commit e34aea206e
66 changed files with 2122 additions and 511 deletions
+21 -8
View File
@@ -1,6 +1,6 @@
import type { ComponentType } from "react";
import type { PaseoApi } from "@getpaseo/client";
import type { AgentTimelineItem } from "@getpaseo/protocol/agent-types";
import type { AgentTimelineItem, JsonValue } from "@getpaseo/protocol/agent-types";
import type { ZodType, input as ZodInput, output as ZodOutput } from "zod";
import type { PluginRpcContract } from "./rpc.js";
@@ -182,16 +182,11 @@ export interface PluginAttachmentSourceContribution {
search: PluginRpcContract;
}
export type PluginTimelineData =
| null
| boolean
| number
| string
| PluginTimelineData[]
| { [key: string]: PluginTimelineData };
export type PluginTimelineData = JsonValue;
export interface PluginTimelineItem {
type: "plugin";
id?: string;
kind: string;
version: number;
data: PluginTimelineData;
@@ -211,6 +206,7 @@ export type PluginTimelineTransformerContribution<
};
transform(input: {
item: Extract<AgentTimelineItem, { type: ItemType }>;
phase: "streaming" | "complete";
}): PluginTimelineTransformResult | undefined;
}
: never;
@@ -280,6 +276,22 @@ export type PluginCommandCenterItemContribution =
onSelect(context: PluginAgentCommandContext): void | Promise<void>;
});
interface PluginClientSlashCommandBase {
name: string;
description: string;
argumentHint: string;
}
export type PluginClientSlashCommandContribution =
| (PluginClientSlashCommandBase & {
context: "workspace";
onSubmit(context: PluginWorkspaceCommandContext & { args: string }): void | Promise<void>;
})
| (PluginClientSlashCommandBase & {
context: "agent";
onSubmit(context: PluginAgentCommandContext & { args: string }): void | Promise<void>;
});
export interface PluginHandlerContext {
paseo: PaseoApi;
}
@@ -296,6 +308,7 @@ export interface PluginContext {
addSidebarItem(contribution: PluginSidebarContribution): void;
addWorkspacePanel(contribution: PluginWorkspacePanelContribution): void;
addCommandCenterItem(contribution: PluginCommandCenterItemContribution): void;
addClientSlashCommand(contribution: PluginClientSlashCommandContribution): void;
addClientSide(contribution: PluginClientContribution): void;
addAttachmentSource(contribution: PluginAttachmentSourceContribution): void;
addTheme(contribution: PluginThemeContribution): void;
+7
View File
@@ -8,6 +8,7 @@ import type {
PluginAttachmentSourceContribution,
PluginCommandCenterItemContribution,
PluginClientContribution,
PluginClientSlashCommandContribution,
PluginContext,
PluginSidebarContribution,
PluginSurfaceContribution,
@@ -27,6 +28,7 @@ interface PluginCollector {
addSidebarItem(contribution: PluginSidebarContribution): void;
addWorkspacePanel(contribution: PluginWorkspacePanelContribution): void;
addCommandCenterItem(contribution: PluginCommandCenterItemContribution): void;
addClientSlashCommand(contribution: PluginClientSlashCommandContribution): void;
addClientSide(contribution: PluginClientContribution): void;
addAttachmentSource(contribution: PluginAttachmentSourceContribution): void;
addTheme(contribution: PluginThemeContribution): void;
@@ -39,6 +41,7 @@ export interface PluginRegistrationCollector {
sidebarItems: PluginSidebarContribution[];
workspacePanels: PluginWorkspacePanelContribution[];
commandCenterItems: PluginCommandCenterItemContribution[];
clientSlashCommands: PluginClientSlashCommandContribution[];
clientSide: PluginClientContribution | null;
attachmentSources: PluginAttachmentSourceContribution[];
themes: PluginThemeContribution[];
@@ -54,6 +57,7 @@ export function createPluginContext(
| "addSidebarItem"
| "addWorkspacePanel"
| "addCommandCenterItem"
| "addClientSlashCommand"
| "addClientSide"
| "addAttachmentSource"
| "addTheme"
@@ -73,6 +77,9 @@ export function createPluginContext(
addCommandCenterItem(contribution) {
collector.addCommandCenterItem(contribution);
},
addClientSlashCommand(contribution) {
collector.addClientSlashCommand(contribution);
},
addClientSide(contribution) {
collector.addClientSide(contribution);
},
+1
View File
@@ -22,6 +22,7 @@ export type {
PluginCommandCenterItemContribution,
PluginClientContext,
PluginClientContribution,
PluginClientSlashCommandContribution,
PluginClientOpenPanelOptions,
PluginComposerPillContribution,
PluginComposerPillProps,
+1
View File
@@ -32,5 +32,6 @@ export interface ToastApi {
export declare const Icon: ComponentType<PluginIconProps>;
export declare const Modal: ModalComponent;
export declare function useToast(): ToastApi;
export declare function useRevealedText(text: string, phase: "streaming" | "complete"): string;
export type { PluginIconProps } from "./contracts.js";