mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Four rounds of structural rework on the conversation surface, converging on one registration model for the whole client: - Review fixes: open() leaves the inject factory (SessionsService owns the semantic); ConversationService mounts via ctx.plugin(); the bespoke view registry retires into the 'conversation.view' list slot. - Ring alignment: createChatView factory retired (components get everything through checkable shares at the register call site); the hand-rolled t/i18n threading is deleted wholesale — a future framework-level i18n will supply t as a standard prop keyed by slot name, so no interim manual channel. - Toolview dissolution: ToolViewRegistry / ToolViewResolver / ToolViewOutlet / ctx.toolviews retire. Tool rows are entries of the 'conversation.chat.toolview' keyed slot (scope: session) declared by the chat entry; ToolRowOwnerProps is the unified owner payload; GenericToolCard becomes the call-site fallback; registrants are plain plugins (inject ['slots','conversation'] as the load-order seam); session-dimension dispatch moves into components (useSessions reads parentId); trajectory/waterfall gain same-shape slots the day they render tool rows (RendersCheck rejects empty declarations). Slot names mirror the composition path (<domain>.<entry>.<hole>). - Staging follows current: cell()/binding() are pure resolution (render-safe); the constructor subscribes to the list store and followCurrent opens the event window when the current session changes — staging IS the open signal, business verbs are the timing, React render/commit is decoupled from window lifecycle. A masked current (projection gap) keeps the stage untouched so deferred teardown semantics survive reconnects. Agent Note: .agents/notes/implemented/architecture/ 2026-07-23-toolview-dissolution.md (bilingual pair) records the decision, the four rejected alternatives, and the accepted semantic changes; the web client architecture note and packages/client/AGENTS.md carry the current-state narrative. Verified: typecheck 0, duplication 0 clones (478 files), full coverage run 6190 passed with zero threshold errors, knip 0, doc-sync 24/24, client aggregate tsc 0, render-count checks (one commit per chunk, zero row re-renders under streaming) green.
31 lines
1.4 KiB
TypeScript
31 lines
1.4 KiB
TypeScript
/**
|
|
* Trajectory/Waterfall plugin, browser half: contributes the two placeholder
|
|
* views into the conversation view ring (the 'conversation.view' list slot
|
|
* declared by ui-conversation). Pure consumer — no ctx service, no Context
|
|
* declaration merge; the minimal-plugin exemplar. Contract: api-contracts v3
|
|
* section 8.
|
|
*/
|
|
import type { Context } from 'cordis'
|
|
// Type-only: the 'conversation.view' SlotMap row (declared by the slot's
|
|
// owning package) must be in the program for the register calls to type.
|
|
import type {} from '@deepseek-ai/dsh-client-ui-conversation/client'
|
|
import { TrajectoryView } from './TrajectoryView.tsx'
|
|
import { WaterfallView } from './WaterfallView.tsx'
|
|
|
|
/** Required services (cordis fiber inject — the loader passes the whole export surface as an object plugin). */
|
|
export const inject = ['slots']
|
|
|
|
/**
|
|
* Client plugin body: register the trajectory and waterfall view tabs. The
|
|
* registrations ride the slot service's effect wrapper (plugin unload
|
|
* removes both tabs); the span stats header renders inside each view body
|
|
* (the chrome attachment mechanism retired with the view ring).
|
|
* @param ctx - client root context.
|
|
*/
|
|
export function apply(ctx: Context): void {
|
|
ctx.slots.register(
|
|
{ name: 'conversation.view', id: 'trajectory', order: 10, label: 'Trajectory' }, TrajectoryView)
|
|
ctx.slots.register(
|
|
{ name: 'conversation.view', id: 'waterfall', order: 20, label: 'Waterfall' }, WaterfallView)
|
|
}
|