diff --git a/.changeset/restore-archived-sessions.md b/.changeset/restore-archived-sessions.md new file mode 100644 index 0000000000..2fd35cbf90 --- /dev/null +++ b/.changeset/restore-archived-sessions.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": minor +--- + +Add server APIs to restore archived sessions and list only archived sessions. diff --git a/.changeset/web-archived-sessions-settings.md b/.changeset/web-archived-sessions-settings.md new file mode 100644 index 0000000000..b12f05239b --- /dev/null +++ b/.changeset/web-archived-sessions-settings.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": minor +--- + +web: Add an Archived sessions page in Settings to browse and restore archived sessions. Open Settings → Archived to find it. diff --git a/apps/kimi-web/src/api/daemon/client.ts b/apps/kimi-web/src/api/daemon/client.ts index 5c5049b3c3..531ff3cb13 100644 --- a/apps/kimi-web/src/api/daemon/client.ts +++ b/apps/kimi-web/src/api/daemon/client.ts @@ -293,6 +293,7 @@ export class DaemonKimiWebApi implements KimiWebApi { status?: AppSessionStatus; workspaceId?: string; includeArchive?: boolean; + archivedOnly?: boolean; excludeEmpty?: boolean; }, ): Promise> { @@ -302,6 +303,7 @@ export class DaemonKimiWebApi implements KimiWebApi { page_size: input?.pageSize, status: input?.status ? toWireSessionStatus(input.status) : undefined, include_archive: input?.includeArchive, + archived_only: input?.archivedOnly, exclude_empty: input?.excludeEmpty, // PRESUMED — daemon supports ?workspace_id= once the registry ships; it // ignores unknown query params until then, so this is safe to always send. @@ -420,6 +422,16 @@ export class DaemonKimiWebApi implements KimiWebApi { return data; } + // POST /sessions/{id}:restore — clear the archived flag. The daemon returns + // the full restored session, so callers can merge it straight back into lists. + async restoreSession(sessionId: string): Promise { + const data = await this.http.post( + `/sessions/${encodeURIComponent(sessionId)}:restore`, + {}, + ); + return toAppSession(data); + } + // ------------------------------------------------------------------------- // Messages // ------------------------------------------------------------------------- diff --git a/apps/kimi-web/src/api/types.ts b/apps/kimi-web/src/api/types.ts index 16adbbcd3c..08b6ae5174 100644 --- a/apps/kimi-web/src/api/types.ts +++ b/apps/kimi-web/src/api/types.ts @@ -645,7 +645,7 @@ export interface AppSessionWarning { export interface KimiWebApi { getHealth(): Promise<{ status: 'ok'; uptimeSec: number }>; getMeta(): Promise<{ serverVersion: string; serverId: string; startedAt: string; capabilities: Record; openInApps: string[]; dangerousBypassAuth: boolean }>; - listSessions(input?: PageRequest & { status?: AppSessionStatus; workspaceId?: string; includeArchive?: boolean; excludeEmpty?: boolean }): Promise>; + listSessions(input?: PageRequest & { status?: AppSessionStatus; workspaceId?: string; includeArchive?: boolean; archivedOnly?: boolean; excludeEmpty?: boolean }): Promise>; createSession(input: { title?: string; cwd?: string; model?: string; workspaceId?: string }): Promise; /** Fetch one session by id (deep links beyond the first listSessions page). */ getSession(sessionId: string): Promise; @@ -653,6 +653,7 @@ export interface KimiWebApi { getSessionStatus(sessionId: string): Promise; getSessionWarnings(sessionId: string): Promise; archiveSession(sessionId: string): Promise<{ archived: true }>; + restoreSession(sessionId: string): Promise; listMessages(sessionId: string, input?: PageRequest & { role?: AppMessageRole }): Promise>; /** v2 initial sync: atomic session state + `asOfSeq` watermark + epoch. */ getSessionSnapshot(sessionId: string): Promise; diff --git a/apps/kimi-web/src/components/settings/SettingsDialog.vue b/apps/kimi-web/src/components/settings/SettingsDialog.vue index b910332c21..44d7cf3ca6 100644 --- a/apps/kimi-web/src/components/settings/SettingsDialog.vue +++ b/apps/kimi-web/src/components/settings/SettingsDialog.vue @@ -3,8 +3,10 @@ scattered in the sidebar account popover: appearance, language, account, connection, plus notifications and the troubleshooting-log export. -->