Centralize tool call scroll helpers

This commit is contained in:
Shantur Rathore
2025-12-06 22:22:44 +00:00
parent 0b9cce6f86
commit 04f6e362b9
3 changed files with 42 additions and 13 deletions

View File

@@ -40,7 +40,7 @@ export const taskRenderer: ToolRenderer = {
}
return base
},
renderBody({ toolState, toolCall, messageVersion, partVersion }) {
renderBody({ toolState, toolCall, messageVersion, partVersion, scrollHelpers }) {
const items = createMemo(() => {
// Track the reactive change points so we only recompute when the part/message changes
messageVersion?.()
@@ -63,7 +63,11 @@ export const taskRenderer: ToolRenderer = {
if (items().length === 0) return null
return (
<div class="message-text tool-call-markdown tool-call-task-container">
<div
class="message-text tool-call-markdown tool-call-task-container"
ref={(element) => scrollHelpers?.registerContainer(element)}
onScroll={scrollHelpers ? (event) => scrollHelpers.handleScroll(event as Event & { currentTarget: HTMLDivElement }) : undefined}
>
<div class="tool-call-task-summary">
<For each={items()}>
{(item) => {
@@ -78,7 +82,9 @@ export const taskRenderer: ToolRenderer = {
}}
</For>
</div>
{scrollHelpers?.renderSentinel?.()}
</div>
)
},
}

View File

@@ -21,6 +21,12 @@ export interface DiffRenderOptions {
label?: string
}
export interface ToolScrollHelpers {
registerContainer(element: HTMLDivElement | null, options?: { disableTracking?: boolean }): void
handleScroll(event: Event & { currentTarget: HTMLDivElement }): void
renderSentinel(options?: { disableTracking?: boolean }): JSXElement | null
}
export interface ToolRendererContext {
toolCall: Accessor<ToolCallPart>
toolState: Accessor<ToolState | undefined>
@@ -29,6 +35,7 @@ export interface ToolRendererContext {
partVersion?: Accessor<number | undefined>
renderMarkdown(options: MarkdownRenderOptions): JSXElement | null
renderDiff(payload: DiffPayload, options?: DiffRenderOptions): JSXElement | null
scrollHelpers?: ToolScrollHelpers
}
export interface ToolRenderer {