Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
49f24d8
agentHost: centralize session list metadata
sandy081 Aug 22, 2026
bcad4c9
Merge origin/main into session metadata migration
sandy081 Aug 24, 2026
7453d67
agentHost: migrate sessions directly to v2
sandy081 Aug 24, 2026
1f4d679
agentHost: extract session catalog helpers
sandy081 Aug 24, 2026
b1f2a96
agentHost: simplify session catalog persistence
sandy081 Aug 26, 2026
6a71e16
Merge origin/main into session metadata migration
sandy081 Aug 26, 2026
e7baa3e
agentHost: remove live compatibility test harness
sandy081 Aug 26, 2026
f22e651
agentHost: make catalog payload rebuildable
sandy081 Aug 27, 2026
e2839cd
Merge origin/main into session metadata migration
sandy081 Aug 27, 2026
495bfe4
agentHost: centralize session chat membership
sandy081 Aug 28, 2026
a502e17
agentHost: address catalog review feedback
sandy081 Aug 28, 2026
ad19313
Merge origin/main into session database migration
sandy081 Aug 31, 2026
963a6f9
Merge origin/main into session database migration
sandy081 Sep 1, 2026
9763af2
agentHost: bridge session catalog migration collision
sandy081 Sep 1, 2026
3c990ee
agentHost: migrate catalog after first listing
sandy081 Sep 1, 2026
57e9b90
Merge origin/main into session database migration
sandy081 Sep 1, 2026
8513b0e
Merge remote-tracking branch 'origin/main' into sandy081/agents/sessi…
sandy081 Sep 1, 2026
91ee991
Merge remote-tracking branch 'origin/main' into sandy081/agents/sessi…
sandy081 Sep 1, 2026
65e2431
agentHost: preserve titles during catalog migration
sandy081 Sep 1, 2026
84ffc4d
agentHost: bound catalog summaries
sandy081 Sep 2, 2026
e6bdcba
agentHost: address catalog persistence feedback
sandy081 Sep 2, 2026
0f234f3
Merge origin/main into session database migration
sandy081 Sep 2, 2026
49b315e
Merge remote-tracking branch 'origin/main' into sandy081/agents/sessi…
sandy081 Sep 2, 2026
4920195
agentHost: reuse keyed catalog sequencer
sandy081 Sep 2, 2026
6966b90
agentHost: harden central catalog synchronization
sandy081 Sep 2, 2026
1e29441
Merge remote-tracking branch 'origin/main' into sandy081/agents/sessi…
sandy081 Sep 2, 2026
f907524
agentHost: persist unloaded session flags centrally
sandy081 Sep 3, 2026
32714bc
agentHost: harden peer chat catalog lifecycle
sandy081 Sep 3, 2026
76757e1
agentHost: preserve peer backing during recovery
sandy081 Sep 3, 2026
e1bc2e3
agentHost: harden catalog reconciliation
sandy081 Sep 3, 2026
d26ff10
agentHost: avoid claiming unopened legacy sessions
sandy081 Sep 3, 2026
92d653f
agentHost: preserve catalog fallback metadata
sandy081 Sep 3, 2026
feffc55
agentHost: fence catalog sync during deletion
sandy081 Sep 3, 2026
d3fc54d
Merge origin/main into session database migration
sandy081 Sep 3, 2026
0cec7dd
agentHost: avoid title metadata reads on restore
sandy081 Sep 4, 2026
c5ac2c4
build: raise class fields checker heap limit
sandy081 Sep 4, 2026
0f60542
agentHost: stabilize passive metadata restart test
sandy081 Sep 4, 2026
c607b06
agentHost: avoid redundant peer metadata writes
sandy081 Sep 4, 2026
4eb4fc5
Merge origin/main into session database migration
sandy081 Sep 5, 2026
aebf63b
agentHost: preserve pre-release session database schemas
sandy081 Sep 5, 2026
3392bf9
agentHost: avoid claiming untitled legacy sessions
sandy081 Sep 5, 2026
075d468
agentHost: coalesce background catalog writes
sandy081 Sep 6, 2026
9c0669c
agentHost: fix catalog ESLint warnings
sandy081 Sep 6, 2026
82e64bd
agentHost: bound catalog reconciliation work
sandy081 Sep 7, 2026
12f279f
Merge origin/main into session database migration
sandy081 Sep 7, 2026
2240664
agentHost: bulk insert central chat catalogs
sandy081 Sep 8, 2026
892b6e0
agentHost: keep legacy runtime discovery central-only
sandy081 Sep 8, 2026
803c297
agentHost: skip catalog sync for transient summary changes
sandy081 Sep 8, 2026
aac6311
Merge origin/main into session database migration
sandy081 Sep 8, 2026
ca1b69a
agentHost: drain catalog writes before shutdown
sandy081 Sep 8, 2026
b095443
agentHost: finish Copilot tool results before idle
sandy081 Sep 8, 2026
3ec5b68
chat: resolve provisional sessions before subscribing input pills
sandy081 Sep 9, 2026
fd5d301
Merge origin/main into session database migration
sandy081 Sep 9, 2026
40b61ac
agentHost: defer automatic catalog repair until startup settles
sandy081 Sep 10, 2026
3202e20
Merge origin/main into session database migration
sandy081 Sep 10, 2026
958d820
Merge origin/main into session database migration
sandy081 Sep 10, 2026
5b4a8ec
agentHost: settle startup before title reconciliation test
sandy081 Sep 10, 2026
2769cd2
agentHost: skip local storage for unresolvable catalog sources
sandy081 Sep 10, 2026
0c74fb9
agentHost: add session catalog rollback switch
sandy081 Sep 10, 2026
6aed2ce
Merge origin/main into session database migration
sandy081 Sep 10, 2026
f2af45b
agentHost: report comparable listing metrics in both catalog modes
sandy081 Sep 10, 2026
b7bc797
agentHost: release a settled session listing instead of pinning it
sandy081 Sep 11, 2026
f2daa7a
Merge origin/main (60ac69b3648) into session-db-data-migration-plan
sandy081 Sep 11, 2026
08aae25
chat: rename the session catalog setting and mark it advanced
sandy081 Sep 11, 2026
781d96a
agentHost: migrate the session catalog setting from application scope
sandy081 Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2433,4 +2433,3 @@ export interface IToolCallLoopResult extends IToolCallSingleResult {
toolCallRounds: IToolCallRound[];
toolCallResults: Record<string, LanguageModelToolResult2>;
}

