Commit Graph
7472 Commits
Author SHA1 Message Date
Yichen Jiang 35953a75de fix(forge): classify the panel's Host imports under the published dependency policy
verify-package-dependencies now covers experimental Client packages, and the
forge panel's Host face imported four workspace values that no policy entry
classified. appendPluginRecord writes through the Session class's private log,
and readers recognize a deadline's TimeoutReason only by instanceof, so both
need the provider's shared instance. pluginRecordOf and generatedWorktreeName
keep no state; classifying them as peer-required keeps the panel's existing
Session and worktree peer edges.

With the exports classified, the fixer keeps worktree, Session, and timeout as
the panel's only workspace peers, moves its type-only relationships to
devDependencies and dsh-typert-protocol to dependencies, and regenerates the
lockfile and the module graph.

verify-plugin-record-callers counts a string literal that spells
appendPluginRecord as a caller, so it now admits the dependency policy file,
which names the export to classify it and never calls it.
2026-10-20 12:02:57 +08:00
Yichen Jiang 80254034c7 feat(forge): mark change requests ready and merge them from the panel
An expanded card now marks a draft ready for review and merges a change
request that the host would merge now:

- The forge seam gains provider actions `markReady` and `merge`, which
  return a typed `ForgeActionFailure`; the registry polls a watched change
  request at once after either settles. Snapshots carry `mergeReady` and
  the `mergeMethods` the repository allows, the user's usual one first.
- GitHub marks ready with `gh pr ready` and merges through the REST merge
  endpoint with the head SHA the card showed, so new commits refuse the
  merge; it never enables auto-merge, joins a merge queue, or deletes the
  head branch.
- The panel Remote acts only on visible bindings of the Session, and the
  card offers 标记为可评审 for drafts and a 合并 menu with the allowed
  methods and a confirmation, reporting each outcome in a toast.
- The forge panel e2e replaces the worktree branch before the ARIA
  capture normalizes durations, so a random suffix no longer breaks it.
2026-10-20 11:50:10 +08:00
Yichen Jiang 06d1616224 feat(forge): redesign the change request panel
Call every bound item a change request, whatever its code host calls it,
and rebuild the panel around the redesign:

- State glyphs for open, needs attention, draft, merged, closed, and
  unknown change requests; an open one with failed checks, requested
  changes, or conflicts needs attention, as the header dot does.
- A card whose title opens the change request, with a plain number line,
  a collapsed status summary, and expanded checks, review, merge, and diff
  rows; the checks row opens a list with failed checks first.
- The only open change request of a Session starts expanded.
- The checkout row names the branch or detached commit and the kind of
  checkout, with Restore for a removed worktree; the Host home shortens
  paths.
- Checkout inspection reports linked worktrees and the HEAD commit.
2026-10-20 11:50:10 +08:00
Yichen Jiang accd5b77c4 feat(worktree): name generated worktrees after their Session
Generated worktree names now join the dsh- prefix, the first eight
hexadecimal digits of the UUID in the Session id, and four random
hexadecimal digits, such as dsh-6b1f02c4-9a3e. A Session id without a
UUID gets eight random hexadecimal digits after the prefix. The worktree
runtime exports generatedWorktreeName, uses it for omitted
create_worktree names, and defaults namePrefix to dsh-. The forge panel
names its Session worktrees with the same function and defaults
worktreePrefix to dsh-, so checkouts no longer nest under a dsh/
directory.

The create_worktree name parameter asks for a few lowercase words joined
by hyphens that describe the task, and the tool description drops the
defaults that its parameters already state.
2026-10-20 11:49:51 +08:00
Yichen Jiang fc43a2d507 feat(forge): add the pull request panel and worktree Sessions
The forge panel shows the pull requests a Session created or pushed in a
right-sidebar tab, with a Session header button and branch label, and lets
a new Session start in its own Git worktree from the New Session options
row. The forge bundle ships the panel with the forge registry, the GitHub
provider, the Session bindings, and an isolated worktree service.

The panel listens to the agent-controller/admission stage. It holds the
first message of a Session with a worktree request while it creates and
enters the worktree as Agent maintenance, and refuses messages while the
worktree the Session works in is gone. A failed or stopped creation
returns the message to the composer: the card above the composer shows the
failure, sending again retries with a new branch name, and Continue
without a worktree withdraws the request. A removed worktree can be
checked out again or left for the source checkout. A message that enters
without admission still gets its worktree at the first step proposal.
2026-10-20 11:49:51 +08:00
Yichen Jiang dcbfd8079a feat(experimental): bind code host change requests to Sessions
Add the experimental forge capability seam:

- dsh-experimental-forge: provider-neutral repository and change request
  references, a provider registry, and shared status polling. Watchers of
  one change request share one loop; each forge has one batched fetch in
  flight, and the cadence follows check, mergeability, and lifecycle state.
