diff --git a/apps/cli/package.json b/apps/cli/package.json index 1062ede609..d7942c1e2d 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -20,6 +20,7 @@ "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-conversation": "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-theme": "workspace:^", "@deepseek-ai/dsh-client-ui-trajectory": "workspace:^", diff --git a/apps/cli/src/web.ts b/apps/cli/src/web.ts index a18720d986..7518804ebb 100644 --- a/apps/cli/src/web.ts +++ b/apps/cli/src/web.ts @@ -37,6 +37,7 @@ const CLIENT_PACKAGES = [ '@deepseek-ai/dsh-client-ui-layout', '@deepseek-ai/dsh-client-ui-sidebar', '@deepseek-ai/dsh-client-ui-conversation', + '@deepseek-ai/dsh-client-ui-question', '@deepseek-ai/dsh-client-ui-trajectory', ] as const diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json index 8c6385cf22..cbc786d4c6 100644 --- a/apps/cli/tsconfig.json +++ b/apps/cli/tsconfig.json @@ -8,21 +8,56 @@ "src" ], "references": [ - { "path": "../../vendor/cordis" }, - { "path": "../../packages/host/apiproxy" }, - { "path": "../../packages/host/runtime" }, - { "path": "../../packages/host/webserver" }, - { "path": "../../packages/core/session" }, - { "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": "../../vendor/cordis" + }, + { + "path": "../../packages/host/apiproxy" + }, + { + "path": "../../packages/host/runtime" + }, + { + "path": "../../packages/host/webserver" + }, + { + "path": "../../packages/core/session" + }, + { + "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" + } ] } diff --git a/apps/web/package.json b/apps/web/package.json index 1b55f75d0d..a6b5a9b43f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,7 +20,7 @@ "react-dom": "^18.2.0" }, "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-slots": "workspace:^", "@deepseek-ai/dsh-client-web-react": "workspace:^", diff --git a/apps/web/tests/session-title.snapshot.ts b/apps/web/tests/session-title.snapshot.ts index a1b5f45839..78023d5455 100644 --- a/apps/web/tests/session-title.snapshot.ts +++ b/apps/web/tests/session-title.snapshot.ts @@ -3,18 +3,18 @@ import { readFileSync } from 'node:fs' import { join } from 'node:path' import { act, cleanup, fireEvent, screen, waitFor, within } from '@testing-library/react' 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' -const PLUGINS: readonly (BootPluginEntry & { dir: string })[] = [ - { id: '@deepseek-ai/dsh-client-connection', dir: 'connection', url: '/plugins/connection.js', 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-ui-theme', dir: 'ui-theme', url: '/plugins/ui-theme.js', inject: [], immediately: true }, - { id: '@deepseek-ai/dsh-client-i18n', dir: 'i18n', url: '/plugins/i18n.js', 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-sidebar', dir: 'ui-sidebar', url: '/plugins/ui-sidebar.js', 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-trajectory', dir: 'ui-trajectory', url: '/plugins/ui-trajectory.js', inject: ['@deepseek-ai/dsh-client-ui-conversation'] }, +const PLUGINS: readonly (WebBootEntry & { dir: string })[] = [ + { 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', 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', rev: 'fx', 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', rev: 'fx', inject: ['@deepseek-ai/dsh-client-runtime'] }, + { 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', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] }, + { 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 => [ @@ -27,8 +27,8 @@ interface FixtureTiming { } interface FixtureWindow extends Window { - __DSH_BOOT__?: { plugins: BootPluginEntry[] } - DSHClientProxy?: unknown + __DSH_BOOT__?: { rev: string; entries: WebBootEntry[] } + __ModuleLoader__?: unknown } class ResizeObserverStub { @@ -51,7 +51,7 @@ beforeEach(() => { vi.stubGlobal('requestAnimationFrame', (callback: FrameRequestCallback) => setTimeout(() => { callback(0) }, 0) as unknown as number) 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(() => { @@ -59,7 +59,7 @@ afterEach(() => { unmount = undefined cleanup() delete win.__DSH_BOOT__ - delete win.DSHClientProxy + delete win.__ModuleLoader__ delete (globalThis as Record).__fxTiming document.body.innerHTML = '' document.head.querySelectorAll('style[data-plugin]').forEach((style) => { style.remove() }) diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 8cf0acfd37..998996304e 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -9,14 +9,23 @@ "DOM", "DOM.Iterable" ], - "types": ["node"] + "types": [ + "node" + ] }, "include": [ "src", "tests" ], "references": [ - { "path": "../../packages/client/web" }, - { "path": "../../packages/host/webserver" } + { + "path": "../../packages/client/web" + }, + { + "path": "../../packages/host/webserver" + }, + { + "path": "../../packages/client/modules" + } ] } diff --git a/docs/module-graph.md b/docs/module-graph.md index 46a24b0683..361f28d111 100644 --- a/docs/module-graph.md +++ b/docs/module-graph.md @@ -133,7 +133,9 @@ flowchart TD end subgraph group_client["packages/client"] pkg_client_connection["client-connection"] + pkg_client_hmr["client-hmr"] pkg_client_i18n["client-i18n"] + pkg_client_modules["client-modules"] pkg_client_runtime["client-runtime"] pkg_client_ui_conversation["client-ui-conversation"] pkg_client_ui_layout["client-ui-layout"] @@ -214,12 +216,10 @@ flowchart TD pkg_loader_smoke --> pkg_invariants pkg_client_connection --> pkg_invariants pkg_client_i18n --> pkg_invariants + pkg_client_modules --> 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_question --> pkg_invariants - pkg_client_ui_sidebar --> pkg_invariants pkg_client_ui_slots --> pkg_invariants pkg_client_ui_theme --> pkg_invariants pkg_client_ui_trajectory --> pkg_invariants @@ -232,6 +232,20 @@ flowchart TD pkg_host_webserver --> pkg_invariants pkg_llm --> pkg_brand 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_invariants pkg_telemetry --> pkg_brand @@ -776,12 +790,10 @@ flowchart TD | [`loader-smoke`](../packages/support/loader-smoke) | `support` | [`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-modules`](../packages/client/modules) | `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-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-theme`](../packages/client/ui-theme) | `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-webserver`](../packages/host/webserver) | `host` | [`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) | | [`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) | diff --git a/knip.json b/knip.json index f182867eee..27dab0df1d 100644 --- a/knip.json +++ b/knip.json @@ -18,8 +18,7 @@ "workspaces": { ".": { "entry": [ - "scripts/**/*.mjs", - "scripts/dev-web.ts" + "scripts/**/*.mjs" ], "project": [ "scripts/**/*.ts", diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index ed43e3988d..268dc62c26 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -48,7 +48,6 @@ "react": "^18.2.0" }, "devDependencies": { - "@deepseek-ai/dsh-client-i18n": "workspace:^", "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-layout": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", diff --git a/packages/host/runtime/package.json b/packages/host/runtime/package.json index 407cbad0f1..94a544fb74 100644 --- a/packages/host/runtime/package.json +++ b/packages/host/runtime/package.json @@ -63,7 +63,9 @@ "@deepseek-ai/dsh-tool-todo": "workspace:^", "@deepseek-ai/dsh-tool-workflow": "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": { "cordis": "^4.0.0-rc.7", diff --git a/packages/host/runtime/tsconfig.json b/packages/host/runtime/tsconfig.json index cd2eee67cc..aee28b5371 100644 --- a/packages/host/runtime/tsconfig.json +++ b/packages/host/runtime/tsconfig.json @@ -121,6 +121,12 @@ }, { "path": "../../../vendor/loader" + }, + { + "path": "../../context/workspace-context" + }, + { + "path": "../../ui/user-interaction" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2591ec1c2..8d911ae1c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,6 +119,9 @@ importers: '@deepseek-ai/dsh-client-ui-layout': specifier: workspace:^ 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': specifier: workspace:^ version: link:../../packages/client/ui-sidebar @@ -159,6 +162,9 @@ importers: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) devDependencies: + '@deepseek-ai/dsh-client-modules': + specifier: workspace:^ + version: link:../../packages/client/modules '@deepseek-ai/dsh-client-runtime': specifier: workspace:^ version: link:../../packages/client/runtime @@ -2181,9 +2187,15 @@ importers: '@deepseek-ai/dsh-tools': specifier: workspace:^ version: link:../../core/tools + '@deepseek-ai/dsh-user-interaction': + specifier: workspace:^ + version: link:../../ui/user-interaction '@deepseek-ai/dsh-workflow-workerthread': specifier: workspace:^ version: link:../../workflow/workflow-workerthread + '@deepseek-ai/dsh-workspace-context': + specifier: workspace:^ + version: link:../../context/workspace-context devDependencies: '@deepseek-ai/dsh-invariants': specifier: workspace:^