23934 Commits
Author SHA1 Message Date
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
ZiyaandZiyaZhang 0741cf26a5 fix(plugin): give personalized recommendations its own icon (#7071)
Co-authored-by: ZiyaZhang <199893125+ZiyaZhang@users.noreply.github.com>
2026-10-23 10:16:43 +00:00
Yudong Han 02bffe2f6b Merge pull request #7054 from deepseek-harness/turtle/tab-scroll-animation-3b47b9bdbb50
fix(dockkit): continue the tab strip from its last offset on selection changes
2026-10-23 18:09:55 +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
winewill efe44ee17f Merge pull request #6675 from deepseek-harness/perf/desktop-packaging-cache
perf(desktop): speed up signed packaging and align compression defaults
2026-10-23 17:56:11 +08:00
imccyu 048845f841 fix(typert): harden default resource declarations and sync contracts 2026-10-23 17:39:35 +08:00
winewill dba631dda6 docs(windows): preserve network settings when reinstalling runner 2026-10-23 17:38:55 +08:00
winewill a4aab8ec61 docs(desktop): consolidate cache lifecycle guidance 2026-10-23 17:18:48 +08:00
winewill 0c3d6a1368 Merge remote-tracking branch 'origin/master' into perf/desktop-packaging-integration
# Conflicts:
#	.github/workflows/ci-windows.yml
#	apps/desktop/windows-signing/README.i18n.yaml
2026-10-23 17:10:54 +08:00
winewill 4007c4bd67 Merge pull request #7057 from deepseek-harness/fix/windows-runner-network-recovery
fix(desktop): 对齐发布 app ID 并恢复 Windows runner 网络依赖
2026-10-23 17:08:30 +08:00
winewill 46ce2b61e0 Merge remote-tracking branch 'origin/master' into perf/desktop-packaging-integration
# Conflicts:
#	docs/development.i18n.yaml
#	scripts/build.spec.ts
2026-10-23 16:53:18 +08:00
winewill cb60c52cea docs(desktop): clarify shared packaging cache maintenance 2026-10-23 16:48:11 +08:00
Xu Hanxiang bcbc3d37a5 Merge pull request #6748 from deepseek-harness/feat/liveshare-protocol
feat(liveshare-protocol): add the shared wire frames and identity contract
2026-10-23 16:37:26 +08:00
Yichen Jiang b33271247b Merge pull request #6102 from deepseek-harness/docs/long-table-filter
feat(docs): 为长表增加搜索、清空和固定表头
2026-10-23 16:34:21 +08:00
winewill 9c3e97676e fix(ci): report successful runner network fixture exit 2026-10-23 16:33:05 +08:00
Turtle 0b8eabaf66 fix(dockkit): record the strip offset when the strip unmounts
Reading scrollLeft in the layout cleanup also captures positions that fire no
scroll event, such as a restore the browser clamps to the current offset.

Refs #7049
2026-10-23 16:27:34 +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
mektpoy 09ccbf785f chore(release): carry liveshare-protocol to the rc.3 family version 2026-10-23 16:13:34 +08:00
mektpoy 65c20148c1 fix(liveshare-protocol): align the published files with the single entry
The package publishes only its root entry, so the constraint extras that
named the identity subpath and frame codec no longer describe its files.
2026-10-23 16:13:34 +08:00
mektpoy c682dfaa3b refactor(liveshare-protocol): publish one entry point
The root entry already re-exports the wire codecs, the identity contract, the
viewer carrier, and the viewer-state vocabulary, so `./protocol` and
`./identity` were aliases of subsets that every consumer had to mirror in the
tsconfig path list. Keep `.` alone, keep the mock provider in its source module
for tests, and bundle only the root.
2026-10-23 16:13:34 +08:00
mektpoy c34276ec5a refactor(liveshare-protocol): publish the mock identity provider on its own entry
A package that promises authentication-adjacent types must not hand production
callers a provider that fabricates principals from its public `./identity`
entry. The mock keeps its own `./identity/mock` export, the console face drops
it, and the entrypoint tests pin both halves.
2026-10-23 16:13:34 +08:00
mektpoy 774e618112 fix(liveshare-protocol): forward only the page's own origin
Matching a forwarded route on the pathname alone let any origin whose URL
carried `/api/present.host` or `/open-in-app/apps` reach the owner instead of
the destination it named. Resolve the request against the page base and forward
it only when the target origin is the page's own; every other request reaches
the fetch this carrier replaced.
2026-10-23 16:13:34 +08:00
mektpoy 0a0620abd5 docs(development): count the split compiler faces
The face layout paragraph still counted six split packages. The
liveshare-protocol split added a seventh, and this names which part of the
package stays on each leaf.
2026-10-23 16:13:34 +08:00
mektpoy 3f8f220ccd docs(experimental): align the liveshare ctx-key column
Every other row states the ctx key or an em dash; the protocol row said
'library and protocol — no ctx key' in both languages. It now uses the
same em dash as the other rows without a ctx key.
2026-10-23 16:13:34 +08:00
mektpoy fa579c64d4 docs(liveshare-protocol): point the viewer-state module at the package entry
The @module tag named a viewer-states subpath the package does not export.
The vocabulary is reached through the package root, so the tag now names
that entry.
2026-10-23 16:13:23 +08:00
mektpoy 81c3d89ab1 docs(liveshare-protocol): describe the current consumers and viewer entries
The summary claimed both packages import the package and named only
dsh-brand, while nothing imports it in this tree and cordis is a peer. It
now states the shared definitions and both dependencies without claiming
current importers. When to use it names the package root for the viewer
carrier and viewer-state vocabulary, and the Known Limitations anchor moves
ahead of its heading like the other sections.
2026-10-23 16:13:23 +08:00
mektpoy eab3bd4769 test(liveshare-protocol): round-trip the IPC fixtures with request tokens
The v1 host/worker fixtures carried no registrationToken or token, so a
legacy branch asserted them rejected and the optional-field case skipped
them. They now carry valid tokens and round-trip through their codecs. The
unknown access-mode fixture carries a token too, so its refusal is about
the mode rather than the missing identity. The unread required lists are
deleted; the optional lists now match what the parsers accept.
2026-10-23 16:13:23 +08:00
mektpoy 3a2a59a635 fix(liveshare-protocol): release a stream whose unreadable open reached the owner
A 200 open whose body was not a JSON object threw from readable() before the
abort listener was armed, so the page never sent stream-cancel and the owner
held the id until its own budget expired. The unreadable-open path now
cancels the id before rethrowing; the spec pins the cancel.
2026-10-23 16:13:23 +08:00
mektpoy 59ed57540b refactor(liveshare-protocol): name the offered capabilities in their type
LIVESHARE_CAPABILITIES was a runtime string array, so a peer could neither
check a capability name at compile time nor compare against the same union.
The tuple is now const and LiveshareCapability derives from it; the wire
values are unchanged.
2026-10-23 16:13:23 +08:00
mektpoy a64d6406f5 refactor(liveshare-protocol): decode a relay frame once
parseRelayFrame parsed the wire text for the lifecycle snapshot and again
for the envelope, and unsupportedFrameRefusal repeated both parses. One
JSON.parse now feeds the snapshot check, the envelope, and the refusal
branch, so the hot path decodes each frame exactly once.
2026-10-23 16:13:23 +08:00
mektpoy 6bebb9ef3f fix(liveshare-protocol): reject an empty tenant in the asserted actor
The wire parser accepted an empty tenant while the Relay's identity adapters
store a non-empty one and identityFromKey refuses an empty segment, so a
share ACL built from such an actor could never match a normalized entry.
Reject the unnormalized actor at both the Relay frame and IPC ingress.
2026-10-23 16:13:23 +08:00
mektpoy a4f851f028 test(liveshare-protocol): carry malformed share frames without unknown assertions 2026-10-23 16:13:23 +08:00
mektpoy ddd9cbc243 chore(build): split the liveshare protocol compiler faces
The package carried one Host-based tsconfig that both aggregates registered, so the browser carrier
was compiled under the Host face while the wire codecs that use Buffer were compiled under the same
config. It now follows the repository's double-face template: a solution-only package root, a Host
leaf (wire codecs, identity contract, shared vocabulary, and the root barrel that re-exports the
carrier), and a browser leaf for the viewer carrier and the pure types it shares. The two repository
aggregates register the matching leaf, and the carrier stays in the Host file list because the root
barrel re-exports it for the Relay's script generation.

The tsdown comment now states the two compiler faces and why only the Host face publishes runtime
modules.
2026-10-23 16:13:23 +08:00
mektpoy 202c196e00 fix(liveshare-protocol): declare the brand runtime dependency
The published declarations reference Branded from @deepseek-ai/dsh-brand, so an external consumer
must be able to resolve that package from the manifest. It moves from devDependencies to
dependencies; the lockfile records the importer under dependencies.
2026-10-23 16:13:23 +08:00
mektpoy 535c40d4b7 test(liveshare-protocol): gate the package at per-file coverage
The protocol package leaves the repository-wide coverage exemption and meets the same per-file 100%
gate as the other packages. The new specs cover the identity mock, the wire helpers and every
additive-field parser branch, both public entry points, and the carrier's forwarded-route paths; the
key parser drops an unreachable guard so its remaining branches are exercised.
2026-10-23 16:13:23 +08:00
mektpoy abb9d0c50f test(liveshare-protocol): neutralize provider-specific fixture subjects
The recorded frames no longer name a provider-specific subject prefix; the cases keep their shape
with a neutral subject id.
2026-10-23 16:13:23 +08:00
mektpoy e803c2647a fix(liveshare-protocol): reject an unparseable share expiry
An IPC share spec accepted any string as its deadline while the frame parser required a parseable
time, so a registration could carry an expiry no reader could enforce. Both parsers now apply the
same rule: a stated expiry must be a string Date.parse accepts.
2026-10-23 16:13:23 +08:00
mektpoy 90695b11a5 docs(liveshare-protocol): document identity normalization and the viewer entries
The key codec now states its precondition: a caller normalizes an identity first, because an
unnormalized empty tenant renders a segment the parser cannot read back. The viewer carrier and the
viewer-state vocabulary join the file map, reached through the package root rather than their own
subpaths, and the placeholder-tenant comment is one complete rule again.
2026-10-23 16:13:23 +08:00
mektpoy 605f4947e1 test(liveshare-protocol): reject invalid additive wire values
The new actor credential and share connection are untrusted wire inputs: a non-string credential and an unknown connection mode are refused, an absent connection parses as the relay default, and an absent credential keeps the Relay-asserted actor.
2026-10-23 16:13:23 +08:00
mektpoy 4800bbed30 feat(liveshare-protocol): reserve actor credentials and direct connections
Additive wire evolution: an actor may carry an owner-verifiable credential (type-checked here, verified by the owner, absent keeps today's Relay assertion), and a share spec may carry a connection that defaults to relay while a Relay that owns the data path refuses direct. Capabilities actor-credential and direct-connection declare support; the recorded frames carry both fields.
2026-10-23 16:13:22 +08:00
mektpoy a2c5d40e30 refactor(liveshare-protocol): share the permission facts between request and frame
TunnelShareSpec and ShareAccessStateFrame repeated the same six permission fields. They now extend one SharePermissions interface (the committed frame is the authority), with the upload switch optional in a request and required in a frame. The wire shape is unchanged, so the recorded frames replay byte for byte; the display-only and grouping fields plus the registration-token and request-id roles are documented in place.
2026-10-23 16:13:22 +08:00
mektpoy f1aca0df84 docs(liveshare-protocol): keep identity providers out of the protocol package
The identity contract and its fixtures named specific providers even though the package only describes the abstract triple. The JSDocs now say a deployment's adapter implements it, and every fixture and spec uses the neutral example provider while keeping the encoding, round-trip, and empty-field cases they pin.
2026-10-23 16:13:22 +08:00
mektpoy 590826f66d revert(liveshare-protocol): reset the wire protocol to version 1 and drop development history
The v2 upgrade guide and the fork-readonly normalization were development-period artifacts that never shipped, so the protocol returns to version 1: the guide triplet is deleted with its references, the withdrawn tier is no longer named anywhere (unknown tiers are rejected generically), and the README plus the version test state version 1. The file-upload capability and its additive field stay.
2026-10-23 16:13:22 +08:00
mektpoy 73df748c7f feat(liveshare-protocol): carry the viewer file-upload switch
The share spec gains an optional allowsFileUpload switch, the access-state frame always states it (an absent field reads as off), and the file-upload capability separates the field from the tier and fork switches. The wire version stays 2 because the change is additive; the upgrade guide says so and the recorded add-share frame names the new field.
2026-10-23 16:13:22 +08:00
mektpoy 8a5ee7bda9 fix(liveshare-protocol): keep the forking half of the withdrawn tier
Normalizing fork-readonly to view dropped the switch the withdrawn name implied when no allowsFork was present, so a legacy registration silently lost forking. Both parsers now set allowsFork true for that case, matching what the old name granted.
2026-10-23 16:13:22 +08:00
mektpoy 7139e5cd8d fix(liveshare-protocol): keep the protocol vocabulary off the client and normalize the withdrawn tier
viewer-states publishes only each condition's retry decision: HTTP statuses and error codes belong to the Relay and copy keys to the client, so the mismatched accessDeniedTitle key is gone with the wire discriminator. Both parsers read the withdrawn fork-readonly tier back as view while keeping allowsFork, matching the documented treatment, and the protocol version is pinned in a test. The coverage-exclusion comment now names this package's own deferred lane instead of another package's.
2026-10-23 16:13:22 +08:00
mektpoy eef30f8462 fix(liveshare-protocol): forward only real route segments
The carrier matched forwarded routes by substring, so /api/present.hostile and /x/open-in-app/apps-foo were posted to the owner as if they were the read routes. Match only where the route starts a path segment and ends at the pathname or a following slash, keeping the Relay base path prefix working; add hit, subpath, prefix-neighbour and query cases.
2026-10-23 16:13:22 +08:00
mektpoy d218ba88f0 fix(liveshare-protocol): keep the replaced fetch's receiver
The carrier called the captured page fetch as a plain function, so a browser fetch that checks its receiver would fail on every non-forwarded request. Call it with globalThis as the receiver, as the repository's other fetch wrappers do, and pin the receiver in a spec.
2026-10-23 16:13:22 +08:00
mektpoy ace985e94f fix(liveshare-protocol): move the wire protocol to version 2
The access-mode vocabulary changed from open|approval to open|selected without a protocol version change, so a peer could declare version 1 while refusing every value the other side sends. Version 2 states the break; the retired approval name stays refused rather than reinterpreted, and an upgrade guide records the peer upgrade order.
2026-10-23 16:13:22 +08:00