- dsh-experimental-forge-github: GitHub provider that runs the GitHub CLI
  on the host with a scrubbed environment and reads every due pull request
  of a host in one GraphQL query.
- dsh-experimental-forge-session: a host-only projection derives Session
  bindings from gh pr create and git push shell results and from
  plugin:forge-session/binding records; push results trigger head-branch
  discovery of open pull requests, and Session watchers poll bound change
  requests through ctx.forge.
2026-10-20 11:49:25 +08:00
Yichen Jiang 55d00a08fc Merge remote-tracking branch 'origin/master' into worktree/session-agent-controller-refactor-ff892d
# Conflicts:
#	docs/capability-seams.i18n.yaml
2026-10-19 22:34:29 +08:00
Yichen Jiang 1d51715aca Merge remote-tracking branch 'origin/master' into worktree/session-agent-controller-refactor-ff892d
# Conflicts:
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
#	packages/api/session-controller/README.i18n.yaml
#	packages/api/session-controller/tests/commands-upload-file.host.spec.ts
#	scripts/gen-cordis-catalog.ts
2026-10-19 22:25:55 +08:00
creatixchu 14a422021e Merge origin/master into feat/cua-basic-onboarding 2026-10-19 21:53:59 +08:00
creatixchu e49ef79884 build(cua): classify approved Host imports for the combined package 2026-10-19 20:06:23 +08:00
creatixchu b40d335e3d refactor(cua): colocate permission UI and narrow package exports 2026-10-19 19:46:13 +08:00
turtle1999 9c8522bb64 feat(plugin-detail): show Markdown plugin details on bundle and market entry pages
Plugins bundle pages and Discover entry pages show the plugin's long
description first, as Markdown with images, in a height-limited region
without its own heading. The document is the file locale meta.detail
names, otherwise the package README, otherwise (market entries only)
the declared repository's README.

The new dsh-plugin-detail library selects documents and reads local
package directories and npm file CDNs without state. plugin-manager
reads installed and offered bundles through readBundleDetail; plugin-market
reads market entries through readEntryDetail, single-file APIs, and a
size-limited partial clone cache serialized across processes. Raw HTML is
omitted, relative links stay text, and relative images load from Host
routes with a sandbox CSP.
2026-10-19 19:13:22 +08:00
Turtle 82a5ae1744 Merge pull request #6174 from deepseek-harness/feat/plugin-version-updates
feat(plugins): check and install newer registry versions of third-party bundles
2026-10-19 18:22:33 +08:00
imccyu a3debca9ab Revert "feat(gui): 支持图片拖动平移与原图拖放分享" 2026-10-19 18:04:17 +08:00
std4453 54219b6288 Merge pull request #6530 from deepseek-harness/feat/image-pan-and-share
feat(gui): 支持图片拖动平移与原图拖放分享
2026-10-19 18:01:42 +08:00
zhc f0ed41c8dd fix: address image drag lifecycle and coverage review 2026-10-19 17:43:38 +08:00
Yichen Jiang 81963e0665 Merge remote-tracking branch 'origin/master' into worktree/pi-ai-default-capacities 2026-10-19 17:31:04 +08:00
Yichen Jiang f2e0d7db1b feat(llm): raise custom model defaults to 1M context and 128K output 2026-10-19 16:59:30 +08:00
Yichen Jiang a472820428 fix(agent): wait for deliveries on disposal and keep image prompts in order
The Agent controller now finishes disposal only after every delivery it
stopped has settled, and a sender that cancels stops waiting at once, also
while its message waits behind a held one; the message keeps its place and
is dropped at its turn.

An image prompt takes the Session's image admission turn when its
preparation starts, in the Agent's delivery order, and keeps it until the
prompt settles. Image and text prompts therefore enter the inbox in arrival
order, and a model selection waits only for the image prompt being
admitted, not for one still queued.

The core page documents the delivery types, and the architecture overview
lists the controller and its admission event.
2026-10-19 16:58:59 +08:00
Chinesezjc dbae54a7c9 Merge origin/master into refactor/unify-time-vocabulary
Resolutions:
- docs/config-catalog.md and .zh.md are regenerated from the merged package
  descriptions.
