193 lines
4.5 KiB
TypeScript
193 lines
4.5 KiB
TypeScript
import { deleteVector, deleteVectorByFileId } from "./vector"
|
|
|
|
export type Source = {
|
|
source_id: string
|
|
type: string
|
|
filename?: string
|
|
content: string
|
|
}
|
|
|
|
export type Knowledge = {
|
|
id: string
|
|
db_type: string
|
|
title: string
|
|
status: string
|
|
embedding_model: string
|
|
source: Source[]
|
|
knownledge: any
|
|
createdAt: number
|
|
}
|
|
export const generateID = () => {
|
|
return "pa_knowledge_xxxx-xxxx-xxx-xxxx".replace(/[x]/g, () => {
|
|
const r = Math.floor(Math.random() * 16)
|
|
return r.toString(16)
|
|
})
|
|
}
|
|
export class PageAssistKnowledge {
|
|
db: chrome.storage.StorageArea
|
|
|
|
constructor() {
|
|
this.db = chrome.storage.local
|
|
}
|
|
|
|
getAll = async (): Promise<Knowledge[]> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.get(null, (result) => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
const data = Object.keys(result).map((key) => result[key])
|
|
resolve(data)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
getById = async (id: string): Promise<Knowledge> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.get(id, (result) => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
resolve(result[id])
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
create = async (knowledge: Knowledge): Promise<void> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.set({ [knowledge.id]: knowledge }, () => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
update = async (knowledge: Knowledge): Promise<void> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.set({ [knowledge.id]: knowledge }, () => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
delete = async (id: string): Promise<void> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.remove(id, () => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
deleteSource = async (id: string, source_id: string): Promise<void> => {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.get(id, (result) => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
const data = result[id] as Knowledge
|
|
data.source = data.source.filter((s) => s.source_id !== source_id)
|
|
this.db.set({ [id]: data }, () => {
|
|
if (chrome.runtime.lastError) {
|
|
reject(chrome.runtime.lastError)
|
|
} else {
|
|
resolve()
|
|
}
|
|
})
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
export const createKnowledge = async ({
|
|
source,
|
|
title,
|
|
embedding_model
|
|
}: {
|
|
title: string
|
|
source: Source[]
|
|
embedding_model: string
|
|
}) => {
|
|
const db = new PageAssistKnowledge()
|
|
const id = generateID()
|
|
const knowledge: Knowledge = {
|
|
id,
|
|
title,
|
|
db_type: "knowledge",
|
|
source,
|
|
status: "pending",
|
|
knownledge: {},
|
|
embedding_model,
|
|
createdAt: Date.now()
|
|
}
|
|
await db.create(knowledge)
|
|
return knowledge
|
|
}
|
|
|
|
export const getKnowledgeById = async (id: string) => {
|
|
const db = new PageAssistKnowledge()
|
|
return db.getById(id)
|
|
}
|
|
|
|
export const updateKnowledgeStatus = async (id: string, status: string) => {
|
|
const db = new PageAssistKnowledge()
|
|
const knowledge = await db.getById(id)
|
|
await db.update({
|
|
...knowledge,
|
|
status
|
|
})
|
|
}
|
|
|
|
export const getAllKnowledge = async (status?: string) => {
|
|
const db = new PageAssistKnowledge()
|
|
const data = await db.getAll()
|
|
|
|
if (status) {
|
|
return data
|
|
.filter((d) => d.db_type === "knowledge")
|
|
.filter((d) => d.status === status)
|
|
.map((d) => {
|
|
d.source.forEach((s) => {
|
|
delete s.content
|
|
})
|
|
return d
|
|
})
|
|
.sort((a, b) => b.createdAt - a.createdAt)
|
|
}
|
|
|
|
return data
|
|
.filter((d) => d.db_type === "knowledge")
|
|
.map((d) => {
|
|
d.source.forEach((s) => {
|
|
delete s.content
|
|
})
|
|
return d
|
|
})
|
|
.sort((a, b) => b.createdAt - a.createdAt)
|
|
}
|
|
|
|
export const deleteKnowledge = async (id: string) => {
|
|
const db = new PageAssistKnowledge()
|
|
await db.delete(id)
|
|
await deleteVector(`vector:${id}`)
|
|
}
|
|
|
|
export const deleteSource = async (id: string, source_id: string) => {
|
|
const db = new PageAssistKnowledge()
|
|
await db.deleteSource(id, source_id)
|
|
await deleteVectorByFileId(`vector:${id}`, source_id)
|
|
}
|