// CIL[BEGIN chunk_id="custom_workbench_escalate_module_header_1784572423" type="module_header" identity="module_header" parent="none"] // CIL[DOC-MACRO purpose="Escalate a Cortex support ticket into a Workbench engineering work item"] // CIL[DOC-RESPONSIBILITY responsibility="Create or reuse a Workbench bug work item from a Cortex support ticket and link supporting evidence"] // CIL[DOC-CONTEXT module="workbench.functions.custom_workbench-escalate" layer="function" related_files="[\"custom/apps/cortex/pages/support/TicketDetailPage.tsx\", \"custom/apps/workbench/seed/types.json\", \"custom/apps/workbench/seed/link-types.json\"]"] // CIL[DOC-CONTRACT inputs="ticket_id (Cortex support ticket UUID)" outputs="{ work_item_id, created, existing }" errors="missing_ticket_id, ticket_not_found, workbench_type_missing" side_effects="creates workbench_work_item and links through admin-data"] // CIL[DOC-MICRO logic_summary="Checks for an existing escalation, resolves type and link type IDs, reads the support ticket and case analysis, creates a workbench_work_item bug, and links it to the ticket, case analysis, KB, and CIL chunks through admin-data" notable_decisions=["Reuses existing escalation if workbench_escalated_to link already exists", "Work item and link creation now route through admin-data"]"] // CIL[DOC-CONFIDENCE pass="first" score="0.95" flags="none"] // CIL[DOC-STABILITY stability="experimental"] // CIL[DOC-AUDIENCE audience="developer"] // CIL[DOC-VECTOR type="context" content="Layer: function. Direct callers: 0. Direct calls: 1." status="ready"] // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 2 (TicketDetailPage, Workbench work items)." status="ready"] import { createHandler } from './_shared/middleware' import { resolveTypeId, resolveLinkTypeId } from './_shared/resolve-ids' import { create as adminCreate, list as adminList } from './admin-data' function adminDataList(ctx: any, entity: string, filters: Record) { return adminList({ ...ctx, query: { ...((ctx as any).query || {}), entity, ...filters } } as any, {}) } // CIL[END chunk_id="custom_workbench_escalate_module_header_1784572423"] // CIL[BEGIN chunk_id="custom_workbench_escalate_escalaterequest_1784572423" type="interface" identity="EscalateRequest" parent="none"] interface EscalateRequest { ticket_id: string } // CIL[END chunk_id="custom_workbench_escalate_escalaterequest_1784572423"] // CIL[BEGIN chunk_id="custom_workbench_escalate_upsertlink_1784572423" type="function" identity="upsertLink" parent="none"] async function upsertLink( ctx: any, linkTypeId: string, sourceType: string, sourceId: string, targetType: string, targetId: string, linkSlug: string ): Promise { const existingResult = await adminDataList(ctx, 'links', { source_id: sourceId, target_id: targetId, link_type_id: linkTypeId, limit: '1', }) const existing = Array.isArray(existingResult) ? existingResult[0] : (existingResult as any)?.data?.[0] if (existing?.id) return await adminCreate(ctx, { entity: 'links', type_slug: 'link', link_type_id: linkTypeId, link_type: linkSlug, source_type: sourceType, source_id: sourceId, target_type: targetType, target_id: targetId, } as any) } // CIL[END chunk_id="custom_workbench_escalate_upsertlink_1784572423"] // CIL[BEGIN chunk_id="custom_workbench_escalate_findexistingescalation_1784572423" type="function" identity="findExistingEscalation" parent="none"] async function findExistingEscalation(ctx: any, ticketId: string, linkTypeId: string | null): Promise { if (!linkTypeId) return null const result = await adminDataList(ctx, 'links', { source_id: ticketId, link_type_id: linkTypeId, source_type: 'items', target_type: 'items', limit: '1', }) const link = Array.isArray(result) ? result[0] : (result as any)?.data?.[0] return link?.target_id ?? null } // CIL[END chunk_id="custom_workbench_escalate_findexistingescalation_1784572423"] // CIL[BEGIN chunk_id="custom_workbench_escalate_escalate_1784572423" type="function" identity="escalate" parent="none"] export const escalate = createHandler(async (ctx, body) => { const { ticket_id } = (body || {}) as EscalateRequest if (!ticket_id) { const e: any = new Error('ticket_id is required') e.statusCode = 400 throw e } if (!ctx.accountId) { const e: any = new Error('Account context required') e.statusCode = 400 throw e } const ticketResult = await adminDataList(ctx, 'items', { id: ticket_id, limit: '1' }) const ticket = Array.isArray(ticketResult) ? ticketResult[0] : (ticketResult as any)?.data?.[0] if (!ticket) { const e: any = new Error('Support ticket not found') e.statusCode = 404 throw e } let workbenchWorkItemTypeId: string | null let linkTypeIds: Record = {} try { workbenchWorkItemTypeId = await resolveTypeId('item', 'workbench_work_item') linkTypeIds = { escalated_to: await resolveLinkTypeId('workbench_escalated_to').catch(() => null), originated_from: await resolveLinkTypeId('workbench_originated_from').catch(() => null), informed_by: await resolveLinkTypeId('workbench_informed_by').catch(() => null), concerns_chunk: await resolveLinkTypeId('workbench_concerns_chunk').catch(() => null), } } catch (err: any) { const e: any = new Error(`Workbench type resolution failed: ${err.message}`) e.statusCode = 500 throw e } if (!workbenchWorkItemTypeId) { const e: any = new Error('workbench_work_item type not found') e.statusCode = 500 throw e } const existingWorkItemId = await findExistingEscalation(ctx, ticket_id, linkTypeIds.escalated_to) if (existingWorkItemId) { return { work_item_id: existingWorkItemId, existing: true, created: false } } const caseAnalysisId = ticket.data?.case_analysis_id ?? ticket.data?.ca_analysis_id ?? null const kbArticleId = ticket.data?.kb_proposed_kb_id ?? ticket.data?.kb_article_id ?? null const cilProjectId = ticket.data?.cil_project_id ?? null const cilChunkIds = ticket.data?.cil_retrieved_chunks ?? ticket.data?.cil_chunks ?? [] const workItemData = { work_type: 'bug', priority: ticket.data?.priority || 'p2', severity: ticket.data?.severity || 'sev3', team: 'unassigned', cortex_ticket_id: ticket_id, cased_analysis_id: caseAnalysisId, kb_article_id: kbArticleId, cil_project_id: cilProjectId, cil_snapshot: { project_id: cilProjectId, chunk_ids: Array.isArray(cilChunkIds) ? cilChunkIds : [], captured_at: new Date().toISOString(), }, support_summary: ticket.description || '', ai_confidence: ticket.data?.aim_confidence_at_response ?? null, } const workItem = await adminCreate(ctx, { entity: 'items', type_slug: 'workbench_work_item', title: `Bug: ${ticket.title}`, description: ticket.description || '', status: 'triage', data: workItemData, } as any) const workItemId = (workItem as any)?.id ?? (workItem as any)?.data?.id if (!workItemId) { const e: any = new Error('Failed to create Workbench work item') e.statusCode = 500 throw e } if (linkTypeIds.escalated_to) { await upsertLink(ctx, linkTypeIds.escalated_to, 'items', ticket_id, 'items', workItemId, 'workbench_escalated_to') } if (linkTypeIds.originated_from) { await upsertLink(ctx, linkTypeIds.originated_from, 'items', workItemId, 'items', ticket_id, 'workbench_originated_from') } if (caseAnalysisId && linkTypeIds.informed_by) { await upsertLink(ctx, linkTypeIds.informed_by, 'items', workItemId, 'items', caseAnalysisId, 'workbench_informed_by') } if (kbArticleId && linkTypeIds.informed_by) { await upsertLink(ctx, linkTypeIds.informed_by, 'items', workItemId, 'items', kbArticleId, 'workbench_informed_by') } if (Array.isArray(cilChunkIds) && linkTypeIds.concerns_chunk) { for (const chunkId of cilChunkIds.slice(0, 20)) { if (!chunkId) continue await upsertLink(ctx, linkTypeIds.concerns_chunk, 'items', workItemId, 'items', chunkId, 'workbench_concerns_chunk') } } return { work_item_id: workItemId, created: true, existing: false } }) // CIL[END chunk_id="custom_workbench_escalate_escalate_1784572423"]