2026-10-19 16:22:37 +08:00
_Kerman ac71b42560 Merge pull request #5966 from deepseek-harness/xtr/session-projection-registration-handles
refactor(session-projection): return retained handles from async registration
2026-10-19 15:47:04 +08:00
turtle1999 b10bd84dfe feat(plugins): check and install newer registry versions of third-party bundles 2026-10-19 15:40:51 +08:00
_Kerman d3f486e98e fix(plan-mode): reject requests before guidance is ready 2026-10-19 15:26:30 +08:00
creatixchu b524c7cc19 fix(cua): use the profile editor for persistent runtime changes 2026-10-19 15:24:37 +08:00
LogosVeritas 7d656c0511 Merge pull request #6369 from deepseek-harness/fix/sdk-minimal-checkpoints
为 sdk-minimal 默认启用已有的 session-checkpoint-policy,在模型请求、顶层工具执行和 step 前等待会话记录持久化,并在刷盘失败时阻止后续操作,将首次日志写入与原生写锁初始化提前到首个模型请求之前,降低短会话关闭时历史无法恢复的风险。同步补齐依赖、配置断言、回归测试及双语升级指南,并依据启用 checkpoint 后的 4 轮、20 个 CI 样本,将 profile-continuation 预算从 4,250 ms 重新校准为 7,000 ms,保留工作负载、完成数量及超预算检查。Fixes #6512。
2026-10-19 15:17:07 +08:00
Yichen Jiang 47d947d8b1 Merge remote-tracking branch 'origin/master' into worktree/session-agent-controller-refactor-ff892d
# Conflicts:
#	docs/capability-seams.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/event-producer-consumer.zh.md
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	docs/persistence-schema.json
2026-10-19 15:07:35 +08:00
Chinesezjc 19605806cb Merge origin/master into refactor/unify-time-vocabulary
Resolutions:
- packages/util/time/package.json keeps this branch's description and takes
  master's 0.2.1-rc.2 version.
