From 71f1f36175a1e088d87c3fc416cea7cc5676fcae Mon Sep 17 00:00:00 2001 From: _Kerman Date: Tue, 28 Jul 2026 10:34:47 +0800 Subject: [PATCH] fix(ui): align trajectory CI contracts --- docs/module-graph.md | 5 +++-- .../ui-conversation/tests/skeleton.spec.tsx | 7 +++++-- .../src/client/trajectory-record.ts | 2 +- .../client/ui-trajectory/tests/cell.spec.tsx | 16 ++++++++-------- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/module-graph.md b/docs/module-graph.md index f69b89e379..05f298d536 100644 --- a/docs/module-graph.md +++ b/docs/module-graph.md @@ -251,7 +251,6 @@ flowchart TD pkg_client_ui_primitives --> pkg_invariants pkg_client_ui_question --> pkg_invariants pkg_client_ui_slots --> pkg_invariants - pkg_client_ui_trajectory --> pkg_invariants pkg_client_web --> pkg_invariants pkg_client_web_react --> pkg_invariants pkg_code_runtime --> pkg_invariants @@ -286,6 +285,8 @@ flowchart TD pkg_client_ui_slash --> pkg_client_runtime pkg_client_ui_slash --> pkg_client_ui_slots pkg_client_ui_slash --> pkg_invariants + pkg_client_ui_trajectory --> pkg_client_ui_primitives + pkg_client_ui_trajectory --> pkg_invariants pkg_client_ui_workspace --> pkg_client_runtime pkg_client_ui_workspace --> pkg_client_ui_primitives pkg_client_ui_workspace --> pkg_client_ui_slots @@ -918,7 +919,6 @@ flowchart TD | [`client-ui-primitives`](../packages/client/ui-primitives) | `client` | [`invariants`](../packages/support/invariants) | | [`client-ui-question`](../packages/client/ui-question) | `client` | [`invariants`](../packages/support/invariants) | | [`client-ui-slots`](../packages/client/ui-slots) | `client` | [`invariants`](../packages/support/invariants) | -| [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`invariants`](../packages/support/invariants) | | [`client-web`](../packages/client/web) | `client` | [`invariants`](../packages/support/invariants) | | [`client-web-react`](../packages/client/web-react) | `client` | [`invariants`](../packages/support/invariants) | | [`code-runtime`](../packages/code-runtime/code-runtime) | `code-runtime` | [`invariants`](../packages/support/invariants) | @@ -935,6 +935,7 @@ flowchart TD | [`client-ui-settings`](../packages/client/ui-settings) | `client` | [`client-runtime`](../packages/client/runtime), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-slots`](../packages/client/ui-slots), [`invariants`](../packages/support/invariants) | | [`client-ui-sidebar`](../packages/client/ui-sidebar) | `client` | [`client-runtime`](../packages/client/runtime), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-slots`](../packages/client/ui-slots), [`invariants`](../packages/support/invariants) | | [`client-ui-slash`](../packages/client/ui-slash) | `client` | [`client-runtime`](../packages/client/runtime), [`client-ui-slots`](../packages/client/ui-slots), [`invariants`](../packages/support/invariants) | +| [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`client-ui-primitives`](../packages/client/ui-primitives), [`invariants`](../packages/support/invariants) | | [`client-ui-workspace`](../packages/client/ui-workspace) | `client` | [`client-runtime`](../packages/client/runtime), [`client-ui-primitives`](../packages/client/ui-primitives), [`client-ui-slots`](../packages/client/ui-slots), [`invariants`](../packages/support/invariants) | | [`helper`](../packages/sdk/helper) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants), [`subprocess`](../packages/subprocess/subprocess) | | [`telemetry`](../packages/sdk/telemetry) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants), [`paths`](../packages/util/paths) | diff --git a/packages/client/ui-conversation/tests/skeleton.spec.tsx b/packages/client/ui-conversation/tests/skeleton.spec.tsx index f0c5288b00..cc6ac42995 100644 --- a/packages/client/ui-conversation/tests/skeleton.spec.tsx +++ b/packages/client/ui-conversation/tests/skeleton.spec.tsx @@ -17,7 +17,9 @@ import { ConversationRoot } from '../src/client/skeleton/ConversationRoot.tsx' import { ConversationSession } from '../src/client/skeleton/ConversationSession.tsx' import { InputBar } from '../src/client/skeleton/InputBar.tsx' import type { InputBarProps } from '../src/client/skeleton/InputBar.tsx' -import type { ComposerBarOwnerProps } from '../src/client/contract/slots.ts' +import type { + ComposerBarOwnerProps, ConversationSessionOwnerProps, +} from '../src/client/contract/slots.ts' /** Machine-backed wiring over a sink spy. */ function fakeWiring() { @@ -86,9 +88,10 @@ function mount( slotCalls.push(key) if (key === 'conversation.hero.workspace') { pickerOwner = owner; return null } if (key === 'conversation.session') { + const sessionOwner = owner as ConversationSessionOwnerProps return ( children(SID)} useSession={useSession} diff --git a/packages/client/ui-trajectory/src/client/trajectory-record.ts b/packages/client/ui-trajectory/src/client/trajectory-record.ts index eb32045f41..42118510e9 100644 --- a/packages/client/ui-trajectory/src/client/trajectory-record.ts +++ b/packages/client/ui-trajectory/src/client/trajectory-record.ts @@ -95,7 +95,7 @@ export interface TrajectoryCellProps extends HTMLAttributes { /** * Format own-duration for the trailing time column. * @param seconds - Duration seconds, or `null` when absent. - * @returns `—` when unknown, otherwise a signed seconds label. + * @returns `—` when unknown, otherwise a seconds label. */ export function formatElapsedSeconds(seconds: number | null): string { if (seconds === null || !Number.isFinite(seconds)) return '—' diff --git a/packages/client/ui-trajectory/tests/cell.spec.tsx b/packages/client/ui-trajectory/tests/cell.spec.tsx index d6bc1932b3..30f5814998 100644 --- a/packages/client/ui-trajectory/tests/cell.spec.tsx +++ b/packages/client/ui-trajectory/tests/cell.spec.tsx @@ -16,11 +16,11 @@ afterEach(cleanup) describe('formatElapsedSeconds', () => { it('formats known durations and uses an em dash when absent', () => { expect(formatElapsedSeconds(null)).toBe('—') - expect(formatElapsedSeconds(235)).toBe('+235s') - expect(formatElapsedSeconds(235.0)).toBe('+235s') - expect(formatElapsedSeconds(235.2)).toBe('+235.2s') - expect(formatElapsedSeconds(235.25)).toBe('+235.3s') - expect(formatElapsedSeconds(0)).toBe('+0s') + expect(formatElapsedSeconds(235)).toBe('235 s') + expect(formatElapsedSeconds(235.0)).toBe('235 s') + expect(formatElapsedSeconds(235.2)).toBe('235.2 s') + expect(formatElapsedSeconds(235.25)).toBe('235.3 s') + expect(formatElapsedSeconds(0)).toBe('0 s') expect(formatElapsedSeconds(Number.NaN)).toBe('—') }) }) @@ -38,7 +38,7 @@ describe('TrajectoryCell', () => { expect(screen.getByText('#6')).toBeTruthy() expect(screen.getByText('Tool')).toBeTruthy() expect(screen.getByText('bash · Read src/index.ts')).toBeTruthy() - expect(screen.getByText('+5s')).toBeTruthy() + expect(screen.getByText('5 s')).toBeTruthy() }) it('Message rows expose Input / Output / Think metric columns before time', () => { @@ -57,11 +57,11 @@ describe('TrajectoryCell', () => { expect(screen.getByText('136')).toBeTruthy() expect(screen.getByText('381')).toBeTruthy() expect(screen.getByText('155')).toBeTruthy() - expect(screen.getByText('+235.2s')).toBeTruthy() + expect(screen.getByText('235.2 s')).toBeTruthy() const texts = [...container.querySelectorAll('span')].map(el => el.textContent) expect(texts.indexOf('136')).toBeLessThan(texts.indexOf('381')) expect(texts.indexOf('381')).toBeLessThan(texts.indexOf('155')) - expect(texts.indexOf('155')).toBeLessThan(texts.indexOf('+235.2s')) + expect(texts.indexOf('155')).toBeLessThan(texts.indexOf('235.2 s')) }) it('selected marks the row for the brand-primary inset ring', () => {