Commit Graph

190 Commits

Author SHA1 Message Date
imccyu
ecbd8babc1 Merge remote-tracking branch 'origin/master' into mergebot/pr711
# Conflicts:
#	apps/cli/README.i18n.yaml
#	apps/cli/README.md
#	apps/cli/README.zh.md
#	apps/cli/cordis.yml
#	apps/cli/package.json
#	docs/config-catalog.md
#	packages/client/runtime/README.i18n.yaml
#	packages/client/runtime/src/client/contract/sessions.ts
#	packages/client/test-runtime/src/sessions.ts
#	packages/client/ui-workspace/README.i18n.yaml
#	packages/client/ui-workspace/README.md
#	packages/client/ui-workspace/README.zh.md
#	packages/client/ui-workspace/src/client/WorkspaceBrowser.tsx
#	packages/client/ui-workspace/src/client/tree.ts
#	packages/client/ui-workspace/tests/apply.spec.ts
#	packages/client/ui-workspace/tests/tree.spec.ts
#	packages/host/apiproxy/README.i18n.yaml
#	packages/host/apiproxy/src/api-proxy.ts
#	packages/host/apiproxy/src/api/index.ts
#	packages/host/apiproxy/tests/client-handler.spec.ts
#	packages/host/apiproxy/tests/rpc-schemas.spec.ts
#	pnpm-lock.yaml
2026-07-31 01:28:15 +08:00
Yichen Jiang
9ebf7424f7 Merge latest master into worktree-llm-dynamic-config 2026-07-30 23:28:58 +08:00
Yichen Jiang
80c36ff0d3 Merge latest master into worktree-llm-dynamic-config 2026-07-30 22:18:16 +08:00
Tianyi Cui
b5f5a01dcb Merge remote-tracking branch 'origin/master' into worktree/pr798-retarget-config-20260730 2026-07-30 22:14:08 +08:00
Tianyi Cui
6777e4fab9 fix(fs-search): make glob sampling an explicit choice 2026-07-30 21:14:03 +08:00
Yichen Jiang
990d1bbc35 fix(cli): declare the config-plane providers the shared base config mounts
The master merge moved the TUI composition into `apps/cli/config/base.cordis.yml`
and I carried the `settings-local` / `credentials-local` rows across without
adding them to the resolver manifest. Bare specifiers in an app config resolve
through that manifest's dependencies, so the whole tree failed to boot:

  dsh: plugin(s) failed to load: @deepseek-ai/dsh-settings-local,
  @deepseek-ai/dsh-credentials-local

which took every TUI PTY smoke with it. `verify-cordis-config` did not catch
it, so the boot smoke was the first signal.
2026-07-30 20:25:13 +08:00
Yichen Jiang
eae4219e04 Merge branch 'worktree-config-settings-seam' into worktree-llm-dynamic-config
# Conflicts:
#	apps/cli/README.i18n.yaml
#	apps/cli/composition.md
#	apps/cli/config/base.cordis.yml
#	apps/cli/src/app-cli-entry.ts
#	apps/cli/src/tui.ts
#	apps/cli/tests/tui-keyless-smoke.e2e.ts
#	examples/package.json
#	packages/ui/app-boot/README.i18n.yaml
#	packages/ui/app-boot/README.md
#	packages/ui/app-boot/README.zh.md
#	pnpm-lock.yaml
#	python/sdk-runtime/package.json
2026-07-30 19:46:04 +08:00
creatixchu
5e4922a761 Merge remote-tracking branch 'origin/feat/directory-picker-quiet-navigation' into feat/dir-selector-adaptive-default
# Conflicts:
#	apps/cli/cordis.yml
#	packages/host/README.i18n.yaml
2026-07-30 18:41:41 +08:00
Yichen Jiang
e7894f4152 docs(credentials): record the third-review contracts across READMEs, catalogs, and a new Agent Note
Both provider READMEs state what actually holds: credentials-local now
documents the physical-line editor, the read-modify-write under the
writer lock, and a Security boundary section saying plainly that the file
mode stops other OS users and not the model. sandbox-policy documents
readDenyPaths and its per-backend enforcement. The llm READMEs carry the
registration handle, pi-ai's credential-miss semantics, and DeepSeek's
same-generation snapshot; app-boot and the CLI README stop describing
$DSH_HOME/.env as an environment layer.