28 changes: 19 additions & 9 deletions src/vs/platform/agentHost/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
### Guiding principles

- **"Represent, don't orchestrate."** The agent harness creates and drives SDK chats; the orchestrator records what exists and routes protocol actions. No agent-specific logic leaks into `AgentService` or `AgentHostStateManager`.
- **Composition over inheritance.** All harnesses share one membership path (`addChat`/`removeChat`), one persistence path (`PEER_CHATS_METADATA_KEY`), and one restore path (`registerRestoredChatSummary` + `resolveChatState`). Per-harness features are expressed through `IAgentCapabilities` flags, not `if (provider === 'claude') ...` branches.
- **Composition over inheritance.** All harnesses share one membership path (`addChat`/`removeChat`), one authoritative persistence path (`AgentHostPeerChatStore` in `agent-host.db`, with a `PEER_CHATS_METADATA_KEY` compatibility mirror), and one restore path (`registerRestoredChatSummary` + `resolveChatState`). Per-harness features are expressed through `IAgentCapabilities` flags, not `if (provider === 'claude') ...` branches.
- **Single catalog path.** Whether a chat is created by the user ("Add Chat") or spawned by the harness (subagent tool call), it enters the catalog through exactly one path (`AgentHostStateManager.addChat`). See invariant I4 below.

### Terminology convention: "session" is overloaded — read it by layer
Expand Down Expand Up @@ -97,19 +97,19 @@ Agents do **not** maintain the chat catalog, persist membership, know whether a

Artifact removal uses the VS Code-only `vscode/removeSessionArtifact` extension RPC with `{ session: string, artifactId: string }` and a void result. Clients gate the optional `removeSessionArtifact(URI, string)` connection method with `supportsAgentHostArtifactRemoval(initializeResult)` (`_meta['vscode.removeSessionArtifact'] === true`). This does not extend the generated AHP protocol.

