From 7e445c3a676596b373cc20478384352ad86d8299 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Thu, 30 Jul 2026 01:52:06 +0800 Subject: [PATCH] refactor(session): fold the session family into packages/session/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git mv the 12 packages from session-persistence/, session-projection/, session-title/, and telemetry/ into one session/ group per the regrouping RFC; merge the four group READMEs into one bilingual triplet; rewrite the group segment in tsconfig references (intra-group references shorten to ../), tsconfig.base.json paths/globs, knip.json keys, vitest include, gate scripts, and authored doc/note citations; regenerate module graph, doc graphs, catalogs, and the lockfile importer keys. No npm names change. Full unit suite: 8779 passed; the 18 reported failures reproduce as env flakes (ambient-proxy IPv6 tunneling, watched-dir inotify timeouts under parallel load) — each passes in isolation with NO_PROXY set, matching their known pre-existing behavior on master. --- .../2026-06-18-session-surface.i18n.yaml | 4 +- .../2026-06-18-session-surface.md | 6 +-- .../2026-06-18-session-surface.zh.md | 6 +-- ...-07-21-log-backed-session-titles.i18n.yaml | 4 +- .../2026-07-21-log-backed-session-titles.md | 2 +- ...2026-07-21-log-backed-session-titles.zh.md | 2 +- ...3-session-telemetry-otel-revival.i18n.yaml | 4 +- ...26-07-23-session-telemetry-otel-revival.md | 2 +- ...07-23-session-telemetry-otel-revival.zh.md | 2 +- .../2026-07-06-node-engine-floor.i18n.yaml | 4 +- .../process/2026-07-06-node-engine-floor.md | 2 +- .../2026-07-06-node-engine-floor.zh.md | 2 +- ...-domain-kv-storage-and-workspace.i18n.yaml | 4 +- ...6-07-24-domain-kv-storage-and-workspace.md | 4 +- ...7-24-domain-kv-storage-and-workspace.zh.md | 2 +- ...root-and-derived-medium-recovery.i18n.yaml | 4 +- ...torage-root-and-derived-medium-recovery.md | 2 +- ...age-root-and-derived-medium-recovery.zh.md | 2 +- ...ssembled-assistant-messages-only.i18n.yaml | 4 +- ...06-20-assembled-assistant-messages-only.md | 2 +- ...20-assembled-assistant-messages-only.zh.md | 2 +- ...ld-session-persistence-interface.i18n.yaml | 4 +- ...6-20-fold-session-persistence-interface.md | 2 +- ...0-fold-session-persistence-interface.zh.md | 2 +- ...06-20-truncate-interrupted-turns.i18n.yaml | 4 +- .../2026-06-20-truncate-interrupted-turns.md | 2 +- ...026-06-20-truncate-interrupted-turns.zh.md | 2 +- AGENTS.md | 2 +- docs/architecture.i18n.yaml | 4 +- docs/architecture.md | 4 +- docs/architecture.zh.md | 4 +- docs/capability-seams.md | 12 ++--- .../persistence.i18n.yaml | 4 +- docs/core-data-structures/persistence.md | 6 +-- docs/core-data-structures/persistence.zh.md | 6 +-- .../session-title.i18n.yaml | 4 +- docs/core-data-structures/session-title.md | 4 +- docs/core-data-structures/session-title.zh.md | 4 +- docs/persistence-catalog.md | 4 +- knip.json | 6 +-- packages/README.i18n.yaml | 4 +- packages/README.md | 5 +- packages/README.zh.md | 5 +- packages/client/runtime/tsconfig.json | 4 +- packages/client/ui-conversation/tsconfig.json | 2 +- packages/core/agent-loop/tsconfig.json | 2 +- .../examples/acp-demo/tests/built-bin.e2e.ts | 4 +- packages/examples/acp-demo/tsconfig.json | 4 +- .../examples/agent-spine-demo/tsconfig.json | 2 +- packages/goal/goal/tsconfig.json | 2 +- packages/hooks/hooks-claude/tsconfig.json | 2 +- packages/hooks/hooks-codex/tsconfig.json | 2 +- packages/host/apiproxy/tsconfig.json | 8 +-- packages/llm/token-meter/tsconfig.json | 2 +- packages/plan/plan-mode/tsconfig.json | 2 +- packages/sdk/helper/tsconfig.json | 4 +- packages/session-persistence/README.i18n.yaml | 6 --- packages/session-persistence/README.md | 14 ------ packages/session-persistence/README.zh.md | 14 ------ packages/session-projection/README.i18n.yaml | 6 --- packages/session-projection/README.md | 10 ---- packages/session-projection/README.zh.md | 10 ---- .../session-query-sqlite/tsconfig.json | 2 +- .../session-query/session-query/tsconfig.json | 4 +- packages/session-title/README.md | 14 ------ packages/session-title/README.zh.md | 14 ------ .../README.i18n.yaml | 6 +-- packages/session/README.md | 49 +++++++++++++++++++ packages/session/README.zh.md | 49 +++++++++++++++++++ .../README.i18n.yaml | 0 .../session-checkpoint-policy/README.md | 0 .../session-checkpoint-policy/README.zh.md | 0 .../session-checkpoint-policy/package.json | 0 .../session-checkpoint-policy/src/index.ts | 0 .../src/invariant.ts | 0 .../tests/crash-recovery.e2e.ts | 0 .../tests/fixtures/crash-child.ts | 0 .../tests/session-checkpoint-policy.spec.ts | 0 .../session-checkpoint-policy/tsconfig.json | 2 +- .../README.i18n.yaml | 0 .../session-persistence-jsonl/README.md | 0 .../session-persistence-jsonl/README.zh.md | 0 .../session-persistence-jsonl/package.json | 0 .../session-persistence-jsonl/src/format.ts | 0 .../session-persistence-jsonl/src/index.ts | 0 .../src/invariant.ts | 0 .../session-persistence-jsonl/src/win32.ts | 0 .../src/zstd-private-decoder.ts | 0 .../src/zstd-public-decoder.ts | 0 .../session-persistence-jsonl/src/zstd.ts | 0 .../tests/jsonl.spec.ts | 0 .../tests/win32.spec.ts | 0 .../tests/zstd.compat.spec.ts | 0 .../tests/zstd.spec.ts | 0 .../session-persistence-jsonl/tsconfig.json | 2 +- .../README.i18n.yaml | 0 .../session-persistence-sqlite/README.md | 0 .../session-persistence-sqlite/README.zh.md | 0 .../session-persistence-sqlite/package.json | 0 .../session-persistence-sqlite/src/index.ts | 0 .../src/invariant.ts | 0 .../session-persistence-sqlite/src/schema.ts | 0 .../tests/sqlite.spec.ts | 0 .../session-persistence-sqlite/tsconfig.json | 2 +- .../session-persistence/README.i18n.yaml | 0 .../session-persistence/README.md | 0 .../session-persistence/README.zh.md | 0 .../session-persistence/package.json | 0 .../session-persistence/src/coordinator.ts | 0 .../session-persistence/src/index.ts | 0 .../session-persistence/src/invariant.ts | 0 .../session-persistence/src/preparations.ts | 0 .../session-persistence/src/revision.ts | 0 .../session-persistence/src/write-behind.ts | 0 .../session-persistence/tests/contract.ts | 0 .../tests/coordinator-contract.ts | 0 .../tests/persistence.spec.ts | 0 .../tests/preparations.spec.ts | 0 .../tests/write-behind.spec.ts | 0 .../session-persistence/tsconfig.json | 0 .../session-projection-cache/README.i18n.yaml | 0 .../session-projection-cache/README.md | 0 .../session-projection-cache/README.zh.md | 0 .../session-projection-cache/package.json | 0 .../session-projection-cache/src/index.ts | 0 .../session-projection-cache/src/invariant.ts | 0 .../session-projection-cache/src/spec.ts | 0 .../tests/cache.spec.ts | 0 .../session-projection-cache/tsconfig.json | 2 +- .../session-projection/README.i18n.yaml | 0 .../session-projection/README.md | 0 .../session-projection/README.zh.md | 0 .../session-projection/package.json | 0 .../session-projection/src/index.ts | 0 .../session-projection/src/invariant.ts | 0 .../session-projection/src/types.ts | 0 .../session-projection/tests/registry.spec.ts | 0 .../session-projection/tsconfig.json | 0 .../session-telemetry-otel/README.i18n.yaml | 0 .../session-telemetry-otel/README.md | 0 .../session-telemetry-otel/README.zh.md | 0 .../session-telemetry-otel/package.json | 0 .../session-telemetry-otel/src/index.ts | 0 .../session-telemetry-otel/src/invariant.ts | 0 .../session-telemetry-otel/src/user-id.ts | 0 .../tests/loader-composition.e2e.ts | 0 .../session-telemetry-otel/tests/otel.spec.ts | 0 .../tests/user-id.spec.ts | 0 .../session-telemetry-otel/tsconfig.json | 0 .../session-telemetry/README.i18n.yaml | 0 .../session-telemetry/README.md | 0 .../session-telemetry/README.zh.md | 0 .../session-telemetry/package.json | 0 .../session-telemetry/src/coordinator.ts | 0 .../session-telemetry/src/index.ts | 0 .../session-telemetry/src/invariant.ts | 0 .../session-telemetry/tests/redact.spec.ts | 0 .../session-telemetry/tests/telemetry.spec.ts | 0 .../session-telemetry/tsconfig.json | 0 .../README.i18n.yaml | 0 .../session-title-all-messages-llm/README.md | 0 .../README.zh.md | 0 .../package.json | 0 .../src/index.ts | 0 .../src/invariant.ts | 0 .../tests/provider.spec.ts | 0 .../tsconfig.json | 0 .../README.i18n.yaml | 0 .../session-title-first-message-llm/README.md | 0 .../README.zh.md | 0 .../package.json | 0 .../src/index.ts | 0 .../src/invariant.ts | 0 .../tests/loader-composition.spec.ts | 0 .../tests/provider.e2e.ts | 0 .../tests/provider.spec.ts | 0 .../tsconfig.json | 0 .../session-title-llm/README.i18n.yaml | 0 .../session-title-llm/README.md | 0 .../session-title-llm/README.zh.md | 0 .../session-title-llm/package.json | 0 .../session-title-llm/src/index.ts | 0 .../session-title-llm/src/invariant.ts | 0 .../session-title-llm/tests/llm.spec.ts | 0 .../session-title-llm/tsconfig.json | 0 .../session-title/README.i18n.yaml | 0 .../session-title/README.md | 0 .../session-title/README.zh.md | 0 .../session-title/package.json | 0 .../session-title/src/client.ts | 0 .../session-title/src/index.ts | 0 .../session-title/src/invariant.ts | 0 .../session-title/src/normalize.ts | 0 .../session-title/src/types.ts | 0 .../session-title/tests/invariant.spec.ts | 0 .../session-title/tests/persistence.spec.ts | 0 .../session-title/tests/projection.spec.ts | 0 .../session-title/tests/provider.spec.ts | 0 .../session-title/tests/rename.spec.ts | 0 .../tests/service-contracts.spec.ts | 0 .../session-title/tests/session-title.spec.ts | 0 .../session-title/tsconfig.json | 2 +- packages/subagent/subagent/tsconfig.json | 2 +- packages/telemetry/README.i18n.yaml | 6 --- packages/telemetry/README.md | 10 ---- packages/telemetry/README.zh.md | 10 ---- packages/todo/tool-todo/README.i18n.yaml | 4 +- packages/todo/tool-todo/README.md | 2 +- packages/todo/tool-todo/README.zh.md | 2 +- packages/todo/tool-todo/tsconfig.json | 2 +- .../jsonrpc/tests/built-scope-carrier.e2e.ts | 2 +- packages/ui/permission/tsconfig.json | 2 +- packages/workspace/workspace/tsconfig.json | 2 +- scripts/gen-cordis-catalog.ts | 12 ++--- scripts/run-gates.ts | 2 +- scripts/type-equiv.manifest.json | 28 +++++------ .../verify-package-readme-model-experience.ts | 8 +-- tsconfig.base.json | 16 ++---- tsconfig.host.json | 24 ++++----- vitest.config.ts | 2 +- 220 files changed, 258 insertions(+), 286 deletions(-) delete mode 100644 packages/session-persistence/README.i18n.yaml delete mode 100644 packages/session-persistence/README.md delete mode 100644 packages/session-persistence/README.zh.md delete mode 100644 packages/session-projection/README.i18n.yaml delete mode 100644 packages/session-projection/README.md delete mode 100644 packages/session-projection/README.zh.md delete mode 100644 packages/session-title/README.md delete mode 100644 packages/session-title/README.zh.md rename packages/{session-title => session}/README.i18n.yaml (71%) create mode 100644 packages/session/README.md create mode 100644 packages/session/README.zh.md rename packages/{session-persistence => session}/session-checkpoint-policy/README.i18n.yaml (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/README.md (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/README.zh.md (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/package.json (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/src/index.ts (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/src/invariant.ts (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/tests/crash-recovery.e2e.ts (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/tests/fixtures/crash-child.ts (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts (100%) rename packages/{session-persistence => session}/session-checkpoint-policy/tsconfig.json (89%) rename packages/{session-persistence => session}/session-persistence-jsonl/README.i18n.yaml (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/README.md (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/README.zh.md (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/package.json (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/format.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/index.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/invariant.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/win32.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/zstd-private-decoder.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/zstd-public-decoder.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/src/zstd.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/tests/jsonl.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/tests/win32.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/tests/zstd.compat.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/tests/zstd.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence-jsonl/tsconfig.json (87%) rename packages/{session-persistence => session}/session-persistence-sqlite/README.i18n.yaml (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/README.md (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/README.zh.md (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/package.json (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/src/index.ts (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/src/invariant.ts (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/src/schema.ts (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/tests/sqlite.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence-sqlite/tsconfig.json (87%) rename packages/{session-persistence => session}/session-persistence/README.i18n.yaml (100%) rename packages/{session-persistence => session}/session-persistence/README.md (100%) rename packages/{session-persistence => session}/session-persistence/README.zh.md (100%) rename packages/{session-persistence => session}/session-persistence/package.json (100%) rename packages/{session-persistence => session}/session-persistence/src/coordinator.ts (100%) rename packages/{session-persistence => session}/session-persistence/src/index.ts (100%) rename packages/{session-persistence => session}/session-persistence/src/invariant.ts (100%) rename packages/{session-persistence => session}/session-persistence/src/preparations.ts (100%) rename packages/{session-persistence => session}/session-persistence/src/revision.ts (100%) rename packages/{session-persistence => session}/session-persistence/src/write-behind.ts (100%) rename packages/{session-persistence => session}/session-persistence/tests/contract.ts (100%) rename packages/{session-persistence => session}/session-persistence/tests/coordinator-contract.ts (100%) rename packages/{session-persistence => session}/session-persistence/tests/persistence.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence/tests/preparations.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence/tests/write-behind.spec.ts (100%) rename packages/{session-persistence => session}/session-persistence/tsconfig.json (100%) rename packages/{session-projection => session}/session-projection-cache/README.i18n.yaml (100%) rename packages/{session-projection => session}/session-projection-cache/README.md (100%) rename packages/{session-projection => session}/session-projection-cache/README.zh.md (100%) rename packages/{session-projection => session}/session-projection-cache/package.json (100%) rename packages/{session-projection => session}/session-projection-cache/src/index.ts (100%) rename packages/{session-projection => session}/session-projection-cache/src/invariant.ts (100%) rename packages/{session-projection => session}/session-projection-cache/src/spec.ts (100%) rename packages/{session-projection => session}/session-projection-cache/tests/cache.spec.ts (100%) rename packages/{session-projection => session}/session-projection-cache/tsconfig.json (90%) rename packages/{session-projection => session}/session-projection/README.i18n.yaml (100%) rename packages/{session-projection => session}/session-projection/README.md (100%) rename packages/{session-projection => session}/session-projection/README.zh.md (100%) rename packages/{session-projection => session}/session-projection/package.json (100%) rename packages/{session-projection => session}/session-projection/src/index.ts (100%) rename packages/{session-projection => session}/session-projection/src/invariant.ts (100%) rename packages/{session-projection => session}/session-projection/src/types.ts (100%) rename packages/{session-projection => session}/session-projection/tests/registry.spec.ts (100%) rename packages/{session-projection => session}/session-projection/tsconfig.json (100%) rename packages/{telemetry => session}/session-telemetry-otel/README.i18n.yaml (100%) rename packages/{telemetry => session}/session-telemetry-otel/README.md (100%) rename packages/{telemetry => session}/session-telemetry-otel/README.zh.md (100%) rename packages/{telemetry => session}/session-telemetry-otel/package.json (100%) rename packages/{telemetry => session}/session-telemetry-otel/src/index.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/src/invariant.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/src/user-id.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/tests/loader-composition.e2e.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/tests/otel.spec.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/tests/user-id.spec.ts (100%) rename packages/{telemetry => session}/session-telemetry-otel/tsconfig.json (100%) rename packages/{telemetry => session}/session-telemetry/README.i18n.yaml (100%) rename packages/{telemetry => session}/session-telemetry/README.md (100%) rename packages/{telemetry => session}/session-telemetry/README.zh.md (100%) rename packages/{telemetry => session}/session-telemetry/package.json (100%) rename packages/{telemetry => session}/session-telemetry/src/coordinator.ts (100%) rename packages/{telemetry => session}/session-telemetry/src/index.ts (100%) rename packages/{telemetry => session}/session-telemetry/src/invariant.ts (100%) rename packages/{telemetry => session}/session-telemetry/tests/redact.spec.ts (100%) rename packages/{telemetry => session}/session-telemetry/tests/telemetry.spec.ts (100%) rename packages/{telemetry => session}/session-telemetry/tsconfig.json (100%) rename packages/{session-title => session}/session-title-all-messages-llm/README.i18n.yaml (100%) rename packages/{session-title => session}/session-title-all-messages-llm/README.md (100%) rename packages/{session-title => session}/session-title-all-messages-llm/README.zh.md (100%) rename packages/{session-title => session}/session-title-all-messages-llm/package.json (100%) rename packages/{session-title => session}/session-title-all-messages-llm/src/index.ts (100%) rename packages/{session-title => session}/session-title-all-messages-llm/src/invariant.ts (100%) rename packages/{session-title => session}/session-title-all-messages-llm/tests/provider.spec.ts (100%) rename packages/{session-title => session}/session-title-all-messages-llm/tsconfig.json (100%) rename packages/{session-title => session}/session-title-first-message-llm/README.i18n.yaml (100%) rename packages/{session-title => session}/session-title-first-message-llm/README.md (100%) rename packages/{session-title => session}/session-title-first-message-llm/README.zh.md (100%) rename packages/{session-title => session}/session-title-first-message-llm/package.json (100%) rename packages/{session-title => session}/session-title-first-message-llm/src/index.ts (100%) rename packages/{session-title => session}/session-title-first-message-llm/src/invariant.ts (100%) rename packages/{session-title => session}/session-title-first-message-llm/tests/loader-composition.spec.ts (100%) rename packages/{session-title => session}/session-title-first-message-llm/tests/provider.e2e.ts (100%) rename packages/{session-title => session}/session-title-first-message-llm/tests/provider.spec.ts (100%) rename packages/{session-title => session}/session-title-first-message-llm/tsconfig.json (100%) rename packages/{session-title => session}/session-title-llm/README.i18n.yaml (100%) rename packages/{session-title => session}/session-title-llm/README.md (100%) rename packages/{session-title => session}/session-title-llm/README.zh.md (100%) rename packages/{session-title => session}/session-title-llm/package.json (100%) rename packages/{session-title => session}/session-title-llm/src/index.ts (100%) rename packages/{session-title => session}/session-title-llm/src/invariant.ts (100%) rename packages/{session-title => session}/session-title-llm/tests/llm.spec.ts (100%) rename packages/{session-title => session}/session-title-llm/tsconfig.json (100%) rename packages/{session-title => session}/session-title/README.i18n.yaml (100%) rename packages/{session-title => session}/session-title/README.md (100%) rename packages/{session-title => session}/session-title/README.zh.md (100%) rename packages/{session-title => session}/session-title/package.json (100%) rename packages/{session-title => session}/session-title/src/client.ts (100%) rename packages/{session-title => session}/session-title/src/index.ts (100%) rename packages/{session-title => session}/session-title/src/invariant.ts (100%) rename packages/{session-title => session}/session-title/src/normalize.ts (100%) rename packages/{session-title => session}/session-title/src/types.ts (100%) rename packages/{session-title => session}/session-title/tests/invariant.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/persistence.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/projection.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/provider.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/rename.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/service-contracts.spec.ts (100%) rename packages/{session-title => session}/session-title/tests/session-title.spec.ts (100%) rename packages/{session-title => session}/session-title/tsconfig.json (90%) delete mode 100644 packages/telemetry/README.i18n.yaml delete mode 100644 packages/telemetry/README.md delete mode 100644 packages/telemetry/README.zh.md diff --git a/.agents/notes/implemented/architecture/2026-06-18-session-surface.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-18-session-surface.i18n.yaml index 7c05a0ada8..911d0709f1 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-session-surface.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-18-session-surface.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-18-session-surface.md -2026-06-18-session-surface.md: eeac53534c70099e4102aff9ef226702ea939654 -2026-06-18-session-surface.zh.md: c58d3da049cd6c18e564e596354f5d1831c4756f +2026-06-18-session-surface.md: 1bb3baac5e9bea3f657cbd3be2623223bda78ce2 +2026-06-18-session-surface.zh.md: bfbfd097ffeca59dec163dff911315d0ed94d028 diff --git a/.agents/notes/implemented/architecture/2026-06-18-session-surface.md b/.agents/notes/implemented/architecture/2026-06-18-session-surface.md index eeac53534c..1bb3baac5e 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-session-surface.md +++ b/.agents/notes/implemented/architecture/2026-06-18-session-surface.md @@ -64,9 +64,9 @@ Every surface-eligible event must carry `surfaceOp` or it would disappear from d - **`packages/core/session`**: `surface.ts` (`SurfaceManager`) maintains one ordered seq array for candidate acceptance and live projection; `SessionSurface` is its readonly public view. `SurfaceOp`/`SurfaceIntent` and the top-level session-event fields record how entries join it. `append()` requires a `SurfaceIntent` for surface events, `deriveMessages()` walks the surface as the sole derivation path, and `repair.ts` emits surface-aware closers. The seed constructor rejects a surface-eligible seed event missing its `surfaceOp` marker (see § Invariants). - **`packages/core/agent-loop`**: All surface-capable appends pass surface opts. Chunk seqs are collected for `assistant/message` provenance; `tool/call` seqs are captured for `tool/result` provenance. -- **`packages/session-persistence/session-persistence-sqlite`**: Two new nullable TEXT columns (`source_event_seqs`, `surface_op`) on the `events` table; `SCHEMA_VERSION` bumped (bump-and-reject, no migration). -- **`packages/session-persistence/session-persistence-jsonl`**: No changes required. -- **`packages/session-persistence/session-persistence`**: Abstract interface unchanged. +- **`packages/session/session-persistence-sqlite`**: Two new nullable TEXT columns (`source_event_seqs`, `surface_op`) on the `events` table; `SCHEMA_VERSION` bumped (bump-and-reject, no migration). +- **`packages/session/session-persistence-jsonl`**: No changes required. +- **`packages/session/session-persistence`**: Abstract interface unchanged. The surface is the foundation for future history manipulation. A compaction or tool-result-prune plugin appends one of the existing message-producing event types (a `user/message` carrying the summary, say) with `surfaceOp: { op: 'replace', start, end }` and `sourceEventSeqs` covering the shadowed entries — the new event takes the range's place on the surface while the plugin's own trace events (e.g. `compaction/start`, `compaction/end`) stay off it. Replay preserves the decision deterministically. diff --git a/.agents/notes/implemented/architecture/2026-06-18-session-surface.zh.md b/.agents/notes/implemented/architecture/2026-06-18-session-surface.zh.md index c58d3da049..bfbfd097ff 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-session-surface.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-18-session-surface.zh.md @@ -64,9 +64,9 @@ export type SurfaceOp = - **`packages/core/session`**:`surface.ts`(`SurfaceManager`)维护一个用于候选接纳和实时投影的有序 seq 数组;`SessionSurface` 是其只读公共视图。`SurfaceOp`/`SurfaceIntent` 与顶层会话事件字段记录条目如何加入它。`append()` 要求 surface 事件携带 `SurfaceIntent`,`deriveMessages()` 以遍历 surface 作为唯一派生路径,`repair.ts` 则发出 surface 感知的闭合事件。种子构造函数拒绝缺少 `surfaceOp` 标记的可进入 surface 的种子事件(见「不变式」一节)。 - **`packages/core/agent-loop`**:所有涉及 surface 事件的追加操作都传入 surface 选项。收集分片 seq 用于 `assistant/message` 溯源;捕获 `tool/call` seq 用于 `tool/result` 溯源。 -- **`packages/session-persistence/session-persistence-sqlite`**:`events` 表新增两个可空 TEXT 列(`source_event_seqs`、`surface_op`);`SCHEMA_VERSION` 递增(bump-and-reject,无迁移)。 -- **`packages/session-persistence/session-persistence-jsonl`**:无需改动。 -- **`packages/session-persistence/session-persistence`**:抽象接口不变。 +- **`packages/session/session-persistence-sqlite`**:`events` 表新增两个可空 TEXT 列(`source_event_seqs`、`surface_op`);`SCHEMA_VERSION` 递增(bump-and-reject,无迁移)。 +- **`packages/session/session-persistence-jsonl`**:无需改动。 +- **`packages/session/session-persistence`**:抽象接口不变。 Surface 是未来历史操纵的基础。压缩或 tool-result-prune 插件追加一个既有的消息产出事件类型(例如一条携带摘要的 `user/message`),附带 `surfaceOp: { op: 'replace', start, end }` 和覆盖被遮蔽条目的 `sourceEventSeqs`——新事件在 surface 上取代该范围的位置,而插件自身的 trace 事件(如 `compaction/start`、`compaction/end`)不进入 surface。回放以确定性方式保留该决策。 diff --git a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.i18n.yaml b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.i18n.yaml index 5c5054b0c9..e109560a2f 100644 --- a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.md -2026-07-21-log-backed-session-titles.md: 5f4c53a5fb866663bbfaae6b3fdafb4660424804 -2026-07-21-log-backed-session-titles.zh.md: f9629c1109c8428c74270de9475423d29b99e8f1 +2026-07-21-log-backed-session-titles.md: 89e6e67fb9ece4c087ba7b1bc52e61b78b94586c +2026-07-21-log-backed-session-titles.zh.md: 4df21be565f57db056f506df477f665908d1fdfa diff --git a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.md b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.md index 5f4c53a5fb..89e6e67fb9 100644 --- a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.md +++ b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.md @@ -12,7 +12,7 @@ Session identity metadata is immutable, and the event log is the replay and fork ## Decision -The [`session-title` capability family](../../../../packages/session-title/README.md) owns title state and generation policy. `@deepseek-ai/dsh-session-title` provides `ctx.sessionTitle`, a deterministic first-message fallback, and a registry for at most one optional asynchronous provider. `@deepseek-ai/dsh-session-title-llm` owns the common auxiliary-model request policy; separate first-message and all-user-messages plugins choose input cadence. The shared agent spine mounts only the fallback service. The Web host mounts that service plus the first-message model provider with explicit overridable limits, so a fresh Web session gains an immediate fallback and then a non-blocking model summary. Other compositions choose either model provider explicitly. +The [`session-title` capability family](../../../../packages/session/README.md) owns title state and generation policy. `@deepseek-ai/dsh-session-title` provides `ctx.sessionTitle`, a deterministic first-message fallback, and a registry for at most one optional asynchronous provider. `@deepseek-ai/dsh-session-title-llm` owns the common auxiliary-model request policy; separate first-message and all-user-messages plugins choose input cadence. The shared agent spine mounts only the fallback service. The Web host mounts that service plus the first-message model provider with explicit overridable limits, so a fresh Web session gains an immediate fallback and then a non-blocking model summary. Other compositions choose either model provider explicitly. ### Event ownership and folding diff --git a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.zh.md b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.zh.md index f9629c1109..4df21be565 100644 --- a/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.zh.md +++ b/.agents/notes/implemented/feature/2026-07-21-log-backed-session-titles.zh.md @@ -12,7 +12,7 @@ Status: implemented ## 决策 -[`session-title` 功能包族](../../../../packages/session-title/README.md)负责标题状态和生成策略。`@deepseek-ai/dsh-session-title` 提供 `ctx.sessionTitle`、确定性的首消息回退方案,以及一个至多接受单个可选异步提供方的注册表。`@deepseek-ai/dsh-session-title-llm` 负责通用的辅助模型请求策略;首消息插件和全部用户消息插件分别选择输入调度方式。共享 agent 主干只挂载回退服务。Web host 会挂载该服务和首消息模型提供方,并显式设置可覆盖的限制,因此新建的 Web 会话会立即获得回退标题,随后在不阻塞主响应的情况下获得模型摘要。其他组合需显式选择任一模型提供方。 +[`session-title` 功能包族](../../../../packages/session/README.md)负责标题状态和生成策略。`@deepseek-ai/dsh-session-title` 提供 `ctx.sessionTitle`、确定性的首消息回退方案,以及一个至多接受单个可选异步提供方的注册表。`@deepseek-ai/dsh-session-title-llm` 负责通用的辅助模型请求策略;首消息插件和全部用户消息插件分别选择输入调度方式。共享 agent 主干只挂载回退服务。Web host 会挂载该服务和首消息模型提供方,并显式设置可覆盖的限制,因此新建的 Web 会话会立即获得回退标题,随后在不阻塞主响应的情况下获得模型摘要。其他组合需显式选择任一模型提供方。 ### 事件归属与折叠 diff --git a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.i18n.yaml b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.i18n.yaml index 27786e85a2..58b5371ba2 100644 --- a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md -2026-07-23-session-telemetry-otel-revival.md: f83128e8bf62e0718e59912c16c4e449855aaa1a -2026-07-23-session-telemetry-otel-revival.zh.md: bef3bd9cbc22f363b92880864651dcaa782fc1de +2026-07-23-session-telemetry-otel-revival.md: e6a213af65451a2ae26a5eb685c1a0f6ab220869 +2026-07-23-session-telemetry-otel-revival.zh.md: 4e834f8b129e2062064cf3497370fecf6f88db29 diff --git a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md index f83128e8bf..e6a213af65 100644 --- a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md +++ b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md @@ -10,7 +10,7 @@ Every deployment that wants harness sessions in an observability stack must hand ## Decision -`packages/telemetry/` revives the two reviewed packages under the SDK stance — the harness provides the capability, the deployment configures where records go and owns what leaves in them: +`packages/session/` (formerly `telemetry/`) revives the two reviewed packages under the SDK stance — the harness provides the capability, the deployment configures where records go and owns what leaves in them: - **`@deepseek-ai/dsh-session-telemetry`** — the seam. `TelemetryBackend` (`emit`/`flush?`/`shutdown`), the service-registered `Telemetry` form, and `TelemetryCoordinator` owning capture: live adoption with cursor read-back and the per-append firehose (project → `structuredClone` → redact → `emit`, zero I/O), buffer-free on-demand replay from the canonical log, the fixed first-chunk-per-(turn, step) projection, the live `agent/error` relay, and live dispose-time `shutdown` records. - **The `telemetry/record` waterfall** — the delta over the branch version and the seam's redaction extension point. Every record passes it before reaching any backend; the seam ships NO rules of its own — the innermost `next()` is a pass-through, deployments mount their rules as listeners (stacking by transforming `next()`'s return value), and a throwing rule withholds the record fail-closed. Redaction applies to the exported copy only; the canonical log is never rewritten. diff --git a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.zh.md b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.zh.md index bef3bd9cbc..4e834f8b12 100644 --- a/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.zh.md +++ b/.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.zh.md @@ -10,7 +10,7 @@ Status: implemented ## 决策 -`packages/telemetry/` 以 SDK 立场复活这两个经过评审的包——harness 提供能力,部署方配置上报去向并对导出内容负责: +`packages/session/`(原 `telemetry/`)以 SDK 立场复活这两个经过评审的包——harness 提供能力,部署方配置上报去向并对导出内容负责: - **`@deepseek-ai/dsh-session-telemetry`** —— seam 本体。`TelemetryBackend`(`emit`/`flush?`/`shutdown`)、服务注册形态的 `Telemetry`、以及拥有捕获侧的 `TelemetryCoordinator`:带游标回读的实时收养与逐 append 的 firehose(投影 → `structuredClone` → 脱敏 → `emit`,零 I/O)、从权威日志进行的无缓冲按需回放、固定的每个(轮次、步骤)组合首分片投影、实时 `agent/error` 转发,以及实时 dispose(资源释放)时的 `shutdown` 记录。 - **`telemetry/record` waterfall(瀑布式事件)** —— 相对分支版本的增量,也是该 seam 的脱敏扩展点。每条记录抵达任何后端前必经此处;seam 自身不带任何规则——最内层 `next()` 原样透传,部署方以监听器挂载自己的规则(通过变换 `next()` 的返回值堆叠),抛异常的规则将该记录 fail-closed 扣下。脱敏只作用于导出副本;canonical log 永不改写。 diff --git a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.i18n.yaml b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.i18n.yaml index d96a3b4d6c..ddca590dea 100644 --- a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-06-node-engine-floor.md -2026-07-06-node-engine-floor.md: e42b809f83fe388526ecbd74192989e0bcdbba67 -2026-07-06-node-engine-floor.zh.md: 92fa00f7a270f4506cba6c899e9edf6a2fdd3209 +2026-07-06-node-engine-floor.md: ad21fbfe034cbf4bb7b75aaac4113f3139a1832d +2026-07-06-node-engine-floor.zh.md: 0d1c31ed74565f9b20116cd0e666246baad9bf79 diff --git a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.md b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.md index e42b809f83..ad21fbfe03 100644 --- a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.md +++ b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.md @@ -14,7 +14,7 @@ Set `engines.node` to `^22.19.0 || >=24.0.0` and test keyless CI on `['22.19', 2 Two Node features gate the source runtime: -- **`node:sqlite`** — `packages/session-persistence/session-persistence-sqlite` does a top-level `import { DatabaseSync } from 'node:sqlite'`. The module dropped its `--experimental-sqlite` flag requirement at **22.13** (LTS) and **23.4** (Current); before those, importing it throws at load. +- **`node:sqlite`** — `packages/session/session-persistence-sqlite` does a top-level `import { DatabaseSync } from 'node:sqlite'`. The module dropped its `--experimental-sqlite` flag requirement at **22.13** (LTS) and **23.4** (Current); before those, importing it throws at load. - **Native TypeScript type-stripping** — the built-mode `examples/headless-agent/tests/keyless-smoke.e2e.ts` smoke boots its unexported `.ts` driver under plain `node` (no tsx) and loads the example's `.ts` test adapter (`cli-mock-llm.ts`). Type-stripping is the default from **22.18** (LTS) and **23.6** (Current); before those it needs `--experimental-strip-types`. Those source features clear on the 22.x line at **22.18**, but the installed Pi adapter dependency raises the advertised LTS floor. `@deepseek-ai/dsh-llm-pi-ai` depends on `@earendil-works/pi-ai@0.79.3`, whose package declares `engines.node >=22.19.0`, so the LTS floor is **22.19**. The 24.x branch remains `>=24.0.0`. The disjoint range excludes Node 23 entirely: Node 23.0–23.5 still has at least one flagged source feature, and the 23 line is non-LTS/EOL, so advertising `>=23.6` would add a dead release line and a CI leg no deployment should use. diff --git a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.zh.md b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.zh.md index 92fa00f7a2..0d1c31ed74 100644 --- a/.agents/notes/implemented/process/2026-07-06-node-engine-floor.zh.md +++ b/.agents/notes/implemented/process/2026-07-06-node-engine-floor.zh.md @@ -14,7 +14,7 @@ Status: implemented 两个 Node 特性决定了源码运行时的门槛: -- **`node:sqlite`**:`packages/session-persistence/session-persistence-sqlite` 在顶层执行 `import { DatabaseSync } from 'node:sqlite'`。该模块在 **22.13**(LTS)和 **23.4**(Current)取消了 `--experimental-sqlite` 标志要求;在此之前,导入它会在加载时抛出异常。 +- **`node:sqlite`**:`packages/session/session-persistence-sqlite` 在顶层执行 `import { DatabaseSync } from 'node:sqlite'`。该模块在 **22.13**(LTS)和 **23.4**(Current)取消了 `--experimental-sqlite` 标志要求;在此之前,导入它会在加载时抛出异常。 - **原生 TypeScript 类型剥离**——构建模式的 `examples/headless-agent/tests/keyless-smoke.e2e.ts` 冒烟测试使用纯 `node`(无 tsx)启动该示例未导出的 `.ts` driver,并加载示例的 `.ts` 测试适配器(`cli-mock-llm.ts`)。类型剥离从 **22.18**(LTS)和 **23.6**(Current)起成为默认行为;更早版本需要 `--experimental-strip-types`。 这些源码特性在 22.x 线上于 **22.18** 全部就绪,但已安装的 Pi 适配器依赖将宣传的 LTS 下限进一步提高。`@deepseek-ai/dsh-llm-pi-ai` 依赖 `@earendil-works/pi-ai@0.79.3`,后者的包声明 `engines.node >=22.19.0`,因此 LTS 下限为 **22.19**。24.x 分支保持 `>=24.0.0`。该不相交范围完全排除了 Node 23:Node 23.0–23.5 至少还有一个源码特性需要标志,而 23 线是非 LTS/已 EOL 的,宣传 `>=23.6` 会增加一条已终止的发布线和一条 CI 分支,而没有任何部署应当使用它。 diff --git a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.i18n.yaml index 176097ad5e..620fa2291f 100644 --- a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md -2026-07-24-domain-kv-storage-and-workspace.md: 230877628428dc88dbddeecfe5f4353cf15e151d -2026-07-24-domain-kv-storage-and-workspace.zh.md: cb1fb1346a28b0c3249848705ca209f57cab766e +2026-07-24-domain-kv-storage-and-workspace.md: 1cb2bc4b29c196dbb33292547c75d01a37f06772 +2026-07-24-domain-kv-storage-and-workspace.zh.md: 15460e305d2d9aca3009025cf0218eb6c54c7237 diff --git a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md index 2308776284..1cb2bc4b29 100644 --- a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md +++ b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md @@ -6,7 +6,7 @@ English | [中文](2026-07-24-domain-kv-storage-and-workspace.zh.md) ## Problem -The host's only persistence surface is the session event log (`packages/session-persistence`: append-only, one file per session). Anything that does not belong to a single session has nowhere to live, and two real needs exist today: +The host's only persistence surface is the session event log (`packages/session/session-persistence`: append-only, one file per session). Anything that does not belong to a single session has nowhere to live, and two real needs exist today: - **The workspace entity.** The GUI needs workspace as a real object: path, title, and the list of owned sessions. Ownership belongs to the workspace — "which sessions belong to this workspace" is not any single session's fact, so writing it into the session log is semantically wrong. Until now workspace was only a sidebar visual grouping derived from cwd, with no entity (that conclusion has been overturned). - **Dynamic session metadata** (the foreseeable second consumer). Cold session listings read only the first log line (an immutable creation-time snapshot); title, terminal status, and anything that evolves with the session is unavailable. The fix direction is a sidecar metadata table — exactly a KV table with high-frequency per-key updates. @@ -26,7 +26,7 @@ Create the `packages/storage/` group — the `ctx.storage` hub (backend registry | `@deepseek-ai/dsh-storage-sqlite` | `packages/storage/storage-sqlite/` | registers backend `sqlite` | ✓ | | `@deepseek-ai/dsh-storage-domain` | `packages/storage/storage-domain/` | mounts `ctx.storage.domain` | ✓ | | `@deepseek-ai/dsh-workspace` | `packages/workspace/workspace/` | `ctx.workspace` | ✓ | -| `SessionPersistence.delete` extension + cascade orchestration | `packages/session-persistence/*` | new method on the existing seam | ✗ future work (session side untouched this phase) | +| `SessionPersistence.delete` extension + cascade orchestration | `packages/session/session-persistence*` | new method on the existing seam | ✗ future work (session side untouched this phase) | | `workspace.*` / `session.delete` RPC, GUI wiring, boot assembly | — | — | ✗ next phase | (workspace lives in its own group rather than `packages/host/`: the host group's naming rule requires the `dsh-host-*` prefix while this package is named `dsh-workspace`; and the workspace entity is a domain concept, not bound to the host assembly tier. Unrelated to the existing `workspace-context` package — that is an AGENTS.md instruction loader.) diff --git a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.zh.md b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.zh.md index cb1fb1346a..15460e305d 100644 --- a/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.zh.md @@ -26,7 +26,7 @@ host 侧唯一的持久化面是 session 事件日志(`packages/session-persis | `@deepseek-ai/dsh-storage-sqlite` | `packages/storage/storage-sqlite/` | 注册后端 `sqlite` | ✓ | | `@deepseek-ai/dsh-storage-domain` | `packages/storage/storage-domain/` | 挂载 `ctx.storage.domain` | ✓ | | `@deepseek-ai/dsh-workspace` | `packages/workspace/workspace/` | `ctx.workspace` | ✓ | -| `SessionPersistence.delete` 扩面 + 级联删编排 | `packages/session-persistence/*` | 既有 seam 新方法 | ✗ future work(本期不动 session 侧) | +| `SessionPersistence.delete` 扩面 + 级联删编排 | `packages/session/*` | 既有 seam 新方法 | ✗ future work(本期不动 session 侧) | | `workspace.*` / `session.delete` RPC、GUI 接线、boot 组装 | — | — | ✗ 下期 | (workspace 放独立组不放 `packages/host/`:host 组命名规则要求 `dsh-host-*` 前缀,而包名定为 `dsh-workspace`;且 workspace 实体是领域概念,不绑定 host 装配层。与既有 `workspace-context` 包无关——那是 AGENTS.md 指令加载器。) diff --git a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.i18n.yaml index f1bd359e19..040d099f38 100644 --- a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md -2026-07-28-storage-root-and-derived-medium-recovery.md: 2edb60d204da736bf14ace6278fa4ee7b9e4b8f7 -2026-07-28-storage-root-and-derived-medium-recovery.zh.md: 802ca16f399446777203581d246444e53d632a34 +2026-07-28-storage-root-and-derived-medium-recovery.md: c7b423770fcca89c54d3866db7701348351cc259 +2026-07-28-storage-root-and-derived-medium-recovery.zh.md: 54a2bbc6496bd8cce594b3ce3a105e4be6e8ff64 diff --git a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md index 2edb60d204..c7b423770f 100644 --- a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md +++ b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.md @@ -8,7 +8,7 @@ English | [中文](2026-07-28-storage-root-and-derived-medium-recovery.zh.md) The persisted projection cache ([RFC](2026-07-27-session-projection-and-command-log.md), shipped as `dsh-session-projection-cache`) surfaced two gaps in the storage substrate it landed on. Both are properties of the domain-KV stack ([design](2026-07-24-domain-kv-storage-and-workspace.md)), not of the cache itself, and both bite the cache first because it is the first *derived* medium on that stack. -**Where the files actually live (root mismatch closed; resolve-once residual still open).** The shared base defaults the session store to the global harness home (`$DSH_HOME/sessions`, default `~/.dsh/sessions`), while the shipped Web overlay used to give the json backend the relative root `./.storages`: `workspace.json` and `session_projcache.json` landed under `/.storages/` — two launches from different directories shared their sessions yet saw different workspace registries and different projection caches, and the cache exists precisely to serve the cross-session cold listing, which missed for every session last cached under another launch directory. That mismatch is now closed: the overlay anchors `storage-json.root` to `$DSH_HOME/storages` with the same `!!js` expression the session root uses (`apps/cli/config/web.cordis.yml`). The residual hazard: `JsonStorageBackend` still never resolves its root — each unit open joins the path against whatever `process.cwd()` is at that moment (packages/storage/storage-json/src/index.ts); the shipped overlay root is already absolute and unaffected, but any relative root (bare Loader boots, tests) still splits on a later cwd change — the exact hazard the JSONL session backend resolves-once to prevent ("later process.cwd() changes cannot split one backend across roots", packages/session-persistence/session-persistence-jsonl/src/index.ts). +**Where the files actually live (root mismatch closed; resolve-once residual still open).** The shared base defaults the session store to the global harness home (`$DSH_HOME/sessions`, default `~/.dsh/sessions`), while the shipped Web overlay used to give the json backend the relative root `./.storages`: `workspace.json` and `session_projcache.json` landed under `/.storages/` — two launches from different directories shared their sessions yet saw different workspace registries and different projection caches, and the cache exists precisely to serve the cross-session cold listing, which missed for every session last cached under another launch directory. That mismatch is now closed: the overlay anchors `storage-json.root` to `$DSH_HOME/storages` with the same `!!js` expression the session root uses (`apps/cli/config/web.cordis.yml`). The residual hazard: `JsonStorageBackend` still never resolves its root — each unit open joins the path against whatever `process.cwd()` is at that moment (packages/storage/storage-json/src/index.ts); the shipped overlay root is already absolute and unaffected, but any relative root (bare Loader boots, tests) still splits on a later cwd change — the exact hazard the JSONL session backend resolves-once to prevent ("later process.cwd() changes cannot split one backend across roots", packages/session/session-persistence-jsonl/src/index.ts). **How recovery works today.** Inside a healthy medium the cache is fully self-healing by design: a `stateVersion`-mismatched row is discarded and refolded, a log shrunk below a row's watermark is detected by the anchored restore floor and answered with one full re-read, and every background write is fail-soft. But at the *medium* level there is no recovery at all: a truncated, hand-edited, or version-bumped `session_projcache.json` fails `openJsonUnit` with `malformed-medium`/`version-mismatch` (packages/storage/storage-json/src/format.ts), a schema-drifted record fails domain open with `invalid-record` (packages/storage/storage-domain/src/index.ts), the rejection propagates through `SessionProjectionCache[Service.init]`, and under the CLI's fail-loud boot the assembly refuses to start. A file whose entire content is rebuildable from session logs can brick boot. This contradicts the cache package's own stated stance ("a stale or unreadable cache costs a longer tail replay, never a wrong value") and the cache domain spec's JSDoc ("version bumps discard the whole medium"), which today describes an aspiration, not the implementation. The same fail-loud path is *correct* for `workspace.json` — workspace records are authoritative, not derivable — so the missing concept is a per-domain declaration of authority, not a global behavior change. diff --git a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md index 802ca16f39..54a2bbc649 100644 --- a/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-28-storage-root-and-derived-medium-recovery.zh.md @@ -8,7 +8,7 @@ Status: proposed 持久投影缓存([RFC](2026-07-27-session-projection-and-command-log.md),已作为 `dsh-session-projection-cache` 落地)暴露了它所依托的存储基座的两个缺口。二者都是 domain-KV 栈([设计](2026-07-24-domain-kv-storage-and-workspace.md))的属性而非缓存自身的问题,且都首先咬到缓存——因为它是这条栈上第一个*派生*介质。 -**文件到底存在哪(根错位已收口,resolve-once 残余仍开放)。** 共享 base 将会话存储默认为全局 harness home(`$DSH_HOME/sessions`,默认 `~/.dsh/sessions`),而出厂 Web overlay 曾给 json 后端相对根 `./.storages`:`workspace.json` 和 `session_projcache.json` 落在 `<启动目录>/.storages/` 下——从两个不同目录启动,会话相同,工作区注册表和投影缓存却各是一份,而缓存存在的意义恰恰是跨会话冷列表,凡上次在别的启动目录下缓存过的会话全部 miss。这一错位已消除:overlay 现以与会话根同一段 `!!js` 表达式把 `storage-json.root` 锚定到 `$DSH_HOME/storages`(`apps/cli/config/web.cordis.yml`)。残余隐患:`JsonStorageBackend` 仍从不 resolve 根——每次打开 unit 都把路径 join 到当时的 `process.cwd()` 上(packages/storage/storage-json/src/index.ts);出厂 overlay 的根已是绝对路径不受影响,但任何相对根(裸 Loader 启动、测试)仍会被后续 cwd 变化劈开,JSONL 会话后端用「构造时 resolve 一次」防住的正是它("later process.cwd() changes cannot split one backend across roots",packages/session-persistence/session-persistence-jsonl/src/index.ts)。 +**文件到底存在哪(根错位已收口,resolve-once 残余仍开放)。** 共享 base 将会话存储默认为全局 harness home(`$DSH_HOME/sessions`,默认 `~/.dsh/sessions`),而出厂 Web overlay 曾给 json 后端相对根 `./.storages`:`workspace.json` 和 `session_projcache.json` 落在 `<启动目录>/.storages/` 下——从两个不同目录启动,会话相同,工作区注册表和投影缓存却各是一份,而缓存存在的意义恰恰是跨会话冷列表,凡上次在别的启动目录下缓存过的会话全部 miss。这一错位已消除:overlay 现以与会话根同一段 `!!js` 表达式把 `storage-json.root` 锚定到 `$DSH_HOME/storages`(`apps/cli/config/web.cordis.yml`)。残余隐患:`JsonStorageBackend` 仍从不 resolve 根——每次打开 unit 都把路径 join 到当时的 `process.cwd()` 上(packages/storage/storage-json/src/index.ts);出厂 overlay 的根已是绝对路径不受影响,但任何相对根(裸 Loader 启动、测试)仍会被后续 cwd 变化劈开,JSONL 会话后端用「构造时 resolve 一次」防住的正是它("later process.cwd() changes cannot split one backend across roots",packages/session/session-persistence-jsonl/src/index.ts)。 **现在是怎么恢复的。** 在健康介质内部,缓存按设计完全自愈:`stateVersion` 不匹配的行被丢弃重折,日志缩短到行水位以下由带锚的 restore floor 检出并以一次全量重读回答,每次后台写都是 fail-soft。但在*介质*层面完全没有恢复:被截断、被手改或版本被 bump 的 `session_projcache.json` 会让 `openJsonUnit` 以 `malformed-medium`/`version-mismatch` 失败(packages/storage/storage-json/src/format.ts),schema 漂移的记录让域 open 以 `invalid-record` 失败(packages/storage/storage-domain/src/index.ts),拒绝一路穿过 `SessionProjectionCache[Service.init]`,在 CLI 的 fail-loud 启动下整个组装拒绝启动。一个内容完全可从会话日志重建的文件能把启动搞死。这与缓存包自己声明的立场("a stale or unreadable cache costs a longer tail replay, never a wrong value")和缓存域 spec 的 JSDoc("version bumps discard the whole medium")相矛盾——后者今天描述的是愿望而非实现。同一条 fail-loud 路径对 `workspace.json` 却是*正确*的——工作区记录是权威数据,不可派生——所以缺的概念是按域声明权威性,而不是全局改行为。 diff --git a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.i18n.yaml b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.i18n.yaml index e252ed8190..d9dd98233e 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.i18n.yaml +++ b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.md -2026-06-20-assembled-assistant-messages-only.md: ba8135a3d63f292cfedd23de8b4b9d43b4455e8c -2026-06-20-assembled-assistant-messages-only.zh.md: 5d29655a0697d05f20e491d28272898a08ec3e0b +2026-06-20-assembled-assistant-messages-only.md: edc756f71271065ec579a2becb8597190b34cdc8 +2026-06-20-assembled-assistant-messages-only.zh.md: e5f4f8a63a35f5f40c482a4a4855937cc8e6d544 diff --git a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.md b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.md index ba8135a3d6..edc756f712 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.md +++ b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.md @@ -19,7 +19,7 @@ ACP `session/load` can replay prior assistant messages as complete content block ## Acceptance criteria - `SessionEventMap` drops `assistant/chunk`, or marks it as non-persisted if a transitional live event is needed. -- [Session persistence docs](../../../../packages/session-persistence/session-persistence/README.md) no longer require every stream chunk to be stored verbatim. +- [Session persistence docs](../../../../packages/session/session-persistence/README.md) no longer require every stream chunk to be stored verbatim. - `llm-replay` and ACP snapshots use an explicit replay fixture format or sidecar for model chunks. - `session/load` renders completed assistant messages from `assistant/message`. - Stored logs get much smaller and remain `seq`-contiguous without chunk holes. diff --git a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.zh.md b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.zh.md index 5d29655a06..e5f4f8a63a 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.zh.md +++ b/.agents/notes/rejected/simplification/2026-06-20-assembled-assistant-messages-only.zh.md @@ -19,7 +19,7 @@ ACP `session/load` 可以将先前的 assistant 消息作为完整内容块回 ## 验收标准 - `SessionEventMap` 移除 `assistant/chunk`,或在需要过渡性实时事件时将其标记为非持久化。 -- [会话持久化文档](../../../../packages/session-persistence/session-persistence/README.md)不再要求逐字存储每个流式分片。 +- [会话持久化文档](../../../../packages/session/session-persistence/README.md)不再要求逐字存储每个流式分片。 - `llm-replay` 和 ACP 快照使用显式的回放 fixture 格式或伴随文件来存储模型分片。 - `session/load` 从 `assistant/message` 渲染已完成的 assistant 消息。 - 存储的日志大幅缩小,且删除分片后仍保持 `seq` 连续,不留下序号缺口。 diff --git a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.i18n.yaml b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.i18n.yaml index 0ae596bf03..4c5b2d04de 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.i18n.yaml +++ b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.md -2026-06-20-fold-session-persistence-interface.md: 895b868b2a80d8655284bae1364a85e19e174da7 -2026-06-20-fold-session-persistence-interface.zh.md: d5ce0ed4532706ffadb43460cd0974507393a5ed +2026-06-20-fold-session-persistence-interface.md: c0da160e766cf0bed532f0d11bd52e3a027dbe8b +2026-06-20-fold-session-persistence-interface.zh.md: 93ab244429600bd15e2d8dadfa7dc218e37c2eff diff --git a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.md b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.md index 895b868b2a..c0da160e76 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.md +++ b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.md @@ -22,7 +22,7 @@ The implementing PR should update the [capability seams](../../implemented/archi - `dsh-session` exports the persistence service type, coordinator, and contract helpers. - JSONL and SQLite backend packages depend on `dsh-session` directly. - `agent-loop` resume uses the session-owned service key. -- [Session persistence](../../implemented/architecture/2026-06-14-session-persistence.md), [shared persistence write coordinator](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md), and [package docs](../../../../packages/session-persistence/session-persistence/README.md) explain why backend implementations remain separate. +- [Session persistence](../../implemented/architecture/2026-06-14-session-persistence.md), [shared persistence write coordinator](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md), and [package docs](../../../../packages/session/session-persistence/README.md) explain why backend implementations remain separate. ## What we give up diff --git a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.zh.md b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.zh.md index d5ce0ed453..93ab244429 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.zh.md +++ b/.agents/notes/rejected/simplification/2026-06-20-fold-session-persistence-interface.zh.md @@ -22,7 +22,7 @@ Status: rejected — 独立的持久化接口包是为持久化后端设计的 - `dsh-session` 导出持久化服务类型、协调器和契约辅助工具。 - JSONL 和 SQLite 后端包直接依赖 `dsh-session`。 - `agent-loop` 的恢复功能使用会话包拥有的服务键。 -- [会话持久化](../../implemented/architecture/2026-06-14-session-persistence.md)、[共享持久化写入协调器](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md)与[包文档](../../../../packages/session-persistence/session-persistence/README.md)说明后端实现为何仍保持独立。 +- [会话持久化](../../implemented/architecture/2026-06-14-session-persistence.md)、[共享持久化写入协调器](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md)与[包文档](../../../../packages/session/session-persistence/README.md)说明后端实现为何仍保持独立。 ## 放弃了什么 diff --git a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.i18n.yaml b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.i18n.yaml index 09f42a9047..7e9b79fdeb 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.i18n.yaml +++ b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.md -2026-06-20-truncate-interrupted-turns.md: 3c7acf8d673568f851edd52635a28f73d9bf5f6f -2026-06-20-truncate-interrupted-turns.zh.md: f348e6a99d8214f7968d9f57931f9dddd37973be +2026-06-20-truncate-interrupted-turns.md: c4b0084de537927a27829eb78990c6559bd1df7d +2026-06-20-truncate-interrupted-turns.zh.md: 2d3eca74416eff360029e3ac77f04662878a0084 diff --git a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.md b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.md index 3c7acf8d67..c4b0084de5 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.md +++ b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.md @@ -21,7 +21,7 @@ This makes the persisted turn boundary simple: a completed `turn/end` is the che - `TurnEndReasonMap` drops the `interrupted` variant. - `interruptedTurnClosers()` and its tests disappear. - The persistence coordinator's repair hook truncates backend-specific torn/open tail state without appending closers. -- [Session persistence docs](../../../../packages/session-persistence/session-persistence/README.md) say load returns the last completed turn, plus no partial final turn. +- [Session persistence docs](../../../../packages/session/session-persistence/README.md) say load returns the last completed turn, plus no partial final turn. - Snapshot and contract tests update together with the behavior they pin. - The session format version and recorded fixtures are refreshed; non-current stored logs are rejected per the pre-release format policy, with no migration path. diff --git a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.zh.md b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.zh.md index f348e6a99d..2d3eca7441 100644 --- a/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.zh.md +++ b/.agents/notes/rejected/simplification/2026-06-20-truncate-interrupted-turns.zh.md @@ -21,7 +21,7 @@ Status: rejected — 单个轮次可以包含大量真实工作,包括多个 - `TurnEndReasonMap` 移除 `interrupted` 变体。 - `interruptedTurnClosers()` 及其测试删除。 - 持久化协调器的修复钩子截断后端特有的撕裂或未关闭的尾部状态,不追加关闭事件。 -- [会话持久化文档](../../../../packages/session-persistence/session-persistence/README.md)说明加载返回最后一个已完成的轮次,不包含部分最终轮次。 +- [会话持久化文档](../../../../packages/session/session-persistence/README.md)说明加载返回最后一个已完成的轮次,不包含部分最终轮次。 - 快照与契约测试随其所固定的行为一同更新。 - 会话格式版本与记录的 fixture(测试前置数据)刷新;按预发布格式策略,非当前版本的存储日志被拒绝,不提供迁移路径。 diff --git a/AGENTS.md b/AGENTS.md index 47a90f0065..7727539bd9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,7 +33,7 @@ packages/ @deepseek-ai/dsh- workspaces at packages/// guard/ loop-hygiene plugins cordis/ self-referential toolset: the agent inspects/mounts plugins in its own runtime hooks/ Claude Code/Codex hook bridges + shared wire-protocol library - session-persistence/ persistence seam + JSONL/SQLite backends + session/ durable session data plane: persistence, projection, titles, reporting settings/ user-settings seam + file-backed provider credentials/ credential-reference seam + env-over-.env provider acp/ automation-only Agent Client Protocol server diff --git a/docs/architecture.i18n.yaml b/docs/architecture.i18n.yaml index e0ddc02423..4d10310333 100644 --- a/docs/architecture.i18n.yaml +++ b/docs/architecture.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/architecture.md -architecture.md: e88bdac118e382d91c41c471d03182952d8a4508 -architecture.zh.md: 9314a3fbfc87d467a0f902fa1dae9e8f07e2eb28 +architecture.md: c14d68c47f6ed0786e8fc0b0650dbc67678250fb +architecture.zh.md: df484762d29e170a5b1ba64f0637c5170c2c5ef4 diff --git a/docs/architecture.md b/docs/architecture.md index e88bdac118..c14d68c47f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -41,9 +41,9 @@ Harnesses are [Cordis](cordis-primer.md) contexts; packages contribute services, | `ctx.tasks` | [`tasks/`](../packages/tasks/README.md) | background task registry, generic `task_*` controls | | `ctx.workflows` | [`workflow/`](../packages/workflow/README.md) | script-driven multi-agent orchestration | | `ctx.goals` | [`goal/`](../packages/goal/README.md) | persisted same-session goals | -| `ctx.sessionPersistence` | [`session-persistence/`](../packages/session-persistence/README.md) | durable session-log storage | +| `ctx.sessionPersistence` | [`session/`](../packages/session/README.md) | durable session-log storage | | `ctx.sessionQuery` | [`session-query/`](../packages/session-query/README.md) | live-preferred exact/filter/trace queries over SQLite FTS, workspace-authorized model tools | -| `ctx.sessionTitle` | [`session-title/`](../packages/session-title/README.md) | log-backed fallbacks, one optional asynchronous provider | +| `ctx.sessionTitle` | [`session/session-title`](../packages/session/README.md) | log-backed fallbacks, one optional asynchronous provider | | `ctx.settings` | [`settings/`](../packages/settings/README.md) | per-plugin user-settings namespaces layered over composition entries | | `ctx.credentials` | [`credentials/`](../packages/credentials/README.md) | named secret references resolved per operation, never inlined in configuration | | `ctx.directoryPicker` | [`host/directory-picker`](../packages/host/directory-picker/README.md) | GUI-host directory picking (`native`/`browse` interactions) | diff --git a/docs/architecture.zh.md b/docs/architecture.zh.md index 9314a3fbfc..df484762d2 100644 --- a/docs/architecture.zh.md +++ b/docs/architecture.zh.md @@ -41,9 +41,9 @@ | `ctx.tasks` | [`tasks/`](../packages/tasks/README.md) | 后台任务注册表和通用 `task_*` 控制 | | `ctx.workflows` | [`workflow/`](../packages/workflow/README.md) | 脚本驱动的多 agent 编排 | | `ctx.goals` | [`goal/`](../packages/goal/README.md) | 持久化的同会话目标 | -| `ctx.sessionPersistence` | [`session-persistence/`](../packages/session-persistence/README.md) | 会话日志的持久化存储 | +| `ctx.sessionPersistence` | [`session/`](../packages/session/README.md) | 会话日志的持久化存储 | | `ctx.sessionQuery` | [`session-query/`](../packages/session-query/README.md) | 基于 SQLite 全文搜索的实时优先精确检索/过滤/追踪、经工作区授权的模型工具 | -| `ctx.sessionTitle` | [`session-title/`](../packages/session-title/README.md) | 基于日志的回退标题和单个可选异步提供方 | +| `ctx.sessionTitle` | [`session/session-title`](../packages/session/README.md) | 基于日志的回退标题和单个可选异步提供方 | | `ctx.settings` | [`settings/`](../packages/settings/README.md) | 按插件划分的用户设置命名空间,分层叠加在装配条目之上 | | `ctx.credentials` | [`credentials/`](../packages/credentials/README.md) | 具名密钥引用,按操作解析,绝不内联进配置 | | `ctx.directoryPicker` | [`host/directory-picker`](../packages/host/directory-picker/README.md) | GUI 宿主目录选取(`native`/`browse` 交互) | diff --git a/docs/capability-seams.md b/docs/capability-seams.md index 4ed8a260d4..60a19999f3 100644 --- a/docs/capability-seams.md +++ b/docs/capability-seams.md @@ -374,27 +374,27 @@ flowchart LR | `ctx.llm` | `seam` | [`llm`](../packages/llm/llm) | [`llm-deepseek`](../packages/llm/llm-deepseek), [`llm-pi-ai`](../packages/llm/llm-pi-ai), [`llm-replay`](../packages/support/llm-replay) | [`agent-loop`](../packages/core/agent-loop), [`compact-basic`](../packages/compact/compact-basic) | - | Adapters register provider implementations; the loop and compaction call the provider-neutral stream service. | | `ctx.tokenMeter` | `core` | [`token-meter`](../packages/llm/token-meter) | - | [`compact-basic`](../packages/compact/compact-basic) | - | Owns isolated per-session replay folds; pressure consumers share immutable revisioned measurements. | | `ctx.toolResultPrune` | `core` | [`compact-tool-result-prune`](../packages/compact/compact-tool-result-prune) | - | [`compact-basic`](../packages/compact/compact-basic) | - | Rewrites oversized current tool results through replayable single-node surface replacements before summary compaction. | -| `ctx.sessions` | `core` | [`session`](../packages/core/session) | - | [`agent-loop`](../packages/core/agent-loop), [`agent`](../packages/core/agent), [`session-persistence`](../packages/session-persistence/session-persistence), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`subagent-inprocess`](../packages/subagent/subagent-inprocess), [`invariants`](../packages/support/invariants) | - | Owns append-only Session instances and emits the durable session event feed. | +| `ctx.sessions` | `core` | [`session`](../packages/core/session) | - | [`agent-loop`](../packages/core/agent-loop), [`agent`](../packages/core/agent), [`session-persistence`](../packages/session/session-persistence), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite), [`subagent-inprocess`](../packages/subagent/subagent-inprocess), [`invariants`](../packages/support/invariants) | - | Owns append-only Session instances and emits the durable session event feed. | | `ctx.invariants` | `core` | [`invariants`](../packages/support/invariants) | - | [`session`](../packages/core/session), [`agent`](../packages/core/agent), [`scope`](../packages/core/scope), [`agent-loop`](../packages/core/agent-loop) | - | Companion subpaths register owner-local checks; the service owns selection, uniqueness, child fibers, and package-attributed failures. | | `ctx.typert` | `core` | [`typert-registry`](../packages/typert/registry) | - | [`typert-loader`](../packages/typert/loader), [`api-gateway`](../packages/api/gateway) | - | Plugins register live zod contributions directly or through dsh-typert-loader; the API gateway consumes invocation descriptors and providers, while other runtime consumers query schemas and reflection metadata at their own edges. | | `ctx.typertGateway` | `core` | [`api-gateway`](../packages/api/gateway) | - | - | - | Associates generated Remote descriptors with live Cordis services, resolves registered identities, and exposes unary calls through the shared Connection RPC carrier. | -| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session-persistence/session-persistence) | [`session-persistence-jsonl`](../packages/session-persistence/session-persistence-jsonl), [`session-persistence-sqlite`](../packages/session-persistence/session-persistence-sqlite) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/bash/tool-bash), [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | - | Backends persist the same SessionEvent vocabulary; apps choose a backend at composition time. | +| `ctx.sessionPersistence` | `seam` | [`session-persistence`](../packages/session/session-persistence) | [`session-persistence-jsonl`](../packages/session/session-persistence-jsonl), [`session-persistence-sqlite`](../packages/session/session-persistence-sqlite) | [`agent-loop`](../packages/core/agent-loop), [`tool-bash`](../packages/bash/tool-bash), [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex), [`session-query`](../packages/session-query/session-query), [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | - | Backends persist the same SessionEvent vocabulary; apps choose a backend at composition time. | | `ctx.settings` | `seam` | [`settings`](../packages/settings/settings) | [`settings-local`](../packages/settings/settings-local) | [`llm-deepseek`](../packages/llm/llm-deepseek), [`llm-pi-ai`](../packages/llm/llm-pi-ai), `apiproxy` | - | Plugins register namespace schemas and resolve layered values; providers store the raw document. The LLM adapters register their entry config as the composition base under the user section; the web gateway serves redacted layered descriptors and writes the user layer. | | `ctx.credentials` | `seam` | [`credentials`](../packages/credentials/credentials) | [`credentials-local`](../packages/credentials/credentials-local) | [`llm-deepseek`](../packages/llm/llm-deepseek), [`llm-pi-ai`](../packages/llm/llm-pi-ai), `apiproxy` | - | Configuration carries references to secrets; providers own the values. Consumers resolve per operation, so a rotated credential reaches the very next request; the web gateway exposes value-free views and write-only storage. | -| `ctx.telemetry` | `seam` | [`session-telemetry`](../packages/telemetry/session-telemetry) | [`session-telemetry-otel`](../packages/telemetry/session-telemetry-otel) | - | - | The seam captures, redacts, and hands session records to one backend; nothing else consumes the service — its output leaves the process. | +| `ctx.telemetry` | `seam` | [`session-telemetry`](../packages/session/session-telemetry) | [`session-telemetry-otel`](../packages/session/session-telemetry-otel) | - | - | The seam captures, redacts, and hands session records to one backend; nothing else consumes the service — its output leaves the process. | | `ctx.storage` | `seam` | [`storage`](../packages/storage/storage) | [`storage-json`](../packages/storage/storage-json), [`storage-sqlite`](../packages/storage/storage-sqlite) | [`storage-domain`](../packages/storage/storage-domain) | - | Backends register side by side under names; data forms (domain first) mount on the hub and translate typed operations into opaque KV-unit primitives. | | `ctx.storageDomain` | `core` | [`storage-domain`](../packages/storage/storage-domain) | - | [`workspace`](../packages/workspace/workspace) | - | Waits for every configured backend, then publishes the domain form as one lifecycle-bound service for typed durable state. | | `ctx.workspace` | `core` | [`workspace`](../packages/workspace/workspace) | - | `apiproxy` | - | Owns WorkspaceId-branded records over the domain facility; stable sessionIds accounts drive Host RPC and GUI projections. | | `ctx.sessionQuery` | `seam` | [`session-query`](../packages/session-query/session-query) | [`session-query-sqlite`](../packages/session-query/session-query-sqlite) | [`session-reference`](../packages/context/session-reference), [`tool-session-query`](../packages/session-query/tool-session-query) | - | The interface supplies exact reads, filters, and traces; its concrete backend adds full-text reconciliation, ranking, snippets, and cursor generations, while the model consumer owns workspace authority and cursor-free rendering. | | `ctx.sessionReferences` | `core` | [`session-reference`](../packages/context/session-reference) | - | - | - | Projects bounded current-surface conversation snapshots into durable untrusted message context; host adapters own mention syntax. | -| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session-title/session-title) | [`session-title-first-message-llm`](../packages/session-title/session-title-first-message-llm), [`session-title-all-messages-llm`](../packages/session-title/session-title-all-messages-llm) | - | - | Owns the deterministic fallback, latest-title fold, and sole optional asynchronous provider registration. | +| `ctx.sessionTitle` | `seam` | [`session-title`](../packages/session/session-title) | [`session-title-first-message-llm`](../packages/session/session-title-first-message-llm), [`session-title-all-messages-llm`](../packages/session/session-title-all-messages-llm) | - | - | Owns the deterministic fallback, latest-title fold, and sole optional asynchronous provider registration. | | `ctx.systemPrompt` | `core` | [`system-prompt`](../packages/core/system-prompt) | - | [`agent-loop`](../packages/core/agent-loop), [`tools`](../packages/core/tools), [`tool-fs`](../packages/fs/tool-fs), [`tool-pty`](../packages/pty/tool-pty), [`tool-web`](../packages/web/tool-web) | - | Collects prompt sections and model-facing tool schemas for each step. | | `ctx.tools` | `core` | [`tools`](../packages/core/tools) | - | [`agent-loop`](../packages/core/agent-loop), [`tool-ask-user`](../packages/ui/tool-ask-user), [`tool-bash`](../packages/bash/tool-bash), [`tool-cordis`](../packages/cordis/tool-cordis), [`tool-fs`](../packages/fs/tool-fs), [`tool-pty`](../packages/pty/tool-pty), [`tool-skill`](../packages/skill/tool-skill), [`tool-subagent`](../packages/subagent/tool-subagent), [`tool-todo`](../packages/todo/tool-todo), [`tool-web`](../packages/web/tool-web) | - | Registers capabilities, owns Code Mode transport, and routes calls through pre-policy, monotonic guards, around dispatch, post-policy, and final-result observation. | | `ctx.userInteraction` | `seam` | [`user-interaction`](../packages/ui/user-interaction) | - | [`tool-ask-user`](../packages/ui/tool-ask-user) | - | UI front doors provide the active human-answer provider; tool-ask-user pauses a tool call on the provider-neutral ask() promise. | | `ctx.planMode` | `core` | [`plan-mode`](../packages/plan/plan-mode) | - | - | - | Folds logged plan/mode state, flushes user selections at turn boundaries, renders deployment-owned guidance, registers /plan, and keeps the plan-exit schema stable across transitions. | | `ctx.commands` | `core` | [`commands`](../packages/ui/commands) | - | - | - | Plugins register direct human commands without sending invocations to the model. | -| `ctx.sessionProjections` | `core` | [`session-projection`](../packages/session-projection/session-projection) | - | [`tool-todo`](../packages/todo/tool-todo), [`session-title`](../packages/session-title/session-title), [`host-apiproxy`](../packages/host/apiproxy) | - | Domains register state-driven fold units; the eager drive keeps per-session watermark states and api-proxy serves baselines and pushes changed values. | -| `ctx.sessionProjectionCache` | `core` | [`session-projection-cache`](../packages/session-projection/session-projection-cache) | - | [`host-apiproxy`](../packages/host/apiproxy) | - | Durably checkpoints projection unit states per session (throttled + turn/end/detach mandatory points) and serves the cold-read ladder: cache row + persistence tail replay, so listings never load full logs. | +| `ctx.sessionProjections` | `core` | [`session-projection`](../packages/session/session-projection) | - | [`tool-todo`](../packages/todo/tool-todo), [`session-title`](../packages/session/session-title), [`host-apiproxy`](../packages/host/apiproxy) | - | Domains register state-driven fold units; the eager drive keeps per-session watermark states and api-proxy serves baselines and pushes changed values. | +| `ctx.sessionProjectionCache` | `core` | [`session-projection-cache`](../packages/session/session-projection-cache) | - | [`host-apiproxy`](../packages/host/apiproxy) | - | Durably checkpoints projection unit states per session (throttled + turn/end/detach mandatory points) and serves the cold-read ladder: cache row + persistence tail replay, so listings never load full logs. | | `ctx.skills` | `seam` | [`skill`](../packages/skill/skill) | [`skill-badge`](../packages/skill/skill-badge), [`skill-local`](../packages/skill/skill-local) | [`tool-skill`](../packages/skill/tool-skill) | - | Merges provider skill catalogs; tool-skill renders the session-prefix catalog and loads complete skill bodies. | | `ctx.agents` | `core` | [`agent`](../packages/core/agent) | - | [`agent-loop`](../packages/core/agent-loop), [`acp`](../packages/acp/acp), [`subagent-inprocess`](../packages/subagent/subagent-inprocess) | - | Owns live Agent handles, the create/resume factory seam, and process-local initiator propagation. | | `ctx.agentLoop` | `bundle` | [`agent-loop`](../packages/core/agent-loop) | - | [`agent-spine-demo`](../packages/examples/agent-spine-demo) | - | The one concrete loop plugin; extension packages depend on dsh-agent events and services, not on this package. | diff --git a/docs/core-data-structures/persistence.i18n.yaml b/docs/core-data-structures/persistence.i18n.yaml index fe28a36f40..eccd3f146e 100644 --- a/docs/core-data-structures/persistence.i18n.yaml +++ b/docs/core-data-structures/persistence.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/core-data-structures/persistence.md -persistence.md: 3d2bc7ff3b45cd3f38fca0b880a0df9adb928bad -persistence.zh.md: 035f46d76e0189bd686e991c3d56d486b6f309d5 +persistence.md: 177d596d3d01134266f139b47430e1e5064d04d6 +persistence.zh.md: 6582c0d7d02d1976d5c3ca3322284098130ed4ad diff --git a/docs/core-data-structures/persistence.md b/docs/core-data-structures/persistence.md index 3d2bc7ff3b..177d596d3d 100644 --- a/docs/core-data-structures/persistence.md +++ b/docs/core-data-structures/persistence.md @@ -4,7 +4,7 @@ English | [中文](persistence.zh.md) The **durability seam** for the event log. [session.md](session.md) describes the in-memory `Session` — the append-only `SessionEvent` log that is the source of truth. This page describes how that log is made durable: the abstract `SessionPersistence` service, its backends, the flush checkpoint, crash recovery, and the metadata header that travels alongside the log. The event vocabulary the log carries is enumerated, member by member, in the generated [persistence log event catalog](../persistence-catalog.md). -The seam is a textbook [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): one abstract service ([dsh-session-persistence](../../packages/session-persistence/session-persistence), `ctx.sessionPersistence`) defining locate/create/append, reusable Session preparation, logical load/inspect, physical suffix reads, and lightweight list/snapshot observation over the existing `SessionEvent` — **no parallel persisted event type** — and two interchangeable backends implementing the same contract. See the [session-persistence Agent Note](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md). +The seam is a textbook [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): one abstract service ([dsh-session-persistence](../../packages/session/session-persistence), `ctx.sessionPersistence`) defining locate/create/append, reusable Session preparation, logical load/inspect, physical suffix reads, and lightweight list/snapshot observation over the existing `SessionEvent` — **no parallel persisted event type** — and two interchangeable backends implementing the same contract. See the [session-persistence Agent Note](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md). ## The flush checkpoint @@ -202,5 +202,5 @@ interface SessionPersistenceSnapshot { Both implement the same abstract `SessionPersistence` (locate/create/append/prepare/load/inspect/readFrom/list/listSnapshots over `SessionEvent`, with optional cancellation on observation methods) and pass `runPersistenceContract`, proving the seam is genuinely backend-agnostic: -- **[dsh-session-persistence-jsonl](../../packages/session-persistence/session-persistence-jsonl)** — an append-only logical JSONL log per session, stored as checksummed concatenated Zstandard frames by default or raw lines by configuration, with crash-safe atomic writes, interrupted-turn recovery, and a read/replay path. -- **[dsh-session-persistence-sqlite](../../packages/session-persistence/session-persistence-sqlite)** — `node:sqlite`, one row per `SessionEvent`. The row shape `(session_id, seq, type, time, data, source_event_seqs, surface_op)` maps 1:1 onto the event, including optional surface metadata, so there is no parallel persisted schema to keep in sync. +- **[dsh-session-persistence-jsonl](../../packages/session/session-persistence-jsonl)** — an append-only logical JSONL log per session, stored as checksummed concatenated Zstandard frames by default or raw lines by configuration, with crash-safe atomic writes, interrupted-turn recovery, and a read/replay path. +- **[dsh-session-persistence-sqlite](../../packages/session/session-persistence-sqlite)** — `node:sqlite`, one row per `SessionEvent`. The row shape `(session_id, seq, type, time, data, source_event_seqs, surface_op)` maps 1:1 onto the event, including optional surface metadata, so there is no parallel persisted schema to keep in sync. diff --git a/docs/core-data-structures/persistence.zh.md b/docs/core-data-structures/persistence.zh.md index 035f46d76e..6582c0d7d0 100644 --- a/docs/core-data-structures/persistence.zh.md +++ b/docs/core-data-structures/persistence.zh.md @@ -4,7 +4,7 @@ 事件日志的**持久性 seam**。[session.md](session.md) 描述了内存中的 `Session`:仅追加的 `SessionEvent` 日志即为真源。本页描述如何使该日志持久化:抽象的 `SessionPersistence` 服务、它的后端、flush 检查点、崩溃恢复,以及随日志一同存储的元数据头。日志承载的事件词汇在生成的[持久化日志事件目录](../persistence-catalog.md)中逐项列举。 -该 seam 是典型的[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):一个抽象服务([dsh-session-persistence](../../packages/session-persistence/session-persistence),`ctx.sessionPersistence`)在现有 `SessionEvent` 上定义 locate/create/append、可复用的 Session 准备流程、逻辑 load/inspect、物理后缀读取,以及轻量的 list/snapshot 观察——**没有平行的持久化事件类型**——以及两个实现同一契约的可互换后端。见 [session-persistence Agent Note](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md)。 +该 seam 是典型的[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):一个抽象服务([dsh-session-persistence](../../packages/session/session-persistence),`ctx.sessionPersistence`)在现有 `SessionEvent` 上定义 locate/create/append、可复用的 Session 准备流程、逻辑 load/inspect、物理后缀读取,以及轻量的 list/snapshot 观察——**没有平行的持久化事件类型**——以及两个实现同一契约的可互换后端。见 [session-persistence Agent Note](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md)。 ## flush 检查点 @@ -202,5 +202,5 @@ interface SessionPersistenceSnapshot { 两者都实现同一个抽象 `SessionPersistence`(在 `SessionEvent` 上执行 locate/create/append/prepare/load/inspect/readFrom/list/listSnapshots,观察方法可选支持取消),并通过 `runPersistenceContract`,证明该 seam 确实与后端无关: -- **[dsh-session-persistence-jsonl](../../packages/session-persistence/session-persistence-jsonl)**——每个会话一份仅追加的逻辑 JSONL 日志,默认存储为带 checksum 的连续 Zstandard frame,也可配置为原始行;支持崩溃安全的原子写入、被中断轮次的恢复以及读取/回放路径。 -- **[dsh-session-persistence-sqlite](../../packages/session-persistence/session-persistence-sqlite)**:基于 `node:sqlite`,每个 `SessionEvent` 一行。行结构 `(session_id, seq, type, time, data, source_event_seqs, surface_op)` 与事件 1:1 映射(包含可选的 surface 元数据),因此没有需要保持同步的并行持久化 schema。 +- **[dsh-session-persistence-jsonl](../../packages/session/session-persistence-jsonl)**——每个会话一份仅追加的逻辑 JSONL 日志,默认存储为带 checksum 的连续 Zstandard frame,也可配置为原始行;支持崩溃安全的原子写入、被中断轮次的恢复以及读取/回放路径。 +- **[dsh-session-persistence-sqlite](../../packages/session/session-persistence-sqlite)**:基于 `node:sqlite`,每个 `SessionEvent` 一行。行结构 `(session_id, seq, type, time, data, source_event_seqs, surface_op)` 与事件 1:1 映射(包含可选的 surface 元数据),因此没有需要保持同步的并行持久化 schema。 diff --git a/docs/core-data-structures/session-title.i18n.yaml b/docs/core-data-structures/session-title.i18n.yaml index 67f9ac765b..ed9955472c 100644 --- a/docs/core-data-structures/session-title.i18n.yaml +++ b/docs/core-data-structures/session-title.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/core-data-structures/session-title.md -session-title.md: fff1aa1f6be45d0cfc4d7f6a9527ccb93561618f -session-title.zh.md: 77a0a5e94053c94bf84bbc749cb6e260898b5d00 +session-title.md: 7bced67f07df3f00471f02b766922cdc3e4fd29e +session-title.zh.md: e8e501d3aafee49395da3d9a8efd4e91a724f09e diff --git a/docs/core-data-structures/session-title.md b/docs/core-data-structures/session-title.md index fff1aa1f6b..7bced67f07 100644 --- a/docs/core-data-structures/session-title.md +++ b/docs/core-data-structures/session-title.md @@ -2,9 +2,9 @@ English | [中文](session-title.zh.md) -Durable latest-wins title state and the optional asynchronous provider vocabulary owned by [`@deepseek-ai/dsh-session-title`](../../packages/session-title/session-title). The shared LLM helper owns the exact auxiliary request record. Package READMEs own timing, fallback, failure, and fork behavior; the generated [persistence catalog](../persistence-catalog.md) owns the complete event declarations. +Durable latest-wins title state and the optional asynchronous provider vocabulary owned by [`@deepseek-ai/dsh-session-title`](../../packages/session/session-title). The shared LLM helper owns the exact auxiliary request record. Package READMEs own timing, fallback, failure, and fork behavior; the generated [persistence catalog](../persistence-catalog.md) owns the complete event declarations. -Sources: [`packages/session-title/session-title/src/index.ts`](../../packages/session-title/session-title/src/index.ts), [`packages/session-title/session-title-llm/src/index.ts`](../../packages/session-title/session-title-llm/src/index.ts) +Sources: [`packages/session/session-title/src/index.ts`](../../packages/session/session-title/src/index.ts), [`packages/session/session-title-llm/src/index.ts`](../../packages/session/session-title-llm/src/index.ts) ## Durable title state diff --git a/docs/core-data-structures/session-title.zh.md b/docs/core-data-structures/session-title.zh.md index 77a0a5e940..e8e501d3aa 100644 --- a/docs/core-data-structures/session-title.zh.md +++ b/docs/core-data-structures/session-title.zh.md @@ -2,9 +2,9 @@ [English](session-title.md) | 中文 -[`@deepseek-ai/dsh-session-title`](../../packages/session-title/session-title) 所拥有的持久、后写覆盖的标题状态与可选异步提供方词汇。共享 LLM(大语言模型)辅助组件负责精确的辅助请求记录。各包 README 负责时序、回退、失败与 fork 行为;生成的[持久化日志事件目录](../persistence-catalog.md)负责完整的事件声明。 +[`@deepseek-ai/dsh-session-title`](../../packages/session/session-title) 所拥有的持久、后写覆盖的标题状态与可选异步提供方词汇。共享 LLM(大语言模型)辅助组件负责精确的辅助请求记录。各包 README 负责时序、回退、失败与 fork 行为;生成的[持久化日志事件目录](../persistence-catalog.md)负责完整的事件声明。 -源码:[`packages/session-title/session-title/src/index.ts`](../../packages/session-title/session-title/src/index.ts)、[`packages/session-title/session-title-llm/src/index.ts`](../../packages/session-title/session-title-llm/src/index.ts) +源码:[`packages/session/session-title/src/index.ts`](../../packages/session/session-title/src/index.ts)、[`packages/session/session-title-llm/src/index.ts`](../../packages/session/session-title-llm/src/index.ts) ## 持久标题状态 diff --git a/docs/persistence-catalog.md b/docs/persistence-catalog.md index 3845c2cb1a..daf2ea7ab2 100644 --- a/docs/persistence-catalog.md +++ b/docs/persistence-catalog.md @@ -557,7 +557,7 @@ Source: [`packages/core/session/src/types.ts:304`](../packages/core/session/src/ Types: [SessionTitleEventData](core-data-structures/session-title.md) -Source: [`packages/session-title/session-title/src/index.ts:100`](../packages/session-title/session-title/src/index.ts) +Source: [`packages/session/session-title/src/index.ts:100`](../packages/session/session-title/src/index.ts) #### `session/title-llm-request` — log-only @@ -568,7 +568,7 @@ Source: [`packages/session-title/session-title/src/index.ts:100`](../packages/se Types: [SessionTitleLlmRequestEventData](core-data-structures/session-title.md) -Source: [`packages/session-title/session-title-llm/src/index.ts:43`](../packages/session-title/session-title-llm/src/index.ts) +Source: [`packages/session/session-title-llm/src/index.ts:43`](../packages/session/session-title-llm/src/index.ts) ### `step/*` diff --git a/knip.json b/knip.json index d154cd646b..0e82064200 100644 --- a/knip.json +++ b/knip.json @@ -283,7 +283,7 @@ "tests/**/*.ts" ] }, - "packages/telemetry/session-telemetry-otel": { + "packages/session/session-telemetry-otel": { "entry": [ "tests/**/*.spec.ts", "tests/**/*.e2e.ts" @@ -414,7 +414,7 @@ "tests/**/*.ts" ] }, - "packages/session-title/session-title-first-message-llm": { + "packages/session/session-title-first-message-llm": { "entry": [ "tests/**/*.spec.ts", "tests/**/*.e2e.ts" @@ -434,7 +434,7 @@ "tests/**/*.ts" ] }, - "packages/session-persistence/session-checkpoint-policy": { + "packages/session/session-checkpoint-policy": { "entry": [ "tests/**/*.spec.ts", "tests/**/*.e2e.ts" diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml index 143e7704c2..44dd906b76 100644 --- a/packages/README.i18n.yaml +++ b/packages/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/README.md -README.md: 98fc87a6b26a42c58bb63cba96cd6af384f3ec71 -README.zh.md: 86a316dca77efd5e5eb59e3fca7d53890a34901d +README.md: 9f8b3f936af6392239218d5389c91c87d0f7d1f9 +README.zh.md: 2f4e86cb541a8a34762b36cac57f456de96cac5d diff --git a/packages/README.md b/packages/README.md index 98fc87a6b2..9f8b3f936a 100644 --- a/packages/README.md +++ b/packages/README.md @@ -39,13 +39,10 @@ Groups hold `packages///`; names stay `@deepseek-ai/dsh-`. **Gr | [`bundle/`](bundle/README.md) | Installable `dsh --profile` patch layers | Product — stable surface | | [`cordis/`](cordis/README.md) | Cordis runtime integration: self-inspection, temporary Plugins, restricted repository Plugin loading | Product — stable surface | | [`hooks/`](hooks/README.md) | Hook bridges + the shared Claude Code / Codex wire-protocol library | Product — stable surface | -| [`session-persistence/`](session-persistence/README.md) | Persistence seam + JSONL/SQLite backends | Product — stable surface | -| [`session-projection/`](session-projection/README.md) | Projection seam: domain fold units serve whole values | Product — stable surface | +| [`session/`](session/README.md) | Durable session data plane: persistence seam + JSONL/SQLite backends, projection seam, log-backed titles, session reporting | Product — stable surface | | [`session-query/`](session-query/README.md) | Session retrieval family: logical corpus, bounded reads, lineage, event relationships, semantic filtering, and SQLite full-text search | Product — stable surface | -| [`session-title/`](session-title/README.md) | Log-backed session titles: fallback service and opt-in LLM providers | Product — stable surface | | [`settings/`](settings/README.md) | User-settings seam + file-backed provider | Product — stable surface | | [`credentials/`](credentials/README.md) | Credential-reference seam + env-over-`.env` provider | Product — stable surface | -| [`telemetry/`](telemetry/README.md) | Session reporting: capture/redact seam, OTel backend | Product — stable surface | | [`storage/`](storage/README.md) | Non-session storage hub + backends + domain form | Product — stable surface | | [`workspace/`](workspace/README.md) | Workspace entity | Product — stable surface | | [`sdk/`](sdk/README.md) | Project SDK tooling | Product — stable surface | diff --git a/packages/README.zh.md b/packages/README.zh.md index 86a316dca7..2f4e86cb54 100644 --- a/packages/README.zh.md +++ b/packages/README.zh.md @@ -39,13 +39,10 @@ | [`bundle/`](bundle/README.md) | 可安装的 `dsh --profile` 补丁层 | 产品:稳定表面 | | [`cordis/`](cordis/README.md) | Cordis 运行时集成:自检、临时 Plugin、受限 repository Plugin 加载 | 产品:稳定表面 | | [`hooks/`](hooks/README.md) | 钩子桥接 + 共享 Claude Code/Codex 协议格式库 | 产品:稳定表面 | -| [`session-persistence/`](session-persistence/README.md) | 持久化 seam + JSONL/SQLite 后端 | 产品:稳定表面 | -| [`session-projection/`](session-projection/README.md) | 投影 seam:领域折叠单元供给全量值 | 产品:稳定表面 | +| [`session/`](session/README.md) | 持久会话数据平面:持久化 seam + JSONL/SQLite 后端、投影 seam、日志支持的标题、会话上报 | 产品:稳定表面 | | [`session-query/`](session-query/README.md) | 会话检索系列:逻辑语料库、有界读取、血缘、事件关系、语义过滤和 SQLite 全文搜索 | 产品:稳定表面 | -| [`session-title/`](session-title/README.md) | 日志支撑的会话标题:回退服务与选用 LLM 提供方 | 产品:稳定表面 | | [`settings/`](settings/README.md) | 用户设置 seam + 文件 provider | 产品:稳定表面 | | [`credentials/`](credentials/README.md) | 凭据引用 seam + 环境叠加 `.env` provider | 产品:稳定表面 | -| [`telemetry/`](telemetry/README.md) | 会话上报:捕获/脱敏 seam、OTel 后端 | 产品:稳定表面 | | [`storage/`](storage/README.md) | 非会话存储中枢 + 后端 + 领域形式 | 产品:稳定表面 | | [`workspace/`](workspace/README.md) | Workspace 实体 | 产品:稳定表面 | | [`sdk/`](sdk/README.md) | 项目 SDK 工具 | 产品:稳定表面 | diff --git a/packages/client/runtime/tsconfig.json b/packages/client/runtime/tsconfig.json index f93546e855..71cfb229a9 100644 --- a/packages/client/runtime/tsconfig.json +++ b/packages/client/runtime/tsconfig.json @@ -30,10 +30,10 @@ "path": "../../compact/compact" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { - "path": "../../session-title/session-title" + "path": "../../session/session-title" }, { "path": "../../llm/llm" diff --git a/packages/client/ui-conversation/tsconfig.json b/packages/client/ui-conversation/tsconfig.json index 04b265bdd5..0505786841 100644 --- a/packages/client/ui-conversation/tsconfig.json +++ b/packages/client/ui-conversation/tsconfig.json @@ -24,7 +24,7 @@ "path": "../runtime" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../llm/token-meter" diff --git a/packages/core/agent-loop/tsconfig.json b/packages/core/agent-loop/tsconfig.json index 0949f18453..c3504e4eb4 100644 --- a/packages/core/agent-loop/tsconfig.json +++ b/packages/core/agent-loop/tsconfig.json @@ -24,7 +24,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../core/system-prompt" diff --git a/packages/examples/acp-demo/tests/built-bin.e2e.ts b/packages/examples/acp-demo/tests/built-bin.e2e.ts index 6f67baa5a5..d09a0e333d 100644 --- a/packages/examples/acp-demo/tests/built-bin.e2e.ts +++ b/packages/examples/acp-demo/tests/built-bin.e2e.ts @@ -34,8 +34,8 @@ const dshPackages = [ 'examples/agent-spine-demo', 'core/agent', 'core/session', 'core/system-prompt', 'core/tools', 'core/agent-loop', 'llm/llm', 'bash/bash', 'bash/bash-local', 'bash/tool-bash', 'subprocess/subprocess', 'subprocess/subprocess-local', 'context/workspace-context', 'support/invariants', 'ui/app-boot', - 'session-persistence/session-persistence', - 'session-persistence/session-checkpoint-policy', 'session-persistence/session-persistence-jsonl', + 'session/session-persistence', + 'session/session-checkpoint-policy', 'session/session-persistence-jsonl', 'acp/acp', 'examples/acp-demo', 'util/paths', ] const vendorPackages = [ diff --git a/packages/examples/acp-demo/tsconfig.json b/packages/examples/acp-demo/tsconfig.json index 6eeffc5eef..34b48fc46a 100644 --- a/packages/examples/acp-demo/tsconfig.json +++ b/packages/examples/acp-demo/tsconfig.json @@ -39,10 +39,10 @@ "path": "../../context/workspace-context" }, { - "path": "../../session-persistence/session-checkpoint-policy" + "path": "../../session/session-checkpoint-policy" }, { - "path": "../../session-persistence/session-persistence-jsonl" + "path": "../../session/session-persistence-jsonl" }, { "path": "../../support/invariants" diff --git a/packages/examples/agent-spine-demo/tsconfig.json b/packages/examples/agent-spine-demo/tsconfig.json index f245e9f4d0..e31863d3b1 100644 --- a/packages/examples/agent-spine-demo/tsconfig.json +++ b/packages/examples/agent-spine-demo/tsconfig.json @@ -27,7 +27,7 @@ "path": "../../core/session" }, { - "path": "../../session-title/session-title" + "path": "../../session/session-title" }, { "path": "../../core/system-prompt" diff --git a/packages/goal/goal/tsconfig.json b/packages/goal/goal/tsconfig.json index f106707bd3..1484f5a4b9 100644 --- a/packages/goal/goal/tsconfig.json +++ b/packages/goal/goal/tsconfig.json @@ -33,7 +33,7 @@ "path": "../../core/agent" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../typert/type-meta" diff --git a/packages/hooks/hooks-claude/tsconfig.json b/packages/hooks/hooks-claude/tsconfig.json index 445d0f68b1..e254c7146f 100644 --- a/packages/hooks/hooks-claude/tsconfig.json +++ b/packages/hooks/hooks-claude/tsconfig.json @@ -30,7 +30,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../subagent/subagent" diff --git a/packages/hooks/hooks-codex/tsconfig.json b/packages/hooks/hooks-codex/tsconfig.json index 3bd9bd91e5..46e8216404 100644 --- a/packages/hooks/hooks-codex/tsconfig.json +++ b/packages/hooks/hooks-codex/tsconfig.json @@ -30,7 +30,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../llm/llm" diff --git a/packages/host/apiproxy/tsconfig.json b/packages/host/apiproxy/tsconfig.json index 8686a9e468..58c63f5669 100644 --- a/packages/host/apiproxy/tsconfig.json +++ b/packages/host/apiproxy/tsconfig.json @@ -42,19 +42,19 @@ "path": "../../core/tools" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { - "path": "../../session-projection/session-projection-cache" + "path": "../../session/session-projection-cache" }, { "path": "../../session-query/session-query" }, { - "path": "../../session-title/session-title" + "path": "../../session/session-title" }, { "path": "../../session-query/session-query" diff --git a/packages/llm/token-meter/tsconfig.json b/packages/llm/token-meter/tsconfig.json index b8b32e36fa..404607f87a 100644 --- a/packages/llm/token-meter/tsconfig.json +++ b/packages/llm/token-meter/tsconfig.json @@ -27,7 +27,7 @@ "path": "../../compact/compact" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../support/invariants" diff --git a/packages/plan/plan-mode/tsconfig.json b/packages/plan/plan-mode/tsconfig.json index a9b2d4dccf..6fa3cffbbc 100644 --- a/packages/plan/plan-mode/tsconfig.json +++ b/packages/plan/plan-mode/tsconfig.json @@ -33,7 +33,7 @@ "path": "../../ui/commands" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../support/invariants" diff --git a/packages/sdk/helper/tsconfig.json b/packages/sdk/helper/tsconfig.json index 528b370a5c..f33033f47f 100644 --- a/packages/sdk/helper/tsconfig.json +++ b/packages/sdk/helper/tsconfig.json @@ -19,10 +19,10 @@ "path": "../../hooks/hooks-codex" }, { - "path": "../../session-persistence/session-persistence-jsonl" + "path": "../../session/session-persistence-jsonl" }, { - "path": "../../session-persistence/session-persistence-sqlite" + "path": "../../session/session-persistence-sqlite" }, { "path": "../../subagent/tool-subagent" diff --git a/packages/session-persistence/README.i18n.yaml b/packages/session-persistence/README.i18n.yaml deleted file mode 100644 index 85eb2bd27d..0000000000 --- a/packages/session-persistence/README.i18n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each -# side as of the last confirmed-consistent state. Both languages carry equal authority; -# after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write packages/session-persistence/README.md -README.md: 060f757b3568318b0be4b01b3a10d019d28eac3b -README.zh.md: 67022565f7dabcbbccee30d5ce60fa559088ca39 diff --git a/packages/session-persistence/README.md b/packages/session-persistence/README.md deleted file mode 100644 index 060f757b35..0000000000 --- a/packages/session-persistence/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# session-persistence/ — persistence capability family - -English | [中文](README.zh.md) - -This family defines durable session persistence, semantic checkpoint policy, and the shipped storage backends. - -| Package | Role | ctx key | -|---|---|---| -| [`session-persistence/`](session-persistence/README.md) | Defines the persistence service and shared write coordination | `ctx.sessionPersistence` | -| [`session-checkpoint-policy/`](session-checkpoint-policy/README.md) | Applies semantic durability checkpoints | wraps `ctx.llm` and `ctx.tools` | -| [`session-persistence-jsonl/`](session-persistence-jsonl/README.md) | Persists sessions in JSONL files | registers on `ctx.sessionPersistence` | -| [`session-persistence-sqlite/`](session-persistence-sqlite/README.md) | Persists sessions in SQLite | registers on `ctx.sessionPersistence` | - -The [session-persistence decision](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md) records the family design. diff --git a/packages/session-persistence/README.zh.md b/packages/session-persistence/README.zh.md deleted file mode 100644 index 67022565f7..0000000000 --- a/packages/session-persistence/README.zh.md +++ /dev/null @@ -1,14 +0,0 @@ -# session-persistence/:持久化能力家族 - -[English](README.md) | 中文 - -本家族定义持久会话数据的持久化机制、语义检查点策略以及随产品交付的存储后端。 - -| 包 | 职责 | ctx 键 | -|---|---|---| -| [`session-persistence/`](session-persistence/README.md) | 定义持久化服务和共享写入协调机制 | `ctx.sessionPersistence` | -| [`session-checkpoint-policy/`](session-checkpoint-policy/README.md) | 应用语义持久性检查点 | 包装 `ctx.llm` 和 `ctx.tools` | -| [`session-persistence-jsonl/`](session-persistence-jsonl/README.md) | 将会话持久化到 JSONL 文件 | 注册到 `ctx.sessionPersistence` | -| [`session-persistence-sqlite/`](session-persistence-sqlite/README.md) | 将会话持久化到 SQLite | 注册到 `ctx.sessionPersistence` | - -[会话持久化决策](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md)记录了该家族的设计。 diff --git a/packages/session-projection/README.i18n.yaml b/packages/session-projection/README.i18n.yaml deleted file mode 100644 index 5e03069b99..0000000000 --- a/packages/session-projection/README.i18n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each -# side as of the last confirmed-consistent state. Both languages carry equal authority; -# after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write packages/session-projection/README.md -README.md: f1fc8337bbea6663915c19f39fdf02f14190370d -README.zh.md: 3323166f496fabafabcd96abeaec707a28ce552a diff --git a/packages/session-projection/README.md b/packages/session-projection/README.md deleted file mode 100644 index f1fc8337bb..0000000000 --- a/packages/session-projection/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# session-projection/ — session projection capability family - -English | [中文](README.zh.md) - -This family serves current, log-derived per-session state to client carriers. - -| Package | Role | ctx key | -|---|---|---| -| [`session-projection/`](session-projection/README.md) | Defines and drives session projection units | `ctx.sessionProjections` | -| [`session-projection-cache/`](session-projection-cache/README.md) | Persists and restores projection checkpoints | `ctx.sessionProjectionCache` | diff --git a/packages/session-projection/README.zh.md b/packages/session-projection/README.zh.md deleted file mode 100644 index 3323166f49..0000000000 --- a/packages/session-projection/README.zh.md +++ /dev/null @@ -1,10 +0,0 @@ -# session-projection/:会话投影能力家族 - -[English](README.md) | 中文 - -本家族向客户端载体提供从日志派生的当前逐会话状态。 - -| 包 | 职责 | ctx 键 | -|---|---|---| -| [`session-projection/`](session-projection/README.md) | 定义并驱动会话投影单元 | `ctx.sessionProjections` | -| [`session-projection-cache/`](session-projection-cache/README.md) | 持久化并恢复投影检查点 | `ctx.sessionProjectionCache` | diff --git a/packages/session-query/session-query-sqlite/tsconfig.json b/packages/session-query/session-query-sqlite/tsconfig.json index 1f09565c4a..2a74d8e326 100644 --- a/packages/session-query/session-query-sqlite/tsconfig.json +++ b/packages/session-query/session-query-sqlite/tsconfig.json @@ -21,7 +21,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../support/invariants" diff --git a/packages/session-query/session-query/tsconfig.json b/packages/session-query/session-query/tsconfig.json index 0f17353fee..9e661c1c2c 100644 --- a/packages/session-query/session-query/tsconfig.json +++ b/packages/session-query/session-query/tsconfig.json @@ -24,10 +24,10 @@ "path": "../../core/session" }, { - "path": "../../session-title/session-title" + "path": "../../session/session-title" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../support/invariants" diff --git a/packages/session-title/README.md b/packages/session-title/README.md deleted file mode 100644 index c2ccc1cd6d..0000000000 --- a/packages/session-title/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# session-title/ — log-backed session-title capability family - -English | [中文](README.zh.md) - -This family derives durable session titles from the session log, with an optional model-backed provider. - -| Package | Role | ctx key | -|---|---|---| -| [`session-title/`](session-title/README.md) | Owns title state, fallback behavior, provider registration, and refresh | `ctx.sessionTitle` | -| [`session-title-llm/`](session-title-llm/README.md) | Provides shared model-backed title generation | — | -| [`session-title-first-message-llm/`](session-title-first-message-llm/README.md) | Titles a session from its first eligible human message | registers on `ctx.sessionTitle` | -| [`session-title-all-messages-llm/`](session-title-all-messages-llm/README.md) | Titles a session from all eligible human messages | registers on `ctx.sessionTitle` | - -Deployments may register one model-backed provider; the service retains a deterministic fallback when none is present. diff --git a/packages/session-title/README.zh.md b/packages/session-title/README.zh.md deleted file mode 100644 index b8df266a86..0000000000 --- a/packages/session-title/README.zh.md +++ /dev/null @@ -1,14 +0,0 @@ -# session-title/:日志支持的会话标题能力族 - -[English](README.md) | 中文 - -该包族从会话日志派生持久会话标题,并支持可选的模型后端 provider。 - -| 包 | 职责 | ctx key | -|---|---|---| -| [`session-title/`](session-title/README.md) | 负责标题状态、回退行为、provider 注册与刷新 | `ctx.sessionTitle` | -| [`session-title-llm/`](session-title-llm/README.md) | 提供共享的模型标题生成能力 | — | -| [`session-title-first-message-llm/`](session-title-first-message-llm/README.md) | 根据第一条合格的人类消息生成会话标题 | 注册到 `ctx.sessionTitle` | -| [`session-title-all-messages-llm/`](session-title-all-messages-llm/README.md) | 根据所有合格的人类消息生成会话标题 | 注册到 `ctx.sessionTitle` | - -部署可注册一个模型后端 provider;未注册时,服务仍提供确定性回退。 diff --git a/packages/session-title/README.i18n.yaml b/packages/session/README.i18n.yaml similarity index 71% rename from packages/session-title/README.i18n.yaml rename to packages/session/README.i18n.yaml index 2c5d1f2788..b500a64611 100644 --- a/packages/session-title/README.i18n.yaml +++ b/packages/session/README.i18n.yaml @@ -1,6 +1,6 @@ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write packages/session-title/README.md -README.md: c2ccc1cd6d329a58f673a9ea5d47ce2f35c9dc41 -README.zh.md: b8df266a861da5cb20a76d0738bba4993218c3d5 +# pnpm run verify-translation-pairing --write packages/session/README.md +README.md: 45eff16ad57ec1ccc8ebdd55db82f41b5adfc111 +README.zh.md: 2d67e28ef169f4e4376b2a644a3b842e5835df04 diff --git a/packages/session/README.md b/packages/session/README.md new file mode 100644 index 0000000000..45eff16ad5 --- /dev/null +++ b/packages/session/README.md @@ -0,0 +1,49 @@ +# session/ — durable session data plane + +English | [中文](README.zh.md) + +The durable family around `core/session`'s live in-memory service: the persistence seam with its storage backends and checkpoint policy, the projection seam that serves whole log-derived values, log-backed titles, and outbound session telemetry. All **product** packages. `session-query/` remains a sibling group: the read/tool surface is consumed independently of persistence internals. + +## Persistence + +Durable session persistence, semantic checkpoint policy, and the shipped storage backends. + +| Package | Role | ctx key | +|---|---|---| +| [`session-persistence/`](session-persistence/README.md) | Defines the persistence service and shared write coordination | `ctx.sessionPersistence` | +| [`session-checkpoint-policy/`](session-checkpoint-policy/README.md) | Applies semantic durability checkpoints | wraps `ctx.llm` and `ctx.tools` | +| [`session-persistence-jsonl/`](session-persistence-jsonl/README.md) | Persists sessions in JSONL files | registers on `ctx.sessionPersistence` | +| [`session-persistence-sqlite/`](session-persistence-sqlite/README.md) | Persists sessions in SQLite | registers on `ctx.sessionPersistence` | + +The [session-persistence decision](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md) records the persistence design. + +## Projection + +Serves current, log-derived per-session state to client carriers. + +| Package | Role | ctx key | +|---|---|---| +| [`session-projection/`](session-projection/README.md) | Defines and drives session projection units | `ctx.sessionProjections` | +| [`session-projection-cache/`](session-projection-cache/README.md) | Persists and restores projection checkpoints | `ctx.sessionProjectionCache` | + +## Titles + +Derives durable session titles from the session log, with an optional model-backed provider. + +| Package | Role | ctx key | +|---|---|---| +| [`session-title/`](session-title/README.md) | Owns title state, fallback behavior, provider registration, and refresh | `ctx.sessionTitle` | +| [`session-title-llm/`](session-title-llm/README.md) | Provides shared model-backed title generation | — | +| [`session-title-first-message-llm/`](session-title-first-message-llm/README.md) | Titles a session from its first eligible human message | registers on `ctx.sessionTitle` | +| [`session-title-all-messages-llm/`](session-title-all-messages-llm/README.md) | Titles a session from all eligible human messages | registers on `ctx.sessionTitle` | + +Deployments may register one model-backed provider; the service retains a deterministic fallback when none is present. + +## Telemetry + +Projects session activity into outbound telemetry and delegates delivery to a configured reporting backend. The [telemetry decision](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md) records the reporting boundary; the [mode decision](../../.agents/notes/implemented/feature/2026-08-05-feedback-gated-session-telemetry.md) records immediate, feedback-gated, and disabled delivery. + +| Package | Role | +|---|---| +| [`session-telemetry/`](session-telemetry/README.md) | Defines capture, redaction, projection, and live or on-demand backend delivery. | +| [`session-telemetry-otel/`](session-telemetry-otel/README.md) | Delivers telemetry through OpenTelemetry logs in `FULL`, `FEEDBACK_ONLY`, or `DISABLED` mode. | diff --git a/packages/session/README.zh.md b/packages/session/README.zh.md new file mode 100644 index 0000000000..2d67e28ef1 --- /dev/null +++ b/packages/session/README.zh.md @@ -0,0 +1,49 @@ +# session/:持久会话数据平面 + +[English](README.md) | 中文 + +围绕 `core/session` 常驻内存实时服务的持久家族:持久化 seam 连同其存储后端与检查点策略、供出日志派生全量值的投影 seam、日志支持的标题,以及外发会话遥测。全部都是**产品**包(package)。`session-query/` 仍是同级独立组:读取/工具面的消费不依赖持久化内部实现。 + +## 持久化 + +持久会话数据的持久化机制、语义检查点策略以及随产品交付的存储后端。 + +| 包 | 职责 | ctx 键 | +|---|---|---| +| [`session-persistence/`](session-persistence/README.md) | 定义持久化服务和共享写入协调机制 | `ctx.sessionPersistence` | +| [`session-checkpoint-policy/`](session-checkpoint-policy/README.md) | 应用语义持久性检查点 | 包装 `ctx.llm` 和 `ctx.tools` | +| [`session-persistence-jsonl/`](session-persistence-jsonl/README.md) | 将会话持久化到 JSONL 文件 | 注册到 `ctx.sessionPersistence` | +| [`session-persistence-sqlite/`](session-persistence-sqlite/README.md) | 将会话持久化到 SQLite | 注册到 `ctx.sessionPersistence` | + +[会话持久化决策](../../.agents/notes/implemented/architecture/2026-06-14-session-persistence.md)记录了持久化设计。 + +## 投影 + +向客户端载体提供从日志派生的当前逐会话状态。 + +| 包 | 职责 | ctx 键 | +|---|---|---| +| [`session-projection/`](session-projection/README.md) | 定义并驱动会话投影单元 | `ctx.sessionProjections` | +| [`session-projection-cache/`](session-projection-cache/README.md) | 持久化并恢复投影检查点 | `ctx.sessionProjectionCache` | + +## 标题 + +从会话日志派生持久会话标题,并支持可选的模型后端 provider。 + +| 包 | 职责 | ctx 键 | +|---|---|---| +| [`session-title/`](session-title/README.md) | 负责标题状态、回退行为、provider 注册与刷新 | `ctx.sessionTitle` | +| [`session-title-llm/`](session-title-llm/README.md) | 提供共享的模型标题生成能力 | — | +| [`session-title-first-message-llm/`](session-title-first-message-llm/README.md) | 根据第一条合格的人类消息生成会话标题 | 注册到 `ctx.sessionTitle` | +| [`session-title-all-messages-llm/`](session-title-all-messages-llm/README.md) | 根据所有合格的人类消息生成会话标题 | 注册到 `ctx.sessionTitle` | + +部署可注册一个模型后端 provider;未注册时,服务仍提供确定性回退。 + +## 遥测 + +将会话活动投影为外发遥测,并将投递委派给配置的上报后端。[遥测决策](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)记录上报边界;[模式决策](../../.agents/notes/implemented/feature/2026-08-05-feedback-gated-session-telemetry.md)记录即时、反馈门控与禁用投递。 + +| 包 | 职责 | +|---|---| +| [`session-telemetry/`](session-telemetry/README.md) | 定义捕获、脱敏、投影,以及实时或按需后端投递。 | +| [`session-telemetry-otel/`](session-telemetry-otel/README.md) | 通过 OpenTelemetry 日志以 `FULL`、`FEEDBACK_ONLY` 或 `DISABLED` 模式投递遥测。 | diff --git a/packages/session-persistence/session-checkpoint-policy/README.i18n.yaml b/packages/session/session-checkpoint-policy/README.i18n.yaml similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/README.i18n.yaml rename to packages/session/session-checkpoint-policy/README.i18n.yaml diff --git a/packages/session-persistence/session-checkpoint-policy/README.md b/packages/session/session-checkpoint-policy/README.md similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/README.md rename to packages/session/session-checkpoint-policy/README.md diff --git a/packages/session-persistence/session-checkpoint-policy/README.zh.md b/packages/session/session-checkpoint-policy/README.zh.md similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/README.zh.md rename to packages/session/session-checkpoint-policy/README.zh.md diff --git a/packages/session-persistence/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/package.json rename to packages/session/session-checkpoint-policy/package.json diff --git a/packages/session-persistence/session-checkpoint-policy/src/index.ts b/packages/session/session-checkpoint-policy/src/index.ts similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/src/index.ts rename to packages/session/session-checkpoint-policy/src/index.ts diff --git a/packages/session-persistence/session-checkpoint-policy/src/invariant.ts b/packages/session/session-checkpoint-policy/src/invariant.ts similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/src/invariant.ts rename to packages/session/session-checkpoint-policy/src/invariant.ts diff --git a/packages/session-persistence/session-checkpoint-policy/tests/crash-recovery.e2e.ts b/packages/session/session-checkpoint-policy/tests/crash-recovery.e2e.ts similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/tests/crash-recovery.e2e.ts rename to packages/session/session-checkpoint-policy/tests/crash-recovery.e2e.ts diff --git a/packages/session-persistence/session-checkpoint-policy/tests/fixtures/crash-child.ts b/packages/session/session-checkpoint-policy/tests/fixtures/crash-child.ts similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/tests/fixtures/crash-child.ts rename to packages/session/session-checkpoint-policy/tests/fixtures/crash-child.ts diff --git a/packages/session-persistence/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts b/packages/session/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts similarity index 100% rename from packages/session-persistence/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts rename to packages/session/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts diff --git a/packages/session-persistence/session-checkpoint-policy/tsconfig.json b/packages/session/session-checkpoint-policy/tsconfig.json similarity index 89% rename from packages/session-persistence/session-checkpoint-policy/tsconfig.json rename to packages/session/session-checkpoint-policy/tsconfig.json index 1b81e05951..400f67a53b 100644 --- a/packages/session-persistence/session-checkpoint-policy/tsconfig.json +++ b/packages/session/session-checkpoint-policy/tsconfig.json @@ -24,7 +24,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../session-persistence" }, { "path": "../../support/invariants" diff --git a/packages/session-persistence/session-persistence-jsonl/README.i18n.yaml b/packages/session/session-persistence-jsonl/README.i18n.yaml similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/README.i18n.yaml rename to packages/session/session-persistence-jsonl/README.i18n.yaml diff --git a/packages/session-persistence/session-persistence-jsonl/README.md b/packages/session/session-persistence-jsonl/README.md similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/README.md rename to packages/session/session-persistence-jsonl/README.md diff --git a/packages/session-persistence/session-persistence-jsonl/README.zh.md b/packages/session/session-persistence-jsonl/README.zh.md similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/README.zh.md rename to packages/session/session-persistence-jsonl/README.zh.md diff --git a/packages/session-persistence/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/package.json rename to packages/session/session-persistence-jsonl/package.json diff --git a/packages/session-persistence/session-persistence-jsonl/src/format.ts b/packages/session/session-persistence-jsonl/src/format.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/format.ts rename to packages/session/session-persistence-jsonl/src/format.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/index.ts b/packages/session/session-persistence-jsonl/src/index.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/index.ts rename to packages/session/session-persistence-jsonl/src/index.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/invariant.ts b/packages/session/session-persistence-jsonl/src/invariant.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/invariant.ts rename to packages/session/session-persistence-jsonl/src/invariant.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/win32.ts b/packages/session/session-persistence-jsonl/src/win32.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/win32.ts rename to packages/session/session-persistence-jsonl/src/win32.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/zstd-private-decoder.ts b/packages/session/session-persistence-jsonl/src/zstd-private-decoder.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/zstd-private-decoder.ts rename to packages/session/session-persistence-jsonl/src/zstd-private-decoder.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/zstd-public-decoder.ts b/packages/session/session-persistence-jsonl/src/zstd-public-decoder.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/zstd-public-decoder.ts rename to packages/session/session-persistence-jsonl/src/zstd-public-decoder.ts diff --git a/packages/session-persistence/session-persistence-jsonl/src/zstd.ts b/packages/session/session-persistence-jsonl/src/zstd.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/src/zstd.ts rename to packages/session/session-persistence-jsonl/src/zstd.ts diff --git a/packages/session-persistence/session-persistence-jsonl/tests/jsonl.spec.ts b/packages/session/session-persistence-jsonl/tests/jsonl.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/tests/jsonl.spec.ts rename to packages/session/session-persistence-jsonl/tests/jsonl.spec.ts diff --git a/packages/session-persistence/session-persistence-jsonl/tests/win32.spec.ts b/packages/session/session-persistence-jsonl/tests/win32.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/tests/win32.spec.ts rename to packages/session/session-persistence-jsonl/tests/win32.spec.ts diff --git a/packages/session-persistence/session-persistence-jsonl/tests/zstd.compat.spec.ts b/packages/session/session-persistence-jsonl/tests/zstd.compat.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/tests/zstd.compat.spec.ts rename to packages/session/session-persistence-jsonl/tests/zstd.compat.spec.ts diff --git a/packages/session-persistence/session-persistence-jsonl/tests/zstd.spec.ts b/packages/session/session-persistence-jsonl/tests/zstd.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence-jsonl/tests/zstd.spec.ts rename to packages/session/session-persistence-jsonl/tests/zstd.spec.ts diff --git a/packages/session-persistence/session-persistence-jsonl/tsconfig.json b/packages/session/session-persistence-jsonl/tsconfig.json similarity index 87% rename from packages/session-persistence/session-persistence-jsonl/tsconfig.json rename to packages/session/session-persistence-jsonl/tsconfig.json index 044156938b..240c0b0ea9 100644 --- a/packages/session-persistence/session-persistence-jsonl/tsconfig.json +++ b/packages/session/session-persistence-jsonl/tsconfig.json @@ -21,7 +21,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../session-persistence" }, { "path": "../../support/invariants" diff --git a/packages/session-persistence/session-persistence-sqlite/README.i18n.yaml b/packages/session/session-persistence-sqlite/README.i18n.yaml similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/README.i18n.yaml rename to packages/session/session-persistence-sqlite/README.i18n.yaml diff --git a/packages/session-persistence/session-persistence-sqlite/README.md b/packages/session/session-persistence-sqlite/README.md similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/README.md rename to packages/session/session-persistence-sqlite/README.md diff --git a/packages/session-persistence/session-persistence-sqlite/README.zh.md b/packages/session/session-persistence-sqlite/README.zh.md similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/README.zh.md rename to packages/session/session-persistence-sqlite/README.zh.md diff --git a/packages/session-persistence/session-persistence-sqlite/package.json b/packages/session/session-persistence-sqlite/package.json similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/package.json rename to packages/session/session-persistence-sqlite/package.json diff --git a/packages/session-persistence/session-persistence-sqlite/src/index.ts b/packages/session/session-persistence-sqlite/src/index.ts similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/src/index.ts rename to packages/session/session-persistence-sqlite/src/index.ts diff --git a/packages/session-persistence/session-persistence-sqlite/src/invariant.ts b/packages/session/session-persistence-sqlite/src/invariant.ts similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/src/invariant.ts rename to packages/session/session-persistence-sqlite/src/invariant.ts diff --git a/packages/session-persistence/session-persistence-sqlite/src/schema.ts b/packages/session/session-persistence-sqlite/src/schema.ts similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/src/schema.ts rename to packages/session/session-persistence-sqlite/src/schema.ts diff --git a/packages/session-persistence/session-persistence-sqlite/tests/sqlite.spec.ts b/packages/session/session-persistence-sqlite/tests/sqlite.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence-sqlite/tests/sqlite.spec.ts rename to packages/session/session-persistence-sqlite/tests/sqlite.spec.ts diff --git a/packages/session-persistence/session-persistence-sqlite/tsconfig.json b/packages/session/session-persistence-sqlite/tsconfig.json similarity index 87% rename from packages/session-persistence/session-persistence-sqlite/tsconfig.json rename to packages/session/session-persistence-sqlite/tsconfig.json index 044156938b..240c0b0ea9 100644 --- a/packages/session-persistence/session-persistence-sqlite/tsconfig.json +++ b/packages/session/session-persistence-sqlite/tsconfig.json @@ -21,7 +21,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../session-persistence" }, { "path": "../../support/invariants" diff --git a/packages/session-persistence/session-persistence/README.i18n.yaml b/packages/session/session-persistence/README.i18n.yaml similarity index 100% rename from packages/session-persistence/session-persistence/README.i18n.yaml rename to packages/session/session-persistence/README.i18n.yaml diff --git a/packages/session-persistence/session-persistence/README.md b/packages/session/session-persistence/README.md similarity index 100% rename from packages/session-persistence/session-persistence/README.md rename to packages/session/session-persistence/README.md diff --git a/packages/session-persistence/session-persistence/README.zh.md b/packages/session/session-persistence/README.zh.md similarity index 100% rename from packages/session-persistence/session-persistence/README.zh.md rename to packages/session/session-persistence/README.zh.md diff --git a/packages/session-persistence/session-persistence/package.json b/packages/session/session-persistence/package.json similarity index 100% rename from packages/session-persistence/session-persistence/package.json rename to packages/session/session-persistence/package.json diff --git a/packages/session-persistence/session-persistence/src/coordinator.ts b/packages/session/session-persistence/src/coordinator.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/coordinator.ts rename to packages/session/session-persistence/src/coordinator.ts diff --git a/packages/session-persistence/session-persistence/src/index.ts b/packages/session/session-persistence/src/index.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/index.ts rename to packages/session/session-persistence/src/index.ts diff --git a/packages/session-persistence/session-persistence/src/invariant.ts b/packages/session/session-persistence/src/invariant.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/invariant.ts rename to packages/session/session-persistence/src/invariant.ts diff --git a/packages/session-persistence/session-persistence/src/preparations.ts b/packages/session/session-persistence/src/preparations.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/preparations.ts rename to packages/session/session-persistence/src/preparations.ts diff --git a/packages/session-persistence/session-persistence/src/revision.ts b/packages/session/session-persistence/src/revision.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/revision.ts rename to packages/session/session-persistence/src/revision.ts diff --git a/packages/session-persistence/session-persistence/src/write-behind.ts b/packages/session/session-persistence/src/write-behind.ts similarity index 100% rename from packages/session-persistence/session-persistence/src/write-behind.ts rename to packages/session/session-persistence/src/write-behind.ts diff --git a/packages/session-persistence/session-persistence/tests/contract.ts b/packages/session/session-persistence/tests/contract.ts similarity index 100% rename from packages/session-persistence/session-persistence/tests/contract.ts rename to packages/session/session-persistence/tests/contract.ts diff --git a/packages/session-persistence/session-persistence/tests/coordinator-contract.ts b/packages/session/session-persistence/tests/coordinator-contract.ts similarity index 100% rename from packages/session-persistence/session-persistence/tests/coordinator-contract.ts rename to packages/session/session-persistence/tests/coordinator-contract.ts diff --git a/packages/session-persistence/session-persistence/tests/persistence.spec.ts b/packages/session/session-persistence/tests/persistence.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence/tests/persistence.spec.ts rename to packages/session/session-persistence/tests/persistence.spec.ts diff --git a/packages/session-persistence/session-persistence/tests/preparations.spec.ts b/packages/session/session-persistence/tests/preparations.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence/tests/preparations.spec.ts rename to packages/session/session-persistence/tests/preparations.spec.ts diff --git a/packages/session-persistence/session-persistence/tests/write-behind.spec.ts b/packages/session/session-persistence/tests/write-behind.spec.ts similarity index 100% rename from packages/session-persistence/session-persistence/tests/write-behind.spec.ts rename to packages/session/session-persistence/tests/write-behind.spec.ts diff --git a/packages/session-persistence/session-persistence/tsconfig.json b/packages/session/session-persistence/tsconfig.json similarity index 100% rename from packages/session-persistence/session-persistence/tsconfig.json rename to packages/session/session-persistence/tsconfig.json diff --git a/packages/session-projection/session-projection-cache/README.i18n.yaml b/packages/session/session-projection-cache/README.i18n.yaml similarity index 100% rename from packages/session-projection/session-projection-cache/README.i18n.yaml rename to packages/session/session-projection-cache/README.i18n.yaml diff --git a/packages/session-projection/session-projection-cache/README.md b/packages/session/session-projection-cache/README.md similarity index 100% rename from packages/session-projection/session-projection-cache/README.md rename to packages/session/session-projection-cache/README.md diff --git a/packages/session-projection/session-projection-cache/README.zh.md b/packages/session/session-projection-cache/README.zh.md similarity index 100% rename from packages/session-projection/session-projection-cache/README.zh.md rename to packages/session/session-projection-cache/README.zh.md diff --git a/packages/session-projection/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json similarity index 100% rename from packages/session-projection/session-projection-cache/package.json rename to packages/session/session-projection-cache/package.json diff --git a/packages/session-projection/session-projection-cache/src/index.ts b/packages/session/session-projection-cache/src/index.ts similarity index 100% rename from packages/session-projection/session-projection-cache/src/index.ts rename to packages/session/session-projection-cache/src/index.ts diff --git a/packages/session-projection/session-projection-cache/src/invariant.ts b/packages/session/session-projection-cache/src/invariant.ts similarity index 100% rename from packages/session-projection/session-projection-cache/src/invariant.ts rename to packages/session/session-projection-cache/src/invariant.ts diff --git a/packages/session-projection/session-projection-cache/src/spec.ts b/packages/session/session-projection-cache/src/spec.ts similarity index 100% rename from packages/session-projection/session-projection-cache/src/spec.ts rename to packages/session/session-projection-cache/src/spec.ts diff --git a/packages/session-projection/session-projection-cache/tests/cache.spec.ts b/packages/session/session-projection-cache/tests/cache.spec.ts similarity index 100% rename from packages/session-projection/session-projection-cache/tests/cache.spec.ts rename to packages/session/session-projection-cache/tests/cache.spec.ts diff --git a/packages/session-projection/session-projection-cache/tsconfig.json b/packages/session/session-projection-cache/tsconfig.json similarity index 90% rename from packages/session-projection/session-projection-cache/tsconfig.json rename to packages/session/session-projection-cache/tsconfig.json index baba6c805b..cf253dbe79 100644 --- a/packages/session-projection/session-projection-cache/tsconfig.json +++ b/packages/session/session-projection-cache/tsconfig.json @@ -21,7 +21,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../session-persistence" }, { "path": "../session-projection" diff --git a/packages/session-projection/session-projection/README.i18n.yaml b/packages/session/session-projection/README.i18n.yaml similarity index 100% rename from packages/session-projection/session-projection/README.i18n.yaml rename to packages/session/session-projection/README.i18n.yaml diff --git a/packages/session-projection/session-projection/README.md b/packages/session/session-projection/README.md similarity index 100% rename from packages/session-projection/session-projection/README.md rename to packages/session/session-projection/README.md diff --git a/packages/session-projection/session-projection/README.zh.md b/packages/session/session-projection/README.zh.md similarity index 100% rename from packages/session-projection/session-projection/README.zh.md rename to packages/session/session-projection/README.zh.md diff --git a/packages/session-projection/session-projection/package.json b/packages/session/session-projection/package.json similarity index 100% rename from packages/session-projection/session-projection/package.json rename to packages/session/session-projection/package.json diff --git a/packages/session-projection/session-projection/src/index.ts b/packages/session/session-projection/src/index.ts similarity index 100% rename from packages/session-projection/session-projection/src/index.ts rename to packages/session/session-projection/src/index.ts diff --git a/packages/session-projection/session-projection/src/invariant.ts b/packages/session/session-projection/src/invariant.ts similarity index 100% rename from packages/session-projection/session-projection/src/invariant.ts rename to packages/session/session-projection/src/invariant.ts diff --git a/packages/session-projection/session-projection/src/types.ts b/packages/session/session-projection/src/types.ts similarity index 100% rename from packages/session-projection/session-projection/src/types.ts rename to packages/session/session-projection/src/types.ts diff --git a/packages/session-projection/session-projection/tests/registry.spec.ts b/packages/session/session-projection/tests/registry.spec.ts similarity index 100% rename from packages/session-projection/session-projection/tests/registry.spec.ts rename to packages/session/session-projection/tests/registry.spec.ts diff --git a/packages/session-projection/session-projection/tsconfig.json b/packages/session/session-projection/tsconfig.json similarity index 100% rename from packages/session-projection/session-projection/tsconfig.json rename to packages/session/session-projection/tsconfig.json diff --git a/packages/telemetry/session-telemetry-otel/README.i18n.yaml b/packages/session/session-telemetry-otel/README.i18n.yaml similarity index 100% rename from packages/telemetry/session-telemetry-otel/README.i18n.yaml rename to packages/session/session-telemetry-otel/README.i18n.yaml diff --git a/packages/telemetry/session-telemetry-otel/README.md b/packages/session/session-telemetry-otel/README.md similarity index 100% rename from packages/telemetry/session-telemetry-otel/README.md rename to packages/session/session-telemetry-otel/README.md diff --git a/packages/telemetry/session-telemetry-otel/README.zh.md b/packages/session/session-telemetry-otel/README.zh.md similarity index 100% rename from packages/telemetry/session-telemetry-otel/README.zh.md rename to packages/session/session-telemetry-otel/README.zh.md diff --git a/packages/telemetry/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json similarity index 100% rename from packages/telemetry/session-telemetry-otel/package.json rename to packages/session/session-telemetry-otel/package.json diff --git a/packages/telemetry/session-telemetry-otel/src/index.ts b/packages/session/session-telemetry-otel/src/index.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/src/index.ts rename to packages/session/session-telemetry-otel/src/index.ts diff --git a/packages/telemetry/session-telemetry-otel/src/invariant.ts b/packages/session/session-telemetry-otel/src/invariant.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/src/invariant.ts rename to packages/session/session-telemetry-otel/src/invariant.ts diff --git a/packages/telemetry/session-telemetry-otel/src/user-id.ts b/packages/session/session-telemetry-otel/src/user-id.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/src/user-id.ts rename to packages/session/session-telemetry-otel/src/user-id.ts diff --git a/packages/telemetry/session-telemetry-otel/tests/loader-composition.e2e.ts b/packages/session/session-telemetry-otel/tests/loader-composition.e2e.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/tests/loader-composition.e2e.ts rename to packages/session/session-telemetry-otel/tests/loader-composition.e2e.ts diff --git a/packages/telemetry/session-telemetry-otel/tests/otel.spec.ts b/packages/session/session-telemetry-otel/tests/otel.spec.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/tests/otel.spec.ts rename to packages/session/session-telemetry-otel/tests/otel.spec.ts diff --git a/packages/telemetry/session-telemetry-otel/tests/user-id.spec.ts b/packages/session/session-telemetry-otel/tests/user-id.spec.ts similarity index 100% rename from packages/telemetry/session-telemetry-otel/tests/user-id.spec.ts rename to packages/session/session-telemetry-otel/tests/user-id.spec.ts diff --git a/packages/telemetry/session-telemetry-otel/tsconfig.json b/packages/session/session-telemetry-otel/tsconfig.json similarity index 100% rename from packages/telemetry/session-telemetry-otel/tsconfig.json rename to packages/session/session-telemetry-otel/tsconfig.json diff --git a/packages/telemetry/session-telemetry/README.i18n.yaml b/packages/session/session-telemetry/README.i18n.yaml similarity index 100% rename from packages/telemetry/session-telemetry/README.i18n.yaml rename to packages/session/session-telemetry/README.i18n.yaml diff --git a/packages/telemetry/session-telemetry/README.md b/packages/session/session-telemetry/README.md similarity index 100% rename from packages/telemetry/session-telemetry/README.md rename to packages/session/session-telemetry/README.md diff --git a/packages/telemetry/session-telemetry/README.zh.md b/packages/session/session-telemetry/README.zh.md similarity index 100% rename from packages/telemetry/session-telemetry/README.zh.md rename to packages/session/session-telemetry/README.zh.md diff --git a/packages/telemetry/session-telemetry/package.json b/packages/session/session-telemetry/package.json similarity index 100% rename from packages/telemetry/session-telemetry/package.json rename to packages/session/session-telemetry/package.json diff --git a/packages/telemetry/session-telemetry/src/coordinator.ts b/packages/session/session-telemetry/src/coordinator.ts similarity index 100% rename from packages/telemetry/session-telemetry/src/coordinator.ts rename to packages/session/session-telemetry/src/coordinator.ts diff --git a/packages/telemetry/session-telemetry/src/index.ts b/packages/session/session-telemetry/src/index.ts similarity index 100% rename from packages/telemetry/session-telemetry/src/index.ts rename to packages/session/session-telemetry/src/index.ts diff --git a/packages/telemetry/session-telemetry/src/invariant.ts b/packages/session/session-telemetry/src/invariant.ts similarity index 100% rename from packages/telemetry/session-telemetry/src/invariant.ts rename to packages/session/session-telemetry/src/invariant.ts diff --git a/packages/telemetry/session-telemetry/tests/redact.spec.ts b/packages/session/session-telemetry/tests/redact.spec.ts similarity index 100% rename from packages/telemetry/session-telemetry/tests/redact.spec.ts rename to packages/session/session-telemetry/tests/redact.spec.ts diff --git a/packages/telemetry/session-telemetry/tests/telemetry.spec.ts b/packages/session/session-telemetry/tests/telemetry.spec.ts similarity index 100% rename from packages/telemetry/session-telemetry/tests/telemetry.spec.ts rename to packages/session/session-telemetry/tests/telemetry.spec.ts diff --git a/packages/telemetry/session-telemetry/tsconfig.json b/packages/session/session-telemetry/tsconfig.json similarity index 100% rename from packages/telemetry/session-telemetry/tsconfig.json rename to packages/session/session-telemetry/tsconfig.json diff --git a/packages/session-title/session-title-all-messages-llm/README.i18n.yaml b/packages/session/session-title-all-messages-llm/README.i18n.yaml similarity index 100% rename from packages/session-title/session-title-all-messages-llm/README.i18n.yaml rename to packages/session/session-title-all-messages-llm/README.i18n.yaml diff --git a/packages/session-title/session-title-all-messages-llm/README.md b/packages/session/session-title-all-messages-llm/README.md similarity index 100% rename from packages/session-title/session-title-all-messages-llm/README.md rename to packages/session/session-title-all-messages-llm/README.md diff --git a/packages/session-title/session-title-all-messages-llm/README.zh.md b/packages/session/session-title-all-messages-llm/README.zh.md similarity index 100% rename from packages/session-title/session-title-all-messages-llm/README.zh.md rename to packages/session/session-title-all-messages-llm/README.zh.md diff --git a/packages/session-title/session-title-all-messages-llm/package.json b/packages/session/session-title-all-messages-llm/package.json similarity index 100% rename from packages/session-title/session-title-all-messages-llm/package.json rename to packages/session/session-title-all-messages-llm/package.json diff --git a/packages/session-title/session-title-all-messages-llm/src/index.ts b/packages/session/session-title-all-messages-llm/src/index.ts similarity index 100% rename from packages/session-title/session-title-all-messages-llm/src/index.ts rename to packages/session/session-title-all-messages-llm/src/index.ts diff --git a/packages/session-title/session-title-all-messages-llm/src/invariant.ts b/packages/session/session-title-all-messages-llm/src/invariant.ts similarity index 100% rename from packages/session-title/session-title-all-messages-llm/src/invariant.ts rename to packages/session/session-title-all-messages-llm/src/invariant.ts diff --git a/packages/session-title/session-title-all-messages-llm/tests/provider.spec.ts b/packages/session/session-title-all-messages-llm/tests/provider.spec.ts similarity index 100% rename from packages/session-title/session-title-all-messages-llm/tests/provider.spec.ts rename to packages/session/session-title-all-messages-llm/tests/provider.spec.ts diff --git a/packages/session-title/session-title-all-messages-llm/tsconfig.json b/packages/session/session-title-all-messages-llm/tsconfig.json similarity index 100% rename from packages/session-title/session-title-all-messages-llm/tsconfig.json rename to packages/session/session-title-all-messages-llm/tsconfig.json diff --git a/packages/session-title/session-title-first-message-llm/README.i18n.yaml b/packages/session/session-title-first-message-llm/README.i18n.yaml similarity index 100% rename from packages/session-title/session-title-first-message-llm/README.i18n.yaml rename to packages/session/session-title-first-message-llm/README.i18n.yaml diff --git a/packages/session-title/session-title-first-message-llm/README.md b/packages/session/session-title-first-message-llm/README.md similarity index 100% rename from packages/session-title/session-title-first-message-llm/README.md rename to packages/session/session-title-first-message-llm/README.md diff --git a/packages/session-title/session-title-first-message-llm/README.zh.md b/packages/session/session-title-first-message-llm/README.zh.md similarity index 100% rename from packages/session-title/session-title-first-message-llm/README.zh.md rename to packages/session/session-title-first-message-llm/README.zh.md diff --git a/packages/session-title/session-title-first-message-llm/package.json b/packages/session/session-title-first-message-llm/package.json similarity index 100% rename from packages/session-title/session-title-first-message-llm/package.json rename to packages/session/session-title-first-message-llm/package.json diff --git a/packages/session-title/session-title-first-message-llm/src/index.ts b/packages/session/session-title-first-message-llm/src/index.ts similarity index 100% rename from packages/session-title/session-title-first-message-llm/src/index.ts rename to packages/session/session-title-first-message-llm/src/index.ts diff --git a/packages/session-title/session-title-first-message-llm/src/invariant.ts b/packages/session/session-title-first-message-llm/src/invariant.ts similarity index 100% rename from packages/session-title/session-title-first-message-llm/src/invariant.ts rename to packages/session/session-title-first-message-llm/src/invariant.ts diff --git a/packages/session-title/session-title-first-message-llm/tests/loader-composition.spec.ts b/packages/session/session-title-first-message-llm/tests/loader-composition.spec.ts similarity index 100% rename from packages/session-title/session-title-first-message-llm/tests/loader-composition.spec.ts rename to packages/session/session-title-first-message-llm/tests/loader-composition.spec.ts diff --git a/packages/session-title/session-title-first-message-llm/tests/provider.e2e.ts b/packages/session/session-title-first-message-llm/tests/provider.e2e.ts similarity index 100% rename from packages/session-title/session-title-first-message-llm/tests/provider.e2e.ts rename to packages/session/session-title-first-message-llm/tests/provider.e2e.ts diff --git a/packages/session-title/session-title-first-message-llm/tests/provider.spec.ts b/packages/session/session-title-first-message-llm/tests/provider.spec.ts similarity index 100% rename from packages/session-title/session-title-first-message-llm/tests/provider.spec.ts rename to packages/session/session-title-first-message-llm/tests/provider.spec.ts diff --git a/packages/session-title/session-title-first-message-llm/tsconfig.json b/packages/session/session-title-first-message-llm/tsconfig.json similarity index 100% rename from packages/session-title/session-title-first-message-llm/tsconfig.json rename to packages/session/session-title-first-message-llm/tsconfig.json diff --git a/packages/session-title/session-title-llm/README.i18n.yaml b/packages/session/session-title-llm/README.i18n.yaml similarity index 100% rename from packages/session-title/session-title-llm/README.i18n.yaml rename to packages/session/session-title-llm/README.i18n.yaml diff --git a/packages/session-title/session-title-llm/README.md b/packages/session/session-title-llm/README.md similarity index 100% rename from packages/session-title/session-title-llm/README.md rename to packages/session/session-title-llm/README.md diff --git a/packages/session-title/session-title-llm/README.zh.md b/packages/session/session-title-llm/README.zh.md similarity index 100% rename from packages/session-title/session-title-llm/README.zh.md rename to packages/session/session-title-llm/README.zh.md diff --git a/packages/session-title/session-title-llm/package.json b/packages/session/session-title-llm/package.json similarity index 100% rename from packages/session-title/session-title-llm/package.json rename to packages/session/session-title-llm/package.json diff --git a/packages/session-title/session-title-llm/src/index.ts b/packages/session/session-title-llm/src/index.ts similarity index 100% rename from packages/session-title/session-title-llm/src/index.ts rename to packages/session/session-title-llm/src/index.ts diff --git a/packages/session-title/session-title-llm/src/invariant.ts b/packages/session/session-title-llm/src/invariant.ts similarity index 100% rename from packages/session-title/session-title-llm/src/invariant.ts rename to packages/session/session-title-llm/src/invariant.ts diff --git a/packages/session-title/session-title-llm/tests/llm.spec.ts b/packages/session/session-title-llm/tests/llm.spec.ts similarity index 100% rename from packages/session-title/session-title-llm/tests/llm.spec.ts rename to packages/session/session-title-llm/tests/llm.spec.ts diff --git a/packages/session-title/session-title-llm/tsconfig.json b/packages/session/session-title-llm/tsconfig.json similarity index 100% rename from packages/session-title/session-title-llm/tsconfig.json rename to packages/session/session-title-llm/tsconfig.json diff --git a/packages/session-title/session-title/README.i18n.yaml b/packages/session/session-title/README.i18n.yaml similarity index 100% rename from packages/session-title/session-title/README.i18n.yaml rename to packages/session/session-title/README.i18n.yaml diff --git a/packages/session-title/session-title/README.md b/packages/session/session-title/README.md similarity index 100% rename from packages/session-title/session-title/README.md rename to packages/session/session-title/README.md diff --git a/packages/session-title/session-title/README.zh.md b/packages/session/session-title/README.zh.md similarity index 100% rename from packages/session-title/session-title/README.zh.md rename to packages/session/session-title/README.zh.md diff --git a/packages/session-title/session-title/package.json b/packages/session/session-title/package.json similarity index 100% rename from packages/session-title/session-title/package.json rename to packages/session/session-title/package.json diff --git a/packages/session-title/session-title/src/client.ts b/packages/session/session-title/src/client.ts similarity index 100% rename from packages/session-title/session-title/src/client.ts rename to packages/session/session-title/src/client.ts diff --git a/packages/session-title/session-title/src/index.ts b/packages/session/session-title/src/index.ts similarity index 100% rename from packages/session-title/session-title/src/index.ts rename to packages/session/session-title/src/index.ts diff --git a/packages/session-title/session-title/src/invariant.ts b/packages/session/session-title/src/invariant.ts similarity index 100% rename from packages/session-title/session-title/src/invariant.ts rename to packages/session/session-title/src/invariant.ts diff --git a/packages/session-title/session-title/src/normalize.ts b/packages/session/session-title/src/normalize.ts similarity index 100% rename from packages/session-title/session-title/src/normalize.ts rename to packages/session/session-title/src/normalize.ts diff --git a/packages/session-title/session-title/src/types.ts b/packages/session/session-title/src/types.ts similarity index 100% rename from packages/session-title/session-title/src/types.ts rename to packages/session/session-title/src/types.ts diff --git a/packages/session-title/session-title/tests/invariant.spec.ts b/packages/session/session-title/tests/invariant.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/invariant.spec.ts rename to packages/session/session-title/tests/invariant.spec.ts diff --git a/packages/session-title/session-title/tests/persistence.spec.ts b/packages/session/session-title/tests/persistence.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/persistence.spec.ts rename to packages/session/session-title/tests/persistence.spec.ts diff --git a/packages/session-title/session-title/tests/projection.spec.ts b/packages/session/session-title/tests/projection.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/projection.spec.ts rename to packages/session/session-title/tests/projection.spec.ts diff --git a/packages/session-title/session-title/tests/provider.spec.ts b/packages/session/session-title/tests/provider.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/provider.spec.ts rename to packages/session/session-title/tests/provider.spec.ts diff --git a/packages/session-title/session-title/tests/rename.spec.ts b/packages/session/session-title/tests/rename.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/rename.spec.ts rename to packages/session/session-title/tests/rename.spec.ts diff --git a/packages/session-title/session-title/tests/service-contracts.spec.ts b/packages/session/session-title/tests/service-contracts.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/service-contracts.spec.ts rename to packages/session/session-title/tests/service-contracts.spec.ts diff --git a/packages/session-title/session-title/tests/session-title.spec.ts b/packages/session/session-title/tests/session-title.spec.ts similarity index 100% rename from packages/session-title/session-title/tests/session-title.spec.ts rename to packages/session/session-title/tests/session-title.spec.ts diff --git a/packages/session-title/session-title/tsconfig.json b/packages/session/session-title/tsconfig.json similarity index 90% rename from packages/session-title/session-title/tsconfig.json rename to packages/session/session-title/tsconfig.json index 80aef8bbfb..ca7c8e65dd 100644 --- a/packages/session-title/session-title/tsconfig.json +++ b/packages/session/session-title/tsconfig.json @@ -30,7 +30,7 @@ "path": "../../core/session" }, { - "path": "../../session-projection/session-projection" + "path": "../session-projection" } ] } diff --git a/packages/subagent/subagent/tsconfig.json b/packages/subagent/subagent/tsconfig.json index de2fff3d84..ccfecc02e4 100644 --- a/packages/subagent/subagent/tsconfig.json +++ b/packages/subagent/subagent/tsconfig.json @@ -27,7 +27,7 @@ "path": "../../core/scope" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../session-projection/session-projection" diff --git a/packages/telemetry/README.i18n.yaml b/packages/telemetry/README.i18n.yaml deleted file mode 100644 index 6f60d47612..0000000000 --- a/packages/telemetry/README.i18n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each -# side as of the last confirmed-consistent state. Both languages carry equal authority; -# after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write packages/telemetry/README.md -README.md: d1910323176738d1ecab8fe8e6c07a2811f0f5cd -README.zh.md: 229cd3acc5ce3dc49a9c862efa824f4ee6a1fa7b diff --git a/packages/telemetry/README.md b/packages/telemetry/README.md deleted file mode 100644 index d191032317..0000000000 --- a/packages/telemetry/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# telemetry/ — session telemetry capability family - -English | [中文](README.zh.md) - -This family projects session activity into outbound telemetry and delegates delivery to a configured reporting backend. The [telemetry decision](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md) records the reporting boundary; the [mode decision](../../.agents/notes/implemented/feature/2026-08-05-feedback-gated-session-telemetry.md) records immediate, feedback-gated, and disabled delivery. - -| Package | Role | -|---|---| -| [`session-telemetry/`](session-telemetry/README.md) | Defines capture, redaction, projection, and live or on-demand backend delivery. | -| [`session-telemetry-otel/`](session-telemetry-otel/README.md) | Delivers telemetry through OpenTelemetry logs in `FULL`, `FEEDBACK_ONLY`, or `DISABLED` mode. | diff --git a/packages/telemetry/README.zh.md b/packages/telemetry/README.zh.md deleted file mode 100644 index 229cd3acc5..0000000000 --- a/packages/telemetry/README.zh.md +++ /dev/null @@ -1,10 +0,0 @@ -# telemetry/:会话遥测能力家族 - -[English](README.md) | 中文 - -本家族将会话活动投影为外发遥测,并将投递委派给配置的上报后端。[遥测决策](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)记录上报边界;[模式决策](../../.agents/notes/implemented/feature/2026-08-05-feedback-gated-session-telemetry.md)记录即时、反馈门控与禁用投递。 - -| 包 | 职责 | -|---|---| -| [`session-telemetry/`](session-telemetry/README.md) | 定义捕获、脱敏、投影,以及实时或按需后端投递。 | -| [`session-telemetry-otel/`](session-telemetry-otel/README.md) | 通过 OpenTelemetry 日志以 `FULL`、`FEEDBACK_ONLY` 或 `DISABLED` 模式投递遥测。 | diff --git a/packages/todo/tool-todo/README.i18n.yaml b/packages/todo/tool-todo/README.i18n.yaml index 20b8dffbbf..6aa521df26 100644 --- a/packages/todo/tool-todo/README.i18n.yaml +++ b/packages/todo/tool-todo/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/todo/tool-todo/README.md -README.md: 914e89a000e4bb87ebd7844f05db3809c6726528 -README.zh.md: c88dbf976fa5110028fcc964ab9aa8efcc3244d3 +README.md: 7c993ac6f7f0047d008a09e5ff52cb752f94763c +README.zh.md: 9cea66147beddab7d62ed7344cbe866495e28022 diff --git a/packages/todo/tool-todo/README.md b/packages/todo/tool-todo/README.md index 914e89a000..7c993ac6f7 100644 --- a/packages/todo/tool-todo/README.md +++ b/packages/todo/tool-todo/README.md @@ -30,7 +30,7 @@ The canonical result is `{ todos, counts: { pending, inProgress, completed } }`; ## Session projection -When the composition mounts `ctx.sessionProjections` ([`@deepseek-ai/dsh-session-projection`](../../session-projection/session-projection/README.md)), this package registers the `todos` projection unit under an injected child: `init` = `null` (no write yet), `apply` = take the whole list from each `todo/write` and clear to `null` on each `turn/start` (standing plan; `turn/end` keeps the finished checklist; every other event returns the same state reference), `view` = identity, `stateVersion` = 2. The key merges into `SessionProjectionMap` here (via the interface package's `/types` outlet); the framework drives the unit and carriers serve the value on the history tail page and the `session/projection` push frame. Compositions without the registry are unaffected. Lifetime rationale: [todo plan clears on next turn](../../../.agents/notes/implemented/feature/2026-07-28-todo-plan-clears-on-next-turn.md). +When the composition mounts `ctx.sessionProjections` ([`@deepseek-ai/dsh-session-projection`](../../session/session-projection/README.md)), this package registers the `todos` projection unit under an injected child: `init` = `null` (no write yet), `apply` = take the whole list from each `todo/write` and clear to `null` on each `turn/start` (standing plan; `turn/end` keeps the finished checklist; every other event returns the same state reference), `view` = identity, `stateVersion` = 2. The key merges into `SessionProjectionMap` here (via the interface package's `/types` outlet); the framework drives the unit and carriers serve the value on the history tail page and the `session/projection` push frame. Compositions without the registry are unaffected. Lifetime rationale: [todo plan clears on next turn](../../../.agents/notes/implemented/feature/2026-07-28-todo-plan-clears-on-next-turn.md). ## Export shape diff --git a/packages/todo/tool-todo/README.zh.md b/packages/todo/tool-todo/README.zh.md index c88dbf976f..9cea66147b 100644 --- a/packages/todo/tool-todo/README.zh.md +++ b/packages/todo/tool-todo/README.zh.md @@ -30,7 +30,7 @@ ## 会话投影 -当组合挂载了 `ctx.sessionProjections`([`@deepseek-ai/dsh-session-projection`](../../session-projection/session-projection/README.md))时,本包在一个注入的子插件中注册 `todos` 投影单元:`init` = `null`(尚无写入)、`apply` = 从每个 `todo/write` 取整表,并在每个 `turn/start` 清为 `null`(当前有效计划;`turn/end` 保留刚完成的清单;其余事件都返回同一个状态引用)、`view` = 恒等、`stateVersion` = 2。该键在本包中合并进 `SessionProjectionMap`(经接口包的 `/types` 出口);框架驱动该单元,载体通过历史尾页与 `session/projection` 推送帧提供该值。未挂载注册表的组合不受影响。生命周期理由见 [在下一轮次清空 todo 计划](../../../.agents/notes/implemented/feature/2026-07-28-todo-plan-clears-on-next-turn.md)。 +当组合挂载了 `ctx.sessionProjections`([`@deepseek-ai/dsh-session-projection`](../../session/session-projection/README.md))时,本包在一个注入的子插件中注册 `todos` 投影单元:`init` = `null`(尚无写入)、`apply` = 从每个 `todo/write` 取整表,并在每个 `turn/start` 清为 `null`(当前有效计划;`turn/end` 保留刚完成的清单;其余事件都返回同一个状态引用)、`view` = 恒等、`stateVersion` = 2。该键在本包中合并进 `SessionProjectionMap`(经接口包的 `/types` 出口);框架驱动该单元,载体通过历史尾页与 `session/projection` 推送帧提供该值。未挂载注册表的组合不受影响。生命周期理由见 [在下一轮次清空 todo 计划](../../../.agents/notes/implemented/feature/2026-07-28-todo-plan-clears-on-next-turn.md)。 ## 导出形状 diff --git a/packages/todo/tool-todo/tsconfig.json b/packages/todo/tool-todo/tsconfig.json index b35157e58d..6160fdbeb7 100644 --- a/packages/todo/tool-todo/tsconfig.json +++ b/packages/todo/tool-todo/tsconfig.json @@ -24,7 +24,7 @@ "path": "../../core/session" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../support/invariants" diff --git a/packages/ui/jsonrpc/tests/built-scope-carrier.e2e.ts b/packages/ui/jsonrpc/tests/built-scope-carrier.e2e.ts index 051b0eef20..1de16660a8 100644 --- a/packages/ui/jsonrpc/tests/built-scope-carrier.e2e.ts +++ b/packages/ui/jsonrpc/tests/built-scope-carrier.e2e.ts @@ -35,7 +35,7 @@ const [ load("vendor/cordis/lib/index.js"), load("packages/examples/agent-spine-demo/lib/index.js"), load("packages/subagent/subagent/lib/index.js"), - load("packages/session-persistence/session-persistence-jsonl/lib/index.js"), + load("packages/session/session-persistence-jsonl/lib/index.js"), load("packages/ui/jsonrpc/lib/index.js"), load("packages/core/session/lib/index.js"), ]); diff --git a/packages/ui/permission/tsconfig.json b/packages/ui/permission/tsconfig.json index 9dc4afcd9a..b951d622a8 100644 --- a/packages/ui/permission/tsconfig.json +++ b/packages/ui/permission/tsconfig.json @@ -36,7 +36,7 @@ "path": "../../support/invariants" }, { - "path": "../../session-projection/session-projection" + "path": "../../session/session-projection" }, { "path": "../../settings/settings" diff --git a/packages/workspace/workspace/tsconfig.json b/packages/workspace/workspace/tsconfig.json index 0bddf4672c..bbdf80fae2 100644 --- a/packages/workspace/workspace/tsconfig.json +++ b/packages/workspace/workspace/tsconfig.json @@ -27,7 +27,7 @@ "path": "../../core/session" }, { - "path": "../../session-persistence/session-persistence" + "path": "../../session/session-persistence" }, { "path": "../../util/brand" diff --git a/scripts/gen-cordis-catalog.ts b/scripts/gen-cordis-catalog.ts index b17cc5b4f8..2c347613e8 100644 --- a/scripts/gen-cordis-catalog.ts +++ b/scripts/gen-cordis-catalog.ts @@ -270,11 +270,11 @@ export const TYPE_LINK_EXEMPTIONS: Readonly> = { DomainSpec: 'domain declaration contract is owned by packages/storage/storage-domain/README.md', StorageBackend: 'backend contract is owned by packages/storage/storage/src/backend.ts', StorageForms: 'merge-extensible form map is owned by packages/storage/storage/src/index.ts', - ProjectionDefinition: 'projection unit contract is owned by packages/session-projection/session-projection/README.md', - SessionProjectionMap: 'merge-extensible projection key map is owned by packages/session-projection/session-projection/src/types.ts', - ProjectionChangeListener: 'change-feed listener contract is owned by packages/session-projection/session-projection/src/index.ts', - ProjectionSnapshot: 'watermark snapshot shape is owned by packages/session-projection/session-projection/src/index.ts', - ProjectionCheckpoint: 'persisted checkpoint row map is owned by packages/session-projection/session-projection/src/index.ts', + ProjectionDefinition: 'projection unit contract is owned by packages/session/session-projection/README.md', + SessionProjectionMap: 'merge-extensible projection key map is owned by packages/session/session-projection/src/types.ts', + ProjectionChangeListener: 'change-feed listener contract is owned by packages/session/session-projection/src/index.ts', + ProjectionSnapshot: 'watermark snapshot shape is owned by packages/session/session-projection/src/index.ts', + ProjectionCheckpoint: 'persisted checkpoint row map is owned by packages/session/session-projection/src/index.ts', CommandExecution: 'executor return contract is owned by packages/ui/commands/src/index.ts', TypertContribution: 'registry contribution contract is owned by packages/typert/registry/README.md', TypertFace: 'registry face identity is owned by packages/typert/registry/README.md', @@ -305,7 +305,7 @@ export const TYPE_LINK_EXEMPTIONS: Readonly> = { SessionForkSource: 'service-local fork input is owned by packages/core/session/src/index.ts', SubagentRunEndInfo: 'event payload contract is owned by packages/subagent/subagent/src/types.ts', SubagentRunInfo: 'event payload contract is owned by packages/subagent/subagent/src/types.ts', - TelemetryRecord: 'seam-local record contract is owned by packages/telemetry/session-telemetry/src/index.ts', + TelemetryRecord: 'seam-local record contract is owned by packages/session/session-telemetry/src/index.ts', WorkflowAgentEndInfo: 'event-local snapshot is owned by packages/workflow/workflow/src/index.ts', WorkflowAgentInfo: 'event-local snapshot is owned by packages/workflow/workflow/src/index.ts', WorkflowResultInfo: 'event-local snapshot is owned by packages/workflow/workflow/src/index.ts', diff --git a/scripts/run-gates.ts b/scripts/run-gates.ts index 74a09a874e..258b70f87d 100644 --- a/scripts/run-gates.ts +++ b/scripts/run-gates.ts @@ -312,7 +312,7 @@ function nodeCompatSmokeGates(options: { cliSmoke?: boolean } = {}): Gate[] { pnpmExec('jsonl-zstd-smoke', [ 'vitest', 'run', - 'packages/session-persistence/session-persistence-jsonl/tests/zstd.compat.spec.ts', + 'packages/session/session-persistence-jsonl/tests/zstd.compat.spec.ts', ], { label: 'JSONL Zstandard smoke' }), pnpmExec('dsh-source-launch-smoke', [ 'vitest', diff --git a/scripts/type-equiv.manifest.json b/scripts/type-equiv.manifest.json index 9c99ed4632..e4eaf15398 100644 --- a/scripts/type-equiv.manifest.json +++ b/scripts/type-equiv.manifest.json @@ -448,7 +448,7 @@ { "doc": "docs/core-data-structures/persistence.md", "symbol": "SessionLocation", - "source": "packages/session-persistence/session-persistence/src/index.ts" + "source": "packages/session/session-persistence/src/index.ts" }, { "doc": "docs/core-data-structures/session-query.md", @@ -528,57 +528,57 @@ { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleProviderId", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleModelProvenance", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleSource", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleEventData", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleSnapshot", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleLlmRequestEventData", - "source": "packages/session-title/session-title-llm/src/index.ts" + "source": "packages/session/session-title-llm/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleUserMessage", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleAutomaticMode", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleProviderRequest", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleProviderResult", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-title.md", "symbol": "SessionTitleProvider", - "source": "packages/session-title/session-title/src/index.ts" + "source": "packages/session/session-title/src/index.ts" }, { "doc": "docs/core-data-structures/session-reference.md", @@ -1323,12 +1323,12 @@ { "doc": "docs/core-data-structures/persistence.md", "symbol": "SessionPersistenceRevision", - "source": "packages/session-persistence/session-persistence/src/revision.ts" + "source": "packages/session/session-persistence/src/revision.ts" }, { "doc": "docs/core-data-structures/persistence.md", "symbol": "SessionPersistenceSnapshot", - "source": "packages/session-persistence/session-persistence/src/index.ts" + "source": "packages/session/session-persistence/src/index.ts" }, { "doc": "docs/core-data-structures/session-query.md", diff --git a/scripts/verify-package-readme-model-experience.ts b/scripts/verify-package-readme-model-experience.ts index 6fda3901b6..5930d39e26 100644 --- a/scripts/verify-package-readme-model-experience.ts +++ b/scripts/verify-package-readme-model-experience.ts @@ -109,8 +109,8 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly> = { 'packages/sdk/sdk-client': { kind: 'none', reason: 'Client-process library; the model surface lives in the spawned runtime\'s composed plugins.' }, 'packages/sdk/sdk-protocol': { kind: 'none', reason: 'Client-facing wire library; the runtime plugins behind the serving entry own the model surface.' }, 'packages/sdk/telemetry': { kind: 'none', reason: 'The launcher-side reporter sends developer-cycle telemetry and registers no live agent or model surface.' }, - 'packages/session-projection/session-projection': { kind: 'none', reason: 'The projection registry serves client-facing read models of already-logged session state and registers no model surface.' }, - 'packages/session-projection/session-projection-cache': { kind: 'none', reason: 'The persisted cache accelerates host-side cold reads of projection state and registers no model surface.' }, + 'packages/session/session-projection': { kind: 'none', reason: 'The projection registry serves client-facing read models of already-logged session state and registers no model surface.' }, + 'packages/session/session-projection-cache': { kind: 'none', reason: 'The persisted cache accelerates host-side cold reads of projection state and registers no model surface.' }, 'packages/session-query/session-query': { kind: 'none', reason: 'The trusted query service exposes cloned records only to callers and registers no model surface.' }, 'packages/session-query/session-query-sqlite': { kind: 'none', reason: 'The search backend returns hits only to callers and registers no model surface.' }, 'packages/settings/settings': { kind: 'indirect', reason: 'The seam stores and resolves user settings; consumer plugins own any model surface a value feeds.' }, @@ -118,8 +118,8 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly> = { 'packages/credentials/credentials': { kind: 'indirect', reason: 'The seam resolves credential references; the consuming adapter owns every model surface a value authorizes.' }, 'packages/credentials/credentials-local': { kind: 'indirect', reason: 'The file/environment provider stores credential values; consumers of ctx.credentials own any model surface.' }, 'packages/util/atomic-write': { kind: 'none', reason: 'Pure filesystem write primitive; registers no model surface.' }, - 'packages/telemetry/session-telemetry': { kind: 'none', reason: 'The seam observes the session stream and hands redacted copies outward; it registers no model surface.' }, - 'packages/telemetry/session-telemetry-otel': { kind: 'none', reason: 'The backend forwards seam records into the OTel SDK pipeline and registers no model surface.' }, + 'packages/session/session-telemetry': { kind: 'none', reason: 'The seam observes the session stream and hands redacted copies outward; it registers no model surface.' }, + 'packages/session/session-telemetry-otel': { kind: 'none', reason: 'The backend forwards seam records into the OTel SDK pipeline and registers no model surface.' }, 'packages/skill/skill': { kind: 'indirect', reason: 'The provider registry delegates model rendering to dsh-tool-skill.' }, 'packages/skill/skill-badge': { kind: 'indirect', reason: 'The bundled provider delegates model rendering to dsh-tool-skill.' }, 'packages/skill/skill-local': { kind: 'indirect', reason: 'The provider backend delegates model rendering to dsh-tool-skill.' }, diff --git a/tsconfig.base.json b/tsconfig.base.json index 0673c35b90..e09ab93743 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -54,11 +54,11 @@ "@deepseek-ai/dsh-typert-generator": ["./packages/typert/generator/src/index.ts"], "@deepseek-ai/dsh-session/types": ["./packages/core/session/src/types.ts"], "@deepseek-ai/dsh-session/surface": ["./packages/core/session/src/surface.ts"], - "@deepseek-ai/dsh-session-projection/types": ["./packages/session-projection/session-projection/src/types.ts"], + "@deepseek-ai/dsh-session-projection/types": ["./packages/session/session-projection/src/types.ts"], "@deepseek-ai/dsh-tool-todo/types": ["./packages/todo/tool-todo/src/types.ts"], "@deepseek-ai/dsh-tool-todo/client": ["./packages/todo/tool-todo/src/client.ts"], - "@deepseek-ai/dsh-session-title/types": ["./packages/session-title/session-title/src/types.ts"], - "@deepseek-ai/dsh-session-title/client": ["./packages/session-title/session-title/src/client.ts"], + "@deepseek-ai/dsh-session-title/types": ["./packages/session/session-title/src/types.ts"], + "@deepseek-ai/dsh-session-title/client": ["./packages/session/session-title/src/client.ts"], "@deepseek-ai/dsh-plan-mode/types": ["./packages/plan/plan-mode/src/types.ts"], "@deepseek-ai/dsh-plan-mode/client": ["./packages/plan/plan-mode/src/client.ts"], "@deepseek-ai/dsh-pwsh-local": ["./packages/bash/pwsh-local/src/index.ts"], @@ -106,13 +106,10 @@ "./packages/cordis/*/src/invariant.ts", "./packages/sandbox/*/src/invariant.ts", "./packages/hooks/*/src/invariant.ts", - "./packages/session-persistence/*/src/invariant.ts", - "./packages/session-projection/*/src/invariant.ts", - "./packages/session-title/*/src/invariant.ts", + "./packages/session/*/src/invariant.ts", "./packages/session-query/*/src/invariant.ts", "./packages/settings/*/src/invariant.ts", "./packages/credentials/*/src/invariant.ts", - "./packages/telemetry/*/src/invariant.ts", "./packages/acp/*/src/invariant.ts", "./packages/storage/*/src/invariant.ts", "./packages/workspace/*/src/invariant.ts", @@ -211,13 +208,10 @@ "./packages/cordis/*/src", "./packages/sandbox/*/src", "./packages/hooks/*/src", - "./packages/session-persistence/*/src", - "./packages/session-projection/*/src", + "./packages/session/*/src", "./packages/session-query/*/src", - "./packages/session-title/*/src", "./packages/settings/*/src", "./packages/credentials/*/src", - "./packages/telemetry/*/src", "./packages/acp/*/src", "./packages/storage/*/src", "./packages/workspace/*/src", diff --git a/tsconfig.host.json b/tsconfig.host.json index 101c810c91..0f44c4b7de 100644 --- a/tsconfig.host.json +++ b/tsconfig.host.json @@ -112,12 +112,12 @@ { "path": "./packages/api/gateway" }, { "path": "./packages/api/remotes/tsconfig.host.json" }, { "path": "./packages/typert/loader" }, - { "path": "./packages/session-persistence/session-persistence" }, - { "path": "./packages/session-persistence/session-checkpoint-policy" }, - { "path": "./packages/session-persistence/session-persistence-jsonl" }, - { "path": "./packages/session-persistence/session-persistence-sqlite" }, - { "path": "./packages/session-projection/session-projection" }, - { "path": "./packages/session-projection/session-projection-cache" }, + { "path": "./packages/session/session-persistence" }, + { "path": "./packages/session/session-checkpoint-policy" }, + { "path": "./packages/session/session-persistence-jsonl" }, + { "path": "./packages/session/session-persistence-sqlite" }, + { "path": "./packages/session/session-projection" }, + { "path": "./packages/session/session-projection-cache" }, { "path": "./packages/session-query/session-query" }, { "path": "./packages/session-query/session-query-sqlite" }, { "path": "./packages/settings/settings" }, @@ -130,12 +130,12 @@ { "path": "./packages/storage/storage-sqlite" }, { "path": "./packages/storage/storage-domain" }, { "path": "./packages/workspace/workspace" }, - { "path": "./packages/session-title/session-title" }, - { "path": "./packages/session-title/session-title-llm" }, - { "path": "./packages/session-title/session-title-first-message-llm" }, - { "path": "./packages/session-title/session-title-all-messages-llm" }, - { "path": "./packages/telemetry/session-telemetry" }, - { "path": "./packages/telemetry/session-telemetry-otel" }, + { "path": "./packages/session/session-title" }, + { "path": "./packages/session/session-title-llm" }, + { "path": "./packages/session/session-title-first-message-llm" }, + { "path": "./packages/session/session-title-all-messages-llm" }, + { "path": "./packages/session/session-telemetry" }, + { "path": "./packages/session/session-telemetry-otel" }, { "path": "./packages/core/system-prompt" }, { "path": "./packages/core/agent" }, { "path": "./packages/ui/commands" }, diff --git a/vitest.config.ts b/vitest.config.ts index 6eb1bda354..29ad406e75 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -224,7 +224,7 @@ export default defineConfig({ // cover and remove with the client test lane above. 'packages/ui/commands/src/index.ts', 'packages/ui/commands/src/invariant.ts', - 'packages/session-projection/session-projection/src/index.ts', + 'packages/session/session-projection/src/index.ts', ...windowsUnsupportedPackages.map(path => `${path}/src/**/*.ts`), ...windowsCoverageExclusions, ...pwshCoverageExclusions,