{"_id":"@danielng23/dsh-client-ui-theme-store","_rev":"4-3dddabd88d2a0d214741a6ec26eaebcb","name":"@danielng23/dsh-client-ui-theme-store","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@danielng23/dsh-client-ui-theme-store","version":"0.1.0","license":"MIT","_id":"@danielng23/dsh-client-ui-theme-store@0.1.0","maintainers":[{"name":"danielng23","email":"ph4310822@gmail.com"}],"dsh":{"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-theme","@deepseek-ai/dsh-api-remotes"],"platform":"web"}},"dist":{"shasum":"b74b0fda09e679e39f4846529ae25cd095ed45ce","tarball":"https://registry.npmjs.org/@danielng23/dsh-client-ui-theme-store/-/dsh-client-ui-theme-store-0.1.0.tgz","fileCount":16,"integrity":"sha512-g0pqJMvttPTzYEL8JpcoTpyUVnbL6PdO7XosUaTyhFB7ltATP0tHUuRCs1bgVmwLqVYFX9enOKQFYdITjSdXmA==","signatures":[{"sig":"MEQCIFfAYTB4Nc+tbfwGpod+02+kn6BfMJovwZX+yvnYm9EzAiBhRUWjxyBcejhVkyMU/Ep9+kiompqh5rPwKPahjNTnFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172492},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -b tsconfig.json && tsdown","watch":"tsdown --watch","bundle":"tsdown","typecheck":"tsc -b tsconfig.json --pretty false","test:watch":"vitest"},"_npmUser":{"name":"danielng23","email":"ph4310822@gmail.com"},"repository":{"url":"git+https://github.com/ph4310822/dsh-edex-themes.git","type":"git","directory":"."},"description":"Theme store plugin for the DeepSeek Harness web GUI: a settings Theme Store page that reads a JSON theme catalog from this repository (GitHub), shows name/author/screenshot cards, and applies selected --dsw-* token themes through the harness theme service","directories":{},"_nodeVersion":"24.19.0","dependencies":{"js-yaml":"^5.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.0.0","jsdom":"^26.0.0","react":"^18.2.0","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.2.0","typescript":"^6.0.3","@types/node":"^26.4.0","@types/react":"~18.3.1","lightningcss":"^1.32.0","@types/js-yaml":"^4.0.9","@deepseek-ai/cordis":"^4.0.1","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.1.0","@deepseek-ai/schemastery":"^3.18.1-rc.4","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-test-runtime":"^0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-client-ui-theme-store_0.1.0_1788330021906_0.9663790495070168","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@danielng23/dsh-client-ui-theme-store","version":"0.1.1","license":"MIT","_id":"@danielng23/dsh-client-ui-theme-store@0.1.1","maintainers":[{"name":"danielng23","email":"ph4310822@gmail.com"}],"dsh":{"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-theme","@deepseek-ai/dsh-api-remotes"],"platform":"web"}},"dist":{"shasum":"8cd59c6f9113f6209155b6117ce453d5b70c9d81","tarball":"https://registry.npmjs.org/@danielng23/dsh-client-ui-theme-store/-/dsh-client-ui-theme-store-0.1.1.tgz","fileCount":16,"integrity":"sha512-rV50mjrLSCl5jHpNOPiXdFggEcyKeRejoL+8u0sNrsprXAW1M83Ny1NeYWPSiHNjUx1k3iJO30szdj7Jc2EgMg==","signatures":[{"sig":"MEUCICtbNWxTDf1XY16HcgRLxf2VW6gkl7SCGoOS9x4T8aS1AiEA/LBCg8lTLuPAj0gQsXL6ryRxEqfYGpeOUgBPqzsNyIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175128},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -b tsconfig.json && tsdown","watch":"tsdown --watch","bundle":"tsdown","typecheck":"tsc -b tsconfig.json --pretty false","test:watch":"vitest"},"_npmUser":{"name":"danielng23","email":"ph4310822@gmail.com"},"repository":{"url":"git+https://github.com/ph4310822/dsh-edex-themes.git","type":"git","directory":"."},"description":"Theme store plugin for the DeepSeek Harness web GUI: a settings Theme Store page that reads a JSON theme catalog from this repository (GitHub), shows name/author/screenshot cards, and applies selected --dsw-* token themes through the harness theme service","directories":{},"_nodeVersion":"24.19.0","dependencies":{"js-yaml":"^5.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.0.0","jsdom":"^26.0.0","react":"^18.2.0","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.2.0","typescript":"^6.0.3","@types/node":"^26.4.0","@types/react":"~18.3.1","lightningcss":"^1.32.0","@types/js-yaml":"^4.0.9","@deepseek-ai/cordis":"^4.0.1","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.1.0","@deepseek-ai/schemastery":"^3.18.1-rc.4","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-test-runtime":"^0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-client-ui-theme-store_0.1.1_1788331126460_0.7700377662873232","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@danielng23/dsh-client-ui-theme-store","version":"0.1.2","license":"MIT","_id":"@danielng23/dsh-client-ui-theme-store@0.1.2","maintainers":[{"name":"danielng23","email":"ph4310822@gmail.com"}],"homepage":"https://github.com/ph4310822/dsh-edex-themes#readme","bugs":{"url":"https://github.com/ph4310822/dsh-edex-themes/issues"},"dsh":{"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-theme","@deepseek-ai/dsh-api-remotes"],"platform":"web"}},"dist":{"shasum":"f40b736c29fa373e7f18a149ec1b5d22ecae213f","tarball":"https://registry.npmjs.org/@danielng23/dsh-client-ui-theme-store/-/dsh-client-ui-theme-store-0.1.2.tgz","fileCount":16,"integrity":"sha512-BpF3vruvUOMoPyRpR6rPKrLRoI88nqGMUqkBnQpRs0Dto1cGSWth5dA0H7mrs53Cyg2UpViU2KE0dNSoMSxtiA==","signatures":[{"sig":"MEQCIF6YQFVHCozyumZWRyfmTdVUc3m7L39xr1hnhRY6HY2XAiBvv5zSnRTIg8T9l6ahv0ee+4RXoOswMDZLjKNSYKvEVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182255},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"gitHead":"e07f6878e671d72736018532bc6ea051bfdd20e6","scripts":{"test":"vitest run","build":"tsc -b tsconfig.json && tsdown","watch":"tsdown --watch","bundle":"tsdown","typecheck":"tsc -b tsconfig.json --pretty false","test:watch":"vitest"},"_npmUser":{"name":"danielng23","email":"ph4310822@gmail.com"},"repository":{"url":"git+https://github.com/ph4310822/dsh-edex-themes.git","type":"git","directory":"."},"_npmVersion":"11.17.0","description":"Theme store plugin for the DeepSeek Harness web GUI: a settings Theme Store page that reads a JSON theme catalog from this repository (GitHub), shows name/author/screenshot cards, and applies selected --dsw-* token themes through the harness theme service","directories":{},"_nodeVersion":"24.19.0","dependencies":{"js-yaml":"^5.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.0.0","jsdom":"^26.0.0","react":"^18.2.0","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.2.0","typescript":"^6.0.3","@types/node":"^26.4.0","@types/react":"~18.3.1","lightningcss":"^1.32.0","@types/js-yaml":"^4.0.9","@deepseek-ai/cordis":"^4.0.1","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.1.0","@deepseek-ai/schemastery":"^3.18.1-rc.4","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-test-runtime":"^0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-client-ui-theme-store_0.1.2_1788516899751_0.045603855065843746","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@danielng23/dsh-client-ui-theme-store","description":"Theme store plugin for the DeepSeek Harness web GUI: a settings Theme Store page that reads a JSON theme catalog from this repository (GitHub), shows name/author/screenshot cards, and applies selected --dsw-* token themes through the harness theme service","version":"0.1.3","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ph4310822/dsh-edex-themes.git","directory":"."},"type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./src/*":"./src/*","./package.json":"./package.json"},"dsh":{"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-theme","@deepseek-ai/dsh-api-remotes"],"platform":"web"}},"scripts":{"build":"tsc -b tsconfig.json && tsdown","bundle":"tsdown","watch":"tsdown --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc -b tsconfig.json --pretty false"},"license":"MIT","peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2"},"devDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-api-remotes":"^0.1.1-rc.2","@deepseek-ai/dsh-client-connection":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"^0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-test-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-theme":"^0.1.1-rc.2","@deepseek-ai/dsh-host-webserver":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/schemastery":"^3.18.1-rc.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.1.0","@types/js-yaml":"^4.0.9","@types/node":"^26.4.0","@types/react":"~18.3.1","clsx":"^2.0.0","jsdom":"^26.0.0","lightningcss":"^1.32.0","react":"^18.2.0","react-dom":"^18.2.0","tsdown":"^0.22.2","typescript":"^6.0.3","vitest":"^4.1.8"},"dependencies":{"js-yaml":"^5.4.1"},"gitHead":"fcfc49f62a86729c59390338384cad0d7db6af93","_id":"@danielng23/dsh-client-ui-theme-store@0.1.3","bugs":{"url":"https://github.com/ph4310822/dsh-edex-themes/issues"},"homepage":"https://github.com/ph4310822/dsh-edex-themes#readme","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-/bPf++aUDRmDtSnb6/EdbI+6IDUQJ5M6zoX5gREvtFSHAgsayJ5NuSkx13VJgvPVoeByQ9zzf84kDKf/58yIsw==","shasum":"cf3807694d1e7011aeb3c8a2ac3177446ce6fa56","tarball":"https://registry.npmjs.org/@danielng23/dsh-client-ui-theme-store/-/dsh-client-ui-theme-store-0.1.3.tgz","fileCount":16,"unpackedSize":185405,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHM3imMqOod3Ca8N1geIkP3c6q52BM5B0nE3LlEIy37YAiEAxSetkhwChhliGkTneg2XhpUE8nnwxxsbwpM3rSPn5VA="}]},"_npmUser":{"name":"danielng23","email":"ph4310822@gmail.com"},"directories":{},"maintainers":[{"name":"danielng23","email":"ph4310822@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-client-ui-theme-store_0.1.3_1788849767822_0.2420966908403599"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-02T06:20:21.695Z","modified":"2026-09-08T06:42:48.078Z","0.1.0":"2026-09-02T06:20:22.047Z","0.1.1":"2026-09-02T06:38:46.592Z","0.1.2":"2026-09-04T10:14:59.891Z","0.1.3":"2026-09-08T06:42:47.958Z"},"bugs":{"url":"https://github.com/ph4310822/dsh-edex-themes/issues"},"license":"MIT","homepage":"https://github.com/ph4310822/dsh-edex-themes#readme","repository":{"type":"git","url":"git+https://github.com/ph4310822/dsh-edex-themes.git","directory":"."},"description":"Theme store plugin for the DeepSeek Harness web GUI: a settings Theme Store page that reads a JSON theme catalog from this repository (GitHub), shows name/author/screenshot cards, and applies selected --dsw-* token themes through the harness theme service","maintainers":[{"name":"danielng23","email":"ph4310822@gmail.com"}],"readme":"SCIFI/HUD/TERMINAL-style theme store for DeekSeek Harness. \n\n![Theme Store screenshot](screenshot.png)\n\n## eDEX-UI inspired themes\n\nThe shell themes in this store are **inspired by [eDEX-UI](https://github.com/GitSquared/edex-ui)** — the sci-fi, fully-featured terminal emulator dashboard. Each variant wraps the default web surface in an eDEX-style frame:\n\n- **Two system info panels** — live system metrics and network activity\n- **File directory browser** — filesystem explorer\n- **Editor + terminal** — the working surface\n\nEvery theme in the catalog is **created by agents**: the variant shells, palettes, and catalog entries are all generated automatically by AI agents, so the whole catalog is a product of automated theme creation rather than hand-authored files.\n\n## Installation\n\n### Install from npm\n\n```bash\npnpm add @deepseek-ai/dsh-client-ui-theme-store\n```\n\n### Add to the harness\n\nAfter installing the package, add the plugin to your harness instance's `cordis.patch.yml`:\n\n```yaml\n- id: ui-theme-store\n  name: '@deepseek-ai/dsh-client-ui-theme-store'\n```\n\nThe client bundle is automatically served at `/plugins/@deepseek-ai/dsh-client-ui-theme-store/client.js`.\n\n> \"No category, just read a json file from this repo (push to github), theme contains name, author, screenshot.\"\n\n## What it looks like\n\nA `settings.section` entry named **Theme Store** (order 12, between Models and Plugins) renders a grid of theme cards. Each card shows:\n\n- **Screenshot** — preview image (rendered inside `<img>`, falls back to a palette swatch when the image is broken)\n- **Name** — display name of the theme\n- **Author** — attribution\n- **Scheme badge** — Light or Dark\n- **Apply button** — applies the theme; shows \"Applied\" while the theme is active\n\nClicking **Apply**:\n\n1. Registers the theme with the harness theme service (`ctx.theme.register(...)`) — idempotent, no crash on duplicate ids.\n2. Switches the active preference (`ctx.theme.setTheme(id)`).\n3. Persists the applied theme id in the plugin's own durable settings namespace (`ui-theme-store.applied`) so the choice survives reloads — the built-in `ui-theme` schema only accepts `light/dark/system`, so the store owns its own persistence.\n\n## Catalog\n\nThe catalog is a JSON document at `catalog/edex-themes.json` in this repository. Its structure:\n\n```json\n{\n  \"themes\": [\n    {\n      \"id\": \"ocean\",\n      \"name\": \"Ocean\",\n      \"author\": \"dsh-edex\",\n      \"screenshot\": \"screenshots/ocean.svg\",\n      \"colorScheme\": \"dark\",\n      \"tokens\": {\n        \"--dsw-alias-bg-base\": \"#0d1b2a\",\n        \"--dsw-alias-bg-layer-1\": \"#14283c\",\n        \"--dsw-alias-bg-layer-2\": \"#1b344c\",\n        \"--dsw-alias-bg-overlay\": \"#101f30\",\n        \"--dsw-alias-border-l1\": \"#2a4a68\",\n        \"--dsw-alias-border-l2\": \"#3a6385\",\n        \"--dsw-alias-brand-primary\": \"#4ea1ff\",\n        \"--dsw-alias-label-primary\": \"#e6eef7\",\n        \"--dsw-alias-label-secondary\": \"#9db8d0\",\n        \"--dsw-specific-sidebar-fill\": \"#101f30\"\n      }\n    }\n  ]\n}\n```\n\n### Fields\n\n| Field | Required | Description |\n|---|---|---|\n| `id` | yes | Theme id (must be unique across the catalog). Used for `ctx.theme.register()`. |\n| `name` | yes | Display name. |\n| `author` | yes | Author attribution. |\n| `screenshot` | yes | Preview image URL. Absolute URLs or paths relative to the catalog's directory. |\n| `colorScheme` | yes | Base palette: `\"light\"` or `\"dark\"`. |\n| `tokens` | yes | Flat map of `--dsw-alias-*` CSS variable overrides. One value per variable (the chosen `colorScheme` decides which base palette is active). |\n\n### Adding a theme\n\n1. Add an entry to `catalog/edex-themes.json`.\n2. Add a screenshot image to `catalog/screenshots/` (or reference an external URL in `screenshot`).\n3. Push the repo to GitHub — the plugin will pick up the new theme on next load.\n\n### Override-able tokens\n\nThe harness defines the following alias tokens (see `@deepseek-ai/dsh-client-ui-theme`):\n\n- `--dsw-alias-bg-base`\n- `--dsw-alias-bg-layer-1`\n- `--dsw-alias-bg-layer-2`\n- `--dsw-alias-bg-overlay`\n- `--dsw-alias-border-l1`\n- `--dsw-alias-border-l2`\n- `--dsw-alias-brand-primary`\n- `--dsw-alias-label-primary`\n- `--dsw-alias-label-secondary`\n- `--dsw-alias-state-error-primary`\n- `--dsw-alias-state-success-primary`\n- `--dsw-alias-state-warn-primary`\n- `--dsw-specific-sidebar-fill`\n\n## Standalone package\n\nThis repository is a **standalone npm package** that follows the harness client plugin conventions (`dsh.client` declaration, `exports[\"./client\"]`, closure-factory bundle). It builds, typechecks, and tests independently.\n\n### Quick start\n\n```bash\npnpm install\npnpm run typecheck\npnpm run test\npnpm run build\n```\n\n### Integration into the harness\n\nTwo ways to compose this plugin into a running DeepSeek Harness GUI:\n\n#### A. Drop-in (recommended for development)\n\n1. Copy the package into the harness monorepo:\n   ```bash\n   cp -r . /path/to/deepseek-harness/packages/client/ui-theme-store\n   ```\n2. Add a tsconfig reference — add `{ \"path\": \"packages/client/ui-theme-store\" }` to `tsconfig.client.json`'s `references`.\n3. Add a dependency — add `\"@deepseek-ai/dsh-client-ui-theme-store\": \"workspace:^\"` to `packages/bundle/web-app/package.json`.\n4. Add a cordis patch row — insert into `packages/bundle/web-app/cordis.patch.yml`:\n   ```yaml\n   - id: ui-theme-store\n     name: '@deepseek-ai/dsh-client-ui-theme-store'\n   ```\n5. Rebuild: `pnpm run build:lib:client && pnpm run build:web`.\n\n#### B. External dependency\n\n1. Install the package from npm:\n   ```bash\n   pnpm add @deepseek-ai/dsh-client-ui-theme-store\n   ```\n2. Add a row to the cordis patch (see above) and a dependency entry in `web-app/package.json`.\n3. The client bundle (`lib/client.js`) is in the correct closure-factory format — the harness modules node half will serve it at `/plugins/@deepseek-ai/dsh-client-ui-theme-store/client.js`.\n\n### Catalog URL\n\nThe theme store loads its catalog live from this repository on GitHub, so you can add or change themes by pushing to the repo — no plugin release needed. The default catalog URL is:\n\n```\nhttps://raw.githubusercontent.com/ph4310822/dsh-edex-themes/main/catalog/edex-themes.json\n```\n\nIf GitHub is unreachable, the store falls back to the bundled catalog served by the plugin's node half at `/catalog/edex-themes.json`.\n\nOverride the default at build time by setting the environment variable:\n\n```bash\nDSH_CLIENT_THEME_STORE_CATALOG_URL=https://your-raw-url/catalog/edex-themes.json pnpm run build\n```\n\nOr edit the constant in `src/client/catalog.ts`.\n\n## Model Experience\n\nNone, as the theme store is a browser-side settings surface that reads a JSON catalog and drives the harness theme service — nothing here reaches a model request.\n\n#### KV Cache effect\n\nNone; this package neither assembles nor sends a provider request.\n\n## Limitations\n\n- **Third-party theme ids are in-process only** — the harness's built-in `ui-theme` settings schema only accepts `light/dark/system`. The theme store persists its own `applied` id in the `ui-theme-store` settings namespace, so the applied theme survives reloads. However, if the user later picks a built-in preference in the Appearance row, the store's persisted id is cleared on next reload (the built-in preference wins).\n- **Remote browsers get no durable settings** — the settings RPCs used for persistence are loopback-only, so a non-loopback browser falls back to process-local selection.\n- **Screenshots must be network-accessible** — the catalog JSON references screenshot URLs; the plugin does not bundle them.\n\n## License\n\nMIT","readmeFilename":"README.md"}