Skip to content

ui: one Skills entry point, Media as a dialog, a dismissible Skills modal, and the 26-plugin ADE banner - #8

Merged
vecnode merged 2 commits into
mainfrom
fix/skills-entry-and-modals
Oct 19, 2026
Merged

vecnode merged 2 commits into
mainfrom
fix/skills-entry-and-modals

Conversation

@vecnode

@vecnode vecnode commented Oct 19, 2026

Copy link
Copy Markdown
Owner

What

Three UI behaviours and the banner, plus a dead-code review.

1. One Skills entry point

dsh-skills registers a book icon in the conversation header; dsh-themes adds the left-bar Skills button that clicks it. With the band mounted, the header seat is now hidden by a :has([data-dsh-themes-band]) rule. It stays mounted on purpose: the band's click handler queries [data-dsh-skills="button"], and that handler is where the session id comes from — a display:none control still takes a programmatic click. A profile without the band keeps the header control as its only way in.

2. Media is a dialog, not a page swap

The band's Media button used layout.selectPanel('media'), which swaps the main column from the conversation to dsh-audio's seat (the seat then opens the dialog). dsh-audio now publishes the media service ({ open() }), and the band calls it — the dialog opens over the chat and the chat stays. The seat also hands the column back as soon as its dialog is up, so the sidebar row's path no longer leaves the chat swapped either. Fallback to the old selectPanel path remains for a profile running an older audio row.

3. The Skills modal closes on a click outside

dsh-modal gains dismissOnMask on rich dialogs — off by default, because a rich body may hold unfinished work; dsh-skills opts in (the browser holds no draft; saves go through the route). Escape and the Close button keep working. Per your answer, only the Skills dialog opts in — Media's dialog keeps Escape/×; flipping it is one line (dismissOnMask: true in openMediaDialog).

4. Banner

Regenerated from the tree: 26 plugins (the count is derived from packages/, never typed) and the eyebrow now reads VNCODE · ADE instead of IDE. Verified by OCR of the committed PNG: VNCODE • ADE / 26 / plugins.

5. Dead code review

Method: a heuristic scan of 191 source files for exported names with no reference outside their defining file, plus local declarations used once, plus orphan files. One real local dead function was removed (containerLine() in dsh-docker/lib/tools.js — a leftover from an earlier table refactor).

43 exports nothing references anywhere remain, listed per package. They are safe to delete mechanically (nothing imports them, no check names them), but they span 10 packages and I did not churn them in a UI fix — say the word and I will remove them in a follow-up:

  • dsh-browser: MAX_TOOL_TEXT
  • dsh-diagrams: listSessionFiles
  • dsh-docker: MAX_COMMAND_TOKENS
  • dsh-frontend-craft: DECK_MODES, RENDER_TIMEOUT_MS
  • dsh-ocr: WINDOWS_ONLY
  • dsh-pdf: hashBytes
  • dsh-proto-lab: MAX_CONCEPT_CHARS, runtimeIds
  • dsh-research: isVerdict, isStrengthVerdict, DISCLOSURE_CODES, DOCX_REFUSAL_CODES, tableCells, TWIPS_PER_INCH, TWIPS_PER_POINT, pointsOf, wNum, buildHtml, RUNGS (a duplicate of verify.js's), readReviews, claimOf, METHOD_CODES, screeningLine, REVIEW_STATUSES, accessedOf, SYNTAX_CODES, buildTex, FILE_RUNGS, projectDetailOrThrow
  • dsh-supercollider: examplesDir, existsRow, sessionFile, hashFile, writeChannelFile, readChannelFile, isAddress, LONG_REQUEST_TIMEOUT_MS, readAsset, extractSyntaxError, pidAlive, removeIfPresent, DOC_SEARCH_MAX

The largest finding is buildHtml / buildTex in dsh-research: the HTML and TeX writers are unreferenced — rs_build writes md/docx/html through other paths (or not at all). Worth a look before deleting, since that may be a missing wiring rather than dead weight.

Orphan-file findings were all false positives (docs/diagrams/check-local.mjs is documented; package checks are named by package.json; the rest by CI or the README).

Verification

  • check-client-bundles: all pass (new assertions: the band hides the header seat, Media uses the media service, the modal mask is inert by default and opt-in, audio publishes the service, the seat hands the column back).
  • check-node-routes: all pass, including the manifest (versions kept in step: audio alpha.8, themes alpha.31, skills alpha.4, modal alpha.4).
  • check-no-secrets: OK. packages/dsh-docker npm run check: 138 pass. banner.mjs --check: 1280x320, 26 plugins.
  • Plugin versions bumped in package.json, the client marker and .dsh-version.json.

Try it

The profile live-links packages/, so a hard refresh of the running GUI is enough for the client bundles (no harness restart). Then: left bar → Skills (one button, closes on outside click), left bar → Media (dialog over the chat).

…odal, and the 26-plugin ADE banner

- dsh-themes: the band's Skills button is the pack's ONE entry to that dialog; dsh-skills' header seat is hidden by a :has([data-dsh-themes-band]) rule (it stays mounted because it is what the band CLICKS, and its handler carries the session id).
- dsh-audio publishes the 'media' service ({ open() }); dsh-themes opens the Media dialog with it, so the chat is no longer swapped out for the seat panel. The seat ALSO hands the column back as soon as its dialog is up, so the sidebar row's path leaves nothing swapped either.
- dsh-modal gains 'dismissOnMask' on rich dialogs (off by default - the body may hold unfinished work); dsh-skills opts in, so a click outside the Skills browser closes it. Escape and the Close button keep working.
- banner: regenerated from the tree - 26 plugins, and the eyebrow reads VNCODE / ADE instead of IDE (the number is derived, never typed).
- dead code: dsh-docker's containerLine() was defined and never called; removed.

Verified: check-client-bundles (all), check-node-routes (manifest versions match), check-no-secrets, packages/dsh-docker 'npm run check' (138), banner --check (1280x320, 26 plugins). A heuristic scan of 191 source files found 43 exports nothing references; they are listed in the PR, not removed here.

Versions: dsh-audio alpha.8, dsh-themes alpha.31, dsh-skills alpha.4, dsh-modal alpha.4 (package.json, client marker and .dsh-version.json kept in step).
The plugin count was already read from packages/; the skill count is now read the same way (every packages/*/skills/<name>/ folder, which is exactly what the installers copy into DSH_HOME/skills), so the two numbers on the banner cannot drift from the pack. Verified by OCR of the committed PNG: 26, 'plugins,', 28, 'skills.'
@vecnode
vecnode merged commit 9f323e8 into main Oct 19, 2026
5 checks passed
@vecnode
vecnode deleted the fix/skills-entry-and-modals branch October 19, 2026 17:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant