Yichen Jiang
e6483f0afc
feat(settings): detect stale writers with a revision, and announce raw changes
...
The remaining P1 from the #939 review, plus the P2 it shares a mechanism with.
Nothing carried a version, so two tabs editing one namespace silently
overwrote each other — reproduced as tab B's `reasoning` lost to tab A's
older draft. The seam's per-namespace write queue orders writes; it cannot
tell a fresh writer from one replaying a snapshot a predecessor superseded.
Each namespace now carries a monotonic `revision` over its RAW section. A
write may send `expectedRevision`, checked at the FRONT of the queue (not at
call time, which would race the very predecessor it guards against); a
mismatch rejects with `SettingsConflictError` → `settings-conflict` on the
wire, carrying both revisions. The editor captures the revision it opened at
and, on conflict, asks the user to reopen rather than replaying its snapshot.
The same counter fixes the missing broadcast. `settings/updated` is gated on
the resolved value — correct for consumers, wrong for configuration surfaces:
storing an override equal to the composition base leaves the resolved value
alone while changing what the document says (the field is now overridden, not
inherited) and moving every open editor's revision. `settings/document-updated
(ns, revision)` fires on any raw-section change, in-process or external, and
`host/settings-changed` now rides it.
That event also closes the stale model picker: editing a provider's `models`
changes no route, so `llm/adapters-updated` never fired and an open picker
kept serving the old catalog. A change to an exposed provider namespace now
emits `host/models-changed` too — that namespace holds the catalog.
Docs: both sides of the five touched README pairs, a type-equiv block for
`SettingsPathOp`, and an Agent Note recording what the plane exposes and who
may overwrite what. The deferred wire-redaction gaps (secrets behind
union/intersection/transform, `.default(...)` in the served envelope, schema
text in rejection messages, `new Function` rehydration, pi-ai's `headers`) are
recorded as TODO(settings-wire-redaction) and in Known Limitations rather than
half-fixed.
2026-07-30 19:24:21 +08:00
Yichen Jiang
0a263941ef
Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config
...
# Conflicts:
# docs/cordis-catalog/services.md
# docs/core-data-structures/core.i18n.yaml
# docs/event-producer-consumer.md
# examples/headless-agent/tests/headless.snapshot.ts
# examples/headless-agent/tests/snapshots/missing-credential/stream-json.expected.jsonl
# packages/llm/llm-deepseek/README.i18n.yaml
# packages/llm/llm-deepseek/src/index.ts
# packages/llm/llm-pi-ai/README.i18n.yaml
# packages/llm/llm-pi-ai/src/index.ts
# packages/llm/llm/README.i18n.yaml
# packages/llm/llm/src/index.ts
2026-07-30 17:22:44 +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
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
Yichen Jiang
8ff6b23214
Merge branch 'worktree-config-settings-seam' into worktree-llm-dynamic-config
...
# Conflicts:
# docs/capability-seams.md
# docs/cordis-catalog/services.md
# docs/core-data-structures/core.i18n.yaml
# docs/module-graph.md
# examples/tui-agent/cordis.yml
# packages/README.i18n.yaml
# packages/cordis/tool-cordis/src/api-catalog.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-pi-ai/README.zh.md
# packages/settings/settings-local/src/index.ts
# packages/util/README.i18n.yaml
# packages/util/README.md
# packages/util/README.zh.md
# scripts/doc-budgets.manifest.json
2026-07-30 14:33:36 +08:00
Yichen Jiang
b6bb24bfa1
docs: raise AGENTS.md and packages/README.md budget ceilings after the master merge
...
Both files fit their ceilings on each parent; the merge union of this
branch's settings rows with master's typert row and source-launch rewrite
overflows by 6 and 2 words. Every added row is a fixed-format layout or
package-table entry with nothing to relocate, so the ceilings move to the
union size.
2026-07-30 13:20:47 +08:00
Yichen Jiang
c50aaea5e9
Merge remote-tracking branch 'origin/master' into worktree-config-settings-seam
...
# Conflicts:
# docs/cordis-catalog/events.md
# docs/core-data-structures/core.i18n.yaml
# docs/event-producer-consumer.md
# packages/README.i18n.yaml
# packages/cordis/tool-cordis/src/api-catalog.ts
# scripts/doc-budgets.manifest.json
2026-07-30 13:13:59 +08:00
Yichen Jiang
596334254c
docs: align the config-page docs and terminology with the single-key editor rounds
2026-07-30 12:45:22 +08:00
Yichen Jiang
65bd54f8b4
fix(tests): route the cross-adapter e2e to deepseek-official and re-record the translation-prompt snapshot
2026-07-30 11:16:05 +08:00
Yichen Jiang
51415debe5
docs: bilingual config-plane documentation, regenerated catalogs, and the web-config-plane Agent Note
2026-07-30 10:53:39 +08:00
kingwl
ebbcfdd03b
Merge remote-tracking branch 'origin/master' into codex/web-queue-actions
...
# Conflicts:
# packages/core/agent-loop/src/agent.ts
2026-07-30 03:33:41 +08:00
Tianyi Cui
4582e1425c
Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729
...
# Conflicts:
# eslint.config.mjs
2026-07-30 01:18:28 +08:00
kingwl
76e14793a9
Merge remote-tracking branch 'origin/master' into codex/web-queue-actions
...
# Conflicts:
# docs/architecture.i18n.yaml
# docs/cordis-catalog/events.md
# docs/core-data-structures/core.i18n.yaml
# docs/event-producer-consumer.md
2026-07-30 01:04:25 +08:00
kingwl
c97b1d025e
Merge remote-tracking branch 'origin/master' into codex/web-queue-actions
...
# Conflicts:
# apps/web/tsconfig.json
# docs/architecture.i18n.yaml
# docs/event-producer-consumer.md
# packages/client/runtime/README.i18n.yaml
# packages/client/tsdown.client.ts
# packages/client/ui-conversation/README.i18n.yaml
# packages/core/agent-loop/README.i18n.yaml
# packages/core/agent/README.i18n.yaml
# packages/core/agent/README.zh.md
# packages/host/apiproxy/README.i18n.yaml
# tsconfig.host.json
2026-07-30 00:30:38 +08:00
Tianyi Cui
0440c4cc0c
Merge latest master into codex/migrate-to-oxlint
2026-07-30 00:13:30 +08:00
imccyu
ed1ae0d636
fix: docs budget
2026-07-30 00:12:03 +08:00
kingwl
f893e2281d
feat(agent): add addressable queue operations
2026-07-30 00:05:00 +08:00
imccyu
dcb8b592ee
Merge remote-tracking branch 'origin/master' into worktree-trpc
2026-07-30 00:04:52 +08:00
imccyu
c269febc9a
refactor(cordis): generate catalogs from Typert models
2026-07-29 23:55:12 +08:00
imccyu
f773985e71
feat(typert): add compiler-independent type pipeline
2026-07-29 23:45:42 +08:00
Tianyi Cui
e673524976
refactor: centralize Oxlint worker bounds
2026-07-29 23:39:49 +08:00
Tianyi Cui
fca0c05155
Merge remote-tracking branch 'origin/master' into worktree/pr823-retarget-latest-20260729
...
# Conflicts:
# docs/config-catalog.md
# docs/cordis-catalog/services.md
# docs/core-data-structures/skills.i18n.yaml
# docs/core-data-structures/skills.md
# docs/core-data-structures/skills.zh.md
# packages/host/apiproxy/README.i18n.yaml
# packages/skill/skill-local/README.i18n.yaml
# packages/skill/skill/README.i18n.yaml
# packages/skill/skill/README.md
# packages/skill/skill/README.zh.md
# packages/skill/skill/src/index.ts
# packages/skill/skill/tests/skill.spec.ts
# packages/skill/tool-skill/README.i18n.yaml
# packages/skill/tool-skill/src/index.ts
# packages/ui/tui/README.i18n.yaml
# packages/ui/tui/README.md
# packages/ui/tui/README.zh.md
# packages/ui/tui/src/index.ts
# packages/ui/tui/tests/tui.spec.ts
2026-07-29 23:36:49 +08:00
Tianyi Cui
f7ee0bf0fd
fix: allow ignored-only staged lint
2026-07-29 23:36:08 +08:00
Tianyi Cui
8f34131f01
fix: restore unused suppression reports
2026-07-29 23:35:10 +08:00
Tianyi Cui
59940f0863
test: keep lint format rules aligned
2026-07-29 23:34:30 +08:00
Tianyi Cui
fe5d0001ab
test: pin Oxlint compatibility rules
2026-07-29 23:29:59 +08:00
Tianyi Cui
d29c5e0c07
test: prove Oxlint project discovery
2026-07-29 23:28:32 +08:00
Tianyi Cui
df9608c43d
test: make lint profile fingerprint honest
2026-07-29 23:26:16 +08:00
Tianyi Cui
0659151cd5
test: refresh translation prompt snapshot
2026-07-29 22:57:32 +08:00
Tianyi Cui
e91ef39f5a
fix: preserve lint migration contracts
2026-07-29 22:38:20 +08:00
Tianyi Cui
16e1734444
Merge origin/master at 90bc53cc64 into skill catalog hot refresh
2026-07-29 21:43:13 +08:00
Tianyi Cui
502e64c00d
Merge origin/master at ecbf75a5e7 into skill catalog hot refresh
2026-07-29 21:42:18 +08:00
Tianyi Cui
e1984cbfd9
Merge commit '90bc53cc64dc684dc3d741f45ae6a8d548c188f9' into worktree/retarget-pr885-20260729
2026-07-29 21:40:13 +08:00
Tianyi Cui
32aaa8983e
Merge commit 'ecbf75a5e70f662b6420375140cf12eb6bac7860' into worktree/retarget-pr885-20260729
...
# Conflicts:
# docs/development.i18n.yaml
# packages/client/ui-conversation/src/client/chat/MessageItem.tsx
# packages/client/ui-primitives/src/markdown/CodeBlock.tsx
# scripts/snapshots/translation-prompt-v4/request-response.expected.json
2026-07-29 21:37:43 +08:00
Tianyi Cui
754e163663
Merge remote-tracking branch 'origin/master' into worktree/pr823-retarget-latest-20260729
2026-07-29 21:26:44 +08:00
Tianyi Cui
52d68a5383
fix(skill): retain candidates across watcher failures
2026-07-29 21:17:27 +08:00
imccyu
8dca750c8e
Merge branch 'master' into trajectory-history-source
2026-07-29 21:12:31 +08:00
Tianyi Cui
de4f2a12f0
Merge remote-tracking branch 'origin/master' into worktree/pr823-retarget-latest-20260729
2026-07-29 21:06:24 +08:00
Tianyi Cui
5c0c59847b
Merge remote-tracking branch 'origin/master' into worktree/pr823-retarget-latest-20260729
...
# Conflicts:
# packages/client/ui-skill/README.i18n.yaml
# packages/client/ui-skill/README.zh.md
# packages/host/apiproxy/src/api-proxy.ts
# packages/skill/skill-local/README.i18n.yaml
# packages/skill/skill-local/README.zh.md
# packages/skill/skill/README.i18n.yaml
# packages/skill/skill/README.zh.md
# packages/skill/tool-skill/README.i18n.yaml
2026-07-29 21:05:09 +08:00
imccyu
b23c3d596a
Merge remote-tracking branch 'origin/master' into trajectory-history-source
2026-07-29 20:58:04 +08:00
Tianyi Cui
4368c2d40c
Merge branch 'master' into fix/translation-brief-uncommitted-pair
2026-07-29 20:54:30 +08:00
j-xiang
ed4a6fd026
docs(i18n): address automated review
2026-07-29 17:46:06 +08:00
_Kerman
859452d807
Merge remote-tracking branch 'github/master' into xtr/trajectory-inspection-ui
...
# Conflicts:
# apps/web/tests/snapshots/code-mode-round/ui.expected.md
# apps/web/tests/snapshots/cordis-tool-round/ui.expected.md
# apps/web/tests/snapshots/fresh-round-trip/ui.expected.md
# apps/web/tests/snapshots/lifecycle-chrome/hero.expected.md
# apps/web/tests/snapshots/lifecycle-chrome/reloaded.expected.md
# apps/web/tests/snapshots/live-interactions/cancel.expected.md
# apps/web/tests/snapshots/live-interactions/error-auth.expected.md
# apps/web/tests/snapshots/live-interactions/retry.expected.md
# apps/web/tests/snapshots/question-composer/answered.expected.md
# apps/web/tests/snapshots/seeded-history/ui.expected.md
# apps/web/tests/snapshots/steering/mid-steer.expected.md
# apps/web/tests/snapshots/steering/settled.expected.md
# packages/client/runtime/src/client/contract/session.ts
# packages/client/ui-conversation/README.i18n.yaml
2026-07-29 17:31:33 +08:00
Tianyi Cui
5bf93e4229
Merge origin/master into worktree/skill-catalog-hot-refresh
2026-07-29 16:40:40 +08:00
Yichen Jiang
fee12f1af0
refactor(llm-deepseek)!: rename the provider route to deepseek-official
...
The native adapter's route was named deepseek, colliding with pi-ai's
catalog provider of the same name, so the two DeepSeek paths could never
be mounted side by side. The web settings page needs both configurable at
once. Compositions, fixtures, goldens, scaffolding defaults, and docs all
move together (pre-release, no shim); TUI/session-query-spill/
missing-credential goldens re-recorded through their keyless refresh
modes because provider-name length shifts box padding and spill
truncation points.
2026-07-29 16:36:07 +08:00
j-xiang
94b2862e12
Merge remote-tracking branch 'origin/master' into xjt/readme-proofreading-batch-1
2026-07-29 15:47:00 +08:00
j-xiang
46e1e86c76
docs(i18n): bind reviewed README terminology
2026-07-29 15:29:03 +08:00
imccyu
4da1026956
Merge branch 'master' into xtr/dsh-source-launch-tsx-esm
2026-07-29 15:29:00 +08:00
Tianyi Cui
2e7ac0d7f2
Merge branch 'master' into agent/fix-copied-worktree-hooks
2026-07-29 14:55:36 +08:00
Turtle
203767cd37
test: prove ESLint to Oxlint rule parity
2026-07-29 14:47:50 +08:00