The shared `node/shared/sessionArtifacts.ts` path serializes artifact mutations per session across tools and direct user requests. Each mutation reads the latest collection, awaits the existing `sessionArtifacts` database metadata write, then publishes `SessionMetaChanged` merged with the latest independent metadata. Failed deletion leaves the artifact visible and retryable; failures are logged and propagated without blocking queued additions. Independent GitHub associations and unrelated artifacts/references are preserved. No model turn or tool invocation is involved in direct user removal.
The shared `node/shared/sessionArtifacts.ts` path serializes artifact mutations per session across tools and direct user requests. Each mutation reads the latest collection, awaits ordered catalog synchronization (including the legacy-first `sessionArtifacts` metadata write), then publishes `SessionMetaChanged` merged with the latest independent metadata. Failed local persistence leaves the artifact visible and retryable; failures are logged and propagated without blocking queued additions. Central synchronization uses the usual pending receipts for repair. Independent GitHub associations and unrelated artifacts/references are preserved. No model turn or tool invocation is involved in direct user removal.

**`AgentService` (`node/agentService.ts`):**
- Resolves the `(session, chat)` → `(agent, session URI, chat URI)` mapping for orchestration.
- Uses `IAgentHostProviderService` for provider ownership and session routing. Its `getProviderForSession` path falls back through the session URI's scheme when a restored session was not associated in this process lifetime.
- Owns `AgentSessionRegistry`, the durable source of truth for which sessions exist. `listSessions` enumerates the registry, hydrates each initial chat through `IAgent.getChatMetadata`, and applies the existing DB/state overlays.
- Owns `AgentSessionRegistry`, backed by `sessions_v2` in `agent-host.db`, as the durable source of truth for which sessions exist. `listSessions` reads validated, rebuildable central payloads and applies live-state overlays; provider/local database reads are fallback and reconciliation paths, not prerequisites for listing.
- Dispatches user-driven chat lifecycle (`createChat`, `disposeChat`) to `chats.*`.
- Disposes every catalog chat in stable order (peers first, initial chat last); releases every catalog chat on idle eviction.
- Derives the exhaustive per-operation `IAgentChatContext` (persistence scope, opaque configuration scope, catalog origin, host customizations) via the single `createAgentChatContext` helper.
- Supplies complete resolved `IAgentCreateChatOptions` (`workingDirectories`, `project`, provider config, model/agent, active client, and fork/import/side-chat source) on every creation.
- Records side-chat provenance in the catalog but leaves hidden context injection and visible-history filtering to the provider. The source is a stable turn id; active-turn partial response and selected text are immutable creation-time snapshots.
- Passes the full ordered `workingDirectories` set and the initiating `AgentHostClientType` on each send while still supplying transient chat context. Providers launch in index 0, retain additional roots, and attribute usage/telemetry to the correct client surface.
- Persists and restores the orchestrator-owned peer-chat catalog (`PEER_CHATS_METADATA_KEY` in the session database, serialized per session via `_peerChatCatalogWrites`).
- Persists and restores authoritative peer-chat membership through `AgentHostPeerChatStore` (`session_chat_catalogs` and `session_chats` in `agent-host.db`). Parent `PEER_CHATS_METADATA_KEY` and chat-local metadata remain compatibility mirrors; conversation history remains in session/chat databases.
- Suppresses a peer chat's separately-enumerable backing SDK session (when `IAgentCreateChatResult.backingSession` is set): marks it via `_markPeerChatBacking` and filters it out of `listSessions` (invariant I7).
- Routes harness-spawned chats into the catalog (`_onChatSpawned`, `_onChatEnded`).
- Owns the restore flow (`restoreSession`, `_restorePeerChats`).
Expand Down Expand Up @@ -161,7 +161,17 @@ Opaque to the host, but not arbitrary for the provider: whatever id the blob car

**I4 — Single catalog path (spawn channel).** Both user-driven chats (`AgentService.createChat` → `addChat`) and harness-spawned chats (`AgentService._onChatSpawned` → `addChat`) go through `AgentHostStateManager.addChat`. `AgentService` installs the spawn-channel listener **before** the `AgentSideEffects` listener through the provider service's synchronous initializer to guarantee the chat exists in the catalog before any turn actions arrive for it (DR1 deterministic sequencing).

