dsh-web-ui v0.1.20
本次发布包含 11 项新功能、37 项修复、50 项其他改动。
新功能
- [aionui-panel,web-ui-settings] add master enable switch for the right-panel system (#307)
- [community-plugins] marketplace-style index display with search, category filters and card grid
- [skins] add matrix night-friendly dark skin (#340)
- [aionui-panel] click chat file references to locate them in the explorer and preview (#314)
- [aionui-panel] maximize and restore explorer and preview panels (#315)
- [aionui-panel] draggable floating expand button with persisted WCO-aware position (#374 #292)
- [skins] add whale-mom deep-sea mother-and-calf skin (#347)
- [describe-image] control vision thinking via model id suffix (#366)
- [community-plugins] register dsh-memoir (#357)
- [community-plugins] register dsh-auto-memory (#368)
- [pet] click session bubbles to jump to the session
修复
- [scripts] pick the previous release tag by ancestry, not version sort
- [web-ui-settings] release compat-scope subscriptions on plugin unload
- [remote-web-ui] prune expired accept rate-limit windows
- [remote-web-ui] abort the host-side search when the phone disconnects
- [task-board] converge on one normalizeTargetId (trim included)
- [scripts] scaffold new skins under the family @linxin666 scope
- [ssh] never follow symlinks in recursive upload walks
- [describe-image] answer 404 for malformed percent-encoding in raw image ids
- [remote-web-ui] stop minting tokens inside a setState updater
- [aionui-panel] dock the floating expand button below the conversation header divider
- [pet] apply only the newest state poll response
- [git-graph] guard GraphDialog loads against out-of-order responses
- [git-graph] swallow SSE response stream errors instead of risking a host crash
- [liangshen] add win32 custom-bash path for phase-1 shell (Git Bash via subprocess seam) (#283)
- [describe-image] add interceptImageSend switch for image-send rewriting (#301)
- [aionui-panel] clear the git-poll race timeout once the round settles
- [git-graph] clear the status-poll race timeout once the round settles
- [liangshen] latch the Code Mode presentation switch only after it applies
- [live-stats] validate the new estimator spec before disposing the old projection
- [aionui-panel] dock the floating expand button at the collapse chevron spot
- [scripts] make runtime-deps-check actually scan lib files
- [community-plugins] keep shell metacharacters out of the install command
- [remote-web-ui] reject protocol-relative markdown link/image targets
- [aionui-panel] validate the drag payload before splicing it into the draft
- [aionui-panel] refuse delete/rename spellings that land on the workspace root
- [ssh] enforce the upload byte cap on the actual stream, not just content-length
- [ssh] make the documented mid-flight reconnect actually retry
- [ssh] stop one tunnel without killing sibling tunnels' shared connection
- [ssh] drop pooled connection and tunnels when a host is deleted or reconfigured
- [describe-image] dispose thinking-suffix test contexts between setups
- [pet] keep subagent sessions out of the bubble stack
- [aionui-panel] persist the clamped floating drag position (#374)
- [skin-center] clarify apply confirmation text for packaged installs (#359 #356)
- [remote-web-ui] follow tunnel state from the lan-required banner (#363)
- [aggregate,host] namespace bundle row ids and dedup host mounts
- [skins] scope managed patch to active profile (#304)
- [pet] keep session bubbles clickable by moving the hover panel beside the sprite
其他
- [archive] record the 2026-08-17 code optimization round
- [git-graph] share the status/branches snapshot plumbing
- [scripts] build the dsh-skin registry from skin.json files
- [scripts] share one family-package walker across four scripts
- [remote-web-ui] skip the fold's final re-sort when the list is already ordered
- [aionui-panel] make the TreeRow memo actually skip unaffected rows
- [aionui-panel] coalesce preview fs-change refreshes like the explorer does
- [aionui-panel] batch the git spawns in discard
- [ssh] share the fastPut/fastGet transfer body
- [community-plugins] make the generated categories array the single source
- [remote-web-ui] share writeJson and the bounded JSON body reader
- [describe-image] share the bounded stream-drain loop
- [readme] center the README TOC line
- [describe-image] share the byte-bound + sniff tail across loadImage branches
- [scripts] parse the diff once and reuse the module-level emoji regex checkEmoji allocated a fresh RegExp per added line (the exported EMOJI_GLOBAL_RE went unused) and staticReview parsed the whole diff twice (secrets + emoji). The emoji scan now matchAlls the shared regex and both checks share one addedLinesFromDiff pass.
- [scripts] name the settings-trio consumer list once in sync-shared
- [task-board] share one STATUS_KEY map between board and detail
- [remote-web-ui] drop the unused RenderMessage duplicate from App.tsx
- [web-ui-settings] scan the settings seam once per bridge request
- [web-ui-settings] drop unused expand/collapse/empty locale keys
- [liangshen] share countWord and drop the unused readEvents countWord was copy-pasted between tool-bootstrap.mjs and analyze-session.mjs (which already imports from the former); readEvents had no callers and buffered whole session logs while the streaming accumulator covers the same facts.
- [repo] reject docs-only PRs and drop doc-only contributors
- [git-graph] drop the unused toast.createSuccess locale key
- [aionui-panel] drop dead client code (empty ternary, toast timer, unused exports)
- [community-plugins] memoize the entry guard filter
- [live-stats] bound the unknown-block stringify instead of capping after
- [git-graph] probe branch existence with a single rev-parse
- [pet] keep one animation row table (rowOf) as the source of truth
- [pet] compute the sprite row/track once per animation, not per frame
- [remote-web-ui] probe the npm registry for family packages in parallel
- [aionui-panel] skip the parse-and-sort eviction sweep while under the cap
- [aionui-panel] O(1) busy/failed/expanded lookups in SCM row rendering
- [aionui-panel] cache the shell details handle instead of querying per frame
- [describe-image] key the semantic vision cache by a digest, not the base64 payload
- [remote-web-ui] read the mobile bundle from disk once per process
- [aionui-panel] stat before read so oversized files never enter memory whole
- [aionui-panel] guard the inline drag-handle z-index at the column layer (#234)
- [aionui-panel] disconnect the frame-wait MutationObserver after attach
- [ssh] cache the parsed host store by file identity
- [readme] sync contributor list from GitHub API [skip ci]
- [scripts] update sync-shared copy-count after adding the aionui-panel settings trio
- [task-board] cache never-matching cron repair verdicts between ticks
- [skin-center] rebuild client bundle with reordered registry
- [docs] drop the word-count budget gate
- [readme] sync contributor list via GitHub Action and drop stale CI gate note
- [archive] record the 2026-08-17 remote PR and issue triage round
- [archive] record the 2026-08-17b feature request round
- [aionui-panel] controller-level integration tests for maximize and floating drag (#315 #374 #292)
- [archive] record the 2026-08-17 skin PR triage round
- [skins] reject truncated tencent payload, document read scope (#209)
由发布管线自动生成(scripts/release-notes.mjs)。