import type { AskUserCloseResponse, AskUserSubmission, SavedPromptAttachment, SessionBulkArchiveResponse, SessionBulkDeleteArchivedResponse, SessionBulkMutationRef, SessionNotificationCatalogSnapshot, SessionNotificationDismissAllRequest, SessionNotificationDismissRequest, SessionNotificationInboxSnapshot, SessionUnreadAcknowledgeRequest, SessionUnreadCatalogSnapshot, } from "../../shared/apiTypes.js"; import type { ClientArchiveSessionsResponse, ClientCommand, ClientCommandResult, ClientMessagePage, ClientSession, ClientSessionCleanupExecuteResponse, ClientSessionCleanupPreviewResponse, ClientSessionModel, ClientSessionRef, ClientSessionStatus, ClientSessionTreeNavigateRequest, ClientSessionTreeNavigateResult, ClientThinkingLevel, SessionStreamSnapshot, } from "../types.js"; import type { NormalizedSessionCleanupRequest } from "./sessionCleanup.js"; export type SessionRouteRef = ClientSessionRef; export type SessionRouteLookup = string | SessionRouteRef; /** * Route-facing session contract for PI WEB's HTTP/WebSocket API. * * Keep transport concerns separate from the bundled Pi SDK implementation so * routes remain testable. Pi-specific lifecycle hooks such as auth-change * handling and daemon shutdown stay on the concrete service. */ export interface SessionRouteService { list(cwd: string): Promise; start(cwd: string): Promise; messages(ref: SessionRouteLookup, page?: { before?: number; limit?: number }): Promise; status(ref: SessionRouteLookup): Promise; streamSnapshot(ref: SessionRouteLookup): Promise; notificationCatalog(): SessionNotificationCatalogSnapshot | Promise; unreadCatalog(): Promise; acknowledgeUnread(sessionId: string, request: SessionUnreadAcknowledgeRequest): Promise; notificationInbox(ref: SessionRouteRef): SessionNotificationInboxSnapshot | Promise; dismissNotification(ref: SessionRouteRef, request: Omit): SessionNotificationInboxSnapshot | Promise; dismissAllNotifications(ref: SessionRouteRef, request: Omit): SessionNotificationInboxSnapshot | Promise; clearQueue(ref: SessionRouteLookup): Promise; submitAsk(ref: SessionRouteLookup, askId: string, submission: AskUserSubmission): Promise; cancelAsk(ref: SessionRouteLookup, askId: string): Promise; dismissWarning(ref: SessionRouteLookup, dismissId: string): Promise; availableModels(ref: SessionRouteLookup): Promise; setModel(ref: SessionRouteLookup, provider: string, modelId: string): Promise; cycleModel(ref: SessionRouteLookup, direction: "forward" | "backward"): Promise; availableThinkingLevels(ref: SessionRouteLookup): Promise; setThinkingLevel(ref: SessionRouteLookup, level: string): Promise; cycleThinkingLevel(ref: SessionRouteLookup): Promise; commands(ref: SessionRouteLookup): Promise; prompt(ref: SessionRouteLookup, text: unknown, streamingBehavior?: unknown, attachments?: unknown): Promise; saveAttachments(ref: SessionRouteLookup, attachments: unknown, folder?: string): Promise; cleanupPreview(request: NormalizedSessionCleanupRequest): Promise; cleanup(request: NormalizedSessionCleanupRequest): Promise; archiveMany(refs: readonly SessionBulkMutationRef[]): Promise; deleteArchivedMany(refs: readonly SessionBulkMutationRef[]): Promise; shell(ref: SessionRouteLookup, text: string): Promise; runCommand(ref: SessionRouteLookup, text: string): Promise; respondToCommand(ref: SessionRouteLookup, requestId: string, value: string): Promise; navigateTree(ref: SessionRouteLookup, request: ClientSessionTreeNavigateRequest): Promise; abort(ref: SessionRouteLookup): Promise; stop(ref: SessionRouteLookup): void | Promise; archive(ref: SessionRouteLookup): Promise; archiveTree(ref: SessionRouteLookup): Promise; restore(ref: SessionRouteLookup): Promise; deleteArchived(ref: SessionRouteLookup): Promise; reload(ref: SessionRouteLookup): Promise; detachParent(ref: SessionRouteLookup): Promise; }