**I5 — Orchestrator peer-chat catalog is the restore source of truth (with one-time legacy migration).** The orchestrator persists additional chats in `PEER_CHATS_METADATA_KEY` and the initial chat's opaque backing in `defaultChatProviderData`. Restore materializes both through the same provider-data contract — `materializeChat` is the *only* way a default chat is re-attached. When a native catalog session has no persisted blob, the provider recovers its backing from the provider-native session id in the Agent Host session URI and returns canonical provider data, which the host persists additively for later restores; an already-canonical blob is never rewritten. A missing additional-chat catalog triggers the one-time `listLegacyChatBackings` migration. Harness-spawned chats remain transient and are re-derived from tool-origin state. `_persistDefaultChatBacking`'s two writes — the `defaultChatProviderData` blob and the default chat's own `_markChatBacking` call (I7) — are independent: a failure persisting the blob is logged and swallowed rather than skipping the backing marker, since the marker is what keeps the default chat's backing session out of the top-level list and must not be held hostage to an unrelated write's success.
**I5 — The central peer-chat catalog is the restore source of truth (with legacy migration and compatibility mirrors).** The orchestrator persists additional-chat membership in `agent-host.db` through `AgentHostPeerChatStore` and the initial chat's opaque backing in `defaultChatProviderData`. Restore materializes both through the same provider-data contract — `materializeChat` is the *only* way a default chat is re-attached. When a native catalog session has no persisted blob, the provider recovers its backing from the provider-native session id in the Agent Host session URI and returns canonical provider data, which the host persists additively for later restores; an already-canonical blob is never rewritten. Missing central membership is migrated from the legacy parent mirror and provider backings. An authoritative empty central catalog is not missing; later provider recovery may enrich matching entries but must not resurrect removed peers. Harness-spawned chats remain transient and are re-derived from tool-origin state. `_persistDefaultChatBacking`'s two writes — the `defaultChatProviderData` blob and the default chat's own `_markChatBacking` call (I7) — are independent: a failure persisting the blob is logged and swallowed rather than skipping the backing marker, since the marker is what keeps the default chat's backing session out of the top-level list and must not be held hostage to an unrelated write's success.

**List payload compatibility.** Central identity and membership are authoritative; the bounded list payload is rebuildable. When local storage exists, catalog synchronization uses legacy-first writes and pending receipts before central acknowledgement. Import and runtime discovery of unopened adoptable legacy sessions use the non-creating path: metadata discovery must not create `agentSessionData/<id>` and accidentally claim ownership. Explicit adoption owns that transition.

Automatic catalog reconciliation waits until both host startup and the first session listing have completed. Startup repair requests leave their dirty markers for that deferred pass, which then starts periodic maintenance; explicit refreshes and mutation persistence do not wait for background maintenance.

`chat.agentHost.sessionCatalog.enabled` is the rollback lever for the catalog read path. It is frozen at its first read, so the store backing the list cannot change while the host runs, and it requires a restart. When disabled the host performs no catalog import and no background repair, and `listSessions` uses the provider and per-session fallback instead of the cached payload — which is slower, so it is a safety switch rather than a tuning option. Registry identity and every compatibility write are unaffected, so both stores stay current and interchangeable; the verification marker is cleared while disabled so the next enabled start re-verifies every row.

Catalog imports may revisit registered sessions to repair payloads, but only newly registered identities cause discovery announcements or initial read-state side effects. Hydrated provider titles dirty the central payload even when recency is unchanged; persisted custom titles still take precedence. Automatic archival queues central synchronization immediately, while destructive lifecycle eligibility retains local durable metadata checks (including the auto-archive timestamp) rather than trusting only a rebuildable cache.

Because listing never opens session storage, migrations the provider/session fallback would perform during a list run in the catalog's maintenance pass instead, where the database is already open. Legacy per-kind changeset blobs are aggregated and written to the modern changes summary there, so the chip stays correct without adding a per-session read to the list path.

**I6 — Route through `IAgentHostProviderService`.** The provider service's explicit session association is populated only by `AgentService.createSession`. A restored session (alive in the state manager after a host restart but never created in this process) is absent from it, so restore re-associates the durable `AgentSessionRegistry` provider before lookup. For unregistered provider-native sessions, `getProviderForSession` falls back to the session URI scheme. Do not read the association map directly.

