Commit Graph

877 Commits

Author SHA1 Message Date
ZiyaZhang 525651d883 Merge remote-tracking branch 'upstream/master' into feat/web-inline-file-mentions
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-primitives/README.i18n.yaml
2026-08-07 09:50:43 -07:00
Yichen Jiang 27bb33e0f0 Merge remote-tracking branch 'origin/master' into worktree/web-theme-settings-integration-fde706
# Conflicts:
#	apps/web/tests/assembled-boot.ts
#	apps/web/tests/settings-chrome.e2e.ts
#	docs/module-graph.md
#	packages/client/runtime/tsconfig.json
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-08 00:21:45 +08:00
Tianyi Cui 698d65de2d Merge pull request #1965 from deepseek-harness/worktree/archive-agent-notes-aggressive-20260807
docs(notes): aggressively archive low-value records
2026-08-07 23:53:34 +08:00
Tianyi Cui 8315bfdc1f fix(notes): address archive review findings 2026-08-07 23:45:28 +08:00
Yichen Jiang 53c66ecbeb refactor(client): keep settings constants and schemas off the client contract surfaces
The /client entry of a UI plugin exports no values beyond what cordis
loading needs; the theme constants block returns to type-only re-exports,
the per-namespace schemas move into the shared *-settings modules instead
of widening the host entries, and same-package specs import those internals
directly per the export discipline in packages/client/AGENTS.md.
2026-08-07 23:30:04 +08:00
Yichen Jiang 638c9e4bd7 refactor(client): replace the per-field settings preference controller with a namespace settings scope
bindSettingsScope mirrors the Host-side settings owner seam in the browser:
one scope per namespace publishes a snapshot store (status, section value,
revision, writability, host/memory mode), validates sections against the
namespace's serialized wire schema via dsh-client-schema-form, and keeps the
controller's listener-before-read, revisioned serialized writes, latest-wins
publication, conflict recovery, and disposal quiescence. Theme, locale, and
busy-Enter services now take the scope as a constructor collaborator, which
removes the bindPersistence/syncPreference two-phase callback pair and the
defaulted no-op persist writers; hand-written wire guards fall away in favor
of the registered schema. test-runtime gains a stubSettingsScope double.
2026-08-07 23:25:42 +08:00
Tianyi Cui e901d9fcca Merge pull request #1785 from deepseek-harness/fix/update-explore-unknown-copy
fix(ui): update hero headline copy
2026-08-07 23:13:37 +08:00
Tianyi Cui 1c23f196fe fix(ui): use official hero title casing 2026-08-07 23:05:55 +08:00
Tianyi Cui db0133b4c7 docs(notes): archive low-value records 2026-08-07 22:52:19 +08:00
Yichen Jiang 6922a942a6 Merge remote-tracking branch 'origin/master' into worktree/persist-web-theme-settings
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 19:39:45 +08:00
imccyu 56208886a8 Merge pull request #1860 from deepseek-harness/worktree/default-model-persistence
feat: the composer model switch becomes the default for new sessions
2026-08-07 19:37:07 +08:00
Yichen Jiang a352425d82 Merge remote-tracking branch 'origin/master' into worktree/persist-web-theme-settings
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-theme/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 19:34:05 +08:00
imccyu c631236a08 Merge pull request #1859 from deepseek-harness/fix/hero-preview-badge
feat(web): change preview badge position
2026-08-07 19:29:54 +08:00
Yichen Jiang 209fb4d355 Merge remote-tracking branch 'origin/master' into worktree/default-model-persistence
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 18:18:40 +08:00
ZiyaZhang fe505e1e91 feat(web): a prose mention of a produced file opens it
The chatFileMentions service (provided by ui-deliverables beside its
turn-tail entry, reached via ctx.get) resolves inline-code tokens in the
closing message against the turn's produced locations: exact path or
unique basename links, ambiguity and unknowns stay inert. MarkdownText
gains the optional fileMentions seam — settled renders only, never
inside anchors.
2026-08-07 03:02:10 -07:00
imccyu 2efce69d79 fix(client): route turn-tail through chain selector 2026-08-07 17:15:27 +08:00
imccyu a6ae15c0f6 Merge remote-tracking branch 'origin/master' into feat/web-workspace-file-links
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/ToolRow.module.css
#	packages/host/apiproxy/src/native-path-opener.ts
2026-08-07 16:49:20 +08:00
Yichen Jiang 5a90eb41fb fix(ui-models): three faults the running app surfaced
**A hand-declared route must not offer a reasoning effort.** The earlier
commit read the create card's missing control as drift and added one. It
is the other way round: such a model has no reasoning capability — pi-ai's
installed catalog is what supplies one, and it ships nothing under the
route — so `resolveModel` throws UNSUPPORTED_REASONING_EFFORT for every
model on it and the whole provider drops out of the picker. Verified
against the adapter, not inferred. The create card no longer offers it and
the editor withholds it on the directory's `declared` bit, which is the
real bug: that control has always been wrong for these routes.

