Repository navigation
ui: one Skills entry point, Media as a dialog, a dismissible Skills modal, and the 26-plugin ADE banner - #8
Merged
Conversation
…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.'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Three UI behaviours and the banner, plus a dead-code review.
1. One Skills entry point
dsh-skillsregisters a book icon in the conversation header;dsh-themesadds 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 — adisplay:nonecontrol 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 themediaservice ({ 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 oldselectPanelpath remains for a profile running an older audio row.3. The Skills modal closes on a click outside
dsh-modalgainsdismissOnMaskon rich dialogs — off by default, because a rich body may hold unfinished work;dsh-skillsopts 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: trueinopenMediaDialog).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()indsh-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:
MAX_TOOL_TEXTlistSessionFilesMAX_COMMAND_TOKENSDECK_MODES,RENDER_TIMEOUT_MSWINDOWS_ONLYhashBytesMAX_CONCEPT_CHARS,runtimeIdsisVerdict,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,projectDetailOrThrowexamplesDir,existsRow,sessionFile,hashFile,writeChannelFile,readChannelFile,isAddress,LONG_REQUEST_TIMEOUT_MS,readAsset,extractSyntaxError,pidAlive,removeIfPresent,DOC_SEARCH_MAXThe largest finding is
buildHtml/buildTexindsh-research: the HTML and TeX writers are unreferenced —rs_buildwrites 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.mjsis documented; package checks are named bypackage.json; the rest by CI or the README).Verification
check-client-bundles: all pass (new assertions: the band hides the header seat, Media uses themediaservice, 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-dockernpm run check: 138 pass.banner.mjs --check: 1280x320, 26 plugins.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).