Expand Down Expand Up @@ -285,7 +295,7 @@ sequenceDiagram
AS->>SM: addChat(session, chatUri, { providerData })
SM-->>UI: ActionEnvelope (SessionChatAdded)
AS->>AS: _persistPeerChat(session, chatUri, providerData)
Note over AS: enqueued per-session RMW of PEER_CHATS_METADATA_KEY
Note over AS: central peer membership write with legacy compatibility mirror
opt backingSession set (I7)
AS->>AS: _markPeerChatBacking(backingSession, chatUri)
Note over AS: writes peerChatBacking marker into the backing session's DB<br/>so listSessions filters it out
Expand All @@ -310,7 +320,7 @@ sequenceDiagram
SM-->>AS: ChatSummary
Note over SE: AgentSideEffects listener fires next, chat already in catalog (DR1)
SE->>SM: dispatch turn lifecycle actions for the spawned chat
Note over AS: Spawned chats are NOT persisted to PEER_CHATS_METADATA_KEY\n(transient, re-derived from event log on restore)
Note over AS: Spawned chats are NOT persisted to the peer catalog\n(transient, re-derived from event log on restore)
```

On restart, AgentService discovers completed subagents from the already-restored parent turns and registers metadata-only read-only chat summaries. Their provider transcripts are resolved through `AgentHostStateManager.resolveChatState` only when the child chat is subscribed, matching restored peer-chat laziness; no provider-wide eager child enumeration remains.
Expand Down Expand Up @@ -339,7 +349,7 @@ sequenceDiagram
AS->>AS: _readPersistedChatTitle(session, defaultChatUri)
AS->>SM: restoreSession(summary, turns, {draft, defaultChatTitle})
SM->>SM: _ensureDefaultChat(sessionKey, summary, turns)
Note over AS: Peer chats: read PEER_CHATS_METADATA_KEY from DB
Note over AS: Peer chats: read authoritative central membership
alt catalog present (defined)
loop for each IPersistedPeerChat (in catalog order)
AS->>SM: registerRestoredChatSummary(session, chatUri, {title, draft, providerData, resolver})
Expand All @@ -352,7 +362,7 @@ sequenceDiagram
AS->>SM: registerRestoredChatSummary(session, chatUri, {resolver, providerData})
Note over SM: Create a retryable entry-owned resolver
end
AS->>AS: _persistPeerChat(...) writes PEER_CHATS_METADATA_KEY (drain once)
AS->>AS: _persistPeerChat(...) writes central membership and compatibility mirror
end
AS-->>C: IStateSnapshot
C->>AS: subscribe(peerChatUri, clientId)
Expand Down
10 changes: 10 additions & 0 deletions src/vs/platform/agentHost/common/agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,16 @@ export interface IAgentChatAdoptionResult {
readonly eligible: boolean;
/** Whether the chat already has Agent Host metadata, i.e. it is ours regardless of adoption. */
readonly native?: boolean;
/** Host-owned list-visible values recovered from the predecessor format. */
readonly listVisible?: ({
readonly title: string;
readonly titleSource: 'user' | 'agent' | 'auto';
} | {
readonly title?: undefined;
readonly titleSource?: undefined;
}) & {
readonly isRead?: boolean;
};
/** Set when the adopted chat ran in a worktree that no longer exists and can be recreated. */
readonly worktree?: IAgentAdoptedWorktree;
/** Diagnostic reason behind {@link adopted}. */
Expand Down
11 changes: 11 additions & 0 deletions src/vs/platform/agentHost/common/agentHostSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,11 @@ export const AgentHostAutoAttachPullRequestsConfigKey = 'autoAttachPullRequests'
// sessions as adoptable agent-host sessions, and opening one adopts it in place. Experimental; off.
export const AgentHostMigrateLegacyCopilotCliEnabledConfigKey = 'migrateLegacyCopilotCliEnabled';

// Root config key forwarded from the renderer when the `chat.agentHost.sessionCatalog.enabled`
// setting changes. When `false`, the host lists sessions from provider metadata and per-session
// storage instead of the central catalog, and performs no catalog import or background repair.
export const AgentHostSessionCatalogEnabledConfigKey = 'sessionCatalogEnabled';

export const AgentHostShowExternalSessionsConfigKey = 'showExternalSessions';

export { ChatExternalSessionsMode as AgentHostExternalSessionsMode };
Expand Down Expand Up @@ -897,6 +902,12 @@ export const platformRootSchema = createSchema({
description: localize('agentHost.config.migrateLegacyCopilotCliEnabled.description', "Whether un-adopted extension-host Copilot CLI sessions are surfaced as adoptable agent-host sessions and migrated in place when opened."),
default: false,
}),
[AgentHostSessionCatalogEnabledConfigKey]: schemaProperty<boolean>({
type: 'boolean',
title: localize('agentHost.config.sessionCatalogEnabled.title', "Session Catalog"),
description: localize('agentHost.config.sessionCatalogEnabled.description', "Whether the session list is served from the central catalog. When disabled, sessions are listed from provider metadata and per-session storage instead."),
default: true,
}),
[AgentHostShowExternalSessionsConfigKey]: schemaProperty<ChatExternalSessionsMode>({
type: 'string',
title: localize('agentHost.config.showExternalSessions.title', "Show External Agent Sessions"),
Expand Down
54 changes: 54 additions & 0 deletions src/vs/platform/agentHost/common/sessionDataService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,40 @@ export interface ILocalTurnRecord {
payload: string;
}

interface ISessionCatalogSyncIdentity {
readonly sessionGeneration: string;
readonly sourceRevision: number;
readonly projectionVersion: number;
}

/** Durable canonical catalog projection awaiting central acknowledgement. */
export interface ISessionCatalogSyncPendingSnapshot extends ISessionCatalogSyncIdentity {
readonly payload: string;
readonly payloadHash: string;
readonly acknowledgedHash?: string;
readonly state: 'pending';
}

/** Compact receipt retained after the pending payload has been acknowledged. */
export interface ISessionCatalogSyncAcknowledgedSnapshot extends ISessionCatalogSyncIdentity {
readonly payload: undefined;
readonly payloadHash: string;
readonly acknowledgedHash: string;
readonly state: 'acknowledged';
}

export type ISessionCatalogSyncSnapshot = ISessionCatalogSyncPendingSnapshot | ISessionCatalogSyncAcknowledgedSnapshot;

/** Identity fields required to acknowledge exactly one catalog synchronization snapshot. */
export interface ISessionCatalogSyncAcknowledgement {
readonly sessionGeneration: string;
readonly sourceRevision: number;
readonly projectionVersion: number;
readonly payloadHash: string;
}

/** Outcome of atomically storing metadata with a catalog synchronization snapshot. */
export type SessionCatalogSyncWriteResult = 'applied' | 'replayed';

/**
* A disposable handle to a per-session SQLite database backed by
Expand Down Expand Up @@ -337,6 +371,26 @@ export interface ISessionDatabase extends IDisposable {
*/
setMetadataValuesIfAbsent(key: string, values: Readonly<Record<string, string>>, copies?: Readonly<Record<string, string>>): Promise<boolean>;

/**
* Atomically stores metadata and advances the durable catalog relay snapshot.
*/
setMetadataValuesAndCatalogSyncSnapshot(values: Readonly<Record<string, string>>, snapshot: ISessionCatalogSyncPendingSnapshot): Promise<SessionCatalogSyncWriteResult>;

/**
* Atomically transitions to a new session generation when the stored generation matches.
*/
transitionMetadataValuesAndCatalogSyncSnapshot(values: Readonly<Record<string, string>>, expectedSessionGeneration: string, snapshot: ISessionCatalogSyncPendingSnapshot): Promise<boolean>;

/**
* Returns the durable catalog relay snapshot, if one has been stored.
*/
getCatalogSyncSnapshot(): Promise<ISessionCatalogSyncSnapshot | undefined>;

/**
* Acknowledges the snapshot only when every supplied identity field still matches.
*/
acknowledgeCatalogSyncSnapshot(acknowledgement: ISessionCatalogSyncAcknowledgement): Promise<boolean>;

/**
* Store or clear the draft for a chat in this session.
*/
Expand Down
Loading