28 Commits
Author SHA1 Message Date
zhu1090093659 30ab8692a9 chore(sdk): advance the plugin cohort to 0.1.7-rc.2
Move every family manifest, the plugin scaffold and the shared workspace
package onto the 0.1.7-rc.2 cohort, together with the surfaces that state
the same fact:

- the dsh.engines.dsh floors and the matching @deepseek-ai/dsh host peers
- the release-age exclusion ledger and the two packageExtensions keys
- the root README badges, the CI/release mount-smoke pins and the
  docs/publish-prep.md and docs/plugins.md prose

Two rc.2 facts were verified against the published artifacts rather than
inferred from the version number:

- the shell's frozen static module table is unchanged (the same nine
  specifiers in the dsh-web-frontend rc.2 dist bundle), so
  shared/web-platform.ts keeps its list and only its provenance comment
  moves; the new dsh-client-shortcuts is an ordinary client plugin, not a
  static module
- @deepseek-ai/dsh-client-ui-primitives@0.1.7-rc.2 imports a further
  undeclared face, @deepseek-ai/dsh-util-code-language, so the
  primitives packageExtensions patch gains that pin

The satellite peer floors in pnpm-lock.yaml still read >=0.1.7-rc.1: they
belong to the satellite packages and move when those repositories release
the aligned version.
2026-09-24 22:26:05 +08:00
zhu1090093659 cdf79e8c44 fix(dsh-web-all): make shelled family rows configurable
A family row mounts the aggregate shell, so the row's Config belongs to the shell and
the Host settings surface served no form for it: a settings save on a family entry was
rejected with 'No configurable plugin entry', and the browser cards fell back to a
config form the host never served. The shell now declares Config = z.any().volatile():

- 'any' keeps the wrapped plugin's fields at the row config root, where a standalone
  install of that package keeps them, so one profile shape serves both mount paths and
  no family client needs a path prefix. scripts/aggregate.mjs emits that flat shape.
- '.volatile()' puts the entry on the settings surface at all (a schema with no volatile
  field is skipped) and admits a write to any path. The root-volatile update also goes
  through the live path: the Loader commits the new config into the running entry's
  reference and emits loader/volatile-update, and the shell re-mounts the family plugin
  with the committed config instead of remounting the entry.

The wrapped plugin's own schema still validates the values it receives, so a refused
value leaves that one row degraded rather than taking the boot down. The rebuilt lib/
replaces the superseded shell chunk, and the recorded fingerprint covers the new sources.
2026-09-24 16:54:50 +08:00
zhu1090093659 b4944353a5 refactor(scripts): drop the packages/skins root the satellites took
The skin, pet and community packages left this repository, so packages/skins/
never exists in a checkout of it. Every scanner that still walked it as a
second root did so defensively — family-packages.mjs and
coverage-gate.discoverPackages listed it first and guarded the walk with
existsSync, aggregate.mjs looked for a second aggregate manifest and a second
package index under it, e2e-mount-rewrite searched it for workspace packages,
and seven test files built fixtures under it. The walkers now name packages/ as
the single root and the fixtures and comments follow; modules that only carried
the root in a doc comment are reworded.

scripts/coverage-baseline.json loses the three packages no longer measured here;
its sixteen keys now name exactly the sixteen package directories on disk.

The in-repo fallback paths in scripts/market-build stay untouched: they are the
documented route for building from a checkout that still carries the packages,
and the fixture-based market-build tests populate them deliberately.
2026-09-24 09:48:23 +08:00
zhu1090093659 24dcb12c00 fix(test): tolerate a missing packages/skins root in the walkers
The extraction left packages/skins/ with no tracked file, so it does not
exist in a fresh clone: git does not carry empty directories. Two test
walkers still readdirSync'd the root unconditionally and died with
ENOENT in CI. A stale untracked skin-center/node_modules in the
development checkout kept the directory present and hid this locally,
which is why the failure only appeared on the runner.

Guard both walkers the way the shared family-package walker and
coverage-gate already do. Verified on a clone-like tree with the
directory removed: script tests, aggregate check, libs check, docs,
i18n, standards, the full suite, and the mount smoke all pass.
2026-09-24 00:02:11 +08:00
zhu1090093659 65de1ace9a chore(sdk): advance the plugin cohort to 0.1.7-rc.1
Move every consumed @deepseek-ai family specifier (272 across 23 manifests),
the dsh.engines.dsh floors and the matching @deepseek-ai/dsh host peers, the
plugin scaffold, the release-age ledger and the packageExtensions keys, the
desktop host payload pin with its regenerated hoisted lock, the root lock,
the CI and release mount pins, the README host badge, the cohort-version
source literals and the cohort prose in docs.

