feat: 新增归档中心页面并完善知识库与报销查询能力
新增前端归档中心视图及相关工具函数,扩充知识库文档分类和 提取器支持多种格式,增强编排器报销查询的多维度检索,优 化本体规则和用户代理审核消息,前端完善报销创建和审批详 情交互细节,补充单元测试覆盖。
This commit is contained in:
@@ -181,12 +181,26 @@ const REVIEW_DRAWER_MODE_REVIEW = 'review'
|
||||
const REVIEW_DRAWER_MODE_DOCUMENTS = 'documents'
|
||||
const REVIEW_DRAWER_MODE_RISK = 'risk'
|
||||
const REVIEW_DRAWER_MODE_FLOW = 'flow'
|
||||
const REVIEW_PANEL_SCOPE_OVERVIEW = 'overview'
|
||||
const REVIEW_PANEL_SCOPE_DOCUMENTS = 'documents'
|
||||
const REVIEW_PANEL_SCOPE_RISK = 'risk'
|
||||
const FLOW_STEP_STATUS_PENDING = 'pending'
|
||||
const FLOW_STEP_STATUS_RUNNING = 'running'
|
||||
const FLOW_STEP_STATUS_COMPLETED = 'completed'
|
||||
const FLOW_STEP_STATUS_FAILED = 'failed'
|
||||
const DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS = ['历史报销画像', '用户画像', '制度注意事项', '制度注意']
|
||||
|
||||
function normalizeReviewPanelScope(scope) {
|
||||
const normalized = String(scope || '').trim()
|
||||
return [REVIEW_PANEL_SCOPE_OVERVIEW, REVIEW_PANEL_SCOPE_DOCUMENTS, REVIEW_PANEL_SCOPE_RISK].includes(normalized)
|
||||
? normalized
|
||||
: ''
|
||||
}
|
||||
|
||||
function canExposeReviewPanelScope(scope) {
|
||||
return Boolean(normalizeReviewPanelScope(scope))
|
||||
}
|
||||
|
||||
function buildBusinessTimeContextFromReviewValues(values = {}) {
|
||||
return buildBusinessTimeContextFromReviewValuesModel(values)
|
||||
}
|
||||
@@ -413,11 +427,13 @@ function buildReviewRiskItems(reviewPayload) {
|
||||
.filter(Boolean)
|
||||
}
|
||||
|
||||
function buildReviewRiskConversationText(item) {
|
||||
function buildReviewRiskConversationText(item, detailTarget = {}) {
|
||||
const title = String(item?.title || '风险提示').trim()
|
||||
const summary = String(item?.summary || '').trim()
|
||||
const detail = String(item?.detail || '').trim()
|
||||
const suggestion = String(item?.suggestion || '').trim()
|
||||
const detailHref = String(detailTarget?.href || '').trim()
|
||||
const detailLabel = String(detailTarget?.label || '').trim() || '进入该单据详情重新填写'
|
||||
const lines = [`${title}`]
|
||||
|
||||
if (summary) {
|
||||
@@ -429,6 +445,9 @@ function buildReviewRiskConversationText(item) {
|
||||
if (suggestion) {
|
||||
lines.push('', `修改建议:${suggestion}`)
|
||||
}
|
||||
if (detailHref) {
|
||||
lines.push('', `[${detailLabel}](${detailHref})`)
|
||||
}
|
||||
return lines.join('\n')
|
||||
}
|
||||
|
||||
@@ -470,6 +489,10 @@ export default {
|
||||
requestContext: {
|
||||
type: Object,
|
||||
default: null
|
||||
},
|
||||
invalidatedDraftClaimId: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
emits: ['close', 'draft-saved'],
|
||||
@@ -484,10 +507,10 @@ export default {
|
||||
const composerDraft = ref('')
|
||||
const submitting = ref(false)
|
||||
const workbenchVisible = ref(false)
|
||||
const closeAfterBusy = ref(false)
|
||||
const linkedRequest = computed(() => sanitizeRequest(props.requestContext))
|
||||
const hotKnowledgeQuestions = HOT_KNOWLEDGE_QUESTIONS
|
||||
let sessionRuntimeRefs = {}
|
||||
const uploadDecisionDialogOpen = ref(false)
|
||||
const {
|
||||
activeSessionType,
|
||||
messages,
|
||||
@@ -511,7 +534,6 @@ export default {
|
||||
linkedRequest,
|
||||
toast,
|
||||
composerDraft,
|
||||
uploadDecisionDialogOpen,
|
||||
adjustComposerTextareaHeight,
|
||||
scrollToBottom,
|
||||
getSessionRuntimeRefs: () => sessionRuntimeRefs
|
||||
@@ -568,8 +590,21 @@ export default {
|
||||
FLOW_STEP_STATUS_COMPLETED,
|
||||
FLOW_STEP_STATUS_FAILED
|
||||
})
|
||||
const hasScopedReviewPayload = computed(() => {
|
||||
const agent = currentInsight.value.agent || null
|
||||
if (agent?.reviewPayload && canExposeReviewPanelScope(agent.reviewPanelScope)) {
|
||||
return true
|
||||
}
|
||||
if (currentInsight.value.intent === 'agent' && agent) {
|
||||
return false
|
||||
}
|
||||
return messages.value.some((item) =>
|
||||
item.role === 'assistant' && item.reviewPayload && canExposeReviewPanelScope(item.reviewPanelScope)
|
||||
)
|
||||
})
|
||||
const hasQueryInsight = computed(() => Boolean(currentInsight.value.agent?.queryPayload))
|
||||
const hasInsightPanelContent = computed(
|
||||
() => isKnowledgeSession.value || currentInsight.value.intent !== 'welcome' || flowSteps.value.length > 0
|
||||
() => isKnowledgeSession.value || hasScopedReviewPayload.value || hasQueryInsight.value || flowSteps.value.length > 0
|
||||
)
|
||||
const showInsightPanel = computed(() => hasInsightPanelContent.value && !insightPanelCollapsed.value)
|
||||
const insightPanelToggleLabel = computed(() =>
|
||||
@@ -604,11 +639,31 @@ export default {
|
||||
() => Boolean(conversationId.value) || messages.value.some((item) => item.role === 'user')
|
||||
)
|
||||
const latestReviewMessage = computed(() =>
|
||||
[...messages.value].reverse().find((item) => item.role === 'assistant' && item.reviewPayload) ?? null
|
||||
)
|
||||
const activeReviewPayload = computed(
|
||||
() => currentInsight.value.agent?.reviewPayload || latestReviewMessage.value?.reviewPayload || null
|
||||
[...messages.value].reverse().find((item) =>
|
||||
item.role === 'assistant' && item.reviewPayload && canExposeReviewPanelScope(item.reviewPanelScope)
|
||||
) ?? null
|
||||
)
|
||||
const activeReviewPanelScope = computed(() => {
|
||||
const agent = currentInsight.value.agent || null
|
||||
const agentScope = normalizeReviewPanelScope(agent?.reviewPanelScope)
|
||||
if (agent?.reviewPayload && agentScope) {
|
||||
return agentScope
|
||||
}
|
||||
if (currentInsight.value.intent === 'agent' && agent) {
|
||||
return ''
|
||||
}
|
||||
return normalizeReviewPanelScope(latestReviewMessage.value?.reviewPanelScope)
|
||||
})
|
||||
const activeReviewPayload = computed(() => {
|
||||
const agent = currentInsight.value.agent || null
|
||||
if (agent?.reviewPayload && normalizeReviewPanelScope(agent.reviewPanelScope)) {
|
||||
return agent.reviewPayload
|
||||
}
|
||||
if (currentInsight.value.intent === 'agent' && agent) {
|
||||
return null
|
||||
}
|
||||
return latestReviewMessage.value?.reviewPayload || null
|
||||
})
|
||||
const reviewRiskBriefResolver = (payload) => resolveReviewRiskBriefs(payload)
|
||||
const buildReviewRiskSummary = (payload) => buildReviewRiskSummaryModel(payload, reviewRiskBriefResolver)
|
||||
const {
|
||||
@@ -634,6 +689,7 @@ export default {
|
||||
reviewRiskSummary,
|
||||
reviewRiskItems,
|
||||
reviewRiskEmpty,
|
||||
reviewOverviewDrawerAvailable,
|
||||
reviewDocumentDrawerAvailable,
|
||||
reviewRiskDrawerAvailable,
|
||||
reviewFlowDrawerAvailable,
|
||||
@@ -671,6 +727,7 @@ export default {
|
||||
closeDocumentPreview
|
||||
} = useTravelReimbursementReviewDrawer({
|
||||
activeReviewPayload,
|
||||
activeReviewPanelScope,
|
||||
reviewFilePreviews,
|
||||
flowSteps,
|
||||
submitting,
|
||||
@@ -709,6 +766,7 @@ export default {
|
||||
mergeBusinessTimeIntoExtraContext,
|
||||
syncComposerBusinessTimeToReviewCard,
|
||||
resolveComposerSubmitText,
|
||||
resolveComposerDisplaySubmitText,
|
||||
toggleComposerDatePicker,
|
||||
closeComposerDatePicker,
|
||||
setComposerDateMode,
|
||||
@@ -853,6 +911,7 @@ export default {
|
||||
refreshFlowRunDetail,
|
||||
rememberFilePreviews,
|
||||
replaceMessage,
|
||||
resolveComposerDisplaySubmitText,
|
||||
resetFlowRun,
|
||||
resolveComposerSubmitText,
|
||||
reviewInlineForm,
|
||||
@@ -868,7 +927,6 @@ export default {
|
||||
startSemanticFlowPreview,
|
||||
submitting,
|
||||
syncComposerFilesToDraft,
|
||||
uploadDecisionDialogOpen,
|
||||
toast
|
||||
})
|
||||
const canSubmit = computed(
|
||||
@@ -906,8 +964,8 @@ export default {
|
||||
}
|
||||
])
|
||||
watch(
|
||||
() => activeReviewPayload.value,
|
||||
(payload) => {
|
||||
() => [activeReviewPayload.value, activeReviewPanelScope.value],
|
||||
([payload]) => {
|
||||
rememberFilePreviews(buildReviewFilePreviewsFromReviewPayload(payload))
|
||||
// reviewDrawerMode.value = resolveReviewRiskBriefs(payload).length
|
||||
// ? REVIEW_DRAWER_MODE_RISK
|
||||
@@ -989,11 +1047,51 @@ export default {
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
watch(
|
||||
() => props.invalidatedDraftClaimId,
|
||||
(claimId) => {
|
||||
clearExpenseSessionForDeletedClaim(claimId)
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
watch(
|
||||
() => workbenchVisible.value,
|
||||
(visible) => {
|
||||
if (visible) {
|
||||
scrollToBottom()
|
||||
} else {
|
||||
maybeFinalizeDeferredClose()
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
watch(
|
||||
() => [submitting.value, reviewActionBusy.value, sessionSwitchBusy.value, workbenchVisible.value],
|
||||
() => {
|
||||
maybeFinalizeDeferredClose()
|
||||
}
|
||||
)
|
||||
|
||||
watch(
|
||||
() => messages.value.length,
|
||||
() => {
|
||||
if (!workbenchVisible.value) {
|
||||
return
|
||||
}
|
||||
scrollToBottom()
|
||||
}
|
||||
)
|
||||
|
||||
onMounted(() => {
|
||||
document.addEventListener('click', handleComposerDatePickerOutside)
|
||||
startFlowTick()
|
||||
nextTick(() => {
|
||||
workbenchVisible.value = true
|
||||
nextTick(() => {
|
||||
adjustComposerTextareaHeight()
|
||||
scrollToBottom()
|
||||
})
|
||||
})
|
||||
void clearKnowledgeSessionOnEntry()
|
||||
currentInsight.value =
|
||||
@@ -1008,11 +1106,6 @@ export default {
|
||||
toast(`一次最多上传 ${MAX_ATTACHMENTS} 份附件,已保留前 ${MAX_ATTACHMENTS} 份。`)
|
||||
}
|
||||
submitComposer()
|
||||
} else {
|
||||
nextTick(() => {
|
||||
adjustComposerTextareaHeight()
|
||||
scrollToBottom()
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1023,8 +1116,31 @@ export default {
|
||||
})
|
||||
|
||||
function scrollToBottom() {
|
||||
if (!messageListRef.value) return
|
||||
messageListRef.value.scrollTop = messageListRef.value.scrollHeight
|
||||
const scrollOnce = () => {
|
||||
const list = messageListRef.value
|
||||
if (!list) {
|
||||
return false
|
||||
}
|
||||
list.scrollTop = list.scrollHeight
|
||||
return true
|
||||
}
|
||||
|
||||
nextTick(() => {
|
||||
if (scrollOnce()) {
|
||||
return
|
||||
}
|
||||
requestAnimationFrame(() => {
|
||||
scrollOnce()
|
||||
requestAnimationFrame(scrollOnce)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function handleAssistantModalAfterEnter() {
|
||||
scrollToBottom()
|
||||
requestAnimationFrame(() => {
|
||||
scrollToBottom()
|
||||
})
|
||||
}
|
||||
|
||||
function resetCurrentSessionState() {
|
||||
@@ -1034,6 +1150,31 @@ export default {
|
||||
resetFlowRun({ startedAt: 0, openDrawer: false })
|
||||
}
|
||||
|
||||
function clearExpenseSessionForDeletedClaim(claimId) {
|
||||
const normalizedClaimId = String(claimId || '').trim()
|
||||
if (!normalizedClaimId) {
|
||||
return
|
||||
}
|
||||
|
||||
const expenseSnapshot = sessionSnapshots.value[SESSION_TYPE_EXPENSE]
|
||||
const snapshotMatchesDeletedClaim = String(expenseSnapshot?.draftClaimId || '').trim() === normalizedClaimId
|
||||
const currentMatchesDeletedClaim =
|
||||
activeSessionType.value === SESSION_TYPE_EXPENSE
|
||||
&& String(resolveActiveClaimId() || '').trim() === normalizedClaimId
|
||||
if (!snapshotMatchesDeletedClaim && !currentMatchesDeletedClaim) {
|
||||
return
|
||||
}
|
||||
|
||||
clearAssistantSessionSnapshot(resolveCurrentUserId(), SESSION_TYPE_EXPENSE)
|
||||
if (currentMatchesDeletedClaim) {
|
||||
resetCurrentSessionState()
|
||||
toast('该草稿单据已删除,相关财务助手会话已清空。')
|
||||
return
|
||||
}
|
||||
|
||||
sessionSnapshots.value[SESSION_TYPE_EXPENSE] = buildEmptySessionState(SESSION_TYPE_EXPENSE)
|
||||
}
|
||||
|
||||
function adjustComposerTextareaHeight() {
|
||||
if (!composerTextareaRef.value) return
|
||||
|
||||
@@ -1071,31 +1212,6 @@ export default {
|
||||
messages.value.splice(index, 1, nextMessage)
|
||||
}
|
||||
|
||||
function closeUploadDecisionDialog() {
|
||||
if (submitting.value || reviewActionBusy.value) return
|
||||
uploadDecisionDialogOpen.value = false
|
||||
}
|
||||
|
||||
async function continueExistingUpload() {
|
||||
if (submitting.value || reviewActionBusy.value) return
|
||||
uploadDecisionDialogOpen.value = false
|
||||
composerUploadIntent.value = 'continue_existing'
|
||||
await submitComposer({
|
||||
uploadDisposition: 'continue_existing',
|
||||
skipUploadDecisionPrompt: true
|
||||
})
|
||||
}
|
||||
|
||||
async function createNewUploadDocument() {
|
||||
if (submitting.value || reviewActionBusy.value) return
|
||||
uploadDecisionDialogOpen.value = false
|
||||
composerUploadIntent.value = ''
|
||||
await submitComposer({
|
||||
uploadDisposition: 'new_document',
|
||||
skipUploadDecisionPrompt: true
|
||||
})
|
||||
}
|
||||
|
||||
async function runShortcut(shortcut) {
|
||||
if (shortcut?.action === 'switch_view' && shortcut?.targetSessionType) {
|
||||
await switchSessionType(shortcut.targetSessionType)
|
||||
@@ -1218,6 +1334,9 @@ export default {
|
||||
}
|
||||
|
||||
function switchToReviewOverviewDrawer() {
|
||||
if (!reviewOverviewDrawerAvailable.value) {
|
||||
return
|
||||
}
|
||||
switchReviewDrawerMode(REVIEW_DRAWER_MODE_REVIEW)
|
||||
}
|
||||
|
||||
@@ -1255,20 +1374,98 @@ export default {
|
||||
|
||||
function appendReviewRiskBriefToConversation(item) {
|
||||
if (!item) return
|
||||
messages.value.push(createMessage('assistant', buildReviewRiskConversationText(item), [], {
|
||||
messages.value.push(createMessage('assistant', buildReviewRiskConversationText(item, resolveReviewRiskDetailTarget()), [], {
|
||||
meta: [item.sourceLabel || item.levelLabel || '风险提示'],
|
||||
metaTone: item.level || 'low'
|
||||
}))
|
||||
nextTick(scrollToBottom)
|
||||
}
|
||||
|
||||
function appendExpenseQueryRiskToConversation(record, risk) {
|
||||
if (!record || !risk) return
|
||||
const claimId = String(record.claimId || '').trim()
|
||||
const claimNo = String(record.claimNo || '该单据').trim()
|
||||
const route = claimId
|
||||
? router.resolve({
|
||||
name: 'app-request-detail',
|
||||
params: { requestId: claimId }
|
||||
})
|
||||
: null
|
||||
messages.value.push(createMessage(
|
||||
'assistant',
|
||||
buildReviewRiskConversationText(
|
||||
{
|
||||
title: `${claimNo} ${risk.levelLabel || '风险提示'}:${risk.title || '风险提示'}`,
|
||||
summary: risk.summary,
|
||||
detail: risk.detail,
|
||||
suggestion: '请进入单据详情核对费用明细、票据附件和附加说明;如属于合理例外,请补充业务说明后再继续流程。',
|
||||
sourceLabel: risk.levelLabel,
|
||||
level: risk.level
|
||||
},
|
||||
route?.href
|
||||
? {
|
||||
href: route.href,
|
||||
label: `进入 ${claimNo} 详情重新填写`
|
||||
}
|
||||
: {}
|
||||
),
|
||||
[],
|
||||
{
|
||||
meta: [`${claimNo} 风险详情`],
|
||||
metaTone: risk.level || 'medium'
|
||||
}
|
||||
))
|
||||
nextTick(scrollToBottom)
|
||||
}
|
||||
|
||||
function resolveReviewRiskDetailTarget() {
|
||||
const latestDraftMessage = [...messages.value].reverse().find((item) => item?.draftPayload)
|
||||
const candidates = [
|
||||
currentInsight.value.agent?.draftPayload,
|
||||
latestReviewMessage.value?.draftPayload,
|
||||
latestDraftMessage?.draftPayload,
|
||||
linkedRequest.value
|
||||
].filter(Boolean)
|
||||
const claimTarget = candidates.find((item) => String(item?.claim_id || item?.claimId || item?.id || '').trim())
|
||||
const claimId = String(claimTarget?.claim_id || claimTarget?.claimId || claimTarget?.id || draftClaimId.value || resolveActiveClaimId() || '').trim()
|
||||
if (!claimId) {
|
||||
return {}
|
||||
}
|
||||
const claimNoTarget = candidates.find((item) => String(item?.claim_no || item?.claimNo || item?.documentNo || '').trim())
|
||||
const claimNo = String(claimNoTarget?.claim_no || claimNoTarget?.claimNo || claimNoTarget?.documentNo || '').trim()
|
||||
const route = router.resolve({
|
||||
name: 'app-request-detail',
|
||||
params: { requestId: claimId }
|
||||
})
|
||||
return {
|
||||
href: route.href,
|
||||
label: claimNo ? `进入 ${claimNo} 详情重新填写` : '进入该单据详情重新填写'
|
||||
}
|
||||
}
|
||||
|
||||
function isWorkbenchBusy() {
|
||||
return submitting.value || reviewActionBusy.value || sessionSwitchBusy.value
|
||||
}
|
||||
|
||||
function maybeFinalizeDeferredClose() {
|
||||
if (!closeAfterBusy.value || workbenchVisible.value || isWorkbenchBusy()) {
|
||||
return
|
||||
}
|
||||
closeAfterBusy.value = false
|
||||
emit('close')
|
||||
}
|
||||
|
||||
function requestCloseWorkbench() {
|
||||
persistSessionState()
|
||||
closeAfterBusy.value = isWorkbenchBusy()
|
||||
workbenchVisible.value = false
|
||||
}
|
||||
|
||||
function emitCloseAfterLeave() {
|
||||
if (closeAfterBusy.value && isWorkbenchBusy()) {
|
||||
return
|
||||
}
|
||||
closeAfterBusy.value = false
|
||||
emit('close')
|
||||
}
|
||||
|
||||
@@ -1317,7 +1514,6 @@ export default {
|
||||
pendingText: `已选择草稿 ${record.claimNo},正在识别并归集附件...`,
|
||||
files,
|
||||
uploadDisposition: 'continue_existing',
|
||||
skipUploadDecisionPrompt: true,
|
||||
extraContext: {
|
||||
draft_claim_id: claimId,
|
||||
selected_claim_id: claimId,
|
||||
@@ -1469,6 +1665,12 @@ export default {
|
||||
}
|
||||
|
||||
const href = String(anchor.getAttribute('href') || '').trim()
|
||||
if (href.startsWith('/app/')) {
|
||||
event.preventDefault()
|
||||
router.push(href)
|
||||
return
|
||||
}
|
||||
|
||||
if (href !== ATTACHMENT_ASSOCIATION_CONFIRM_HREF) {
|
||||
return
|
||||
}
|
||||
@@ -1492,8 +1694,25 @@ export default {
|
||||
return handleSaveDraftDirectlyInternal(message, actionType)
|
||||
}
|
||||
|
||||
function isDraftSavedReviewMessage(message) {
|
||||
if (!message?.reviewPayload) {
|
||||
return false
|
||||
}
|
||||
return Boolean(
|
||||
String(message?.draftPayload?.claim_no || message?.draftPayload?.claim_id || '').trim()
|
||||
|| String(draftClaimId.value || '').trim()
|
||||
|| String(resolveActiveClaimId() || '').trim()
|
||||
)
|
||||
}
|
||||
|
||||
function buildReviewPlainFollowupForMessage(message) {
|
||||
return buildReviewPlainFollowupCopy(message?.reviewPayload, {
|
||||
savedDraft: isDraftSavedReviewMessage(message)
|
||||
})
|
||||
}
|
||||
|
||||
function canUseInlineSaveDraft(message) {
|
||||
if (!message?.reviewPayload || message?.draftPayload?.claim_no) {
|
||||
if (!message?.reviewPayload || isDraftSavedReviewMessage(message)) {
|
||||
return false
|
||||
}
|
||||
return Boolean(resolveReviewSaveDraftAction(message.reviewPayload))
|
||||
@@ -1515,16 +1734,16 @@ export default {
|
||||
emit, ASSISTANT_DISPLAY_NAME, aiAvatar, userAvatar, fileInputRef, composerTextareaRef, messageListRef, composerDraft, composerDatePickerOpen, composerDateMode, composerSingleDate, composerRangeStartDate, composerRangeEndDate, composerBusinessTimeTags, composerCanApplyDateSelection,
|
||||
toggleComposerDatePicker, closeComposerDatePicker, setComposerDateMode, handleComposerDateInputChange, removeComposerBusinessTimeTag, flowSteps, flowRunId, flowRefreshBusy, completedFlowStepCount, flowOverallStatusTone, flowOverallStatusText, flowTotalDurationText,
|
||||
attachedFiles, composerFilesExpanded, visibleAttachedFiles, hiddenAttachedFileCount, submitting, sessionSwitchBusy, messages, currentInsight, linkedRequest, canSubmit, activeSessionType, isKnowledgeSession, hotKnowledgeQuestions,
|
||||
hasInsightPanelContent, showInsightPanel, insightPanelToggleLabel, composerPlaceholder, currentIntentLabel, canDeleteCurrentSession, latestReviewMessage, activeReviewPayload, activeReviewFilePreviews, reviewDrawerMode, isReviewOverviewDrawer, isReviewDocumentDrawer, isReviewRiskDrawer, isReviewFlowDrawer,
|
||||
reviewDrawerTitle, reviewDocumentDrawerAvailable, reviewRiskDrawerAvailable, reviewFlowDrawerAvailable, reviewDocumentDrawerLabel, reviewDocumentDrawerIcon, reviewRiskDrawerLabel, reviewRiskDrawerIcon, reviewFlowDrawerLabel, reviewFlowDrawerIcon, activeReviewDocument, activeReviewDocumentIndex, activeReviewDocumentPreview, canPreviewActiveReviewDocument,
|
||||
hasInsightPanelContent, showInsightPanel, insightPanelToggleLabel, composerPlaceholder, currentIntentLabel, canDeleteCurrentSession, latestReviewMessage, activeReviewPayload, activeReviewPanelScope, activeReviewFilePreviews, reviewDrawerMode, isReviewOverviewDrawer, isReviewDocumentDrawer, isReviewRiskDrawer, isReviewFlowDrawer,
|
||||
reviewDrawerTitle, reviewOverviewDrawerAvailable, reviewDocumentDrawerAvailable, reviewRiskDrawerAvailable, reviewFlowDrawerAvailable, reviewDocumentDrawerLabel, reviewDocumentDrawerIcon, reviewRiskDrawerLabel, reviewRiskDrawerIcon, reviewFlowDrawerLabel, reviewFlowDrawerIcon, activeReviewDocument, activeReviewDocumentIndex, activeReviewDocumentPreview, canPreviewActiveReviewDocument,
|
||||
reviewIntentText, reviewFactCards, reviewCategoryOptions, reviewOtherCategoryOptions, reviewSelectedOtherCategory, reviewInlineDirty, reviewInlineForm, reviewInlineEditorKey, reviewInlineErrors, reviewOtherCategoryOpen, reviewInlinePendingFiles, DATE_INPUT_FORMAT, REVIEW_SCENE_OTHER_OPTION, REVIEW_SCENE_OPTIONS, REVIEW_OTHER_CATEGORY_OPTIONS,
|
||||
workbenchVisible, reviewPanelConfidence, reviewRiskSummary, reviewRiskItems, reviewRiskEmpty, recognizedNarratives, reviewRecognitionNotes, reviewDocumentSummaries, reviewDocumentCount, reviewDocumentDirty, reviewHasUnsavedChanges, uploadDecisionDialogOpen,
|
||||
workbenchVisible, reviewPanelConfidence, reviewRiskSummary, reviewRiskItems, reviewRiskEmpty, recognizedNarratives, reviewRecognitionNotes, reviewDocumentSummaries, reviewDocumentCount, reviewDocumentDirty, reviewHasUnsavedChanges,
|
||||
travelCalculatorOpen, travelCalculatorBusy, travelCalculatorError, travelCalculatorResult, travelCalculatorForm, travelCalculatorCanSubmit, deleteSessionDialogOpen, reviewActionBusy, deleteSessionBusy, documentPreviewDialog, shortcuts,
|
||||
resolveReviewMissingSlotCards, resolveReviewRiskBriefs, buildReviewHeadline, buildReviewSubline, buildReviewStateLabel, buildReviewStateTone, buildReviewPlainFollowupCopy, resolveReviewFooterActions, resolveReviewSaveDraftAction, buildReviewPrimaryButtonLabel, buildReviewMainMessageText,
|
||||
resolveReviewMissingSlotCards, resolveReviewRiskBriefs, buildReviewHeadline, buildReviewSubline, buildReviewStateLabel, buildReviewStateTone, buildReviewPlainFollowupCopy, buildReviewPlainFollowupForMessage, resolveReviewFooterActions, resolveReviewSaveDraftAction, buildReviewPrimaryButtonLabel, buildReviewMainMessageText,
|
||||
renderMarkdown, buildExpenseQueryWindowLabel, buildExpenseQueryHint, getExpenseQueryActivePage, getExpenseQueryTotalPages, getExpenseQueryVisibleRecords, resolveDocumentPreview, triggerFileUpload, applyComposerDateSelection, handleFilesChange, handleComposerInput, handleComposerEnter, runShortcut, runWelcomeQuickAction: runShortcut, handleSuggestedAction, isSuggestedActionSelected, askHotKnowledgeQuestion, resolveKnowledgeRankLabel, resolveKnowledgeRankTone,
|
||||
refreshFlowRunDetail, formatFlowStepDuration, resolveFlowStepStatusLabel, resolveFlowStepDetail, toggleInsightPanel, openTravelCalculator, toggleTravelCalculator, closeTravelCalculator, submitTravelCalculator, switchToReviewOverviewDrawer, toggleReviewDocumentDrawer, toggleReviewRiskDrawer, toggleReviewFlowDrawer, toggleAttachedFilesExpanded, removeAttachedFile, clearAttachedFiles,
|
||||
requestCloseWorkbench, emitCloseAfterLeave, openExpenseQueryRecord, handleExpenseQueryRecordClick, setExpenseQueryPage, shiftExpenseQueryPage, openDeleteSessionDialog, closeDeleteSessionDialog, confirmDeleteCurrentSession, closeUploadDecisionDialog, continueExistingUpload, createNewUploadDocument, openInlineReviewEditor, closeInlineReviewEditor, commitInlineReviewEditor, clearInlineReviewFieldError, selectInlineScene, selectReviewCategory, selectReviewOtherCategory,
|
||||
queryDraftByClaimNo, appendReviewRiskBriefToConversation, goReviewDocument, openActiveReviewDocumentPreview, closeDocumentPreview, saveInlineReviewChanges, submitComposer, handleAssistantMarkdownClick, handleReviewAction, handleSaveDraftDirectly, canUseInlineSaveDraft, handleInlineSaveDraft
|
||||
requestCloseWorkbench, emitCloseAfterLeave, handleAssistantModalAfterEnter, openExpenseQueryRecord, handleExpenseQueryRecordClick, setExpenseQueryPage, shiftExpenseQueryPage, openDeleteSessionDialog, closeDeleteSessionDialog, confirmDeleteCurrentSession, openInlineReviewEditor, closeInlineReviewEditor, commitInlineReviewEditor, clearInlineReviewFieldError, selectInlineScene, selectReviewCategory, selectReviewOtherCategory,
|
||||
queryDraftByClaimNo, appendReviewRiskBriefToConversation, appendExpenseQueryRiskToConversation, goReviewDocument, openActiveReviewDocumentPreview, closeDocumentPreview, saveInlineReviewChanges, submitComposer, handleAssistantMarkdownClick, handleReviewAction, handleSaveDraftDirectly, isDraftSavedReviewMessage, canUseInlineSaveDraft, handleInlineSaveDraft
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user