fix(coding-agent): add entry renderers for session entries
This commit is contained in:
@@ -50,6 +50,9 @@ export type {
|
||||
EditorFactory,
|
||||
EditToolCallEvent,
|
||||
EditToolResultEvent,
|
||||
// Message and Entry Rendering
|
||||
EntryRenderer,
|
||||
EntryRenderOptions,
|
||||
ExecOptions,
|
||||
ExecResult,
|
||||
Extension,
|
||||
@@ -91,7 +94,6 @@ export type {
|
||||
LsToolResultEvent,
|
||||
// Events - Message
|
||||
MessageEndEvent,
|
||||
// Message Rendering
|
||||
MessageRenderer,
|
||||
MessageRenderOptions,
|
||||
MessageStartEvent,
|
||||
|
||||
@@ -30,6 +30,7 @@ import { execCommand } from "../exec.ts";
|
||||
import { createSyntheticSourceInfo } from "../source-info.ts";
|
||||
import { time } from "../timings.ts";
|
||||
import type {
|
||||
EntryRenderer,
|
||||
Extension,
|
||||
ExtensionAPI,
|
||||
ExtensionFactory,
|
||||
@@ -269,6 +270,12 @@ function createExtensionAPI(
|
||||
extension.messageRenderers.set(customType, renderer as MessageRenderer);
|
||||
},
|
||||
|
||||
registerEntryRenderer<T>(customType: string, renderer: EntryRenderer<T>): void {
|
||||
runtime.assertActive();
|
||||
extension.entryRenderers ??= new Map();
|
||||
extension.entryRenderers.set(customType, renderer as EntryRenderer);
|
||||
},
|
||||
|
||||
// Flag access - checks extension registered it, reads from runtime
|
||||
getFlag(name: string): boolean | string | undefined {
|
||||
runtime.assertActive();
|
||||
@@ -415,6 +422,7 @@ function createExtension(extensionPath: string, resolvedPath: string): Extension
|
||||
handlers: new Map(),
|
||||
tools: new Map(),
|
||||
messageRenderers: new Map(),
|
||||
entryRenderers: new Map(),
|
||||
commands: new Map(),
|
||||
flags: new Map(),
|
||||
shortcuts: new Map(),
|
||||
|
||||
@@ -19,6 +19,7 @@ import type {
|
||||
ContextEvent,
|
||||
ContextEventResult,
|
||||
ContextUsage,
|
||||
EntryRenderer,
|
||||
Extension,
|
||||
ExtensionActions,
|
||||
ExtensionCommandContext,
|
||||
@@ -553,6 +554,16 @@ export class ExtensionRunner {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
getEntryRenderer(customType: string): EntryRenderer | undefined {
|
||||
for (const ext of this.extensions) {
|
||||
const renderer = ext.entryRenderers?.get(customType);
|
||||
if (renderer) {
|
||||
return renderer;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
private resolveRegisteredCommands(): ResolvedCommand[] {
|
||||
const commands: RegisteredCommand[] = [];
|
||||
const counts = new Map<string, number>();
|
||||
|
||||
@@ -52,6 +52,7 @@ import type { ModelRegistry } from "../model-registry.ts";
|
||||
import type {
|
||||
BranchSummaryEntry,
|
||||
CompactionEntry,
|
||||
CustomEntry,
|
||||
ReadonlySessionManager,
|
||||
SessionEntry,
|
||||
SessionManager,
|
||||
@@ -1093,19 +1094,29 @@ export interface SessionBeforeTreeResult {
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Message Rendering
|
||||
// Message and Entry Rendering
|
||||
// ============================================================================
|
||||
|
||||
export interface MessageRenderOptions {
|
||||
expanded: boolean;
|
||||
}
|
||||
|
||||
export interface EntryRenderOptions {
|
||||
expanded: boolean;
|
||||
}
|
||||
|
||||
export type MessageRenderer<T = unknown> = (
|
||||
message: CustomMessage<T>,
|
||||
options: MessageRenderOptions,
|
||||
theme: Theme,
|
||||
) => Component | undefined;
|
||||
|
||||
export type EntryRenderer<T = unknown> = (
|
||||
entry: CustomEntry<T>,
|
||||
options: EntryRenderOptions,
|
||||
theme: Theme,
|
||||
) => Component | undefined;
|
||||
|
||||
// ============================================================================
|
||||
// Command Registration
|
||||
// ============================================================================
|
||||
@@ -1224,6 +1235,9 @@ export interface ExtensionAPI {
|
||||
/** Register a custom renderer for CustomMessageEntry. */
|
||||
registerMessageRenderer<T = unknown>(customType: string, renderer: MessageRenderer<T>): void;
|
||||
|
||||
/** Register a custom renderer for CustomEntry. Custom entries do not participate in LLM context. */
|
||||
registerEntryRenderer<T = unknown>(customType: string, renderer: EntryRenderer<T>): void;
|
||||
|
||||
// =========================================================================
|
||||
// Actions
|
||||
// =========================================================================
|
||||
@@ -1598,6 +1612,7 @@ export interface Extension {
|
||||
handlers: Map<string, HandlerFn[]>;
|
||||
tools: Map<string, RegisteredTool>;
|
||||
messageRenderers: Map<string, MessageRenderer>;
|
||||
entryRenderers?: Map<string, EntryRenderer>;
|
||||
commands: Map<string, RegisteredCommand>;
|
||||
flags: Map<string, ExtensionFlag>;
|
||||
shortcuts: Map<KeyId, ExtensionShortcut>;
|
||||
|
||||
Reference in New Issue
Block a user