diff --git a/build/dsh-desktop.patch.yml b/build/dsh-desktop.patch.yml index f31b9cd7..ddd1723b 100644 --- a/build/dsh-desktop.patch.yml +++ b/build/dsh-desktop.patch.yml @@ -21,6 +21,13 @@ - id: dsh-desktop-market-installer name: dsh-desktop-market-installer + # Kimi PPT owns one direct PPTD workflow and one standard Composer client. + # The package contains no Tencent editor runtime or SlideP route. + - id: experimental-kimi-ppt-standard-adapter + name: '@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter' + config: + root: !!js dshHomePath('kimi-ppt') + # dsh-market normally offers to restart its own Node process after mutations. # The desktop shell has the real lifecycle authority, so keep that behavior off # whenever the optional plugin is present in the composed profile. diff --git a/package-lock.json b/package-lock.json index 4df6c96a..76d35e97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,6 +101,7 @@ "@deepseek-ai/dsh-credentials-local": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-credentials-local-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-deepseek-llm-api-extensions": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-deepseek-llm-api-extensions-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-deque": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-deque-0.1.2-rc.1.tgz", + "@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter": "file:packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz", "@deepseek-ai/dsh-file-reference": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-file-reference-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-file-reference-local": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-file-reference-local-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-fs": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-fs-0.1.2-rc.1.tgz", @@ -247,7 +248,8 @@ "qrcode": "^1.5.4", "react": "18.3.1", "react-dom": "18.3.1", - "ws": "^8.21.3" + "ws": "^8.21.3", + "dsh-kimi-ppt": "file:packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz" }, "devDependencies": { "@types/node": "24.10.1", @@ -271,6 +273,24 @@ "zod": "^3.25.0 || ^4.0.0" } }, + "node_modules/@aiden0z/pptx-renderer": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@aiden0z/pptx-renderer/-/pptx-renderer-1.2.4.tgz", + "integrity": "sha512-/4X/BApiknc/JM4nAWQRp5zrnA2GKSMv5r1u3XLsMvySw9DTQjyXIKRtltRsmIYfoN32tHGFnrSlGok7nFS60w==", + "license": "Apache-2.0", + "dependencies": { + "echarts": "^6.0.0", + "jszip": "^3.10.1" + }, + "peerDependencies": { + "pdfjs-dist": ">=5 <7" + }, + "peerDependenciesMeta": { + "pdfjs-dist": { + "optional": true + } + } + }, "node_modules/@anthropic-ai/sdk": { "version": "0.91.1", "resolved": "https://registry.npmmirror.com/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", @@ -291,6 +311,53 @@ } } }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "license": "MIT" + }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", "resolved": "https://registry.npmmirror.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", @@ -1018,6 +1085,152 @@ "node": ">=6.9.0" } }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.2.tgz", + "integrity": "sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.12.tgz", + "integrity": "sha512-3vLQK+dXxhBMR2Wx99PTCifE+vHtW2ndZWyla8yK813ev6oGhyn8Lja8jCyGAWTJ+LEYZK7EVtJxrDj8ztevJw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/@deepseek-ai/cordis": { "version": "4.0.2", "resolved": "file:packages/harness-0.1.2-rc.1/npm-vendor/deepseek-ai-cordis-4.0.2.tgz", @@ -2411,6 +2624,20 @@ "@deepseek-ai/cordis": "^4.0.2" } }, + "node_modules/@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter": { + "version": "0.1.1-rc.2", + "resolved": "file:packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz", + "integrity": "sha512-60agKbCaxwSJm4Eb4R4cfS+HNBNottg8fa8JGLvpKhzebgEYmXGjTgFctLxrl8O4rPvb+q7sitbBMK69mrAp7w==", + "license": "MIT", + "dependencies": { + "@deepseek-ai/schemastery": "^3.18.1", + "dsh-kimi-ppt": "^0.1.1-rc.2" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.4" + } + }, "node_modules/@deepseek-ai/dsh-file-reference": { "version": "0.1.2-rc.1", "resolved": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-file-reference-0.1.2-rc.1.tgz", @@ -5661,6 +5888,23 @@ "node": ">=18" } }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@google/genai": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/@google/genai/-/genai-1.52.0.tgz", @@ -8746,6 +8990,15 @@ "node": ">=6.0.0" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -9411,6 +9664,19 @@ "node": ">= 8" } }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -9420,6 +9686,19 @@ "node": ">= 12" } }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", @@ -9436,6 +9715,12 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decode-named-character-reference": { "version": "1.3.0", "license": "MIT", @@ -9735,6 +10020,22 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/echarts": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.1.0.tgz", + "integrity": "sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.1.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", @@ -9976,6 +10277,18 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "3.0.0", "dev": true, @@ -10889,6 +11202,18 @@ "dev": true, "license": "ISC" }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/html-void-elements": { "version": "3.0.0", "license": "MIT", @@ -10964,6 +11289,12 @@ "node": ">=10.19.0" } }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "license": "MIT", @@ -11010,6 +11341,27 @@ "url": "https://opencollective.com/express" } }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immer": { "version": "10.2.0", "license": "MIT", @@ -11109,6 +11461,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", @@ -11207,6 +11565,64 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsdom/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/jsesc": { "version": "3.1.0", "dev": true, @@ -11308,6 +11724,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/jwa/-/jwa-2.0.1.tgz", @@ -11414,6 +11842,15 @@ } } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/locate-path": { "version": "5.0.0", "license": "MIT", @@ -11727,6 +12164,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, "node_modules/media-typer": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.1.tgz", @@ -13005,6 +13448,24 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", @@ -13301,6 +13762,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pptxgenjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz", + "integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==", + "license": "MIT", + "dependencies": { + "@types/node": "^22.8.1", + "https": "^1.0.0", + "image-size": "^1.2.1", + "jszip": "^3.10.1" + } + }, + "node_modules/pptxgenjs/node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/pptxgenjs/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/proc-log": { "version": "6.1.0", "dev": true, @@ -13422,6 +13910,15 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pvtsutils": { "version": "1.3.6", "dev": true, @@ -13525,6 +14022,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/quick-lru": { "version": "5.1.1", "dev": true, @@ -13903,6 +14409,18 @@ "node": ">=11.0.0" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "license": "MIT", @@ -14029,6 +14547,12 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14285,6 +14809,18 @@ "dev": true, "license": "MIT" }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "dev": true, @@ -14298,18 +14834,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/stringify-entities": { "version": "4.0.4", "license": "MIT", @@ -14375,6 +14899,12 @@ "node": ">=8" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, "node_modules/tar": { "version": "7.5.22", "dev": true, @@ -14476,6 +15006,24 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.11" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.2.7", "dev": true, @@ -14512,6 +15060,30 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "license": "MIT", @@ -15456,6 +16028,18 @@ } } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -15477,6 +16061,38 @@ "tslib": "^2.8.1" } }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "license": "ISC", @@ -15576,6 +16192,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "dev": true, @@ -15584,6 +16209,12 @@ "node": ">=8.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -15662,6 +16293,21 @@ "zod": "^3.25.28 || ^4" } }, + "node_modules/zrender": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.1.0.tgz", + "integrity": "sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/zustand": { "version": "4.4.7", "license": "MIT", @@ -15760,6 +16406,59 @@ "engines": { "node": ">=20.18.1" } + }, + "node_modules/dsh-kimi-ppt": { + "version": "0.1.1-rc.2", + "resolved": "file:packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz", + "integrity": "sha512-0ju1WByFBgL+PSLeZZSlrL5XJjearWaBvrHyqCkPI7jsmXQ0v6XMZ3U8Ch5RqUGScMN31nn135j9CR+EdLli7w==", + "license": "MIT", + "dependencies": { + "@aiden0z/pptx-renderer": "1.2.4", + "@deepseek-ai/schemastery": "^3.18.1", + "fflate": "^0.8.3", + "js-yaml": "^4.2.0", + "jsdom": "29.1.1", + "pptxgenjs": "^4.0.1", + "sharp": "^0.35.3", + "typescript": "^6.0.3", + "zod": "^4.4.3" + }, + "bin": { + "dsh-pptd": "lib/bin.js" + }, + "engines": { + "node": "^22.19.0 || >=24.0.0" + }, + "peerDependencies": { + "@deepseek-ai/cordis": "^4.0.1", + "@deepseek-ai/dsh-agent": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-brand": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-client-connection": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-llm": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-session": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-skill": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.4", + "@deepseek-ai/dsh-tools": "^0.1.2-alpha.4", + "react": "^18.2.0" + } + }, + "node_modules/dsh-kimi-ppt/node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } } } } diff --git a/package.json b/package.json index 2629d763..2c16a57f 100644 --- a/package.json +++ b/package.json @@ -134,6 +134,7 @@ "@deepseek-ai/dsh-credentials-local": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-credentials-local-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-deepseek-llm-api-extensions": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-deepseek-llm-api-extensions-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-deque": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-deque-0.1.2-rc.1.tgz", + "@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter": "file:packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz", "@deepseek-ai/dsh-file-reference": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-file-reference-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-file-reference-local": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-file-reference-local-0.1.2-rc.1.tgz", "@deepseek-ai/dsh-fs": "file:packages/harness-0.1.2-rc.1/npm-dsh/deepseek-ai-dsh-fs-0.1.2-rc.1.tgz", @@ -273,6 +274,7 @@ "dsh-desktop-hmr-fallback": "file:packages/dsh-desktop-hmr-fallback", "dsh-desktop-market-installer": "file:packages/dsh-desktop-market-installer", "dsh-desktop-preset-transfer": "file:packages/dsh-desktop-preset-transfer", + "dsh-kimi-ppt": "file:packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz", "dshmarket": "file:packages/dshmarket", "electron-updater": "^6.8.9", "node": "24.9.0", diff --git a/packages/kimi-ppt/README.md b/packages/kimi-ppt/README.md new file mode 100644 index 00000000..00e6d4e0 --- /dev/null +++ b/packages/kimi-ppt/README.md @@ -0,0 +1,17 @@ +# Kimi PPT 内置产物 + +本目录固定 DSH Desktop 的 Kimi-only 演示文稿插件: + +- `dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz`:PPTD 编辑、渲染、模板、Skill、审计和交付核心。 +- `deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz`:Harness 0.1.2 标准 Composer 适配器。 + +这条分支只挂载 `experimental-kimi-ppt-standard-adapter`,Host 只注册 `pptd_*` 与 Kimi 模板工具。模板目录包含 22 套:7 个分类各保留 3 套核心模板,并在商务分类增加用户提供的 58 页活力蓝逻辑图表模板。活力蓝模板已在共享版式层移除右上角 logo,58 页预览与源页语义索引完整保留。产物不包含腾讯 `editor_sdk`、SlideP 运行时和腾讯专用 `ppt_*` 工具。 + +SHA-256: + +```text +300bd0f4f423a6d046cb61b193e4b5d4e535ca3d5921d21bbc0dc4f4aa002464 dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz +97adcb338ced61cbbfaf9b453bf26a3c01265bd96b25778bd00061e092d10aa3 deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz +``` + +更新核心能力时,同步更新 core tarball、根依赖完整性、这里的哈希、插件闭包测试和集成测试;适配器接口变化时再同步更新 adapter tarball。 diff --git a/packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz b/packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz new file mode 100644 index 00000000..a3810191 Binary files /dev/null and b/packages/kimi-ppt/deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz differ diff --git a/packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz b/packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz new file mode 100644 index 00000000..5f88c537 Binary files /dev/null and b/packages/kimi-ppt/dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz differ diff --git a/patches/@deepseek-ai+dsh+0.1.2-rc.1.patch b/patches/@deepseek-ai+dsh+0.1.2-rc.1.patch index a4e8d5d0..0c965633 100644 --- a/patches/@deepseek-ai+dsh+0.1.2-rc.1.patch +++ b/patches/@deepseek-ai+dsh+0.1.2-rc.1.patch @@ -2,10 +2,11 @@ diff --git a/node_modules/@deepseek-ai/dsh/package.json b/node_modules/@deepseek index 28eaff9..2445f81 100644 --- a/node_modules/@deepseek-ai/dsh/package.json +++ b/node_modules/@deepseek-ai/dsh/package.json -@@ -28,6 +28,10 @@ +@@ -28,6 +28,11 @@ }, "license": "MIT", "dependencies": { ++ "@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter": "0.1.1-rc.2", + "dsh-desktop-client-ui": "0.1.0", + "dsh-desktop-hmr-fallback": "0.1.0", + "dsh-desktop-market-installer": "0.1.0", diff --git a/patches/@deepseek-ai+dsh-client-ui-conversation+0.1.2-rc.1.patch b/patches/@deepseek-ai+dsh-client-ui-conversation+0.1.2-rc.1.patch new file mode 100644 index 00000000..52efa8eb --- /dev/null +++ b/patches/@deepseek-ai+dsh-client-ui-conversation+0.1.2-rc.1.patch @@ -0,0 +1,224 @@ +diff --git a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js +index bf946f2..cee6145 100644 +--- a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js ++++ b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js +@@ -14183,12 +14183,13 @@ window.__ModuleLoader__.load({ + //#endregion + //#region \0dsh-css:/private/tmp/dsh-harness-v0.1.2-rc.1/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css.mjs + const css$4 = "._8JRpoa_root{background:var(--dsw-alias-bg-base);--dsh-chat-content-width:var(--dsh-chat-user-width,clamp(680px, calc(var(--dsh-conversation-column-width,0px) * .64), 920px));--dsh-composer-card-max-width:calc(var(--dsh-chat-content-width) + 32px);--dsh-composer-side-clearance:16px;--dsh-composer-dock-inset:8px;flex-direction:column;min-width:0;height:100%;display:flex;position:relative}._8JRpoa_header{border-bottom:1px solid #0000;flex:none;padding:12px 28px 0 20px;position:relative}._8JRpoa_header:after{content:\"\";z-index:0;background:var(--dsw-alias-border-l3);pointer-events:none;height:.5px;position:absolute;bottom:1px;left:0;right:0}._8JRpoa_headerHidden{display:none}._8JRpoa_titleRow{align-items:center;gap:0;min-height:32px;display:flex}._8JRpoa_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}._8JRpoa_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}._8JRpoa_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}._8JRpoa_crumbSep{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}._8JRpoa_crumb{max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:12px;padding:4px 8px;font-size:14px;line-height:20px;overflow:hidden}._8JRpoa_crumbSubagent{font-size:12px;line-height:18px}._8JRpoa_crumb:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._8JRpoa_crumbCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:500}._8JRpoa_headerActions{flex:none;align-items:center;gap:8px;display:flex}._8JRpoa_headerUtilities{flex:none;align-items:center;gap:8px;margin-left:20px;display:flex}._8JRpoa_headerUtilities:empty{display:none}._8JRpoa_tabs{z-index:1;gap:36px;margin-top:4px;padding-left:8px;display:flex;position:relative}._8JRpoa_tab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:0 0 11px;font-size:13px;font-weight:500;line-height:16px;position:relative}._8JRpoa_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}._8JRpoa_tabActive{color:var(--dsw-alias-state-business-primary)}._8JRpoa_tabActive:after{background:var(--dsw-alias-state-business-primary)}._8JRpoa_viewArea{flex-direction:column;flex:1;min-height:0;display:flex}._8JRpoa_widthHandle{z-index:8;width:min(40px, calc((100% - var(--dsh-chat-content-width)) / 2 - 24px - 24px));cursor:col-resize;position:absolute;top:0;bottom:0}._8JRpoa_widthHandle[data-side=left]{right:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}._8JRpoa_widthHandle[data-side=right]{left:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}._8JRpoa_widthHandle:after{content:\"\";background:linear-gradient(to bottom, transparent calc(var(--dsh-width-handle-pointer-y,50%) - 52px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 12px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 12px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 52px));opacity:0;pointer-events:none;border-radius:3px;width:3px;position:absolute;top:0;bottom:0}._8JRpoa_widthHandle[data-side=left]:after{right:16px}._8JRpoa_widthHandle[data-side=right]:after{left:16px}._8JRpoa_widthHandle:hover:after,._8JRpoa_widthHandle[data-dragging]:after{opacity:1}._8JRpoa_root:has([data-conversation-composer-overlay]) ._8JRpoa_widthHandle{display:none}._8JRpoa_composerStack{--dsh-composer-stack-gap:6px;gap:var(--dsh-composer-stack-gap);flex-direction:column;display:flex}._8JRpoa_composerSeat{--dsh-composer-text-max-height:336px;flex-direction:column;flex:none;display:flex}._8JRpoa_root[data-phase=active]{overflow:hidden}._8JRpoa_root[data-phase=active] ._8JRpoa_header{flex:none}._8JRpoa_body{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}._8JRpoa_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}._8JRpoa_root[data-phase=active] ._8JRpoa_viewArea{flex:1 0 auto;min-height:auto}._8JRpoa_root[data-phase=active] ._8JRpoa_composerSeat{z-index:7;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-base) 0%, transparent) 0px, var(--dsw-alias-bg-base) 36px);position:sticky;bottom:0}._8JRpoa_root[data-phase=active] ._8JRpoa_composerSeat:has([data-trigger-menu]){z-index:9}._8JRpoa_scrollBody:has([data-conversation-composer-overlay]){scrollbar-gutter:auto;position:relative;overflow:hidden auto}._8JRpoa_scrollBody:has([data-conversation-composer-overlay])>[data-slot=conversation\\.session]>._8JRpoa_viewArea{flex:1 1 0;min-height:0;overflow:hidden}._8JRpoa_scrollBody:has([data-conversation-composer-overlay])>._8JRpoa_composerSeat{right:var(--dsh-scrollbar-width);position:absolute;bottom:0;left:0}._8JRpoa_composerHero{width:min(calc(var(--dsh-composer-card-max-width) + 2 * var(--dsh-composer-side-clearance)), 100%);z-index:1;align-self:center;gap:8px;padding-bottom:32px}._8JRpoa_heroWorkspaceRow{align-items:center;gap:2px;min-width:0;margin-top:4px;padding-left:20px;display:flex}._8JRpoa_root[data-phase=hero] ._8JRpoa_scrollBody{justify-content:center;overflow-y:auto}._8JRpoa_root[data-phase=settling] ._8JRpoa_composerSeat{visibility:hidden}"; ++ const heroModeClusterCss = "._8JRpoa_heroModeCluster{margin-left:auto;width:max-content;max-width:100%;flex:none;align-items:center;gap:2px;display:flex}._8JRpoa_heroWorkspaceRow{padding-right:20px;box-sizing:border-box}"; + const tagId$4 = "@deepseek-ai/dsh-client-ui-conversation/ConversationRoot.module.css"; + if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) { + const tag = document.createElement("style"); + tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-conversation"; + tag.dataset.pluginCss = tagId$4; +- tag.textContent = css$4; ++ tag.textContent = css$4 + heroModeClusterCss; + document.head.appendChild(tag); + } + var ConversationRoot_module_css_default = { +@@ -14206,6 +14207,7 @@ window.__ModuleLoader__.load({ + "headerActions": "_8JRpoa_headerActions", + "headerHidden": "_8JRpoa_headerHidden", + "headerUtilities": "_8JRpoa_headerUtilities", ++ "heroModeCluster": "_8JRpoa_heroModeCluster", + "heroWorkspaceRow": "_8JRpoa_heroWorkspaceRow", + "root": "_8JRpoa_root", + "scrollBody": "_8JRpoa_scrollBody", +@@ -14430,12 +14432,17 @@ window.__ModuleLoader__.load({ + setPickerOpen(false); + } + }), +- renderSlot("conversation.hero.agentPreset", {}) ++ renderSlot("conversation.hero.agentPreset", {}), ++ (0, react_jsx_runtime.jsx)("div", { ++ className: ConversationRoot_module_css_default.heroModeCluster, ++ children: zone !== void 0 && renderSlot("conversation.hero.modeActions", zone) ++ }) + ] + }); + const inert = sessionId === void 0 || hero && chipTitle === void 0; + const inputBar = renderSlot("conversation.composer.bar", { + variant: hero ? "hero" : "composer", ++ extensionZone: zone, + ...inert ? { + disabled: true, + placeholder: t("placeholder.workspace"), +@@ -15268,12 +15275,13 @@ window.__ModuleLoader__.load({ + //#endregion + //#region \0dsh-css:/private/tmp/dsh-harness-v0.1.2-rc.1/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css.mjs + const css$1 = ".VphDDa_root{padding:0 var(--dsh-composer-side-clearance) 8px;flex-direction:column;align-items:center;display:flex}.VphDDa_hero{padding:0 var(--dsh-composer-side-clearance)}.VphDDa_notice{width:100%;max-width:var(--dsh-composer-card-max-width);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.VphDDa_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);box-shadow:var(--dsw-elevation-soft);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;border-radius:22px;flex-direction:column;gap:12px;padding-top:10px;display:flex;position:relative}.VphDDa_cardWorkspaceTrigger{--dsw-elevation-stroke-color:transparent;cursor:pointer}.VphDDa_cardWorkspaceTrigger:after{content:\"\";background:var(--dsw-alias-border-l4);pointer-events:none;border-radius:22px;transition:background-color .1s;position:absolute;inset:-1px;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\");mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\")}.VphDDa_cardWorkspaceTrigger :disabled{pointer-events:none}.VphDDa_cardWorkspaceTrigger:hover:after{background:var(--dsw-alias-state-business-primary)}.VphDDa_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.VphDDa_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.VphDDa_scroll{max-height:var(--dsh-composer-text-max-height);margin-right:4px;overflow-y:auto}.VphDDa_scroll::-webkit-scrollbar-track{margin-top:8px}.VphDDa_grow{position:relative}.VphDDa_pending{corner-shape:round;background:var(--dsw-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate VphDDa_input-pending}@keyframes VphDDa_input-pending{0%{opacity:.35}to{opacity:1}}.VphDDa_input{box-sizing:border-box;font-family:var(--dsw-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);outline:none;padding:4px 8px 0 16px}.VphDDa_input p{margin:0}.VphDDa_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.VphDDa_placeholder{color:var(--dsw-alias-label-caption);pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 16px}.VphDDa_inputDisabled{color:var(--dsw-alias-label-tertiary);cursor:not-allowed}.VphDDa_input[aria-haspopup=menu]{cursor:pointer}.VphDDa_hero .VphDDa_input{min-height:52px}.VphDDa_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.VphDDa_tools,.VphDDa_modes,.VphDDa_trailing{align-items:center;min-width:0;display:flex}.VphDDa_tools{gap:16px}.VphDDa_modes{gap:12px}.VphDDa_trailing{flex:none;gap:12px;margin-left:auto}.VphDDa_add{corner-shape:round;background:var(--dsw-specific-selector);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.VphDDa_add:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.VphDDa_add:disabled{opacity:.5;cursor:default}.VphDDa_select{max-width:220px;height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;border-radius:8px;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.VphDDa_select:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover)}.VphDDa_select:disabled{opacity:.5;cursor:default}.VphDDa_primary{corner-shape:round;background:var(--dsw-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.VphDDa_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.VphDDa_primary:disabled{opacity:.4;cursor:default}.VphDDa_retry{color:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:4px;margin-left:8px;padding:1px 8px;font-size:12px}"; ++ const pptAccessoryCss = ".VphDDa_promptRow{display:contents}.VphDDa_promptRow:has(.VphDDa_accessory [data-slot=conversation\\.input\\.accessory]:not(:empty)){align-items:flex-start;gap:12px;min-width:0;display:flex}.VphDDa_accessory{align-items:flex-start;flex:0 0 auto;min-width:0;padding-left:16px;display:none}.VphDDa_accessory:has([data-slot=conversation\\.input\\.accessory]:not(:empty)){display:flex}.VphDDa_promptRow:has(.VphDDa_accessory [data-slot=conversation\\.input\\.accessory]:not(:empty))>.VphDDa_scroll{flex:1 1 auto;min-width:0}.VphDDa_promptRow:has(.VphDDa_accessory [data-slot=conversation\\.input\\.accessory]:not(:empty))>.VphDDa_scroll .VphDDa_input{padding-left:0}.VphDDa_promptRow:has(.VphDDa_accessory [data-slot=conversation\\.input\\.accessory]:not(:empty))>.VphDDa_scroll .VphDDa_placeholder{left:0}"; + const tagId$1 = "@deepseek-ai/dsh-client-ui-conversation/InputBar.module.css"; + if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) { + const tag = document.createElement("style"); + tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-conversation"; + tag.dataset.pluginCss = tagId$1; +- tag.textContent = css$1; ++ tag.textContent = css$1 + pptAccessoryCss; + document.head.appendChild(tag); + } + var InputBar_module_css_default = { +@@ -15292,6 +15300,7 @@ window.__ModuleLoader__.load({ + "pending": "VphDDa_pending", + "placeholder": "VphDDa_placeholder", + "primary": "VphDDa_primary", ++ "promptRow": "VphDDa_promptRow", + "retry": "VphDDa_retry", + "root": "VphDDa_root", + "row": "VphDDa_row", +@@ -15316,7 +15325,7 @@ window.__ModuleLoader__.load({ + * The no-session state renders the SAME div inert as the Workspace-picker + * trigger instead of a parallel tree. + */ +- const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) { ++ const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory, extensionZone }) { + const input = useInput((s) => s); + const notice = useNotices((s) => s); + const commandMenuOpen = useMenuLauncher((source) => source === "command"); +@@ -15562,10 +15571,6 @@ window.__ModuleLoader__.load({ + className: InputBar_module_css_default.overlayAnchor, + children: renderSlot("conversation.input.overlay", {}) + }), +- accessory !== void 0 && (0, react_jsx_runtime.jsx)("div", { +- className: InputBar_module_css_default.accessory, +- children: accessory +- }), + renderSlot("conversation.input.attachments", { + attachments, + canAcceptDrop, +@@ -15578,13 +15583,19 @@ window.__ModuleLoader__.load({ + size: imageSizeText(imageLimits.maxImageBytes) + } + }), +- (0, react_jsx_runtime.jsx)("div", { +- ref: scrollRef, +- className: InputBar_module_css_default.scroll, +- "data-input-scroll": true, +- children: (0, react_jsx_runtime.jsxs)("div", { +- className: InputBar_module_css_default.grow, +- children: [ ++ (0, react_jsx_runtime.jsxs)("div", { ++ className: InputBar_module_css_default.promptRow, ++ "data-input-prompt-row": true, ++ children: [(accessory !== void 0 || extensionZone !== void 0) && (0, react_jsx_runtime.jsx)("div", { ++ className: InputBar_module_css_default.accessory, ++ children: accessory ?? renderSlot("conversation.input.accessory", extensionZone) ++ }), (0, react_jsx_runtime.jsx)("div", { ++ ref: scrollRef, ++ className: InputBar_module_css_default.scroll, ++ "data-input-scroll": true, ++ children: (0, react_jsx_runtime.jsxs)("div", { ++ className: InputBar_module_css_default.grow, ++ children: [ + (0, react_jsx_runtime.jsx)(ComposerContentEditable, { + editor: workspaceTrigger ? null : editor, + editable, +@@ -15606,8 +15617,9 @@ window.__ModuleLoader__.load({ + children: placeholderText + }), + (0, react_jsx_runtime.jsx)(DecoratorPortals, { editor: workspaceTrigger ? null : editor }) +- ] +- }) ++ ] ++ }) ++ })] + }), + (0, react_jsx_runtime.jsxs)("div", { + className: InputBar_module_css_default.row, +@@ -15713,7 +15725,7 @@ window.__ModuleLoader__.load({ + }) + ] + }), +- variant === "composer" && input !== void 0 && sessionId !== void 0 ? renderSlot("conversation.composer.dock", {}) : null ++ extensionZone !== void 0 ? renderSlot("conversation.composer.dock", extensionZone) : null + ] + }); + }); +@@ -16089,6 +16101,10 @@ window.__ModuleLoader__.load({ + "conversation.hero.agentPreset": { + kind: "single", + scope: "root" ++ }, ++ "conversation.hero.modeActions": { ++ kind: "list", ++ scope: "session" + } + }, + inject: (sessionId) => ({ +@@ -16169,6 +16185,10 @@ window.__ModuleLoader__.load({ + kind: "list", + scope: "session" + }, ++ "conversation.input.accessory": { ++ kind: "list", ++ scope: "session" ++ }, + "conversation.input.left": { + kind: "list", + scope: "session" +diff --git a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/types/client/contract/slots.d.ts b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/types/client/contract/slots.d.ts +index 2d41cda..70cdce4 100644 +--- a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/types/client/contract/slots.d.ts ++++ b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/types/client/contract/slots.d.ts +@@ -137,6 +137,12 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { + scope: 'root'; + owner: HeroAgentPresetOwnerProps; + }; ++ /** Product-mode controls beside the blank-session agent preset. */ ++ 'conversation.hero.modeActions': { ++ kind: 'list'; ++ scope: 'session'; ++ owner: InputZone; ++ }; + /** Full-width entries above the composer card. */ + 'conversation.input.dock': { + kind: 'list'; +@@ -148,10 +154,17 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { + kind: 'list'; + scope: 'session'; + }; ++ /** Compact template and reference material rendered before the editable prompt. */ ++ 'conversation.input.accessory': { ++ kind: 'list'; ++ scope: 'session'; ++ owner: InputZone; ++ }; + /** Ambient entries below the composer card. */ + 'conversation.composer.dock': { + kind: 'list'; + scope: 'session'; ++ owner: InputZone; + }; + /** Compact controls at the left of the composer tool row. */ + 'conversation.input.left': { +@@ -290,8 +303,10 @@ export interface ComposerBarOwnerProps { + /** Open the Workspace picker from the inert composer surface. */ + onRequestWorkspace?: () => void; + placeholder?: string; +- /** Optional content rendered above the composer surface. */ ++ /** Optional compact content rendered before the editable prompt. */ + accessory?: ReactNode; ++ /** Point-in-time Session and input state supplied to Composer extension slots. */ ++ extensionZone?: InputZone; + } + /** Package-private operations injected into the resident composer bar. */ + export interface ComposerBarInjected { +@@ -315,7 +330,7 @@ export interface InputControlOwnerProps { + locked: boolean; + } + /** Full props of the resident composer bar. */ +-export type ComposerBarProps = PropsRuntime<'conversation.composer.bar'> & PropsRenderSlots<'conversation.input.attachments' | 'conversation.input.overlay' | 'conversation.input.left' | 'conversation.input.plan' | 'conversation.input.right' | 'conversation.input.model' | 'conversation.composer.dock'> & InjectFace & PropsLocale<'conversation'>; ++export type ComposerBarProps = PropsRuntime<'conversation.composer.bar'> & PropsRenderSlots<'conversation.input.attachments' | 'conversation.input.overlay' | 'conversation.input.accessory' | 'conversation.input.left' | 'conversation.input.plan' | 'conversation.input.right' | 'conversation.input.model' | 'conversation.composer.dock'> & InjectFace & PropsLocale<'conversation'>; + /** Owner values used to elect a composer takeover. */ + export interface ComposerChainProps { + /** Current Session identity used by temporary business-owned entries. */ +@@ -333,7 +348,7 @@ export interface HeroBrandMarkOwnerProps { + className?: string | undefined; + } + /** Full props of the resident optional-Session Conversation shell. */ +-export type ConversationSlotProps = PropsRuntime<'conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.dock' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset'> & InjectFace & PropsLocale<'conversation'>; ++export type ConversationSlotProps = PropsRuntime<'conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.dock' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset' | 'conversation.hero.modeActions'> & InjectFace & PropsLocale<'conversation'>; + /** Shared target-neutral Conversation store handle. */ + export type ConversationStore = ReturnType; + /** Full props of the strict Session body. */ diff --git a/scripts/verify-target.mjs b/scripts/verify-target.mjs index 0c1da050..be43921a 100644 --- a/scripts/verify-target.mjs +++ b/scripts/verify-target.mjs @@ -1,3 +1,7 @@ +import { constants, accessSync } from 'node:fs' +import { resolve } from 'node:path' +import { spawnSync } from 'node:child_process' + const [expectedPlatform, expectedArch] = process.argv.slice(2) if (!expectedPlatform || !expectedArch) { @@ -13,4 +17,44 @@ if (process.platform !== expectedPlatform || process.arch !== expectedArch) { process.exit(1) } -console.log(`Packaging target verified: ${process.platform}/${process.arch}`) +const executable = expectedPlatform === 'win32' ? 'node.exe' : 'node' +const bundledNode = resolve('node_modules', 'node', 'bin', executable) + +try { + accessSync(bundledNode, constants.X_OK) +} catch { + console.error(`Bundled Node.js runtime was not found or is not executable: ${bundledNode}`) + console.error('Reinstall dependencies with lifecycle scripts enabled, or run `npm rebuild node`.') + process.exit(1) +} + +const probe = spawnSync( + bundledNode, + ['-p', 'JSON.stringify({ platform: process.platform, arch: process.arch, version: process.versions.node })'], + { encoding: 'utf8' } +) + +if (probe.status !== 0) { + console.error(`Bundled Node.js runtime could not start: ${bundledNode}`) + if (probe.stderr) console.error(probe.stderr.trim()) + process.exit(1) +} + +let runtime +try { + runtime = JSON.parse(probe.stdout.trim()) +} catch { + console.error(`Bundled Node.js runtime returned an invalid probe result: ${probe.stdout.trim()}`) + process.exit(1) +} + +if (runtime.platform !== expectedPlatform || runtime.arch !== expectedArch) { + console.error( + `Bundled Node.js runtime must target ${expectedPlatform}/${expectedArch}; received ${runtime.platform}/${runtime.arch}.` + ) + process.exit(1) +} + +console.log( + `Packaging target verified: ${process.platform}/${process.arch}; bundled Node.js ${runtime.version}` +) diff --git a/test/desktop-plugin-closure.test.ts b/test/desktop-plugin-closure.test.ts index cfdcfd87..c0f6613c 100644 --- a/test/desktop-plugin-closure.test.ts +++ b/test/desktop-plugin-closure.test.ts @@ -4,6 +4,20 @@ import { describe, expect, it } from 'vitest' import { parse as parseYaml } from 'yaml' import { patchPath, projectRoot } from './patch-path' +const profileConfigTags = [ + { + tag: 'tag:yaml.org,2002:js', + resolve: (value: string) => value + } +] + +async function readProfilePatch(): Promise<{ name?: string; insert?: { name?: string }[] }[]> { + return parseYaml( + await readFile(path.join(projectRoot, 'build', 'dsh-desktop.patch.yml'), 'utf8'), + { customTags: profileConfigTags } + ) as { name?: string; insert?: { name?: string }[] }[] +} + /** * Every desktop plugin the composed profile mounts has to be reachable from * the profile directory, and the profile does not resolve through the app's @@ -18,15 +32,13 @@ import { patchPath, projectRoot } from './patch-path' * whole plugin tree rather than just that row. */ describe('desktop plugin closure', () => { - it('injects every profile-mounted desktop plugin into the dsh dependency closure', async () => { - const profilePatch = parseYaml( - await readFile(path.join(projectRoot, 'build', 'dsh-desktop.patch.yml'), 'utf8') - ) as { name?: string; insert?: { name?: string }[] }[] + it('injects every profile-mounted package into the dsh dependency closure', async () => { + const profilePatch = await readProfilePatch() const mounted = profilePatch - .flatMap((row) => [...(row.insert ?? []), row]) + .flatMap((row) => row.insert ?? []) .map((entry) => entry.name) - .filter((name): name is string => typeof name === 'string' && name.startsWith('dsh-desktop-')) + .filter((name): name is string => typeof name === 'string') expect(mounted.length).toBeGreaterThan(0) @@ -36,18 +48,16 @@ describe('desktop plugin closure', () => { } }) - it('declares every profile-mounted desktop plugin as a production dependency', async () => { - const profilePatch = parseYaml( - await readFile(path.join(projectRoot, 'build', 'dsh-desktop.patch.yml'), 'utf8') - ) as { name?: string; insert?: { name?: string }[] }[] + it('declares every profile-mounted package as a local production dependency', async () => { + const profilePatch = await readProfilePatch() const manifest = JSON.parse( await readFile(path.join(projectRoot, 'package.json'), 'utf8') ) as { dependencies: Record } - for (const row of profilePatch.flatMap((entry) => [...(entry.insert ?? []), entry])) { - if (typeof row.name !== 'string' || !row.name.startsWith('dsh-desktop-')) continue - expect(manifest.dependencies[row.name]).toBe(`file:packages/${row.name}`) + for (const row of profilePatch.flatMap((entry) => entry.insert ?? [])) { + if (typeof row.name !== 'string') continue + expect(manifest.dependencies[row.name]).toMatch(/^file:packages\//u) } }) }) diff --git a/test/kimi-ppt-integration.test.ts b/test/kimi-ppt-integration.test.ts new file mode 100644 index 00000000..a4bff9d3 --- /dev/null +++ b/test/kimi-ppt-integration.test.ts @@ -0,0 +1,191 @@ +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import path from 'node:path' +import { gunzipSync } from 'node:zlib' +import { describe, expect, it } from 'vitest' +import { projectRoot } from './patch-path' + +const artifacts = { + core: { + file: 'dsh-kimi-ppt-0.1.1-rc.2-desktop-kimi-20260904.tgz', + sha256: '300bd0f4f423a6d046cb61b193e4b5d4e535ca3d5921d21bbc0dc4f4aa002464' + }, + adapter: { + file: 'deepseek-ai-dsh-experimental-kimi-ppt-standard-adapter-0.1.1-rc.2-desktop-kimi-20260904.tgz', + sha256: '97adcb338ced61cbbfaf9b453bf26a3c01265bd96b25778bd00061e092d10aa3' + } +} as const + +async function artifact(name: keyof typeof artifacts): Promise { + return readFile(path.join(projectRoot, 'packages', 'kimi-ppt', artifacts[name].file)) +} + +function tarEntries(archive: Buffer): Map { + const tar = gunzipSync(archive) + const entries = new Map() + let offset = 0 + while (offset + 512 <= tar.length) { + const header = tar.subarray(offset, offset + 512) + const name = header.subarray(0, 100).toString('utf8').replace(/\0.*$/u, '') + if (name.length === 0) break + const prefix = header.subarray(345, 500).toString('utf8').replace(/\0.*$/u, '') + const sizeText = header.subarray(124, 136).toString('ascii').replace(/\0.*$/u, '').trim() + const size = Number.parseInt(sizeText || '0', 8) + const contentOffset = offset + 512 + const fullName = prefix.length === 0 ? name : `${prefix}/${name}` + entries.set(fullName, tar.subarray(contentOffset, contentOffset + size)) + offset = contentOffset + Math.ceil(size / 512) * 512 + } + return entries +} + +describe('Kimi PPT built-in plugin', () => { + it('pins the reviewed plugin artifacts byte-for-byte', async () => { + const lock = JSON.parse(await readFile(path.join(projectRoot, 'package-lock.json'), 'utf8')) as { + packages: Record + } + const packagePaths = { + core: 'node_modules/dsh-kimi-ppt', + adapter: 'node_modules/@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter' + } as const + + for (const name of Object.keys(artifacts) as (keyof typeof artifacts)[]) { + const archive = await artifact(name) + expect(createHash('sha256').update(archive).digest('hex')).toBe(artifacts[name].sha256) + expect(lock.packages[packagePaths[name]]?.integrity).toBe( + `sha512-${createHash('sha512').update(archive).digest('base64')}` + ) + } + }) + + it('ships one Kimi composer surface and excludes the Tencent route', async () => { + const core = gunzipSync(await artifact('core')).toString('utf8') + const adapter = gunzipSync(await artifact('adapter')).toString('utf8') + const excluded = /\b(?:tencent|slidep|editor_sdk)\b|workbuddy[- ]runtime|\bppt_(?:create|render|write_page)\b/iu + + expect(core).toContain('experimental-kimi-ppt') + expect(core).toContain('pptd_render') + expect(core).toContain('ppt_get_template_reference') + expect(core).not.toMatch(excluded) + expect(adapter).toContain('conversation.hero.modeActions') + expect(adapter).toContain('kimi-ppt') + expect(adapter).not.toMatch(excluded) + }) + + it('ships every JavaScript chunk imported by the Host entry', async () => { + const archive = gunzipSync(await artifact('core')).toString('utf8') + const chunk = /from "\.\/(pptd-[A-Za-z0-9_-]+\.js)"/u.exec(archive)?.[1] + + expect(chunk).toBeDefined() + expect(archive).toContain(`package/lib/${chunk}`) + }) + + it('exposes geometry-derived text capacity to the Kimi authoring workflow', async () => { + const entries = tarEntries(await artifact('core')) + const protocol = entries.get('package/lib/types/protocol.d.ts')?.toString('utf8') ?? '' + const host = entries.get('package/lib/index.js')?.toString('utf8') ?? '' + const skill = entries.get('package/skills/kimi-ppt/SKILL.md')?.toString('utf8') ?? '' + + expect(protocol).toContain('readonly textCapacity?: number') + expect(host).toContain('textCapacity: zone.textCapacity ?? geometricTextCapacity(zone, fontSize)') + expect(skill).toContain('每个文本区的 `textCapacity` 是该区域的最大建议字符数') + }) + + it('ships three core templates in each category plus the 58-page Vitality Blue pack', async () => { + const entries = tarEntries(await artifact('core')) + const designs = [...entries.keys()] + .filter(name => /^package\/skills\/kimi-ppt\/references\/[^/]+\/[^/]+\/design\.md$/u.test(name)) + const categories = designs.reduce>((counts, name) => { + const category = name.split('/')[4]! + counts[category] = (counts[category] ?? 0) + 1 + return counts + }, {}) + + expect(designs).toHaveLength(22) + expect(categories).toEqual({ + academic: 3, + business: 4, + consulting: 3, + finance: 3, + promotion: 3, + strategy: 3, + work: 3 + }) + + const vitalityRoot = 'package/skills/kimi-ppt/references/business/curated-vitality-blue' + const vitalityPages = [...entries.keys()].filter(name => + new RegExp(`^${vitalityRoot}/pages/\\d{2}\\.jpg$`, 'u').test(name) + ) + const design = entries.get(`${vitalityRoot}/design.md`)?.toString('utf8') ?? '' + expect(vitalityPages).toHaveLength(58) + expect(design).toContain('shared slide layout 7') + expect(design).toContain('29729fab2132fc120eba39371e4093a51beefa099ac978965d92dc9965b3c68e') + expect(design).toContain('logo-free') + }) + + it('places the PPT action beside the agent preset and the catalog below the input', async () => { + const client = await readFile(path.join( + projectRoot, + 'node_modules', + '@deepseek-ai', + 'dsh-client-ui-conversation', + 'lib', + 'client.js' + ), 'utf8') + const cluster = client.indexOf('className: ConversationRoot_module_css_default.heroModeCluster') + const agentPreset = client.indexOf('renderSlot("conversation.hero.agentPreset", {})', cluster) + const modeActions = client.indexOf( + 'zone !== void 0 && renderSlot("conversation.hero.modeActions", zone)', + agentPreset + ) + const owner = client.indexOf('extensionZone: zone') + const input = client.indexOf('className: clsx(InputBar_module_css_default.card', owner) + const catalog = client.indexOf( + 'extensionZone !== void 0 ? renderSlot("conversation.composer.dock", extensionZone) : null', + input + ) + + expect(cluster).toBeGreaterThan(-1) + expect(modeActions).toBeGreaterThan(agentPreset) + expect(owner).toBeGreaterThan(-1) + expect(input).toBeGreaterThan(owner) + expect(catalog).toBeGreaterThan(input) + }) + + it('renders the selected template before editable prompt text', async () => { + const client = await readFile(path.join( + projectRoot, + 'node_modules', + '@deepseek-ai', + 'dsh-client-ui-conversation', + 'lib', + 'client.js' + ), 'utf8') + const promptRow = client.indexOf('className: InputBar_module_css_default.promptRow') + const accessory = client.indexOf('className: InputBar_module_css_default.accessory', promptRow) + const scroll = client.indexOf('ref: scrollRef', promptRow) + + expect(promptRow).toBeGreaterThan(-1) + expect(accessory).toBeGreaterThan(promptRow) + expect(scroll).toBeGreaterThan(accessory) + expect(client).toContain('children: accessory ?? renderSlot("conversation.input.accessory", extensionZone)') + }) + + it('declares both local artifacts and mounts only the Kimi adapter', async () => { + const manifest = JSON.parse(await readFile(path.join(projectRoot, 'package.json'), 'utf8')) as { + dependencies: Record + } + const profilePatch = await readFile(path.join(projectRoot, 'build', 'dsh-desktop.patch.yml'), 'utf8') + + expect(manifest.dependencies['dsh-kimi-ppt']).toBe( + `file:packages/kimi-ppt/${artifacts.core.file}` + ) + expect(manifest.dependencies['@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter']).toBe( + `file:packages/kimi-ppt/${artifacts.adapter.file}` + ) + expect(profilePatch).toContain("name: '@deepseek-ai/dsh-experimental-kimi-ppt-standard-adapter'") + expect(profilePatch).not.toContain('office-ppt-standard-adapter') + expect(profilePatch).not.toContain('name: dsh-kimi-ppt') + expect(profilePatch).not.toContain('workbuddy') + }) +}) diff --git a/test/release.test.ts b/test/release.test.ts index 15ba3e5b..35482081 100644 --- a/test/release.test.ts +++ b/test/release.test.ts @@ -318,6 +318,10 @@ describe('GitHub release contract', () => { 'utf8' ) const main = await readFile(path.join(projectRoot, 'src', 'main', 'index.ts'), 'utf8') + const targetVerifier = await readFile( + path.join(projectRoot, 'scripts', 'verify-target.mjs'), + 'utf8' + ) expect(packageJson.scripts['package:dev:dir']).toContain('npm run build') expect(packageJson.scripts['package:dev:dir']).toContain('electron-builder.dev.cjs') @@ -341,6 +345,9 @@ describe('GitHub release contract', () => { expect(main).toContain("app.setPath('userData', join(app.getPath('appData'), 'dsh-desktop-dev'))") expect(main).toContain("app.setPath('userData', join(app.getPath('appData'), 'dsh-desktop'))") expect(main).toContain('if (!developmentBuild)') + expect(targetVerifier).toContain("resolve('node_modules', 'node', 'bin', executable)") + expect(targetVerifier).toContain('Bundled Node.js runtime was not found or is not executable') + expect(targetVerifier).toContain('spawnSync') }) it('builds and publishes every supported platform', async () => {