- #3124: Session tools now merge SDK and file-backed sessions for SQLite backend - #3125: Cache priming fixed for OpenCode >=1.3.14 empty workspace - #3127: Activity-based progress detection prevents infinite compaction on Kimi/Minimax All 29 new tests pass, 4885 total tests passing.
This commit is contained in:
@@ -9,6 +9,27 @@ export interface GetMainSessionsOptions {
|
||||
directory?: string
|
||||
}
|
||||
|
||||
function mergeSessionMetadataLists(
|
||||
sdkSessions: SessionMetadata[],
|
||||
fileSessions: SessionMetadata[],
|
||||
): SessionMetadata[] {
|
||||
const merged = new Map<string, SessionMetadata>()
|
||||
|
||||
for (const session of fileSessions) {
|
||||
merged.set(session.id, session)
|
||||
}
|
||||
|
||||
for (const session of sdkSessions) {
|
||||
merged.set(session.id, session)
|
||||
}
|
||||
|
||||
return [...merged.values()].sort((a, b) => b.time.updated - a.time.updated)
|
||||
}
|
||||
|
||||
function mergeSessionIds(sdkSessionIds: string[], fileSessionIds: string[]): string[] {
|
||||
return [...new Set([...sdkSessionIds, ...fileSessionIds])]
|
||||
}
|
||||
|
||||
// SDK client reference for beta mode
|
||||
let sdkClient: PluginInput["client"] | null = null
|
||||
|
||||
@@ -23,7 +44,9 @@ export function resetStorageClient(): void {
|
||||
export async function getMainSessions(options: GetMainSessionsOptions): Promise<SessionMetadata[]> {
|
||||
if (isSqliteBackend() && sdkClient) {
|
||||
try {
|
||||
return await getSdkMainSessions(sdkClient, options.directory)
|
||||
const sdkSessions = await getSdkMainSessions(sdkClient, options.directory)
|
||||
const fileSessions = await getFileMainSessions(options.directory)
|
||||
return mergeSessionMetadataLists(sdkSessions, fileSessions)
|
||||
} catch (error) {
|
||||
if (!shouldFallbackFromSdkError(error)) throw error
|
||||
log("[session-manager] falling back to file session list after SDK unavailable error", { error: String(error) })
|
||||
@@ -36,7 +59,9 @@ export async function getMainSessions(options: GetMainSessionsOptions): Promise<
|
||||
export async function getAllSessions(): Promise<string[]> {
|
||||
if (isSqliteBackend() && sdkClient) {
|
||||
try {
|
||||
return await getSdkAllSessions(sdkClient)
|
||||
const sdkSessionIds = await getSdkAllSessions(sdkClient)
|
||||
const fileSessionIds = await getFileAllSessions()
|
||||
return mergeSessionIds(sdkSessionIds, fileSessionIds)
|
||||
} catch (error) {
|
||||
if (!shouldFallbackFromSdkError(error)) throw error
|
||||
log("[session-manager] falling back to file session ids after SDK unavailable error", { error: String(error) })
|
||||
@@ -51,7 +76,8 @@ export { getMessageDir } from "../../shared/opencode-message-dir"
|
||||
export async function sessionExists(sessionID: string): Promise<boolean> {
|
||||
if (isSqliteBackend() && sdkClient) {
|
||||
try {
|
||||
return await sdkSessionExists(sdkClient, sessionID)
|
||||
const existsInSdk = await sdkSessionExists(sdkClient, sessionID)
|
||||
if (existsInSdk) return true
|
||||
} catch (error) {
|
||||
if (!shouldFallbackFromSdkError(error)) throw error
|
||||
log("[session-manager] falling back to file sessionExists after SDK unavailable error", { error: String(error), sessionID })
|
||||
@@ -63,7 +89,8 @@ export async function sessionExists(sessionID: string): Promise<boolean> {
|
||||
export async function readSessionMessages(sessionID: string): Promise<SessionMessage[]> {
|
||||
if (isSqliteBackend() && sdkClient) {
|
||||
try {
|
||||
return await getSdkSessionMessages(sdkClient, sessionID)
|
||||
const sdkMessages = await getSdkSessionMessages(sdkClient, sessionID)
|
||||
if (sdkMessages.length > 0) return sdkMessages
|
||||
} catch (error) {
|
||||
if (!shouldFallbackFromSdkError(error)) throw error
|
||||
log("[session-manager] falling back to file session messages after SDK unavailable error", { error: String(error), sessionID })
|
||||
@@ -76,7 +103,8 @@ export async function readSessionMessages(sessionID: string): Promise<SessionMes
|
||||
export async function readSessionTodos(sessionID: string): Promise<TodoItem[]> {
|
||||
if (isSqliteBackend() && sdkClient) {
|
||||
try {
|
||||
return await getSdkSessionTodos(sdkClient, sessionID)
|
||||
const sdkTodos = await getSdkSessionTodos(sdkClient, sessionID)
|
||||
if (sdkTodos.length > 0) return sdkTodos
|
||||
} catch (error) {
|
||||
if (!shouldFallbackFromSdkError(error)) throw error
|
||||
log("[session-manager] falling back to file session todos after SDK unavailable error", { error: String(error), sessionID })
|
||||
|
||||
Reference in New Issue
Block a user