8171 Commits

Author SHA1 Message Date
Huanqi Cao
acda0e39bc Merge remote-tracking branch 'origin/master' into feat/pwsh-tool 2026-08-04 20:39:17 +08:00
_Kerman
92de5bb6d4 fix(trajectory): bound work during long streams 2026-08-04 20:37:33 +08:00
_Kerman
5372f56280 fix(client): avoid false initial prompts in tail windows 2026-08-04 20:37:25 +08:00
Turtle
e2049910d5 refactor(client): keep pending interaction change UI-scoped 2026-08-04 20:28:23 +08:00
pku-xht
451c2929ed fix(subagent): close terminal teardown races 2026-08-04 20:26:45 +08:00
fz
01fa4ceb6e test(workspace-context): cover pre-resume tool reconciliation 2026-08-04 20:12:32 +08:00
pku-xht
f96acad438 fix(subagent): preserve Codex fatal and grace semantics 2026-08-04 19:55:39 +08:00
fz
207c45d15f fix(workspace-context): deduplicate baseline on resume 2026-08-04 19:55:27 +08:00
xjt
c522053cef Merge origin/master into xjt/proofreading-active-docs-2-apply 2026-08-04 19:51:18 +08:00
_Kerman
674278cb17 Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
# Conflicts:
#	packages/client/ui-conversation/src/client/queue/QueueDock.tsx
2026-08-04 19:37:51 +08:00
Hypatia May
cc89c529c6 Merge remote-tracking branch 'origin/master' into fix/landlock-runner-failure-classification 2026-08-04 19:05:33 +08:00
Turtle
76d43d616d Merge remote-tracking branch 'origin/master' into codex/session-pending-interactions
# Conflicts:
#	packages/client/connection/README.i18n.yaml
#	packages/client/connection/README.md
#	packages/client/connection/README.zh.md
2026-08-04 19:03:01 +08:00
Turtle
3a54694d28 fix(client): preserve pending waits across reconnect 2026-08-04 18:52:11 +08:00
xjt
edb3e82c35 docs(i18n): address proofreading review findings 2026-08-04 18:42:13 +08:00
pku-xht
c09b20f96b fix(subagent): finalize Codex provider composition 2026-08-04 18:38:05 +08:00
creatixchu
fab131a366 fix(web): align the context separator with ToolRow and name the caption
Review follow-ups on the context provenance row:

- the producer name now follows ToolRow's aria-hidden separator dot instead
  of a literal middot inside the text, so the two disclosure rows expose one
  accessible-name shape;
- the English steering caption becomes the noun `Interjection`, parallel to
  the Chinese 插话 and to the label this bubble carried before;
- the history fold gets its own provenance assertion, so the mapping it
  declares separately from TranscriptAdapter is pinned on both sides;
- the superseded-in-part bullet on the no-interjection-chrome note now
  enumerates the third Decision bullet too, whose no-badge and no-IconActions
  clauses had both lapsed.
2026-08-04 18:25:44 +08:00
imccyu
6f10f9c01c Merge pull request #1527 from deepseek-harness/worktree-websocket
feat(web): move connection downlinks to WebSocket
2026-08-04 18:18:32 +08:00
pku-xht
8a24a68333 Merge origin/master at 52ec34f796 2026-08-04 18:01:22 +08:00
Huanqi Cao
39b0695d48 Merge remote-tracking branch 'origin/master' into feat/pwsh-tool
# Conflicts:
#	apps/cli/composition.md
#	docs/testing.i18n.yaml
#	docs/testing.md
#	docs/testing.zh.md
2026-08-04 17:54:45 +08:00
creatixchu
95a89078d5 docs(web): refresh the MessageItem module comment for the steering caption 2026-08-04 17:53:26 +08:00
Yichen Jiang
a45aa28ca6 Merge branch 'master' into claude/unified-environment-credentials-c8841a
Master removed the TUI package, the `meta` and `upgrade` subcommands, and
`--config-replace`, and made raw `dsh` require a `--config` overlay. Resolved
onto that shape:

- Dropped this branch's TUI edits with the surface itself, including
  `tui.cordis.yml`, `runTui`, and the TUI keyless PTY smoke.
- Dropped the `--config-replace` plumbing rather than reintroducing a flag
  master deliberately removed. The gap this branch fixed remains: `dsh -p`
  still could not name its composition, so it keeps `--config`.
- Kept this branch's deletion of the personal `$DSH_HOME/config.yaml` layer,
  which master still carried, and provided the environment snapshot in the new
  raw `runConfig` surface alongside web and headless.
