feat(ext): add chat history
This commit is contained in:
70
packages/extension/src/lib/db.ts
Normal file
70
packages/extension/src/lib/db.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import type { HistoricalEvent } from '@page-agent/core'
|
||||
import { type DBSchema, type IDBPDatabase, openDB } from 'idb'
|
||||
|
||||
const DB_NAME = 'page-agent-ext'
|
||||
const DB_VERSION = 1
|
||||
|
||||
export interface SessionRecord {
|
||||
id: string
|
||||
task: string
|
||||
history: HistoricalEvent[]
|
||||
status: 'completed' | 'error'
|
||||
createdAt: number
|
||||
}
|
||||
|
||||
interface PageAgentDB extends DBSchema {
|
||||
sessions: {
|
||||
key: string
|
||||
value: SessionRecord
|
||||
indexes: { 'by-created': number }
|
||||
}
|
||||
}
|
||||
|
||||
let dbPromise: Promise<IDBPDatabase<PageAgentDB>> | null = null
|
||||
|
||||
function getDB() {
|
||||
if (!dbPromise) {
|
||||
dbPromise = openDB<PageAgentDB>(DB_NAME, DB_VERSION, {
|
||||
upgrade(db) {
|
||||
const store = db.createObjectStore('sessions', { keyPath: 'id' })
|
||||
store.createIndex('by-created', 'createdAt')
|
||||
},
|
||||
})
|
||||
}
|
||||
return dbPromise
|
||||
}
|
||||
|
||||
export async function saveSession(
|
||||
session: Omit<SessionRecord, 'id' | 'createdAt'>
|
||||
): Promise<SessionRecord> {
|
||||
const db = await getDB()
|
||||
const record: SessionRecord = {
|
||||
...session,
|
||||
id: crypto.randomUUID(),
|
||||
createdAt: Date.now(),
|
||||
}
|
||||
await db.put('sessions', record)
|
||||
return record
|
||||
}
|
||||
|
||||
/** List sessions, newest first */
|
||||
export async function listSessions(): Promise<SessionRecord[]> {
|
||||
const db = await getDB()
|
||||
const all = await db.getAllFromIndex('sessions', 'by-created')
|
||||
return all.reverse()
|
||||
}
|
||||
|
||||
export async function getSession(id: string): Promise<SessionRecord | undefined> {
|
||||
const db = await getDB()
|
||||
return db.get('sessions', id)
|
||||
}
|
||||
|
||||
export async function deleteSession(id: string): Promise<void> {
|
||||
const db = await getDB()
|
||||
await db.delete('sessions', id)
|
||||
}
|
||||
|
||||
export async function clearSessions(): Promise<void> {
|
||||
const db = await getDB()
|
||||
await db.clear('sessions')
|
||||
}
|
||||
Reference in New Issue
Block a user