- packages/util/README.i18n.yaml is re-recorded after the merge.
2026-10-19 15:05:12 +08:00
creatixchu 8dc477498f Merge remote-tracking branch 'origin/master' into feat/cua-basic-onboarding 2026-10-19 14:11:34 +08:00
Shigma 23356d9c9c Merge pull request #6193 from deepseek-harness/chore/cordis-timer-1.1.4
chore(cordis): sync Timer 1.1.4 and reuse it in Client
2026-10-19 13:51:40 +08:00
Shigma 675e5de5f8 refactor(cordis): remove obsolete ClientTimerService export 2026-10-19 13:14:59 +08:00
creatixchu a1c0a68c80 docs(cua): place preset migration under the current release 2026-10-19 12:49:15 +08:00
luogesi 1ddba8b3b0 fix(sdk-minimal): align review fixtures and upgrade guide 2026-10-19 12:13:57 +08:00
luogesi f62182e577 fix(sdk-minimal): checkpoint sessions before dispatch 2026-10-19 12:13:57 +08:00
creatixchu 8a90e689d8 Merge origin/master into the basic CUA entry 2026-10-19 11:29:22 +08:00
turtle1999 4292020410 feat(plugin-market-generator): skip packages and versions marked private
A manifest with "private": true keeps its version out of the index. A Git
package that is private on the default branch is not listed at all, and the
generator warns when every bundle package of a repository is private. The
cache version is bumped so cached private releases are rebuilt.
2026-10-19 11:27:56 +08:00
_Kerman 955e600031 Merge master into session projection registration handles 2026-10-19 11:21:16 +08:00
creatixchu 9e0adb34ae docs(cua): align basic configuration catalog 2026-10-19 11:14:05 +08:00
imccyu d9ae93d0c4 Merge pull request #6485 from deepseek-harness/projection-summary
perf(session-projection): serve session-list rows from a summary key set
2026-10-19 11:10:40 +08:00
creatixchu 1954e948cb feat(cua): add optional macOS setup with existing plugin interfaces 2026-10-19 11:10:31 +08:00
imccyu ab77d85f8e chore(docs): regenerate the persistence catalog 2026-10-19 10:53:13 +08:00
imccyu 99eacb881f fix(session-controller): drop a redundant projection cast and refresh doc graphs 2026-10-19 10:43:21 +08:00
imccyu 8ff30ebd96 docs(session-projection): state the shipped summary behavior 2026-10-19 02:57:09 +08:00
imccyu 76eba949bd chore(docs): regenerate the config catalog after the import shift
Adding the `ProjectionKeySelection` import to the projection cache moved its
`Config`/`inject` declaration down one line, so the config catalog's source
reference is regenerated. Only the source location changes.
2026-10-19 01:37:39 +08:00
imccyu f230fc2fc2 refactor(session-projection): review fixes for the summary key set
- Export `ProjectionKeySelection` (the read faces' key selection) and reuse it
  from the projection cache instead of restating the union twice. The Cordis
  catalog can now resolve the type its generated signatures reference.
- Make `wire.summary` a plain boolean: omitted means `true`, and a key whose
  map entry carries the summary mark declares `false` so the runtime key set
  and the client view type agree. The type no longer forbids a declaration.
- Describe the mark accurately: it has no runtime representation; `wire.view`
  and `viewSchema` are typed with `SessionProjectionViewValue`, which strips it,
  so the registration erase only widens the state type.
- Say plainly in the package README, the subsystem page, the client field
  comments, and the Agent Note that a list row carries the summary projection
  and never the full projection: a connected Session's store may hold more
  values, but those are outside the list contract.
- Document the summary vocabulary on the subsystem page with `ts type-equiv`
  blocks for the mark, its stripping, the excluded-key test, the summary value
  type, and the key selection; split the prose paragraph.
- Revert the behavior-neutral cache-double refactors in three specs, and record
  in the Agent Note why no upgrade guide accompanies the wire change and how a
  consumer migrates.
2026-10-19 01:13:24 +08:00
imccyu 64a1d1e95f chore(docs): regenerate the event graph after the line shift
The producer/consumer matrix points at the declaring line of each event. Adding
the `imageLimits` JSDoc and map-entry wrap moved the `api-session/*` declarations
in `packages/api/session-controller/src/types.ts` down by four lines, so the
graph pair is regenerated. Only source locations change.
2026-10-18 23:12:27 +08:00
imccyu 8e2dd67de8 perf(session-controller): exclude the shared image limits from session summaries
`imageLimits` is a boot constant every Session shares: the unit stores no
per-Session state (`stateSchema: z.null()`, `apply: state => state`) and its
view returns `ctx.attachments.imageLimits`. A list row therefore repeated one
host-wide capability fact on every row. It now carries the summary mark like
the three log-derived units, so a summary read skips it while an opened Session
still receives it through `session/follow`, the control baseline, and
`session.projections`.

No other logic changes: the registration, its schema, its constant view, and
the host-side prompt validation keep reading `ctx.attachments` directly.
2026-10-18 23:04:29 +08:00
imccyu 0e1ffcb3a6 chore(persistence): regenerate the event catalog after the line shift
The catalog pages embed the declaring source location of each documented type.
Adding the summary-exclusion import and map-entry JSDoc to
`packages/todo/tool-todo/src/types.ts` moved `TodoItem` and `todo/write` two
lines down, so both catalog languages and their pairing record are regenerated.
No type fingerprint changes: `verify-persistence-changes` still reports 65
roots matching 16 history records.

A second `gen-persistence-catalog` run is required after a schema change: the
page and the machine inventory are generated in one pass, and the page reads
the inventory as it was on disk.
2026-10-18 22:39:11 +08:00
imccyu 0def172a02 chore(persistence): refresh source line references in the schema catalog
`docs/persistence-schema.json` records the declaring source location of every
persisted type. Adding the summary-exclusion import and map-entry JSDoc to
`packages/todo/tool-todo/src/types.ts` moved two declarations down by two
lines, so the generated catalog is regenerated. No persisted type, field, or
history record changes: `verify-persistence-changes` reports 65 roots matching
16 history records, and the release/format catalogs are unchanged.
2026-10-18 22:23:15 +08:00
imccyu 92f9e79fac perf(session-projection): serve session-list rows from a summary key set
A Session-list row no longer carries every registered client view: the three
units whose values a list row never renders (`turnOutline`, `sessionStats`,
and `todos`) are excluded, which removes the whole-log turn outline and the
figure and todo payloads from every row. An opened Session is unchanged —
`session/follow`, the `session/control` baseline, and `session.projections`
still serve every projected key.

The exclusion is one type-level mark plus one registration interlock:
`SessionProjectionSummaryExcluded<T>` marks a map entry, and
`ProjectionDefinition.wire` requires `summary: false` exactly on a marked key
and rejects it everywhere else, so the mark and the declaration cannot drift.
A nullable entry keeps `null` outside the wrapper, so `todos` stays
`TodoItem[] | null`. `summaryKeys()` returns the derived set, stable until a
registration or its disposal changes the key table, and the existing
key-taking read faces (`cachedSnapshot`, `viewCheckpoint`) accept that set
directly, so summaries need no separate read face and no per-read key copy.
`packages/api/session-controller/src/list.ts` passes the set to the live and
cold cached faces; `cachedPredecessorTitle` is untouched.

Client types only: `SessionSummary.projectionValues` narrows to
`SessionProjectionSummaryValues`, `SessionProjectionSnapshot.values` keeps
every view value with the mark stripped, and no wire field or client name
changed. The cache, subsystem page, and package README document the summary
rule and the two read faces.
2026-10-18 22:13:18 +08:00
imccyu f881f61024 feat(api-gateway): compress Remote stream WebSocket with permessage-deflate
Add a `websocketCompression` Gateway config field (`'deflate'` by default,
`'none'` to disable) and negotiate `permessage-deflate` on `/api/remote.mux`.
Frames whose JSON text reaches 1024 characters are compressed in the mux send
path, because `ws` ignores its `threshold` option under the default context
takeover. `maxPayload` is bounded by `max(streamInboxBytes, 1 MiB)` so one
compressed frame cannot inflate past the fixed ceiling.

Fixes #6476
2026-10-18 20:07:13 +08:00