feat(web): AI 工作台多 task 串行推进与会话适配

- useWorkbenchAiApplicationPreviewFlow/useWorkbenchAiActionRouter/useWorkbenchAiCommandIntents 支持 task1 完成后自动推进 task2,确认按钮直接拉起申请预览,草稿/提交成功后继续推进下一 task
- workbenchAiIntentPlannerModel/workbenchAiMessageModel/workbenchAiCommandIntentModel 适配多 task 意图规划与消息结构
- aiApplicationPreviewActions/aiApplicationPrecheckModel/aiExpenseDraftModel/aiWorkbenchConversationStore 草稿与会话存储适配
- PersonalWorkbenchAiMode 与样式适配,更新 preview-actions/expense-draft/conversation-store/fast-preview/action-router/command-intent/intent-planner 测试
This commit is contained in:
caoxiaozhu
2026-06-26 22:42:23 +08:00
parent 5753899eb3
commit c4b5fcc067
22 changed files with 1171 additions and 144 deletions

View File

@@ -143,13 +143,37 @@ function normalizeServerApplicationSteps(rawSteps = []) {
return [...new Set(mappedSteps)]
}
function resolveModelTasks(rawPlan = {}) {
return Array.isArray(rawPlan?.tasks) ? rawPlan.tasks : []
}
function isModelTravelApplicationTask(task = {}) {
if (!task || typeof task !== 'object') {
return false
}
const taskType = String(task?.task_type || task?.taskType || '').trim()
const assignedAgent = String(task?.assigned_agent || task?.assignedAgent || '').trim()
return taskType === 'expense_application' || assignedAgent === 'application_assistant'
}
function findModelTravelApplicationTask(rawPlan = {}) {
const tasks = Array.isArray(rawPlan?.tasks) ? rawPlan.tasks : []
return tasks.find((task) => {
return resolveModelTasks(rawPlan).find(isModelTravelApplicationTask) || null
}
function resolveModelRemainingTasks(rawPlan = {}, selectedTask = null) {
const tasks = resolveModelTasks(rawPlan)
const selectedIndex = tasks.findIndex((task) => task === selectedTask)
if (selectedIndex < 0) {
return []
}
return tasks.slice(selectedIndex + 1).filter((task) => {
if (!task || typeof task !== 'object') {
return false
}
const taskType = String(task?.task_type || task?.taskType || '').trim()
const assignedAgent = String(task?.assigned_agent || task?.assignedAgent || '').trim()
return taskType === 'expense_application' || assignedAgent === 'application_assistant'
}) || null
return Boolean(taskType || assignedAgent)
})
}
function resolveCandidateFlows(rawPlan = {}) {
@@ -211,7 +235,7 @@ export function normalizeWorkbenchAiIntentPlan(rawPlan = {}, options = {}) {
task.requested_action ||
task.requestedAction ||
rawPlan.requested_action ||
rawPlan.requestedAction ||
rawPlan.requestedAction ||
''
).trim() || normalizePromptAction(prompt)
const serverSteps = normalizeServerApplicationSteps(task.action_steps || task.actionSteps)
@@ -226,7 +250,8 @@ export function normalizeWorkbenchAiIntentPlan(rawPlan = {}, options = {}) {
missingFields: Array.isArray(task.missing_fields || task.missingFields)
? task.missing_fields || task.missingFields
: [],
steps: serverSteps.length ? serverSteps : buildApplicationSteps(requestedAction)
steps: serverSteps.length ? serverSteps : buildApplicationSteps(requestedAction),
stewardRemainingTasks: resolveModelRemainingTasks(rawPlan, task)
}
}
@@ -275,7 +300,7 @@ export function resolveExecutableTravelApplicationPlan(plan = null) {
return null
}
const requestedSubmit = plan.steps.includes(WORKBENCH_AI_STEP_SUBMIT_APPLICATION)
return {
const request = {
expenseType: 'travel',
expenseTypeLabel: '差旅费',
sourceText: String(plan.sourceText || '').trim(),
@@ -285,6 +310,11 @@ export function resolveExecutableTravelApplicationPlan(plan = null) {
requestedSubmit,
submitRequiresConfirmation: requestedSubmit
}
const stewardRemainingTasks = Array.isArray(plan.stewardRemainingTasks) ? plan.stewardRemainingTasks : []
if (stewardRemainingTasks.length) {
request.stewardRemainingTasks = stewardRemainingTasks
}
return request
}
export function isLowConfidenceTravelApplicationPlan(plan = null) {