fix(web): keep skill row pairing client-local

This commit is contained in:
Yichen Jiang
2026-08-07 13:56:42 +08:00
parent 09d1b0d27f
commit 768e2e866f
31 changed files with 79 additions and 273 deletions

View File

@@ -168,12 +168,11 @@ function collapse(body: string, rooted: boolean, separator = '/'): string {
* returns a generic fenced card for an execution error or a background
* start, whose text and error styling the generic path preserves.
*
* Window truncation can drop the call event and its call-side view from a
* settled result (see `ToolResultNode.callView` in dsh-client-runtime), leaving
* a terminal result with no presentation call side even though the history
* envelope preserves its name and arguments. That still renders: the command
* falls back to the result view's replacement title, then to an empty command
* (the prompt line draws bare), and the prompt shows no cwd.
* Window truncation can drop the call head from a settled result (see
* `ToolResultNode.call`/`callView` in dsh-client-runtime), leaving a terminal
* result with no call side. That still renders: the command falls back to the
* result view's replacement title, then to an empty command (the prompt line
* draws bare), and the prompt shows no cwd.
* @param block - RunningToolCall or ToolResultNode off the snapshot caches.
* @param sessionCwd - the session workspace root, which resolves an omitted or
* relative view cwd (see {@link resolveTerminalCwd}); absent leaves both unresolved.

View File

@@ -285,12 +285,12 @@ describe('chat-flow derivation', () => {
})
describe('ChatView', () => {
it('an orphan tool result renders through the generic fallback', () => {
it('a windowless tool result (call head truncated) renders with an empty tool name', () => {
const h = makeHarness({
nodes: [{ ...toolResult(3, 'w1'), call: null }],
})
const view = render(<h.ChatView {...h.props} />)
// No durable call exists for this id, so the summary falls back to callId.
// classifyTool('') → others; the summary slot falls back to the callId.
expect(view.container.querySelector('[data-variant="others"]')).not.toBeNull()
expect(view.getByText('w1')).toBeTruthy()
})