**A blocked composer locked the way out of the block.** Reusing the
no-workspace inert posture disabled the model seat along with everything
else, so the bar asked for a model while preventing the one control that
picks one. A block now rides its own `blocked` owner prop: the textarea,
send, commands, plan seat, and access chip all lock, and the model seat
alone stays live.

**A Provider ID could derive an illegal credential reference.** The card
accepted a digit-leading id, whose derived `123_API_KEY` then failed at
the credential seam with a raw regular expression the user cannot act on.
The id must now start with a letter, and a test pins the relation between
the two rules rather than the regex.
2026-08-07 16:45:50 +08:00
Yichen Jiang 2767d6fb47 Merge remote-tracking branch 'origin/master' into worktree/persist-web-theme-settings
# Conflicts:
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.i18n.yaml
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 16:45:23 +08:00
Yichen Jiang 0833b29f25 fix(web): persist general preferences in host settings 2026-08-07 16:43:59 +08:00
Yichen Jiang 3c81ac1212 Merge branch 'stack/agent-profiles-5-web-ui' into stack/agent-profiles-8-authoring 2026-08-07 16:22:09 +08:00
Yichen Jiang d13cb724ee Merge branch 'stack/agent-profiles-3-wire' into stack/agent-profiles-5-web-ui 2026-08-07 16:22:02 +08:00
Yichen Jiang 5ec13a23b3 Merge branch 'stack/agent-profiles-5-web-ui' into stack/agent-profiles-8-authoring
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 15:41:18 +08:00
Yichen Jiang df2d2adbb8 Merge branch 'stack/agent-profiles-3-wire' into stack/agent-profiles-5-web-ui
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-08-07 15:41:14 +08:00
Yichen Jiang bb43ff4f37 feat(ui): make a session that cannot send refuse to accept one
A default naming a route the Models page has since removed left the
composer saying 选择模型 while the input still accepted a message, which
then failed inside the adapter mid-turn.

`session.prompt` now refuses with `model-unavailable` before opening a
turn. That is the enforcement boundary: the method stays callable no
matter what a client disables. `session.models` reports the same fact as
`routable`, and ui-model pushes a block through the new
`ctx.conversation.blocks` registry so the bar renders the disabled
textarea it already renders without a workspace, carrying the blocker's
own reason. The push direction is forced — ui-model already depends on
ui-conversation, so ui-conversation cannot read it back.

The gate is `routable`, not "matches no advertised group": catalog
membership is advisory, so a route serving a model it stopped advertising
is missing from the groups yet perfectly usable, and `null` before the
first load never blocks so a slow Host cannot lock a working composer.

