refactor: apply repository naming contract

Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
This commit is contained in:
Tianyi Cui
2026-08-13 00:36:22 +08:00
parent 101df7cf58
commit a2d0f7f411
3281 changed files with 21730 additions and 21592 deletions

View File

@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/client/ui-layout/README.md
README.md: c58b9a26ac794131aaa197722d14bd04de9f0cae
README.zh.md: 2ce3d1972d39013d84216596dc57d48ab2d245d9
README.md: 7c9d64b9ca7a5fada492c37200a283904466c36d
README.zh.md: a2604d865977c495d2a3d2362b25f05e34142c97

View File

@@ -6,7 +6,7 @@ Shell plugin: three-column AppFrame (drag handles and concession chain) plus the
AppFrame always mounts the conversation and details columns; a connected Session renders through `SessionProvider`. The transient layout store starts the sidebar at its default width and details closed, and it never reads or writes `localStorage`. Hero and other unselected states also derive a zero rendered details width without changing that stored preference. AppFrame retains the last non-blank Session id across those states: the first Session remains closed, an explicit details action opens the contract default width, returning to the same Session restores its unchanged width, and selecting a different Session closes details before paint. The conversation owner share is empty, while the sidebar owner share contains only `collapsed` and `width`; registrants obtain business data from standard hooks and actions from their own inject faces.
The `/client` exports are the plugin body (`apply`/`inject`), `LayoutService`, and the four owner-share interfaces. AppFrame, the panel store, and the concession solver remain package-internal.
The `/client` exports are the plugin body (`apply`/`inject`), `LayoutController`, and the four owner-share interfaces. AppFrame, the panel store, and the concession solver remain package-internal.
## Model Experience

View File

@@ -6,7 +6,7 @@
AppFrame 始终挂载会话栏和详情栏;已连接 Session 通过 `SessionProvider` 渲染。布局 store 是瞬时状态,侧边栏以默认宽度启动,详情栏则保持关闭,且该 store 从不读写 `localStorage`。hero 和其他未选中状态也会将详情栏的渲染宽度派生为零但不会改变存储的宽度偏好。AppFrame 会跨越这些状态保留最后一个非 blank 会话 id首个会话保持关闭显式打开详情栏的操作会使用约定默认宽度返回同一会话时恢复其未改变的宽度选择不同会话时详情栏会在绘制前关闭。会话 owner share 为空,侧边栏 owner share 只包含 `collapsed``width`;注册方通过标准钩子获取业务数据,并从各自的 inject 接口获取操作。
`/client` 导出表层包含插件主体(`apply``inject`)、`LayoutService` 和四个 owner-share 接口。AppFrame、面板 store 与让步求解器仍属于包内部。
`/client` 导出表层包含插件主体(`apply``inject`)、`LayoutController` 和四个 owner-share 接口。AppFrame、面板 store 与让步求解器仍属于包内部。
## 模型体验

View File

