perf(build): declare React type packages only at the workspace root

TypeScript builds a synthetic signature for every JSX intrinsic element and
computes a module specifier for @types/react (index and jsx-runtime) per
importing file. computeModuleSpecifiers visits every symlinked location of
that file and scans all 491 tsconfig paths for each; pnpm gave 65 packages
their own node_modules/@types/react link. Client test-aggregate Check
followed 26.9 + 0.494 * N seconds for N locations.

- Remove @types/react and @types/react-dom from all 67 workspace manifests
  and declare them once in the root devDependencies; packages keep declaring
  the react and react-dom they import (ui-slots gains react).
- verify-package-dependencies rejects either package in any workspace
  manifest and requires the root declaration, so a new package cannot add
  the link back.
- packages/client/AGENTS.md states the rule.

Client aggregate Check 59.1 s -> 26.5 s; the 76 client-only package
projects 54-57 s -> ~44 s wall. File set (2,613) and diagnostics unchanged.

Refs #5852
This commit is contained in:
imccyu committed 2026-10-11 18:19:21 +08:00
1 parent c1a4ce0117
commit 1c6078dca6
72 files changed
+142 -393

No files matched your search

-2
View File
@@ -75,8 +75,6 @@
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"vite": "^6.4.3",
"@deepseek-ai/dsh-client-ui-theme": "workspace:*",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*",
-2
View File
@@ -49,8 +49,6 @@
"@deepseek-ai/dsh-session-projection-cache": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@types/node": "^22.20.1",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@types/ws": "8.18.1",
"@vitejs/plugin-react": "^4.7.0",
"http-server": "^14.1.1",
+2
View File
@@ -242,6 +242,8 @@
"@types/node": "^22.20.1",
"@types/semver": "^7.8.0",
"@types/spdx-expression-parse": "^4.0.0",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@vitest/coverage-v8": "^4.1.11",
"@yao-pkg/pkg": "6.21.0",
"@yarnpkg/cli-dist": "4.18.0",
+1
View File
@@ -69,6 +69,7 @@ Npm sections describe installation and development relationships; each build fac
5. **Only Host runtime libraries require installation dependencies.** Browser-only third-party implementations belong in `devDependencies`, whether inlined into `lib/client.js` or retained as bare imports in a static browser library. Static libraries are Web-shell build inputs; the final Vite build merges their imports and styles. Distributed browser code remains subject to runtime license disclosure ([reference](../../.agents/notes/implemented/process/2026-08-26-published-dependency-faces.md)).
6. **Browser and Node build faces declare externality independently.** A dynamic browser half uses the baseline plus `dsh.client.external`; a statically linked face externalizes every bare specifier; a Node face externalizes its production dependencies ([`tsdown.client.ts`](tsdown.client.ts)). Moving a name between npm sections must not silently change bundle contents.
7. **Keep the published payload closed.** Every relative runtime import and emitted asset must be covered by `files`; the repository publint pass checks the exact publication view.
8. **Only the root manifest declares React type packages.** `@types/react` and `@types/react-dom` belong only in the root `package.json` `devDependencies`, and `verify-package-dependencies` rejects them in every workspace manifest; packages still declare the `react` and `react-dom` they import. Each package-local pnpm link is one more location TypeScript scans when it computes module specifiers for every JSX file ([rationale](../../.agents/notes/implemented/process/2026-10-11-lossless-build-speedups.md#1-only-the-root-manifest-declares-react-type-packages)).
## Build-time browser environment
-1
View File
@@ -52,7 +52,6 @@
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-package-manifest": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-connection": "workspace:*",
"@deepseek-ai/dsh-settings": "workspace:*"
@@ -68,7 +68,6 @@
"@deepseek-ai/dsh-client-ui-workspace": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
-1
View File
@@ -60,7 +60,6 @@
"@deepseek-ai/dsh-llm": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*"
},
@@ -46,8 +46,6 @@
"license": "MIT",
"devDependencies": {
"@deepseek-ai/cordis": "workspace:~",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/dsh-client-locale": "workspace:*",
"@deepseek-ai/dsh-client-ui-chat": "workspace:*",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:*",
@@ -49,7 +49,6 @@
"@deepseek-ai/dsh-client-ui-sidebar": "workspace:*",
"@deepseek-ai/cordis": "workspace:~",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
-2
View File
@@ -89,8 +89,6 @@
"@deepseek-ai/dsh-util-workspace-path": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@tanstack/react-virtual": "3.14.10",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@deepseek-ai/dsh-settings": "workspace:*",
-1
View File
@@ -55,7 +55,6 @@
"@deepseek-ai/dsh-client-ui-input-trigger": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-commands": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-api-session-controller": "workspace:*",
@@ -83,11 +83,9 @@
"@deepseek-ai/dsh-workspace": "workspace:*",
"@deepseek-ai/dsh-file-reference": "workspace:*",
"@deepseek-ai/dsh-util-workspace-path": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@lexical/headless": "^0.49.0",
"react-dom": "^18.2.0",
"@types/react-dom": "~18.3.0",
"zod": "4.4.3",
"lexical": "^0.49.0",
"clsx": "^2.0.0",
@@ -62,7 +62,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-sidebar-right": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
@@ -54,7 +54,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-client-ui-workspace": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -48,7 +48,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-workspace": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0"
-2
View File
@@ -27,8 +27,6 @@
"@deepseek-ai/dsh-brand": "workspace:*",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react-dom": "^18.2.0",
"react": "^18.2.0",
"clsx": "^2.0.0"
-1
View File
@@ -62,7 +62,6 @@
"@deepseek-ai/dsh-commands": "workspace:*",
"@deepseek-ai/dsh-goal": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -52,7 +52,6 @@
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-file-reference": "workspace:*",
-2
View File
@@ -46,8 +46,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-jobs": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
-1
View File
@@ -54,7 +54,6 @@
"@deepseek-ai/dsh-client-ui-session": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-client-ui-theme": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*"
@@ -61,8 +61,6 @@
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@deepseek-ai/cordis": "workspace:~",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@deepseek-ai/dsh-client-ui-chat": "workspace:*",
@@ -56,11 +56,9 @@
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/dsh-client-store": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
@@ -75,7 +75,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-host-open-in-app": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-deliverables": "workspace:*",
"@deepseek-ai/dsh-native-command": "workspace:*",
@@ -64,7 +64,6 @@
"@deepseek-ai/dsh-client-ui-input-trigger": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-permission-presets": "workspace:*",
"@types/react": "~18.3.1",
"clsx": "^2.0.0",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
-1
View File
@@ -58,7 +58,6 @@
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-plan-mode": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-session": "workspace:*",
@@ -66,8 +66,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-package-manifest": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"clsx": "^2.1.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -24,8 +24,6 @@
"license": "MIT",
"devDependencies": {
"@deepseek-ai/dsh-client-store": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/cordis": "workspace:~",
"@deepseek-ai/dsh-util-code-language": "workspace:*",
"react": "^18.2.0",
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-locale": "workspace:*",
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@deepseek-ai/dsh-client-ui-conversation": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-input-trigger": "workspace:*",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
-2
View File
@@ -44,8 +44,6 @@
"@deepseek-ai/cordis": "workspace:~",
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@types/use-sync-external-store": "^1.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
-2
View File
@@ -74,8 +74,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"clsx": "^2.1.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
-1
View File
@@ -55,7 +55,6 @@
"@deepseek-ai/dsh-remote-mock": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
@@ -64,11 +64,9 @@
"@deepseek-ai/dsh-settings": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/big.js": "^6.2.2",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@deepseek-ai/dsh-client-ui-settings-models": "workspace:*",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/dsh-host-webserver": "workspace:*",
"big.js": "^7.0.1",
"@deepseek-ai/dsh-client-product-analytics": "workspace:*"
@@ -55,7 +55,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
@@ -67,8 +67,6 @@
"@deepseek-ai/dsh-client-ui-sidebar": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-remote-mock": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"clsx": "^2.0.0",
"react": "^18.2.0",
"@deepseek-ai/dsh-settings": "workspace:*",
@@ -53,7 +53,6 @@
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-package-manifest": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -51,7 +51,6 @@
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
@@ -54,11 +54,9 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-ui-layout": "workspace:*",
"react-dom": "^18.2.0",
"@types/react-dom": "~18.3.0"
"react-dom": "^18.2.0"
},
"files": [
"locale/*.json",
@@ -55,7 +55,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"files": [
-1
View File
@@ -49,7 +49,6 @@
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-settings": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-util-values": "workspace:*"
},
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-ui-layout": "workspace:*",
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-brand": "workspace:*",
"@types/react": "~18.3.1",
"clsx": "^2.1.1",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-test-runtime": "workspace:*"
@@ -61,8 +61,6 @@
"@deepseek-ai/dsh-client-ui-sidebar-right": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
@@ -74,8 +74,6 @@
"@fortune-sheet/react": "1.0.4",
"@testing-library/react": "^16.3.3",
"@types/papaparse": "^5.3.16",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"clsx": "^2.0.0",
"dompurify": "^3.4.16",
"exceljs": "4.4.0",
@@ -63,8 +63,6 @@
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@deepseek-ai/dsh-util-workspace-path": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"clsx": "^2.0.0",
"react-dom": "^18.2.0",
@@ -64,8 +64,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/picomatch": "^4.0.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"picomatch": "^4.0.7",
@@ -60,8 +60,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"clsx": "^2.0.0",
"react-dom": "^18.2.0",
-1
View File
@@ -59,7 +59,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-client-ui-session": "workspace:*",
"@deepseek-ai/dsh-client-ui-workspace": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"clsx": "^2.0.0",
-1
View File
@@ -63,7 +63,6 @@
"@deepseek-ai/dsh-client-ui-tool": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
+1 -1
View File
@@ -24,7 +24,7 @@
"license": "MIT",
"devDependencies": {
"@deepseek-ai/dsh-client-store": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/cordis": "workspace:~"
},
"files": [
-2
View File
@@ -61,8 +61,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-subagent": "workspace:*",
"@deepseek-ai/dsh-token-meter": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
-1
View File
@@ -56,7 +56,6 @@
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-host-webserver": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"clsx": "^2.0.0",
"@deepseek-ai/dsh-settings": "workspace:*"
-1
View File
@@ -65,7 +65,6 @@
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@deepseek-ai/dsh-api-workspace-controller": "workspace:*",
@@ -56,8 +56,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-compaction": "workspace:*",
"@deepseek-ai/dsh-tools": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -59,7 +59,6 @@
"@deepseek-ai/dsh-system-prompt": "workspace:*",
"@deepseek-ai/dsh-tools": "workspace:*",
"@deepseek-ai/dsh-user-questions": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
@@ -69,7 +69,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-tool-workflow": "workspace:*",
"@deepseek-ai/dsh-workflow": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0"
}
@@ -76,7 +76,6 @@
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@deepseek-ai/dsh-util-workspace-path": "workspace:*",
"@types/react": "~18.3.1",
"clsx": "^2.0.0",
"react": "^18.2.0",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*",
-2
View File
@@ -34,8 +34,6 @@
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-primitives": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -70,8 +70,6 @@
"@deepseek-ai/dsh-experimental-agent-team": "workspace:*",
"@deepseek-ai/dsh-session": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"react-dom": "^18.2.0"
@@ -76,7 +76,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
@@ -82,7 +82,6 @@
"@deepseek-ai/dsh-client-ui-settings": "workspace:*",
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/schemastery": "workspace:~",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@testing-library/react": "^16.3.3",
@@ -67,7 +67,6 @@
"@deepseek-ai/dsh-experimental-api-speech-to-text": "workspace:*",
"@deepseek-ai/dsh-experimental-speech-to-text": "workspace:*",
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@testing-library/react": "^16.3.3",
@@ -67,7 +67,6 @@
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@testing-library/react": "^16.3.3",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/dsh-client-ui-layout": "workspace:*",
"@deepseek-ai/dsh-client-shortcuts": "workspace:*",
"@deepseek-ai/dsh-client-store": "workspace:*",
@@ -55,7 +55,6 @@
"devDependencies": {
"@deepseek-ai/dsh-client-test-runtime": "workspace:*",
"@testing-library/react": "^16.3.3",
"@types/react-dom": "~18.3.0",
"react-dom": "^18.2.0",
"@deepseek-ai/dsh-api-session-controller": "workspace:*",
"@deepseek-ai/dsh-client-store": "workspace:*",
@@ -66,7 +65,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-llm": "workspace:*",
"@tanstack/react-virtual": "^3.14.10",
"@types/react": "~18.3.1",
"react": "^18.2.0",
"@deepseek-ai/cordis": "workspace:~",
"@deepseek-ai/dsh-client-locale": "workspace:*",
@@ -51,7 +51,6 @@
"@deepseek-ai/dsh-client-modules": "workspace:*",
"@deepseek-ai/dsh-client-ui-renderer": "workspace:*",
"@deepseek-ai/dsh-client-ui-theme": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0",
"@deepseek-ai/dsh-util-values": "workspace:*"
@@ -62,7 +62,6 @@
"@deepseek-ai/dsh-client-ui-slots": "workspace:*",
"@deepseek-ai/dsh-client-ui-tool": "workspace:*",
"@deepseek-ai/dsh-util-values": "workspace:*",
"@types/react": "~18.3.1",
"@deepseek-ai/cordis": "workspace:~",
"react": "^18.2.0"
},
@@ -67,7 +67,6 @@
"@deepseek-ai/dsh-session": "workspace:*",
"@deepseek-ai/dsh-session-persistence": "workspace:*",
"@deepseek-ai/dsh-session-query": "workspace:*",
"@types/react": "~18.3.1",
"react": "^18.2.0"
},
"dsh": {
@@ -84,8 +84,6 @@
"@deepseek-ai/dsh-typert-protocol": "workspace:*",
"@deepseek-ai/dsh-web-app": "workspace:*",
"@types/js-yaml": "^4.0.9",
"@types/react": "~18.3.1",
"@types/react-dom": "~18.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
+17 -292
View File
@@ -115,12 +115,18 @@ importers:
'@types/node':
specifier: ^22.20.1
version: 22.20.1
'@types/semver':
specifier: ^7.8.0
version: 7.8.0
'@types/papaparse':
specifier: ^5.5.2
version: 5.5.2
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
'@types/semver':
specifier: ^7.8.0
version: 7.8.0
'@types/spdx-expression-parse':
specifier: ^4.0.0
version: 4.0.0
@@ -708,12 +714,6 @@ importers:
'@types/node':
specifier: ^22.20.1
version: 22.20.1
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
'@types/semver':
specifier: ^7.8.0
version: 7.8.0
@@ -904,12 +904,6 @@ importers:
'@types/node':
specifier: ^22.20.1
version: 22.20.1
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
'@types/ws':
specifier: 8.18.1
version: 8.18.1
@@ -3061,9 +3055,6 @@ importers:
'@deepseek-ai/dsh-settings':
specifier: workspace:*
version: link:../../settings/settings
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3255,9 +3246,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3303,9 +3291,6 @@ importers:
'@deepseek-ai/dsh-typert-protocol':
specifier: workspace:*
version: link:../../typert/protocol
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3342,12 +3327,6 @@ importers:
'@deepseek-ai/dsh-client-ui-trajectory':
specifier: workspace:*
version: link:../ui-trajectory
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -3375,9 +3354,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3505,12 +3481,6 @@ importers:
'@tanstack/react-virtual':
specifier: 3.14.10
version: 3.14.10([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3568,9 +3538,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -3701,12 +3668,6 @@ importers:
'@lexical/utils':
specifier: ^0.49.0
version: 0.49.0([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -3816,9 +3777,6 @@ importers:
'@deepseek-ai/dsh-workspace-changes':
specifier: workspace:*
version: link:../../deliverables/workspace-changes
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3852,9 +3810,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -3882,9 +3837,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -3906,12 +3858,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -3972,9 +3918,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4023,9 +3966,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -4068,12 +4008,6 @@ importers:
'@deepseek-ai/dsh-session':
specifier: workspace:*
version: link:../../core/session
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4110,9 +4044,6 @@ importers:
'@deepseek-ai/dsh-client-ui-theme':
specifier: workspace:*
version: link:../ui-theme
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4176,12 +4107,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4242,12 +4167,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -4320,9 +4239,6 @@ importers:
'@deepseek-ai/dsh-session':
specifier: workspace:*
version: link:../../core/session
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4380,9 +4296,6 @@ importers:
'@deepseek-ai/dsh-remote-mock':
specifier: workspace:*
version: link:../../test-support/remote-mock
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -4455,9 +4368,6 @@ importers:
'@deepseek-ai/dsh-util-crypto':
specifier: workspace:*
version: link:../../util/crypto
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4525,12 +4435,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -4561,12 +4465,6 @@ importers:
'@types/mdast':
specifier: ^4.0.4
version: 4.0.4
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
anser:
specifier: ^2.3.5
version: 2.3.5
@@ -4678,9 +4576,6 @@ importers:
'@deepseek-ai/dsh-util-workspace-path':
specifier: workspace:*
version: link:../../util/workspace-path
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4696,12 +4591,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
'@types/use-sync-external-store':
specifier: ^1.5.0
version: 1.7.0
@@ -4780,12 +4669,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -4828,9 +4711,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4862,9 +4742,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -4932,12 +4809,6 @@ importers:
'@types/big.js':
specifier: ^6.2.2
version: 6.2.2
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
big.js:
specifier: ^7.0.1
version: 7.0.1
@@ -4980,9 +4851,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5038,12 +4906,6 @@ importers:
'@deepseek-ai/dsh-settings':
specifier: workspace:*
version: link:../../settings/settings
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -5099,9 +4961,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5150,9 +5009,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5183,9 +5039,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5222,12 +5075,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5267,9 +5114,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5306,9 +5150,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5345,9 +5186,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5387,9 +5225,6 @@ importers:
'@deepseek-ai/dsh-client-ui-slots':
specifier: workspace:*
version: link:../ui-slots
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -5438,9 +5273,6 @@ importers:
'@deepseek-ai/dsh-client-ui-workspace':
specifier: workspace:*
version: link:../ui-workspace
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -5489,12 +5321,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5580,12 +5406,6 @@ importers:
'@types/papaparse':
specifier: ^5.3.16
version: 5.5.2
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -5673,12 +5493,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -5748,12 +5562,6 @@ importers:
'@types/picomatch':
specifier: ^4.0.3
version: 4.0.3
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -5826,12 +5634,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
'@xterm/addon-fit':
specifier: ^0.11.0
version: 0.11.0
@@ -5901,9 +5703,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -5919,9 +5718,9 @@ importers:
'@deepseek-ai/dsh-client-store':
specifier: workspace:*
version: link:../store
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
packages/client/ui-subagent:
devDependencies:
@@ -5979,12 +5778,6 @@ importers:
'@deepseek-ai/dsh-token-meter':
specifier: workspace:*
version: link:../../llm/token-meter
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -6034,9 +5827,6 @@ importers:
'@deepseek-ai/dsh-settings':
specifier: workspace:*
version: link:../../settings/settings
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -6133,9 +5923,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -6205,12 +5992,6 @@ importers:
'@tanstack/react-virtual':
specifier: 3.14.10
version: 3.14.10([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
diff:
specifier: ^9.0.0
version: 9.0.0
@@ -6286,9 +6067,6 @@ importers:
'@deepseek-ai/dsh-user-questions':
specifier: workspace:*
version: link:../../interaction/user-questions
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -6343,9 +6121,6 @@ importers:
'@deepseek-ai/dsh-workflow':
specifier: workspace:*
version: link:../../workflow/workflow
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -6427,9 +6202,6 @@ importers:
'@deepseek-ai/dsh-util-workspace-path':
specifier: workspace:*
version: link:../../util/workspace-path
'@types/react':
specifier: ~18.3.1
version: 18.3.31
clsx:
specifier: ^2.0.0
version: 2.1.1
@@ -6469,12 +6241,6 @@ importers:
'@tanstack/react-virtual':
specifier: 3.14.10
version: 3.14.10([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -7990,12 +7756,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -8047,9 +7807,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -8129,9 +7886,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -8195,9 +7949,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -8516,9 +8267,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/serve-static':
specifier: ^2.2.0
version: 2.2.0
@@ -8654,12 +8402,6 @@ importers:
'@testing-library/react':
specifier: ^16.3.3
version: 16.3.3(@testing-library/[email protected])(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -9458,9 +9200,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -9579,9 +9318,6 @@ importers:
'@deepseek-ai/dsh-util-values':
specifier: workspace:*
version: link:../../util/values
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -11772,9 +11508,6 @@ importers:
'@deepseek-ai/dsh-session-query':
specifier: workspace:*
version: link:../session-query
'@types/react':
specifier: ~18.3.1
version: 18.3.31
react:
specifier: ^18.2.0
version: 18.3.1
@@ -14301,12 +14034,6 @@ importers:
'@types/js-yaml':
specifier: ^4.0.9
version: 4.0.9
'@types/react':
specifier: ~18.3.1
version: 18.3.31
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/[email protected])
react:
specifier: ^18.2.0
version: 18.3.1
@@ -15665,10 +15392,6 @@ importers:
packages:
[email protected]:
resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==}
'@agentclientprotocol/[email protected]':
resolution: {integrity: sha512-/eufudw+aFY1LKLolT6yFE6UMmYRl7fMJ/DEONSIyR6wI3slHWITBsANRGqXEY8FRzqUxwh7QEaGiZHcJPVThg==}
peerDependencies:
@@ -21725,6 +21448,9 @@ packages:
[email protected]:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
[email protected]:
resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==}
[email protected]:
resolution: {integrity: sha512-qBGxg/7Q3Kl9Wfhrz2Z74UnvnHTXLNG6jmKJFeBvP2+y4lV7So+7SR62+Zd47JvdrCkX+nDcnr0ObPzek/+6RA==}
@@ -23251,9 +22977,6 @@ packages:
snapshots:
[email protected]: {}
'@agentclientprotocol/[email protected]([email protected])':
dependencies:
zod: 4.4.3
@@ -29467,6 +29190,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
+73 -3
View File
@@ -9,6 +9,7 @@ import {
import {
collectHostDependencyExportPolicyViolations,
collectPackageDependencyViolations,
collectRootTypePackageViolations,
collectRuntimeSourceExportUses,
discoverPackageDependencyScope,
expectedPackageDependencies,
@@ -17,6 +18,7 @@ import {
formatPeerRequiredRuntimeDependencies,
readPackageDependencyFacts,
readPackageDependencyState,
readWorkspacePackageManifests,
repairPackageDependencyManifest,
type PackageDependencyFacts,
type PackageDependencyManifest,
@@ -180,6 +182,27 @@ function hostRuntimeFixture(): {
return { provider, workspaceNames, consumerFacts }
}
function workspaceFixture(manifests: Readonly<Record<string, PackageDependencyManifest>>): {
rootManifest: PackageDependencyManifest
packages: WorkspacePackageManifest[]
} {
const root = mkdtempSync(join(tmpdir(), 'dsh-root-type-packages-'))
roots.push(root)
for (const [path, manifest] of Object.entries(manifests)) {
mkdirSync(dirname(join(root, path)), { recursive: true })
writeFileSync(join(root, path), JSON.stringify(manifest))
}
return {
rootManifest: JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as PackageDependencyManifest,
packages: readWorkspacePackageManifests(root).all,
}
}
function rootTypeRemoval(path: string, entry: string): string {
return `${path}: remove ${entry}; the root package.json provides it because each package-local link slows `
+ 'TypeScript JSX checking (packages/client/AGENTS.md#dependency-declaration)'
}
describe('package dependency scope', () => {
it('keeps the measured Host relay roster explicit', () => {
expect(PACKAGE_DEPENDENCY_POLICY.clientFaceExclude).toEqual([
@@ -445,14 +468,14 @@ describe('face-aware source classification', () => {
it('uses declared DefinitelyTyped providers only for erased source references', () => {
const subject = sourceFacts({
'src/index.ts': "import type { ReactNode } from 'react'",
'src/index.ts': "import type { ParseResult } from 'papaparse'",
'src/client/index.ts': "import type { Root } from 'mdast'; import type { Kind } from '@scope/types'",
}, {
dependencies: { '@types/mdast': '^4.0.0' },
devDependencies: { '@types/react': '^18.0.0', '@types/scope__types': '^1.0.0' },
devDependencies: { '@types/papaparse': '^5.0.0', '@types/scope__types': '^1.0.0' },
})
expect([...subject.allSourceUses.keys()].sort()).toEqual(['@types/mdast', '@types/react', '@types/scope__types'])
expect([...subject.allSourceUses.keys()].sort()).toEqual(['@types/mdast', '@types/papaparse', '@types/scope__types'])
expect([...subject.hostRuntimeSourceUses]).toEqual([])
repairPackageDependencyManifest(subject)
expect(subject.manifest.devDependencies?.['@types/mdast']).toBe('^4.0.0')
@@ -460,6 +483,16 @@ describe('face-aware source classification', () => {
expect(subject.manifest.devDependencies?.mdast).toBeUndefined()
})
it('never lets a root-provided React type package stand in for react', () => {
const subject = sourceFacts({
'src/index.ts': "import type { ReactNode } from 'react'",
'src/client/index.ts': "import type { Root } from 'react-dom/client'",
}, { devDependencies: { '@types/react': '~18.3.1', '@types/react-dom': '~18.3.0' } })
expect([...subject.allSourceUses.keys()].sort()).toEqual(['react', 'react-dom'])
expect(() => { repairPackageDependencyManifest(subject) }).toThrow('undeclared third-party dependency react')
})
it.each(["import 'runtime-library'", 'export const view = <div />'])('does not let type providers satisfy runtime imports or JSX: %s', (source) => {
const name = source.includes('<div') ? 'react' : 'runtime-library'
const subject = sourceFacts({
@@ -1044,3 +1077,40 @@ describe('dependency sections', () => {
expect(manifest.peerDependencies).toEqual({ [CORDIS]: 'workspace:~' })
})
})
describe('root-provided type packages', () => {
it('rejects React type packages in any workspace dependency section and requires them at the root', () => {
const { rootManifest, packages } = workspaceFixture({
'package.json': { name: 'root', devDependencies: { '@types/react': '~18.3.1' } },
'apps/app/package.json': { name: '@f/app', devDependencies: { '@types/react': '~18.3.1', react: '^18.2.0' } },
'packages/experimental/probe/package.json': {
name: '@f/probe',
dependencies: { '@types/react-dom': '~18.3.0' },
peerDependencies: { '@types/react': '*' },
},
'vendor/lib/package.json': { name: '@f/lib', optionalDependencies: { '@types/react': '~18.3.1' } },
})
expect(collectRootTypePackageViolations(rootManifest, packages)).toEqual([
rootTypeRemoval('apps/app/package.json', 'devDependencies.@types/react'),
'package.json: devDependencies must declare @types/react-dom for every workspace package',
rootTypeRemoval('packages/experimental/probe/package.json', 'dependencies.@types/react-dom'),
rootTypeRemoval('packages/experimental/probe/package.json', 'peerDependencies.@types/react'),
rootTypeRemoval('vendor/lib/package.json', 'optionalDependencies.@types/react'),
])
})
it('accepts root declarations beside package-level runtime React and other type packages', () => {
const { rootManifest, packages } = workspaceFixture({
'package.json': { name: 'root', devDependencies: { '@types/react': '~18.3.1', '@types/react-dom': '~18.3.0' } },
'packages/client/ui-probe/package.json': {
name: '@f/ui-probe',
dependencies: { react: '^18.2.0' },
devDependencies: { 'react-dom': '^18.2.0', '@types/react-is': '^18.0.0' },
},
})
expect(packages.map(pkg => pkg.manifestPath)).toEqual(['packages/client/ui-probe/package.json'])
expect(collectRootTypePackageViolations(rootManifest, packages)).toEqual([])
})
})
+47 -3
View File
@@ -1,4 +1,7 @@
/** Verify and repair npm dependency sections from published Client and Host faces. */
/**
* Verify and repair npm dependency sections from published Client and Host faces, and keep root-provided type
* packages out of workspace manifests.
*/
import { spawnSync } from 'node:child_process'
import { existsSync, globSync, readFileSync, writeFileSync } from 'node:fs'
@@ -20,6 +23,11 @@ import {
const GATE = 'verify-package-dependencies'
const CORDIS = '@deepseek-ai/cordis'
/**
* Type packages declared only in the root devDependencies. Each package-local pnpm link is one more
* location that TypeScript scans when it computes module specifiers for every JSX file.
*/
const ROOT_TYPE_PACKAGES: ReadonlySet<string> = new Set(['@types/react', '@types/react-dom'])
function workspaceRange(name: string): 'workspace:*' | 'workspace:~' {
return name === '@deepseek-ai/dsh' || name.startsWith('@deepseek-ai/dsh-') ? 'workspace:*' : 'workspace:~'
}
@@ -434,7 +442,9 @@ function readAllSourceUses(root: string, pkg: WorkspacePackageManifest): Map<str
const name = packageNameOf(specifier)
if (name === undefined) continue
const typesName = `@types/${name.replace(/^@/, '').replace('/', '__')}`
if (declaredSections(pkg.manifest, name).length === 0 && declaredSections(pkg.manifest, typesName).length > 0) {
if (!ROOT_TYPE_PACKAGES.has(typesName)
&& declaredSections(pkg.manifest, name).length === 0
&& declaredSections(pkg.manifest, typesName).length > 0) {
runtimeUses ??= collectRuntimeSourcePackageUses(sourcePath, source)
if (!runtimeUses.has(name)) {
addUse(uses, typesName, displayPath)
@@ -750,6 +760,34 @@ export function collectPackageDependencyViolations(state: PackageDependencyState
return [...new Set(violations)].sort()
}
/**
* Require each root-provided type package in the root devDependencies and in no workspace manifest.
* `--fix` does not remove these declarations.
* @param rootManifest - Repository root `package.json`.
* @param packages - Every workspace manifest from {@link readWorkspacePackageManifests}.
* @returns Violations in stable order.
*/
export function collectRootTypePackageViolations(
rootManifest: PackageDependencyManifest,
packages: readonly WorkspacePackageManifest[],
): string[] {
const violations: string[] = []
for (const name of ROOT_TYPE_PACKAGES) {
if (rootManifest.devDependencies?.[name] === undefined) {
violations.push(`package.json: devDependencies must declare ${name} for every workspace package`)
}
for (const pkg of packages) {
for (const sectionName of declaredSections(pkg.manifest, name)) {
violations.push(
`${pkg.manifestPath}: remove ${sectionName}.${name}; the root package.json provides it because each `
+ 'package-local link slows TypeScript JSX checking (packages/client/AGENTS.md#dependency-declaration)',
)
}
}
}
return violations.sort()
}
function deleteDependency(
manifest: PackageDependencyManifest,
sectionName: DependencySection,
@@ -881,7 +919,13 @@ function main(): void {
state = readPackageDependencyState(root)
}
}
const violations = collectPackageDependencyViolations(state)
const violations = [
...collectPackageDependencyViolations(state),
...collectRootTypePackageViolations(
JSON.parse(readFileSync(resolve(root, 'package.json'), 'utf8')) as PackageDependencyManifest,
readWorkspacePackageManifests(root).all,
),
].sort()
if (violations.length > 0) {
console.error(`${GATE}: ${String(violations.length)} violation(s):`)
for (const violation of violations) console.error(` ${violation}`)