Repository navigation
Expand file tree
/
Copy path.dsh-version.json
More file actions
325 lines (325 loc) 路 33.1 KB
/
Copy path.dsh-version.json
File metadata and controls
325 lines (325 loc) 路 33.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
{
"comment": "The DeepSeek Harness version line this plugin pack is built and tested against. Plugins are shipped as alpha until the owner promotes them to stable. The installer pins this exact dsh version when driving the CLI. 'vendoredFrom' records the harness line whose client bundles dsh-rightbar / dsh-rightbar-files / dsh-open-in-app were forked from. dsh-vn-master is the pack's master: the bundle layer alone - the pack's final word per row, no browser half.",
"dsh": "0.2.0-rc.2",
"vendoredFrom": "0.2.0-rc.2",
"platforms": [
"win32",
"darwin",
"linux"
],
"comment_platforms": "The plugins are plain JavaScript and platform-neutral; the only OS-specific code is a launcher choosing the right command for the host: dsh-open-in-app's file-browser launcher (explorer.exe / open / xdg-open, WSL-aware), the run launcher's browser hand-off (Chrome on PATH / the standard install folders / the App Paths registry entry, 'open -a Google Chrome', google-chrome or chromium, else the platform default). The launchers run on Windows (install.bat / uninstall.bat, PowerShell 5.1 or 7, and the run launcher: the double-clickable batch run-web.bat at the root plus its worker scripts/run-web.ps1, because cmd's for /f reads a child's output only up to EOF and cannot watch a running harness) and on macOS/Linux (install.sh / uninstall.sh / run-web.sh, POSIX sh - never PowerShell). The run launcher is run-web.bat + run-web.sh at the repo root, and run-web.sh does the whole job itself. The ready URL reaches the browser as ONE ARGV ELEMENT - Start-Process -ArgumentList on Windows, an argument of open/xdg-open on macOS/Linux - never through a command string.",
"packages": {
"dsh-vn-master": {
"version": "0.1.0-alpha.3",
"rows": [
"master"
],
"role": "Master: the pack base bundle and its final profile layer - it installs last, so a later layer wins per row, and it adds one no-op `master` host row. It carries the pack-wide row decisions: the four feedback/telemetry rows are disabled, and the pack's own `browser` row is disabled too (built and shipped, deliberately off). See packages/dsh-vn-master/README.md.",
"rowOverrides": []
},
"dsh-rightbar": {
"version": "0.1.0-alpha.6",
"rows": [
"rightbar"
],
"disablesRows": [
"ui-sidebar-right",
"ui-sidebar-files"
],
"vendors": [
"@deepseek-ai/dsh-client-ui-sidebar-right"
],
"vendoredPatches": 14,
"role": "Right bar: the tab strip, docking panel, expand button, Start page and the `sidebarRightTabs` / `sidebarRight` services every tab type registers into. A GENERATED fork of the shipped bar whose layer disables `ui-sidebar-right` / `ui-sidebar-files`, rendering the kit's recursive `DockSurface` through its own `vendor/dock-tree.js`. See packages/dsh-rightbar/README.md."
},
"dsh-rightbar-files": {
"version": "0.1.0-alpha.1",
"rows": [
"rightbar-files"
],
"vendors": [
"@deepseek-ai/dsh-client-ui-sidebar-files"
]
},
"dsh-editor": {
"version": "0.1.0-alpha.13",
"rows": [
"editor"
],
"rowOverrides": [],
"role": "Editor: the tab type for text and code - a vendored CodeMirror 6 fetched lazily - with create-on-save inside the session workspace through this package's own authenticated routes. Markdown is claimed too, and hands off to the shipped preview. See packages/dsh-editor/README.md.",
"uses": [
"dsh-modal",
"@deepseek-ai/dsh-client-ui-theme",
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview"
],
"shadowsSlots": [
{
"slot": "sidebar.right.tab.document",
"key": "@deepseek-ai/dsh-client-ui-sidebar-documentpreview/markdown",
"priority": -10,
"why": "the rendered Markdown body carries the Edit toggle back into the editor (lower priority renders) and undoes what the preview's plain-text scrollport imposes on its contents (white-space:pre and the mono font stack)"
}
]
},
"dsh-gittree": {
"version": "0.1.0-alpha.5",
"rows": [
"gittree"
],
"rowOverrides": [],
"role": "History: a read-only tab showing the workspace's commit graph, each commit's message and the files it touched. Three read-only routes spawn `git` with argv arrays under a pinned env; nothing here can write, stage or check out. See packages/dsh-gittree/README.md.",
"uses": [
"dsh-rightbar",
"git on PATH"
]
},
"dsh-image": {
"version": "0.1.0-alpha.2",
"rows": [
"image"
],
"rowOverrides": [],
"role": "Image: a viewer tab for PNG/JPEG/GIF/WebP/AVIF/BMP/ICO/SVG/TIFF that fits the pane on open, zooms by moving the LAYOUT (never a transform), pans by drag and reads the pixel under the pointer. Client-only: the bytes come from the harness's own `remote.workspaceFiles`. See packages/dsh-image/README.md.",
"uses": [
"dsh-rightbar",
"@deepseek-ai/dsh-api-workspace-files (the workspaceFiles remote)"
]
},
"dsh-audio": {
"version": "0.1.0-alpha.4",
"rows": [
"audio"
],
"rowOverrides": [],
"role": "Audio: WAV/AIFF/FLAC as a waveform - one row per channel, an adaptive ruler, a min/max envelope with the RMS core, zoom down to samples, selection, and playback on the audio clock - plus the Audio console for this machine's devices. Client-only, read in 2 MiB windows. See packages/dsh-audio/README.md.",
"uses": [
"dsh-rightbar",
"dsh-modal (the pack's shared dialog surface: the console's seat opens it lazily through ctx.get and never injects it, so a profile without it draws the console inline as a page instead)",
"@deepseek-ai/dsh-api-workspace-files (the workspaceFiles remote: readBytes windows, readAll, stat)"
]
},
"dsh-media": {
"version": "0.1.0-alpha.3",
"rows": [
"media"
],
"rowOverrides": [],
"role": "The pack's media engine and the only owner of ffmpeg (host-only, no browser half): `media_probe`, `media_run` and `media_frames`, the Range-capable file route, remux jobs, and the pinned hash-verified ffmpeg provisioning that dsh-video's tab streams through. See packages/dsh-media/README.md.",
"uses": [
"@deepseek-ai/dsh-client-ui-tool",
"the host's own `tar` for unpacking a pinned archive",
"optional (only when provisioning): the pinned static builds from BtbN/FFmpeg-Builds and evermeet.cx"
],
"vendors": [
"NOT a vendored engine: lib/binaries.json is a PIN (official URL + SHA-256 per platform-arch) whose bytes are downloaded to $DSH_HOME/dsh-media/bin only on a machine with no ffmpeg of its own (BtbN/FFmpeg-Builds autobuild-2026-09-26-13-03 for win32/linux, evermeet.cx 9.0.2 for darwin-x64)"
]
},
"dsh-supercollider": {
"version": "0.1.0-alpha.3",
"rows": [
"supercollider"
],
"rowOverrides": [],
"role": "SuperCollider the agent can play (host half plus a deliberately small console tab): eleven `sc_*` tools over ONE long-lived sclang session and a hand-written OSC client to scsynth, the installed .schelp reference indexed for sc_help, the .scd file workflow, and five bundled skills that teach the language, SynthDefs and live coding. Zero npm dependencies and no MCP server; `mcp/stdio.js` is the same engine over stdio for a client without the harness. See packages/dsh-supercollider/README.md.",
"uses": [
"@deepseek-ai/dsh-client-ui-tool (the tool cards, resolved lazily)",
"the harness's own `ctx.tools`, `ctx.skills` and `connection.fetch` registries",
"SuperCollider 3.13+ installed on the machine (sclang and scsynth) - nothing is bundled"
],
"vendors": [
"NOTHING is vendored and NOTHING is downloaded: the engine is hand-written JavaScript, and it finds the machine's own SuperCollider or tells the user how to install one"
],
"requires": [
"SuperCollider 3.13+ on PATH or at the platform's standard install locations (including the versioned folders a real install uses), else DSH_SC_SCLANG / DSH_SC_SCSYNTH"
]
},
"dsh-video": {
"version": "0.1.0-alpha.1",
"rows": [
"video"
],
"rowOverrides": [],
"role": "Video: a player tab for MP4/MOV/WebM/MKV/AVI/WMV/FLV/OGV/TS/3GP that fits the pane, with the ffprobe facts, chapters as jump targets and one-click remux/convert. The bytes never enter the tab: the `<video>` is handed a URL to dsh-media's Range route. See packages/dsh-video/README.md.",
"uses": [
"dsh-rightbar (the tab registry and the keyed pane seats)",
"dsh-media (the file/report/remux/job routes and the ffmpeg behind them - resolved over HTTP, so a profile without it still loads and says so)"
]
},
"dsh-browser": {
"version": "0.1.0-alpha.1",
"rows": [
"browser"
],
"disablesRows": [
"ui-sidebar-browser"
],
"role": "Browser: the pack's own web surface, which fetches and renders a page on the HOST in a disposable sandboxed engine behind an egress gate instead of framing it remotely - three tools and three routes. Currently disabled by dsh-vn-master's `browser` row; re-enabling it is deleting those two lines. See packages/dsh-browser/README.md."
},
"dsh-diagrams": {
"version": "0.1.0-alpha.7",
"rows": [
"diagrams"
],
"rowOverrides": [],
"role": "Diagrams: Mermaid and TikZ in one bundle - six `diagram_*` tools whose writes are validated on the host before they are stored, a conversation store plus a shared library, a tab per diagram with an export menu, an index page, and browser render reports. See packages/dsh-diagrams/README.md.",
"uses": [
"dsh-rightbar",
"@deepseek-ai/dsh-client-ui-tool",
"a TeX engine on PATH (pdflatex/xelatex/lualatex) for TikZ"
],
"vendors": [
"mermaid@11.17.2 (lib/vendor/mermaid.min.js, GENERATED by vendor/build.mjs)",
"the two skills copied into $DSH_HOME/skills by both installers"
]
},
"dsh-pdf": {
"version": "0.1.0-alpha.8",
"rows": [
"pdf"
],
"rowOverrides": [],
"role": "PDF: five `pdf_*` tools (info, read, find, render, scan) over a vendored pdf.js, plus the reader tab (zoom, search, thumbnails, outline) and a workspace index. Read-only, with extraction in a child process that never evaluates a document's JavaScript. See packages/dsh-pdf/README.md.",
"uses": [
"dsh-rightbar",
"@deepseek-ai/dsh-client-ui-tool",
"@deepseek-ai/dsh-client-ui-session",
"optional: poppler pdftoppm / mutool / Ghostscript for pdf_render and pdf_scan, tesseract (+ language data) for OCR"
],
"vendors": [
"pdfjs-dist@6.3.289 (lib/vendor/pdf.min.mjs + pdf.worker.min.mjs + cmaps/ + standard_fonts/ + wasm/ + LICENSE, GENERATED by vendor/build.mjs; VERSION.json records every file's bytes+sha256 and a digest per tree, --check re-hashes it offline, and .gitattributes pins its text files to LF)",
"the pdf-analysis skill copied into $DSH_HOME/skills by both installers"
]
},
"dsh-cmdbar": {
"version": "0.1.0-alpha.17",
"rows": [
"cmdbar"
],
"rowOverrides": [],
"role": "Command bar: a read-only transcript of the agent's own commands in a bottom dock, fed by one bounded read-only route. One view, and no shell of its own. See packages/dsh-cmdbar/README.md.",
"uses": [
"@deepseek-ai/dsh-client-ui-conversation"
]
},
"dsh-modal": {
"version": "0.1.0-alpha.2",
"rows": [
"modal"
],
"provides": [
"modals"
],
"rowOverrides": [],
"role": "Modal: the pack's shared dialog surface, published as the `modals` service - `open` / `alert` / `confirm` / `prompt` with async submit work that keeps the dialog open, plus a rich `content` dialog whose mask click deliberately does not close it. See packages/dsh-modal/README.md."
},
"dsh-skills": {
"version": "0.1.0-alpha.3",
"rows": [
"skills"
],
"rowOverrides": [],
"uses": [
"@deepseek-ai/dsh-skill (ctx.skills, the host skill registry - NOT injected, resolved lazily per request)",
"dsh-modal (the shared dialog surface, opened in its rich `content` form; resolved lazily so a profile without it still loads)"
],
"role": "Skills browser: one header seat opens a modal listing every skill the harness loads for this conversation, with three routes to read and save the markdown behind it. The client names a skill, never a path. See packages/dsh-skills/README.md."
},
"dsh-ui-state": {
"version": "0.1.0-alpha.2",
"rows": [
"ui-state"
],
"rowOverrides": [],
"provides": [
"uiState"
],
"owns": [
"the profile's own Cordis patch -> the `ui-state` entry's `config` (pageZoom, theme, dockHeight, sidebarWidth, rightbarWidth), through the five `.volatile()` fields this row declares"
],
"role": "UI state that outlives the process: the page zoom, an extension theme, the dock height and the two column widths, kept in one durable settings section and applied before first paint for the zoom. See packages/dsh-ui-state/README.md.",
"uses": [
"@deepseek-ai/dsh-settings (ctx.settings.configure, the page-policy seam)",
"@deepseek-ai/dsh-client-ui-settings (ctx.configForms on the browser side)",
"@deepseek-ai/schemastery, resolved at runtime through $DSH_HOME/profiles"
]
},
"dsh-themes": {
"version": "0.1.0-alpha.27",
"rows": [
"themes"
],
"rowOverrides": [],
"uses": [
"@deepseek-ai/dsh-client-ui-theme",
"@deepseek-ai/dsh-session-log-export",
"dsh-ui-state (the uiState service, resolved lazily through ctx.get, for the durable page zoom and extension theme)"
],
"role": "Themes and header dress: the conversation header's own controls (page zoom, Screenshot, Themes, session-log download), the Nord/Monokai/Hacker/Cyber palettes, and the pack's appearance overrides - Markdown paper, the branding band, the band lines and the top row's centre, the account menu's Feedback row removed, and the right bar's resize seam. See packages/dsh-themes/README.md.",
"overrides": [
"markdown paper: re-declares ui-theme's light declarations on the rendered Markdown root, so the page stays white in the dark theme",
"markdown chrome: hides the preview header's viewer menu on Markdown tabs (the page has exactly one renderer; the editor's Edit button is the way back to editing)",
"left top bar: the sidebar branding row becomes the 76px band the middle and right columns open with - the row spanning the frame's top edge, the sidebar's own 6px top padding folded into its height so the hairline at y=76 does not move - with the mark, brand name and collapse control centred on the frame's y=20, the middle of the band's 40px top row, and the core's 8px/12px gap kept under the line; pinned to the sidebar's hashed class names",
"branding: the left bar brand row drops the shipped mark and wordmark - whatever occupies the single-occupant sidebar.brand.mark / sidebar.brand.name slots, including the layout fallback - and draws a 24px black disc plus the product text vncode in their place (alpha.14; the draw string read VN Harness through alpha.13), in the wide row and in the collapsed rail",
"branding type: the vncode text wears the conversation title's own type - 14px/20px at weight 500, the size of ui-conversation's current crumb - instead of the shipped brand name's 18px/600, which sat in the same 30px strip",
"branding mark: the drawn disc is replaced by the app icon itself - assets/vncode.svg at the pack root, a black circle centred on (12,12) with a 1px transparent margin inside its box - inlined as a data URI so no route or request is needed, and painted at 24px in the left bar (wide row and rail) and 26px in the empty conversation hero, where the shipped whale is also hidden",
"header ring: the right bar's own collapse/expand toggle in the header corner wears the same .5px round hairline outline as this package's own header icon buttons, keyed on the header's stable data-conversation-header-corner marker rather than a hashed class",
"session-log download seat: the shipped @deepseek-ai/dsh-session-log-export browser half's three-dot button - whose one menu item was Download session log - is shadowed by registering the SAME occupant id (session-log-download) at priority -10, which is a list slot's own lowest-renders rule, so the seat draws one plain download icon button that starts the export on the first click; nothing shipped is disabled, because that row owns the host half (/api/session.export and the /export command) and publishes the sessionLogDownload controller this button drives, and the seat's preparing/success/error dialog is rendered here from that same store so /export keeps its feedback",
"capture rule: for the one frame the Screenshot control grabs, html[data-dsh-screenshot] hides the OPEN TOOLTIP BUBBLE (keyed on the shipped Tooltip's own role=\"tooltip\" marker, never a hashed class) and nothing else - since alpha.11 the picture is the interface as it stands, this package's header controls included, because a shot that dropped the buttons that took it was a hole in the record; the clicked button also passes disabled to its own Tooltip while the capture runs, so its hover card is closed rather than merely hidden",
"page zoom: one inline `zoom` on <html> - removed again at 100% - along Chrome's own zoom ladder (50% to 200%, cut at 200% for the reason recorded with the ladder: the control is inside the page it zooms, and a browser zoom reflows the shell, so a rung past that puts the header's utilities row outside the shrunken layout viewport). The menu keeps itself open over a step, like the browser's own zoom submenu, and closes on a pointer press outside it or on Escape (the shipped Menu's own behaviour); the button carries the level in `data-dsh-page-zoom` and in its tooltip, and the level is remembered per origin in localStorage (`dsh-themes.page-zoom`) and re-applied before the control's first render",
"right bar seam under a zoom: the frame places the right bar's outer resize seam with `left: viewport - rightbar`, where `viewport` is the SCALED `getBoundingClientRect().width` a root zoom produces while `left` is layout pixels - so with a level in force the seam slid off the right column's edge (288px at 80% on a 1440px frame) and the bar could no longer be dragged, which in the desktop window (the one host the control exists for) reads as 'the right bar stops being resizable after I zoom'; the LEFT bar's seam was never affected, its `left` being a layout-pixel width with no measurement folded into it. Fixed rather than documented (alpha.16): two rules, gated on `html[data-dsh-page-zoomed]` - the marker `applyZoom` writes beside the declaration it belongs to, so they are inert at 100% and the frame's own inline `left` still governs - name the right column as a CSS anchor on ui-layout's own stable `data-rightbar-col` marker (the one dsh-terminal already follows) and set the seam to `anchor(--dsh-themes-rightbar-seam left) !important` on `[data-side=\"rightbar\"]`, which is layout pixels on both sides. No fork, no core row disabled, nothing for sync-vendored.ps1; a browser without anchor positioning drops the declarations and leaves the behaviour of before. Measured in the desktop window at 80%, 100% and 125% with real pointer input: the seam sits on the column's edge to 0.00px and a drag still resizes the panel",
"account menu: the account menu's shipped **Feedback** row is HIDDEN (alpha.21), because vncode does not ask its users for feedback and that row is the only control in the app that opens an EXTERNAL form in a new window - @deepseek-ai/dsh-client-ui-settings-account's contactUrl() builds it with the uid, the locale, the harness version, the screen size and the device info attached (the default is a Feishu questionnaire at trtgsjkv6r.feishu.cn). There is no row to disable: the item is hardcoded in that package's AccountMenu and registered into the settings.launcher slot whole, so the alternatives were a fork of 4.5k lines (sign-in, sign-out, quota notices, billing pages, onboarding) or one rule. The rule keys on the ICON - the paper-plane path data the row draws - rather than on a hashed class, since the primitive renders rows with no id or data attribute and the artwork outlives the class names a rebuild renames; it hides the row's wrapper AND its button (the primitive's shape today and the bare-button fallback), and it is scoped to `[role=\"menu\"]` so the same artwork drawn by the chat's turn-trigger notice and by the Session-export header button is untouched. Hiding is enough: a display:none row cannot take focus or be clicked, while the Menu's keyboard walk still advances past it, so Settings and Sign out stay reachable. Accepted failure mode, the same one the top-bar and branding pins carry: a future harness that redraws the artwork makes the rule match nothing and the item returns - and a `config` override of contactFormUrl was rejected because a row with `volatile` fields loses its whole config on the next volatile write. No fork, no core row disabled, nothing for sync-vendored.ps1",
"band lines (alpha.25/alpha.26) and the top row's centre (alpha.27): the band's own `.5px` hairline drawn a SECOND time, at y=40, plus the 38px bar the right bar's Start tab was missing and the surface that row needs. That line divides every band into a 40px top row and a 36px one below it, so alpha.27 centres all three columns' top-row furniture on the frame's y=20 - centring it in the last 30px above the rule instead (the strip the conversation's own title row used to define) is what measures as furniture RESTING on the line, a 28px control ending 1px above it with 11px of air over it. The middle column does it by handing the header's own 10px `padding-top` to the conversation title row, which takes `min-height:40px`, so the title and its 28px controls run y=6..34; the sessionless header, whose empty title row IS that 10px of padding, is scoped out of both rules and keeps its shipped height. The dock strip's own padding puts the right bar's 28px tab chips on the same y=6..34 while keeping the strip's 38px total (6px above the chips, 4px below), so the tab body below it keeps its top. The left column's branding row carries the mark, the product text and the collapse toggle on that same y=20 (the 24px mark y=8..32, the wide row's 28px toggle y=6..34, the rail's 36px one y=2..38). The middle column's line is a `.5px` top border on a zero-height pseudo at the tabs row's top edge, with the row's 10px `margin-top` moved into `padding-top` so not a pixel of the tab text moves and the negative inline margins (against the header's own 20px/28px padding) run the line to both column edges; the left column's is the same border on a pseudo 40px into the branding row (the row now spans the band from the frame's top edge, its 6px of root padding folded into its own 76px height, so 0 + 40 = the same y=40), scoped to the WIDE column because the rail's icon button is a 36px square that fills its whole 36px strip (y=2..38) and a line at 40 would cross it; the right bar's is the same border on the tab body's own box, 2px into the row below that column's 38px tab strip (6px of strip padding above 28px of tab chips, 4px below), because that band's own rows divide at 38 and not at 40 - the same border, at the same y=40, is what makes all three columns' lines one height, and the band under it then measures 40 + 36 like the other two columns'. The right bar's other half is the row below that line: the shipped guide tab (the Start tab) is the only tab whose body draws no tool bar - every other type draws a 38px one with that hairline at y=76, which is why the guide's content started 38px higher and no line was drawn - so it is given a top border in the BAR'S OWN SURFACE (`--dsw-alias-bg-base`, the dark palette's `#151517` as the literal) that pushes its content down to y=76, with the same `.5px` border on the pseudo whose containing block begins at that border's bottom edge; and because the right bar is an OVERLAY on the frame whose surface is painted by the forked bar's own stylesheet on the dock box, the tab body's own box (`.P3OORG_tabBody`, the one that spans that row on every tab) is given that same surface - the row under the line was a REAL HOLE with the conversation behind it, and the guide's empty bar is where a reader saw it. Every line is the same token and the same border the band's existing hairline is, so all of them weigh the same; no `:has()`, nothing a browser would drop, and the whole override is inert on a harness that renames the hashed classes it keys on. Measured in a real browser against the extracted core CSS: the conversation header stays exactly 76px (a `border-top` on the tabs row made it 76.5 and pushed everything below it down half a pixel), the first tab stays on y=50, the tabs row spans the full column, the right bar's strip line lands at y=37.5..38 with the tab chips ending at 38, the guide keeps filling its pane (302px of 302px) with its own line on y=76, and the row below the strip - transparent before - is the bar's `#151517` after. The alignment is measured too: the three mid-band lines read 40..41 / 40..41 / 37..38 before and 40..41 / 40..41 / 40..41 after, i.e. the right bar's line was the one out of place by two pixels",
"theme extensions: the Themes control's menu is the SHIPPED registry's own list (snapshot.themes, with the system preference last), and this package registers its palettes into it through ctx.theme.register - ui-theme's documented third-party surface, whose alias-token overrides ui-layout writes as inline body variables over the base palette colorScheme selects. The first registered theme is Nord (alpha.12): the Nord palette's Polar Night surfaces (nord0 page and sidebar alike), Snow Storm text, Frost accents and Aurora states as 93 token overrides (73 alias, 11 specific, 9 shiki) on the DARK base. Monokai follows it (alpha.13), in the same 93-token shape on the DARK base: the classic TextMate palette's near-black warm page (#272822), off-white body (#f8f8f2), pink keywords (#f92672) as the brand, cyan types (#66d9ef) as links and the info state, yellow strings, green functions, orange parameters and purple constants in the syntax tokens, the theme's line highlight and selection as the surface steps, and the olive comment grey (#75715e) as the quietest text tier. Hacker follows Monokai (alpha.19), again in the same 93-token shape on the DARK base: the phosphor terminal, with a near-black green-cast page (#0a0e0a) shared by the conversation and the sidebar, the phosphor body (#d8ffe0), the signal green (#00ff41) as the brand, success and primary button, amber (#ffb000) for warnings and strings, cyan (#00d9ff) for links and the info state, a plain red for errors, and the dim green (#3f6b4a) as the quietest text tier and the comment token - with every hover and pressed step DERIVED from the palette's own colours by the arithmetic Monokai documents rather than invented. Cyber follows Hacker (alpha.24), once more in the same 93-token shape on the DARK base and the pack's SECOND high-contrast programmer palette: the neon city, with a blue-cast near-black page (#04060d) shared by the conversation and the sidebar, a near-white body (#f0f6ff, about 19:1 on that page, with the secondary tier at #d3d8e0 and the tertiary at #9da8c3 so the quiet tiers stay readable), the neon magenta (#ff2e88) as the brand, the primary button and the keywords, the electric cyan (#00e5ff) for links, the info state and functions, violet (#b388ff) for constants, amber (#ffd54d) for strings and warnings, a lifted slate (#6b7ea8) for comments - readable rather than the invisible dim, unlike Hacker's - and the slate (#4a5a86) as the quietest text tier; every hover and pressed step is DERIVED from the palette's own colours by the same arithmetic. It is deliberately not Hacker's twin: a different cast (blue against green), a different brand hue (magenta against green) and different syntax roles, and the tracked check pins both pages and both brands so the two cannot converge. The header button wears one static appearance mark instead of the active preference's sun/moon, and the theme stays in-process because the durable preference schema accepts light/dark/system only. Adding a theme is one entry in THEME_EXTENSIONS plus its theme.<id> copy in both dictionaries and its own menu glyph"
]
},
"dsh-open-in-app": {
"version": "0.1.0-alpha.1",
"rows": [
"native-open-in-app"
],
"disablesRows": [
"ui-open-in-app"
],
"vendors": [
"@deepseek-ai/dsh-client-ui-open-in-app"
],
"vendoredPatches": 2
},
"dsh-canvas": {
"version": "0.1.0-alpha.15",
"rows": [
"canvas"
],
"rowOverrides": [],
"role": "Canvas: a design page the agent drives - twelve `canvas_*` tools over a small JSON design language validated on the host and painted by the browser, exported at preset sizes, with a style library, presets, archetypes and an asset store. See packages/dsh-canvas/README.md.",
"uses": [
"@deepseek-ai/dsh-client-ui-conversation",
"@deepseek-ai/dsh-client-ui-session",
"@deepseek-ai/dsh-client-ui-tool"
],
"vendors": [
"Inter 400/600/700 + Space Grotesk 500/700 Latin WOFF2 subsets (lib/vendor/fonts/, GENERATED by vendor/build.mjs; VERSION.json records a sha256 per file and --check re-hashes it offline). The vendored Excalidraw 0.18.1 + React 18.3.1 surface this package carried through alpha.12 is GONE: the Canvas tab is the design surface and the pack's own engine is its only painter.",
"konva 10.7.0 (lib/vendor/konva/konva.min.js + LICENSE-konva.txt, GENERATED by vendor/konva/build.mjs, which reads them out of the PINNED npm tarball after verifying the registry's published sha512 and records a sha256 per file; --check re-hashes it offline). It is the Canvas tab's INTERACTION layer and not a painter: hit rects, hit testing and the drag, while the engine paints the artboard, the render report and the export.",
"the canvas-design and social-banners skills, copied into $DSH_HOME/skills by both installers"
]
},
"dsh-writing": {
"version": "0.1.0-alpha.7",
"rows": [
"writing"
],
"rowOverrides": [],
"role": "Writing: a document you write on (conversation view, order 30, to the RIGHT of Canvas) in a VENDORED Editor.js surface and a workbook you edit as a grid, plus Headings and .docx panes in the right bar - AND three `writing_*` tools (list/read/write) so the AGENT writes documents into the same store the tab reads, plus the pack's one METHOD skill (`research`: how a literature review is scoped, searched, verified, synthesized and cited). The editor is the pinned Editor.js core and its five block tools, committed under lib/vendor/editorjs/ by packages/dsh-writing/vendor/editorjs/build.mjs and served one exact route per file; this package's OWN paragraph and header tools render the six inline marks the model carries and read them back into runs, and lib/editorjs.js is the pure model<->block-JSON bridge the checks drive with no browser. Documents persist per conversation (the dsh-diagrams store shape) AND link to real files through `origin`: New writes a real .docx/.xlsx, Save writes the file atomically, and a file that moved answers 409 with Reload / Keep-mine. Three hand-written codecs, no dependencies: .docx (lib/ooxml.js + zip.js + xml.js, with a counted loss report for what the model cannot hold), .xlsx (lib/xlsx.js, formulas written with NO cached value beside fullCalcOnLoad so LibreOffice computes them), and the MACHINE'S OWN FONTS (lib/fonts.js: sfnt name-table reads in pieces - 234 families from 486 files on the host this was built on). NOTHING HERE RENDERS OFFICE: `Proof` writes the file and hands its address to the SHIPPED office preview, so the LibreOffice the harness already ships (behind @deepseek-ai/dsh-office-to-pdf) renders it - and check-writing-node.mjs hands both a written .docx and a written .xlsx to that same LibreOffice and asserts it opens them (the page break makes a page; the formula cell reaches a PDF). The model can hold no table, no image and no footnote, and writing_write SAYS SO rather than flattening one silently. See packages/dsh-writing/README.md.",
"uses": [
"@deepseek-ai/dsh-client-ui-conversation (the view ring the Writing tab lives in)",
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview (the Proof hand-off: the preview's KIND is read out of the tab registry, never hardcoded)",
"@deepseek-ai/dsh-tools (the registry the three writing_* tools are registered into; resolved defensively so a profile without it still loads)",
"@deepseek-ai/dsh-skill (ctx.skills, the registry the bundled research skill is registered on; resolved lazily, and the installers copy it into $DSH_HOME/skills as well)"
],
"requires": [
"no engine of its own: the page breaker (lib/page.js) is served to the browser and imported from a blob URL, so the tab and the checks run the same splitter"
]
}
}
}