# Conflicts: # .agents/notes/archived/architecture/2026-06-18-shared-persistence-write-coordinator.i18n.yaml # .agents/notes/implemented/architecture/2026-06-14-session-persistence.i18n.yaml # .agents/notes/implemented/architecture/2026-06-14-session-persistence.md # .agents/notes/implemented/architecture/2026-06-14-session-persistence.zh.md # .agents/notes/implemented/architecture/2026-07-24-project-session-directories.i18n.yaml # .agents/notes/implemented/architecture/2026-07-24-project-session-directories.md # .agents/notes/implemented/architecture/2026-07-24-project-session-directories.zh.md # .agents/notes/implemented/architecture/2026-08-05-session-preparation.i18n.yaml # .agents/notes/implemented/architecture/2026-08-05-session-preparation.md # .agents/notes/implemented/architecture/2026-08-05-session-preparation.zh.md # .agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.i18n.yaml # .agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.md # .agents/notes/implemented/architecture/2026-08-10-message-feedback-sidecar.zh.md # .agents/notes/implemented/architecture/2026-08-27-handle-based-session-persistence.i18n.yaml # .agents/notes/implemented/bug-fix/2026-07-28-load-pre-identity-session-messages.md # .agents/notes/implemented/bug-fix/2026-07-28-load-pre-identity-session-messages.zh.md # .agents/notes/implemented/bug-fix/2026-08-04-load-pre-react-loop-sessions.md # .agents/notes/implemented/bug-fix/2026-08-04-load-pre-react-loop-sessions.zh.md # .agents/notes/implemented/bug-fix/2026-09-01-host-goal-pause-aborts-turn.i18n.yaml # .agents/notes/implemented/feature/2026-08-10-web-session-log-export.i18n.yaml # .agents/notes/implemented/feature/2026-08-10-web-session-log-export.md # .agents/notes/implemented/feature/2026-08-10-web-session-log-export.zh.md # apps/cli/tests/profiles/headless/tests/session-format-guard.expected.e2e.ts # apps/web/tests/cold-blank-session.e2e.ts # apps/web/tests/message-actions.e2e.ts # apps/web/tests/scaffold.ts # apps/web/tests/workspace-management.e2e.ts # docs/config-catalog.i18n.yaml # docs/config-catalog.md # docs/config-catalog.zh.md # docs/event-producer-consumer.i18n.yaml # docs/event-producer-consumer.md # docs/event-producer-consumer.zh.md # docs/persistence-catalog.i18n.yaml # docs/persistence-catalog.md # docs/subsystems/feedback.i18n.yaml # docs/subsystems/feedback.md # docs/subsystems/feedback.zh.md # docs/subsystems/persistence.i18n.yaml # docs/subsystems/persistence.md # docs/subsystems/persistence.zh.md # packages/acp/acp/src/index.ts # packages/acp/acp/tests/bridge.spec.ts # packages/api/session-controller/src/list.ts # packages/api/session-controller/tests/agent.host.spec.ts # packages/api/session-controller/tests/session-cold.host.spec.ts # packages/api/session-controller/tests/session-projections.host.spec.ts # packages/api/session-controller/tests/session-search.host.spec.ts # packages/api/session-controller/tests/test-remote.ts # packages/api/session-controller/tests/transport.host.spec.ts # packages/core/agent-loop/src/index.ts # packages/core/agent-loop/tests/config-session-id.spec.ts # packages/core/agent-loop/tests/resume.spec.ts # packages/extensions/tool-cordis/src/api-catalog.ts # packages/feedback/message-feedback/src/index.ts # packages/feedback/message-feedback/tests/helpers.ts # packages/feedback/message-feedback/tests/message-feedback.spec.ts # packages/session-query/session-log-export/src/archive.ts # packages/session-query/session-log-export/tests/archive.host.spec.ts # packages/session-query/session-log-export/tests/route.host.spec.ts # packages/session-query/session-query-sqlite/README.i18n.yaml # packages/session-query/session-query-sqlite/README.md # packages/session-query/session-query-sqlite/README.zh.md # packages/session-query/session-query-sqlite/src/index.ts # packages/session-query/session-query-sqlite/tests/sqlite.spec.ts # packages/session-query/session-query/README.i18n.yaml # packages/session-query/session-query/README.md # packages/session-query/session-query/README.zh.md # packages/session-query/session-query/src/corpus.ts # packages/session-query/session-query/tests/observation.spec.ts # packages/session-query/session-query/tests/session-query.spec.ts # packages/session-query/session-query/tests/tracing.spec.ts # packages/session/session-checkpoint-policy/tests/session-checkpoint-policy.spec.ts # packages/session/session-persistence-jsonl/README.i18n.yaml # packages/session/session-persistence-jsonl/README.md # packages/session/session-persistence-jsonl/README.zh.md # packages/session/session-persistence-jsonl/src/index.ts # packages/session/session-persistence-jsonl/tests/jsonl.spec.ts # packages/session/session-persistence-jsonl/tests/zstd.spec.ts # packages/session/session-persistence/README.i18n.yaml # packages/session/session-persistence/README.md # packages/session/session-persistence/README.zh.md # packages/session/session-persistence/src/coordinator.ts # packages/session/session-persistence/src/index.ts # packages/session/session-persistence/tests/contract.ts # packages/session/session-persistence/tests/coordinator-contract.ts # packages/session/session-persistence/tests/persistence.spec.ts # packages/session/session-telemetry/package.json # packages/shell/tool-bash/tests/tools.spec.ts # packages/subagent/subagent/src/continuation.ts # packages/subagent/subagent/tests/list-children.spec.ts # packages/workspace/workspace/src/index.ts # packages/workspace/workspace/tests/workspace.spec.ts # scripts/gen-cordis-catalog.ts
description, kind
| description | kind |
|---|---|
| Web Session-log ZIP export: Host streaming, the authenticated download route, the Session Header action, and the /export command. | package-reference |
@deepseek-ai/dsh-session-log-export
English | 中文
Summary
dsh-session-log-export lets the Web interface download a session's full history: a Session log button in the Session Header and an /export slash command both hand the session tree — the session, its sub-sessions, and attachments — to the browser as a ZIP download. The package owns the Host archive stream, its authenticated Fetch route, and the browser controls and feedback. The browser chooses the download destination. Setup and usage come first; implementation details follow.
Table of Contents
- Use this package
- Understand the implementation
- Further Exploration
- Model Experience
- Known Limitations and Deferred Work
- Dev Note
Use this package
Use this package when the Web bundle should let users export a session log. It requires Connection, the command registry, Session query and persistence, and attachments. Mount the plugin, then click Session log in the Session Header or type /export; the browser downloads dsh-session-<id>.zip.
When to choose it
Choose it for a Web deployment that needs user-facing session export with a visible download dialog. Avoid it when a programmatic or Host-side export is needed: this package produces a browser download, not a Host path write. The logs are serialized from persistence read handles, so any mounted backend is supported.
Composition
- id: session-log-download
name: '@deepseek-ai/dsh-session-log-export'
The Web bundle mounts the package with Connection, dsh-commands, dsh-client-ui-commands, and dsh-client-ui-conversation.
Configuration
| Field | Default | Meaning |
|---|---|---|
compressionLevel |
6 |
DEFLATE level from 0 through 9 for each ZIP entry. |
Command contract
| Input | Result |
|---|---|
/export |
Records a human-command lifecycle; the submitting browser downloads GET /api/session.export?sessionId=<id>&includeDescendants=true |
/export <path> |
An error; browser downloads choose their destination through the browser's ordinary download behavior |
What to expect
The dialog reports three phases: preparing, download started, or failed. Closing the dialog does not cancel an in-flight download, and the dialog does not reopen when that operation later settles. One session admits one active download at a time; repeated gestures share that operation. The export includes the live session's newest events: the host endpoint flushes a live root session before reading, so a slash-triggered ZIP includes the command/run and command/done pair that started the download; cold persisted sessions need no flush.
Failures
The dialog shows a preparation error when the preflight fails before ZIP streaming starts — for example an unreachable or misconfigured host endpoint. A descendant or attachment read failure after the browser accepts the GET is reported by the browser download manager, not by the dialog.
Understand the implementation
Implementation internals — click to expand
This section explains how the package wires the export control and points at the code that realizes it; the observable behavior is fully covered in Use this package.
Design split
The package has two halves. The Host half (src/index.ts) registers the /export command and contributes the exact GET/HEAD /api/session.export Fetch route to Connection; src/archive.ts builds the bounded ZIP stream. The browser half (src/client/index.ts) provides the shared download controller and UI, and observes command/executed so only the submitting browser starts a download.
Download flow
Both entry paths issue a HEAD preflight to GET /api/session.export?..., then hand the GET URL to the browser download manager without buffering the ZIP in JavaScript. One controller owns one in-flight download per session, collapses concurrent gestures into that operation, and cancels the preflight on plugin disposal. Modal state lives in a snapshot store keyed by session, so the button and the command share one dialog per session.
The Host route is a feature-owned exact Fetch contribution. Connection applies its Host/Origin and browser-session checks and bridges the streaming Response; this package owns query validation, live-session flushes, handle-based log reads and attachment reads, ZIP generation, and HTTP status semantics.
Further Exploration
Read these pages when the package-level contract is not enough. They move from the Web control to the host endpoint and the surrounding command and session surfaces.
- dsh-client-connection — the authenticated Fetch-route carrier used by the Host endpoint.
- Commands subsystem reference — the human-command registry the
/exportcommand registers on. - dsh-client-ui-commands — the browser command surface that renders and acknowledges
/export. - Session Query package map — the retrieval family this package belongs to.
Model Experience
Human /export control
What the model sees
Nothing. /export stays on the human-command plane, and the ZIP download does not enter model history.
Token effect
Zero. The command creates no model turn.
KV Cache effect
None. The log-only command lifecycle and browser download do not change the derived request prefix.
Known Limitations and Deferred Work
These limits define when this package is a poor fit or needs special operational care. They are current package constraints, not a task backlog.
- Browser download, not a Host-path writer — the browser chooses the local destination; no Host path or native folder action is returned.
- Preflight reports only pre-stream failures — a descendant or attachment failure after the browser accepts the GET is reported by the browser download manager, not by the dialog.
Dev Note
Working context for maintainers — click to expand
This Dev Note is working context for maintainers: open design questions and directions that are not decided. It is explicitly non-authoritative — shipped behavior, limits, and accepted rationale live in the sections above, the package code, and the linked pages.
Future: export destinations beyond the browser
The download is deliberately browser-scoped; a Host-path or native folder export would need a new endpoint contract and a decision on where the ZIP lands.
Runtime invariant: No companion is published. Connection and the command registry own both registrations, while each export reads authoritative Session services.