Commit Graph
100 Commits
Author SHA1 Message Date
imccyu f3803c9697 release(dsh): 0.2.2-alpha.2 (#7437) 2026-10-28 02:17:58 +08:00
imccyu 00d541438b release(dsh): 0.2.2-alpha.2 2026-10-28 02:03:15 +08:00
imccyu 7509c174d9 fix(build): serialize release builds and give Client checks 8 GiB (#7435)
* fix(build): serialize publication and raise client aggregate heap

* docs: refresh development guide translation pairing

* fix(release): align pack runner and allow explicit tag-check bypass
2026-10-28 01:58:28 +08:00
imccyu 5106da3bb7 Merge pull request #7434 from deepseek-harness/worktree/release-dsh-0.2.2-alpha.1
release: [email protected]
2026-10-28 00:17:25 +08:00
imccyu 69c389ae11 release(dsh): 0.2.2-alpha.1 2026-10-28 00:00:58 +08:00
imccyu a4c9c208cd Merge pull request #7431 from deepseek-harness/release/vendor-alpha-for-0.2.2-alpha.1
release(vendor): prepare alpha.1 family for 0.2.2-alpha.1
2026-10-27 23:51:40 +08:00
imccyu 656c740669 release(vendor): cordis 4.0.6-alpha.1, cosmokit 1.8.7-alpha.1, group 1.0.6-alpha.1, hmr 1.0.21-alpha.1, include 1.0.11-alpha.1, loader 1.0.7-alpha.1, logger-console 1.0.6-alpha.1, schemastery 3.18.6-alpha.1, timer 1.1.8-alpha.1 2026-10-27 23:39:36 +08:00
imccyu c232e618fd Merge pull request #7430 from deepseek-harness/revert-7413-perf/web-startup-assets
Revert "perf(web): 压缩动态插件资源以加快冷启动"
2026-10-27 23:27:45 +08:00
imccyu 3ddab34194 Revert "perf(web): 压缩动态插件资源以加快冷启动" 2026-10-27 23:25:57 +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 6a6e88754d Merge pull request #7429 from deepseek-harness/fix/ci-premerge-depth-window
fix(ci): deepen the pre-merge fetch when the time window strands the merge base
2026-10-27 23:09:35 +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
Yifffan d4470e59dc Merge pull request #7089 from deepseek-harness/sidebar-spacing-pr1
fix(client): 统一侧边栏对齐原则,扩大操作热区,沉淀对齐方式 skills
2026-10-27 12:16:17 +08:00
imccyu 3bb9682210 Merge pull request #7260 from deepseek-harness/worktree/sync-dsh-0.2.1-rc.4-to-master
release(dsh): sync 0.2.1-rc.4 to master
2026-10-27 11:00:01 +08:00
imccyu d534e65692 release(dsh): align master packages with 0.2.1-rc.4 2026-10-27 02:23:17 +08:00
imccyu 543219b909 Merge remote-tracking branch 'origin/master' into worktree/sync-dsh-0.2.1-rc.4-to-master 2026-10-27 02:21:20 +08:00
imccyu 9c69007eca Merge pull request #7384 from deepseek-harness/feat/pre-merge-check
feat(ci): run one script for the merged tree in the pre-merge check
2026-10-27 01:44:02 +08:00
imccyu 1ba07e14ec Merge pull request #7368 from deepseek-harness/revert-7362-turtle/files-pane-scroll-72ef67cde97a
Revert "fix(client): keep files tree view across session switches"
2026-10-26 19:41:22 +08:00
imccyu 6ff50a4890 Revert "fix(client): keep files tree view across session switches" 2026-10-26 19:40:44 +08:00
imccyu ce31187885 release(dsh): align master packages with 0.2.1-rc.4 2026-10-26 16:32:02 +08:00
imccyu 31693e2151 fix(ui-conversation): drop the unused more views label from the remaining locales 2026-10-26 16:31:53 +08:00
imccyu 8c9c51d86d Merge worktree/release-dsh-0.2.1-rc.4 into the 0.2.1-rc.4 synchronization branch 2026-10-26 16:21:42 +08:00
imccyu 6a19d120c9 Merge master into DSH 0.2.1-rc.4 synchronization branch 2026-10-26 16:18:13 +08:00
imccyu 504a01a957 release(dsh): 0.2.1-rc.4 2026-10-26 16:15:51 +08:00
imccyu 199ffe37ba fix(ui): keep the more views tooltip fixed (#7342) 2026-10-26 16:12:05 +08:00
imccyuandimccyu df469ea6ff fix(ci): keep the pre-merge check green in report mode (#7311)
* fix(ci): keep the pre-merge check off the report-mode failures

* fix(ci): fail the pre-merge check in block mode without a base commit

* fix(ci): report every pre-merge failure the way its mode asks

The merge step now separates a base commit it cannot fetch from a merge it
cannot do, both failures print an annotation, and a spec pins the mode
wiring of the three Policy workflows.

* test(ci): type the Policy workflow assertions

---------

Co-authored-by: imccyu <[email protected]>
2026-10-26 13:39:57 +08:00
imccyu a3c3f107ef feat(storage): support compatible whole-unit versions (#6957)
* feat(storage): support compatible whole-unit versions

* fix(storage): contain failed writes

* test(storage): cover lock rejection and per-record version isolation

* docs(storage): align version rules with review findings

* fix(storage): unify versioned batch writes and deletion recovery
2026-10-26 13:22:25 +08:00
imccyu 762418208a Merge pull request #7097 from deepseek-harness/worktree-ciapprove
feat(ci): run the merge checks from deepseek-harness-check
2026-10-26 12:16:11 +08:00
imccyu 09b2bc7acf Merge pull request #6830 from deepseek-harness/design/floating-window-snap-back
feat(ui-dockkit): spring floating panels back inside the viewport
2026-10-26 11:34:38 +08:00
imccyu 6d4faf5423 release(dsh): align master packages with 0.2.1-rc.4 2026-10-26 01:31:00 +08:00
imccyu 3014b0af0f Merge master into DSH 0.2.1-rc.4 synchronization branch 2026-10-26 01:29:12 +08:00
imccyu 341beb33c0 release(dsh): 0.2.1-rc.4 2026-10-26 00:57:37 +08:00
imccyu ca4c00de46 Merge pull request #7154 from deepseek-harness/session-stream-snapshot
refactor(session): separate history, state and Web follow implementations
2026-10-25 20:08:12 +08:00
imccyu 8b8d1a4942 test(session): call the renamed events read 2026-10-25 19:55:32 +08:00
imccyu e032fdc2a8 refactor(session): rename the history controller read to events 2026-10-25 19:54:41 +08:00
imccyu 8cddf8b14c chore(docs): refresh event producer graph 2026-10-25 19:49:03 +08:00
imccyu 12a8c3adf7 docs(session): correct the events page and activation wording 2026-10-25 19:36:04 +08:00
imccyu 7c7b021766 docs(session): document events, deprecated page and activation order
Sync the Session README, implementation notes and follow upgrade guide,
then regenerate the API, subsystem, persistence and event-graph catalogs.
2026-10-25 18:14:32 +08:00
imccyu 99a6c14527 test(session): cover the split controllers and passive follow
Move the facade, listener, state, wait and history tests onto the new
controllers, and cover passive activation, omitted cursors and the
event subscription frames.
2026-10-25 18:14:28 +08:00
imccyu 985937265f refactor(ui-plan): read plans through the events page
A plan is a logged tool-call argument: read one page at the current log
end and page backwards from its cut instead of opening a follow snapshot.
2026-10-25 18:14:19 +08:00
imccyu 2f2caf88b3 feat(session): split history, state and web controllers
History, State and Web become ordinary classes sharing the Session scope.
Subscribe-before-read removes the tail repair, events and page expose the
cursor-bearing history read, observeEvent keeps a pure event subscription,
and follow stays passive unless activate is requested.
2026-10-25 18:14:18 +08:00
imccyu a1473ddec6 feat(gateway): expose pending remote events
Session state reads sample Gateway pending events; the Gateway contract now
provides getPendingRemoteEvents() for that read.
2026-10-25 18:14:17 +08:00
imccyu 10551d0e4e Merge pull request #7202 from deepseek-harness/worktree/sync-dsh-0.2.1-acp-stdout-tooltip-to-master
release(dsh): sync 0.2.1 ACP stdout and view-tab tooltip fixes back to master
2026-10-25 14:18:43 +08:00
imccyu 8ebf8a6218 Merge master into DSH 0.2.1 ACP stdout and view-tab tooltip sync
# Conflicts:
#	apps/cli/tests/profiles/acp/tests/stdout.expected.e2e.ts
#	packages/client/ui-conversation/README.i18n.yaml
#	packages/mcp/mcp-client/tests/protocol.spec.ts
2026-10-25 13:32:05 +08:00
imccyu f425304f7b Merge pull request #7179 from deepseek-harness/fix/release-acp-account-stdout
fix(acp): keep account catalog diagnostics off stdout
2026-10-25 12:56:33 +08:00
imccyu cb7f0878e4 Merge pull request #7168 from deepseek-harness/worktree/acp-stdout-logging-audit-f95a78
fix(mcp): keep resource-listing diagnostics off ACP stdout
2026-10-25 12:05:36 +08:00
imccyu 72624bae95 fix(ui): show view tab tooltip only for overflowing labels (#7183)
Conversation view tabs added a tooltip to every label in 0.2.1-rc.3, including short labels that fit the 88px cell. Estimate the glyph width and only enable the tooltip when the label is expected to overflow; keep the More trigger tooltip.

Refs #7181
2026-10-25 12:05:02 +08:00
imccyu c38265a00e fix(ui): show view tab tooltip only for overflowing labels
Conversation view tabs added a tooltip to every label in 0.2.1-rc.3, including short labels that fit the 88px cell. Estimate the glyph width and only enable the tooltip when the label is expected to overflow; keep the More trigger tooltip.

Refs #7181
2026-10-25 02:48:52 +08:00
imccyu b9266aefd6 Merge pull request #7094 from deepseek-harness/worktree/ci-schedule
ci: cut PR check latency across the slow lanes
2026-10-24 14:58:40 +08:00
imccyu 92b011e57c Merge pull request #7105 from deepseek-harness/revert-6993-fix/summary-overflow-recovery
Revert "fix(compaction): retry oversized summaries with smaller prefixes"
2026-10-23 23:00:08 +08:00
imccyu 3081c71bab Revert "fix(compaction): retry oversized summaries with smaller prefixes" 2026-10-23 22:59:05 +08:00
imccyu 22ddee3792 Merge pull request #7075 from deepseek-harness/worktree-chatgap
feat(chat): tighten the process-row gap to 4px
2026-10-23 19:48:59 +08:00
imccyu 83a0433bc7 Merge pull request #7003 from deepseek-harness/session-baseline-split-6998
feat(typert): extract Session baseline cleanup and default resource resolvers
2026-10-23 18:06:28 +08:00
imccyu 048845f841 fix(typert): harden default resource declarations and sync contracts 2026-10-23 17:39:35 +08:00
imccyu 3c4a79cc1b chore(session): remove stray blank lines 2026-10-23 16:22:07 +08:00
imccyu b2b3bf4568 fix(typert): reject ambiguous and multiple default resource identities 2026-10-23 16:13:38 +08:00
imccyu 9d7cd67a51 test(session): cover cold attachment without workspace 2026-10-23 16:01:29 +08:00
imccyu 05f94de1f9 fix(typert): preserve parameter metadata in resource resolvers 2026-10-23 16:01:28 +08:00
imccyu 94464e2214 chore(session): sync baseline docs and test lint 2026-10-23 16:01:28 +08:00
imccyu fea3bcdbf4 feat(typert): support default resource resolvers 2026-10-23 16:01:28 +08:00
imccyu 0c23ad233d refactor(session-controller): remove unused inspection facade 2026-10-23 16:01:27 +08:00
imccyu 63021ce0b4 Merge pull request #7055 from deepseek-harness/fix/host-build-heap-8g
fix(build): raise Host compiler heap limit to 8 GiB
2026-10-23 15:53:25 +08:00
imccyu ff42d4c4ab Merge pull request #7016 from deepseek-harness/worktree/sync-dsh-0.2.1-rc.3-to-master
release(dsh): sync 0.2.1-rc.3 back to master
2026-10-23 13:52:29 +08:00
imccyu 5ba94b2c79 release(dsh): align master packages with 0.2.1-rc.3 2026-10-23 13:38:12 +08:00
imccyu 8a01b8360b Merge master into DSH 0.2.1-rc.3 synchronization branch 2026-10-23 13:38:11 +08:00
imccyu edd79cc3b2 release(dsh): align master packages with 0.2.1-rc.3 2026-10-23 12:55:47 +08:00
imccyu 37faa05ffa Merge master into DSH 0.2.1-rc.3 synchronization branch 2026-10-23 12:55:47 +08:00
imccyu 5259c1e103 Merge master into DSH 0.2.1-rc.3 synchronization branch 2026-10-23 12:10:59 +08:00
imccyu b5fb03927e Merge pull request #7007 from deepseek-harness/07akioni/fix-master-locale-parity
fix: 同步 master 合并后的五种语言字典
2026-10-23 12:10:32 +08:00
imccyu 00e06cfac9 release(dsh): align master packages with 0.2.1-rc.3 2026-10-23 12:02:11 +08:00
imccyu 14f0b2aafe Merge master into DSH 0.2.1-rc.3 synchronization branch 2026-10-23 11:56:34 +08:00
imccyu 1f81c047fc Merge pull request #6999 from deepseek-harness/worktree/release-dsh-0.2.1-rc.3
release: next version [email protected]
2026-10-23 11:29:36 +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 d02ea370ee release(dsh): 0.2.1-rc.3 2026-10-23 01:11:35 +08:00
imccyu 3725e75edd Merge pull request #6991 from deepseek-harness/worktree-sync-dsh-0.2.1-to-master-1022
release(dsh): sync 0.2.1 navigation and model listing to master
2026-10-22 23:39:15 +08:00
imccyu 261f2db185 Merge master into DSH 0.2.1 navigation and model listing sync 2026-10-22 23:22:35 +08:00
imccyu 0d521bdd0d refactor(client): drop owner-era leftovers and gate sidebar New Session on session/create
- The Conversation binding tracking returns to master: the retainInfo subscription and the
  plugin-owned binding effects are a separate fix, not a served-page seam.
- The deliverables opener drops the ownerHostRoutes parameter no caller passes any more.
- Assertions on existing connection and HMR behavior, the menu-open-state spec, and the
  settings-general roster splice return to master.
- Workspace shortcuts no longer re-read Session access through source(); the Host refuses a
  denied rename, fork, or archive.
- The sidebar New Session button, the window-chrome New Session control, and the expanded
  brand shortcut render only while useRemoteAccess('session/create') allows it.
2026-10-22 21:44:25 +08:00
imccyu a154f70ab9 refactor(client): read composer access through useAccess and drop the branch-refusal notice
- The composer decides file intake from the Session-scope useAccess('fileUploads/upload')
  answer, like Send and Stop. The optional fileIntake hook seat, the InputHub fileIntake
  entries, and the ui-slots optional-hook typing are removed.
- The fixed Stop shortcut no longer re-reads session/cancel through a shared stop; the
  button stays hidden by useAccess and the Host refuses a withdrawn cancel.
- uiConversation.noticeBranchRefusal, branch.ts, ForkRefusal, and message.branchRefused are
  removed; a failed Chat branch leaves the source view unchanged, as on master.
2026-10-22 21:44:25 +08:00
imccyu 39d2903841 fix(ui): separate navigation pins from selection and show menu icons (#6883)
* fix(ui): separate navigation pins from selection and show menu icons

* fix(ui): simplify More menus and fold conversation views on resize

* test(ui): fix navigation CI regressions and refresh catalogs

* refactor(ui): render sidebar panel icons directly

* fix(ui): keep Chat visible and stop persisting navigation pins

* refactor(ui): drop unreachable pin validation from in-memory stores
2026-10-22 20:05:33 +08:00
imccyu 2ae65c16b7 Merge pull request #6966 from deepseek-harness/revert-6959-xtr/fix-web-agent-initialization
Revert "fix(session-controller): 在 Web 操作中等待本地 Agent 初始化"
2026-10-22 18:18:43 +08:00
imccyu f185b5fa6d Revert "fix(session-controller): 在 Web 操作中等待本地 Agent 初始化" 2026-10-22 18:18:01 +08:00
imccyu b04c1c3261 Merge pull request #6895 from deepseek-harness/turtle/icon-tokens/icons-plugin-tokens-e20dec90761c
feat(client): let themes replace product icons through an SVG sprite
2026-10-22 13:50:35 +08:00
imccyu 73931626be feat(webserver): add resource routes and in-process readResource (#6901)
* feat(webserver): add resource routes and in-process readResource

A webserver route or the fallback seat may now answer through a resource,
a function from a Fetch Request to a Response, besides the existing
node:http handler. register accepts either route form and registerFallback
accepts a handler or { resource }; existing handler callers are unchanged.
HTTP GET and HEAD requests reach a resource; webServer.readResource(request,
peer) follows the same match order and reaches only resources, so handler
routes stay unreachable to in-process readers.

client-modules registers /plugins as the fetchBundle resource, and
frontend-static claims the fallback seat with a resource that renders the
index for a supplied Peer, or runs Connection's existing authorizeIndex for
an HTTP request and renders for the browser Peer.

* fix(webserver): flush resource headers and keep one drain listener per response

Resource responses send their status and headers before the first body
chunk, register one drain/close listener pair per response so the gzip
middleware's zlib stream does not accumulate listeners across backpressure
waits, and readResource drops the body of a HEAD read as HTTP does. HTTP
requests and readResource share one responder lookup.

* chore(scripts): prune the retired client-modules unknown-cast baseline entry

* feat(frontend-static): let browsers revalidate dist files except the index

Every dist file other than the rendered index now carries
cache-control: no-cache and a weak ETag from a SHA-1 of its bytes; a
request whose If-None-Match equals that ETag receives an empty 304. The
index keeps sending no cache headers. In-process reads through
webServer.readResource revalidate the same way.

* fix(webserver): stop reading Host for resource URLs and copy no held body

A resource request's URL is the request target resolved against the same
placeholder origin the route match uses, so a missing or unparsable Host no
longer turns a dist or /plugins request into 400. The webserver ends a
resource response itself and treats any earlier close as an abort, which
also covers the Web Worker tunnel marking an aborted response ended first.
client-modules bundle bodies and frontend-static file bodies are the held
bytes themselves instead of copies, and frontend-static no longer exports
its internal serveStatic helper.

* docs(webserver): document resource route types and the handler-or-resource fallback

Paste WebResource and WebResourceRoute beside WebRoute on the web-server
subsystem page and link the catalog signatures to it, replace the remaining
'fallback handler' wording now that the seat takes a handler or a resource,
and note why the drain listener removal is a no-op under gzip.
2026-10-22 13:41:18 +08:00
imccyu 9fb3a064ea Revert "fix(client): 将模型发布标记改为蓝色纯文字" (#6936) 2026-10-22 13:21:40 +08:00
imccyu 4349b4e5f2 fix(ui-chat): clip horizontal overflow in the chat transcript (#6930) 2026-10-22 12:43:26 +08:00
imccyu 96f9a2f6c0 fix(ui-chat): clip horizontal overflow in the chat transcript 2026-10-22 12:21:11 +08:00
imccyu 1276a8e13a ci: split pull-request CI into Linux, Windows, and Python workflows (#6898)
* ci: run native Windows PR jobs in a separate workflow

GitHub re-runs failed jobs only after a whole run finishes, so slow Windows jobs blocked re-running failed Linux jobs. CI Windows now owns the native Windows jobs and the Windows x64 Python runtime target, with its own required 'windows checks passed' verdict.

Refs #6893

* ci: run Python PR jobs in a separate workflow

Python rarely fails while the Windows lanes run long, so the Python SDK suite and the Linux/Windows x64 runtime matrix move into CI Python. The three pull-request workflows can now be re-run without waiting for each other, and branch protection gains "python checks passed" beside the existing verdicts.

Refs #6893

* docs: record the three PR verdicts in the failover runbook

* test: pin the shared environment across the PR workflows

* test: read the python SDK lane from CI Python

* test(sdk): parse session JSONL frames in the keyless smoke

Node 24.19 returned only the first frame of a concatenated zstd log, so the single JSON.parse saw just the header; 24.22 returns every frame and the JSONL body broke the parse. Read frames explicitly and select the main session by its header so both versions agree.
2026-10-22 04:09:35 +00:00
imccyu ad340232fa Merge pull request #6792 from deepseek-harness/when-access
feat(remote-access): 插件注册跟随访问状态(whenAccess),index 按 Peer 注入访问快照
2026-10-21 18:42:23 +08:00
imccyu 31ebfa7aa9 fix(settings-account): 撤权时丢弃迟到的帧并清空登录状态 2026-10-21 18:16:28 +08:00
imccyu 7f7e1efdff fix(settings-account): 撤权时失效在途账号读取并清空账号快照 2026-10-21 17:57:52 +08:00
imccyu 0c619816c3 docs(plugin-manager): pluginNavigation 写明为可选读取的服务 2026-10-21 17:57:52 +08:00
imccyu d5d43d931d fix(remote-access): 按评审修正访问门控边界,插件导航改为可选依赖
- ui-entry-customization、voice-input 不再把 pluginNavigation 当必需服务:服务不在时隐藏「浏览插件」与「打开 / 查看详情」按钮,插件照常启动
- plugin-manager 每次授权时刷新已加载的列表
- settings-account 账号设置分区与 sign-in 一并按 account/watch 门控,revision 恢复 master 原样
- schedule 会话头部提醒另按会话 useAccess('schedule/list') 渲染
- 导出 staticAccessPlugin;补 whenAccess 归属、撤权与读者页启动测试
- 同步 README、web-server 子系统文档、webserver 包描述与 Agent Note
2026-10-21 17:57:52 +08:00
imccyu 09899f3a0f feat(remote-access): 插件注册跟随访问状态(whenAccess),index 按 Peer 注入访问快照
- remote-access 新增 whenAccess / whenResourceAccess,ui-session、ui-workspace 各自提供 whenAccess
- schedule、plugin-manager、settings-general、settings-account、directory-picker-native 的入口包进 global whenAccess;消息反馈按钮按会话 useAccess 渲染
- webserver/index-inject 带 Peer,renderIndex / collectIndexInjections 需要 Peer,remote-access 注入 snapshotFor(peer.principal)
- client-test-runtime 新增 StaticRemoteAccess、staticAccessPlugin 与 TestClientOptions.access
- implemented Agent Note 2026-10-21-when-access 与升级指南 webserver-index-peer

Refs #2940
2026-10-21 17:57:51 +08:00
imccyu 3e547bbd54 Merge pull request #6850 from deepseek-harness/07akioni/japanese-locale-completeness
fix(i18n): 补全日语元数据、授权提示和 Windows 安装器
2026-10-21 17:56:15 +08:00
imccyu d4aa52c2be Merge pull request #6796 from deepseek-harness/07akioni/japanese-locale
feat(locale): 增加日语界面支持
2026-10-21 15:44:22 +08:00
imccyu 224516ec2f Merge pull request #6799 from deepseek-harness/worktree/sync-dsh-0.2.1-analytics-to-master
release(dsh): sync 0.2.1 entry analytics back to master
2026-10-21 12:38:54 +08:00
imccyu 480562cdb9 Merge remote-tracking branch 'origin/master' into worktree/sync-dsh-0.2.1-analytics-to-master
# Conflicts:
#	packages/client/ui-agent-preset/README.i18n.yaml
#	packages/client/ui-sidebar/src/client/SidebarRoot.tsx
2026-10-21 11:56:51 +08:00
imccyu b839823118 Merge pull request #6673 from deepseek-harness/fix/touch-tooltip-interactions
fix(client): align touch tooltips and hover affordances
2026-10-20 19:26:56 +08:00