Regenerate the official token contract from the 0.1.7-rc.1 surfaces (293 to
299 names, additive, contractVersion stays 1) and verify the browser platform
seed against the rc.1 shell bundle. Harden the shell-isolation real-boot spec
so it only accepts an app-boot copy whose own non-optional peers resolve: this
cohort pulls an incomplete copy into the workspace for the first time, through
dsh-agent-preset-registry.

Record the cohort decision, the official release-notes and compare evidence,
the published-surface delta and the native-first overlap inventory in
.agents/notes/implemented/architecture/2026-09-23-sdk-cohort-0.1.7-rc.1.
2026-09-23 22:11:06 +08:00
zhu1090093659 ef637f657d feat(aggregate)!: remove dsh-doctor and dsh-tool-describe-image from the family
Both plugins are no longer useful and leave the family per owner direction.
The packages are deleted from the workspace; the aggregate drops their
patchFrom/deps rows and inactive entries, keeps one tombstone shell export
per removed id so old profiles degrade to an inert plugin instead of
ERR_PACKAGE_PATH_NOT_EXPORTED, and drops the stale retire block whose
target row the 0.1.7-alpha.2 host no longer mounts. The reference sweep
covers sync-shared targets and counts, the i18n audit, the ru dictionaries,
the web-settings allowlist, plugin-manager fixtures, the skin-center
semantic-attrs contract, the labeler, coverage baseline, lockfile, and
docs; desktop/runtime/profile-web stays pinned to the published 0.3.19
that still contains both packages.
2026-09-23 17:05:26 +08:00
zhu1090093659 66ba8ede6e chore(sdk): advance the plugin cohort to 0.1.7-alpha.2
Bump every @deepseek-ai family specifier (258 specifiers across 25
manifests), every dsh.engines.dsh floor (22 packages), cordis to ^4.0.4
and schemastery to ^3.18.4. Align the shared ledger, the desktop host
runtime seed (overrides, exclude list, regenerated lockfile) and the root
lockfile, plus the CI and release mount pins, the cohort-version docs and
the source literals that name the cohort.

The floors had been written as ">=>=0.1.7-alpha.2"; repair them to
">=0.1.7-alpha.2" so the family-engine regex gate passes again.

dsh-market/lib is rebuilt because its committed bundle embeds the resolved
cordis and schemastery paths; the Skin Center output is rebuilt in the
token-contract change that follows.
2026-09-23 15:45:08 +08:00
EDDYCRAZY-CC 5daf6942e6 chore(sdk): move the family to the 0.1.7-alpha.1 cohort on the permanent alpha branch
The official family published 0.1.7-alpha.1 while the alpha branch stood on
0.1.6-alpha.2, and the machine's DSH moved to the new cohort. Four changes in
the release reach this family:

- The settings subsystem is now keyed by the profile entry: ctx.settingsScope,
  SettingsScope* and SettingsProvider.installSection/register are gone, replaced
  by ctx.configForms, ConfigForm* and SettingsForms. Every family host half
  carries its settings on its own Config with volatile fields, every browser
  half binds through the webUiSettings service (which resolves a family
  namespace to the owning profile entry id and then binds natively, with the
  loopback bridge as the fallback), and the shared card/form layer speaks the
  new contract including its boolean refusal answers.
- The agent-preset domain became declarative: directory discovery is gone, a
  preset is a declaration a plugin registers at runtime. dsh-preset-center now
  declares installed presets from its host half (install = declare) and
  dsh-liangshen declares its own preset instead of syncing files into
  ~/.dsh/.agent-presets.
- Session V4 moved the tool-result failure flag to the message root; dsh-pet
  read the removed content block and silently rendered failed turns as
  successes.
- The client design system renamed its icons and reshaped SessionListState;
  the affected call sites and fixtures follow.

