Files
deepseek-harness/packages/client/ui-tool/README.md
T

6.9 KiB

description, kind
description kind
Client Tool presentation plugin for the dsh web client: whole-call tree composition, the keyed per-tool view slot, and the built-in atomic tool cards. package-reference

@deepseek-ai/dsh-client-ui-tool

English | 中文

Summary

dsh-client-ui-tool is the client Tool presentation plugin of the dsh web client: it renders every tool call in the conversation. ui-conversation dispatches each ordered tool-call Conversation Node through the matching key of conversation.chat.node; this package renders its root and Code Dispatch children, then dispatches every atomic call through the keyed tool.call.toolview slot. Unregistered Tool names use the generic card. Business UI packages register only their wire Tool names and atomic views — they do not pair Session events, rebuild the transcript, or own root/subcall topology, because the Runtime remains authoritative for call/result pairing, lifecycle, and recursive subCalls projection.

Table of Contents


Use this package

Tool calls appear in the conversation as cards: a root call tree with its nested subcalls, each atomic call rendered by its owning view. Users see running, successful, failed, and interrupted states that come only from the frozen call/result slice, and can open files or inspect calls through the Host callbacks.

Registering a business tool view

An owning business package registers its wire Tool name into tool.call.toolview:

ctx.slots.inject('tool.call.toolview', () =>
  ctx.slots.register({
    name: 'tool.call.toolview',
    key: '<wire tool name>',
  }, BusinessToolRow))

The owner payload is ToolCallOwnerProps: callId, toolName, the frozen block, optional cwd and home, and plain openFile/inspect callbacks. A Code Dispatch block retains its event's parentCallId; a root Session call has no such field, so descendants keep the generic flattened form without another placement flag. Path summaries relativize to the Session cwd first, then replace a leftover POSIX Host home with ~; filePath and Host open keep the authored filesystem path. The registration receives the normal Session slot runtime share but no React node or Runtime service.

Built-in views

This package owns the generic fallback and the built-in shell/pwsh, read, write/edit, running str_replace_editor create/str_replace, grep/glob, web, todo, question, and Code Dispatch presentations. Structured cards derive directly from first-party raw event fields; Host presentCall and presentResult values never enter the Client. Foreground one-shot shell results use terminal cards. Settled persistent-shell results use the expandable generic input/output card because reset and partial-output diagnostics do not always describe one process exit status; background acknowledgements remain collapsed. Unsupported or malformed inputs fall back to flattened Tool result text. ui-skill demonstrates a business-owned registration for skill.


Understand the implementation

Implementation internals — click to expand

The package realizes one dispatch rule: atomic Tool views are keyed by wire Tool name and registered by their owning business packages; this package only renders the tree and the fallback.

Rendering contract

ToolCallTree receives one root ToolCallBlock that already contains recursive subCalls, selection state, the session cwd, and Host callbacks for opening files and inspecting calls. It recursively walks the standard call blocks and sends the root and children at every depth through the same atomic dispatch path, without subscribing to a separate parent-to-children map. Each root and child wrapper preserves the data-chat-anchor-key="call:<id>" and data-chat-call-id DOM contract used for paging and selection.

Details and cards

The package fills conversation.details.tool with ToolDetails. Row and Details renderers share one pure card model for each terminal, read, diff, search, and web card. These models validate raw call arguments, result content, failure state, persisted metadata, Code Dispatch parentCallId, and Session path facts. Unsupported or malformed inputs use flattened Tool result text. Card-specific limits and fallback rules remain in the owning terminal, diff, read, search, and web notes.


Further Exploration

These pages cover the conversation host, the view slots, and the card models.


Model Experience

None, as the package is a browser-side tool presentation layer that renders logged calls without changing model context.

KV Cache effect

None; this package neither assembles nor sends a provider request.

Known Limitations and Deferred Work

These limits define the dispatch depth and the view ownership; they are current package constraints.

  • The Host excludes run_code from Code Mode program bindings — production events produce one dispatch level; the recursive Runtime/UI contract supports nesting.
  • First-party Tool views are colocated here — they can move to their owning business packages independently through the keyed slot.
  • Tool copy reuses the ui-conversation locale namespace — tool titles, row chrome, and Cordis-free primitive labels use that dictionary; presenter models retain locale keys or data rather than rendered wording.

Dev Note

Working context for maintainers — click to expand

None.