import {
type IXpertViewExtensionProvider,
ViewExtensionProvider
} from '@xpert-ai/plugin-sdk'
import type {
XpertExtensionViewManifest,
XpertResolvedViewHostContext,
XpertViewDataResult,
XpertViewQuery
} from '@xpert-ai/contracts'
@ViewExtensionProvider(PROVIDER_KEY)
export class ContractReviewViewProvider
implements IXpertViewExtensionProvider
{
constructor(private readonly reviewService: ContractReviewService) {}
supports(context: XpertResolvedViewHostContext) {
return context.hostType === 'agent'
}
getViewManifests(
_context: XpertResolvedViewHostContext,
slot: string
): XpertExtensionViewManifest[] {
if (slot !== 'agent.workbench.main') return []
return [
{
key: VIEW_KEY,
title: { en_US: 'Contract Review', zh_Hans: '合同审核' },
description: {
en_US: 'Review extracted contract data and approve changes.',
zh_Hans: '审核合同抽取结果并确认变更。'
},
hostType: 'agent',
slot,
source: {
provider: PROVIDER_KEY,
plugin: PLUGIN_NAME
},
activation: {
requiredFeatures: [REVIEW_FEATURE]
},
refreshable: true,
view: {
type: 'remote_component',
runtime: 'react',
protocolVersion: 1,
component: {
isolation: 'iframe',
entry: REMOTE_ENTRY_KEY
},
dataSource: { mode: 'platform' }
},
dataSource: {
mode: 'platform',
querySchema: {
supportsPagination: true,
supportsSearch: true,
supportsSelection: true,
supportsParameters: true,
defaultPageSize: 20
},
cache: { enabled: false }
},
parameters: [
{
key: 'status',
label: { en_US: 'Status', zh_Hans: '状态' },
type: 'string'
}
],
actions: [
{
key: 'approve_contract',
label: { en_US: 'Approve', zh_Hans: '批准' },
placement: 'row',
actionType: 'invoke',
transport: 'json',
permissions: ['contract.review.approve']
}
],
hostEvents: {
subscriptions: [
{
key: 'contract-mutated',
event: 'assistant.tool.completed',
filter: {
sources: ['chatkit'],
toolNames: ['contract_update', 'contract_approve']
},
action: { type: 'forward', debounceMs: 800 }
}
]
}
}
]
}
getViewData(
context: XpertResolvedViewHostContext,
viewKey: string,
query: XpertViewQuery
): Promise<XpertViewDataResult> {
return this.reviewService.getViewData(context, viewKey, query)
}
}