The scaffold gains a route-only adapter for fixture-less keyless
scenarios. Registering zero providers is a test artifact — every product
composition mounts one — and the goldens that froze the seat's fallback
label now show the model those scenarios actually route to.
2026-08-07 15:26:42 +08:00
Yichen Jiang a45beb1292 Merge branch 'master' into worktree/web-skill-tool-row 2026-08-07 15:06:42 +08:00
_Kerman 4ede2798fe fix(web): address review — placeholder key family, menu-open gate, plan precedence, note wording 2026-08-07 14:20:14 +08:00
_Kerman f79db87d8d Merge remote-tracking branch 'github/feat/web-queue-steer-all' into feat/web-queue-steer-tooltip
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-07 14:05:27 +08:00
Yichen Jiang 768e2e866f fix(web): keep skill row pairing client-local 2026-08-07 13:56:42 +08:00
_Kerman 1e759608f6 test(web): refresh steer-all goldens against merged master UI 2026-08-07 13:48:33 +08:00
fz 1f853d85cd Attribute reader scroll input through the observed-top ledger
ChatView's bottom-follow recognized only wheel gestures as reader input,
so touch panning, scrollbar dragging, and keyboard paging could not leave
the bottom of a streaming transcript. Replace the wheel listener with
device-agnostic attribution: a scroll position deviating from the
observed-top ledger of the last delivered or written scrollTop is reader
input. Adds keyboard-paging and touch-style fling e2e scenarios (red under
the old implementation) and the bilingual Agent Note triplet.
2026-08-07 13:44:49 +08:00
_Kerman 07854f017e Merge remote-tracking branch 'github/master' into feat/web-queue-steer-all
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-07 13:40:06 +08:00
Yichen Jiang 90734c188e Merge branch 'stack/agent-profiles-7-docs' into stack/agent-profiles-8-authoring 2026-08-07 13:39:41 +08:00
Yichen Jiang a184d9efde Merge branch 'stack/agent-profiles-4-settings' into stack/agent-profiles-5-web-ui 2026-08-07 13:39:40 +08:00
Yif 7a76365585 feat(web): restyle hero preview badge and grow wide-sidebar settings icon
The hero Preview tag becomes a superscript mono pill riding the title's
top-right (r24, bordered, business-tertiary fill), colored by the new
--dsw-alias-label-primary-bluish alias over --dsw-static-blue-900 — the
first design-owner-approved addition under the token-sheet authority
exception recorded in the ui-theme README. The expanded sidebar trigger
now uses the native 16px settings icon instead of the 14px asset.
2026-08-07 13:27:15 +08:00
Yichen Jiang 9264f383e6 Merge remote-tracking branch 'origin/master' into worktree/web-skill-tool-row
# Conflicts:
#	apps/web/tsconfig.json
#	tsconfig.host.json
2026-08-07 12:48:08 +08:00
NI0317 9597ff9bf7 feat(web): advertise whole-queue steering shortcut 2026-08-07 12:18:30 +08:00
_Kerman 156c284239 Merge remote-tracking branch 'github/master' into feat/web-queue-steer-all
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-07 12:03:44 +08:00
creatixchu aa831f4f5e Merge remote-tracking branch 'origin/master' into worktree/turn-tail-actions
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-07 11:55:53 +08:00
_Kerman 653e22bc50 test(web): cover empty-draft queue flush with a keyless replay scenario
Also pin the queue-item-not-found convergence arm through the hub and
document the repeated-trigger contract on steerQueue.
2026-08-07 11:55:46 +08:00
Yichen Jiang 3aa3212fd7 Merge branch 'master' into worktree/web-skill-tool-row 2026-08-07 11:37:34 +08:00
Yichen Jiang df5790919c Merge branch 'master' into worktree/web-skill-tool-row 2026-08-07 11:31:49 +08:00
Chinesezjc 0567727410 Merge remote-tracking branch 'origin/master' into feat/todo-multi-in-progress
# Conflicts:
#	apps/cli/config/base.cordis.yml
#	packages/client/ui-conversation/README.i18n.yaml
2026-08-07 11:27:24 +08:00
Jiaying Ding 9ac6acd7b6 Merge branch 'master' into fix/update-explore-unknown-copy 2026-08-07 11:21:40 +08:00
Jiaying Ding 67bd84b207 Merge branch 'master' into fix/update-explore-unknown-copy 2026-08-07 00:45:44 +08:00
Yichen Jiang 2b8a0a8cff feat(web): choose the agent preset on the new-session screen
The composer seat spent nearly all its life disabled: a session's
composition is fixed once a turn has run. Move the choice to the
new-session screen beside the workspace picker, where it still works,
and let the session header report what a running session runs.

The hero pick is staged rather than applied — that screen precedes the
session it belongs to. It lands when a session becomes current and is
still blank, which covers both the session a workspace connect creates
and the blank one it reuses; riding `sessions.create` would miss the
second. It is spent on first use, matching the workspace picker.

Fix the durability the header field claimed but never had: `agentPreset`
was declared on `SessionHeader` and dropped by the JSONL header line, the
SQLite sessions row, the derived query index, and the cold list
projection, so every resumed session came back composed from nothing.

Add the web e2e lane that would have caught it — the one lane that mounts
the shipped roster, which needed `cordis:group` in the scaffold's Loader
builtins, as `mountRootInclude` already registers.
2026-08-07 00:41:50 +08:00
Yichen Jiang a2ab09003f feat(web): pick a session's agent preset from the composer
A seat in the composer tool row, left of the model select, showing the preset
THIS session runs — its own recorded one, not the deployment default, because a
resumed session runs what it was created with. `SessionSummary` carries
`agentPreset` for that, alongside `cwd` and `origin`.

The switch exists only while the conversation has not started. After the first
turn the seat becomes a plain label rather than a disabled menu: a greyed
control reads as "temporarily unavailable", when in fact the choice is gone for
good. The seat never asks in that state, and the host refuses independently
with `agent-preset-locked`, so a stale client cannot slip one past it.

A rejected switch restores the previous value and surfaces the host's message
rather than leaving the seat showing something the session is not running.
2026-08-07 00:38:11 +08:00
_Kerman e4256a1684 feat(web): steer the whole queue with an empty-draft Cmd/Ctrl+Enter 2026-08-06 21:40:50 +08:00
ZiyaZhang f00a44fd44 refactor(web): move the produced-files row into its own plugin package
ui-conversation now owns only the conversation.chat.turnTail hole; the row,
its derivation, and its copy live in @deepseek-ai/dsh-client-ui-deliverables,
composed in or out by one cordis.yml line.
2026-08-06 06:21:19 -07:00
Yichen Jiang c16cad7c03 Merge remote-tracking branch 'origin/master' into worktree/web-skill-tool-row
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-08-06 20:41:13 +08:00