- Ported the headless shutdown PTY test off the personal overlay onto a named
  `--config` file, which is what proves that flag now exists on `-p`.
2026-08-04 17:51:44 +08:00
Hypatia May
8c72cd3a8f docs(sandbox): align final runner evidence 2026-08-04 17:45:12 +08:00
creatixchu
de96087923 feat(web): name context sources and mark steering in the transcript
Every logged non-user user/message collapsed into one identical
「上下文注入」 row, and mid-turn steering rendered in exactly the bubble a
turn-opening prompt uses, so the transcript could not say what had been
added or which message interrupted a running turn.

TranscriptAdapter and the history fold now attach a provenance view to
each context node, computed by contextProvenance() from the durable
source alone: a role (inject, or recall for a cross-session snapshot)
and a producer name read out of the log — instruction paths for
workspace-instructions, session titles for session-reference, the plugin
id for a plugin source, and the bare kind for any other. No client-side
table of producer names, so a renamed or newly mounted producer stays
identifiable without a client release and a foreign log projects like a
live one. ContextInjectionRow titles itself from the role and shows the
name beside it; MessageItem captions durable and pending steering
bubbles.

The caption reverses one clause of the no-interjection-chrome decision,
which removed it because the composer could not steer; composer steering
shipped afterwards without amending that note, so this change supplies
the product decision its reintroduction clause required and corrects the
stale facts left in it.

Fixes #1291
2026-08-04 17:44:18 +08:00
xjt
2db712eec7 docs(i18n): proofread active Chinese documentation 2026-08-04 17:36:14 +08:00
Yichen Jiang
4f717f2da7 fix(web): address settings document review 2026-08-04 17:31:36 +08:00
Hypatia May
ea762e3962 test(sandbox): pin runner argv forms 2026-08-04 17:19:19 +08:00
Yichen Jiang
8c2970e70e fix(config): trust the invoking project, and stop leaking what it must not decide
Review found five real defects in the configuration-source work, all confirmed
against the code rather than argued:

1. The note claimed --config outranks settings.yaml. It does not: the settings
   seam registers a plugin's cordis entry config as the `base` layer and the
   user section layers over it, and the seam cannot tell a shipped value from a
   --config one. The note now states shipped reality and names --config-replace
   as the lever for a deployment that must win. Separately, a literal `apiKey`
   in settings outranked both the environment and .credentials.yaml — the field
   is removed, so configuration carries a reference and nothing else.
2. DEEPSEEK_SEARCH_BASE_URL was functionally deleted: the shipped inline went
   away without the provider learning to read it. It now resolves from the
   environment snapshot, as the README always claimed.
3. The bootstrap deny list missed the interpreter start-up hooks. BASH_ENV is
   the sharpest: `bash -c` sources it on every bash tool call, so a project
   .env could run a file of its choosing before every command. The list now
   covers BASH_ENV and its per-language siblings, the Git hook commands, and
   the remaining preload and CA variables, organised by what a variable does
   rather than which runtime owns it.
4. YAML parse errors quoted the offending source line — which in a credentials
   document is the secret — into boot stderr and the watcher's logger. Only the
   error code and position are reported now, in credentials-local and
   settings-local alike, pinned by a test that asserts the secret is absent.
5. 0600 governed only files the harness wrote. A hand-created 0644 document was
   read normally. POSIX now checks the mode before reading contents, at boot
   and on every reload; Windows has no mode to inspect and is skipped rather
   than faked.

