1080 Commits
Author SHA1 Message Date
imccyu abc0e7092b Merge remote-tracking branch 'origin/release/dsh-0.2.2' into merge/release-dsh-0.2.2-rc.1-to-master
# Conflicts:
#	packages/client/ui-agent-team/package.json
#	packages/client/ui-brand-official/package.json
#	packages/client/ui-open-in-app/package.json
#	packages/client/ui-settings-web-search/package.json
#	packages/experimental/agent-team-profile/package.json
#	packages/team/agent-team/package.json
#	packages/web/web-search-exa/package.json
#	packages/web/web-search-perplexity/package.json
2026-11-04 15:59:50 +08:00
imccyu 2f97f60455 release(dsh): 0.2.2-rc.1 2026-11-04 15:50:06 +08:00
liukx0205 78167faa4f Merge remote-tracking branch 'origin/master' into fix/web-prompt-retry 2026-11-04 15:34:17 +08:00
liukx0205 a186602dc3 Merge remote-tracking branch 'origin/master' into fix/web-prompt-retry
# Conflicts:
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/src/commands.ts
2026-11-04 15:29:20 +08:00
Turtleandimccyu 4731be7515 Merge origin/master into turtle/fork-name-suffix-5f3435925211
Co-authored-by: imccyu <[email protected]>
2026-11-04 14:16:25 +08:00
liukx0205 8706daa679 fix(web): deduplicate prompt retries after input acceptance 2026-11-04 13:37:53 +08:00
Yichen Jiang b0279fa8ae test: share continuation fixture across compiler faces 2026-11-04 12:53:54 +08:00
Yichen Jiang dde72c5af1 test: classify shared continuation fixture as client 2026-11-04 12:49:31 +08:00
Yichen Jiang 6f84e118b1 Merge remote-tracking branch 'origin/master' into worktree/continue-generation-after-failure
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-11-03 16:48:34 +08:00
Yichen Jiang 00fbab4c14 Merge remote-tracking branch 'origin/master' into worktree/continue-generation-after-failure
# Conflicts:
#	docs/persistence-schema.json
2026-11-03 15:28:52 +08:00
imccyu f590c13c92 Merge master into worktree-sync-dsh-0.2.2-to-master-1103b 2026-11-03 15:10:23 +08:00
Yichen Jiang bc98ceb69f test(api): include retry eligibility in default session summaries 2026-11-03 14:12:21 +08:00
Yichen Jiang 2fb4ea0bec Merge origin/master into worktree/continue-generation-after-failure 2026-11-03 14:08:46 +08:00
gengruilin d9d3b80fe3 Merge remote-tracking branch 'origin/master' into feat/mcp-manager-core 2026-11-03 13:37:58 +08:00
imccyu 1c78d475bf release(dsh): 0.2.2-alpha.3 2026-11-03 13:37:26 +08:00
gengruilin df078ddc82 Merge remote-tracking branch 'origin/master' into feat/mcp-manager-core 2026-11-03 13:31:23 +08:00
yudshj 3859913c68 feat(web): 网页搜索与获取设置页分开选择 Search 与 Fetch,Search 默认改为 DeepSeek Search API 2026-11-03 13:04:26 +08:00
imccyu 06bf7ce024 Revert "fix(settings): show saved API keys and preserve environment detection…"
This reverts commit 9bb49604b63bb5d50e879bcf63c9f5cb2afbd737.
2026-11-03 12:33:44 +08:00
imccyu ef5f28d0fb Merge master into worktree-sync-dsh-0.2.2-to-master 2026-11-03 11:47:40 +08:00
gengruilin 30bf5733d6 refactor(mcp-manager): publish the manager as ctx.mcpManager
The `ctx.mcpServers` key reads as a collection of servers, but the
service manages that collection, and ACP already uses `mcpServers` for
a plain server list. Publish the service as `ctx.mcpManager`, matching
the package name, the `mcp-manager/` event prefix, and
`ctx.pluginManager`. Remote endpoints become `mcpManager/*`; the class
keeps its name, McpServerManager.
2026-11-02 21:01:42 +08:00
gengruilin 62c6a2658d Merge remote-tracking branch 'origin/master' into feat/mcp-manager-core 2026-11-02 17:11:12 +08:00
imccyu d3f7b8abe7 Merge pull request #7701 from deepseek-harness/fix/empty-session-sidebar-0.2.2
[0.2.2] fix(session-projection): compute exactly the requested projections for hot session summaries
2026-11-02 17:05:09 +08:00
Yichen Jiang 998ebe4e74 fix(web): adapt retry rendering and projection tests to current types 2026-11-02 16:09:19 +08:00
Yichen Jiang fa9f77cc42 Merge remote-tracking branch 'origin/master' into worktree/continue-generation-after-failure
# Conflicts:
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-changes/historical-formats/README.i18n.yaml
#	docs/persistence-changes/historical-formats/README.md
#	docs/persistence-changes/historical-formats/README.zh.md
#	docs/persistence-schema.json
#	packages/api/session-controller/src/types.ts
#	packages/api/session-controller/tests/session-projections.host.spec.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/client/ui-conversation/README.md
#	packages/client/ui-conversation/README.zh.md
#	packages/client/ui-conversation/package.json
2026-11-02 16:02:18 +08:00
Yichen Jiang 818e8eced2 refactor(web): use empty retry user messages without loop changes 2026-11-02 15:58:09 +08:00
Magolor 8d0c3b4633 fix(settings): show saved API keys and preserve environment detection (#7695)
* fix(settings): show saved API keys in provider editors

* test(settings): retain DeepSeek environment detection states

* fix(settings): classify saved-key reads and align browser expectations

* test(settings): cover saved keys under derived references

* test(settings): verify saved endpoints and keys on provider requests

* fix(settings): preserve credential drafts without changing authentication
2026-11-02 15:00:19 +08:00
gengruilin be167ec989 Merge remote-tracking branch 'origin/master' into feat/mcp-manager-core 2026-11-02 11:43:57 +08:00
Dudu-0223 43c4919f86 merge: refresh ID-only Team UI from core master updates 2026-10-30 15:13:05 +08:00
Dudu-0223 71676cbc21 Merge master into the ID-only subagent and Team core 2026-10-30 14:57:57 +08:00
Dudu-0223 0eb1bb52e2 refactor(team): keep session UI and task tools keyed by IDs 2026-10-30 14:25:27 +08:00
imccyu 945006c984 perf(session): send one projection frame per committed event (#7587)
* perf(session): send one projection frame per committed event

* fix(session): deliver keys changed before a drive failure; address review

* perf(session): carry projection frame changes as key and val entries
2026-10-30 14:14:03 +08:00
Dudu-0223 11c02855e1 Merge master into subagent runtime stack base 2026-10-29 17:55:40 +08:00
gengruilin 79a33e3211 Merge remote-tracking branch 'origin/master' into feat/mcp-manager-core 2026-10-29 16:09:47 +08:00
Shigma 1aead808e2 chore(cordis): merge master into cordis-core-rc11 2026-10-28 17:27:40 +08:00
Turtleandimccyu 8818fdd2e0 docs(session-controller): document fork title limits
Co-authored-by: imccyu <[email protected]>
2026-10-28 15:35:43 +08:00
Turtleandimccyu 3be7d56c6d fix(session-controller): give repeated forks distinct titles
Fixes #7471

Co-authored-by: imccyu <[email protected]>
2026-10-28 15:22:54 +08:00
imccyu 00d541438b release(dsh): 0.2.2-alpha.2 2026-10-28 02:03:15 +08:00
imccyu 69c389ae11 release(dsh): 0.2.2-alpha.1 2026-10-28 00:00:58 +08:00
imccyu 873c68c15b feat(models): show model selector badges from the /models listing (#7027)
* refactor(llm-deepseek): share the /models listing machinery

Move the account route's `/models` request and decoding, its
credential-scoped listing cache, and listed-catalog resolution with the
version gate into the shared DeepSeek Messages library, so a second
route can follow the same listing. Names drop the account prefix, the
cache takes each access's endpoint settings with the call, and it gains
`invalidate()` for a forced reload. `isBuiltInCatalog()` recognizes the
catalog an uncustomized `models` setting resolves to.

The account route keeps its behavior; only its imports and the
override diagnostic wording ("model listing") change.

* feat(llm-deepseek-api-key): follow the official /models listing

While `models` equals the built-in catalog and the Messages origin is
https://api.deepseek.com, `deepseek-official` serves the official
`GET /models` listing, authenticated with the API key in `x-api-key`.
Loading, refresh, fallback, merging, and the client-version gate match
the account route: the first access waits up to `modelsTimeoutMs`, a
listing older than `modelsMaxAgeMs` refreshes in the background on the
next access, a failure keeps the last good listing or the built-in
catalog, and listed models this build cannot serve are refused before
network I/O.

A customized `models` list replaces the catalog and requests nothing.
Switching between a customized catalog and the listing discards the
cached listing, so Restore defaults reloads it on the next access.

Suites that boot the route on the official endpoint now answer the
listing themselves instead of reaching the network.

* docs: describe the official route model listing

Document when `deepseek-official` follows the official `/models`
listing, its timing fields, customization precedence, and the forced
reload after Restore defaults in the API-key README, the shared
transport README, and the provider guide. Record the decision in a new
Agent Note, keep the account note's statement of where the shared
listing code lives current, and regenerate the configuration catalog.

* test(llm-deepseek-api-key): pin the once-per-listing hidden-entry diagnostic

* docs: regenerate module and event graphs for the shared listing

* fix(llm-deepseek-api-key): report credential failures on the model request

On the official endpoint, `connect` waited for the listing view, whose
credential lookup rethrew a malformed key or a credential-store failure
before the agent loop recorded the prompt. A failed lookup now resolves
the connection from the current listing view, so `resolveAuth` reports
the failure on the model request and the turn keeps the prompt and the
failed attempt. A caller abort still rejects.

* docs(llm-deepseek-api-key): name which hidden listing entries are logged

* test: keep unit suites off the official model listing

Suites that boot the DeepSeek routes with a dummy or inherited key now
request `GET https://api.deepseek.com/models` on the official endpoint.
A unit-lane setup file rejects that request at once, so such a suite
serves the built-in catalog instead of reaching production or waiting
out the listing deadline on a network that never answers; suites that
exercise the listing answer `fetch` themselves. Other requests pass
through unchanged.

* feat(llm-deepseek): read tool_update from the model listing

Both DeepSeek routes now take a listed model's Messages tool update mode
from `api_capabilities.anthropic_messages.tool_update`, alongside the
system prompt mode. `in-history` and `addition-only` replace the
bundled mode; any other value reads as `leading-only` and removes it.
An absent or `null` mode keeps the bundled one, so a listing that does
not declare the field leaves `deepseek-flash` on `addition-only`.

`system_prompt_update: null` likewise keeps the bundled mode now; it
previously read as `leading-only`, which a serializer writing empty
values as null would have turned into a cache-unfriendly downgrade.

* fix(llm-deepseek): sync the built-in context window with the official listing

The official `/models` listing declares a 1,048,576-token context window
for `deepseek-flash` and `deepseek-v4-pro`; the built-in catalog said
1,000,000, a decimal-versus-binary mismatch. Both built-in entries now
carry the listed value, so offline starts and listing failures size the
context the same way the listing does. The Models page shows the exact
count for these rows, since 1,048,576 has no decimal K/M spelling.

`defaultContextWindow`, the fallback for model ids the catalog does not
describe, stays 1,000,000.

* test(llm-deepseek-api-key): reject the stubbed listing request with an Error

* test(cli): keep the built SDK smoke off the official model listing

The SDK profile's initialize now resolves the deepseek-official catalog,
which requests GET https://api.deepseek.com/models on the official
endpoint. With the smoke's fixture key that request answers 401 and the
route warns on stderr, so the test's empty-stderr assertion failed in the
e2e and snapshots lanes. Point the run at a loopback mock and assert it
received no model call.

* feat(llm): carry /models badges into the model catalog

The shared DeepSeek listing decoder reads an optional per-entry
`badge: { text, tone }`. Text is one literal or translations keyed by
lowercase language id with a required English entry, each trimmed to 1
to 12 characters on one line; tone is neutral, info, success, or
warning, and an absent or unrecognized tone reads as neutral. An absent
or null badge declares none; an unreadable one is dropped with a listing
problem and never hides its model.

resolveListedCatalog keeps the badges of offered models, both DeepSeek
routes attach them through catalogModelInfo, LlmRuntime.listModels
detaches them, and the Host model catalog forwards them as
ModelCatalogModel.badge. resolveModelInfo omits the badge, so no model
request, Session event, or model-facing tool carries it.

* feat(client): render catalog badges in the model selector

The composer model seat shows a catalog model's badge after its name in
the trigger, the root-menu value, and each option: a Tag in the badge's
tone whose text is resolved for the active locale through
ctx.locale.resolveText. A conversation.input.model.label contribution
replaces the name and badge together and receives the badge in its
owner props.

Remove ui-deepseek-model-label-1017, which hard-coded `1017` beside
DeepSeek-V4.1-Flash for two providers, and its Web bundle row. The badge
now comes only from the model listing, so the build ships none of its
own; the upgrade guide covers profile patches that still target the
removed row. The Web e2e replaces the fixed-badge case with replay
catalogs that declare literal and translated badges, and the replay
adapter validates and advertises a configured badge.

* feat(llm-deepseek): read model badges from client_metadata

Each /models entry now declares its selector badge under
client_metadata["deepseek-harness"].badge, keyed by the User-Agent product
token like client_requirements, so the public model fields stay unchanged
and later DeepSeek Harness fields join the same object. Every field under
client_metadata is ignorable: null at any level shows no badge, and a level
that is not an object drops only the badge with a diagnostic naming it.

* docs: record why the listing badge container is client_metadata

* fix(models): refresh listed badges in open selectors

* refactor(models): share listing cache lifecycle wiring

* docs(models): refresh listing event producer catalog

* fix(models): retain badges when listing refresh fails

* fix(models): validate badge text and preserve tags beside long names

* test(models): cover account listing automatic badge removal
2026-10-27 23:18:07 +08:00
imccyu 2de3029cc6 Merge pull request #7427 from deepseek-harness/fix/chat-landing
fix(chat): keep the transcript steady at Turn end and when steering lands
2026-10-27 22:16:47 +08:00
imccyu a1659120a3 fix(session-controller): retire a queued echo when its Inbox row is canceled
A queued echo now records its Inbox position like transcript and steering
echoes. Later splices move that position, so a canceled splice that removes
the row retires the echo even when no Inbox projection ever showed it, for
example when the Turn is stopped right after queueing. A claimed row still
waits for its admitted message, and the queue dock still hands the echo over
to the Host row it renders.

The fold-room e2e no longer samples the running status slide or the
`data-chat-tail-pinned` mark that this branch removed. It asserts that fold
room below a short answer takes the new Turn's growth without scrolling
through Turn end, that the room never grows back, and that the running
status only moves down.
2026-10-27 21:36:10 +08:00
imccyu ae07093132 fix(chat): keep the transcript steady at Turn end and when steering lands
Measured against 0.2.1-rc.4 and master with the frame-sampled motion matrix,
the transcript moved back and forth at Turn end and around input landing.
This keeps rc.4's landing behavior, master's steering layout, and fixes the
reversals that remain.

- Completion-time folding keeps the first visible surviving row still when
  work rows close at once, filling the gap with bottom space capped at half
  the scrollport, instead of letting the browser clamp the position.
- After the Session stops running, the running status keeps its tail slot
  hidden and silent until the Turn's actions row replaces it, so the tail
  does not shrink and grow back.
- A Turn's duration control takes its gap in one frame instead of sliding.
- A fold batch that takes over following for a content change absorbs
  growth outside the batch before its first frame.
- Steering lands at once under either fold timing: the running Turn keeps
  streaming above its echo, which a native animation would push down.
- The running status no longer slides below a Step's first output, and the
  column no longer carries `data-chat-tail-pinned`; the steering entrance
  keeps its animation.
- A queued prompt is accepted by its Inbox row as well as by its receipt,
  so the composer clears the draft in the frame the queue dock shows it.
- A queued echo waits for the Inbox projection instead of retiring on the
  durable splice, so the queue dock does not empty for a frame.
2026-10-27 20:44:52 +08:00
Yichen Jiang 8394a200b9 fix(models): refresh listed badges in open selectors 2026-10-27 14:53:23 +08:00
Yichen Jiang af086ad377 Merge remote-tracking branch 'origin/master' into worktree/pr-7027-badge-refresh
# Conflicts:
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
#	packages/client/ui-deepseek-model-label-1017/package.json
2026-10-27 14:38:36 +08:00
Yichen Jiang 40599db7c8 test(agent): verify retry control identity across SDK recovery 2026-10-27 12:11:22 +08:00
Yichen Jiang 156cd83eb8 Merge remote-tracking branch 'origin/master' into worktree/continue-generation-after-failure
# Conflicts:
#	packages/client/ui-conversation/README.i18n.yaml
2026-10-27 12:07:46 +08:00
Yichen Jiang 2e0c73a895 refactor(agent): record continuation as retry control input 2026-10-27 12:07:24 +08:00
_Kerman 89c5ea4d83 Merge latest master into xtr/trajectory-result-mode 2026-10-27 11:16:45 +08:00
Yichen Jiang 04f1a699ee fix(api): return the synchronous continuation admission promise 2026-10-26 22:49:03 +08:00
Yichen Jiang 53d4ed8f21 refactor(api): use canceled inbox splice semantics 2026-10-26 22:40:07 +08:00