Commit Graph
3218 Commits
Author SHA1 Message Date
Yichen Jiang 7a6b69ee25 Merge branch 'feat/plugin-mgmt-3-settings' into feat/plugin-mgmt-4-web 2026-09-08 17:34:07 +08:00
Yichen Jiang 464264aede Merge branch 'feat/plugin-mgmt-1-boot' into feat/plugin-mgmt-2-manager 2026-09-08 17:30:21 +08:00
Yichen Jiang 07878ae1d3 fix(app-boot): record user-disabled bundles in the profile manifest
`disableBundle` now moves a package from `dsh.profile.bundles` to
`dsh.profile.disabledBundles`, and `reconcileInstalledBundles` enables only
a bundle named in neither list, so an unrelated pnpm run never re-enables a
bundle the user turned off while an update that gives a dependency
`dsh.bundle` still activates it (the built-bin e2e scenario the previous
"new dependencies only" rule broke). The record goes when its dependency
does.

Also: `visitIdentifiedRows` in patch-rows owns the per-patch restatement
tracking that compose-stack and external-bundles had cloned (duplication
gate), and the probe spec's flood fixture retries short and EAGAIN writes
because the child's stderr pipe is non-blocking once tsx touched
process.stderr (the test raced the parent's drain).
2026-09-08 17:29:35 +08:00
Yichen Jiang f3f1c7a87d Merge branch 'feat/plugin-mgmt-3-settings' into feat/plugin-mgmt-4-web
# Conflicts:
#	packages/bundle/web-app/package.json
#	packages/client/ui-agent-preset/README.i18n.yaml
#	packages/client/ui-agent-preset/README.md
#	packages/client/ui-agent-preset/README.zh.md
#	packages/client/ui-settings-plugin-inventory/README.md
#	packages/client/ui-settings-plugin-inventory/README.zh.md
#	packages/client/ui-settings-plugin-manager/README.i18n.yaml
#	packages/client/ui-settings-plugin-manager/package.json
#	packages/client/ui-settings-plugins/README.i18n.yaml
#	packages/client/ui-settings-plugins/README.md
#	packages/client/ui-settings-plugins/README.zh.md
2026-09-08 17:02:09 +08:00
Yichen Jiang bb408abe28 Merge branch 'feat/plugin-mgmt-1-boot' into feat/plugin-mgmt-2-manager
# Conflicts:
#	apps/cli/src/bin.ts
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/api/remotes/src/client/index.ts
#	packages/boot/app-boot/src/index.ts
#	packages/boot/app-boot/src/profile.ts
#	packages/host/README.i18n.yaml
#	packages/host/README.md
#	packages/host/README.zh.md
#	scripts/verify-package-readme-model-experience.ts
2026-09-08 16:52:09 +08:00
Yichen Jiang 5a9e1760fd Merge remote-tracking branch 'origin/master' into feat/plugin-mgmt-1-boot
# Conflicts:
#	apps/cli/src/dump-config.ts
#	apps/cli/src/profile-boot.ts
#	docs/capability-seams.i18n.yaml
#	docs/capability-seams.md
#	docs/capability-seams.zh.md
#	packages/boot/app-boot/src/profile.ts
#	packages/util/launch-environment/tests/launch-environment.spec.ts
#	scripts/check-workspace-constraints.ts
#	scripts/gen-cordis-catalog.ts
2026-09-08 16:42:34 +08:00
Yichen Jiang af2ebda892 test(web): compose the scaffold's stack with its user-disabled rows
The profile runtime reads user-disabled rows from the committed composition
now, so the e2e scaffold's stack carries the empty set and no longer hands the
runtime a patch reader.
2026-09-08 16:32:20 +08:00
Yichen Jiang dcbac5ebf2 Merge branch 'feat/plugin-mgmt-3-settings' into feat/plugin-mgmt-4-web
# Conflicts:
#	packages/boot/app-boot/src/probe.ts
#	packages/boot/app-boot/tests/probe.spec.ts
2026-09-08 16:25:29 +08:00
Yichen Jiang 731804affc Merge branch 'feat/plugin-mgmt-1-boot' into feat/plugin-mgmt-2-manager
# Conflicts:
#	packages/boot/app-boot/README.i18n.yaml
#	packages/boot/app-boot/README.md
#	packages/boot/app-boot/README.zh.md
2026-09-08 16:23:03 +08:00
Yichen Jiang 20102bcd52 fix(boot): commit user-disabled rows with the composition and name a user row's trust
The runtime's user-disabled row ids now come from the committed composition —
composeProfileStack collects them from the user layers it composed — so a
rejected or half-written patch file no longer makes the list disagree with the
running tree or fail to parse. The inventory attributes a row disabled through
a group the user disabled to the user, through the shared userDisablesEntry
walk, and lists a user-layer row the composition left out under the new user
trust instead of builtin.
2026-09-08 16:13:03 +08:00
Kaige-Gao babf22b4cf Merge pull request #3557 from deepseek-harness/slash-command-i18n
feat(web): localize slash command descriptions
2026-09-08 15:38:00 +08:00
lsdsjy 0707f4af3e Merge pull request #3700 from deepseek-harness/fix/open-in-app-ssh
fix(open-in-app): hide workspace app actions over SSH
2026-09-08 14:11:41 +08:00
Kaige-Gao aed565f382 Merge master into slash-command-i18n 2026-09-08 13:32:55 +08:00
Tianyi Cui 0bb083d898 Merge pull request #3646 from deepseek-harness/fix/pr-ci-reliability-20260906
fix(ci): 隔离临时存储并稳定测试夹具
2026-09-08 13:06:58 +08:00
Yichen Jiang fc20624b69 Merge branch 'feat/plugin-mgmt-3-settings' into feat/plugin-mgmt-4-web 2026-09-08 12:55:08 +08:00
Yichen Jiang 080e22ee03 feat(plugin-manager): keep pnpm's colours and name the command on install-log chunks
The installer now decides pnpm's colouring per consumer: the Web host keeps
colours on for the install dialog's terminal, the CLI turns them on only when
stdout is a terminal, and a plain log strips what a colour=always pnpm still
prints. Every chunk carries the argv it came from, so a renderer can label
each pnpm run.
2026-09-08 12:52:45 +08:00
mektpoy 0dc6ce26d7 Merge remote-tracking branch 'upstream/master' into issue-1424-goal-resume-activation 2026-09-08 12:48:51 +08:00
Turtle dfae5f0351 Merge pull request #3686 from deepseek-harness/turtle/from-default-profile
feat(cli): create custom profiles from shipped templates
2026-09-08 12:45:58 +08:00
lsdsjy 5b8c8b781f test(open-in-app): scope SSH snapshot to the session header 2026-09-08 12:43:55 +08:00
lsdsjy a8d960ecb6 Merge master into fix/open-in-app-ssh 2026-09-08 11:37:46 +08:00
lsdsjy 28d478a80d Merge pull request #3681 from deepseek-harness/fix/busy-send-button-follows-setting
fix(web): make the running Send button follow the busy-Enter setting
2026-09-08 11:35:25 +08:00
lsdsjy 7f47954cad fix(open-in-app,directory-picker): share inherited SSH detection 2026-09-08 11:32:36 +08:00
mektpoy 514f92ba53 Merge remote-tracking branch 'upstream/master' into issue-1424-goal-resume-activation
# Conflicts:
#	packages/goal/goal/tests/projection.spec.ts
2026-09-08 11:23:08 +08:00
Yichen Jiang acbb8e0a06 feat(web): group the plugin list by packs and plugins, and quiet the row states
The list splits into Plugin packs and Plugins, each with its count, in
place of one Installed group; a library counts among the plugins. Retry
and uninstall close a package's page at its bottom-right as outlined
buttons, uninstall in red. A row that is off says so in two words: Off
when the person switched it off, Off by default when the pack keeps it
off; the reason it cannot be switched on stays on the locked switch.
2026-09-08 10:54:31 +08:00
Yichen Jiang 2df9414138 feat(web): style a pack's rows as entries and drop the done notice
Each row on a package's page is an entry: a plugin icon, the row id over
the module it loads, its state with a dot at the right, then its switch;
rows sit on the page ground one hairline apart, so they read on a white
page too, where the filled bars vanished. A failure keeps its own line
under the entry. The modules a plugin declares addable read the same way.

A finished enable, disable, retry, uninstall, or added row no longer posts
a notice: the re-read list shows the new state, and only a restart the
change waits for, or a failure, has something to say.
2026-09-08 10:36:53 +08:00
Yif 0ffbd65843 test(web): follow hero headline nesting and Tool definitions copy in e2e 2026-09-08 01:42:35 +08:00
Yifffan 7005d500b4 Merge branch 'master' into fix/input-placeholder-stat-ui-polish 2026-09-07 19:18:33 +02:00
Yif 256afa848c Merge remote-tracking branch 'origin/master' into fix/input-placeholder-stat-ui-polish
# Conflicts:
#	packages/client/ui-chat/src/client/locale.ts
#	packages/client/ui-chat/tests/gate-branch-tails.client.spec.tsx
2026-09-08 00:45:29 +08:00
Yif 2c45dfe71e fix(client): address review — pill accessible names, static untimed pill, exclusive stat dialogs
StatsPills buttons carry explicit aria-labels separating segments with
' · '; a log with no timed figure renders the counts pill as a static
reading instead of a button opening an empty dialog; the pills row owns
one exclusive open slot so sibling dialogs never stack. ContextMeter
restores the '~' approximation prefix (usedTokens prefers heuristic
projectedTokens). ModelSelect's jscpd:ignore now names the real gap
(useAnchoredPosition places from the left edge only). The pills Agent
Note's stale facts (locale keys, context occupancy, golden ownership)
are rewritten in place, en+zh. plan-review.e2e.ts parks the pointer
after Approve so the ContextMeter tooltip cannot leak into the aria
captures; affected goldens refreshed.
2026-09-08 00:35:04 +08:00
Tianyi Cui e73906d06f test(web): await seeded workspace membership before selection 2026-09-08 00:28:25 +08:00
Tianyi Cui ccb861d0e2 Merge branch 'master' into fix/pr-ci-reliability-20260906 2026-09-08 00:23:08 +08:00
Yichen Jiang 483e6b4920 feat(web): give every plugin package its own page
A card keeps the summary — name, one-liner, tags, its switch or Add to… —
and opens the package's page behind a crumb, as a preset card opens its
detail page: the version and source; a pack's rows as a list, every row on
one line with its state, its failure when one is recorded, and its switch
where the pack is switchable, with a filter past ten rows; the built-in
rows the pack changes; the modules the package declares addable, each
saying where it is composed, with an Add to… of its own; and retry and
uninstall. The expanded card and its component chips are gone with it.
2026-09-08 00:20:07 +08:00
Yichen Jiang f4f734964a feat(web): switch a plugin pack's components one by one
Each component chip of an external pack composed on a live-reload profile
carries a Switch that calls plugins.setRowDisabled against the profile's
global user layer: off writes `disabled: true` for the row id, on deletes
the key, and the tree recomposes at once while the rest of the pack keeps
running. A component the pack itself keeps off is locked with the reason,
since the user layer only denies; a failing component can be switched off;
a row another layer owns has nothing to switch. Built-in packs, packs that
are off, and profiles that apply patches at their next start keep the
read-only chips. Only the row with a write in flight goes inert.
2026-09-07 23:51:40 +08:00
imccyu 4a60189a63 fix(layout): prepare destination widths before fullscreen retreat 2026-09-07 23:00:56 +08:00
imccyu 77690644b5 fix(sidebar): show full file paths and refine split and fullscreen controls 2026-09-07 22:37:45 +08:00
Yif e939a482e9 Merge origin/master: reconcile placeholder rewording with steer-all and note archival
Master archived three Agent Notes this branch had fact-updated (archived
copies restored to their frozen master content; the pills note now links
the archived path), extended the steer-all placeholder to continuable
children (spec and subagent e2e take master's behavior with this branch's
reworded copy), and dropped the session-sharing sentence from feedback
acks (goldens re-refreshed with the new placeholder).
2026-09-07 22:01:06 +08:00
imccyu fe5aee7e71 test(web): cover Sidebar interactions and refresh recorded UI expectations 2026-09-07 21:29:42 +08:00
imccyu 508831624f chore(web): assemble Sidebar domains and register workspace packages 2026-09-07 21:29:41 +08:00
_Kerman b0a7d2ce3b Merge pull request #2672 from deepseek-harness/xtr/durable-inbox-recovery
refactor(agent): keep projection-backed Inbox loop-internal
2026-09-07 21:24:32 +08:00
Yif 3997f36999 feat(client): replace the stats strip with two icon pills and click-open stat dialogs
The A/B winner over the single-line StatsLine: a gauge pill (counts + TPS,
opening the session-stats dialog) and a database pill (billed total +
cache-hit share, opening the exact token-usage dialog), sharing a new
stat-dialog module. StatsLine and its dead locale keys are deleted, the
gauge icon is optically centered, and the composer keeps its 4px clearance
through the data-composer-stats contract. Agent Note added; stale
StatsLine references across implemented notes updated in place.
2026-09-07 20:59:19 +08:00
Turtle 267d2f8eb9 Merge remote-tracking branch 'origin/master' into turtle/from-default-profile
# Conflicts:
#	apps/cli/README.i18n.yaml
#	apps/cli/README.md
#	apps/cli/README.zh.md
#	packages/boot/app-boot/README.i18n.yaml
#	packages/boot/app-boot/README.md
#	packages/boot/app-boot/README.zh.md
2026-09-07 20:53:53 +08:00
Turtle 2555474a7d refactor(cli): simplify profile option forwarding 2026-09-07 20:47:47 +08:00
Turtle 7a7b7d5a53 fix(cli): make profile template creation exclusive 2026-09-07 20:46:40 +08:00
_Kerman 0348599f04 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2672
# Conflicts:
#	docs/event-producer-consumer.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/acp/acp/tests/harness.ts
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/README.md
#	packages/api/session-controller/README.zh.md
#	packages/api/session-controller/tests/commands-queue-attachment.host.spec.ts
#	packages/context/agent-instructions/tests/agent-instructions.e2e.ts
#	packages/fs/tool-fs/tests/harness.ts
#	packages/preset/agent-presets/tests/invariant.spec.ts
#	packages/preset/agent-presets/tests/mount.spec.ts
#	packages/preset/agent-presets/tests/remote.spec.ts
#	packages/test-support/agent-loop-testkit/package.json
2026-09-07 20:22:24 +08:00
Turtle dd25e1e6b3 feat(cli): create profiles from shipped templates 2026-09-07 19:58:41 +08:00
07akioni 016af7c67b Merge release 0.1.3-alpha.2 and reconcile desktop composition 2026-09-07 19:49:36 +08:00
07akioni 8d0d729091 Merge master native containment updates into feat/electron 2026-09-07 19:45:55 +08:00
Tianyi Cui 98c043ab0f Merge branch 'master' into fix/pr-ci-reliability-20260906 2026-09-07 19:44:51 +08:00
Yichen Jiang e379fa8bdd release(dsh): 0.1.3-alpha.2 2026-09-07 19:27:06 +08:00
lsdsjy 9a5ed6fb60 fix(web): make the running Send button follow the busy-Enter setting
The ui-conversation.busyEnter setting selected Queue or Steer for plain
Enter only; the running draft's Send button always submitted through the
public InputActions.submit() face, which is fixed to Queue, while labeled
"Send message". A user who chose Steer got Steer from Enter and Queue
from the button beside the same draft with nothing explaining why.

InputBar now resolves the primary click through the same `enter` gesture
and steer-availability predicate as the keyboard path (ordinary Sessions
and continuable children) and submits via ComposerKeyboard.submit(mode).
While that delivery is available the button's tooltip and accessible name
state it ("Queue message" / "Steer message"; 排队发送 / 插话发送), so the
mode is never hidden; idle sessions, one-shot children, and locked
composers keep the plain Send label. The composer bar inject face
publishes the live preference as hooks.busyEnter instead of a resolver
closure, and resolveSubmitMode is a pure function taking the preference
explicitly, so label and delivery derive from one value in one render and
the label follows live Settings changes. The Settings row is retitled
"Send behavior while busy" with a description that names both Enter and
the button; the busyEnter field, its default, and the Host schema are
unchanged.

Tests pin both preferences on the running button for ordinary sessions
and continuable children, the live relabel, the idle Queue path, and the
pure resolver; the settings-chrome ARIA goldens and the live-interactions
running-draft and queue-actions failed goldens carry the new copy. A new
Agent Note owns the decision and reverses the pointer-ignores-preference
clause of the archived 2026-08-20 running-draft note.
2026-09-07 19:14:21 +08:00