feat: add governed knowledge lifecycle

This commit is contained in:
hailin
2026-07-27 19:01:19 +08:00
parent 1a49ce4eae
commit 07c9ea1cc4
32 changed files with 5893 additions and 178 deletions

View File

@@ -1,6 +1,16 @@
import { apiRequest } from '@/lib/api'
import { apiRequest, apiUrl } from '@/lib/api'
import type { KnowledgeBase, KnowledgeItemInput, KnowledgeSearchResult } from './types'
import type {
AssetImpact,
AssetVersionComparison,
GovernedAsset,
GovernedAssetType,
GovernedAssetVersion,
KnowledgeBase,
KnowledgeDocument,
KnowledgeItemInput,
KnowledgeSearchResult
} from './types'
export function listKnowledgeBases() {
return apiRequest<KnowledgeBase[]>('/knowledge/bases')
@@ -18,10 +28,37 @@ export function createKnowledgeBase(payload: {
})
}
export function listKnowledgeDocuments(knowledgeBaseId?: number, parseStatus?: string) {
const query = new URLSearchParams()
if (knowledgeBaseId) query.set('knowledge_base_id', String(knowledgeBaseId))
if (parseStatus) query.set('parse_status', parseStatus)
const suffix = query.size ? `?${query}` : ''
return apiRequest<KnowledgeDocument[]>(`/knowledge/documents${suffix}`)
}
export function uploadKnowledgeDocument(knowledgeBaseId: number, file: File) {
const body = new FormData()
body.append('file', file)
return apiRequest<KnowledgeDocument>(
`/knowledge/documents/upload?knowledge_base_id=${knowledgeBaseId}`,
{ method: 'POST', body }
)
}
export function retryKnowledgeDocument(publicId: string) {
return apiRequest<KnowledgeDocument>(`/knowledge/documents/${publicId}/retry`, {
method: 'POST'
})
}
export function knowledgeDocumentDownloadUrl(publicId: string) {
return apiUrl(`/knowledge/documents/${publicId}/download`)
}
export function createKnowledgeItem(payload: KnowledgeItemInput) {
return apiRequest('/knowledge/items', {
method: 'POST',
body: JSON.stringify(payload)
body: JSON.stringify({ ...payload, status: 'draft' })
})
}
@@ -35,3 +72,70 @@ export function searchKnowledge(query: string, knowledgeBaseId?: number) {
})
})
}
export function listGovernedAssets(assetType: GovernedAssetType, status?: string) {
const query = new URLSearchParams({ asset_type: assetType })
if (status && status !== 'all') query.set('status', status)
return apiRequest<GovernedAsset[]>(`/knowledge/assets?${query}`)
}
export function updateGovernedAssetVersion(
publicId: string,
version: number,
content: Record<string, unknown>,
changeSummary: string
) {
return apiRequest<GovernedAssetVersion>(
`/knowledge/assets/${publicId}/versions/${version}`,
{
method: 'PATCH',
body: JSON.stringify({ content, change_summary: changeSummary })
}
)
}
export function submitGovernedAssetVersion(publicId: string, version: number) {
return apiRequest<GovernedAssetVersion>(
`/knowledge/assets/${publicId}/versions/${version}/submit`,
{ method: 'POST' }
)
}
export function reviewGovernedAssetVersion(
publicId: string,
version: number,
decision: 'approve' | 'reject',
comment: string
) {
return apiRequest<GovernedAssetVersion>(
`/knowledge/assets/${publicId}/versions/${version}/${decision}`,
{
method: 'POST',
body: JSON.stringify({ comment })
}
)
}
export function rollbackGovernedAsset(publicId: string, sourceVersion: number) {
return apiRequest<GovernedAssetVersion>(`/knowledge/assets/${publicId}/rollback`, {
method: 'POST',
body: JSON.stringify({
source_version: sourceVersion,
change_summary: `回滚自 v${sourceVersion}`
})
})
}
export function getGovernedAssetImpact(publicId: string) {
return apiRequest<AssetImpact>(`/knowledge/assets/${publicId}/impact`)
}
export function compareGovernedAssetVersions(
publicId: string,
left: number,
right: number
) {
return apiRequest<AssetVersionComparison>(
`/knowledge/assets/${publicId}/compare?left=${left}&right=${right}`
)
}