Cohort: every consumed @deepseek-ai/dsh-* range, the scaffold, the README
badges, the CI and release mount-smoke pins, the desktop runtime pin and both
lockfiles, and the docs move together; the vendor pins follow the cohort's own
release (cordis 4.0.3, cosmokit 1.8.4, schemastery 3.18.3,
cordis-plugin-include 1.0.8, cordis-plugin-loader 1.0.4). The workspace
packageExtensions restore @deepseek-ai/dsh-util-workspace-path, which
dsh-client-ui-primitives now imports from its emitted lib while declaring no
dependencies.

scripts/e2e-mount.sh, scripts/e2e-mount-rewrite and its test, and
scripts/publish-legacy-aggregate.mjs pass GNU tar --force-local on the
Windows/MSYS lane, where a C:\ output path is otherwise read as a remote host.

The mount smoke does not pass on this workstation: the local dsh CLI is a
symlink into a DSH checkout whose built lib/ predates this cohort's own
multi-file dsh.bundle.patch support, so profile boot crashes on the official
dsh-web-app array before any family row is evaluated. That is host-side build
staleness outside this repository; the lane passes once the DSH checkout is
rebuilt. Recorded with the rest of the decision in
.agents/notes/implemented/architecture/2026-09-22-sdk-cohort-0.1.7-alpha.1.md.
2026-09-22 22:18:38 +08:00
zhu1090093659 40f5f2927d chore(sdk): move the family to the 0.1.6-alpha.2 cohort on the permanent alpha branch
Adapt dsh-web to the experimental @deepseek-ai/dsh-* 0.1.6-alpha.2 cohort in the
same isolated alpha worktree and DSH home, so the accepted 0.1.5-rc.1 stable
environment, its profile tree and the global dsh CLI stay untouched.

Cohort: every consumed range, the plugin scaffold, the root README badges, the
CI and release mount-smoke pins, the desktop runtime pin and its lockfile, both
release-age exclusion lists and the desktop overrides block move to
0.1.6-alpha.2; the declared host floor becomes dsh.engines.dsh >=0.1.6-alpha.2.
cordis, cosmokit and schemastery keep their independent support pins.
@deepseek-ai/dsh-client-ui-workspace joins the repository exclusion list and the
packages that navigate gained it as a devDependency, because the family now
consumes it directly.

Adaptation of the SDK delta - the multi-instance Client Session model:
- SessionListState.current/currentAddress and SessionSummary.completed are gone,
  and ISessions.open()/openSubagent()/clear() are removed. View selection now
  belongs to the workspace UI, which owns the main-area reference and publishes
  it as retainedBy.mainView; navigation is ctx.uiWorkspace.openSession(target).
- shared/client/main-session.ts adds mainViewSessionId(byId), the catalog-level
  reading of that marker, and sync-shared copies it into the seven consumers.
  Ten call sites across eight packages read the removed faces; two of them
  (git-graph auto-isolation, session-archive) type-checked against local
  structural doubles and never appeared in the compiler's error list, so the
  inventory was built by searching for the removed names rather than by
  trusting tsc.
- dsh-task-board's framework-free controller port changes from a list snapshot
  to { current(), open(), subscribe() }; the wiring resolves current() from the
  marker. dsh-git-graph navigates new worktree sessions through the workspace UI.
  dsh-pet, dsh-plugin-manager, dsh-doctor, dsh-liangshen, dsh-session-id and
  dsh-session-archive read the marker instead of the removed selection.

Upstream packaging defect: dsh-client-ui-primitives@0.1.6-alpha.2 imports
simple-icons from its emitted lib/index.js while the published manifest still
declares no runtime dependencies; packageExtensions restores it at the exact pin
the official source resolves (16.31.0), beside the existing diff/shiki/micromark
restorations. No installed file is patched.

Native-first: no family row registers the new sidebar panel slots, and the
alpha.1 to alpha.2 slot-key comparison is additive only. dsh-plugin-manager
already extends the official Plugins section through settings.plugins.tab rather
than mounting a parallel page, and that stays the right native extension. The
aggregate declares no external npm plugin, so the new runtime plugin dependency
resolution has no external hard-binding to unmask. The inject contract records
dsh-client-ui-workspace as an approved inject module with its rationale.