A new Agent Note records the round (and the prior seam note cross-links
it); the sandbox and core catalog pages gain readDenyPaths and
AdapterRegistrationHandle with their manifest entries. The headless
missing-credential snapshot re-records for the reworded guidance, pi-ai
gains the Loader-composition guard its twin already had, and the
deliberate provider symmetry is marked for the clone detector.
2026-07-30 16:37:28 +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
Turtle
a51143bded fix(cli): close shared config review gaps 2026-07-30 14:56:39 +08:00
Turtle
208944645c fix(cli): align shared config lifecycle docs 2026-07-30 11:34:46 +08:00
Turtle
cd100a81f1 fix(cli): harden launcher lifecycle 2026-07-30 11:14:18 +08:00
Turtle
93748e5b47 fix(cli): preserve DSH home fallback in config 2026-07-30 11:00:59 +08:00
Turtle
f224bc347b test(cli): follow consolidated config tree 2026-07-30 10:59:56 +08:00
Turtle
efcffa0495 fix(cli): evaluate session root in config context 2026-07-30 10:53:43 +08:00
Turtle
c086de2074 fix(docs): align catalogs with consolidated CLI 2026-07-30 10:34:21 +08:00
Turtle
83360c3dca fix(cli): default session root in shipped config 2026-07-30 10:24:04 +08:00
Turtle
5dbcedfbba Merge origin/master into feature/shared-cli-config-foundation 2026-07-30 10:11:38 +08:00
Hypatia May
61163b7da5 Merge remote-tracking branch 'origin/master' into codex/basic-session-search
Conflict resolutions:

- `session.list`: master's projection columns fold into the PR's cancellable,
  batched `listVisibleSessionSummaries`, which `session.search` shares as its
  visibility baseline; master's goal helpers stay beside it.
- Client sessions face: master narrowed `ctx.sessions` to `ISessions`, so the
  search verb and its protocol-constant bound are declared there and the
  test-runtime double implements them (recorded, empty page unless a scenario
  stubs hits).
- `WorkspaceBrowser`: master's per-row Rename wiring rides the PR's search
  results view; the tree keeps the PR's query-free derivations.
- `dsh web` bin: the PR's shutdown-handlers-before-readiness order with
  master's boot-time LAN address snapshot.
- `session-query-sqlite`: master's `SCHEMA_VERSION` 7 stands; the PR's bump
  carried no schema change.
- Specs: master wraps assistant/steering message payloads and requires an
  `application/json` carrier request, so the search fixtures and tests follow.
- Web aria goldens keep master's recording plus the PR's search placeholder;
  the navigation-panes inventory keeps master's terminal-card golden next to
  the PR's search-results golden.
2026-07-30 09:40:38 +08:00
Turtle
3685740179 test(cli): move skill policy snapshot fixture 2026-07-30 00:23:58 +08:00
Turtle
7dfead7799 test(cli): keep file completion in source plane 2026-07-30 00:09:03 +08:00
Turtle
c00a54d334 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-07-30 00:01:13 +08:00
Turtle
74f75e9005 test(cli): align autocomplete test deadline 2026-07-29 23:47:46 +08:00
Turtle
19fc1575f3 Merge remote-tracking branch 'origin/master' into feature/shared-cli-config-foundation
# Conflicts:
#	packages/host/apiproxy/README.i18n.yaml
2026-07-29 23:41:20 +08:00
Turtle
c19facf9db refactor(cli): share app boot driver 2026-07-29 23:39:09 +08:00
Turtle
d2270eefcd fix(cli): align personal overlay semantics 2026-07-29 23:36:58 +08:00
Turtle
5b35132e62 test(cli): allow artifact PTY startup contention 2026-07-29 22:28:34 +08:00
Turtle
3d3a261793 docs(cli): remove stale composition references 2026-07-29 21:59:44 +08:00
Turtle
dfca95e93f fix(tui): remove disposable query index on exit 2026-07-29 21:51:22 +08:00
Turtle
bdc2b4667f refactor(cli): keep hmr in shared base 2026-07-29 21:43:33 +08:00
Turtle
ff126751d8 refactor(cli): keep migrate out of scope 2026-07-29 21:41:51 +08:00
Turtle
d8e4fd3b75 fix(cli): align meta invocation contract 2026-07-29 21:39:38 +08:00
Turtle
a01c1bccd6 fix(docs): parse inserted composition rows 2026-07-29 21:30:51 +08:00
Turtle
b1697ffd29 fix(web): assemble and package the shipped overlay 2026-07-29 21:28:05 +08:00
Turtle
9bbaea45fd docs(cli): explain config overlay modes 2026-07-29 21:15:48 +08:00
Turtle
984830c940 fix(tui): isolate each process query index 2026-07-29 21:15:48 +08:00
Turtle
d44fce8a39 fix(cli): keep meta as a fresh-session command 2026-07-29 21:15:48 +08:00
Turtle
857a4941be fix(cli): restore shipped surface capabilities 2026-07-29 21:15:48 +08:00
Turtle
bee0a77aad chore: refresh generated review records 2026-07-29 21:15:48 +08:00
Turtle
030b044350 fix(cli): reject leaked config replacement flags 2026-07-29 21:15:48 +08:00
Turtle
ea9315841f refactor(session): exclude live-session registry foundation 2026-07-29 21:15:48 +08:00
Turtle
9e2c3d3093 refactor(cli): exclude tmux context and source guard 2026-07-29 21:15:48 +08:00
Turtle
c1324ee896 fix(cli): preserve overlays without session registration 2026-07-29 21:15:42 +08:00
Turtle
8f2f6ef0ac refactor(cli): exclude live-session registry surface 2026-07-29 21:15:42 +08:00
Turtle
a459a918e2 fix(cli): remove obsolete resolver dependencies 2026-07-29 21:15:42 +08:00
Turtle
571562788d chore: reconcile extracted foundation with current master 2026-07-29 21:15:42 +08:00
Turtle
10ff76de9c fix(cli): declare every plugin the shipped config trees name
The Loader resolves each config row against the composing app, so moving the
TUI composition from examples/ into apps/cli left eleven rows unresolvable from
the built bin: `node apps/cli/lib/bin.js` died at boot with "plugin(s) failed to
load". Source-mode runs hid it, because tsconfig paths resolve the whole
workspace regardless of who declares what.

