fix(coding-agent): add entry renderers for session entries

This commit is contained in:
Mario Zechner
2026-07-01 11:00:14 +02:00
parent 8c9436407c
commit ba10b60b51
18 changed files with 507 additions and 158 deletions
@@ -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>;