Commit Graph

9398 Commits

Author SHA1 Message Date
imccyu
69a58ddd6f Merge branch 'master' into feat/ask-question-gui 2026-07-30 15:50:59 +08:00
Hypatia May
9ba6462d42 chore: retrigger CI after master merge 2026-07-30 15:50:02 +08:00
NI0317
a7c4e8424c Merge origin/master into codex/sandbox-policy-context 2026-07-30 15:48:16 +08:00
NI0317
7407c26bc1 feat(sandbox-policy): expose current file policy 2026-07-30 15:48:05 +08:00
Tianyi Cui
09c217eba7 Merge pull request #882 from deepseek-harness/worktree/persistent-bash-str-replace-editor
feat(tools): add persistent bash and str-replace editor
2026-07-30 15:47:39 +08:00
imccyu
d34bc5bfa4 test(web): pick up the plan chip in the answered composer golden
The always-visible plan-mode toggle (fe9191934) adds one composer-row
button; the answered transcript golden re-records with it.
2026-07-30 15:44:53 +08:00
Yichen Jiang
8f045bfdbd fix(cli)!: stop hoisting $DSH_HOME/.env into process.env
The shipped surfaces loaded the harness home's .env into the process
environment before cordis booted. credentials-local then saw every stored
key as an ambient launch override: describe reported source 'env' with
writable false, and set/unset rejected as shadowed — so a key the web page
or TUI stored was unrotatable and undeletable from the next run onward,
and the adapter kept using the value captured at launch.

The home's .env is now the credential provider's own store, read by that
provider alone and hot-reloaded by it. The genuine launch environment and
the invoking directory's .env (loaded by the bin) remain the read-only
ambient layer, so a plain composition without the provider still resolves
keys exactly as before.

Proven by a real restart in the loader composition: store a key through
the seam, dispose the tree, re-boot over the same harness home, and the
entry is still file-sourced and writable — rotating it lands on the very
next request.
2026-07-30 15:44:32 +08:00
Hypatia May
7bcf8d660d Merge remote-tracking branch 'origin/master' into fix/human-transcript-projection
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/ui/tui/README.i18n.yaml
2026-07-30 15:42:47 +08:00
imccyu
ee1d06e23d docs: regenerate the event matrix for the locale-seat question composer
ui-question no longer listens to locale/change directly — copy rides the
framework locale seat since the standard-seat merge — so the generated
matrix row drops it. gen-doc-graphs output, verified with --check.
2026-07-30 15:41:53 +08:00
Turtle
f6ab04e486 merge: update upstream master 2026-07-30 15:41:04 +08:00
imccyu
17fea637d5 Merge branch 'master' into codex/details-default-closed 2026-07-30 15:40:36 +08:00
Yichen Jiang
90c3118302 fix(credentials-local): one operation chain, read-modify-write under the shared writer lock, and a quote-aware line editor
Review round three, credentials half. dsh-atomic-write grows the
cross-process writer-lock primitive (withFileLock: wx sentinel, bounded
backoff, stale takeover via onStaleBreak, deadline failure) plus a dirMode
option, and settings-local migrates its private copy to it; both providers
now create harness-home directories 0700.