Testing: pnpm typecheck, sync-shared:check, skin-center:check, community:check,
libs:check, build, test, test:scripts, test:desktop, runtime-deps:check,
aggregate:check, emoji:check, test:standards, docs:check, i18n:check and
market:check pass, and pnpm install --frozen-lockfile --ignore-scripts resolves
the lockfile. The alpha host in ~/.dsh-alpha is upgraded to 0.1.6-alpha.2 and
every profile @deepseek-ai copy is a symlink into it (235 ok, 0 warn, 0 fail);
dsh --profile alpha-web --dump-config composes the family rows with the retired
ui-settings-unarchive-sessions row.
2026-09-20 21:48:39 +08:00
zhu1090093659 f5377a495d chore(alpha): stop bundling dsh-better-sidebar
The plugin's 0.19.1 peers declare every consumed @deepseek-ai/dsh-* face
as ^0.1.5-rc.1, and a prerelease range only matches its own
[major,minor,patch] tuple, so the 0.1.6-alpha.1 cohort this branch
builds against satisfies none of them. The alpha branch therefore drops
the external right-panel plugin: aggregate.yml has no rows entry, the
aggregate package.json no longer depends on it, the release-age
exclusion goes away, and the regenerated cordis.patch.yml carries 20
rows / 19 workspace deps. The mount lane asserts the plugin is absent
instead of mounted, the mount tooling loses its better-sidebar tarball
override, and the READMEs, docs, publish-prep and the alpha Agent Note
record the standing divergence from dev. The isolated alpha home was
reinstalled and its stale links removed; dsh --profile alpha-web
--dump-config composes without a better-sidebar row.
2026-09-20 21:48:36 +08:00
zhu1090093659 2a43ce1248 refactor(session-archive): take over the official archived-sessions settings entry
Settings showed two near-identical first-level entries: the official
"Archived sessions" page (dsh-client-ui-settings-unarchive-sessions, section
id archived-sessions at order 25) and this plugin's own "会话归档管理" section
(id dsh-session-archive at order 152).

The settings shell renders one nav row per settings.section registration with
no id de-duplication, and a section can only expose extension points its own
owner declared through children. The official page declares none and is mounted
by the constant dsh-web-app roster, so a plugin cannot merge into it. The
consolidation is therefore a takeover plus a composition retirement:

- dsh-session-archive seats the official archived-sessions id at order 25, so
  the single entry keeps the position users already know and its arch.nav copy
  reads exactly like the official one. The section already opened on the
  archived view, and the inventory, batch archive/unarchive, cascade delete and
  auto-maintenance policies are unchanged.
- The aggregate gains a retire: manifest section that renders a bare
  "disabled: true" override naming a FOREIGN row id verbatim (never namespaced).
  scripts/aggregate.mjs validates that a retired id is non-empty, is not one of
  the aggregate's own rows, and is not listed twice.
- aggregate.yml retires ui-settings-unarchive-sessions.

Verified on the composed alpha profile: dsh --profile alpha-web --dump-config
prints "- id: ui-settings-unarchive-sessions / disabled: true" under
"# == @deepseek-ai/dsh-web-app, patched by @linxin666/dsh-web-all", so exactly
one archive settings entry mounts. Two tests pin the decision:
tests/section-identity.spec.ts asserts the seated id and order, and
scripts/aggregate.test.mjs asserts every retire entry renders a verbatim
disabled override.

A standalone install beside the official page still renders two entries; the
package READMEs now tell the user to disable one row, and the Agent Note records
that limit as inherent to the slot contract.

