Commit Graph
855 Commits
Author SHA1 Message Date
Dudu-0223 c49c4f11de Merge master into subagent tree stack and reconcile fixtures 2026-10-25 15:24:45 +08:00
creatixchu cf65ee6e01 Merge master into bundle Host platform support 2026-10-25 11:58:20 +08:00
CreatixChu 17b13383af fix(plugins): 默认隐藏 CUA 并保留已启用用户的管理入口 (#7068)
* fix(plugins): temporarily hide the CUA bundle

* test(plugins): update expectations for hidden CUA

* fix(cua): preserve management for enabled bundles

* test(cua): cover default-hidden activation and retained details

* test(cua): verify installed state survives disabling

* test(cua): use the native provider display name
2026-10-23 22:54:03 +08:00
creatixchu 82bbf85894 fix(plugins): report unsupported bundle activation and address review 2026-10-23 13:15:05 +08:00
creatixchu 2e0cc478e8 Merge master into bundle Host platform support 2026-10-23 13:12:09 +08:00
Dudu-0223 e16f966470 Merge origin/master and align subagent UI locale keys 2026-10-23 12:49:41 +08:00
imccyu b049cd257c Merge pull request #6980 from deepseek-harness/07akioni/more-locales
feat(i18n): add Spanish, French, German, Russian and Portuguese
2026-10-23 11:22:55 +08:00
imccyu 261f2db185 Merge master into DSH 0.2.1 navigation and model listing sync 2026-10-22 23:22:35 +08:00
07akioni 07ef8a20b8 Merge master and sync plugin index translations 2026-10-22 22:24:15 +08:00
Yichen Jiang c48f8523f2 feat(llm): follow the official /models listing on the DeepSeek API-key route (#6944)
* 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.

* test(llm-deepseek): compose the malformed-key turn without the native executor

release/dsh-0.2.1 predates @deepseek-ai/dsh-tool-executor-native; its tool
runtime executes tools itself. Compose the official-route turn the way
account-routing.spec.ts does on this branch.

* fix(llm-deepseek-api-key): gate nothing when the credential lookup fails

The listing cache switches scope only after it reads a credential, so a
failed lookup left `connect` serving the previous credential's listing.
After a key whose listing refuses a model was replaced by a malformed one,
`admit` refused that model with CLIENT_UPGRADE_REQUIRED before the turn
recorded the prompt, instead of `resolveAuth` reporting the credential
error on the request. Serve the built-in catalog without listing gates
when the lookup fails.

* test(llm-deepseek-api-key): pin the once-per-listing diagnostic across request preparation

The hidden-entry diagnostic test repeated the same discovery assertion to
prove a second pass reports nothing new, which read as a duplicate. Assert
the single warning after the request preparations instead; they resolve
the same listing, so dropping the per-listing deduplication still fails
the test.

* docs(llm-deepseek-api-key): note that a list matching an earlier built-in catalog counts as customized

Customization is judged against the running version's built-in catalog,
so a saved `models` list equal to an earlier version's catalog stops
following the listing once the built-in catalog changes, until Restore
defaults. Record the consequence in the Agent Note and the README's known
limitations.
2026-10-22 20:42:19 +08:00
Turtle 5b0e089f40 fix(plugin-market): present custom plugin markets as custom plugin indexes 2026-10-22 20:19:30 +08:00
07akioni 84edeadc2b feat(i18n): add Spanish French German Russian and Portuguese 2026-10-22 19:53:52 +08:00
Dudu-0223 21bd0789ec Merge master and preserve parent-message settlement deduplication 2026-10-22 17:33:12 +08:00
Feiyu Xia 904a1caa2d Merge pull request #6664 from deepseek-harness/feat/mobile-input-viewport
fix(client): improve mobile input focus and caret scrolling
2026-10-22 15:58:15 +08:00
Dudu-0223 16ece34568 Merge master into subagent tree branch 2026-10-22 13:33:16 +08:00
imccyu 9fb3a064ea Revert "fix(client): 将模型发布标记改为蓝色纯文字" (#6936) 2026-10-22 13:21:40 +08:00
yudshj ca575ff573 refactor(client): fade clipped selector text with CSS only
Replace the FadeText measuring component with a self scroll timeline: it is
active only while a box overflows, so the end mask applies to clipped text
alone. Browsers without scroll-driven animations keep the ellipsis.
2026-10-22 12:48:28 +08:00
yudshj 652747423c fix(client): fade clipped model selector text instead of ellipsizing
Model and effort text in the composer trigger, root menu values, and option
rows now clips and fades over its last 24px while it overflows, following the
measured-clip mask used by dockkit tab titles and PathLabel.
2026-10-22 12:48:28 +08:00
yudshj a6aaac3ce6 fix(client): render model release as blue inline text 2026-10-22 12:48:28 +08:00
Saafo da54bbf3b0 🔀 Merge master into mobile input adaptation 2026-10-22 12:01:42 +08:00
Turtle 3e5deca05d Merge remote-tracking branch 'origin/master' into turtle/plugin-sticky-header-29bfdb179e18
# Conflicts:
#	packages/client/ui-primitives/README.i18n.yaml
2026-10-22 11:37:26 +08:00
Magolor 4527424c51 Merge master into model-order and resolve documentation pairing 2026-10-22 00:19:49 +08:00
Kaige-Gaoandimccyu 0778dec09f feat(ui-user-questions): show answered batches as shared message bubbles (#6362)
* feat(ui-user-questions): show answered batches as shared message bubbles

* refactor(ui-primitives): share clipboard confirmation lifecycle

* test(web): include answered question bubbles in steering goldens

* fix(ui-user-questions): keep answered turns collapsible

* test(ui-user-questions): drop the removed compactAnswer expectation

master removed ChatTurnProcessPresentation.compactAnswer in aaeb344
("fix(chat): keep the reply gap on a folded final answer"); reply spacing
now comes from the adjacent-row rules. The rebase left this assertion
behind, so the parametrized replay/live/prepend cases failed on every CI
coverage lane even though typecheck stayed green: toMatchObject accepts
the stale property.

* fix(ui-user-questions): address answer bubble review feedback

* test(web): observe file card styles after both cards mount

---------

Co-authored-by: imccyu <[email protected]>
2026-10-21 23:44:02 +08:00
Magolor dae4bfa413 feat(settings): use a three-line model reorder handle 2026-10-21 20:11:39 +08:00
Turtle 1203a3151e Merge remote-tracking branch 'origin/master' into turtle/plugin-sticky-header-29bfdb179e18
# Conflicts:
#	packages/client/ui-plugin-manager/src/client/index.ts
2026-10-21 19:21:21 +08:00
Turtle c408ae1390 test(plugin-manager): pin the title-only header motion away from font-dependent widths
Linux CI lays the title-only header at 470px with the actions beside the
title, while macOS wraps them, so that width depends on the platform
font. The title-only case now records 1280, 600, and 390px; the tabs case
keeps all four widths.
2026-10-21 18:59:23 +08:00
Magolor c10533a6ea feat(settings): support reordering provider models 2026-10-21 18:49:34 +08:00
Turtle a3b26c896b Merge remote-tracking branch 'origin/master' into turtle/plugin-sticky-header-29bfdb179e18 2026-10-21 18:21:31 +08:00
Tianyi Cui 84cfd5f76d Merge master 98fb6ddd into session-copy-markdown
Integrate exact origin/master 98fb6dddb86a9f631054417d48bfc07c06e95a68. Adopt master's canonical narrow-layout overflow probe instead of the branch-local equivalent. Preserve Session Markdown copy, source-path metadata, and locale integration.
2026-10-21 18:10:46 +08:00
Tianyi Cui 7a3c24738e Merge master b9bdd062 into session-copy-markdown
Integrate exact origin/master b9bdd062c8ffd3dc234ebea7f5dff55ff26d87ad. Preserve the Session Markdown copy lifecycle and dictionary while adopting the Japanese locale, regenerate the client slot catalog, and add the Japanese quote-removal string required by the merged locale type.
2026-10-21 17:10:56 +08:00
07akioni bec62b10f6 test(web): refresh localized translator component snapshots 2026-10-21 17:09:03 +08:00
07akioni 11295990b5 fix(i18n): cover nested metadata and repair locale CI regressions 2026-10-21 17:00:42 +08:00
Turtle da7a582491 Merge remote-tracking branch 'origin/master' into turtle/plugin-sticky-header-29bfdb179e18
# Conflicts:
#	apps/web/tests/plugin-manager.e2e.ts
#	apps/web/tsconfig.json
#	packages/client/ui-plugin-manager/README.i18n.yaml
#	packages/client/ui-plugin-manager/README.md
#	packages/client/ui-plugin-manager/README.zh.md
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.module.css
#	packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx
#	packages/client/ui-plugin-manager/tests/components.client.spec.tsx
#	packages/client/ui-primitives/README.i18n.yaml
#	tsconfig.host.json
2026-10-21 16:44:06 +08:00
creatixchu 684bb206af Merge master into bundle platform support 2026-10-21 16:22:55 +08:00
07akioni ed783066e6 fix(i18n): complete Japanese plugin metadata and guard locale coverage 2026-10-21 16:14:12 +08:00
Yif 3c26689899 fix(plugin-manager): make sticky header scrolling smooth
让插件主页面的吸顶过渡随滚动连续到位,而不是滚过 8px 后突然重排。

- 标题栏与列表共用滚动容器,保留展开态占位,避免收缩改变滚动范围
- 用不可交互的临时布局副本测量展开态和吸顶态,在同一组控件上按滚动距离更新位移和宽度
- 保持控件身份与焦点,补偿占空间的滚动条,防止水平偏移和临界位置来回抖动
- 小屏优先将 Tabs 与操作按钮排成一行,放不下时固定 Tabs 在上、按钮在下,吸顶前后不换序
- 仅 macOS 收起侧栏的吸顶态采用窗口安全区外 8px 留白,不再限制宽度;其他平台和状态不变
- 补充端点布局、滚动往返、短列表、滚动条和平台隔离回归

本次到插件主页面的吸顶动画与布局优化为止。实验性插件相关页面的吸顶体验留待后续单独处理。
2026-10-21 16:09:06 +08:00
Chinesezjc cf6684d8a4 Merge pull request #4484 from deepseek-harness/fix/multiline-display-math
fix(web): render multi-line display-dollar math
2026-10-21 15:53:22 +08:00
Turtle 589790d6e9 Merge remote-tracking branch 'origin/master' into turtle/plugin-market-entry-8303d8c92886
# Conflicts:
#	apps/web/tests/inspector-late-enable.e2e.ts
#	packages/experimental/inspector-profile/README.i18n.yaml
#	packages/experimental/inspector-profile/README.md
2026-10-21 15:12:43 +08:00
Saafo 5a028f151c 🔀 merge master into narrow settings pages 2026-10-21 14:29:12 +08:00
Turtle 11589ed104 feat(web): list custom plugin markets on the main experimental list
Developer Tools moves to the More page.
2026-10-21 13:34:13 +08:00
Turtle c7be617437 Merge remote-tracking branch 'origin/master' into turtle/plugin-sentence-case-299acab3ee89
# Conflicts:
#	packages/experimental/cua/src/application-access.ts
2026-10-21 13:28:18 +08:00
Chinesezjc 783d048294 Merge remote-tracking branch 'origin/master' into fix/multiline-display-math
# Conflicts:
#	packages/client/ui-primitives/README.i18n.yaml
#	packages/client/ui-primitives/src/markdown/parse.ts
2026-10-21 13:14:53 +08:00
Turtle b9d049d041 fix(plugins): use sentence case for built-in plugin English copy
Refs #6790
2026-10-21 11:28:26 +08:00
creatixchu b2878c5722 merge: sync platform admission with updated approval base 2026-10-20 21:12:55 +08:00
creatixchu 96e962bc12 Merge remote-tracking branch 'origin/master' into feat/cua-approval-format
# Conflicts:
#	packages/experimental/cua/src/client/mount.ts
2026-10-20 21:05:45 +08:00
creatixchu e77640f24d test(web): align plugin snapshots with persistent progress status 2026-10-20 20:17:53 +08:00
creatixchu 6172b26cab test(cua): cover wrapped loading and persistent diagnostics during row changes 2026-10-20 20:17:53 +08:00
creatixchu b6ea723e9e test(cua): isolate toggle regression from consent storage changes 2026-10-20 20:17:31 +08:00
Saafo 5c12422a52 🐛 fix(client): preserve settings navigation and narrow desktop layouts 2026-10-20 18:07:52 +08:00
Zrs000 aeb71f1061 feat(web): reflow the Settings panel at narrow widths
Below 768px the panel fills the viewport and the rail becomes the horizontal
section strip the Web product uses: the title shares the first row with the
header actions and close control, the registered section cells scroll sideways
on the second, and the active section fills the rest. Cells keep their labels
whole and the strip scrolls instead of truncating, so a registrant's label
length or a longer section roster cannot wrap or clip a name.

The panel places its four seats (title, header, navigation, options) on one
grid, so the desktop rail keeps its 188px track and 64px first row. Preference
rows drop their 48px control gutter and the Appearance cubes share one row at
that width.
2026-10-20 18:07:51 +08:00