{"_id":"dsh-remote-bridge","_rev":"6235878-6ac8e5640a9b00809f9dc8ec","dist-tags":{"latest":"2.2.4"},"name":"dsh-remote-bridge","time":{"created":"2026-10-09T13:00:20.097Z","modified":"2026-10-11T14:16:28.948Z","0.0.0-stage":"2026-10-09T12:54:28.428Z","2.2.0":"2026-10-09T12:59:31.444Z","2.2.1":"2026-10-09T13:55:00.920Z","2.2.2":"2026-10-11T05:40:40.132Z","2.2.3":"2026-10-11T13:16:11.006Z","2.2.4":"2026-10-11T14:16:17.622Z"},"versions":{"0.0.0-stage":{"name":"dsh-remote-bridge","version":"0.0.0-stage","_id":"dsh-remote-bridge@0.0.0-stage","stub":true,"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"dist":{"shasum":"d6eb88533b63d96b1daf48239910302b6b2946de","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-TzHxGPYRZNYqLjx0JoLN+1fDY3F19FdS6XtqkyVDSOQs1fytsmcpSM3+bFlk9DMg6CLoHp6MMa9uLe1DiXBwiQ==","signatures":[{"sig":"MEUCIQCwAdMpPERhniEFoBKLRcHFpMpM0xB9zMzi08VJrSBMHwIgf4Z4+P/xlpoM6wFX5WARnFl19Bf+0M2jTCh47BxnN3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339,"size":364},"_npmUser":{"name":"westanke","email":"westanke@139.com"},"description":"Temporary package placeholder for staged publishing","directories":{},"_cnpmcore_publish_time":"2026-10-09T12:54:28.428Z","publish_time":1791550468428,"_hasShrinkwrap":false,"_source_registry_name":"default"},"2.2.0":{"_id":"dsh-remote-bridge@2.2.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-conversation"],"platform":"web"}},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"dist":{"shasum":"c7b3e16514dfb088da66d92bbe5ba2a6207ae550","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-2.2.0.tgz","fileCount":22,"integrity":"sha512-6HE1IPRdFFXEDFrEoKa3ymOMZj+5tcjE9u4X8uyV0jOuA8BHcZNMqt7RDjoa9zjjUlEzkwzq0uv3YMI642TqPw==","signatures":[{"sig":"MEYCIQCm4m1wX2mJAg7u6ECyDlPRIHeb1SiWy14W8K/Jo+MA6AIhALlJeTIuicCILu9PeLgQUY5mbbxsiq8Kd0FlX1y0Cxh8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDvp/L96ha7vSBmj+3V7sicGKUiSY7tv4KDdNQqVNLE8wIhAMwuv802qRkTPfxksSmpVZfMlBQ9m+lLP2n9oT5zV6Tv"}],"unpackedSize":1060388,"size":260347},"main":"lib/index.js","name":"dsh-remote-bridge","type":"module","types":"lib/index.d.ts","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./client":"./lib/client.cjs","./openapi":"./docs/api/openapi.yaml","./asyncapi":"./docs/api/asyncapi.yaml","./package.json":"./package.json","./cordis.patch.yml":"./cordis.patch.yml"},"gitHead":"8bd81e9d84139be75208420ad1d4a03698982dca","license":"AGPL-3.0-only","scripts":{"test":"vitest run","build":"pnpm clean && tsdown","check":"pnpm typecheck && pnpm test && pnpm docs:check && pnpm build","clean":"node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"","qr:app":"node scripts/generate-app-qr.mjs","prepack":"pnpm check","test:e2e":"playwright test","typecheck":"tsc --noEmit","docs:check":"tsx scripts/check-project-docs.ts","test:watch":"vitest"},"version":"2.2.0","_npmUser":{"name":"westanke","email":"westanke@139.com"},"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"},"_npmVersion":"10.9.9","description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","directories":{},"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"_nodeVersion":"24.19.0","contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"dependencies":{"ws":"^8.18.0","lucide-react":"^0.468.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.19.0","devDependencies":{"tsx":"^4.22.0","jsqr":"^1.4.0","yaml":"2.8.1","react":"^18.3.1","qrcode":"^1.5.4","tsdown":"^0.22.0","vitest":"^4.1.0","@types/ws":"^8.5.13","react-dom":"^18.3.1","typescript":"^6.0.0","@types/node":"^22.19.0","@types/react":"^18.3.18","@types/qrcode":"^1.5.6","@playwright/test":"^1.55.0","@types/react-dom":"^18.3.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-remote-bridge_2.2.0_1791550771334_0.033680949578740904"},"_cnpmcore_publish_time":"2026-10-09T12:59:31.444Z","publish_time":1791550771444,"_source_registry_name":"default"},"2.2.1":{"_id":"dsh-remote-bridge@2.2.1","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-conversation"],"platform":"web"}},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"dist":{"shasum":"709e1cac15ae8461806922f175862c9a380f075e","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-2.2.1.tgz","fileCount":22,"integrity":"sha512-iiM1ategsYpuyYI9Iu5oINWRAZOyY/GS0jFT2FYg6ST2IqDndMOlkuT6C9oGUxHem4Rk3QbvOEIjHPSSWB1W1Q==","signatures":[{"sig":"MEUCIQDN+tGHmDfpP2Z8IA8J+F+nJBECs4UCgZ4H92sVOWf9ugIgP1d62MGvGBM/0fWviOxwQqT/pCCd2ME2jq10LMBnZ7Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIB6d3iovq1VaAUYmWciRJlhufiJyKYU4b9P8qtqjd36vAiA99cRm2vUWZBljx68NIXYUH81yX2Vt4iKCeplSAfHf9w=="}],"unpackedSize":1061786,"size":260778},"main":"lib/index.js","name":"dsh-remote-bridge","type":"module","types":"lib/index.d.ts","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./client":"./lib/client.cjs","./openapi":"./docs/api/openapi.yaml","./asyncapi":"./docs/api/asyncapi.yaml","./package.json":"./package.json","./cordis.patch.yml":"./cordis.patch.yml"},"gitHead":"4a0e832bce43258cae8741104a03b8945f576ed8","license":"AGPL-3.0-only","scripts":{"test":"vitest run","build":"pnpm clean && tsdown","check":"pnpm typecheck && pnpm test && pnpm docs:check && pnpm build","clean":"node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"","qr:app":"node scripts/generate-app-qr.mjs","prepack":"pnpm check","test:e2e":"playwright test","typecheck":"tsc --noEmit","docs:check":"tsx scripts/check-project-docs.ts","test:watch":"vitest"},"version":"2.2.1","_npmUser":{"name":"westanke","email":"westanke@139.com"},"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"},"_npmVersion":"10.9.9","description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","directories":{},"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"_nodeVersion":"24.19.0","contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"dependencies":{"ws":"^8.18.0","lucide-react":"^0.468.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.19.0","devDependencies":{"tsx":"^4.22.0","jsqr":"^1.4.0","yaml":"2.8.1","react":"^18.3.1","qrcode":"^1.5.4","tsdown":"^0.22.0","vitest":"^4.1.0","@types/ws":"^8.5.13","react-dom":"^18.3.1","typescript":"^6.0.0","@types/node":"^22.19.0","@types/react":"^18.3.18","@types/qrcode":"^1.5.6","@playwright/test":"^1.55.0","@types/react-dom":"^18.3.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-remote-bridge_2.2.1_1791554100820_0.9925339631529546"},"_cnpmcore_publish_time":"2026-10-09T13:55:00.920Z","publish_time":1791554100920,"_source_registry_name":"default"},"2.2.2":{"_id":"dsh-remote-bridge@2.2.2","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-conversation"],"platform":"web"}},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"dist":{"shasum":"29cdcebf382f53024ea10950f8ab14d7ac01e112","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-2.2.2.tgz","fileCount":22,"integrity":"sha512-dcSBezpQDBRnp7EoDgVWcypGzCbBvLA/vdKCLMsRU2aTD5ab5vP519qeeSMRFQZ8qJoTO6wxcL13M+imjoPZjg==","signatures":[{"sig":"MEQCIDiywre7md84+uXCx5XOzKORntNVmRvJo77REnffmfKSAiB+wprhfzQlAYMZsAmy0Z0pa7woMihMVQTUvcXBge1JcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHVbW/3y9YxK/YufGQ6j/sgu6kWvBbzVUan+TKLWHk9EAiEAjoT6Izb7OIew7a2zdbOyU35W9HrBzrPa+CCgyI7pm8c="}],"unpackedSize":1087879,"size":269779},"main":"lib/index.js","name":"dsh-remote-bridge","type":"module","types":"lib/index.d.ts","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./client":"./lib/client.cjs","./openapi":"./docs/api/openapi.yaml","./asyncapi":"./docs/api/asyncapi.yaml","./package.json":"./package.json","./cordis.patch.yml":"./cordis.patch.yml"},"gitHead":"32f427e21f2c0b3c723cf8e71b2647defa8234aa","license":"AGPL-3.0-only","scripts":{"test":"vitest run","build":"pnpm clean && tsdown","check":"pnpm typecheck && pnpm test && pnpm docs:check && pnpm build","clean":"node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"","qr:app":"node scripts/generate-app-qr.mjs","prepack":"pnpm check","test:e2e":"playwright test","typecheck":"tsc --noEmit","docs:check":"tsx scripts/check-project-docs.ts","test:watch":"vitest"},"version":"2.2.2","_npmUser":{"name":"westanke","email":"westanke@139.com"},"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"},"_npmVersion":"10.9.9","description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","directories":{},"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"_nodeVersion":"24.19.0","contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"dependencies":{"ws":"^8.18.0","lucide-react":"^0.468.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.19.0","devDependencies":{"tsx":"^4.22.0","jsqr":"^1.4.0","yaml":"2.8.1","react":"^18.3.1","qrcode":"^1.5.4","tsdown":"^0.22.0","vitest":"^4.1.0","@types/ws":"^8.5.13","react-dom":"^18.3.1","typescript":"^6.0.0","@types/node":"^22.19.0","@types/react":"^18.3.18","@types/qrcode":"^1.5.6","@playwright/test":"^1.55.0","@types/react-dom":"^18.3.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-remote-bridge_2.2.2_1791697240023_0.7315814824529709"},"_cnpmcore_publish_time":"2026-10-11T05:40:40.132Z","publish_time":1791697240132,"_source_registry_name":"default"},"2.2.3":{"_id":"dsh-remote-bridge@2.2.3","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-conversation"],"platform":"web"}},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"dist":{"shasum":"07a338b5bceb2b664c6fc8321999685d733dfee5","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-2.2.3.tgz","fileCount":22,"integrity":"sha512-9dtyXGJavyMua5I0SydQMJF34hBKUW/oBp9NWJtLfYL//C4K1wT8X9rb2p3COl/Jt/gy+hB5VjAV6+EvXvc7tg==","signatures":[{"sig":"MEUCIGDkTWPVFIII/XcnlujD4Xy/GLMdtrRbn9oIMKeTULmyAiEA36ckqKAhKb5sbVgbTtTdhoQECvUqqwSuPEfyxK1WaaQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBXpsOr9CnMOjcJ1nmdcLdHRgFk1NJ4Yi3HZ6uJ/bOEoAiAp8S/VzOWQ5Ctk733rRtr26Iz+dN1gb27U3CVRWzBYjQ=="}],"unpackedSize":1107538,"size":276913},"main":"lib/index.js","name":"dsh-remote-bridge","type":"module","types":"lib/index.d.ts","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./client":"./lib/client.cjs","./openapi":"./docs/api/openapi.yaml","./asyncapi":"./docs/api/asyncapi.yaml","./package.json":"./package.json","./cordis.patch.yml":"./cordis.patch.yml"},"gitHead":"97237caff62fd909a074204508aff70717457366","license":"AGPL-3.0-only","scripts":{"test":"vitest run","build":"pnpm clean && tsdown","check":"pnpm typecheck && pnpm test && pnpm docs:check && pnpm build","clean":"node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"","qr:app":"node scripts/generate-app-qr.mjs","prepack":"pnpm check","test:e2e":"playwright test","typecheck":"tsc --noEmit","docs:check":"tsx scripts/check-project-docs.ts","test:watch":"vitest"},"version":"2.2.3","_npmUser":{"name":"westanke","email":"westanke@139.com"},"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"},"_npmVersion":"10.9.9","description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","directories":{},"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"_nodeVersion":"24.19.0","contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"dependencies":{"ws":"^8.18.0","lucide-react":"^0.468.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.19.0","devDependencies":{"tsx":"^4.22.0","jsqr":"^1.4.0","yaml":"2.8.1","react":"^18.3.1","qrcode":"^1.5.4","tsdown":"^0.22.0","vitest":"^4.1.0","@types/ws":"^8.5.13","react-dom":"^18.3.1","typescript":"^6.0.0","@types/node":"^22.19.0","@types/react":"^18.3.18","@types/qrcode":"^1.5.6","@playwright/test":"^1.55.0","@types/react-dom":"^18.3.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-remote-bridge_2.2.3_1791724570867_0.5185326362005971"},"_cnpmcore_publish_time":"2026-10-11T13:16:11.006Z","publish_time":1791724571006,"_source_registry_name":"default"},"2.2.4":{"_id":"dsh-remote-bridge@2.2.4","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-conversation"],"platform":"web"}},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"dist":{"shasum":"3f3fd54c570f9b9ec59b2ccaa0e07d12f7983b4b","tarball":"https://registry.npmmirror.com/dsh-remote-bridge/-/dsh-remote-bridge-2.2.4.tgz","fileCount":22,"integrity":"sha512-xRoxqUWEOMXAimuoMv7Zz2XABHwPNJbSZslTPe7eXhfO/CxqvvmQesEsLuNMTnHgBFDCDnGQopvMv6LBcy4IdQ==","signatures":[{"sig":"MEQCIBaP1ZbS6Agc93uBIEyQUfhGUNKm34Wb9xGHTGiSa0MgAiBf/vvZRDlQMBjGr2DXg/Z48gvS+LhFbJS1DMDITve6cA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC0eX8NYRCAlAtjASPA1wfzPR4ZmBRRi423ZEcujDC5uAiEA9zDf0p2quM3o21TIc9pSOd7BBz3BYYv6jUB3w3Tpb/U="}],"unpackedSize":1109716,"size":277917},"main":"lib/index.js","name":"dsh-remote-bridge","type":"module","types":"lib/index.d.ts","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./client":"./lib/client.cjs","./openapi":"./docs/api/openapi.yaml","./asyncapi":"./docs/api/asyncapi.yaml","./package.json":"./package.json","./cordis.patch.yml":"./cordis.patch.yml"},"gitHead":"52c47dffbaeac9c1b9d6aa0543bc9b623318bb72","license":"AGPL-3.0-only","scripts":{"test":"vitest run","build":"pnpm clean && tsdown","check":"pnpm typecheck && pnpm test && pnpm docs:check && pnpm build","clean":"node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"","qr:app":"node scripts/generate-app-qr.mjs","prepack":"pnpm check","test:e2e":"playwright test","typecheck":"tsc --noEmit","docs:check":"tsx scripts/check-project-docs.ts","test:watch":"vitest"},"version":"2.2.4","_npmUser":{"name":"westanke","email":"westanke@139.com"},"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"},"_npmVersion":"10.9.9","description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","directories":{},"maintainers":[{"name":"westanke","email":"westanke@139.com"}],"_nodeVersion":"24.19.0","contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"dependencies":{"ws":"^8.18.0","lucide-react":"^0.468.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.19.0","devDependencies":{"tsx":"^4.22.0","jsqr":"^1.4.0","yaml":"2.8.1","react":"^18.3.1","qrcode":"^1.5.4","tsdown":"^0.22.0","vitest":"^4.1.0","@types/ws":"^8.5.13","react-dom":"^18.3.1","typescript":"^6.0.0","@types/node":"^22.19.0","@types/react":"^18.3.18","@types/qrcode":"^1.5.6","@playwright/test":"^1.55.0","@types/react-dom":"^18.3.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-remote-bridge_2.2.4_1791728177472_0.44098897415887395"},"_cnpmcore_publish_time":"2026-10-11T14:16:17.622Z","publish_time":1791728177622,"_source_registry_name":"default"}},"description":"Versioned REST bridge for DeepSeek Harness: remote access for trusted clients (chat, files, devices) plus a Phone-settings panel inside the DSH WebUI.","maintainers":[{"name":"westanke","email":"westanke@139.com"}],"readme":"# dsh-remote-bridge\n\n<p align=\"center\">\n  <strong>把 DSH 内核的私有 remote 协议翻译成版本化 REST，供手机与第三方客户端远程访问这台机器；桌面端则提供一个集中设置中心。</strong>\n</p>\n\n<p align=\"center\">\n  中文 · <a href=\"./README.en.md\">English</a>\n</p>\n\n<p align=\"center\">\n  <img alt=\"Version\" src=\"https://img.shields.io/badge/version-v2.2.1-087f8c\">\n  <img alt=\"DSH plugin\" src=\"https://img.shields.io/badge/DeepSeek_Harness-plugin-1f2328\">\n  <img alt=\"Platforms\" src=\"https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-586069\">\n  <img alt=\"License\" src=\"https://img.shields.io/badge/license-AGPL--3.0-2da44e\">\n</p>\n\n`dsh-remote-bridge` 是 DeepSeek Harness（DSH）的远程访问桥接插件：它把 DSH 内核的私有 remote 协议翻译成版本化的 REST 接口，让 dsh-companion（[GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion)）等受信任客户端在离开电脑后仍能使用同一套聊天、工作区与文件能力；桌面端在你的 DSH 设置里提供一个「手机设置」，内联六个分区（根目录 / 远程访问 / 设备 / 回收站 / 审计 / App 下载）。**桌面端不再提供文件管理界面**：文件树与编辑器已于 2.2.0 删除，电脑上管理文件请走手机 App，或在会话里让 agent 用工具完成（见「桌面端不再有文件管理界面」）。\n\n界面默认中文，可随时切换 English。插件支持 Windows、macOS 和 Linux，安装包已经包含编译产物，不要求用户在服务器上重新构建。\n\n> **版本警告**：已发布的 `v2.0.0` 与 `v2.0.1` 存在严重缺陷（`v2.0.0` 历史图片读取全部失败，`v2.0.1` 插件无法激活）。请务必使用 **`v2.2.0`**（或 ≥ `v2.0.4`）。\n> `v2.0.2` 与 `v2.0.3` **从未发布**，请不要按这两个版本号寻找安装包。\n\n> **DSH 0.2.x 兼容性**：本分支在上游 `v1.0.0` 的基础上增加了对 DSH `0.2.0-rc.2` 的兼容层。\n> 0.2.x 用 `dsh-api-gateway` 替换了提供 `apiProxy` 服务的 `dsh-host-apiproxy`，导致上游版本在\n> 0.2.x 上无法启动（表现为「添加根目录返回 405」）。兼容层的完整说明——基于什么、为什么、改了什么、\n> 测了什么——见 [DSH 0.2.x 兼容性适配说明](./docs/project/DSH-0.2-COMPAT.md)。\n\n## 实际效果\n\n桌面端的入口**就在你的 DSH 设置里**：打开设置，在「📱 手机访问」下面就是「📱 手机设置」，点进去直接内联渲染六个分区，不再另开弹窗。它只做设置，**不含文件树**——独立页 `/dsh-workspace` 以及其中的文件树、CodeMirror 编辑器已于 2.2.0 一并删除，理由与代价见下文「桌面端不再有文件管理界面」。\n\n远程访问默认关闭。管理员可在本机 WebUI 中设置绑定 IP、端口和新设备的初始权限。\n\n> 本节原先配有两张界面截图，但那是改名前的旧界面（标题仍是「DSH 文件工作区」；远程访问那张还标着 v1.0.0，且是文件树与设置两个弹窗叠加的形态），与上面描述的当前形态完全不符，已删除以免误导。缓存的旧截图不会自动更新，请以本节文字与 `docs/project/ARCHITECTURE.md` 为准。\n\n## 关于改名（2.0.4）\n\n插件由 `dsh-workspace` 改名为 `dsh-remote-bridge`。改名理由是：旧名字比内容窄——插件实际承担的是「把 DSH 内核的私有 remote 协议翻译成版本化 REST，供手机端远程访问这台机器」再加一个设置中心，而「workspace」只是其中一页。\n\n**改名只动「安装时叫什么、bundle 叫什么」，以下几处对外契约刻意保持不变：**\n\n| 保持不变 | 位置 | 为什么不能改 |\n| --- | --- | --- |\n| REST 前缀 `/dsh-workspace-api` | `src/host/server.ts` | 已发布的 App 把它写死了 |\n| 状态目录（`dataDir`，默认 `dsh-workspace`） | DSH profile 配置 | 换目录等于让用户的授权根配置与回收站全部消失 |\n\n**已不再列入契约的两项**（2.2.0 随独立页一并退役）：\n\n- **独立页路径 `/dsh-workspace`**：该页面（文件树 + CodeMirror 编辑器）已删除，路径随之下线。注意它与 REST 前缀 `/dsh-workspace-api` 是两回事 —— **前缀还在，是 App 的对外契约；页面没了，不再承诺任何东西**。\n- **浏览器存储键 `dsh-workspace-device-token`**：它只被那个已删的页面读写过，现在全仓库（含 App）已无任何读写方。一个没人读的键不构成契约，所以不列入上表；键名本身也不回收，以免日后排查时多一个迷惑项。\n\n所以安装后看到 REST 地址或状态目录里仍然是 `dsh-workspace`，是**预期行为**，不是改名没改干净。\n\n## 快速安装\n\n### 环境要求\n\n- 已安装并能正常启动的 DeepSeek Harness WebUI\n- DSH 内核 `0.1.x` 或 `0.2.x`（0.2.x 由本分支的兼容层支持，见 [DSH 0.2.x 兼容性适配说明](./docs/project/DSH-0.2-COMPAT.md)）\n- Node.js `^22.19.0` 或 `>=24.0.0`\n- 默认端口 `3090` 可用，或准备一个其他端口\n\n使用运行 DSH WebUI 的同一系统用户执行。**推荐用 npm 包名**（三种方式装的是同一份产物）：\n\n```sh\n# ① npm 包名（推荐：装的是预构建产物，不需要 pnpm 的构建授权）\ndsh plugin --profile web add dsh-remote-bridge\n\n# 国内镜像更快时，指定 registry\ndsh plugin --profile web add dsh-remote-bridge --registry https://registry.npmmirror.com\n\n# ② GitHub Release 的 tarball\ndsh plugin --profile web add https://github.com/westanke/dsh-remote-bridge/releases/download/v2.2.1/dsh-remote-bridge-2.2.1.tgz\n\n# ③ Gitee Release 的 tarball（国内访问更快）\ndsh plugin --profile web add https://gitee.com/westanke/dsh-remote-bridge/releases/download/v2.2.0/dsh-remote-bridge-2.2.0.tgz\n\nnpx @deepseek-ai/dsh web\n```\n\n> `dsh plugin add` 底层就是 `pnpm add`，因此 `--registry` 等 pnpm 选项可直接使用。\n>\n> 本 README 由 GitHub 与 Gitee 共用同一份文件，因此凡是必须带主机名的地址（安装命令、Release 下载）\n> 都会把两站都列出来 —— 相对链接可以跟着站点走，但 `/releases/download/...` 没有相对形式。\n> npm 包名与 GitHub 上的仓库同名，两站看到的都一样。\n\n重启 DSH 后，打开设置就能看到「手机设置」（在「手机访问」下面）。它是**纯设置**，不含文件树；会话视图中工具轨迹旁的「文件」标签页已在 2.0.4 移除。**桌面端不再有浏览或编辑文件的界面**：独立页 `/dsh-workspace` 已在 2.2.0 删除，文件操作请走手机 App，或在会话里让 agent 用工具完成。\n\n从 GitHub Release 下载离线安装包时，可直接安装 tarball：\n\n```sh\ndsh plugin --profile web add ./dsh-remote-bridge-2.2.1.tgz\n```\n\n## 第一次使用\n\n1. 打开 DSH 设置，进入「手机设置」（在「手机访问」下面；默认落在「根目录」页）。\n2. 在「根目录」页添加允许管理的本机目录，并为它起一个容易识别的名字。\n3. 需要连接手机时，进入「远程访问」，填写绑定 IP 和端口并保存。\n4. 点击“启用并创建配对”，再将十分钟内有效的一次性配对码填入 App。\n5. 在手机 App 的文件页里选择授权根，即可浏览和编辑文件。\n\n远程访问只有在至少存在一个授权根时才能开启。安装插件本身不会把服务暴露到局域网，未启用时只监听回环地址。\n\n## 你可以做什么\n\n### 桌面端不再有文件管理界面\n\n2.2.0 删除了独立页 `/dsh-workspace`，包括整个文件树、上传下载入口和 CodeMirror 6 编辑器。原因是手机 App 的文件页已经原生覆盖同一套能力，桌面端这个页面没人用，却让发布包从 **0.25 MB 撑到 1.72 MB**。\n\n代价要说清楚：**现在在电脑上动文件只剩两条路** ——\n\n1. 在会话里对 agent 说话，让它用工具读写文件；\n2. 打开终端自己操作。\n\n手机端不受影响：App 的文件页照旧可用，走的是插件保留的同一套 REST 文件接口（`/dsh-workspace-api` 前缀与 `/roots`、`/roots/{rootId}/content` 等端点一个都没删）。回收站里的删除记录现在只来自手机 App。\n\n### 桌面端设置面板\n\n入口在 DSH 设置里，标题为「手机设置」。设置区**内联渲染**导航与内容，不另开弹窗；导航横排，默认落在「根目录」：\n\n| 分区 | 用途 |\n| --- | --- |\n| 根目录 | 添加、移除授权目录并设置显示名称 |\n| 远程访问 | 设置绑定 IP / 端口，启用远程访问并创建配对码 |\n| 设备 | 查看设备权限与根目录授权，随时撤销 |\n| 回收站 | 查看与恢复被删除的条目（只列出来自手机 App 的删除记录） |\n| 审计 | 查看操作类型与对象的审计记录 |\n| App 下载 | 扫码下载 Android 客户端，二维码指向两个站点的 Releases 列表页 |\n\n侧栏那个齿轮按钮**已移除**：入口分散在侧栏图标和设置页两处，会让同一件事有两个起点。会话视图中工具轨迹旁的「文件」标签页也早已移除，桌面端现在只有这一个入口。\n\n### 连接 Android App 或其他客户端\n\n配套的 Android 客户端是 [dsh-companion](https://github.com/westanke/dsh-companion)（[Gitee](https://gitee.com/westanke/dsh-companion)）。\n用手机扫描下面任意一个码即可下载 —— 两个码都指向**对应站点的 Releases 列表页**，\n所以发新版不需要更换二维码：\n\n| GitHub | Gitee（国内访问更快） |\n| --- | --- |\n| ![GitHub 上的 dsh-companion Releases](assets/app-qr-github.png) | ![Gitee 上的 dsh-companion Releases](assets/app-qr-gitee.png) |\n| <https://github.com/westanke/dsh-companion/releases> | <https://gitee.com/westanke/dsh-companion/releases> |\n\n> 二维码里写的是 Releases **列表页**，不是某个具体的 APK 文件名 ——\n> 这样每次发新版都不必重新出图，扫码的人总能拿到最新版。\n> 两张图由 `pnpm qr:app` 生成（`scripts/generate-app-qr.mjs`），\n> 生成时用独立的解码器回读校验，测试也会把提交进仓库的图解回来核对。\n\n装好 App 后，在「手机设置 → 远程访问」里生成配置文本或配对码即可连上本机。\n公开 API 不依赖 DSH 私有协议，也可用于其他客户端：\n\n- 查看、新建、重命名和移除 DSH 工作区登记。\n- 创建、重命名、分叉和归档会话。\n- 读取消息、流式接收正文和思考、追加引导或取消运行。\n- 查看 TODO、斜杠命令、权限模式和待审批操作。\n- 选择 Agent、模型和思考强度。\n- 查看或修改模型供应商，支持完全自定义供应商。\n- 管理设备获准访问的文件和回收站项目。\n\n## 远程访问与安全\n\n默认远程地址为 `0.0.0.0:3090`，IP 和端口都可修改。客户端可以使用能到达服务器的 IP 或域名连接。\n\n插件允许直接使用 HTTP，不强制配置证书。这对可信局域网和临时部署比较方便，但要清楚它的代价：\n\n> HTTP 会明文传输设备令牌、聊天内容和文件内容。在公网或不可信网络中，请使用 Caddy/Nginx 配置 HTTPS，或通过 VPN、Tailscale/WireGuard、SSH 隧道等可信通道连接。\n\n无论是否使用 HTTPS，以下保护都会生效：\n\n- 十分钟有效且只能使用一次的配对码。\n- 256 位设备令牌，服务器只保存摘要。\n- 可撤销的设备权限与独立根目录授权。\n- 配对、认证和普通请求分别限流。\n- 审计记录操作类型和对象，但不记录令牌、文件正文或聊天正文。\n- 新增根目录不会自动授权给已经配对的设备。\n\n只有来自回环地址的管理界面可以添加根目录、调整设备权限、生成配对码、修改监听设置和永久清理回收站。\n\n## 文件边界\n\n外部接口只接受 `rootId + relativePath`，不会接收服务器绝对路径。路径还会经过以下检查：\n\n- wire path 统一使用 `/`。\n- 拒绝绝对路径、盘符、UNC、反斜杠、空字节以及 `.`、`..` 路径段。\n- 每次操作逐段检查 symlink、junction 和 reparse point，禁止借助链接逃出授权根。\n- 删除末端链接时只删除链接本身，不递归进入链接目标。\n- 临时保存文件放在目标目录中，避免跨挂载点替换失败。\n\n“移除 DSH 工作区”只删除 WebUI 中的登记，服务器目录、文件和会话日志不会被删除。“归档会话”只将会话从默认列表隐藏，日志仍会保留。\n\n## 对外接口\n\nREST 基址：\n\n```text\nhttp://HOST:PORT/api/v1\n```\n\n除健康检查和配对交换外，请求需要设备令牌：\n\n```http\nAuthorization: Bearer DEVICE_TOKEN\n```\n\n| 接口 | 用途 |\n| --- | --- |\n| `GET /healthz` | 查看服务状态、API 版本和插件版本 |\n| `POST /pairings/exchange` | 使用一次性配对码换取设备令牌 |\n| `GET /devices/self` | 查看当前设备、权限和根目录授权 |\n| `GET /roots` | 列出设备可访问的文件根 |\n| `GET/POST/PATCH/DELETE /roots/{rootId}/entries` | 列目录、新建、移动、重命名和移入回收站 |\n| `GET/PUT /roots/{rootId}/content` | 读取、Range 下载、上传和带 ETag 保存 |\n| `GET /trash`、`POST /trash/{id}/restore` | 查看与恢复回收项 |\n| `GET/POST /chat/workspaces` | 列出或登记 DSH 工作区 |\n| `PATCH/DELETE /chat/workspaces/{id}` | 重命名或移除工作区登记 |\n| `GET/POST /chat/sessions` | 列出或创建会话 |\n| `PATCH /chat/sessions/{id}` | 重命名会话 |\n| `POST /chat/sessions/{id}/fork` | 分叉会话 |\n| `POST /chat/sessions/{id}/archive` | 归档会话 |\n| `GET/POST /chat/sessions/{id}/messages` | 读取历史、发送消息或追加引导 |\n| `GET/POST /chat/sessions/{id}/commands` | 列出或执行 host 斜杠命令 |\n| `GET/POST /chat/sessions/{id}/approvals...` | 查看和处理待审批操作 |\n| `GET /chat/sessions/{id}/models`、`PUT .../model` | 读取模型目录并切换模型或思考强度 |\n| `PUT /chat/sessions/{id}/agent-preset` | 在首条消息前切换 Agent |\n| `POST /chat/runs/{id}/cancel` | 取消正在运行的会话 |\n| `GET/POST/PATCH/DELETE /settings/...` | 管理供应商、凭据状态、模型发现和自定义供应商 |\n| `WS /events` | 接收聊天增量、运行、审批和文件变更事件 |\n\n完整字段、响应和错误模型见 [OpenAPI 3.1](./docs/api/openapi.yaml)，实时事件格式见 [AsyncAPI](./docs/api/asyncapi.yaml)。仓库同时提供 [Kotlin SDK](./kotlin-sdk/README.md)。\n\n错误响应保持统一：\n\n```json\n{\"error\":{\"code\":\"ERROR_CODE\",\"message\":\"Readable message\",\"requestId\":\"...\"}}\n```\n\n## 设备权限\n\n| Scope | 允许的操作 |\n| --- | --- |\n| `chat.read` | 查看工作区、会话、消息、TODO、命令和审批 |\n| `chat.write` | 管理工作区与会话、发消息、切换配置、执行命令和处理审批 |\n| `files.read` | 浏览、读取和下载文件，查看回收站 |\n| `files.write` | 新建、编辑、上传、移动和重命名 |\n| `files.delete` | 将文件或目录移入插件回收站 |\n| `settings.read` | 查看供应商有效配置和凭据是否已配置 |\n| `settings.write` | 修改供应商、写入凭据和创建自定义供应商 |\n\n设备还必须获得相应 `rootId` 的授权。权限和根目录授权都可以在本机 WebUI 的“设备”页随时修改或撤销。\n\n## 升级与卸载\n\n升级前建议先停止 DSH WebUI，再安装新版本并重新启动。卸载命令：\n\n```sh\ndsh plugin --profile web remove dsh-remote-bridge\n```\n\n默认状态保存在当前 `DSH_HOME` 下的 `dsh-workspace` 目录。卸载插件不会自动删除状态目录或回收站，以免误删尚未恢复的数据。\n\n插件改名（2.0.4）不会改变这个目录名：升级后原有的授权根配置与回收站仍在原处，无需迁移。\n\n## 兼容性与已知限制\n\n### 某些 DSH 构建缺少附件存储服务\n\nDSH 的 cordis 注入属性（`ctx.attachments` / `ctx.fileUploads`）是惰性解析的：读取一个没有任何组件提供的服务会抛错。2.0.3 起改为**容错读取**——服务缺席时插件照常激活，只有真正用到该能力的接口返回可读错误：\n\n- `ATTACHMENT_STORE_UNAVAILABLE`：拿不到 `ctx.attachments`，历史图片的字节无法读取。\n- `FILE_UPLOADS_UNAVAILABLE`：拿不到 `ctx.fileUploads`，无法发送附件。\n\n用户可见的后果：**如果这台机器的 DSH 不提供附件存储服务，会话历史里的图片会读不出来，但插件其余功能全部正常**；客户端会显示具体原因，而不是含糊的「图片不可用」。\n\n## 常见问题\n\n**安装后看不到「手机设置」**\n\n入口在 DSH 设置里，位于「手机访问」下面。如果看不到，确认插件安装在 `web` profile，并在安装后**重启 DSH**（插件为进程内加载，不重启不生效）。\n\n**桌面上找不到浏览或编辑文件的界面**\n\n这是 2.2.0 的有意改动：独立页 `/dsh-workspace` 已删除，桌面端不再提供文件管理界面。请在手机 App 的文件页操作，或在会话里让 agent 用工具读写文件。\n\n**“启用并创建配对”按钮不可用**\n\n先添加至少一个授权根。如果刚修改过绑定 IP 或端口，还需要先保存监听设置。\n\n**手机无法连接**\n\n检查远程访问是否已启用，服务器防火墙和云安全组是否放行端口，以及 App 中填写的地址是否能从手机到达。不要填写服务器自己的 `127.0.0.1`。\n\n**保存文件时提示冲突**\n\n文件已经被其他窗口或程序修改。重新加载，合并需要保留的内容后再保存。\n\n## 从源码构建\n\n```sh\npnpm install --frozen-lockfile\npnpm check\npnpm pack\n```\n\n`pnpm check` 覆盖类型检查、文档一致性与测试；当前 **19 个测试文件 / 113 个用例**，外加 **3 个浏览器层用例**（Playwright 实测量出的计算样式），全部通过。\n\n`npm pack` 的产物约 **0.25 MB**：2.2.0 删除独立页及其编辑器依赖、并关闭 source map 之后，从 1.72 MB 降下来。\n\nv2.2.1 基于 DSH `master@47f943859bef60e4160492346772ded9b24f765a` 开发，CI 覆盖 Windows、Ubuntu 和 macOS。\n\n## 项目信息\n\n- 当前版本：`v2.2.1`\n- 作者：上游 [Hakunm](https://github.com/Hakunm)，本 fork 维护 [westanke](https://github.com/westanke)\n- 仓库：[GitHub](https://github.com/westanke/dsh-remote-bridge) · [Gitee](https://gitee.com/westanke/dsh-remote-bridge)\n- npm：[`dsh-remote-bridge`](https://www.npmjs.com/package/dsh-remote-bridge)（[国内镜像](https://registry.npmmirror.com/dsh-remote-bridge)）\n- 许可证：[GNU Affero General Public License v3.0](./LICENSE)\n- Android 客户端：dsh-companion（[GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion)），上游 [dsh-android-app](https://github.com/Hakunm/dsh-android-app) 的 fork，与本插件配套\n","_source_registry_name":"default","author":{"url":"https://github.com/Hakunm","name":"Hakunm"},"bugs":{"url":"https://github.com/westanke/dsh-remote-bridge/issues"},"contributors":[{"url":"https://github.com/westanke","name":"westanke"}],"homepage":"https://github.com/westanke/dsh-remote-bridge#readme","keywords":["dsh-plugin","deepseek-harness","vibe-coding","android","remote-access","rest-api"],"license":"AGPL-3.0-only","repository":{"url":"git+https://github.com/westanke/dsh-remote-bridge.git","type":"git"}}