Full CI-equivalent gate sequence passes in the alpha worktree.
2026-09-20 21:48:24 +08:00
zhu1090093659 f1f409c193 feat(dsh-web-all): ship low-usage family rows disabled by default
aggregate.yml gains an inactive list: the generator renders trailing bare
disabled:true overrides for the listed own rows, so fresh installs never
load them and their settings entries stay hidden via the rows-route gating.
Users opt in per row in the plugin manager (the enable writes a user-layer
disabled:false override that wins over the bundle default). Initial list:
ssh, describe-image, liangshen, skill-explorer, doctor. Standalone packages
are unaffected.
2026-09-09 17:05:37 +08:00
zhu1090093659 7c497a135f refactor(perf)!: remove the built-in dsh-perf plugin
BREAKING CHANGE: the dsh-perf package, its aggregate rows, ru dictionary
namespace, CI labeler rule, and issue-template option are removed. The
session-persistence-jsonl tuning patch goes with it; installs fall back
to the stock harness row. The npm badge allowlist keeps the published
name so download totals are unchanged.
2026-09-04 18:36:26 +08:00
zhu1090093659 46d03a10bf chore(sdk): bump cohort to 0.1.2-alpha.4 and drop deprecated better-session
Manifest ranges move to ^0.1.2-alpha.4 across the family with minimumReleaseAgeExclude reconciled to the exact alpha.4 versions; the host floor moves with the cohort (dsh.engines.dsh >=0.1.2-alpha.4 across 21 family packages plus the plugin scaffold, the static README badge, and the @deepseek-ai/dsh@0.1.2-alpha.4 CI/release mount-smoke pins). The published delta brands session sequence numbers (SessionSeq / SessionLogOffset, Session.events replaced by eventAt/ownEvents, fork headers reshaped to isSeeded + inheritedEventCount), formalizes a v0-compatible browser wire header in dsh-api-session-controller, adds the keyed-hooks compartment to dsh-client-ui-slots, reworks the subagent continuation path, and removes the family-internal invariant helper. The only repository consumer is the dsh-pet test fixture, which now brands fixture sequence numbers through the exported SessionSeq() constructor.

The deprecated @morlay/better-session aggregate integration ships no more: the external row, its expanded sub-plugin rows and disabled overrides, the devDependency, the release-age exclusions, the patchedDependency with its patch file, and the scripts/dsh-better-session.mjs CLI are removed; the aggregate test flips to a negative guard. dsh-perf's Better Session card and native bsm core stay as the legacy-session migration surface.

The lockfile is regenerated once for both concerns. Full local gate sequence passes (typecheck, build, test, test:scripts, runtime-deps, aggregate, community, skin-center, docs, i18n). Notes: 2026-09-02-drop-deprecated-better-session-integration plus the cohort-note alpha.4 follow-up.
2026-09-02 09:19:09 +08:00
zhu1090093659 0055a359b3 feat(web-ui-all): re-add dsh-better-sidebar at 0.18.0-alpha.0
The alpha.2 cohort removal of @deepseek-ai/dsh-client-runtime took the
right panel out of the aggregate on 2026-08-30. Upstream shipped
0.18.0-alpha.0 (peers ^0.1.2-alpha.2, client inject renamed to
dsh-client-modules), so the aggregate row, package.json pin, and the
aggregate and mount-smoke assertions are restored at that exact version;
@mlgbnb/dsh-archive-manager stays excluded (latest 1.0.7 still imports
the removed face). Docs and the cohort notes are brought along.
2026-08-31 11:05:14 +08:00
zhu1090093659 5b1ea6c66d fix(web-ui-all): exclude alpha.2-incompatible external plugins from boot
The alpha.2 cohort removed the @deepseek-ai/dsh-client-runtime face that
dsh-better-sidebar@0.15.2 and @mlgbnb/dsh-archive-manager@1.0.7 hard-import;
on the host loader's strict import resolution they abort 'dsh web' boot.
Drop both rows and deps from the dsh-web-all aggregate (keep @morlay/
better-session, inactive) and flip the aggregate test to assert their
absence until upstream ships alpha.2 builds.
2026-08-30 23:33:30 +08:00
zhu1090093659 d46fb792ba feat(better-session-manager): opt-in card with automatic legacy migration
The inactive better-session integration was reachable only through a
repository checkout CLI and hand-edited profile YAML, with the storage-
switch warnings living far from the decision. A new public family package
(@linxin666/dsh-client-ui-better-session-manager) ships a Better Session
card under Settings -> Web Plugins: it declares the third-party origin on
the card, shows live posture plus both stores' counters, and gates
enable/disable behind confirm dialogs that carry the full trade-off list.

Enable runs the jsonl-to-sqlite migration first (child process; existing
store auto-backed-up; store bootstraps when absent) and only then writes
the managed override block into the boot profile's patch file - the hot-
reloaded user layer - so failures leave the profile untouched. The card
keeps no settings namespace: the patch layer is the single source of
truth shared by the card and the maintenance CLI, which now loads the
package-built lib/better-session-import.mjs instead of carrying its own
copy of the pipeline.