credentials-local reuses the reviewed settings-local shape: watcher
reloads and line edits share one settled operation chain; every write
re-reads the document under the lock and publishes unobserved external
entries before editing, so an edit inside the debounce window (or another
process's write) can never be overwritten; the watcher's ready signal
queues one reconcile closing the startup gap.

The line editor is now physical-line aware: continuation lines of a
quoted multi-line value are never mistaken for assignments, untouched
lines keep their exact bytes (CRLF included), an edited line keeps its
own terminator, and appends use the document's dominant ending. A
multi-line entry reports writable: false, matching what set() would do.

The Credentials base class owns a contained notifyUpdated fan-out:
providers publish only after the commit, every listener runs, sync throws
and async rejections are logged without failing the committed write, and
INVARIANT-coded failures rethrow after the fan-out.
2026-07-30 15:40:09 +08:00
Turtle
42ba71b4f2 test(tui): pin transient query access 2026-07-30 15:37:03 +08:00
imccyu
e184b9561a Merge branch 'master' into feat/ask-question-gui 2026-07-30 15:36:22 +08:00
Turtle
9af9222871 test(tui): stabilize workdir snapshot output 2026-07-30 15:35:21 +08:00
_Kerman
4370004360 refactor(agent): expose mutable inbox state 2026-07-30 15:35:18 +08:00
Hypatia May
30667e1eb9 Merge remote-tracking branch 'origin/master' into feat/session-inherited-boundary 2026-07-30 15:34:55 +08:00
imccyu
925cb0b315 feat(web): plan chip as an always-visible pressed-state toggle
fix: plan button add label
2026-07-30 15:33:45 +08:00
Hypatia May
9d26815126 test(web): wait for the driven session before snapshotting 2026-07-30 15:32:17 +08:00
Hypatia May
8527137230 refactor(session): rename the seed boundary to end-seed 2026-07-30 15:32:06 +08:00
creatixchu
fc872e06d2 Merge remote-tracking branch 'origin/feat/directory-picker-show-hidden' into feat/directory-picker-quiet-navigation 2026-07-30 15:31:17 +08:00
Turtle
0b1aaa4b12 test(tui): remove erased enum import 2026-07-30 15:30:59 +08:00
creatixchu
4795904c70 Merge remote-tracking branch 'origin/master' into feat/directory-picker-show-hidden 2026-07-30 15:30:39 +08:00
Turtle
da5f1878c0 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation 2026-07-30 15:29:47 +08:00
imccyu
245aeb414c feat(web): workspace header hover card with cwd and creation time 2026-07-30 15:29:12 +08:00
Turtle
d0bf9091f1 fix(cli): preserve active query access 2026-07-30 15:28:58 +08:00
imccyu
4c33ca8bec fix: hero layout when no-workspace 2026-07-30 15:25:50 +08:00
creatixchu
c90410deaa Merge remote-tracking branch 'origin/master' into feat/dir-selector-adaptive-default 2026-07-30 15:25:46 +08:00
creatixchu
e596d300d7 fix(directory-picker-browse): resolve quiet-navigation review 2026-07-30 15:22:28 +08:00
Tianyi Cui
2296065c51 Merge branch 'master' into worktree/persistent-bash-str-replace-editor 2026-07-30 15:22:19 +08:00
Tianyi Cui
b21f13baa1 test: update tool agent fixtures for inbox API 2026-07-30 15:21:42 +08:00
Tianyi Cui
2550882875 Merge branch 'master' into worktree/persistent-bash-str-replace-editor 2026-07-30 15:19:27 +08:00
Yichen Jiang
483199d47a Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config
# Conflicts:
#	apps/cli/cordis.yml
#	apps/web/tests/snapshots/code-mode-round/session.jsonl
#	apps/web/tests/snapshots/cordis-tool-round/session.jsonl
#	apps/web/tests/snapshots/fresh-round-trip/session.jsonl
#	apps/web/tests/snapshots/lifecycle-chrome/session.jsonl
#	apps/web/tests/snapshots/live-interactions/session.jsonl
#	apps/web/tests/snapshots/navigation-panes/seed.jsonl
#	apps/web/tests/snapshots/question-composer/session.jsonl
#	apps/web/tests/snapshots/seeded-history/seed.jsonl
#	apps/web/tests/snapshots/steering/session.jsonl
#	docs/cordis-catalog/events.md
#	docs/cordis-catalog/services.md
#	docs/core-data-structures/core.i18n.yaml
#	docs/core-data-structures/settings.i18n.yaml
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	examples/acp-agent/tests/snapshots/workspace-context/session.jsonl
#	packages/client/connection/README.i18n.yaml
#	packages/client/connection/src/index.ts
#	packages/client/connection/tests/node-half.spec.ts
#	packages/client/runtime/README.i18n.yaml
#	packages/client/runtime/README.md
#	packages/client/runtime/README.zh.md
#	packages/client/runtime/src/client/index.ts
#	packages/client/runtime/tests/fake-api.ts
#	packages/client/ui-models/README.i18n.yaml
#	packages/examples/tui-demo/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/package.json
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/rpc.schema.ts
#	packages/host/apiproxy/src/api/rpc.ts
#	packages/llm/llm-deepseek/README.i18n.yaml
#	packages/llm/llm-deepseek/README.zh.md
#	packages/llm/llm-pi-ai/README.i18n.yaml
#	packages/llm/llm/README.i18n.yaml
#	packages/llm/llm/README.zh.md
#	packages/sdk/sdk-client/README.i18n.yaml
#	packages/settings/settings/README.i18n.yaml
#	packages/settings/settings/README.md
#	packages/settings/settings/README.zh.md
#	packages/subagent/subagent-dsh-sdk/README.i18n.yaml
#	packages/subagent/subagent-dsh-sdk/README.zh.md
#	packages/support/llm-replay/README.i18n.yaml
#	packages/ui/jsonrpc/README.i18n.yaml
#	packages/ui/jsonrpc/README.zh.md
#	packages/ui/tui/tests/snapshots/model-selector.expected.txt
#	packages/ui/tui/tests/snapshots/model-switching.expected.txt
#	packages/ui/tui/tests/snapshots/resume-sessions.expected.txt
#	packages/ui/tui/tests/snapshots/status-diagnostics-narrow.expected.txt
#	packages/ui/tui/tests/snapshots/status-diagnostics.expected.txt
#	packages/ui/tui/tests/tui.snapshot.ts
#	pnpm-lock.yaml
#	python/sdk/README.i18n.yaml
#	scripts/snapshots/translation-prompt-v4/request-response.expected.json
2026-07-30 15:18:26 +08:00
imccyu
6ea1238714 docs(web): the composer bar is one session-maybe slot, not a swapped pair
fix(web): keep one composer bar DOM across the no-workspace transition

The composer.bar slot moves from session to session-maybe scope: with no
current session the entry still mounts, the machine faces (keyboard, stop,
command) arrive undefined, and the bar renders its normal DOM inert via the
disabled owner prop. DisabledInputBar and its parallel tree are gone, so the
textarea node survives the cold-start workspace pick instead of flashing
through a remount. A blank session whose workspace was deleted takes the
same inert path through owner props.

test(web): add the composer DOM-continuity acceptance probe

Drives a real dsh web server with headless chromium through the cold-start
-> pick-workspace -> type flow and asserts the composer textarea is the
same DOM node throughout (a marker property must survive). Rerun
prerequisites are in the header comment.

docs(web): session-maybe identity is adoption, not hold-forever

fix(web): session-maybe entries adopt the first session, then remount like strict entries

A session-maybe entry used to keep one React instance across every
transition, so component-local state leaked between sessions once the
composer bar moved to that scope (PermissionSelect's optimistic pick, the
IME composition guard). Identity is now adoption: an incarnation born
session-less holds through the arrival of the first session (the blank
shell's DOM survives the workspace pick), and afterwards behaves exactly
like a strict session entry — a switch or a drop to no-session remounts,
clearing local state by construction. The child key is an incarnation
counter kept in the stable outlet wrapper via render-phase setState.

chore: knip knows the root acceptance probe's playwright dependency

scripts/hero-composer-dom-continuity.mjs resolves playwright through
apps/web's devDependency tree (createRequire), which knip cannot follow;
ignore it at the root workspace.
2026-07-30 15:18:06 +08:00
imccyu
69214b4708 Merge pull request #955 from deepseek-harness/xtr/fix-trajectory-scroll-layering
fix(web): isolate trajectory scrolling and overlays
2026-07-30 15:17:31 +08:00
Hypatia May
e8f0934bc2 Merge remote-tracking branch 'origin/master' into feat/session-inherited-boundary 2026-07-30 15:14:16 +08:00
creatixchu
3a3f68f36d Merge remote-tracking branch 'origin/feat/directory-picker-show-hidden' into feat/directory-picker-quiet-navigation 2026-07-30 15:13:22 +08:00
Hypatia May
f66015455e test(session): cover the request/context fold and its turn enclosure
Adds direct coverage for `Session.requestContext()`: undefined before any
record, folding a seeded log on first read (the watermark starts at 0 with the
seed already in the log, so a first read must consume all of it), incremental
advance across appends, a batch appended between two reads, and the frozen
return that keeps a reader from desyncing later dedup comparisons.

The turn-enclosure assertion goes in the invariant spec rather than beside the
fold tests, because enclosure is enforced by the opt-in invariant companion
plugin and not by `append` itself. Asserting it on a bare Session would have
been a test that passes for the wrong reason.
2026-07-30 15:08:54 +08:00
imccyu
ecd07abdc0 test(web): refresh question-composer goldens for the merged composer
The master-side refresh batch recorded these goldens against master's
composer (customTrigger row, header pager); the merge keeps this
branch's redesigned composer (always-visible custom input, footer
pager) with copy on the standard locale seat, so the waiting aria and
the answered transcript re-record against the merged UI. The answered
golden also picks up the ask_user_question toolview row this branch
introduces.
2026-07-30 15:07:31 +08:00
Turtle
bcb049bef3 fix(prompt): distinguish checkout from workdir 2026-07-30 15:06:28 +08:00
imccyu
6c7520c652 Merge remote-tracking branch 'origin/master' into mergebot/pr883
# Conflicts:
#	apps/web/tests/snapshots/question-composer/answered.expected.md
#	apps/web/tests/snapshots/question-composer/ui.expected.md
2026-07-30 15:04:59 +08:00
Tianyi Cui
4f17303265 Merge pull request #913 from deepseek-harness/worktree/pr882-hardening
fix(tools): harden persistent bash and editor contracts
2026-07-30 15:04:18 +08:00
imccyu
03936cb320 Merge remote-tracking branch 'origin/master' into mergebot/pr883
# Conflicts:
#	packages/client/ui-question/package.json
#	packages/client/ui-question/src/client/QuestionComposer.tsx
#	packages/client/ui-question/src/client/contract/slots.ts
#	packages/client/ui-question/src/client/index.ts
#	packages/client/ui-question/src/client/locales.ts
#	packages/client/ui-question/tests/browser-plugin.spec.ts
#	packages/client/ui-question/tests/question-composer.spec.tsx
2026-07-30 15:01:10 +08:00
creatixchu
0ad6bf4b06 test(web): re-record directory-browser golden after master merge
The English-locale golden refreshed on master (8c753fd8f1) was recorded
against master's pre-miller dialog; this branch's own golden predated the
miller two-pane landing and was never enforced before the web browser
snapshot CI gate landed. Re-recorded against the merged tree: two-pane
landing plus the show-hidden footer toggle.
2026-07-30 15:00:43 +08:00
Turtle
39efc3dd73 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.i18n.yaml
#	docs/testing.i18n.yaml
2026-07-30 15:00:42 +08:00
Turtle
36f6d8fd05 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	packages/ui/tui/README.i18n.yaml
2026-07-30 14:58:10 +08:00
Turtle
a51143bded fix(cli): close shared config review gaps 2026-07-30 14:56:39 +08:00
Hypatia May
c84ad45f26 test(web): re-record composer stats goldens over merged master
Reapplies this branch's one added occupancy segment on top of master's own
golden refresh from the preceding merge. Recorded with DSH_SNAPSHOT=refresh,
not hand-edited: an attempt to strip the co-recorded context-injection
affordance out of these files broke replay, which is the suite working as
intended — a golden must match the real render byte-for-byte.

Web replay is now 76/77. The one failure, queue-actions ("edits and removes
exact pending occurrences", counts 2 user/message events where it expects 1),
reproduces at pristine origin/master and is untouched here.
2026-07-30 14:55:01 +08:00
creatixchu
fcab9b9e9c Merge remote-tracking branch 'origin/master' into feat/directory-picker-show-hidden 2026-07-30 14:50:59 +08:00
imccyu
5c2fc03d8f Merge branch 'master' into codex/details-default-closed 2026-07-30 14:50:50 +08:00