@@ -12,7 +12,7 @@ import type {} from '@deepseek-ai/dsh-client-ui-theme/client'
import type { PanelActions } from './service.ts'
import { AppFrame } from './AppFrame.tsx'
import { createLayoutStore } from './stores.ts'
import { LayoutService } from './service.ts'
import { LayoutController } from './service.ts'
import { ThemePresenter } from './theme-presenter.ts'
// Contract exports only (export-convergence rule: cross-package consumers
@@ -20,7 +20,7 @@ import { ThemePresenter } from './theme-presenter.ts'
// ILayout: the ctx.layout face consumers and test fakes type against.
// OwnerShare contracts below are the render-side halves registrants compose
// against; the frame components and the store factory are package-internal.
export { LayoutService } from './service.ts'
export { LayoutController } from './service.ts'
export type { ILayout } from './service.ts'
declare module '@deepseek-ai/cordis' {
@@ -74,7 +74,7 @@ export const inject = ['slots', 'theme']
* @param ctx - client root context.
*/
export function apply(ctx: ClientContext): void {
const layout = new LayoutService()
const layout = new LayoutController()
ctx.effect(() => {
const disposeService = ctx.reflect.provide('layout', layout)
const disposeRegistration = ctx.slots.register({

View File

@@ -1,5 +1,5 @@
/**
* LayoutService: the cross-plugin panel-action face behind ctx.layout.
* LayoutController: the cross-plugin panel-action face behind ctx.layout.
* Panel geometry itself lives in the root entry's layout store (stores.ts);
* the current-session selection lives with the runtime sessions service, and
* the per-session active view dissolved into ui-conversation's session store
@@ -30,7 +30,7 @@ export interface ILayout {
}
/** Cross-plugin panel-action face (ctx.layout). */
export class LayoutService implements ILayout {
export class LayoutController implements ILayout {
#panels: PanelActions | undefined
/**

View File

@@ -9,10 +9,10 @@
import { Context } from '@deepseek-ai/cordis'
import { stubSettingsScope } from '@deepseek-ai/dsh-client-test-runtime'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { SlotsService } from '@deepseek-ai/dsh-client-runtime/client'
import { LocaleService } from '@deepseek-ai/dsh-client-locale/client'
import { apply as themeApply, inject as themeInject, ThemeService } from '@deepseek-ai/dsh-client-ui-theme/client'
import { apply, inject, LayoutService } from '@deepseek-ai/dsh-client-ui-layout/client'
import { SlotRegistry } from '@deepseek-ai/dsh-client-runtime/client'
import { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client'
import { apply as themeApply, inject as themeInject, ThemeRuntime } from '@deepseek-ai/dsh-client-ui-theme/client'
import { apply, inject, LayoutController } from '@deepseek-ai/dsh-client-ui-layout/client'
import { apply as nodeApply } from '@deepseek-ai/dsh-client-ui-layout'
import * as invariant from '@deepseek-ai/dsh-client-ui-layout/invariant'
@@ -22,17 +22,17 @@ beforeEach(() => {
async function bench() {
const ctx = new Context()
const slotsFiber = ctx.plugin(SlotsService)
const slotsFiber = ctx.plugin(SlotRegistry)
// Theme registers its Appearance settings row and requires the connection
// seam for persistence; model this bench as a remote, memory-only browser.
ctx.provide('locale', new LocaleService(ctx))
ctx.provide('locale', new LocaleRuntime(ctx))
ctx.provide('connection', { api: { settings: {} }, isLoopback: false } as never)
// ui-theme's Appearance row binds a durable scope through these two.
ctx.provide('remote', { $on: () => () => {} } as never)
ctx.provide('settingsScope', { bind: () => stubSettingsScope().scope } as never)
await ctx.plugin({ inject: themeInject, apply: themeApply }).await()
await slotsFiber.await()
return { ctx, slots: ctx.get('slots') as SlotsService }
return { ctx, slots: ctx.get('slots') as SlotRegistry }
}
describe('ui-layout client apply', () => {
@@ -44,7 +44,7 @@ describe('ui-layout client apply', () => {
const { ctx, slots } = await bench()
const fiber = ctx.plugin({ inject: [...inject], apply })
await fiber.await()
expect(ctx.get('layout')).toBeInstanceOf(LayoutService)
expect(ctx.get('layout')).toBeInstanceOf(LayoutController)
// The one register() call occupied 'root'…
expect(slots.entries('root')).toHaveLength(1)
// …and declared the three children in the ledger.
@@ -62,7 +62,7 @@ describe('ui-layout client apply', () => {
}
const injected = (slots.entries('root')[0]!.inject as (actions: never) => object)(actions as never)
expect(injected).toEqual({})
const layout = ctx.get('layout') as LayoutService
const layout = ctx.get('layout') as LayoutController
layout.toggleSidebar()
expect(actions.toggleSidebar).toHaveBeenCalledOnce()
})
@@ -76,7 +76,7 @@ describe('ui-layout client apply', () => {
expect(document.body.hasAttribute('data-ds-dark-theme')).toBe(false)
const themeColorMeta = document.head.querySelector<HTMLMetaElement>('meta[name="theme-color"]')
expect(themeColorMeta).not.toBeNull()
const theme = ctx.get('theme') as ThemeService
const theme = ctx.get('theme') as ThemeRuntime
theme.setTheme('dark')
expect(document.documentElement.style.colorScheme).toBe('dark')
expect(document.body.hasAttribute('data-ds-dark-theme')).toBe(true)

View File

@@ -1,11 +1,11 @@
/**
* LayoutService behavior: the cross-plugin panel-action face. Geometry
* LayoutController behavior: the cross-plugin panel-action face. Geometry
* lives in the entry store (layout-store.spec.ts) — here we assert the
* delegation contract: attachPanels wiring, the three actions forwarding, the
* unwired fail-loud, and re-attach overwriting a stale action set.
*/
import { describe, expect, it, vi } from 'vitest'
import { LayoutService } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
import { LayoutController } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
import type { PanelActions } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
function fakePanels(): PanelActions {
@@ -19,9 +19,9 @@ function fakePanels(): PanelActions {
}
}
describe('LayoutService', () => {
describe('LayoutController', () => {
it('forwards the three panel actions to the attached set', () => {
const service = new LayoutService()
const service = new LayoutController()
const panels = fakePanels()
service.attachPanels(panels)
@@ -37,14 +37,14 @@ describe('LayoutService', () => {
})
it('fails loud before the root entry wired its actions', () => {
const service = new LayoutService()
const service = new LayoutController()
expect(() => { service.toggleSidebar() }).toThrow(/panel actions not wired/)
expect(() => { service.openDetails() }).toThrow(/panel actions not wired/)
expect(() => { service.closeDetails() }).toThrow(/panel actions not wired/)
})
it('re-attach overwrites the stale action set (entry re-register)', () => {
const service = new LayoutService()
const service = new LayoutController()
const stale = fakePanels()
const fresh = fakePanels()
service.attachPanels(stale)

View File

@@ -30,7 +30,7 @@
"path": "../runtime"
},
{
"path": "../../support/invariants"
"path": "../../runtime-diagnostics/invariants"
}
]
}