Also declares `dsh-llm-pi-ai` and `dsh-tmux-context`, which a personal
`~/.dsh/config.yaml` inserts to swap the model adapter. Those previously
resolved only because the config lived under examples/, whose package.json
declares the union of every leaf's plugins.

Caught by running the built bin from a scratch directory, which is how a user
actually starts it.
2026-07-29 21:15:42 +08:00
Turtle
f290a8b851 refactor(cli)!: one shared base config with per-surface overlays
`dsh` shipped two config trees that were 43 rows the same: apps/cli/cordis.yml
composed web as 74 flat rows, while the TUI booted examples/tui-agent/cordis.yml
whose single `@deepseek-ai/dsh-tui-demo` row mounted twelve plugins behind a
twenty-key pass-through Config. Neither file was what its location claimed —
apps/cli hardcoded the "example" as the product default and the "demo" bundle
was the application — and every capability change had to be made twice.

- apps/cli/base.cordis.yml holds the 43 shared rows; tui.cordis.yml and
  web.cordis.yml are patch lists stating only what differs per surface
- overlays apply as SIBLING patch lists at one include level, because include
  patches never cross an include boundary. Precedence: base < surface <
  (--config | personal ~/.dsh/config.yaml) < launcher flag/profile patches
- `--config` now applies an overlay INSTEAD OF the personal one, so a demo or
  test tree never inherits the user's route; new `--config-replace` boots a file
  as the entire tree (the old `--config` behaviour). Both survive /resume
- vendor/include: index each `insert`ed row as it is added so a later patch can
  configure or disable it. Upstream built the id index once before the patch
  loop, leaving every surface-only row — the whole TUI front door — silently
  unpatchable from user config. Logged as local modification 8
- session identity moves to dsh-agent-loop's CONFIGURED_AGENT_IDENTITIES_KEY;
  dsh-tui's MAIN_SESSION_ID_KEY is deleted (only the bundle read it)
- delete examples/tui-agent, examples/cordis-agent, packages/examples/tui-demo;
  TUI tests → apps/cli/tests, cordis e2e → packages/cordis/tool-cordis/tests,
  examples/code-mode survives as an overlay leaf
- `dsh web` gains --config, threaded into AppCLIEntry as an extra overlay

Three latent defects surfaced and are fixed here: the TUI captured the optional
sessionQuery service once at construction and could permanently disable /resume
when it won the mount race; the session-store root silently reverted to a
project-local ./.sessions; --config-replace was dropped by the resume handoff.

Verified by booting each tree through the real Loader (TUI 55 entries, web 75,
zero unsettled) rather than reading YAML. All eight terminal snapshots replay
byte-identically; 14/14 PTY smoke, 112/112 snapshots, 25/25 doc-sync, hygiene
and lint clean.
2026-07-29 21:15:42 +08:00
Turtle
e7c0a5b794 Merge origin/master: web permission sandbox, default pi-ai providers 2026-07-29 21:15:34 +08:00