- Author(s): @Rizzen, @xtmq
- Champion: @benbrandt
Elevator pitch
What are you proposing to change?Standardize reversible session archiving in both ACP v1 and v2: Clients can hide conversations from default history, discover archived sessions, and restore them with the same ID and saved history.
Status quo
How do things work today and what problems does this cause? Why would we change things?
session/delete removes sessions from history but permits permanent deletion. session/close releases execution resources. Neither guarantees reversible hiding, and session/list cannot explicitly request archived sessions.
What we propose to do about it
What are you proposing to improve the situation?
Methods
session/archive hides a session from default history:
session/unarchive restores it:
In each model,
_meta is an object with arbitrary values. Omission and null are equivalent.
Capabilities
Agents advertise one sharedarchive capability:
- v1:
agentCapabilities.sessionCapabilities.archive. - v2 draft:
capabilities.session.archive.
{} means the Agent MUST support both methods, the archived list filter, and archive-state reporting; omission or null means unsupported. Clients MUST check support before using either method or the list filter.
In v1, Agents that advertise sessionCapabilities.archive MUST also advertise sessionCapabilities.list. v2 already requires listing for Agents supporting sessions.
Example v1 initialization response:
Listing and state
Extendsession/list with an optional archived filter:
Agents that advertise
archive MUST support all three values. Any other value is rejected with Invalid params (-32602) rather than falling back to the default, so a Client never silently receives the wrong view.
The filter combines with cwd and applies before pagination. Clients keep the same cwd and archived values when following nextCursor; changing either starts a new pagination sequence.
List only archived sessions, e.g. for an “Archived” view:
archived to:
SessionInfo: Omission andnullare equivalent and convey no archive-state guarantee. Agents that advertisearchiveMUST include a boolean value on every listed session.SessionInfoUpdate: Omission andnullare equivalent and leave the archive state unchanged. Unliketitle,nulldoes not clear anything, because every session is either archived or not. Agents SHOULD report changes through existingsession_info_updatenotifications to Clients that have the session open. Listing remains the source of truth after reconnecting; no global subscription is introduced.
Semantics
- Preservation: Both operations preserve the ID and saved conversation. Archive state persists with session history across connections and restarts; ordinary retention policies still apply.
- Archiving closes active sessions: If the session is active,
session/archiveMUST cancel any ongoing work and free the session’s resources as ifsession/closehad been called, then archive it. This does not require theclosecapability. Agents SHOULD send thearchived: truesession_info_updateto Clients with the session open before closing it.session/unarchivenever loads or resumes a session. - Loading archived sessions: Closing, loading, or resuming does not change archive state. Agents MAY reject
session/loadorsession/resumefor an archived session. Clients that want to continue an archived session SHOULD callsession/unarchivefirst; they already know the state fromSessionInfo.archived. - Idempotency: Archiving an archived session, or unarchiving an unarchived session, succeeds. Neither method requires the session to be active on the current connection.
- Unknown sessions: Unknown, deleted, or expired sessions return
Resource not found(-32002). This differs fromsession/delete, which succeeds silently for unknown sessions because its end state (“not listed”) already holds. Neither archive state can hold for a session that doesn’t exist, so silently succeeding would hide stale or mistyped IDs. - Consistency: Success commits the change; subsequent list requests reflect it unless another operation intervenes.
- Deletion: Deleted sessions are excluded from every
archivedfilter value, and unarchiving does not restore a deleted session. Agents that advertisearchiveMUST NOT implementsession/deleteas an archive that later shows up in archived listings. - Subagent sessions: Archiving applies to the given session. Whether archiving a parent also archives its subagent sessions is implementation-defined; some Agents archive the whole tree.
Shiny future
How will things will play out once this feature exists?A user archives a conversation in one Client, finds it in another Client’s archived history, and restores it for continued work.
Implementation details and plan
Tell me more about your implementation. What is your detailed implementation plan?The implementation MUST cover both ACP v1 and v2:
session/archive, session/unarchive, all new models with _meta, the shared archive capability, the session/list filter, and archive-state reporting. Implement these behind unstable_session_archive, regenerate both versions’ schemas, and update conversions, SDKs, and docs. Validate restoration, retries, persistence, pagination, active sessions, and deletion compatibility in both protocol versions before preview.
Frequently asked questions
What questions have arisen over the course of authoring this document or during subsequent discussions?
Why separate methods?
They express opposite state transitions under one shared capability. A boolean setter is possible, but a general metadata-editing API exceeds this request. Extending deletion cannot guarantee recovery when Agents may permanently remove data.Why does archiving close an active session?
Several Agents with native archiving (Codex, Qwen Code, Kimi Code) stop or unload a session when archiving it, and both reference adapters close the session first. Requiring archive to leave execution untouched would force those Agents to reject the request and every Client to handle a “close, then archive” retry. Reusingsession/close semantics gives Clients one predictable outcome.
Why a three-value list filter instead of a boolean?
Clients usually show archived sessions in their own view, which needs archived-only results; a boolean “include archived” would force Clients to page through every session and filter locally. Native stores differ: Codex lists one side at a time, while others list both together, so Agents need adapter work for at least one of the values either way. A boolean namedarchived would also read as “archived only”.
What alternative approaches did you consider, and why did you settle on this one?
- Extend
session/deletewith soft-delete semantics: Deletion may be permanent and its behavior is implementation-defined, so it cannot guarantee recovery. - A single
session/setArchivedmethod with a boolean: Equivalent in power, but two methods match the rest of the session lifecycle methods and keep each request’s intent obvious. - A general session-metadata editing method: Larger in scope than this proposal needs.
What needs discussion?
- Discovery: Should listing archived sessions have its own capability for Agents that support neither mutation?
Revision history
- 2026-10-28: Archiving closes active sessions; three-value
archivedlist filter; clarified null handling, errors, deletion, and subagent sessions; removed theupdatedAtrequirement. - 2026-09-14: Initial proposal.