The importer core moved verbatim into src/core (drop/prune/dense-bridge/
head-cursor semantics mirrored from @morlay/session-rdb@0.0.11); package
vitest suite covers codec, projection, store writes, discovery across
naming eras, runImport e2e and block/posture logic (11 tests), while the
CLI node:test suite keeps argv/profile-write/status wiring coverage (3).
Aggregate grows to 20 rows / 18 deps with the active carrier row; all
better-session integration rows ship disabled as before. Gates: sync-
shared/typecheck/test/test:scripts/aggregate/docs all green; dump-config
confirms the new row activates while integration rows stay disabled.
Loading the new package requires one dsh web restart by the user.
2026-08-27 20:07:11 +08:00
zhu1090093659 ad8c3e08f9 fix(web-ui-all): drop harness patches from inactive external expansion
The first inactive rollout kept the bundle's own 'disable stock jsonl'
patch row and appended another disabled override behind it, assuming a
bare row can mark itself inert. Bare rows merge into the entry they
name, so both landed on session-persistence-jsonl and disabled the stock
persistence backend itself; every dependent entry stayed pending waiting
for sessionPersistence and boot failed with 9 non-activating entries.

An inactive external now contributes no harness patch rows at all -
their effects are simply omitted - while its insert rows keep shipping
defined-but-disabled via their own trailing overrides. Verified by
regenerated artifacts (single jsonl row remains, dsh-perf tuned and
active), aggregate --check, and script tests.
2026-08-27 20:07:11 +08:00
zhu1090093659 1a3c37e566 feat(web-ui-all): ship better-session inactive by default
Upstream @morlay/better-session swaps session persistence to an empty
SQLite store on mount, which hid every pre-existing jsonl session after
the first restart, and no importer exists upstream. The aggregate now
marks the external row inactive: the generator renders a trailing
disabled: true override behind each of its artifacts (the harness jsonl
disable patch and the three namespaced insert rows), so upgrades keep
serving sessions from the stock backend while the npm bits stay
installed. Manifest rows may declare inactive; types validated.

README pair documents the opt-in pros/cons and switch procedure,
publish-prep notes the pin stays required, and release-age excludes in
pnpm-workspace gain the explanatory comment. Verified by regenerated
artifact diff, aggregate --check (19 rows / 17 deps), script tests, and
dump-config showing all three morlay rows disabled while the stock jsonl
row stays active. Restarting dsh web restores the previous conversation
list.
2026-08-27 20:07:11 +08:00
zhu1090093659 d05bf03350 fix(web-ui-all): expand external plugin bundles and restore better-session 0.0.11
@morlay/better-session ships as a profile bundle (dsh.bundle.patch), so
writing its package name into an insert row made the loader import a
module that does not exist and dsh web failed to boot. The aggregate
generator now expands bundle rows: parsePatchBlocks accepts name-less
harness patch rows (preserving extra lines such as disabled flags),
insert ids stay namespaced, later bundle patches override earlier same-id
rows, and external children are resolved from the aggregate package.
link-profile.mjs links bundle child packages so profile-root imports
resolve. Upstream republished 0.0.11, pinned with release-age excludes.

Verified by aggregate --check (19 rows / 17 deps), test:scripts,
dump-config row shape, and profile-side resolvability; runtime effect
requires the user restarting dsh web.
2026-08-27 20:07:11 +08:00
zhu1090093659 76e92e540c chore(repo): rename product from dsh-web-ui to dsh-web
Display and source layers rename to dsh-web: GitHub slug, docs and prose,
aggregate package dir packages/dsh-web-all with npm name
@linxin666/dsh-web-all, settings package dir packages/dsh-web-settings,
private shared package dsh-web-shared, repo-local skill dirs, and the
docs banner asset.

Runtime, wire, and storage identifiers are frozen byte-identical so
installed profiles keep resolving with zero migration: web-ui-* bundle
ids, the dsh-web-ui-market settings section id, /api/dsh-web-ui-settings
and its proxy-token header, and the dsh-web-ui-telemetry-* storage keys.
Frozen history (docs/archive, docs/release-notes, archived notes), the
JAVA-LW fork reference, and local filesystem paths keep the old name.

npm migration: the next tag release dual-publishes @linxin666/dsh-web-all
alongside the final @linxin666/dsh-web-ui-all version, then the old name
is deprecated with a pointer; dual-publish lasts two releases.