The project a session is launched in is trusted by default, with no prompt and
no stored trust record: it may supply its own endpoint, ordinary variables, and
a key ranked below the managed store. Trust stops at the harness itself — a
discovered file still cannot set DSH_PERMISSION_MODE, PATH, BASH_ENV, or the
rest, because those take effect with no user action, before any turn, outside
the permission policy and the sandbox.
2026-08-04 17:16:11 +08:00
Turtle
00d4349eb4 feat(client): surface pending session interactions 2026-08-04 17:15:10 +08:00
pku-xht
36b562e4e9 fix(subagent): close Codex provider review findings 2026-08-04 17:13:38 +08:00
Hypatia May
c4e9893a87 test(sandbox): cover POSIX no-shebang fallback 2026-08-04 17:10:42 +08:00
Yichen Jiang
e31b7221e7 feat(web): open the local settings file 2026-08-04 16:59:37 +08:00
imccyu
b0b50be64f style(connection): satisfy callback lint 2026-08-04 16:58:40 +08:00
_Kerman
09e909b96b Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
# Conflicts:
#	apps/web/tests/snapshots/queue-actions/preserved.expected.md
#	packages/client/runtime/src/client/sessions/session.ts
2026-08-04 16:56:44 +08:00
Hypatia May
666690afe9 fix(sandbox): round 7 align spawn evidence 2026-08-04 16:55:11 +08:00
_Kerman
13fed3721f fix(trajectory): preserve state across history prepends 2026-08-04 16:53:52 +08:00
imccyu
3caa175286 test(connection): use valid mux frames 2026-08-04 16:49:06 +08:00
ZiyaZhang
047ea50987 feat(web): add preview badge to empty hero 2026-08-04 01:46:52 -07:00
imccyu
7f3a2dae91 fix(web): quiesce websocket teardown 2026-08-04 16:42:50 +08:00
creatixchu
70ec51b1ba Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter 2026-08-04 16:42:45 +08:00
imccyu
c6d0cbd8de test(web): cover WebSocket downlink races 2026-08-04 16:34:56 +08:00
imccyu
72f82f65c9 Merge remote-tracking branch 'origin/master' into mergebot/pr1389
# Conflicts:
#	apps/web/tests/snapshots/sidebar-scrollbar/geometry.expected.md
#	packages/client/ui-conversation/src/client/chat/MessageIconActions.tsx
#	packages/client/ui-conversation/src/client/chat/message-chrome.ts
2026-08-04 16:33:55 +08:00
creatixchu
60e4509c1d docs(web): trim the column's gutter comments to contract plus note link 2026-08-04 16:30:45 +08:00
pku-xht
270b8e0acc fix(subagent): close Codex provider CI gaps 2026-08-04 16:25:38 +08:00
imccyu
e9d76dae64 fix(web): address UI polish review feedback 2026-08-04 16:25:09 +08:00
creatixchu
1098dc9836 docs(web): cite the surviving composer scrollport note for the WebKit gutter measurement 2026-08-04 16:21:55 +08:00
imccyu
a36c641db6 chore(docs): refresh WebSocket API catalogs 2026-08-04 16:21:09 +08:00
creatixchu
e49f678614 Merge remote-tracking branch 'origin/master' into worktree/composer-scrollbar-gutter 2026-08-04 16:20:33 +08:00
Hypatia May
fe818862e1 fix(sandbox): round 6 bind spawn provenance 2026-08-04 16:20:04 +08:00
creatixchu
29646074cd Merge origin/master into worktree/sidebar-scrollbar-reveal 2026-08-04 16:19:46 +08:00
Yichen Jiang
0512b12714 feat(config)!: one ordering for configuration sources, and a bootstrap deny rule
$DSH_HOME/.env had just become an ordinary environment layer, which left the
harness resolving user-facing values from a flattened process.env that could
no longer say where a value came from. A key stored through the web page
stayed shadowed by an older key in the user's own .env. An endpoint could be
redirected by the project: the invoking directory's .env is materialized like
every other layer, and a base URL decides where a resolved API key is sent, so
a DEEPSEEK_BASE_URL written into a model-editable workspace would send the
user's credential — and the prompts carrying their code — to whatever host
that file named.

Give every user-facing value one ordering, with four kinds of source:

  explicit for this run     per-operation override, CLI argument
  > authored by deployment  --config / --config-replace
  > this launch's shell     inherited process environment
  > product-managed store   settings.yaml, .credentials.yaml
  > discovered file         $DSH_HOME/.env
  > defaults                schema default, shipped base, public default

The domains differ only in which tiers exist. The earlier split — credentials
ranking the environment over the managed file while settings ranked over the
environment — was inconsistent: the distinguishing fact is who authored the
source, not the domain.

packages/util/environment owns an immutable snapshot with per-layer
provenance. getFrom(name, sources) searches only the layers a caller names,
and omitting one is a refusal rather than a demotion: the adapters ask for
['process', 'user-env'], so no reordering can let a project file back into a
decision it was excluded from.

isBootstrapOnly rejects, before anything is materialized, any .env setting a
variable that governs how a process launches (PATH, SHELL, NODE_OPTIONS,
LD_PRELOAD), where code or model-visible instructions load from (the whole
DSH_* namespace, HOME, XDG_*), or how the network is reached (proxy and CA
variables). The namespace is denied wholesale so a switch added later cannot
become settable by being forgotten, and there is no opt-out.

verify-config-source-ownership keeps both rules: no unregistered process.env
read under packages/*/*/src (26 allowlisted with reasons), and no apiKey,
baseURL, or headers inlined from the environment in shipped Cordis config —
removing those inlines is what makes the deployment tier meaningful.
2026-08-04 16:17:32 +08:00