Commit Graph
8563 Commits
Author SHA1 Message Date
Yichen Jiang d4a2df736b Merge remote-tracking branch 'origin/master' into perf/forge-changes-view 2026-11-07 16:22:57 +08:00
Yichen Jiang 9b456b4e93 perf(forge): compare from the recorded base while confirming the head
Status snapshots carry the base commit the host recorded with the head
(baseSha). ForgeService.diff passes it to the provider when the latest
status names the requested head, and forge-github starts the compare read
from it while its GraphQL read confirms the head; a stale head or another
base cancels and joins the early read.
2026-11-07 16:22:24 +08:00
creatixchu 238f7584fe Merge remote-tracking branch 'origin/master' into feat/macos-keyboard-chords 2026-11-07 15:15:27 +08:00
creatixchu 29ceb385e6 docs(cua-macos): document caller-requested key repeats in the upgrade guide 2026-11-07 15:02:33 +08:00
Dudu-0223 6cc45f22bd feat: 在内置配置中关闭 subagent 和 Team 的 interrupt 工具 (#7986)
* feat(subagent): disable interrupt tool by default

* test(subagent): update remaining default tool inventories

* fix: disable agent interruption in shipped configuration

* test: configure interruption explicitly in custom preset fixture

* test: update tool count in collapse display snapshots

* docs: clarify agent interruption opt-in and verify preset controls

* test: cover macOS CUA channel policy forwarding on every platform

* test: move CUA coverage repair to a separate master change
2026-11-07 06:55:25 +00:00
creatixchu 7f8a6ad4d4 test(cua-macos): isolate desktop key holds and cover failed pause cleanup 2026-11-07 13:36:26 +08:00
creatixchu 89d374d578 feat(cua-macos): hold physical keys for one run_code execution 2026-11-07 13:33:24 +08:00
creatixchu 5a0c6c10f8 fix(cua-macos): validate physical key chords before dispatch 2026-11-07 13:08:42 +08:00
Yichen Jiang ef34a844de fix(forge-panel): refuse commit runs off the first-parent line and harden review state
- Shift-chosen commits must follow each other as first parents; the picker
  says why it keeps a run that leaves the line, and the Host refuses one with
  forgePanel/commits-not-linear for the Branch scope and change requests.
- The Branch scope lists its newest maxCommits commits with
  --no-show-signature, so log.showSignature cannot corrupt the listing.
- Viewed marks merge with the stored entry on each write and follow the
  storage event, so tabs of one Session keep each other's marks.
- .gitattributes patterns follow Git's wildmatch rules, checked against
  git check-attr; change digests include file mode lines.
- GitHub commit pagination refuses a repeated cursor or a changed count;
  commits validates the repository before its host like the other reads.
- The commit list is read once per head, base, or refresh; the lens menu
  hides the count of the disabled Tests lens.
2026-11-07 12:56:23 +08:00
Yichen Jiang fb637c2bfd Merge remote-tracking branch 'origin/master' into feat/forge-review-viewed-lenses
# Conflicts:
#	apps/web/tests/forge-panel.e2e.ts
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/subsystems/forge.i18n.yaml
#	docs/subsystems/forge.md
#	docs/subsystems/forge.zh.md
#	packages/experimental/client-ui-forge/README.i18n.yaml
#	packages/experimental/client-ui-forge/README.md
#	packages/experimental/client-ui-forge/README.zh.md
#	packages/experimental/client-ui-forge/src/client/ChangesTab.tsx
#	packages/experimental/client-ui-forge/src/index.ts
#	packages/experimental/client-ui-forge/tests/controller.host.spec.ts
#	packages/experimental/forge-github/README.i18n.yaml
#	packages/experimental/forge-github/README.md
#	packages/experimental/forge-github/README.zh.md
#	packages/experimental/forge-github/src/index.ts
#	packages/experimental/forge-github/src/provider.ts
#	packages/experimental/forge-github/tests/plugin.spec.ts
#	packages/experimental/forge-github/tests/provider.spec.ts
#	packages/experimental/forge-github/tests/review.spec.ts
#	packages/experimental/forge/README.i18n.yaml
#	packages/extensions/tool-cordis/src/api-catalog.ts
2026-11-07 12:13:56 +08:00
CreatixChu 683a98aa37 Merge pull request #8015 from deepseek-harness/fix/macos-window-element-click
Fix macOS mouse actions after the interface change
2026-11-07 03:52:42 +00:00
Yichen Jiang 0a10b6fd16 Merge pull request #8049 from deepseek-harness/fix/forge-pinned-diff
fix(forge): pin change request diffs to the polled head and count every review thread
2026-11-07 11:22:43 +08:00
Yudong Han 2d463af8d2 Merge pull request #7365 from deepseek-harness/feat/sidebar-file-search
feat(ui-sidebar-files): 侧栏文件树新增搜索栏 UI 与排除规则设置
2026-11-07 00:56:13 +08:00
Yichen Jiang 0e971200c4 feat(forge-panel): let repositories declare review layers in .gitattributes
A repository's root .gitattributes now decides a file's review layer first:
dsh-review-layer names test, interface, or implementation, and
linguist-generated still places a file in the test layer. The testPaths and
interfacePaths settings add globs before the built-in rules and are empty by
default. The built-in rules follow the default conventions of common
languages and tools instead of treating every JSON or YAML file and every
name containing config as interface. This repository declares its own locale
dictionaries, snapshot tree, pairing records, and types modules.
2026-11-06 18:47:22 +08:00
Yichen Jiang e07b170d77 fix(forge): address review of pinned diffs and thread counting
- forge-github: repeat a compare read without --allow-escape-sequences when
  a gh older than 2.97 rejects the option; such a gh prints escape sequences
  unchanged, so every version reads every diff (checked with gh 2.96.0 and
  2.100.0 on a pull request whose patch holds an ESC byte).
- client-ui-forge: a stale refusal now re-runs the read effect, so a status
  that arrived during the read, including a failed poll that keeps the
  earlier head, starts the next read at once instead of leaving the changes
  view loading.
- forge: ctx.forge.diff polls at once only for the first stale read at a head
  commit; later stale reads at it wait for the regular poll, which bounds the
  read-poll loop while GitHub's answers briefly disagree.
- forge-github: review thread pages share the byte budget of a complete
  check read.
- client-ui-forge: a truncated count shows its "+" even when it is zero.
- READMEs: document the batch deadline and rewritten-base limitations.
2026-11-06 18:17:04 +08:00
Yichen Jiang 325b2d27e5 Merge remote-tracking branch 'origin/master' into feat/forge-review-viewed-lenses 2026-11-06 17:51:39 +08:00
Yichen Jiang c313392bf8 feat(forge-panel): review changes by layer, mark files viewed, and view chosen commits
The changes view gains a lens of All, Interface, Implementation, and Tests
that spans the file tree above it, a switch that hides test files from the
tree and the diff, and a viewed checkbox on each file header that collapses
the file. The toolbar counts viewed files and V toggles the file being read.
Marks are kept per Session, source, path, and change digest in browser
storage, so a file that changes again reads as changed since viewed. All
commits beside Submit review, and beside the base branch of the Branch scope,
shows one commit or a Shift run of commits.
2026-11-06 17:51:22 +08:00
lsdsjy d51d623bfc feat(account): 接入通用通知接口并统一账号服务 (#7550)
将赠金专用提示迁移到通用通知 list、content 和 events 接口,支持轮询、语言刷新及单次交互上报。

统一账号服务和 Remote,通知 UI 放入侧栏并保持独立生命周期。

Refs #6373
2026-11-06 17:40:24 +08:00
Yichen Jiang f489bcc9ed Merge branch 'master' into fix/forge-pinned-diff 2026-11-06 17:23:35 +08:00
Yichen Jiang 7dc864a931 fix(forge-github): read pinned diffs through the compare API
The GitHub provider now reads headRefOid and baseRefOid in one GraphQL query,
returns `stale` when the head moved, and reads the patch from
`compare/<baseRefOid>...<headSha>` instead of bracketing `gh pr diff` with two
head reads. Both ends are fixed commits. The compare read lives in the internal
`readComparison` helper so commit-range diffs can reuse it.

For every open and merged pull request measured, the compare patch is
byte-identical to `gh pr diff`. Unlike the pull request diff, it returns diffs
over 300 files, so such a pull request now shows its complete diff; only output
over `maxOutputBytes` or GitHub's HTTP 406 / `too_large` refusal is
`too-large`. The read passes `--allow-escape-sequences`, which gh 2.97 and
newer require to print patches whose files contain terminal escape sequences.
2026-11-06 17:05:05 +08:00
Magolor 2f9d5d083c Show server-masked credential previews by Unicode code point 2026-11-06 16:59:29 +08:00
Magolor 5e39b7dcb5 fix(settings): hide unavailable API key reveal controls 2026-11-06 16:59:28 +08:00
Magolor ef3a02167a fix(settings): preserve saved API key mask length 2026-11-06 16:59:27 +08:00
Magolor 1fa3a9d191 fix(settings): explain saved-key actions and environment fallback 2026-11-06 16:59:26 +08:00
Magolor 7d81a91577 fix(settings): keep saved-key editing within the existing input 2026-11-06 16:59:00 +08:00
Magolor 86247d664b fix(settings): protect saved keys and preserve clear failure state 2026-11-06 16:58:59 +08:00
Magolor 334a76ef88 fix(settings): show masked saved keys and restore environment auth 2026-11-06 16:58:49 +08:00
creatixchu 5e7532f8fa Verify macOS hover permission stays with its connection 2026-11-06 16:21:51 +08:00
creatixchu 0f15e8766a Refresh the configuration catalog and retain Agent disposal coverage 2026-11-06 16:19:01 +08:00
Yichen Jiang 94336c6b3d fix(forge): pin change request diffs to the polled head and count every review thread
ForgeProvider.diff now takes the head commit it must describe. The GitHub
provider reads headRefOid before and after `gh pr diff` and returns the new
ForgeFailure code `stale` when either read names another commit, so the
forge panel never caches a patch under a head it does not describe. A stale
read polls the change request at once, and the changes view waits for the
next status before reading again.

Status polling pages reviewThreads up to the new `maxReviewThreads` setting
(default 1,000) instead of counting only the first 100, and sets
ChangeRequestSnapshot.threadsTruncated when the count is a lower bound.
2026-11-06 16:15:24 +08:00
creatixchu 09b90ed112 Keep macOS hover off the system pointer by default and route file panel clicks 2026-11-06 15:20:30 +08:00
creatixchu ecd56a18d3 Verify and document mouse clicks separately from AX actions 2026-11-06 14:08:06 +08:00
Turtle ac006780c0 Merge pull request #7405 from deepseek-harness/fix/plugin-not-running-status
fix(plugins): mark selected bundles DSH skipped as not running
2026-11-06 13:29:58 +08:00
CreatixChu ad3ca91623 Merge pull request #6746 from deepseek-harness/feat/cua-shared-native-api
处理 Windows 实现过程中发现的 CUA 包接口变更
2026-11-06 13:14:30 +08:00
Jiawei Song 7f98d178d1 Merge pull request #7966 from deepseek-harness/refactor/tool-errors-foundation
feat(tools): structured error identity for registry-owned tool failures
2026-11-06 13:11:06 +08:00
creatixchu 96a6b779fe Validate CUA response targets and stabilize platform permission loading 2026-11-06 12:15:41 +08:00
Yichen Jiang d0290409f9 Merge branch 'master' into turtle/add-gemini-protocol-5881f01a9a7f 2026-11-06 11:05:41 +08:00
Xu Hanxiang 3a9551d1ef Merge pull request #7899 from deepseek-harness/feat/liveshare-multi-session-share
feat(liveshare): add source Sessions to an existing share
2026-11-05 14:41:55 +00:00
sjw1231 ffde355ab7 refactor(jobs,terminal): import HarnessError from dsh-error
JobError and TerminalError only need the error base, so dsh-jobs and
dsh-terminal depend on dsh-error instead of the LLM runtime. The Python
SDK runtime closure includes the new package.

Refs #7869
2026-11-05 21:40:22 +08:00
sjw1231 71cb6c739a refactor(error): move HarnessError to the dependency-free dsh-error package
dsh-llm depends on dsh-attachment and dsh-typert-protocol, so classes in
those packages could not extend a base defined in dsh-llm without a
project-reference cycle. HarnessError now lives in @deepseek-ai/dsh-error,
which has no dependencies; dsh-llm declares it as a peer and re-exports
the same class, so existing imports and instanceof checks keep working.
The Agent Note records why the original leaf-package placement no longer
holds.

Refs #7869
2026-11-05 21:26:38 +08:00
creatixchu 5d8dd640d4 Expose native provider configuration through the CUA config subpath 2026-11-05 20:41:06 +08:00
creatixchu 9f31a0b5a5 Merge master with the plugin entry export policy 2026-11-05 20:40:22 +08:00
sjw1231 09604ac04d refactor(tools): tighten cancellation, approval, and job error contracts
Type the approval denial helper with a closed ApprovalErrorCode, state
that a cancellation is recognized by the signal reason or an Error named
AbortError, note that ApprovalError names a denial rather than a thrown
class, and separate JOB_CONTROLLER_UNAVAILABLE from a missing jobs
service. The jobs README describes JobError as the seam's export rather
than as current caller behavior, and the terminal test asserts one
concurrent send failure.

Refs #7869
2026-11-05 20:21:45 +08:00
sjw1231 3368b86e2c refactor(tools): keep approval and context codes off the plugin entry
The plugin entry may export only Loader fields and Service or Error
classes, so the ApprovalError and ToolContextUnavailableError code
constants move to an internal module; the recorded strings are
unchanged.

Refs #7869
2026-11-05 20:12:48 +08:00
sjw1231 a964c739d2 Merge remote-tracking branch 'origin/master' into refactor/tool-errors-foundation 2026-11-05 20:00:51 +08:00
TurtleandLegGasai d2c00f2554 feat(llm-pi-ai): support the Gemini protocol for custom model APIs
Add pi-ai's google-generative-ai protocol to hand-declared routes, read
Gemini's native model listing during discovery, and offer it as "Gemini
API" in the Custom model API form.

Refs #7978

Co-authored-by: LegGasai <[email protected]>
2026-11-05 19:41:07 +08:00
Turtle f1a1ec820b Merge remote-tracking branch 'origin/master' into turtle/fix-pr-7405-conflict-d4d9437d42a1
# Conflicts:
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	packages/boot/plugin-manager/README.i18n.yaml
2026-11-05 18:35:13 +08:00
Yichen Jiang cf09012892 feat(worktrees): reclaim safe UI checkouts when archiving sessions (#7403)
* feat(worktrees): clean up safe UI checkouts when sessions are archived

* refactor(workspace): share archive notice registration

* refactor(session-query): return observation sessions directly

* docs(worktrees): align archive guide and client catalog after merge

* refactor(worktrees): move archive cleanup into the worktree service

The worktree service now records each checkout it creates as a
`plugin:worktree/created` record, folds them in its own `worktree`
projection with fork-aware ownership, and reclaims a clean, unreferenced
checkout when the Session that created it is archived. The Forge panel
reads the service's record and forwards its cleanup state; it no longer
writes a `created` record, owns a retention projection, or gates every
Session's directory access.

Admission registers the attempt inside the Workspace write queue and
returns; inspection runs afterwards, reading cold Sessions through the
projection cache when mounted and from their log otherwise, with subagent
children of an archived ancestor counted as archived. Only a path being
removed holds `working-directory/access`, whose request now carries the
access's `signal`, and listeners withdraw before the drain. Ignored files
no longer retain a checkout, matching Git's non-force removal; processes
and terminals are not consulted.

The Forge bundle mounts one `worktree` service: the `forge-worktree` row
and the `optional-forge-panel` group that isolated a second service are
gone, and `forge-panel` is a top-level row. `canRemove`, `remove`, the
`forgeWorktreeRetention` projection, and `ForgeWorktreeCleanup` are
removed; `WorktreeService.cleanupOf`, `WorktreeCleanup`, and the
`worktree/cleanup` Host event replace them. The upgrade guide moves to
the current version directory and covers the id removals.

* docs(worktrees): move the archive upgrade guide to v0.2.2-rc.1 and wrap a test line

* test(worktrees): satisfy the static and consumer gates

Move the removal step into `removal.ts` as `removeCheckout`, so the specs
drive the real function and intercept it through a module mock instead of
reaching a private method through an assertion to unknown. Classify
`CREATED_RECORD` as a peer-required Host export for the Forge panel, ship
the compiled `lib/types/*.js` that the `./types` subpath names, refresh the
worktree recorded session with the creation record the service now writes,
and regenerate the module graph.

* refactor(worktrees): share the creation record schema with the Forge panel

The worktree package owns `createdWorktreeSchema`, the validator of its
`plugin:worktree/created` payload; the Forge projection imports it instead
of redeclaring the same object.

* test(web): refresh the Forge plugin card golden for the single worktree row

The card lists six components: the isolated `forge-worktree` row is gone.

* build(worktrees): pin zod to the unified 4.6.6

master unified every zod declaration on 4.6.6, so the worktree package's new
dependency follows it and the lockfile resolves again under --frozen-lockfile.

* test(worktrees): cover every reclamation path for the per-file gate

Drop the dead branches CI's coverage lane found: the placeholder trailing
slash in `within`, the aborted-lifetime check in `schedule`, the rejection
arm of a task that never rejects, and the undefined arms of the cold reads.
`cleanupOf` re-reads the attempt after waiting, so a cold Session without
creations settles to null instead of a stale placeholder. Removals of one
path never overlap, so `remove` keeps one entry per path without chaining.

New cases: a cold Session without creations, a borrower that appears
between inspection and the locked recheck, a subagent child with an unknown
parent, a creation record whose payload fails validation, a live fork that
moved out of the checkout, a cached cold Session without a directory, the
Forge projection ignoring a creation without an open request, the Remote
with and without the service, and the client's removed follow-up.

* feat(worktrees): add the retain-on-archive switch

`retainOnArchive`, a volatile field of the worktree service's Config, skips
cleanup admission while it is on; it is read at each archive, so a change
applies to later archives only. The service keeps its instance off the
generated Settings pages, and the Forge client draws the switch as the
`plugins.row.config` page of the bundle's `worktree` row, staged through
the shared Plugins form until one explicit save.

Docs: the worktree, Forge, and bundle READMEs, the archive-worktrees
upgrade guide, the config and client catalogs, and the
explicit-worktree-creation note.

* docs(module-graph): record the worktree service's settings dependency

`gen-module-graph --check` failed on CI after the retain-on-archive switch
declared `@deepseek-ai/dsh-settings`; regenerate the graph.

* test(snapshots): refresh terminal-panel-tools for master's runtime-context reminder

Master's #7321 wrapped the runtime-context snapshot in a `<system-reminder>`
after this fixture was last refreshed, so `test:snapshot` fails on master's
own tree; refresh the one user message so the replay matches.
2026-11-05 18:10:06 +08:00
brickmaker be1c087a77 Merge pull request #7969 from deepseek-harness/docs/desktop-uninstall-cache-cleanup
docs(desktop): 完善桌面端卸载清理脚本
2026-11-05 18:09:29 +08:00
creatixchu d3304de65b Align CUA guidance and migration examples with the scoped API 2026-11-05 18:08:26 +08:00