Decision record: .agents/notes/implemented/architecture/2026-08-24-product-rename-dsh-web.md
2026-08-24 14:22:14 +08:00
EDDYCRAZY-CC b6fea32d4a refactor: remove retired dsh-skins package and dsh-aionui-panel host archive 2026-08-22 22:47:49 +08:00
zhu1090093659 2ae7d860c8 fix(scripts): refuse private workspace packages as aggregate deps 2026-08-22 20:04:49 +08:00
zhu1090093659 2877262f53 feat(dsh-web-ui-all): bundle community archive manager as external plugin 2026-08-22 10:34:24 +08:00
EDDYCRAZY-CC dffa05d65a feat(skin-center): live WebGL player for Wallpaper Engine scene wallpapers
- Structured MDLV model parser (header flag-driven vertex strides, u32
  indices, per-mesh material paths) replacing the heuristic byte scanner
  that produced shattered geometry on most 3D scenes
- Material-driven 3D rendering: blending/depth flags from material JSON,
  user-property colors (tint/tint2/userColors), jets/aurora/thunder/bg/
  neonsun/neongrid/cloudsbg shader replays, 3D sprites and starfield
  particles, static-camera flag for pathless scenes, planar-reflection
  floor via mirrored camera
- 2D layered scenes: object origin/scale/angles/alpha layout, padded-texture
  uvCrop, visible:false objects skipped, flowimage and flag shader passes,
  Bright/Power constants
- Web wallpaper shim delivers project.json property defaults after the
  page listener registers
- scripts: Windows path fixes (pathToFileURL, path separator regexes)
2026-08-19 23:30:07 +08:00
Menghuan1918 612dc36220 feat(web-ui-all): right-panel provider choice with mutual exclusion (aionui deprecated)
The aionui-panel settings card now chooses the right-panel provider instead of a
boolean switch: 'Use DSH-better-sidebar' (default; aionui is deprecated) or
'Use aionui-panel (deprecated)' (host schema + client gate + card select).

Mutual exclusion: better-sidebar >= 0.13.0 reads the aionui-panel namespace
and does not mount while aionui is selected (no changes needed here beyond
the dependency bump to ^0.13.0). aggregate.mjs supports external 'rows'
manifest entries only (the earlier config-patch mechanism is dropped).

Lockfile intentionally not updated yet: dsh-better-sidebar@0.13.0 must be
published first (PR omdsh-dev/DSH-better-sidebar#181), then pnpm install.
2026-08-18 01:12:40 +08:00
Menghuan1918 6684682490 feat(web-ui-all): integrate dsh-better-sidebar as the default right panel
The aggregate bundle now mounts the external npm plugin dsh-better-sidebar
(external rows section in aggregate.yml) and disables the aionui-panel row by
default in the bundle only (config patch enabled:false; standalone installs
keep their default-on behavior, the settings card stays available).

- scripts/aggregate.mjs: support optional rows (external insert rows) and
  patches (top-level config/disable patches) manifest sections; --check and
  aggregate.test.mjs updated (insert rows only are namespaced/unique).
- packages/dsh-web-ui-all: aggregate.yml rows/patches, generated
  cordis.patch.yml, dependency dsh-better-sidebar@^0.13.0.
- pnpm-workspace.yaml: minimumReleaseAgeExclude dsh-better-sidebar;
  allowBuilds node-pty.
- Docs: web-ui-all / aionui-panel / root READMEs (bilingual), publish-prep
  release order, AGENTS.md layout note.
- CI: plugin-mount job + scripts/e2e-mount.sh + tests/e2e/mount.e2e.ts
  (mount smoke: better-sidebar attached, aionui columns absent, no crash
  markers); playwright config and devDependency.
2026-08-18 01:12:40 +08:00
zhu1090093659 290a9d2372 fix(aggregate,host): namespace bundle row ids and dedup host mounts
Aggregate generator now rewrites child row ids to web-ui-* (stripping the
ui- prefix) and validates uniqueness, so installing the family bundle next
to a standalone plugin no longer trips the loader's duplicate-entry check.
A shared shared/host/mount-once.ts module (sync-shared synced into 12 family
packages) makes the host apply a no-op when the same plugin loads twice;
browser half is deduped by package name. Docs synced: root README FAQ,
web-ui-all README trio, plugins.md, packages/AGENTS.md; regenerated
dsh-skins and dsh-web-ui-all patches and skin-center lib; archived the
verification snapshot in docs/archive.
2026-08-17 08:27:32 +08:00