fix(gui): reconcile the rebase — ui-question joins the client roster

ui-question landed on master as a full dshClient plugin package (composer
question flow); it enters the flat roster, apps/cli deps/refs, and the
smoke graph. Restore the workspace-context and user-interaction host deps
the conflict resolution had dropped.
This commit is contained in:
imccyu
2026-07-23 22:32:10 +08:00
parent 6512e57047
commit e903a864f7
12 changed files with 124 additions and 44 deletions
+1
View File
@@ -20,6 +20,7 @@
"@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^", "@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
"@deepseek-ai/dsh-client-ui-layout": "workspace:^", "@deepseek-ai/dsh-client-ui-layout": "workspace:^",
"@deepseek-ai/dsh-client-ui-question": "workspace:^",
"@deepseek-ai/dsh-client-ui-sidebar": "workspace:^", "@deepseek-ai/dsh-client-ui-sidebar": "workspace:^",
"@deepseek-ai/dsh-client-ui-theme": "workspace:^", "@deepseek-ai/dsh-client-ui-theme": "workspace:^",
"@deepseek-ai/dsh-client-ui-trajectory": "workspace:^", "@deepseek-ai/dsh-client-ui-trajectory": "workspace:^",
+1
View File
@@ -37,6 +37,7 @@ const CLIENT_PACKAGES = [
'@deepseek-ai/dsh-client-ui-layout', '@deepseek-ai/dsh-client-ui-layout',
'@deepseek-ai/dsh-client-ui-sidebar', '@deepseek-ai/dsh-client-ui-sidebar',
'@deepseek-ai/dsh-client-ui-conversation', '@deepseek-ai/dsh-client-ui-conversation',
'@deepseek-ai/dsh-client-ui-question',
'@deepseek-ai/dsh-client-ui-trajectory', '@deepseek-ai/dsh-client-ui-trajectory',
] as const ] as const
+51 -16
View File
@@ -8,21 +8,56 @@
"src" "src"
], ],
"references": [ "references": [
{ "path": "../../vendor/cordis" }, {
{ "path": "../../packages/host/apiproxy" }, "path": "../../vendor/cordis"
{ "path": "../../packages/host/runtime" }, },
{ "path": "../../packages/host/webserver" }, {
{ "path": "../../packages/core/session" }, "path": "../../packages/host/apiproxy"
{ "path": "../../packages/ui/app-boot" }, },
{ "path": "../../packages/util/paths" }, {
{ "path": "../../packages/client/connection" }, "path": "../../packages/host/runtime"
{ "path": "../../packages/client/hmr" }, },
{ "path": "../../packages/client/runtime" }, {
{ "path": "../../packages/client/ui-theme" }, "path": "../../packages/host/webserver"
{ "path": "../../packages/client/i18n" }, },
{ "path": "../../packages/client/ui-layout" }, {
{ "path": "../../packages/client/ui-sidebar" }, "path": "../../packages/core/session"
{ "path": "../../packages/client/ui-conversation" }, },
{ "path": "../../packages/client/ui-trajectory" } {
"path": "../../packages/ui/app-boot"
},
{
"path": "../../packages/util/paths"
},
{
"path": "../../packages/client/connection"
},
{
"path": "../../packages/client/hmr"
},
{
"path": "../../packages/client/runtime"
},
{
"path": "../../packages/client/ui-theme"
},
{
"path": "../../packages/client/i18n"
},
{
"path": "../../packages/client/ui-layout"
},
{
"path": "../../packages/client/ui-sidebar"
},
{
"path": "../../packages/client/ui-conversation"
},
{
"path": "../../packages/client/ui-trajectory"
},
{
"path": "../../packages/client/ui-question"
}
] ]
} }
+1 -1
View File
@@ -20,7 +20,7 @@
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
"devDependencies": { "devDependencies": {
"@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-modules": "workspace:^",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
"@deepseek-ai/dsh-client-ui-slots": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^",
"@deepseek-ai/dsh-client-web-react": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^",
+14 -14
View File
@@ -3,18 +3,18 @@ import { readFileSync } from 'node:fs'
import { join } from 'node:path' import { join } from 'node:path'
import { act, cleanup, fireEvent, screen, waitFor, within } from '@testing-library/react' import { act, cleanup, fireEvent, screen, waitFor, within } from '@testing-library/react'
import { afterEach, beforeEach, expect, it, vi } from 'vitest' import { afterEach, beforeEach, expect, it, vi } from 'vitest'
import type { BootPluginEntry } from '@deepseek-ai/dsh-client-runtime/client' import type { WebBootEntry } from '@deepseek-ai/dsh-client-modules'
import { bootWebShell } from '@deepseek-ai/dsh-client-web' import { bootWebShell } from '@deepseek-ai/dsh-client-web'
const PLUGINS: readonly (BootPluginEntry & { dir: string })[] = [ const PLUGINS: readonly (WebBootEntry & { dir: string })[] = [
{ id: '@deepseek-ai/dsh-client-connection', dir: 'connection', url: '/plugins/connection.js', inject: [], immediately: true }, { id: '@deepseek-ai/dsh-client-connection', dir: 'connection', url: '/plugins/connection.js', rev: 'fx', inject: [], immediately: true },
{ id: '@deepseek-ai/dsh-client-runtime', dir: 'runtime', url: '/plugins/runtime.js', inject: ['@deepseek-ai/dsh-client-connection'], immediately: true }, { id: '@deepseek-ai/dsh-client-runtime', dir: 'runtime', url: '/plugins/runtime.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-connection'], immediately: true },
{ id: '@deepseek-ai/dsh-client-ui-theme', dir: 'ui-theme', url: '/plugins/ui-theme.js', inject: [], immediately: true }, { id: '@deepseek-ai/dsh-client-ui-theme', dir: 'ui-theme', url: '/plugins/ui-theme.js', rev: 'fx', inject: [], immediately: true },
{ id: '@deepseek-ai/dsh-client-i18n', dir: 'i18n', url: '/plugins/i18n.js', inject: [], immediately: true }, { id: '@deepseek-ai/dsh-client-i18n', dir: 'i18n', url: '/plugins/i18n.js', rev: 'fx', inject: [], immediately: true },
{ id: '@deepseek-ai/dsh-client-ui-layout', dir: 'ui-layout', url: '/plugins/ui-layout.js', inject: ['@deepseek-ai/dsh-client-runtime'] }, { id: '@deepseek-ai/dsh-client-ui-layout', dir: 'ui-layout', url: '/plugins/ui-layout.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-runtime'] },
{ id: '@deepseek-ai/dsh-client-ui-sidebar', dir: 'ui-sidebar', url: '/plugins/ui-sidebar.js', inject: ['@deepseek-ai/dsh-client-ui-layout'] }, { id: '@deepseek-ai/dsh-client-ui-sidebar', dir: 'ui-sidebar', url: '/plugins/ui-sidebar.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
{ id: '@deepseek-ai/dsh-client-ui-conversation', dir: 'ui-conversation', url: '/plugins/ui-conversation.js', inject: ['@deepseek-ai/dsh-client-ui-layout'] }, { id: '@deepseek-ai/dsh-client-ui-conversation', dir: 'ui-conversation', url: '/plugins/ui-conversation.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
{ id: '@deepseek-ai/dsh-client-ui-trajectory', dir: 'ui-trajectory', url: '/plugins/ui-trajectory.js', inject: ['@deepseek-ai/dsh-client-ui-conversation'] }, { id: '@deepseek-ai/dsh-client-ui-trajectory', dir: 'ui-trajectory', url: '/plugins/ui-trajectory.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-conversation'] },
] ]
const bundles = new Map(PLUGINS.map(plugin => [ const bundles = new Map(PLUGINS.map(plugin => [
@@ -27,8 +27,8 @@ interface FixtureTiming {
} }
interface FixtureWindow extends Window { interface FixtureWindow extends Window {
__DSH_BOOT__?: { plugins: BootPluginEntry[] } __DSH_BOOT__?: { rev: string; entries: WebBootEntry[] }
DSHClientProxy?: unknown __ModuleLoader__?: unknown
} }
class ResizeObserverStub { class ResizeObserverStub {
@@ -51,7 +51,7 @@ beforeEach(() => {
vi.stubGlobal('requestAnimationFrame', (callback: FrameRequestCallback) => vi.stubGlobal('requestAnimationFrame', (callback: FrameRequestCallback) =>
setTimeout(() => { callback(0) }, 0) as unknown as number) setTimeout(() => { callback(0) }, 0) as unknown as number)
vi.stubGlobal('cancelAnimationFrame', (id: number) => { clearTimeout(id) }) vi.stubGlobal('cancelAnimationFrame', (id: number) => { clearTimeout(id) })
win.__DSH_BOOT__ = { plugins: PLUGINS.map(({ dir: _dir, ...plugin }) => plugin) } win.__DSH_BOOT__ = { rev: 'fx', entries: PLUGINS.map(({ dir: _dir, ...plugin }) => plugin) }
}) })
afterEach(() => { afterEach(() => {
@@ -59,7 +59,7 @@ afterEach(() => {
unmount = undefined unmount = undefined
cleanup() cleanup()
delete win.__DSH_BOOT__ delete win.__DSH_BOOT__
delete win.DSHClientProxy delete win.__ModuleLoader__
delete (globalThis as Record<string, unknown>).__fxTiming delete (globalThis as Record<string, unknown>).__fxTiming
document.body.innerHTML = '' document.body.innerHTML = ''
document.head.querySelectorAll('style[data-plugin]').forEach((style) => { style.remove() }) document.head.querySelectorAll('style[data-plugin]').forEach((style) => { style.remove() })
+12 -3
View File
@@ -9,14 +9,23 @@
"DOM", "DOM",
"DOM.Iterable" "DOM.Iterable"
], ],
"types": ["node"] "types": [
"node"
]
}, },
"include": [ "include": [
"src", "src",
"tests" "tests"
], ],
"references": [ "references": [
{ "path": "../../packages/client/web" }, {
{ "path": "../../packages/host/webserver" } "path": "../../packages/client/web"
},
{
"path": "../../packages/host/webserver"
},
{
"path": "../../packages/client/modules"
}
] ]
} }
+22 -6
View File
@@ -133,7 +133,9 @@ flowchart TD
end end
subgraph group_client["packages/client"] subgraph group_client["packages/client"]
pkg_client_connection["client-connection"] pkg_client_connection["client-connection"]
pkg_client_hmr["client-hmr"]
pkg_client_i18n["client-i18n"] pkg_client_i18n["client-i18n"]
pkg_client_modules["client-modules"]
pkg_client_runtime["client-runtime"] pkg_client_runtime["client-runtime"]
pkg_client_ui_conversation["client-ui-conversation"] pkg_client_ui_conversation["client-ui-conversation"]
pkg_client_ui_layout["client-ui-layout"] pkg_client_ui_layout["client-ui-layout"]
@@ -214,12 +216,10 @@ flowchart TD
pkg_loader_smoke --> pkg_invariants pkg_loader_smoke --> pkg_invariants
pkg_client_connection --> pkg_invariants pkg_client_connection --> pkg_invariants
pkg_client_i18n --> pkg_invariants pkg_client_i18n --> pkg_invariants
pkg_client_modules --> pkg_invariants
pkg_client_runtime --> pkg_invariants pkg_client_runtime --> pkg_invariants
pkg_client_ui_conversation --> pkg_invariants
pkg_client_ui_layout --> pkg_invariants
pkg_client_ui_primitives --> pkg_invariants pkg_client_ui_primitives --> pkg_invariants
pkg_client_ui_question --> pkg_invariants pkg_client_ui_question --> pkg_invariants
pkg_client_ui_sidebar --> pkg_invariants
pkg_client_ui_slots --> pkg_invariants pkg_client_ui_slots --> pkg_invariants
pkg_client_ui_theme --> pkg_invariants pkg_client_ui_theme --> pkg_invariants
pkg_client_ui_trajectory --> pkg_invariants pkg_client_ui_trajectory --> pkg_invariants
@@ -232,6 +232,20 @@ flowchart TD
pkg_host_webserver --> pkg_invariants pkg_host_webserver --> pkg_invariants
pkg_llm --> pkg_brand pkg_llm --> pkg_brand
pkg_llm --> pkg_invariants pkg_llm --> pkg_invariants
pkg_client_hmr --> pkg_client_modules
pkg_client_hmr --> pkg_invariants
pkg_client_ui_conversation --> pkg_client_i18n
pkg_client_ui_conversation --> pkg_client_runtime
pkg_client_ui_conversation --> pkg_client_ui_primitives
pkg_client_ui_conversation --> pkg_client_ui_slots
pkg_client_ui_conversation --> pkg_invariants
pkg_client_ui_layout --> pkg_client_runtime
pkg_client_ui_layout --> pkg_client_ui_slots
pkg_client_ui_layout --> pkg_invariants
pkg_client_ui_sidebar --> pkg_client_runtime
pkg_client_ui_sidebar --> pkg_client_ui_primitives
pkg_client_ui_sidebar --> pkg_client_ui_slots
pkg_client_ui_sidebar --> pkg_invariants
pkg_helper --> pkg_brand pkg_helper --> pkg_brand
pkg_helper --> pkg_invariants pkg_helper --> pkg_invariants
pkg_telemetry --> pkg_brand pkg_telemetry --> pkg_brand
@@ -776,12 +790,10 @@ flowchart TD
| [`loader-smoke`](../packages/support/loader-smoke) | `support` | [`invariants`](../packages/support/invariants) | | [`loader-smoke`](../packages/support/loader-smoke) | `support` | [`invariants`](../packages/support/invariants) |
| [`client-connection`](../packages/client/connection) | `client` | [`invariants`](../packages/support/invariants) | | [`client-connection`](../packages/client/connection) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-i18n`](../packages/client/i18n) | `client` | [`invariants`](../packages/support/invariants) | | [`client-i18n`](../packages/client/i18n) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-modules`](../packages/client/modules) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-runtime`](../packages/client/runtime) | `client` | [`invariants`](../packages/support/invariants) | | [`client-runtime`](../packages/client/runtime) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-conversation`](../packages/client/ui-conversation) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-layout`](../packages/client/ui-layout) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-primitives`](../packages/client/ui-primitives) | `client` | [`invariants`](../packages/support/invariants) | | [`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-question`](../packages/client/ui-question) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-sidebar`](../packages/client/ui-sidebar) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-slots`](../packages/client/ui-slots) | `client` | [`invariants`](../packages/support/invariants) | | [`client-ui-slots`](../packages/client/ui-slots) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-theme`](../packages/client/ui-theme) | `client` | [`invariants`](../packages/support/invariants) | | [`client-ui-theme`](../packages/client/ui-theme) | `client` | [`invariants`](../packages/support/invariants) |
| [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`invariants`](../packages/support/invariants) | | [`client-ui-trajectory`](../packages/client/ui-trajectory) | `client` | [`invariants`](../packages/support/invariants) |
@@ -793,6 +805,10 @@ flowchart TD
| [`host-runtime`](../packages/host/runtime) | `host` | [`invariants`](../packages/support/invariants) | | [`host-runtime`](../packages/host/runtime) | `host` | [`invariants`](../packages/support/invariants) |
| [`host-webserver`](../packages/host/webserver) | `host` | [`invariants`](../packages/support/invariants) | | [`host-webserver`](../packages/host/webserver) | `host` | [`invariants`](../packages/support/invariants) |
| [`llm`](../packages/llm/llm) | `llm` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants) | | [`llm`](../packages/llm/llm) | `llm` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants) |
| [`client-hmr`](../packages/client/hmr) | `client` | [`client-modules`](../packages/client/modules), [`invariants`](../packages/support/invariants) |
| [`client-ui-conversation`](../packages/client/ui-conversation) | `client` | [`client-i18n`](../packages/client/i18n), [`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-layout`](../packages/client/ui-layout) | `client` | [`client-runtime`](../packages/client/runtime), [`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) |
| [`helper`](../packages/sdk/helper) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants) | | [`helper`](../packages/sdk/helper) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants) |
| [`telemetry`](../packages/sdk/telemetry) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants), [`paths`](../packages/util/paths) | | [`telemetry`](../packages/sdk/telemetry) | `sdk` | [`brand`](../packages/util/brand), [`invariants`](../packages/support/invariants), [`paths`](../packages/util/paths) |
| [`llm-deepseek`](../packages/llm/llm-deepseek) | `llm` | [`invariants`](../packages/support/invariants), [`llm`](../packages/llm/llm), [`timeout`](../packages/util/timeout) | | [`llm-deepseek`](../packages/llm/llm-deepseek) | `llm` | [`invariants`](../packages/support/invariants), [`llm`](../packages/llm/llm), [`timeout`](../packages/util/timeout) |
+1 -2
View File
@@ -18,8 +18,7 @@
"workspaces": { "workspaces": {
".": { ".": {
"entry": [ "entry": [
"scripts/**/*.mjs", "scripts/**/*.mjs"
"scripts/dev-web.ts"
], ],
"project": [ "project": [
"scripts/**/*.ts", "scripts/**/*.ts",
@@ -48,7 +48,6 @@
"react": "^18.2.0" "react": "^18.2.0"
}, },
"devDependencies": { "devDependencies": {
"@deepseek-ai/dsh-client-i18n": "workspace:^",
"@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^",
"@deepseek-ai/dsh-client-ui-layout": "workspace:^", "@deepseek-ai/dsh-client-ui-layout": "workspace:^",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
+3 -1
View File
@@ -63,7 +63,9 @@
"@deepseek-ai/dsh-tool-todo": "workspace:^", "@deepseek-ai/dsh-tool-todo": "workspace:^",
"@deepseek-ai/dsh-tool-workflow": "workspace:^", "@deepseek-ai/dsh-tool-workflow": "workspace:^",
"@deepseek-ai/dsh-tools": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^",
"@deepseek-ai/dsh-workflow-workerthread": "workspace:^" "@deepseek-ai/dsh-user-interaction": "workspace:^",
"@deepseek-ai/dsh-workflow-workerthread": "workspace:^",
"@deepseek-ai/dsh-workspace-context": "workspace:^"
}, },
"peerDependencies": { "peerDependencies": {
"cordis": "^4.0.0-rc.7", "cordis": "^4.0.0-rc.7",
+6
View File
@@ -121,6 +121,12 @@
}, },
{ {
"path": "../../../vendor/loader" "path": "../../../vendor/loader"
},
{
"path": "../../context/workspace-context"
},
{
"path": "../../ui/user-interaction"
} }
] ]
} }
+12
View File
@@ -119,6 +119,9 @@ importers:
'@deepseek-ai/dsh-client-ui-layout': '@deepseek-ai/dsh-client-ui-layout':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/client/ui-layout version: link:../../packages/client/ui-layout
'@deepseek-ai/dsh-client-ui-question':
specifier: workspace:^
version: link:../../packages/client/ui-question
'@deepseek-ai/dsh-client-ui-sidebar': '@deepseek-ai/dsh-client-ui-sidebar':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/client/ui-sidebar version: link:../../packages/client/ui-sidebar
@@ -159,6 +162,9 @@ importers:
specifier: ^18.2.0 specifier: ^18.2.0
version: 18.3.1(react@18.3.1) version: 18.3.1(react@18.3.1)
devDependencies: devDependencies:
'@deepseek-ai/dsh-client-modules':
specifier: workspace:^
version: link:../../packages/client/modules
'@deepseek-ai/dsh-client-runtime': '@deepseek-ai/dsh-client-runtime':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/client/runtime version: link:../../packages/client/runtime
@@ -2181,9 +2187,15 @@ importers:
'@deepseek-ai/dsh-tools': '@deepseek-ai/dsh-tools':
specifier: workspace:^ specifier: workspace:^
version: link:../../core/tools version: link:../../core/tools
'@deepseek-ai/dsh-user-interaction':
specifier: workspace:^
version: link:../../ui/user-interaction
'@deepseek-ai/dsh-workflow-workerthread': '@deepseek-ai/dsh-workflow-workerthread':
specifier: workspace:^ specifier: workspace:^
version: link:../../workflow/workflow-workerthread version: link:../../workflow/workflow-workerthread
'@deepseek-ai/dsh-workspace-context':
specifier: workspace:^
version: link:../../context/workspace-context
devDependencies: devDependencies:
'@deepseek-ai/dsh-invariants': '@deepseek-ai/dsh-invariants':
specifier: workspace:^ specifier: workspace:^