feat(web): present Cordis lifecycle tools

This commit is contained in:
fz
2026-07-27 14:59:24 +08:00
committed by NI0317
parent 8cec221dab
commit 826c6fd243
30 changed files with 428 additions and 30 deletions
@@ -12,7 +12,7 @@
import { Context } from 'cordis'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { act, cleanup, render } from '@testing-library/react'
import { act, cleanup, fireEvent, render } from '@testing-library/react'
import { createSnapshotStore, SlotsService } from '@deepseek-ai/dsh-client-runtime/client'
import type {
ConversationSnapshot, SessionId, SessionListState, ToolResultNode, WorkspaceListState,
@@ -162,6 +162,25 @@ describe('keyed toolview hole through the real machinery', () => {
expect(view.getByText('Tool call')).toBeTruthy()
})
it('renders top-level Cordis calls with lifecycle titles over the generic variants', async () => {
const code = 'return { name: "audit", apply(ctx) {} }'
const b = await bench([
toolResult(3, 'cordis-1', 'cordis_inspect', '{"what":"api","name":"tools"}'),
toolResult(4, 'cordis-2', 'cordis_try', JSON.stringify({ code })),
toolResult(5, 'cordis-3', 'cordis_stop', '{"id":"dyn-2"}'),
])
const view = mountApp(b.slots)
expect(view.container.querySelector('[data-tool="cordis_inspect"]')?.textContent).toContain('Inspect')
const tried = view.container.querySelector('[data-variant="code"]')
expect(tried?.textContent).toContain(`Try temporary Plugin${code}`)
expect(view.container.querySelector('[data-tool="cordis_stop"]')?.textContent)
.toContain('Stop temporary Plugindyn-2')
fireEvent.click(tried!.querySelector('button[aria-expanded]')!)
expect(tried!.querySelector('pre.shiki')?.textContent).toBe(code)
})
it('row clicks travel owner openDetails → chat inject → layout orchestration', async () => {
const b = await bench([toolResult(3, 'c1', 'bash')])
const view = mountApp(b.slots)