@claritylabs/cl-sdk 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application.d.mts +1 -1
- package/dist/application.d.ts +1 -1
- package/dist/application.js +1 -0
- package/dist/application.js.map +1 -1
- package/dist/application.mjs +1 -0
- package/dist/application.mjs.map +1 -1
- package/dist/{index-BzrY6OMD.d.mts → index-C9XfOdmx.d.mts} +9 -0
- package/dist/{index-BzrY6OMD.d.ts → index-C9XfOdmx.d.ts} +9 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +80 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -12
- package/dist/index.mjs.map +1 -1
- package/dist/storage-sqlite.js +1 -0
- package/dist/storage-sqlite.js.map +1 -1
- package/dist/storage-sqlite.mjs +1 -0
- package/dist/storage-sqlite.mjs.map +1 -1
- package/package.json +1 -1
package/dist/application.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/model-budget.ts","../src/core/concurrency.ts","../src/core/retry.ts","../src/prompts/application/classify.ts","../src/schemas/application.ts","../src/application/agents/classifier.ts","../src/prompts/application/field-extraction.ts","../src/application/field-ids.ts","../src/application/agents/field-extractor.ts","../src/prompts/application/auto-fill.ts","../src/application/agents/auto-filler.ts","../src/prompts/application/question-batch.ts","../src/application/agents/batcher.ts","../src/prompts/application/reply-intent.ts","../src/application/agents/reply-router.ts","../src/prompts/application/answer-parsing.ts","../src/application/agents/answer-parser.ts","../src/prompts/application/pdf-mapping.ts","../src/application/agents/lookup-filler.ts","../src/prompts/application/batch-email.ts","../src/application/agents/email-generator.ts","../src/core/quality.ts","../src/application/quality.ts","../src/application/workflow.ts","../src/source/schemas.ts","../src/schemas/lines-of-business.ts","../src/source/ids.ts","../src/source/extraction.ts","../src/application/question-graph.ts","../src/application/intake.ts","../src/application/coordinator.ts"],"sourcesContent":["export type ModelTaskKind =\n | \"extraction_classify\"\n | \"extraction_source_tree\"\n | \"extraction_operational_profile\"\n | \"extraction_page_map\"\n | \"extraction_focused\"\n | \"extraction_long_list\"\n | \"extraction_referential_lookup\"\n | \"extraction_coverage_cleanup\"\n | \"extraction_review\"\n | \"extraction_summary\"\n | \"extraction_format\"\n | \"query_attachment\"\n | \"query_classify\"\n | \"query_reason\"\n | \"query_verify\"\n | \"query_respond\"\n | \"application_classify\"\n | \"application_extract_fields\"\n | \"application_auto_fill\"\n | \"application_lookup\"\n | \"application_parse_answers\"\n | \"application_batch\"\n | \"application_email\"\n | \"application_pdf_mapping\"\n | \"pce_impact_analysis\"\n | \"pce_reply_parse\"\n | \"pce_packet_generation\";\n\nexport interface ModelCapabilities {\n /** Human-readable model identifier for diagnostics. */\n model?: string;\n modelName?: string;\n /** Provider/model input context limit for diagnostics. */\n maxInputTokens?: number;\n /** Provider/model hard output limit. Resolved budgets will not exceed this. */\n maxOutputTokens?: number;\n /** Default preferred budget when a task has no specific capability hint. */\n defaultOutputTokens?: number;\n /** Preferred budget for long list extraction tasks such as schedules and sections. */\n longListOutputTokens?: number;\n /** Preferred budgets for individual task kinds. */\n taskOutputTokens?: Partial<Record<ModelTaskKind, number>>;\n}\n\nexport interface ModelBudgetConstraint {\n /** Preferred budget for this call. */\n outputTokens?: number;\n /** Explicit hard limit for this call, useful for keeping small calls small. */\n maxOutputTokens?: number;\n /** Lower bound after all other preferences are applied. */\n minOutputTokens?: number;\n}\n\nexport interface ResolveModelBudgetParams {\n taskKind: ModelTaskKind;\n /** Existing per-task constant, now treated as a compatibility hint. */\n hintTokens: number;\n modelCapabilities?: ModelCapabilities;\n constraint?: ModelBudgetConstraint;\n schemaSizeBytes?: number;\n expectedListLength?: number;\n inputContextBytes?: number;\n providerMaxOutputTokens?: number;\n}\n\nexport interface ModelBudgetResolution {\n taskKind: ModelTaskKind;\n maxTokens: number;\n hintTokens: number;\n preferredOutputTokens?: number;\n modelMaxOutputTokens?: number;\n hardMaxOutputTokens?: number;\n estimatedInputTokens?: number;\n outputTruncationRisk: \"low\" | \"medium\" | \"high\";\n warnings: string[];\n}\n\nfunction positiveInteger(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.floor(value)\n : undefined;\n}\n\nexport function resolveModelBudget(params: ResolveModelBudgetParams): ModelBudgetResolution {\n const { taskKind, modelCapabilities, constraint } = params;\n const hintTokens = positiveInteger(params.hintTokens) ?? 4096;\n const taskCapability = positiveInteger(modelCapabilities?.taskOutputTokens?.[taskKind]);\n const longListCapability = taskKind === \"extraction_long_list\"\n ? positiveInteger(modelCapabilities?.longListOutputTokens)\n : undefined;\n const defaultCapability = positiveInteger(modelCapabilities?.defaultOutputTokens);\n const constrainedPreference = positiveInteger(constraint?.outputTokens);\n const minOutputTokens = positiveInteger(constraint?.minOutputTokens);\n const modelMaxOutputTokens = positiveInteger(modelCapabilities?.maxOutputTokens);\n const providerMaxOutputTokens = positiveInteger(params.providerMaxOutputTokens);\n const hardMaxOutputTokens = positiveInteger(constraint?.maxOutputTokens) ?? providerMaxOutputTokens;\n const estimatedInputTokens = estimateTokens(params.inputContextBytes);\n const schemaTokens = estimateTokens(params.schemaSizeBytes) ?? 0;\n const expectedListLength = positiveInteger(params.expectedListLength) ?? 0;\n const warnings: string[] = [];\n\n const preferredOutputTokens =\n constrainedPreference\n ?? taskCapability\n ?? longListCapability\n ?? hintTokens\n ?? defaultCapability;\n\n let maxTokens = preferredOutputTokens;\n\n if (minOutputTokens) {\n maxTokens = Math.max(maxTokens, minOutputTokens);\n }\n\n if (modelMaxOutputTokens) {\n if (maxTokens > modelMaxOutputTokens) {\n warnings.push(`Resolved ${taskKind} budget was capped by model max output tokens.`);\n }\n maxTokens = Math.min(maxTokens, modelMaxOutputTokens);\n }\n\n if (hardMaxOutputTokens) {\n if (maxTokens > hardMaxOutputTokens) {\n warnings.push(`Resolved ${taskKind} budget was capped by an explicit hard max output token constraint.`);\n }\n maxTokens = Math.min(maxTokens, hardMaxOutputTokens);\n }\n\n const expectedOutputFloor = expectedOutputTokensFloor(taskKind, schemaTokens, expectedListLength, hintTokens);\n const outputTruncationRisk = maxTokens < expectedOutputFloor * 0.65\n ? \"high\"\n : maxTokens < expectedOutputFloor\n ? \"medium\"\n : \"low\";\n\n if (outputTruncationRisk !== \"low\") {\n warnings.push(`Resolved ${taskKind} budget may be under-sized for the expected output shape.`);\n }\n\n const maxInputTokens = positiveInteger(modelCapabilities?.maxInputTokens);\n if (estimatedInputTokens && maxInputTokens && estimatedInputTokens > maxInputTokens * 0.9) {\n warnings.push(`Estimated ${taskKind} input context is close to or above the configured model input limit.`);\n }\n\n return {\n taskKind,\n maxTokens,\n hintTokens,\n preferredOutputTokens,\n modelMaxOutputTokens,\n hardMaxOutputTokens,\n estimatedInputTokens,\n outputTruncationRisk,\n warnings,\n };\n}\n\nfunction estimateTokens(bytes: number | undefined): number | undefined {\n const positive = positiveInteger(bytes);\n if (!positive) return undefined;\n return Math.ceil(positive / 4);\n}\n\nfunction expectedOutputTokensFloor(\n taskKind: ModelTaskKind,\n schemaTokens: number,\n expectedListLength: number,\n hintTokens: number,\n): number {\n const listMultiplier = taskKind === \"extraction_long_list\" ? 90 : 45;\n const listFloor = expectedListLength > 0 ? expectedListLength * listMultiplier : 0;\n return Math.max(Math.ceil(schemaTokens * 1.5), listFloor, Math.floor(hintTokens * 0.75));\n}\n","/**\n * Concurrency limiter — returns a function that wraps async tasks\n * so at most `concurrency` run simultaneously.\n */\nexport function pLimit(concurrency: number) {\n const maxConcurrency = Number.isFinite(concurrency) ? Math.max(1, Math.floor(concurrency)) : 1;\n let active = 0;\n const queue: Array<() => void> = [];\n\n function next() {\n if (queue.length > 0 && active < maxConcurrency) {\n active++;\n queue.shift()!();\n }\n }\n\n return <T>(fn: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n const run = () => {\n fn().then(resolve, reject).finally(() => {\n active--;\n next();\n });\n };\n queue.push(run);\n next();\n });\n}\n","import type { LogFn } from \"./types\";\n\nconst MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 2000;\n\nexport interface RetryOptions {\n maxRetries?: number;\n baseDelayMs?: number;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n // Rate limits\n if (msg.includes(\"rate limit\") || msg.includes(\"rate_limit\") || msg.includes(\"too many requests\")) {\n return true;\n }\n // Transient provider errors\n if (msg.includes(\"grammar compilation timed out\")) return true;\n if (msg.includes(\"no output generated\")) return true;\n if (msg.includes(\"overloaded\")) return true;\n if (msg.includes(\"internal server error\")) return true;\n if (msg.includes(\"service unavailable\")) return true;\n if (msg.includes(\"gateway timeout\")) return true;\n }\n if (typeof error === \"object\" && error !== null) {\n const status = (error as Record<string, unknown>).status ?? (error as Record<string, unknown>).statusCode;\n if (status === 429 || status === 500 || status === 502 || status === 503 || status === 504) return true;\n }\n return false;\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n log?: LogFn,\n options?: RetryOptions,\n): Promise<T> {\n const maxRetries = options?.maxRetries ?? MAX_RETRIES;\n const baseDelayMs = options?.baseDelayMs ?? BASE_DELAY_MS;\n for (let attempt = 0; ; attempt++) {\n try {\n return await fn();\n } catch (error) {\n if (!isRetryableError(error) || attempt >= maxRetries) {\n throw error;\n }\n const jitter = Math.random() * 1000;\n const delay = baseDelayMs * Math.pow(2, attempt) + jitter;\n await log?.(`Retryable error, retrying in ${(delay / 1000).toFixed(1)}s (attempt ${attempt + 1}/${maxRetries})...`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n","// Prompts for insurance application processing\n\nexport const APPLICATION_CLASSIFY_PROMPT = `You are classifying a PDF document. Determine if this is an insurance APPLICATION FORM (a form to be filled out to apply for insurance) versus a policy document, quote, certificate, or other document.\n\nInsurance applications typically:\n- Have blank fields, checkboxes, or spaces to fill in\n- Ask for company information, coverage limits, loss history\n- Include ACORD form numbers or \"Application for\" in the title\n- Request signatures and dates\n\nRespond with JSON only:\n{\n \"isApplication\": boolean,\n \"confidence\": number (0-1),\n \"applicationType\": string | null // e.g. \"General Liability\", \"Professional Liability\", \"Commercial Property\", \"Workers Compensation\", \"ACORD 125\", etc.\n}`;\n","import { z } from \"zod\";\n\n// ── Field Types ──\n\nexport const FieldTypeSchema = z.enum([\n \"text\",\n \"numeric\",\n \"currency\",\n \"date\",\n \"yes_no\",\n \"table\",\n \"declaration\",\n]);\nexport type FieldType = z.infer<typeof FieldTypeSchema>;\n\n// ── Application Field (extracted from PDF) ──\n\nexport const ApplicationFieldSchema = z.object({\n id: z.string(),\n label: z.string(),\n section: z.string(),\n fieldType: FieldTypeSchema,\n required: z.boolean(),\n options: z.array(z.string()).optional(),\n columns: z.array(z.string()).optional(),\n requiresExplanationIfYes: z.boolean().optional(),\n condition: z\n .object({\n dependsOn: z.string(),\n whenValue: z.string(),\n })\n .optional(),\n value: z.string().optional(),\n source: z.string().optional().describe(\"Where the value came from: auto-fill, user, lookup\"),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]).optional(),\n sourceSpanIds: z.array(z.string()).optional().describe(\"Stable source spans that support the field value or field anchor\"),\n userSourceSpanIds: z.array(z.string()).optional().describe(\"Message or attachment spans that support user-provided values\"),\n pageNumber: z.number().int().positive().optional().describe(\"Application page where the field label or anchor appears\"),\n fieldAnchorId: z.string().optional().describe(\"Stable field anchor ID derived from page, section, label, and form metadata\"),\n acroFormName: z.string().optional().describe(\"Native PDF AcroForm field name when available\"),\n validationStatus: z.enum([\"valid\", \"needs_review\", \"unsupported\", \"missing\"]).optional(),\n});\nexport type ApplicationField = z.infer<typeof ApplicationFieldSchema>;\n\n// ── Versioned Question Graph ──\n\nexport const ApplicationQuestionConditionSchema = z.object({\n dependsOn: z.string(),\n operator: z.enum([\"equals\", \"not_equals\", \"in\", \"not_in\", \"exists\"]).optional(),\n value: z.string().optional(),\n whenValue: z.string().optional(),\n values: z.array(z.string()).optional(),\n});\nexport type ApplicationQuestionCondition = z.infer<typeof ApplicationQuestionConditionSchema>;\n\nexport const ApplicationRepeatSchema = z.object({\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n label: z.string().optional(),\n});\nexport type ApplicationRepeat = z.infer<typeof ApplicationRepeatSchema>;\n\nexport interface ApplicationQuestionNode {\n id: string;\n nodeType: \"group\" | \"question\" | \"repeat_group\" | \"table\";\n fieldId?: string;\n fieldPath?: string;\n parentId?: string;\n order?: number;\n label: string;\n section?: string;\n fieldType?: FieldType;\n required?: boolean;\n prompt?: string;\n options?: string[];\n columns?: string[];\n condition?: ApplicationQuestionCondition;\n repeat?: ApplicationRepeat;\n children?: ApplicationQuestionNode[];\n}\n\nexport const ApplicationQuestionNodeSchema: z.ZodType<ApplicationQuestionNode> = z.lazy(() =>\n z.object({\n id: z.string(),\n nodeType: z.enum([\"group\", \"question\", \"repeat_group\", \"table\"]),\n fieldId: z.string().optional(),\n fieldPath: z.string().optional(),\n parentId: z.string().optional(),\n order: z.number().int().nonnegative().optional(),\n label: z.string(),\n section: z.string().optional(),\n fieldType: FieldTypeSchema.optional(),\n required: z.boolean().optional(),\n prompt: z.string().optional(),\n options: z.array(z.string()).optional(),\n columns: z.array(z.string()).optional(),\n condition: ApplicationQuestionConditionSchema.optional(),\n repeat: ApplicationRepeatSchema.optional(),\n children: z.array(ApplicationQuestionNodeSchema).optional(),\n }),\n);\n\nexport const ApplicationQuestionGraphSchema = z.object({\n id: z.string(),\n version: z.string(),\n title: z.string().optional(),\n applicationType: z.string().nullable().optional(),\n source: z.enum([\"pdf\", \"manual\", \"imported\", \"generated\"]).default(\"generated\"),\n rootNodeIds: z.array(z.string()).optional(),\n nodes: z.array(ApplicationQuestionNodeSchema),\n});\nexport type ApplicationQuestionGraph = z.infer<typeof ApplicationQuestionGraphSchema>;\n\nexport const ApplicationTemplateSchema = z.object({\n id: z.string(),\n version: z.string(),\n title: z.string(),\n applicationType: z.string().nullable().optional(),\n questionGraph: ApplicationQuestionGraphSchema,\n fields: z.array(ApplicationFieldSchema).optional(),\n});\nexport type ApplicationTemplate = z.infer<typeof ApplicationTemplateSchema>;\n\n// ── Classify Result ──\n\nexport const ApplicationClassifyResultSchema = z.object({\n isApplication: z.boolean(),\n confidence: z.number().min(0).max(1),\n applicationType: z.string().nullable(),\n});\nexport type ApplicationClassifyResult = z.infer<typeof ApplicationClassifyResultSchema>;\n\n// ── Field Extraction Result ──\n\nexport const FieldExtractionResultSchema = z.object({\n fields: z.array(ApplicationFieldSchema),\n});\nexport type FieldExtractionResult = z.infer<typeof FieldExtractionResultSchema>;\n\n// ── Auto-Fill Match ──\n\nexport const AutoFillMatchSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n confidence: z.enum([\"confirmed\"]),\n contextKey: z.string(),\n});\nexport type AutoFillMatch = z.infer<typeof AutoFillMatchSchema>;\n\nexport const AutoFillResultSchema = z.object({\n matches: z.array(AutoFillMatchSchema),\n});\nexport type AutoFillResult = z.infer<typeof AutoFillResultSchema>;\n\n// ── Question Batch ──\n\nexport const QuestionBatchResultSchema = z.object({\n batches: z.array(z.array(z.string()).describe(\"Array of field IDs in this batch\")),\n});\nexport type QuestionBatchResult = z.infer<typeof QuestionBatchResultSchema>;\n\n// ── Reply Intent ──\n\nexport const LookupRequestSchema = z.object({\n type: z.string().describe(\"Type of lookup: 'records', 'website', 'policy'\"),\n description: z.string(),\n url: z.string().optional(),\n targetFieldIds: z.array(z.string()),\n});\nexport type LookupRequest = z.infer<typeof LookupRequestSchema>;\n\nexport const ReplyIntentSchema = z.object({\n primaryIntent: z.enum([\"answers_only\", \"question\", \"lookup_request\", \"mixed\"]),\n hasAnswers: z.boolean(),\n questionText: z.string().optional(),\n questionFieldIds: z.array(z.string()).optional(),\n lookupRequests: z.array(LookupRequestSchema).optional(),\n});\nexport type ReplyIntent = z.infer<typeof ReplyIntentSchema>;\n\n// ── Parsed Answer ──\n\nexport const ParsedAnswerSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n explanation: z.string().optional(),\n});\nexport type ParsedAnswer = z.infer<typeof ParsedAnswerSchema>;\n\nexport const AnswerParsingResultSchema = z.object({\n answers: z.array(ParsedAnswerSchema),\n unanswered: z.array(z.string()).describe(\"Field IDs that were not answered\"),\n});\nexport type AnswerParsingResult = z.infer<typeof AnswerParsingResultSchema>;\n\n// ── Lookup Fill ──\n\nexport const LookupFillSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n source: z.string().describe(\"Specific citable reference, e.g. 'GL Policy #POL-12345 (Hartford)'\"),\n sourceSpanIds: z.array(z.string()).optional(),\n});\nexport type LookupFill = z.infer<typeof LookupFillSchema>;\n\nexport const LookupFillResultSchema = z.object({\n fills: z.array(LookupFillSchema),\n unfillable: z.array(z.string()),\n explanation: z.string().optional(),\n});\nexport type LookupFillResult = z.infer<typeof LookupFillResultSchema>;\n\n// ── PDF Mapping ──\n\nexport const FlatPdfPlacementSchema = z.object({\n fieldId: z.string(),\n page: z.number(),\n x: z.number().describe(\"Percentage from left edge (0-100)\"),\n y: z.number().describe(\"Percentage from top edge (0-100)\"),\n text: z.string(),\n fontSize: z.number().optional(),\n isCheckmark: z.boolean().optional(),\n});\nexport type FlatPdfPlacement = z.infer<typeof FlatPdfPlacementSchema>;\n\nexport const AcroFormMappingSchema = z.object({\n fieldId: z.string(),\n acroFormName: z.string(),\n value: z.string(),\n});\nexport type AcroFormMapping = z.infer<typeof AcroFormMappingSchema>;\n\n// ── Quality Report (shared schema for serialization) ──\n\nconst QualityGateStatusSchema = z.enum([\"passed\", \"warning\", \"failed\"]);\nconst QualitySeveritySchema = z.enum([\"info\", \"warning\", \"blocking\"]);\n\nexport const ApplicationQualityIssueSchema = z.object({\n code: z.string(),\n severity: QualitySeveritySchema,\n message: z.string(),\n fieldId: z.string().optional(),\n});\n\nexport const ApplicationQualityRoundSchema = z.object({\n round: z.number(),\n kind: z.string(),\n status: QualityGateStatusSchema,\n summary: z.string().optional(),\n});\n\nexport const ApplicationQualityArtifactSchema = z.object({\n kind: z.string(),\n label: z.string().optional(),\n itemCount: z.number().optional(),\n});\n\nexport const ApplicationEmailReviewSchema = z.object({\n issues: z.array(ApplicationQualityIssueSchema),\n qualityGateStatus: QualityGateStatusSchema,\n});\n\nexport const ApplicationQualityReportSchema = z.object({\n issues: z.array(ApplicationQualityIssueSchema),\n rounds: z.array(ApplicationQualityRoundSchema).optional(),\n artifacts: z.array(ApplicationQualityArtifactSchema).optional(),\n emailReview: ApplicationEmailReviewSchema.optional(),\n qualityGateStatus: QualityGateStatusSchema,\n});\n\n// ── Context Proposals And Packets ──\n\nexport const ApplicationContextProposalSchema = z.object({\n id: z.string(),\n fieldId: z.string().optional(),\n key: z.string(),\n value: z.string(),\n category: z.string(),\n source: z.enum([\"application\", \"user\", \"lookup\", \"policy\", \"email\", \"chat\", \"imessage\", \"mcp\"]),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]),\n sourceSpanIds: z.array(z.string()).optional(),\n userSourceSpanIds: z.array(z.string()).optional(),\n});\nexport type ApplicationContextProposal = z.infer<typeof ApplicationContextProposalSchema>;\n\nexport const ApplicationPacketAnswerSchema = z.object({\n fieldId: z.string(),\n label: z.string(),\n section: z.string(),\n value: z.string(),\n source: z.string(),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]).optional(),\n sourceSpanIds: z.array(z.string()).optional(),\n userSourceSpanIds: z.array(z.string()).optional(),\n});\nexport type ApplicationPacketAnswer = z.infer<typeof ApplicationPacketAnswerSchema>;\n\nexport const ApplicationPacketSchema = z.object({\n id: z.string(),\n applicationId: z.string(),\n title: z.string(),\n status: z.enum([\"draft\", \"broker_ready\", \"submitted\"]),\n answers: z.array(ApplicationPacketAnswerSchema),\n missingFieldIds: z.array(z.string()),\n qualityReport: ApplicationQualityReportSchema,\n submissionNotes: z.string().optional(),\n createdAt: z.number(),\n});\nexport type ApplicationPacket = z.infer<typeof ApplicationPacketSchema>;\n\n// ── Application State (persistent) ──\n\nexport const ApplicationStateSchema = z.object({\n id: z.string(),\n pdfBase64: z.string().optional().describe(\"Original PDF, omitted after extraction\"),\n templateId: z.string().optional(),\n templateVersion: z.string().optional(),\n templateSnapshot: ApplicationTemplateSchema.optional(),\n title: z.string().optional(),\n applicationType: z.string().nullable().optional(),\n questionGraph: ApplicationQuestionGraphSchema.optional(),\n fields: z.array(ApplicationFieldSchema),\n batches: z.array(z.array(z.string())).optional(),\n currentBatchIndex: z.number().default(0),\n contextProposals: z.array(ApplicationContextProposalSchema).optional(),\n packet: ApplicationPacketSchema.optional(),\n qualityReport: ApplicationQualityReportSchema.optional(),\n status: z.enum([\n \"classifying\",\n \"extracting\",\n \"auto_filling\",\n \"batching\",\n \"collecting\",\n \"confirming\",\n \"mapping\",\n \"broker_review\",\n \"packet_ready\",\n \"submitted\",\n \"cancelled\",\n \"complete\",\n ]),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\nexport type ApplicationState = z.infer<typeof ApplicationStateSchema>;\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { APPLICATION_CLASSIFY_PROMPT } from \"../../prompts/application/classify\";\nimport { ApplicationClassifyResultSchema, type ApplicationClassifyResult } from \"../../schemas/application\";\n\n/**\n * Classify whether a PDF is an insurance application form.\n * Small, fast agent — suitable for cheap/fast models.\n */\nexport async function classifyApplication(\n pdfContent: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 512,\n): Promise<{ result: ApplicationClassifyResult; usage?: TokenUsage }> {\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt: `${APPLICATION_CLASSIFY_PROMPT}\\n\\nAnalyze the attached insurance document. If text source units are provided in provider options, use them as supporting context. Do not infer from base64 text.`,\n schema: ApplicationClassifyResultSchema,\n maxTokens,\n taskKind: \"application_classify\",\n providerOptions: {\n ...providerOptions,\n pdfBase64: providerOptions?.pdfBase64 ?? pdfContent,\n },\n }),\n );\n\n return { result: object as ApplicationClassifyResult, usage };\n}\n","export function buildFieldExtractionPrompt(): string {\n return `Extract all fillable fields from this insurance application PDF as a JSON array. Be concise — use short IDs and minimal keys.\n\nField types: \"text\", \"numeric\", \"currency\", \"date\", \"yes_no\", \"table\", \"declaration\"\n\nRequired keys per field:\n- \"id\": short provisional snake_case ID. The SDK will replace this with a stable deterministic ID.\n- \"label\": field label — a clear, natural question that a human would understand\n- \"section\": section heading\n- \"fieldType\": one of the types above\n- \"required\": boolean\n\nOptional keys (only include when applicable):\n- \"sourceSpanIds\": stable source span IDs if the caller provided source units for this application\n- \"pageNumber\": PDF page number where the field label/anchor appears\n- \"fieldAnchorId\": stable caller-provided field anchor ID, when available\n- \"acroFormName\": native PDF form field name, when visible or provided\n- \"validationStatus\": \"missing\" for extracted blank fields, \"needs_review\" for prefilled fields that need source validation\n- \"options\": array of strings — for fields with checkboxes/radio buttons/multiple choices (e.g. business type, state selections). Use \"text\" fieldType with options.\n- \"columns\": array of {\"name\",\"type\"} — tables only\n- \"requiresExplanationIfYes\": boolean — declarations only\n- \"condition\": {\"dependsOn\":\"field_id\",\"whenValue\":\"value\"} — conditional fields only\n\nIMPORTANT — Grouped fields: When you see a group of checkboxes or radio buttons for a single question (e.g. \"Type of Business: Corporation / Partnership / LLC / Individual / Joint Venture / Other\"), extract as ONE field with the group label and an \"options\" array — NOT as separate fields for each option. The label should describe what's being asked (e.g. \"Type of Business Entity\"), and options lists the choices.\n\nExample:\n[\n {\"id\":\"company_name\",\"label\":\"Applicant Name\",\"section\":\"General Info\",\"fieldType\":\"text\",\"required\":true},\n {\"id\":\"business_type\",\"label\":\"Type of Business Entity\",\"section\":\"General Info\",\"fieldType\":\"text\",\"required\":true,\"options\":[\"Corporation\",\"Partnership\",\"LLC\",\"Individual\",\"Joint Venture\",\"Other\"]},\n {\"id\":\"loss_history\",\"label\":\"Loss History\",\"section\":\"Losses\",\"fieldType\":\"table\",\"required\":true,\"columns\":[{\"name\":\"Year\",\"type\":\"numeric\"},{\"name\":\"Amount\",\"type\":\"currency\"}]},\n {\"id\":\"prior_claims\",\"text\":\"Any claims in past 5 years?\",\"section\":\"Declarations\",\"fieldType\":\"declaration\",\"required\":true,\"requiresExplanationIfYes\":true}\n]\n\nExtract ALL fields. Prefer page numbers and source span IDs over model-generated guesses whenever source units are supplied. Respond with ONLY the JSON array, no other text.`;\n}\n","import type { ApplicationField } from \"../schemas/application\";\n\nfunction normalizePart(value: string | undefined): string {\n const normalized = (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || \"unknown\";\n}\n\nfunction hashText(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index++) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\").slice(0, 8);\n}\n\nexport function buildApplicationFieldAnchorId(field: Pick<ApplicationField, \"section\" | \"label\" | \"pageNumber\" | \"acroFormName\">): string {\n const page = field.pageNumber ? `p${field.pageNumber}` : \"pna\";\n const section = normalizePart(field.section);\n const label = normalizePart(field.label);\n const acroFormName = normalizePart(field.acroFormName);\n const hash = hashText(`${page}|${section}|${label}|${acroFormName}`);\n return `app_field_anchor:${page}:${section}:${label}:${hash}`;\n}\n\nexport function buildStableApplicationFieldId(field: Pick<ApplicationField, \"section\" | \"label\" | \"fieldType\" | \"pageNumber\" | \"fieldAnchorId\" | \"acroFormName\">): string {\n const page = field.pageNumber ? `p${field.pageNumber}` : \"pna\";\n const section = normalizePart(field.section);\n const label = normalizePart(field.label);\n const fieldType = normalizePart(field.fieldType);\n const anchor = field.fieldAnchorId ?? buildApplicationFieldAnchorId(field);\n const hash = hashText(`${page}|${section}|${label}|${fieldType}|${field.acroFormName ?? \"\"}|${anchor}`);\n return `app_field:${page}:${section}:${label}:${hash}`;\n}\n\nexport function normalizeApplicationFields(fields: ApplicationField[]): ApplicationField[] {\n const seen = new Map<string, number>();\n\n return fields.map((field) => {\n const fieldAnchorId = field.fieldAnchorId ?? buildApplicationFieldAnchorId(field);\n const baseId = buildStableApplicationFieldId({ ...field, fieldAnchorId });\n const count = seen.get(baseId) ?? 0;\n seen.set(baseId, count + 1);\n\n return {\n ...field,\n id: count === 0 ? baseId : `${baseId}:${count + 1}`,\n fieldAnchorId,\n validationStatus: field.validationStatus ?? (field.value ? \"needs_review\" : \"missing\"),\n };\n });\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildFieldExtractionPrompt } from \"../../prompts/application/field-extraction\";\nimport { FieldExtractionResultSchema, type ApplicationField } from \"../../schemas/application\";\nimport { normalizeApplicationFields } from \"../field-ids\";\n\n/**\n * Extract all fillable fields from an application PDF.\n * Moderate agent — needs enough context to see the full form.\n */\nexport async function extractFields(\n pdfContent: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 8192,\n): Promise<{ fields: ApplicationField[]; usage?: TokenUsage }> {\n const prompt = `${buildFieldExtractionPrompt()}\\n\\nExtract fields from the attached application PDF. Use provider-supplied source units/spans for page numbers and anchors when present. Do not treat raw base64 as readable document text.`;\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: FieldExtractionResultSchema,\n maxTokens,\n taskKind: \"application_extract_fields\",\n providerOptions: {\n ...providerOptions,\n pdfBase64: providerOptions?.pdfBase64 ?? pdfContent,\n },\n }),\n );\n\n const result = object as { fields: ApplicationField[] };\n return { fields: normalizeApplicationFields(result.fields), usage };\n}\n","export function buildAutoFillPrompt(\n fields: { id: string; label: string; fieldType: string; section: string }[],\n orgContext: { key: string; value: string; category: string }[],\n): string {\n const fieldList = fields\n .map((f) => `- ${f.id}: \"${f.label}\" (${f.fieldType}, section: ${f.section})`)\n .join(\"\\n\");\n const contextList = orgContext\n .map((c) => `- ${c.key}: \"${c.value}\" (category: ${c.category})`)\n .join(\"\\n\");\n\n return `You are matching insurance application fields to existing business context data.\n\nAPPLICATION FIELDS:\n${fieldList}\n\nAVAILABLE BUSINESS CONTEXT:\n${contextList}\n\nFor each field that can be filled from the context, provide a match. Only match when you are confident the context value correctly answers the field. For date fields, ensure format compatibility.\n\nRespond with JSON only:\n{\n \"matches\": [\n {\n \"fieldId\": \"company_name\",\n \"value\": \"Acme Corp\",\n \"confidence\": \"confirmed\",\n \"contextKey\": \"company_name\"\n }\n ]\n}\n\nOnly include fields you can confidently fill. Do not guess or fabricate values.`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildAutoFillPrompt } from \"../../prompts/application/auto-fill\";\nimport { AutoFillResultSchema, type AutoFillResult, type ApplicationField } from \"../../schemas/application\";\nimport type { BackfillProvider, PriorAnswer } from \"../store\";\n\n/**\n * Auto-fill fields from business context and prior answers.\n * Small agent — simple matching task, fast model works well.\n */\nexport async function autoFillFromContext(\n fields: ApplicationField[],\n orgContext: { key: string; value: string; category: string }[],\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: AutoFillResult; usage?: TokenUsage }> {\n const fieldSummaries = fields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n section: f.section,\n }));\n\n const prompt = buildAutoFillPrompt(fieldSummaries, orgContext);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: AutoFillResultSchema,\n maxTokens,\n taskKind: \"application_auto_fill\",\n providerOptions,\n }),\n );\n\n return { result: object as AutoFillResult, usage };\n}\n\n/**\n * Backfill fields from prior application answers using vector search.\n * No LLM call — pure retrieval from the backfill provider.\n */\nexport async function backfillFromPriorAnswers(\n fields: ApplicationField[],\n backfillProvider: BackfillProvider,\n): Promise<PriorAnswer[]> {\n const unfilled = fields.filter((f) => !f.value);\n if (unfilled.length === 0) return [];\n\n return backfillProvider.searchPriorAnswers(\n unfilled.map((f) => ({\n id: f.id,\n label: f.label,\n section: f.section,\n fieldType: f.fieldType,\n })),\n { limit: unfilled.length * 2 },\n );\n}\n","export function buildQuestionBatchPrompt(\n unfilledFields: { id: string; label?: string; text?: string; fieldType: string; section: string; required: boolean; condition?: { dependsOn: string; whenValue: string } }[],\n): string {\n const fieldList = unfilledFields\n .map(\n (f) => {\n let line = `- ${f.id}: \"${f.label ?? f.text}\" (${f.fieldType}, section: ${f.section}, required: ${f.required})`;\n if (f.condition) line += ` [depends on: ${f.condition.dependsOn} when \"${f.condition.whenValue}\"]`;\n return line;\n },\n )\n .join(\"\\n\");\n\n return `You are organizing insurance application questions into topic-based email batches. Each batch = one email, grouped by topic so the recipient can answer related questions together.\n\nUNFILLED FIELDS:\n${fieldList}\n\nRules:\n- Group by TOPIC, not by fixed size. All questions about the same topic belong in the same batch.\n- Typical topics: Company/Applicant Info, Business Operations, Financial/Revenue, Coverage/Limits, Loss History, Declarations, Premises/Location, etc.\n- A batch can have as many questions as the topic requires — don't split a natural topic group across multiple emails.\n- If a topic has 20+ fields, you may split into sub-topics (e.g. \"Premises - Location\" vs \"Premises - Details\").\n- Put required fields before optional ones within each batch.\n- Keep conditional fields in the same batch as the field they depend on, with the parent field listed BEFORE dependents.\n- Keep related address-like fields (street, city, state, zip, address) in the same batch so the email generator can merge them into a single compound question.\n- Order batches by importance: company info first, then operations, financial, coverage, declarations last.\n- Aim for roughly 3-8 batches total. Fewer large topical batches are better than many tiny ones.\n\nRespond with JSON only:\n{\n \"batches\": [\n [\"field_id_1\", \"field_id_2\", \"field_id_3\", ...],\n [\"field_id_4\", \"field_id_5\", ...]\n ]\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildQuestionBatchPrompt } from \"../../prompts/application/question-batch\";\nimport { QuestionBatchResultSchema, type QuestionBatchResult, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Organize unfilled fields into topic-based batches for user collection.\n * Small agent — grouping task, fast model is fine.\n */\nexport async function batchQuestions(\n unfilledFields: ApplicationField[],\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 2048,\n): Promise<{ result: QuestionBatchResult; usage?: TokenUsage }> {\n const fieldSummaries = unfilledFields.map((f) => ({\n id: f.id,\n label: f.label,\n text: f.label,\n fieldType: f.fieldType,\n section: f.section,\n required: f.required,\n condition: f.condition,\n }));\n\n const prompt = buildQuestionBatchPrompt(fieldSummaries);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: QuestionBatchResultSchema,\n maxTokens,\n taskKind: \"application_batch\",\n providerOptions,\n }),\n );\n\n return { result: object as QuestionBatchResult, usage };\n}\n","export function buildReplyIntentClassificationPrompt(\n questions: { id: string; label: string }[],\n emailBody: string,\n): string {\n const questionList = questions\n .map((q, i) => `${i + 1}. ${q.id}: \"${q.label}\"`)\n .join(\"\\n\");\n\n return `Classify the intent of this email reply to insurance application questions.\n\nQUESTIONS THAT WERE ASKED:\n${questionList}\n\nUSER'S EMAIL REPLY:\n${emailBody}\n\nClassify the primary intent:\n- \"answers_only\": User is providing answers to the questions\n- \"question\": User is asking a question about one or more fields (e.g. \"What does aggregate limit mean?\")\n- \"lookup_request\": User is requesting data be pulled from existing records OR from a third-party website (e.g. \"Use our GL policy for coverage info\", \"Check Stripe's site for PCI compliance info\", \"Pull from our last application\")\n- \"mixed\": User is providing some answers AND asking questions or requesting lookups\n\nIMPORTANT: When a user provides answers AND asks you to look something up (e.g. \"Yes we use Stripe, check their site for PCI info\"), classify as \"mixed\" with hasAnswers=true and a lookupRequest — NOT as \"question\". A \"question\" is when the user asks what a field means, not when they direct you to a data source.\n\nRespond with JSON only:\n{\n \"primaryIntent\": \"answers_only\" | \"question\" | \"lookup_request\" | \"mixed\",\n \"hasAnswers\": boolean,\n \"questionText\": \"the user's question if any, or null\",\n \"questionFieldIds\": [\"field_ids the question is about, if identifiable\"],\n \"lookupRequests\": [\n {\n \"type\": \"policy\" | \"quote\" | \"profile\" | \"business_context\" | \"web\",\n \"description\": \"what they want looked up\",\n \"url\": \"URL or domain mentioned (e.g. 'stripe.com'), or null if not a web lookup\",\n \"targetFieldIds\": [\"field_ids to fill from the lookup\"]\n }\n ]\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildReplyIntentClassificationPrompt } from \"../../prompts/application/reply-intent\";\nimport { ReplyIntentSchema, type ReplyIntent, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Classify user reply intent — answers, questions, lookup requests, or mixed.\n * Tiny agent — fast classification task.\n */\nexport async function classifyReplyIntent(\n fields: ApplicationField[],\n replyText: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 1024,\n): Promise<{ intent: ReplyIntent; usage?: TokenUsage }> {\n const fieldSummaries = fields.map((f) => ({ id: f.id, label: f.label }));\n const prompt = buildReplyIntentClassificationPrompt(fieldSummaries, replyText);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: ReplyIntentSchema,\n maxTokens,\n taskKind: \"application_classify\",\n providerOptions,\n }),\n );\n\n return { intent: object as ReplyIntent, usage };\n}\n","export function buildAnswerParsingPrompt(\n questions: { id: string; label?: string; text?: string; fieldType: string }[],\n emailBody: string,\n): string {\n const questionList = questions\n .map(\n (q, i) =>\n `${i + 1}. ${q.id}: \"${q.label ?? q.text}\" (type: ${q.fieldType})`,\n )\n .join(\"\\n\");\n\n return `You are parsing a user's email reply to extract answers for specific insurance application questions.\n\nQUESTIONS ASKED:\n${questionList}\n\nUSER'S EMAIL REPLY:\n${emailBody}\n\nExtract answers for each question. Handle:\n- Direct numbered answers (1. answer, 2. answer)\n- Inline answers referencing the question\n- Table data provided as lists or comma-separated values\n- Yes/no answers with optional explanations\n- Partial responses (some questions answered, others skipped)\n\nRespond with JSON only:\n{\n \"answers\": [\n {\n \"fieldId\": \"company_name\",\n \"value\": \"Acme Corp\"\n },\n {\n \"fieldId\": \"prior_claims_decl\",\n \"value\": \"yes\",\n \"explanation\": \"One claim in 2024 for water damage, $15,000 paid\"\n }\n ],\n \"unanswered\": [\"field_id_that_was_not_answered\"]\n}\n\nOnly include answers you are confident about. If a response is ambiguous, include the field in \"unanswered\".`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildAnswerParsingPrompt } from \"../../prompts/application/answer-parsing\";\nimport { AnswerParsingResultSchema, type AnswerParsingResult, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Parse answers from user reply text.\n * Small agent — extraction task, fast model works well.\n */\nexport async function parseAnswers(\n fields: ApplicationField[],\n replyText: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: AnswerParsingResult; usage?: TokenUsage }> {\n const questions = fields.map((f) => ({\n id: f.id,\n label: f.label,\n text: f.label,\n fieldType: f.fieldType,\n }));\n\n const prompt = buildAnswerParsingPrompt(questions, replyText);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: AnswerParsingResultSchema,\n maxTokens,\n taskKind: \"application_parse_answers\",\n providerOptions,\n }),\n );\n\n return { result: object as AnswerParsingResult, usage };\n}\n","export function buildFlatPdfMappingPrompt(\n extractedFields: { id: string; label: string; value: string; fieldType: string }[],\n): string {\n const fieldList = extractedFields\n .map((f) => `- ${f.id}: \"${f.label}\" = \"${f.value}\" (${f.fieldType})`)\n .join(\"\\n\");\n\n return `You are mapping filled insurance application values to their exact positions on a flat (non-fillable) PDF form. I will show you the PDF. For each field value, identify where on the PDF it should be written.\n\nFIELD VALUES TO PLACE:\n${fieldList}\n\nFor each field, provide:\n- page: 0-indexed page number where this field appears\n- x: horizontal position as percentage from the LEFT edge (0-100). Place the text where the blank/underline/box starts, NOT on top of the label.\n- y: vertical position as percentage from the TOP edge (0-100). Place the text vertically centered within the field's answer area.\n- fontSize: appropriate font size (typically 8-10 for standard forms, smaller for tight spaces)\n- isCheckmark: true for yes/no or checkbox fields where you should place an \"X\" mark\n\nCRITICAL POSITIONING RULES:\n- x/y indicate where the VALUE text should START (top-left corner of the text)\n- Place text INSIDE the blank field area (the line, box, or empty space), not on the label\n- For fields with underlines: place text slightly above the line\n- For fields with boxes: place text inside the box\n- For checkbox/yes-no fields: place the X inside the checkbox box. If there are \"Yes\" and \"No\" checkboxes, place it in the correct one based on the value\n- Typical form layout: label on the left, fill area to the right or below\n- Be precise — a few percentage points off will misplace text visibly\n\nRespond with JSON only:\n{\n \"placements\": [\n {\n \"fieldId\": \"company_name\",\n \"page\": 0,\n \"x\": 25.5,\n \"y\": 12.3,\n \"text\": \"Acme Corp\",\n \"fontSize\": 10,\n \"isCheckmark\": false\n }\n ]\n}\n\nOnly include fields you can confidently locate on the PDF. Skip fields where the location is ambiguous.`;\n}\n\nexport function buildAcroFormMappingPrompt(\n extractedFields: { id: string; label: string; value?: string }[],\n acroFormFields: { name: string; type: string; options?: string[] }[],\n): string {\n const extracted = extractedFields\n .filter((f) => (f as any).value)\n .map((f) => `- ${f.id}: \"${f.label}\" = \"${(f as any).value}\"`)\n .join(\"\\n\");\n const acroFields = acroFormFields\n .map((f) => {\n let line = `- \"${f.name}\" (${f.type})`;\n if (f.options?.length) line += ` options: [${f.options.join(\", \")}]`;\n return line;\n })\n .join(\"\\n\");\n\n return `You are mapping extracted insurance application answers to AcroForm PDF field names.\n\nEXTRACTED FIELD VALUES (semantic IDs with values):\n${extracted}\n\nACROFORM FIELDS IN THE PDF:\n${acroFields}\n\nFor each extracted field that has a value, find the best matching AcroForm field name. Match by semantic meaning — field names in PDFs are often abbreviated or coded (e.g. \"FirstNamed\" for company name, \"Addr1\" for address).\n\nRules:\n- Only include mappings where you are confident of the match\n- For checkbox fields, the value should be \"yes\"/\"no\" or \"true\"/\"false\"\n- For radio/dropdown fields, the value must be one of the available options\n- Skip fields with no clear match\n\nRespond with JSON only:\n{\n \"mappings\": [\n { \"fieldId\": \"company_name\", \"acroFormName\": \"FirstNamed\", \"value\": \"Acme Corp\" }\n ]\n}`;\n}\n\nexport function buildLookupFillPrompt(\n requests: { type: string; description: string; targetFieldIds: string[] }[],\n targetFields: { id: string; label: string; fieldType: string }[],\n availableData: string,\n): string {\n const requestList = requests\n .map((r) => `- ${r.type}: ${r.description} (target fields: ${r.targetFieldIds.join(\", \")})`)\n .join(\"\\n\");\n const fieldList = targetFields\n .map((f) => `- ${f.id}: \"${f.label}\" (${f.fieldType})`)\n .join(\"\\n\");\n\n return `You are an internal risk management assistant filling out an insurance application for your company. A colleague asked you to look up data from existing company records to fill certain fields.\n\nLOOKUP REQUESTS:\n${requestList}\n\nTARGET FIELDS:\n${fieldList}\n\nAVAILABLE DATA:\n${availableData}\n\nMatch the available data to the target fields. Only fill fields where you have a confident match.\n\nIMPORTANT: The \"source\" field must be a specific, citable reference that will be shown to the user. Examples:\n- \"GL Policy #POL-12345 (Hartford)\"\n- \"vercel.com (Security page)\"\n- \"Business Context (company_info)\"\n- \"User Profile\"\nNever use vague sources like \"existing records\" or \"available data\".\nIf AVAILABLE DATA contains sourceSpanId values, include them in \"sourceSpanIds\" for every value filled from that source. Existing policy values such as policy numbers, dates, limits, deductibles, premiums, coverages, exclusions, conditions, endorsements, locations, vehicles, or named insureds must not be filled without sourceSpanIds unless the value is explicitly marked for review.\n\nRespond with JSON only:\n{\n \"fills\": [\n { \"fieldId\": \"field_id\", \"value\": \"the value from data\", \"source\": \"Specific source with identifier (e.g. GL Policy #ABC123, stripe.com)\", \"sourceSpanIds\": [\"doc-1:span:1:0:abcd1234\"] }\n ],\n \"unfillable\": [\"field_ids that couldn't be matched\"],\n \"explanation\": \"Brief note about what was filled and what couldn't be found, citing sources\"\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildLookupFillPrompt } from \"../../prompts/application/pdf-mapping\";\nimport { LookupFillResultSchema, type LookupFillResult, type LookupRequest, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Fill fields from company records / policy data based on lookup requests.\n * Small agent — matching task against available data.\n */\nexport async function fillFromLookup(\n requests: LookupRequest[],\n targetFields: ApplicationField[],\n availableData: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: LookupFillResult; usage?: TokenUsage }> {\n const requestSummaries = requests.map((r) => ({\n type: r.type,\n description: r.description,\n targetFieldIds: r.targetFieldIds,\n }));\n\n const fieldSummaries = targetFields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n }));\n\n const prompt = buildLookupFillPrompt(requestSummaries, fieldSummaries, availableData);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: LookupFillResultSchema,\n maxTokens,\n taskKind: \"application_lookup\",\n providerOptions,\n }),\n );\n\n return { result: object as LookupFillResult, usage };\n}\n","export function buildBatchEmailGenerationPrompt(\n batchFields: { id: string; label: string; fieldType: string; options?: string[]; condition?: { dependsOn: string; whenValue: string } }[],\n batchIndex: number,\n totalBatches: number,\n appTitle: string | undefined,\n totalFieldCount: number,\n filledFieldCount: number,\n previousBatchSummary?: string,\n companyName?: string,\n): string {\n // Separate conditional fields from non-conditional fields\n const nonConditionalFields = batchFields.filter((f) => !f.condition);\n const conditionalFields = batchFields.filter((f) => f.condition);\n\n const fieldList = nonConditionalFields\n .map((f, i) => {\n let line = `${i + 1}. id=\"${f.id}\" label=\"${f.label}\" type=${f.fieldType}`;\n if (f.options) line += ` options=[${f.options.join(\", \")}]`;\n return line;\n })\n .join(\"\\n\");\n\n const conditionalNote = conditionalFields.length > 0\n ? `\\n\\nCONDITIONAL FIELDS (DO NOT include in this email — they will be asked as follow-ups in a separate email after the parent is answered):\\n${conditionalFields.map((f) => `- id=\"${f.id}\" label=\"${f.label}\" depends on ${f.condition!.dependsOn} = \"${f.condition!.whenValue}\"`).join(\"\\n\")}`\n : \"\";\n\n const company = companyName ?? \"the company\";\n const remainingFields = totalFieldCount - filledFieldCount;\n // Estimate ~30 seconds per remaining field\n const estMinutes = Math.max(1, Math.round(remainingFields * 0.5));\n\n return `You are an internal risk management assistant helping your colleague fill out an insurance application for ${company}. You work FOR ${company} — you are NOT the insurer, broker, or any external party.\n\nAPPLICATION: ${appTitle ?? \"Insurance Application\"}\nCOMPANY: ${company}\nPROGRESS: ${filledFieldCount} of ${totalFieldCount} fields done, ~${remainingFields} remaining (~${estMinutes} min of questions left)\n${previousBatchSummary ? `\\nPREVIOUS ANSWERS RECEIVED:\\n${previousBatchSummary}\\n` : \"\"}\nFIELDS TO ASK ABOUT:\n${fieldList}${conditionalNote}\n\nRules:\n- ${previousBatchSummary ? \"Start by acknowledging previous answers or auto-filled data. If fields were auto-filled, list each field with its value AND cite the specific source (e.g. \\\"from your GL Policy #ABC123\\\", \\\"from vercel.com\\\", \\\"from your business context\\\"). If a web lookup was done, name the URL that was checked. Ask them to reply with corrections if anything is wrong.\" : \"Start with a one-line intro.\"}\n- Mention progress once using estimated time remaining. Don't mention section/batch numbers or field counts.\n- Use \"${company}\" by name when referring to the company. Also fine: \"we\" or \"our\". Never \"our company\" or \"the company\".\n- Ask questions plainly. No em-dashes for dramatic effect, no filler phrases like \"need to nail down\" or \"let's dive into\". Just ask.\n- For yes/no questions, ask naturally in one sentence. Don't list \"Yes / No\" as options. Mention what you'll need if the answer triggers a follow-up (e.g. \"If not, I'll need a brief explanation.\").\n- For fields with 2-3 options, mention them inline. 4+ options can be a short list.\n- Group related fields (address, coverage limits) into single compound questions.\n- Do NOT include conditional/follow-up fields. They will be sent separately.\n- Number each question.\n- Note expected format where relevant: dollar amounts for currency, MM/DD/YYYY for dates, column descriptions for tables.\n- End with a short closing.\n- Tone: professional, brief, matter-of-fact. Write like a busy coworker, not a chatbot. No flourishes, no em-dashes between clauses, no editorializing about the questions.\n\nNEVER:\n- Sound like a salesperson or customer service agent\n- Use em-dashes for emphasis or dramatic pacing\n- Editorialize (\"these two should wrap up this section\", \"just a couple more\")\n- List \"Yes / No / N/A\" as bullet options\n- Include conditional follow-up questions\n- Mention section numbers, batch numbers, or field counts\n\nOutput the email body text ONLY. No subject line, no JSON. Use markdown for numbered lists.`;\n}\n","import type { GenerateText, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildBatchEmailGenerationPrompt } from \"../../prompts/application/batch-email\";\nimport type { ApplicationField } from \"../../schemas/application\";\n\n/**\n * Generate a professional email requesting answers for a batch of fields.\n * Small agent — text generation, fast model produces good emails.\n */\nexport async function generateBatchEmail(\n batchFields: ApplicationField[],\n batchIndex: number,\n totalBatches: number,\n opts: {\n appTitle?: string;\n totalFieldCount: number;\n filledFieldCount: number;\n previousBatchSummary?: string;\n companyName?: string;\n },\n generateText: GenerateText,\n providerOptions?: Record<string, unknown>,\n maxTokens = 2048,\n): Promise<{ text: string; usage?: TokenUsage }> {\n const fieldSummaries = batchFields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n options: f.options,\n condition: f.condition,\n }));\n\n const prompt = buildBatchEmailGenerationPrompt(\n fieldSummaries,\n batchIndex,\n totalBatches,\n opts.appTitle,\n opts.totalFieldCount,\n opts.filledFieldCount,\n opts.previousBatchSummary,\n opts.companyName,\n );\n\n const { text, usage } = await withRetry(() =>\n generateText({\n prompt,\n maxTokens,\n taskKind: \"application_email\",\n providerOptions,\n }),\n );\n\n return { text, usage };\n}\n","export type QualitySeverity = \"info\" | \"warning\" | \"blocking\";\nexport type QualityGateStatus = \"passed\" | \"warning\" | \"failed\";\nexport type QualityGateMode = \"off\" | \"warn\" | \"strict\";\n\nexport interface BaseQualityIssue {\n code: string;\n severity: QualitySeverity;\n message: string;\n}\n\nexport interface QualityRound {\n round: number;\n kind: string;\n status: \"passed\" | \"warning\" | \"failed\";\n summary?: string;\n}\n\nexport interface QualityArtifact {\n kind: string;\n label?: string;\n itemCount?: number;\n}\n\nexport interface UnifiedQualityReport<TIssue extends BaseQualityIssue = BaseQualityIssue> {\n issues: TIssue[];\n rounds: QualityRound[];\n artifacts: QualityArtifact[];\n qualityGateStatus: QualityGateStatus;\n}\n\nexport function evaluateQualityGate(params: {\n issues: Array<{ severity: QualitySeverity }>;\n hasRoundWarnings?: boolean;\n}): QualityGateStatus {\n const { issues, hasRoundWarnings = false } = params;\n const hasBlocking = issues.some((issue) => issue.severity === \"blocking\");\n const hasWarnings = issues.some((issue) => issue.severity === \"warning\") || hasRoundWarnings;\n return hasBlocking ? \"failed\" : hasWarnings ? \"warning\" : \"passed\";\n}\n\nexport function shouldFailQualityGate(\n mode: QualityGateMode,\n status: QualityGateStatus,\n): boolean {\n return mode === \"strict\" && status === \"failed\";\n}\n","import type { ApplicationField, ApplicationState } from \"../schemas/application\";\nimport type { BaseQualityIssue, QualityArtifact, QualityGateStatus, QualityRound } from \"../core/quality\";\nimport { evaluateQualityGate } from \"../core/quality\";\n\nexport interface ApplicationQualityIssue extends BaseQualityIssue {\n message: string;\n fieldId?: string;\n}\n\nexport interface ApplicationEmailReview {\n issues: ApplicationQualityIssue[];\n qualityGateStatus: QualityGateStatus;\n}\n\nexport interface ApplicationQualityReport {\n issues: ApplicationQualityIssue[];\n rounds?: QualityRound[];\n artifacts?: QualityArtifact[];\n emailReview?: ApplicationEmailReview;\n qualityGateStatus: QualityGateStatus;\n}\n\nfunction isVagueSource(source: string | undefined): boolean {\n if (!source) return true;\n const normalized = source.trim().toLowerCase();\n return normalized === \"unknown\"\n || normalized.includes(\"existing records\")\n || normalized.includes(\"available data\")\n || normalized === \"context\"\n || normalized === \"user provided\";\n}\n\nfunction isSourceGroundedPolicyValue(field: ApplicationField): boolean {\n if (!field.value) return false;\n const source = field.source?.toLowerCase() ?? \"\";\n if (field.sourceSpanIds?.length) return false;\n if (field.userSourceSpanIds?.length) return false;\n\n const label = `${field.section} ${field.label}`.toLowerCase();\n const highValueLabel = /\\b(policy|effective|expiration|date|limit|deductible|premium|coverage|exclusion|condition|endorsement|location|vehicle|named insured|revenue|payroll|loss|claim|prior)\\b/.test(label);\n const highValueType = field.fieldType === \"currency\" || field.fieldType === \"date\" || field.fieldType === \"numeric\" || field.fieldType === \"declaration\";\n const fromPolicyLikeSource = /\\b(policy|quote|document|lookup|carrier|endorsement)\\b/.test(source);\n\n return fromPolicyLikeSource && (highValueLabel || highValueType);\n}\n\nexport function buildApplicationQualityReport(state: ApplicationState): ApplicationQualityReport {\n const issues: ApplicationQualityIssue[] = [];\n const seenIds = new Set<string>();\n\n for (const field of state.fields) {\n if (seenIds.has(field.id)) {\n issues.push({\n code: \"duplicate_field_id\",\n severity: \"blocking\",\n message: `Field \"${field.label}\" has a duplicate id \"${field.id}\".`,\n fieldId: field.id,\n });\n }\n seenIds.add(field.id);\n\n if (field.required && !field.value) {\n issues.push({\n code: \"required_field_unfilled\",\n severity: \"warning\",\n message: `Required field \"${field.label}\" is still unfilled.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && !field.source) {\n issues.push({\n code: \"filled_field_missing_source\",\n severity: \"blocking\",\n message: `Filled field \"${field.label}\" is missing source provenance.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && isVagueSource(field.source)) {\n issues.push({\n code: \"filled_field_vague_source\",\n severity: \"warning\",\n message: `Filled field \"${field.label}\" has a vague or non-citable source.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && (!field.confidence || field.confidence === \"low\")) {\n issues.push({\n code: \"filled_field_low_confidence\",\n severity: \"warning\",\n message: `Filled field \"${field.label}\" has low or missing confidence.`,\n fieldId: field.id,\n });\n }\n\n if (isSourceGroundedPolicyValue(field)) {\n issues.push({\n code: \"policy_value_missing_source_span\",\n severity: \"blocking\",\n message: `Filled policy-derived field \"${field.label}\" is missing source span evidence.`,\n fieldId: field.id,\n });\n }\n }\n\n return {\n issues,\n rounds: [],\n artifacts: [\n { kind: \"application_fields\", label: \"Application Fields\", itemCount: state.fields.length },\n ],\n qualityGateStatus: evaluateQualityGate({ issues }),\n };\n}\n\nexport function reviewBatchEmail(text: string, batchFields: ApplicationField[]): ApplicationEmailReview {\n const issues: ApplicationQualityIssue[] = [];\n const normalized = text.toLowerCase();\n\n for (const field of batchFields) {\n const label = field.label.trim().toLowerCase();\n if (label.length >= 6 && !normalized.includes(label)) {\n issues.push({\n code: \"email_missing_field_prompt\",\n severity: \"warning\",\n message: `Generated email does not clearly mention field \"${field.label}\".`,\n fieldId: field.id,\n });\n }\n }\n\n return {\n issues,\n qualityGateStatus: evaluateQualityGate({ issues }),\n };\n}\n","import type { ApplicationField, ReplyIntent } from \"../schemas/application\";\n\nconst MAX_DOCUMENT_SEARCH_FIELDS = 5;\nconst LOW_VALUE_FIELD_RATIO_LIMIT = 0.6;\n\nexport interface ApplicationWorkflowPlan {\n runBackfill: boolean;\n runContextAutoFill: boolean;\n documentSearchFields: ApplicationField[];\n runBatching: boolean;\n unfilledFields: ApplicationField[];\n}\n\nexport interface ApplicationWorkflowPlanInput {\n fields: ApplicationField[];\n hasBackfillProvider: boolean;\n orgContextCount: number;\n hasDocumentStore: boolean;\n hasMemoryStore: boolean;\n}\n\nexport interface ReplyActionPlan {\n parseAnswers: boolean;\n runLookup: boolean;\n answerQuestion: boolean;\n advanceBatch: boolean;\n generateNextEmail: boolean;\n}\n\nexport interface ReplyActionPlanInput {\n intent: ReplyIntent;\n currentBatchFields: ApplicationField[];\n nextBatchFields?: ApplicationField[];\n hasDocumentStore: boolean;\n}\n\nexport function planApplicationWorkflow(input: ApplicationWorkflowPlanInput): ApplicationWorkflowPlan {\n const unfilledFields = input.fields.filter(isUnfilled);\n const documentSearchFields = planDocumentSearchFields(\n unfilledFields,\n input.hasDocumentStore && input.hasMemoryStore,\n );\n\n return {\n runBackfill: input.hasBackfillProvider && unfilledFields.length > 0,\n runContextAutoFill: input.orgContextCount > 0 && unfilledFields.length > 0,\n documentSearchFields,\n runBatching: unfilledFields.length > 0,\n unfilledFields,\n };\n}\n\nexport function planReplyActions(input: ReplyActionPlanInput): ReplyActionPlan {\n const hasCurrentFields = input.currentBatchFields.length > 0;\n const nextBatchNeedsAnswers = (input.nextBatchFields ?? []).some(isUnfilled);\n const hasLookupRequests = (input.intent.lookupRequests?.length ?? 0) > 0;\n\n return {\n parseAnswers: input.intent.hasAnswers && hasCurrentFields,\n runLookup: hasLookupRequests && input.hasDocumentStore,\n answerQuestion: Boolean(input.intent.questionText)\n && (input.intent.primaryIntent === \"question\" || input.intent.primaryIntent === \"mixed\"),\n advanceBatch: (hasCurrentFields && input.currentBatchFields.every((field) => !isUnfilled(field)))\n || (!hasCurrentFields && nextBatchNeedsAnswers),\n generateNextEmail: nextBatchNeedsAnswers,\n };\n}\n\nfunction planDocumentSearchFields(\n unfilledFields: ApplicationField[],\n hasStores: boolean,\n): ApplicationField[] {\n if (!hasStores || unfilledFields.length === 0) return [];\n\n const searchableFields = unfilledFields.filter(isHighValueLookupField);\n if (searchableFields.length === 0) return [];\n\n const lowValueRatio = 1 - searchableFields.length / unfilledFields.length;\n if (unfilledFields.length > MAX_DOCUMENT_SEARCH_FIELDS && lowValueRatio > LOW_VALUE_FIELD_RATIO_LIMIT) {\n return [];\n }\n\n return searchableFields.slice(0, MAX_DOCUMENT_SEARCH_FIELDS);\n}\n\nfunction isUnfilled(field: ApplicationField): boolean {\n return field.value === undefined || field.value.trim() === \"\";\n}\n\nfunction isHighValueLookupField(field: ApplicationField): boolean {\n const text = `${field.section} ${field.label}`.toLowerCase();\n\n if (field.required) return true;\n\n return [\n \"carrier\",\n \"policy\",\n \"premium\",\n \"limit\",\n \"deductible\",\n \"insured\",\n \"address\",\n \"revenue\",\n \"payroll\",\n \"effective\",\n \"expiration\",\n \"coverage\",\n \"class code\",\n \"fein\",\n \"entity\",\n ].some((term) => text.includes(term));\n}\n","import { z } from \"zod\";\nimport { AcordLobCodeSchema, toLobCodes } from \"../schemas/lines-of-business\";\n\nexport const SourceSpanKindSchema = z.enum([\n \"pdf_text\",\n \"pdf_image\",\n \"html\",\n \"markdown\",\n \"plain_text\",\n \"structured_field\",\n]);\nexport type SourceSpanKind = z.infer<typeof SourceSpanKindSchema>;\n\nexport const SourceSpanUnitSchema = z.enum([\n \"page\",\n \"section\",\n \"table\",\n \"table_row\",\n \"table_cell\",\n \"key_value\",\n \"text\",\n]);\nexport type SourceSpanUnit = z.infer<typeof SourceSpanUnitSchema>;\n\nexport const SourceKindSchema = z.enum([\n \"policy_pdf\",\n \"application_pdf\",\n \"email\",\n \"attachment\",\n \"manual_note\",\n]);\nexport type SourceKind = z.infer<typeof SourceKindSchema>;\n\nexport const SourceSpanBBoxSchema = z.object({\n page: z.number().int().positive(),\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n});\nexport type SourceSpanBBox = z.infer<typeof SourceSpanBBoxSchema>;\n\nexport const SourceSpanLocationSchema = z.object({\n page: z.number().int().positive().optional(),\n startPage: z.number().int().positive().optional(),\n endPage: z.number().int().positive().optional(),\n charStart: z.number().int().nonnegative().optional(),\n charEnd: z.number().int().nonnegative().optional(),\n lineStart: z.number().int().positive().optional(),\n lineEnd: z.number().int().positive().optional(),\n fieldPath: z.string().optional(),\n});\nexport type SourceSpanLocation = z.infer<typeof SourceSpanLocationSchema>;\n\nexport const SourceSpanTableLocationSchema = z.object({\n tableId: z.string().optional(),\n rowIndex: z.number().int().nonnegative().optional(),\n columnIndex: z.number().int().nonnegative().optional(),\n columnName: z.string().optional(),\n rowSpanId: z.string().optional(),\n tableSpanId: z.string().optional(),\n isHeader: z.boolean().optional(),\n});\nexport type SourceSpanTableLocation = z.infer<typeof SourceSpanTableLocationSchema>;\n\nexport const SourceSpanSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceKind: SourceKindSchema.optional(),\n chunkId: z.string().optional(),\n kind: SourceSpanKindSchema,\n text: z.string(),\n hash: z.string().min(1),\n textHash: z.string().optional(),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n sectionId: z.string().optional(),\n formNumber: z.string().optional(),\n sourceUnit: SourceSpanUnitSchema.optional(),\n parentSpanId: z.string().optional(),\n table: SourceSpanTableLocationSchema.optional(),\n bbox: z.array(SourceSpanBBoxSchema).optional(),\n location: SourceSpanLocationSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\nexport type SourceSpan = z.infer<typeof SourceSpanSchema>;\n\nexport const SourceSpanRefSchema = z.object({\n sourceSpanId: z.string().min(1),\n documentId: z.string().min(1).optional(),\n chunkId: z.string().optional(),\n quote: z.string().optional(),\n hash: z.string().optional(),\n location: SourceSpanLocationSchema.optional(),\n});\nexport type SourceSpanRef = z.infer<typeof SourceSpanRefSchema>;\n\nexport const SourceChunkSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceSpanIds: z.array(z.string().min(1)),\n text: z.string(),\n textHash: z.string().min(1),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.string()).default({}),\n});\nexport type SourceChunk = z.infer<typeof SourceChunkSchema>;\n\nexport const DocumentSourceNodeKindSchema = z.enum([\n \"document\",\n \"page_group\",\n \"page\",\n \"form\",\n \"endorsement\",\n \"section\",\n \"schedule\",\n \"clause\",\n \"table\",\n \"table_row\",\n \"table_cell\",\n \"text\",\n]);\nexport type DocumentSourceNodeKind = z.infer<typeof DocumentSourceNodeKindSchema>;\n\nexport const DocumentSourceNodeSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n parentId: z.string().optional(),\n kind: DocumentSourceNodeKindSchema,\n title: z.string(),\n description: z.string(),\n textExcerpt: z.string().optional(),\n sourceSpanIds: z.array(z.string().min(1)),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n bbox: z.array(SourceSpanBBoxSchema).optional(),\n order: z.number().int().nonnegative(),\n path: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\nexport type DocumentSourceNode = z.infer<typeof DocumentSourceNodeSchema>;\n\nexport const SourceBackedValueSchema = z.object({\n value: z.string(),\n normalizedValue: z.string().optional(),\n confidence: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type SourceBackedValue = z.infer<typeof SourceBackedValueSchema>;\n\nexport const OperationalAddressSchema = z.object({\n street1: z.string().optional(),\n street2: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n zip: z.string().optional(),\n country: z.string().optional(),\n formatted: z.string().optional(),\n});\nexport type OperationalAddress = z.infer<typeof OperationalAddressSchema>;\n\nexport const OperationalDeclarationFactSchema = z.object({\n field: z.enum([\n \"namedInsured\",\n \"mailingAddress\",\n \"dba\",\n \"entityType\",\n \"taxId\",\n \"additionalNamedInsured\",\n \"policyNumber\",\n \"insurer\",\n \"broker\",\n \"effectiveDate\",\n \"expirationDate\",\n \"premium\",\n \"other\",\n ]),\n label: z.string().optional(),\n value: z.string(),\n normalizedValue: z.string().optional(),\n valueKind: z.enum([\"string\", \"number\", \"date\", \"money\", \"address\", \"list\", \"unknown\"]).default(\"string\"),\n address: OperationalAddressSchema.optional(),\n confidence: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalDeclarationFact = z.infer<typeof OperationalDeclarationFactSchema>;\n\nexport const OperationalCoverageTermSchema = z.object({\n kind: z.enum([\n \"each_claim_limit\",\n \"each_occurrence_limit\",\n \"each_loss_limit\",\n \"aggregate_limit\",\n \"sublimit\",\n \"retention\",\n \"deductible\",\n \"retroactive_date\",\n \"premium\",\n \"other\",\n ]).default(\"other\"),\n label: z.string(),\n value: z.string(),\n amount: z.number().optional(),\n appliesTo: z.string().optional(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalCoverageTerm = z.infer<typeof OperationalCoverageTermSchema>;\n\nexport const OperationalCoverageLineSchema = z.object({\n name: z.string(),\n coverageCode: z.string().optional(),\n limit: z.string().optional(),\n deductible: z.string().optional(),\n premium: z.string().optional(),\n retroactiveDate: z.string().optional(),\n formNumber: z.string().optional(),\n sectionRef: z.string().optional(),\n endorsementNumber: z.string().optional(),\n limits: z.array(OperationalCoverageTermSchema).default([]),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalCoverageLine = z.infer<typeof OperationalCoverageLineSchema>;\n\nexport const OperationalPartySchema = z.object({\n role: z.string(),\n name: z.string(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalParty = z.infer<typeof OperationalPartySchema>;\n\nexport const OperationalEndorsementSupportSchema = z.object({\n kind: z.string(),\n status: z.enum([\"supported\", \"excluded\", \"requires_review\"]),\n summary: z.string(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalEndorsementSupport = z.infer<typeof OperationalEndorsementSupportSchema>;\n\nfunction legacyOperationalProfileInput(value: unknown) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n const record = value as Record<string, unknown>;\n if (\"linesOfBusiness\" in record) return value;\n if (!(\"policyTypes\" in record)) return value;\n return {\n ...record,\n linesOfBusiness: record.policyTypes,\n };\n}\n\nconst OperationalLinesOfBusinessSchema = z.preprocess(\n (value) => (Array.isArray(value) ? toLobCodes(value.filter((item): item is string => typeof item === \"string\")) : undefined),\n z.array(AcordLobCodeSchema).default([\"UN\"]),\n);\n\nexport const PolicyOperationalProfileSchema = z.preprocess(\n legacyOperationalProfileInput,\n z.object({\n documentType: z.enum([\"policy\", \"quote\"]).default(\"policy\"),\n linesOfBusiness: OperationalLinesOfBusinessSchema,\n policyNumber: SourceBackedValueSchema.optional(),\n namedInsured: SourceBackedValueSchema.optional(),\n insurer: SourceBackedValueSchema.optional(),\n broker: SourceBackedValueSchema.optional(),\n effectiveDate: SourceBackedValueSchema.optional(),\n expirationDate: SourceBackedValueSchema.optional(),\n retroactiveDate: SourceBackedValueSchema.optional(),\n premium: SourceBackedValueSchema.optional(),\n declarationFacts: z.array(OperationalDeclarationFactSchema).default([]),\n coverages: z.array(OperationalCoverageLineSchema).default([]),\n parties: z.array(OperationalPartySchema).default([]),\n endorsementSupport: z.array(OperationalEndorsementSupportSchema).default([]),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n warnings: z.array(z.string()).default([]),\n }),\n);\nexport type PolicyOperationalProfile = z.infer<typeof PolicyOperationalProfileSchema>;\n","import { z } from \"zod\";\n\nexport const ACORD_LOB_CODES = [\n \"AAPPL\",\n \"AGLIA\",\n \"AGPP\",\n \"AGPR\",\n \"AIRC\",\n \"AIRPFB\",\n \"APKG\",\n \"APKGE\",\n \"APROD\",\n \"ARVP\",\n \"AUTO\",\n \"AUTOB\",\n \"AUTOP\",\n \"AVPKG\",\n \"BANDM\",\n \"BLANK\",\n \"BMISC\",\n \"BOAT\",\n \"BOP\",\n \"BOPGL\",\n \"BOPPR\",\n \"CAVN\",\n \"CEQFL\",\n \"CFIRE\",\n \"CFRM\",\n \"CGL\",\n \"COMAR\",\n \"COMR\",\n \"CONTR\",\n \"CPKGE\",\n \"CPMP\",\n \"CRIME\",\n \"DFIRE\",\n \"DISAB\",\n \"DO\",\n \"EDP\",\n \"EL\",\n \"EO\",\n \"EPLI\",\n \"EQ\",\n \"EQPFL\",\n \"EXLIA\",\n \"FIDTY\",\n \"FIDUC\",\n \"FINEA\",\n \"FLOOD\",\n \"GARAG\",\n \"GL\",\n \"GLASS\",\n \"HANG\",\n \"HBB\",\n \"HOME\",\n \"INBR\",\n \"INMAR\",\n \"INMRC\",\n \"INMRP\",\n \"JUDCL\",\n \"KIDRA\",\n \"LL\",\n \"MHOME\",\n \"MMAL\",\n \"Motorcycle\",\n \"MTRTK\",\n \"OLIB\",\n \"PHYS\",\n \"PKG\",\n \"PL\",\n \"PLMSC\",\n \"PPKGE\",\n \"PROP\",\n \"PROPC\",\n \"PUBOF\",\n \"RECV\",\n \"SCHPR\",\n \"SIGNS\",\n \"SMP\",\n \"SURE\",\n \"TRANS\",\n \"TRUCK\",\n \"UMBRC\",\n \"UMBRL\",\n \"UMBRP\",\n \"UN\",\n \"WCMA\",\n \"WIND\",\n \"WORK\",\n \"WORKP\",\n \"WORKV\",\n] as const;\n\nexport const AcordLobCodeSchema = z.enum(ACORD_LOB_CODES);\nexport type AcordLobCode = z.infer<typeof AcordLobCodeSchema>;\n\nexport const ACORD_LOB_LABELS: Record<AcordLobCode, string> = {\n AAPPL: \"Aircraft / Aerial Applicator\",\n AGLIA: \"Agricultural Liability\",\n AGPP: \"Agricultural Personal Property\",\n AGPR: \"Agricultural Property\",\n AIRC: \"Aircraft\",\n AIRPFB: \"Airport / Fixed Base Operator\",\n APKG: \"Agricultural Package\",\n APKGE: \"Agricultural Package (Extended)\",\n APROD: \"Agricultural Products\",\n ARVP: \"Recreational Vehicle Package\",\n AUTO: \"Automobile\",\n AUTOB: \"Business Auto\",\n AUTOP: \"Personal Auto\",\n AVPKG: \"Aviation Package\",\n BANDM: \"Boiler & Machinery\",\n BLANK: \"Blanket\",\n BMISC: \"Business Miscellaneous\",\n BOAT: \"Boat\",\n BOP: \"Businessowners Policy\",\n BOPGL: \"BOP - General Liability\",\n BOPPR: \"BOP - Property\",\n CAVN: \"Commercial Aviation\",\n CEQFL: \"Contractors Equipment Floater\",\n CFIRE: \"Commercial Fire\",\n CFRM: \"Commercial Farm\",\n CGL: \"Commercial General Liability\",\n COMAR: \"Commercial Marine / Ocean Marine\",\n COMR: \"Commercial (misc.)\",\n CONTR: \"Contractors\",\n CPKGE: \"Commercial Package\",\n CPMP: \"Commercial Package (multi-peril)\",\n CRIME: \"Crime\",\n DFIRE: \"Dwelling Fire\",\n DISAB: \"Disability\",\n DO: \"Directors & Officers Liability\",\n EDP: \"Electronic Data Processing\",\n EL: \"Employers Liability\",\n EO: \"Errors & Omissions\",\n EPLI: \"Employment Practices Liability\",\n EQ: \"Earthquake\",\n EQPFL: \"Equipment Floater\",\n EXLIA: \"Excess Liability\",\n FIDTY: \"Fidelity\",\n FIDUC: \"Fiduciary Liability\",\n FINEA: \"Fine Arts\",\n FLOOD: \"Flood\",\n GARAG: \"Garage\",\n GL: \"General Liability\",\n GLASS: \"Glass\",\n HANG: \"Hangar (Aviation)\",\n HBB: \"Home-Based Business\",\n HOME: \"Homeowners\",\n INBR: \"Inland Marine - Brokers\",\n INMAR: \"Inland Marine\",\n INMRC: \"Inland Marine - Commercial\",\n INMRP: \"Inland Marine - Personal\",\n JUDCL: \"Judicial Bonds\",\n KIDRA: \"Kidnap & Ransom\",\n LL: \"Liquor Liability\",\n MHOME: \"Mobile Home\",\n MMAL: \"Medical Malpractice\",\n Motorcycle: \"Motorcycle\",\n MTRTK: \"Motor Truck Cargo\",\n OLIB: \"Other Liability\",\n PHYS: \"Physical Damage\",\n PKG: \"Package\",\n PL: \"Professional Liability\",\n PLMSC: \"Personal Lines Miscellaneous\",\n PPKGE: \"Personal Package\",\n PROP: \"Property\",\n PROPC: \"Property - Commercial\",\n PUBOF: \"Public Officials Liability\",\n RECV: \"Recreational Vehicle\",\n SCHPR: \"Scheduled Property\",\n SIGNS: \"Signs\",\n SMP: \"Special Multi-Peril\",\n SURE: \"Surety\",\n TRANS: \"Transportation\",\n TRUCK: \"Trucking\",\n UMBRC: \"Umbrella - Commercial\",\n UMBRL: \"Umbrella\",\n UMBRP: \"Umbrella - Personal\",\n UN: \"Unspecified / Unknown\",\n WCMA: \"Workers Comp - Monopolistic/State\",\n WIND: \"Wind\",\n WORK: \"Workers Compensation\",\n WORKP: \"Workers Compensation (Personal/Package)\",\n WORKV: \"Workers Compensation (Voluntary)\",\n};\n\nexport const EXCLUDED_ACORD_LOB_CODES = new Set([\n \"ACHE\",\n \"INTER\",\n \"LICPT\",\n \"LSTIN\",\n \"NWFGR\",\n \"PAPER\",\n \"SCAP\",\n \"SFRNC\",\n]);\n\nexport const LEGACY_POLICY_TYPE_TO_LOB: Record<string, AcordLobCode[]> = {\n general_liability: [\"CGL\"],\n commercial_property: [\"PROPC\"],\n commercial_auto: [\"AUTOB\"],\n non_owned_auto: [\"AUTOB\"],\n workers_comp: [\"WORK\"],\n umbrella: [\"UMBRC\"],\n excess_liability: [\"EXLIA\"],\n professional_liability: [\"EO\"],\n cyber: [\"OLIB\"],\n epli: [\"EPLI\"],\n directors_officers: [\"DO\"],\n fiduciary_liability: [\"FIDUC\"],\n crime_fidelity: [\"CRIME\"],\n inland_marine: [\"INMRC\"],\n builders_risk: [\"INMRC\"],\n environmental: [\"OLIB\"],\n ocean_marine: [\"COMAR\"],\n surety: [\"SURE\"],\n product_liability: [\"OLIB\"],\n bop: [\"BOP\"],\n management_liability_package: [\"DO\", \"EPLI\", \"FIDUC\"],\n property: [\"PROP\"],\n homeowners_ho3: [\"HOME\"],\n homeowners_ho5: [\"HOME\"],\n renters_ho4: [\"HOME\"],\n condo_ho6: [\"HOME\"],\n dwelling_fire: [\"DFIRE\"],\n mobile_home: [\"MHOME\"],\n personal_auto: [\"AUTOP\"],\n personal_umbrella: [\"UMBRP\"],\n flood_nfip: [\"FLOOD\"],\n flood_private: [\"FLOOD\"],\n earthquake: [\"EQ\"],\n personal_inland_marine: [\"INMRP\"],\n watercraft: [\"BOAT\"],\n recreational_vehicle: [\"RECV\"],\n farm_ranch: [\"CFRM\"],\n life: [\"UN\"],\n critical_illness: [\"DISAB\"],\n disability: [\"DISAB\"],\n long_term_care: [\"UN\"],\n pet: [\"UN\"],\n travel: [\"UN\"],\n identity_theft: [\"UN\"],\n title: [\"UN\"],\n other: [\"UN\"],\n unknown: [\"UN\"],\n auto: [\"AUTOB\"],\n crime: [\"CRIME\"],\n crim: [\"CRIME\"],\n fiduciary: [\"FIDUC\"],\n d_and_o: [\"DO\"],\n d_o: [\"DO\"],\n homeowners: [\"HOME\"],\n renters: [\"HOME\"],\n flood: [\"FLOOD\"],\n boat: [\"BOAT\"],\n motorcycle: [\"Motorcycle\"],\n};\n\nexport const PERSONAL_LOB_CODES = new Set<AcordLobCode>([\n \"AUTOP\",\n \"HOME\",\n \"MHOME\",\n \"DFIRE\",\n \"FLOOD\",\n \"EQ\",\n \"INMRP\",\n \"UMBRP\",\n \"BOAT\",\n \"RECV\",\n \"Motorcycle\",\n \"PPKGE\",\n \"DISAB\",\n \"PLMSC\",\n \"HBB\",\n]);\n\nfunction hasOwn<T extends object>(object: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction canonicalLegacyKey(value: string) {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \" and \")\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_+/g, \"_\");\n}\n\nfunction humanize(value: string) {\n return value\n .trim()\n .replace(/[_-]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function isLobCode(value: unknown): value is AcordLobCode {\n return typeof value === \"string\" && hasOwn(ACORD_LOB_LABELS, value);\n}\n\nfunction resolveLobCode(value: string): AcordLobCode | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (isLobCode(trimmed)) return trimmed;\n if (trimmed.toLowerCase() === \"motorcycle\") return \"Motorcycle\";\n const legacy = LEGACY_POLICY_TYPE_TO_LOB[canonicalLegacyKey(trimmed)];\n if (legacy?.[0]) return legacy[0];\n const upper = trimmed.toUpperCase();\n if (upper === \"CRIM\") return \"CRIME\";\n if (isLobCode(upper)) return upper;\n return undefined;\n}\n\nexport function normalizeOperationalLinesOfBusiness(values: unknown): AcordLobCode[] {\n const source = Array.isArray(values)\n ? values.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n return toLobCodes(source);\n}\n\nexport function toLobCodes(values?: readonly string[]): AcordLobCode[] {\n const source = values?.filter((value) => typeof value === \"string\" && value.trim()) ?? [];\n if (source.length === 0) return [\"UN\"];\n const codes: AcordLobCode[] = [];\n for (const value of source) {\n const trimmed = value.trim();\n if (isLobCode(trimmed)) {\n codes.push(trimmed);\n continue;\n }\n if (trimmed.toUpperCase() === \"CRIM\") {\n codes.push(\"CRIME\");\n continue;\n }\n const mapped = LEGACY_POLICY_TYPE_TO_LOB[canonicalLegacyKey(trimmed)];\n if (mapped) {\n codes.push(...mapped);\n continue;\n }\n const upper = trimmed.toUpperCase();\n if (isLobCode(upper)) {\n codes.push(upper);\n continue;\n }\n codes.push(\"UN\");\n }\n return Array.from(new Set(codes));\n}\n\nexport function lobLabel(value: string): string {\n const code = resolveLobCode(value);\n return code ? ACORD_LOB_LABELS[code] : humanize(value);\n}\n\nexport function isPersonalLob(code: string): boolean {\n return isLobCode(code) && PERSONAL_LOB_CODES.has(code);\n}\n","import type { SourceSpanLocation } from \"./schemas\";\n\nexport interface SourceSpanIdInput {\n documentId: string;\n chunkId?: string;\n text?: string;\n location?: SourceSpanLocation;\n fieldPath?: string;\n}\n\nfunction normalizeText(text: string): string {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"undefined\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .filter((key) => record[key] !== undefined)\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nexport function stableHash(value: unknown): string {\n const input = stableStringify(value);\n let hashA = 0x811c9dc5;\n let hashB = 0x45d9f3b;\n for (let index = 0; index < input.length; index++) {\n const char = input.charCodeAt(index);\n hashA ^= char;\n hashA = Math.imul(hashA, 0x01000193);\n hashB ^= char + index;\n hashB = Math.imul(hashB, 0x27d4eb2d);\n }\n return `${(hashA >>> 0).toString(16).padStart(8, \"0\")}${(hashB >>> 0).toString(16).padStart(8, \"0\")}`;\n}\n\nexport function sourceSpanTextHash(text: string): string {\n return stableHash(normalizeText(text));\n}\n\nexport function buildSourceSpanId(input: SourceSpanIdInput): string {\n const hash = stableHash({\n documentId: input.documentId,\n chunkId: input.chunkId,\n fieldPath: input.fieldPath,\n location: input.location,\n text: input.text ? normalizeText(input.text) : undefined,\n }).slice(0, 16);\n\n return [input.documentId, input.chunkId, input.fieldPath, hash]\n .filter((part): part is string => !!part)\n .map((part) => part.replace(/[^a-zA-Z0-9_.:-]/g, \"_\"))\n .join(\":\");\n}\n","import {\n SourceChunkSchema,\n SourceSpanSchema,\n type SourceChunk,\n type SourceKind,\n type SourceSpan,\n type SourceSpanTableLocation,\n type SourceSpanUnit,\n} from \"./schemas\";\nimport { sourceSpanTextHash, stableHash } from \"./ids\";\n\nexport interface SourceTextUnitInput {\n documentId: string;\n sourceKind: SourceKind;\n text: string;\n pageStart?: number;\n pageEnd?: number;\n sectionId?: string;\n formNumber?: string;\n sourceUnit?: SourceSpanUnit;\n parentSpanId?: string;\n table?: SourceSpanTableLocation;\n metadata?: Record<string, string>;\n}\n\nexport interface SourcePageInput {\n documentId: string;\n sourceKind?: SourceKind;\n pageNumber: number;\n text: string;\n sectionId?: string;\n formNumber?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface SectionSourceSpanOptions {\n minSectionChars?: number;\n headingPattern?: RegExp;\n}\n\nexport interface SourceChunkOptions {\n maxChars?: number;\n overlapChars?: number;\n}\n\ntype SourceSpanWithOriginalIndex = SourceSpan & { __originalIndex: number };\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_.:-]/g, \"_\");\n}\n\nexport function buildSourceSpan(input: SourceTextUnitInput, localIndex = 0): SourceSpan {\n const text = normalizeWhitespace(input.text);\n const textHash = sourceSpanTextHash(text);\n const pagePart = input.pageStart ?? \"na\";\n const id = [\n sanitizeIdPart(input.documentId),\n \"span\",\n pagePart,\n localIndex,\n textHash.slice(0, 12),\n ].join(\":\");\n\n return SourceSpanSchema.parse({\n id,\n documentId: input.documentId,\n sourceKind: input.sourceKind,\n kind: input.sourceKind.endsWith(\"_pdf\") ? \"pdf_text\" : \"plain_text\",\n text,\n hash: textHash,\n textHash,\n pageStart: input.pageStart,\n pageEnd: input.pageEnd,\n sectionId: input.sectionId,\n formNumber: input.formNumber,\n sourceUnit: input.sourceUnit,\n parentSpanId: input.parentSpanId,\n table: input.table,\n location: {\n page: input.pageStart === input.pageEnd ? input.pageStart : undefined,\n startPage: input.pageStart,\n endPage: input.pageEnd,\n fieldPath: input.sectionId,\n },\n metadata: input.metadata,\n });\n}\n\nexport function buildPageSourceSpans(pages: SourcePageInput[]): SourceSpan[] {\n return pages\n .filter((page) => normalizeWhitespace(page.text).length > 0)\n .map((page, index) =>\n buildSourceSpan(\n {\n documentId: page.documentId,\n sourceKind: page.sourceKind ?? \"policy_pdf\",\n text: page.text,\n pageStart: page.pageNumber,\n pageEnd: page.pageNumber,\n sectionId: page.sectionId,\n formNumber: page.formNumber,\n sourceUnit: \"page\",\n metadata: {\n ...(page.metadata ?? {}),\n sourceUnit: page.metadata?.sourceUnit ?? \"page\",\n },\n },\n index,\n ),\n );\n}\n\nexport function buildSectionSourceSpans(\n pages: SourcePageInput[],\n options: SectionSourceSpanOptions = {},\n): SourceSpan[] {\n const headingPattern = options.headingPattern ?? /^(?:SECTION|COVERAGE|EXCLUSION|EXCLUSIONS|CONDITION|CONDITIONS|ENDORSEMENT|ENDORSEMENTS|DEFINITION|DEFINITIONS|DECLARATIONS?|SCHEDULE|FORM)\\b[\\s:.-]*(.*)$/i;\n const minSectionChars = options.minSectionChars ?? 120;\n const spans: SourceSpan[] = [];\n\n for (const page of pages) {\n const sections = splitPageIntoSections(page.text, headingPattern, minSectionChars);\n for (const section of sections) {\n spans.push(buildSourceSpan(\n {\n documentId: page.documentId,\n sourceKind: page.sourceKind ?? \"policy_pdf\",\n text: section.text,\n pageStart: page.pageNumber,\n pageEnd: page.pageNumber,\n sectionId: section.title,\n formNumber: inferFormNumber(section.text),\n sourceUnit: \"section\",\n metadata: {\n ...(page.metadata ?? {}),\n sourceUnit: \"section_candidate\",\n },\n },\n spans.length,\n ));\n }\n }\n\n return spans;\n}\n\nexport function buildTextSourceSpans(input: SourceTextUnitInput, options: SourceChunkOptions = {}): SourceSpan[] {\n const maxChars = options.maxChars ?? 4000;\n const overlapChars = Math.min(options.overlapChars ?? 0, Math.max(0, maxChars - 1));\n const text = normalizeWhitespace(input.text);\n if (!text) return [];\n\n const spans: SourceSpan[] = [];\n let cursor = 0;\n while (cursor < text.length) {\n const end = Math.min(text.length, cursor + maxChars);\n const unitText = text.slice(cursor, end);\n spans.push(buildSourceSpan({ ...input, text: unitText }, spans.length));\n if (end === text.length) break;\n cursor = end - overlapChars;\n }\n\n return spans;\n}\n\nexport function chunkSourceSpans(spans: SourceSpan[], options: SourceChunkOptions = {}): SourceChunk[] {\n const maxChars = options.maxChars ?? 6000;\n const chunks: SourceChunk[] = [];\n let current: SourceSpan[] = [];\n let currentLength = 0;\n const spansForChunking = filterChunkableSourceSpans(spans);\n\n const flush = () => {\n if (current.length === 0) return;\n const text = current.map((span) => span.text).join(\"\\n\\n\");\n const textHash = sourceSpanTextHash(text);\n const pageStart = firstNumber(current.map((span) => span.pageStart));\n const pageEnd = lastNumber(current.map((span) => span.pageEnd ?? span.pageStart));\n const chunk: SourceChunk = {\n id: `${sanitizeIdPart(current[0].documentId)}:source_chunk:${chunks.length}:${stableHash({\n sourceSpanIds: current.map((span) => span.id),\n textHash,\n }).slice(0, 12)}`,\n documentId: current[0].documentId,\n sourceSpanIds: current.map((span) => span.id),\n text,\n textHash,\n pageStart,\n pageEnd,\n metadata: mergeMetadata(current),\n };\n chunks.push(SourceChunkSchema.parse(chunk));\n current = [];\n currentLength = 0;\n };\n\n for (const span of spansForChunking) {\n const nextLength = currentLength + span.text.length + (current.length > 0 ? 2 : 0);\n if (current.length > 0 && nextLength > maxChars) {\n flush();\n }\n current.push(span);\n currentLength += span.text.length + (current.length > 1 ? 2 : 0);\n }\n flush();\n\n return chunks;\n}\n\nexport function normalizeSourceSpans(spans: SourceSpan[]): SourceSpan[] {\n const droppedParentSpanIds = new Set<string>();\n const cleaned: SourceSpanWithOriginalIndex[] = [];\n\n for (const [index, span] of spans.entries()) {\n if (span.parentSpanId && droppedParentSpanIds.has(span.parentSpanId)) continue;\n const normalized = normalizeSourceSpanText(span);\n if (!normalized) {\n droppedParentSpanIds.add(span.id);\n continue;\n }\n cleaned.push({ ...normalized, __originalIndex: index });\n }\n\n return mergeTextRuns(cleaned).map(({ __originalIndex: _index, ...span }) => span);\n}\n\nfunction sourceUnit(span: SourceSpan): string | undefined {\n return span.sourceUnit ?? span.metadata?.sourceUnit;\n}\n\nfunction spanPage(span: SourceSpan): number | undefined {\n return span.pageStart ?? span.location?.page ?? span.location?.startPage;\n}\n\nfunction normalizeSourceSpanText(span: SourceSpan): SourceSpan | undefined {\n const unit = sourceUnit(span);\n const text = normalizeWhitespace(span.text);\n if (!text) return undefined;\n if (isDiscardableBoilerplate(text, unit)) return undefined;\n\n const cleanedText = cleanBoilerplateLines(text);\n if (!cleanedText) return undefined;\n if (cleanedText === text) return span;\n\n return retextSpan(span, cleanedText, {\n boilerplateRemoved: \"true\",\n removedBoilerplateText: removedBoilerplateLines(text).join(\" | \").slice(0, 500),\n });\n}\n\nfunction isDiscardableBoilerplate(text: string, unit?: string): boolean {\n const cleaned = normalizeWhitespace(text.replace(/\\bColumn\\s+\\d+:\\s*/gi, \"\"));\n if (/^SPECIMEN POLICY\\s+[-—]\\s+FOR TESTING ONLY$/i.test(cleaned)) return true;\n if (/^Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n if (/^[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}$/i.test(cleaned)) return true;\n if (/^[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}\\s*\\|\\s*Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n if (unit === \"table_row\" && /^[^|]{0,40}\\|\\s*Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n return false;\n}\n\nfunction isBoilerplateLine(line: string): boolean {\n const cleaned = normalizeWhitespace(line.replace(/\\bColumn\\s+\\d+:\\s*/gi, \"\"));\n return isDiscardableBoilerplate(cleaned) ||\n /^THIS IS A CLAIMS-MADE AND REPORTED POLICY\\.? PLEASE READ IT CAREFULLY\\.?$/i.test(cleaned);\n}\n\nfunction removedBoilerplateLines(text: string): string[] {\n return text\n .split(/\\s{2,}|\\r?\\n/)\n .map(normalizeWhitespace)\n .filter((line) => line && isBoilerplateLine(line));\n}\n\nfunction cleanBoilerplateLines(text: string): string {\n const withoutInlineBoilerplate = text\n .replace(/\\b(?:Column\\s+\\d+:\\s*)?[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}\\s+(?:\\|\\s*)?(?:Column\\s+\\d+:\\s*)?Page\\s+\\d+\\s+of\\s+\\d+\\b/gi, \" \")\n .replace(/\\bSPECIMEN POLICY\\s+[-—]\\s+FOR TESTING ONLY\\b/gi, \" \")\n .replace(/\\bPage\\s+\\d+\\s+of\\s+\\d+\\b/gi, \" \");\n const lines = withoutInlineBoilerplate.split(/\\r?\\n/);\n const filtered = lines\n .map(normalizeWhitespace)\n .filter((line) => line && !isBoilerplateLine(line));\n return normalizeWhitespace(filtered.join(\" \"));\n}\n\nfunction shouldMergeTextSpan(left: SourceSpanWithOriginalIndex, right: SourceSpanWithOriginalIndex): boolean {\n if (sourceUnit(left) !== \"text\" || sourceUnit(right) !== \"text\") return false;\n if (spanPage(left) !== spanPage(right)) return false;\n if ((left.metadata?.elementType === \"title\") || (right.metadata?.elementType === \"title\")) return false;\n const leftText = normalizeWhitespace(left.text);\n const rightText = normalizeWhitespace(right.text);\n if (!leftText || !rightText) return false;\n if (/[:.;!?)]$/.test(leftText)) return false;\n if (/^(?:[A-Z][A-Z0-9 &/(),.-]{8,}|Item\\s+\\d+|Section\\s+\\d+|Part\\s+[A-Z]\\b)/.test(rightText)) return false;\n return /^[a-z(]/.test(rightText) ||\n /\\b(?:a|an|and|any|as|at|by|for|from|in|into|may|must|of|or|that|the|this|to|with|within|you|your)$/i.test(leftText);\n}\n\nfunction mergeTextRuns(spans: SourceSpanWithOriginalIndex[]): SourceSpanWithOriginalIndex[] {\n const result: SourceSpanWithOriginalIndex[] = [];\n let current: SourceSpanWithOriginalIndex | undefined;\n\n for (const span of spans) {\n if (current && shouldMergeTextSpan(current, span)) {\n current = mergeTextSpanPair(current, span);\n continue;\n }\n if (current) result.push(current);\n current = span;\n }\n if (current) result.push(current);\n return result;\n}\n\nfunction mergeTextSpanPair(left: SourceSpanWithOriginalIndex, right: SourceSpanWithOriginalIndex): SourceSpanWithOriginalIndex {\n const text = normalizeWhitespace(`${left.text} ${right.text}`);\n const merged = retextSpan(left, text, {\n mergedSourceSpanIds: [left.metadata?.mergedSourceSpanIds, left.id, right.id, right.metadata?.mergedSourceSpanIds]\n .filter(Boolean)\n .join(\",\"),\n sourceSpanNormalization: \"merged_text_run\",\n });\n return {\n ...merged,\n bbox: [...(left.bbox ?? []), ...(right.bbox ?? [])],\n pageEnd: right.pageEnd ?? left.pageEnd,\n location: {\n ...left.location,\n endPage: right.location?.endPage ?? right.pageEnd ?? left.location?.endPage,\n },\n __originalIndex: left.__originalIndex,\n };\n}\n\nfunction retextSpan(span: SourceSpan, text: string, metadata: Record<string, string>): SourceSpan {\n const textHash = sourceSpanTextHash(text);\n return SourceSpanSchema.parse({\n ...span,\n id: `${span.id.split(\":\").slice(0, -1).join(\":\")}:${textHash.slice(0, 12)}`,\n text,\n hash: textHash,\n textHash,\n metadata: {\n ...(span.metadata ?? {}),\n ...metadata,\n },\n });\n}\n\nfunction filterChunkableSourceSpans(spans: SourceSpan[]): SourceSpan[] {\n const rowIds = new Set(\n spans\n .filter((span) => sourceUnit(span) === \"table_row\")\n .map((span) => span.id),\n );\n if (rowIds.size === 0) return spans;\n return spans.filter((span) => {\n if (sourceUnit(span) !== \"table_cell\") return true;\n const rowId = span.parentSpanId ?? span.table?.rowSpanId ?? span.metadata?.rowSpanId;\n return !rowId || !rowIds.has(rowId);\n });\n}\n\nfunction splitPageIntoSections(\n text: string,\n headingPattern: RegExp,\n minSectionChars: number,\n): Array<{ title: string; text: string }> {\n const lines = text.split(/\\r?\\n/);\n const sections: Array<{ title: string; lines: string[] }> = [];\n let current: { title: string; lines: string[] } | undefined;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n const match = line.match(headingPattern);\n if (match) {\n if (current) sections.push(current);\n const suffix = match[1]?.trim();\n current = {\n title: normalizeWhitespace(suffix ? `${line}` : line).slice(0, 120),\n lines: [line],\n };\n continue;\n }\n current?.lines.push(rawLine);\n }\n if (current) sections.push(current);\n\n return sections\n .map((section) => ({\n title: section.title,\n text: normalizeWhitespace(section.lines.join(\"\\n\")),\n }))\n .filter((section) => section.text.length >= minSectionChars);\n}\n\nfunction inferFormNumber(text: string): string | undefined {\n return text.match(/\\b[A-Z]{2,8}\\s+\\d{2,5}(?:\\s+\\d{2,4})?\\b/)?.[0];\n}\n\nfunction firstNumber(values: Array<number | undefined>): number | undefined {\n return values.find((value): value is number => typeof value === \"number\");\n}\n\nfunction lastNumber(values: Array<number | undefined>): number | undefined {\n return [...values].reverse().find((value): value is number => typeof value === \"number\");\n}\n\nfunction mergeMetadata(spans: SourceSpan[]): Record<string, string> {\n const metadata: Record<string, string> = {};\n for (const span of spans) {\n for (const [key, value] of Object.entries(span.metadata ?? {})) {\n metadata[key] = metadata[key] ? `${metadata[key]},${value}` : value;\n }\n if (span.formNumber) metadata.formNumber = span.formNumber;\n if (span.sectionId) metadata.sectionId = span.sectionId;\n if (span.sourceKind) metadata.sourceKind = span.sourceKind;\n }\n return metadata;\n}\n","import type {\n ApplicationField,\n ApplicationQuestionCondition,\n ApplicationQuestionGraph,\n ApplicationQuestionNode,\n ApplicationState,\n} from \"../schemas/application\";\n\nexport interface BuildQuestionGraphOptions {\n id: string;\n version?: string;\n title?: string;\n applicationType?: string | null;\n source?: ApplicationQuestionGraph[\"source\"];\n}\n\nexport function buildQuestionGraphFromFields(\n fields: ApplicationField[],\n options: BuildQuestionGraphOptions,\n): ApplicationQuestionGraph {\n const sectionNodes = new Map<string, ApplicationQuestionNode>();\n const nodes: ApplicationQuestionNode[] = [];\n\n for (const [index, field] of fields.entries()) {\n const sectionId = stableNodeId([\"section\", field.section]);\n let sectionNode = sectionNodes.get(sectionId);\n if (!sectionNode) {\n sectionNode = {\n id: sectionId,\n nodeType: \"group\",\n label: field.section,\n order: sectionNodes.size,\n children: [],\n };\n sectionNodes.set(sectionId, sectionNode);\n nodes.push(sectionNode);\n }\n\n const child: ApplicationQuestionNode = {\n id: field.fieldAnchorId ?? stableNodeId([\"field\", field.section, field.id || field.label]),\n nodeType: field.fieldType === \"table\" ? \"table\" : \"question\",\n fieldId: field.id,\n fieldPath: `${field.section}.${field.id}`,\n parentId: sectionId,\n order: index,\n label: field.label,\n section: field.section,\n fieldType: field.fieldType,\n required: field.required,\n options: field.options,\n columns: field.columns,\n condition: field.condition\n ? {\n dependsOn: field.condition.dependsOn,\n operator: \"equals\",\n value: field.condition.whenValue,\n whenValue: field.condition.whenValue,\n }\n : undefined,\n };\n sectionNode.children = [...(sectionNode.children ?? []), child];\n }\n\n return normalizeApplicationQuestionGraph({\n id: options.id,\n version: options.version ?? \"v1\",\n title: options.title,\n applicationType: options.applicationType,\n source: options.source ?? \"generated\",\n rootNodeIds: nodes.map((node) => node.id),\n nodes,\n });\n}\n\nexport function normalizeApplicationQuestionGraph(graph: ApplicationQuestionGraph): ApplicationQuestionGraph {\n const normalizedNodes = graph.nodes\n .map((node, index) => normalizeNode(node, undefined, index))\n .sort(compareNodes);\n\n return {\n ...graph,\n rootNodeIds: graph.rootNodeIds?.length\n ? graph.rootNodeIds\n : normalizedNodes.map((node) => node.id),\n nodes: normalizedNodes,\n };\n}\n\nexport function flattenQuestionGraph(graph: ApplicationQuestionGraph): ApplicationField[] {\n const fields: ApplicationField[] = [];\n\n for (const node of graph.nodes.sort(compareNodes)) {\n collectFields(node, fields);\n }\n\n return fields;\n}\n\nexport function getActiveApplicationFields(state: Pick<ApplicationState, \"fields\" | \"questionGraph\">): ApplicationField[] {\n const valueByFieldId = new Map(\n state.fields\n .filter((field) => field.value !== undefined && field.value.trim() !== \"\")\n .map((field) => [field.id, field.value ?? \"\"]),\n );\n const graphConditions = new Map<string, ApplicationQuestionCondition>();\n\n for (const node of state.questionGraph?.nodes ?? []) {\n collectNodeConditions(node, graphConditions);\n }\n\n return state.fields.filter((field) => {\n const graphCondition = graphConditions.get(field.id);\n return isConditionSatisfied(field.condition, valueByFieldId)\n && isQuestionConditionSatisfied(graphCondition, valueByFieldId);\n });\n}\n\nexport function getNextApplicationQuestions(\n state: Pick<ApplicationState, \"fields\" | \"questionGraph\" | \"batches\" | \"currentBatchIndex\">,\n limit = 8,\n): ApplicationField[] {\n const activeUnfilled = getActiveApplicationFields(state).filter((field) => !field.value);\n if (activeUnfilled.length === 0) return [];\n\n const currentBatchIds = state.batches?.[state.currentBatchIndex] ?? [];\n const currentBatchFields = activeUnfilled.filter((field) => currentBatchIds.includes(field.id));\n return (currentBatchFields.length > 0 ? currentBatchFields : activeUnfilled).slice(0, limit);\n}\n\nfunction normalizeNode(\n node: ApplicationQuestionNode,\n parentId: string | undefined,\n index: number,\n): ApplicationQuestionNode {\n const children = node.children?.map((child, childIndex) => normalizeNode(child, node.id, childIndex));\n return {\n ...node,\n parentId: node.parentId ?? parentId,\n order: node.order ?? index,\n fieldPath: node.fieldPath ?? (node.fieldId ? [node.section, node.fieldId].filter(Boolean).join(\".\") : undefined),\n children,\n };\n}\n\nfunction collectFields(node: ApplicationQuestionNode, fields: ApplicationField[]): void {\n if ((node.nodeType === \"question\" || node.nodeType === \"table\") && node.fieldId) {\n fields.push({\n id: node.fieldId,\n label: node.label,\n section: node.section ?? \"General\",\n fieldType: node.fieldType ?? (node.nodeType === \"table\" ? \"table\" : \"text\"),\n required: node.required ?? false,\n options: node.options,\n columns: node.columns,\n condition: node.condition\n ? {\n dependsOn: node.condition.dependsOn,\n whenValue: node.condition.value ?? node.condition.whenValue ?? \"\",\n }\n : undefined,\n fieldAnchorId: node.id,\n });\n }\n\n for (const child of node.children ?? []) {\n collectFields(child, fields);\n }\n}\n\nfunction collectNodeConditions(node: ApplicationQuestionNode, conditions: Map<string, ApplicationQuestionCondition>): void {\n if (node.fieldId && node.condition) {\n conditions.set(node.fieldId, node.condition);\n }\n for (const child of node.children ?? []) {\n collectNodeConditions(child, conditions);\n }\n}\n\nfunction isConditionSatisfied(\n condition: ApplicationField[\"condition\"] | undefined,\n valueByFieldId: Map<string, string>,\n): boolean {\n if (!condition) return true;\n const current = valueByFieldId.get(condition.dependsOn);\n return normalizeValue(current) === normalizeValue(condition.whenValue);\n}\n\nfunction isQuestionConditionSatisfied(\n condition: ApplicationQuestionCondition | undefined,\n valueByFieldId: Map<string, string>,\n): boolean {\n if (!condition) return true;\n const current = valueByFieldId.get(condition.dependsOn);\n const expected = condition.value ?? condition.whenValue;\n const values = condition.values ?? (expected !== undefined ? [expected] : []);\n\n switch (condition.operator) {\n case \"exists\":\n return current !== undefined && current.trim() !== \"\";\n case \"not_equals\":\n return normalizeValue(current) !== normalizeValue(expected);\n case \"in\":\n return values.map(normalizeValue).includes(normalizeValue(current));\n case \"not_in\":\n return !values.map(normalizeValue).includes(normalizeValue(current));\n case \"equals\":\n default:\n return normalizeValue(current) === normalizeValue(expected);\n }\n}\n\nfunction compareNodes(a: ApplicationQuestionNode, b: ApplicationQuestionNode): number {\n return (a.order ?? 0) - (b.order ?? 0) || a.id.localeCompare(b.id);\n}\n\nfunction normalizeValue(value: string | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction stableNodeId(parts: string[]): string {\n return parts\n .join(\":\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n || \"node\";\n}\n","import type {\n ApplicationContextProposal,\n ApplicationField,\n ApplicationPacket,\n ApplicationQuestionGraph,\n ApplicationState,\n ApplicationTemplate,\n} from \"../schemas/application\";\nimport { buildApplicationQualityReport, type ApplicationQualityReport } from \"./quality\";\nimport {\n buildQuestionGraphFromFields,\n flattenQuestionGraph,\n getActiveApplicationFields,\n getNextApplicationQuestions,\n normalizeApplicationQuestionGraph,\n} from \"./question-graph\";\n\nexport interface CreateApplicationRunParams {\n applicationId: string;\n template: ApplicationTemplate;\n now?: number;\n}\n\nexport interface ApplyApplicationAnswer {\n fieldId: string;\n value: string;\n source?: string;\n confidence?: ApplicationField[\"confidence\"];\n sourceSpanIds?: string[];\n userSourceSpanIds?: string[];\n}\n\nexport function extractQuestionGraphFromFields(\n fields: ApplicationField[],\n options: {\n id: string;\n version?: string;\n title?: string;\n applicationType?: string | null;\n source?: ApplicationQuestionGraph[\"source\"];\n },\n): ApplicationQuestionGraph {\n return buildQuestionGraphFromFields(fields, options);\n}\n\nexport function createApplicationRun(params: CreateApplicationRunParams): ApplicationState {\n const now = params.now ?? Date.now();\n const graph = normalizeApplicationQuestionGraph(params.template.questionGraph);\n const fields = params.template.fields?.length\n ? params.template.fields\n : flattenQuestionGraph(graph);\n\n return {\n id: params.applicationId,\n templateId: params.template.id,\n templateVersion: params.template.version,\n templateSnapshot: params.template,\n title: params.template.title,\n applicationType: params.template.applicationType,\n questionGraph: graph,\n fields,\n currentBatchIndex: 0,\n status: \"collecting\",\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport function planNextApplicationQuestions(\n state: Pick<ApplicationState, \"fields\" | \"questionGraph\" | \"batches\" | \"currentBatchIndex\">,\n limit?: number,\n): { status: \"complete\" | \"needs_answers\"; fieldIds: string[]; fields: ApplicationField[] } {\n const fields = getNextApplicationQuestions(state, limit);\n return {\n status: fields.length === 0 ? \"complete\" : \"needs_answers\",\n fieldIds: fields.map((field) => field.id),\n fields,\n };\n}\n\nexport function applyApplicationAnswers(\n state: ApplicationState,\n answers: ApplyApplicationAnswer[],\n now = Date.now(),\n): ApplicationState {\n const answerByFieldId = new Map(answers.map((answer) => [answer.fieldId, answer]));\n const fields = state.fields.map((field) => {\n const answer = answerByFieldId.get(field.id);\n if (!answer) return field;\n return {\n ...field,\n value: answer.value,\n source: answer.source ?? \"user\",\n confidence: answer.confidence ?? \"confirmed\",\n sourceSpanIds: answer.sourceSpanIds ?? field.sourceSpanIds,\n userSourceSpanIds: answer.userSourceSpanIds ?? field.userSourceSpanIds,\n validationStatus: \"valid\" as const,\n };\n });\n\n const nextState: ApplicationState = {\n ...state,\n fields,\n updatedAt: now,\n };\n\n const nextQuestions = planNextApplicationQuestions(nextState);\n return {\n ...nextState,\n status: nextQuestions.status === \"complete\" ? \"confirming\" : nextState.status,\n qualityReport: buildApplicationQualityReport(nextState),\n };\n}\n\nexport function proposeContextWrites(state: ApplicationState): ApplicationContextProposal[] {\n return getActiveApplicationFields(state)\n .filter((field) => field.value && field.confidence && field.confidence !== \"low\")\n .map((field) => ({\n id: `${state.id}:${field.id}:context`,\n fieldId: field.id,\n key: stableContextKey(field),\n value: field.value ?? \"\",\n category: field.section,\n source: field.source?.startsWith(\"lookup:\") ? \"lookup\" : \"application\",\n confidence: field.confidence ?? \"medium\",\n sourceSpanIds: field.sourceSpanIds,\n userSourceSpanIds: field.userSourceSpanIds,\n }));\n}\n\nexport function buildApplicationPacket(\n state: ApplicationState,\n options: { submissionNotes?: string; now?: number } = {},\n): ApplicationPacket {\n const qualityReport = buildApplicationQualityReport(state);\n const activeFields = getActiveApplicationFields(state);\n const answers = activeFields\n .filter((field) => field.value)\n .map((field) => ({\n fieldId: field.id,\n label: field.label,\n section: field.section,\n value: field.value ?? \"\",\n source: field.source ?? \"unknown\",\n confidence: field.confidence,\n sourceSpanIds: field.sourceSpanIds,\n userSourceSpanIds: field.userSourceSpanIds,\n }));\n\n const missingFieldIds = activeFields\n .filter((field) => field.required && !field.value)\n .map((field) => field.id);\n\n return {\n id: `${state.id}:packet`,\n applicationId: state.id,\n title: state.title ?? state.applicationType ?? \"Insurance Application\",\n status: qualityReport.qualityGateStatus === \"failed\" || missingFieldIds.length > 0 ? \"draft\" : \"broker_ready\",\n answers,\n missingFieldIds,\n qualityReport,\n submissionNotes: options.submissionNotes,\n createdAt: options.now ?? Date.now(),\n };\n}\n\nexport function validateApplicationPacket(packet: ApplicationPacket): ApplicationQualityReport {\n const issues = [...packet.qualityReport.issues];\n\n if (packet.missingFieldIds.length > 0) {\n issues.push({\n code: \"packet_missing_required_answers\",\n severity: \"blocking\",\n message: \"Packet still has required unanswered application fields.\",\n });\n }\n\n return {\n ...packet.qualityReport,\n issues,\n qualityGateStatus: issues.some((issue) => issue.severity === \"blocking\")\n ? \"failed\"\n : packet.qualityReport.qualityGateStatus,\n };\n}\n\nfunction stableContextKey(field: ApplicationField): string {\n return `${field.section}.${field.label}`\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n","import type { TokenUsage } from \"../core/types\";\nimport type { ModelTaskKind } from \"../core/model-budget\";\nimport { resolveModelBudget } from \"../core/model-budget\";\nimport { pLimit } from \"../core/concurrency\";\nimport type { ApplicationState, ApplicationField } from \"../schemas/application\";\nimport type {\n ApplicationPipelineConfig,\n BuildApplicationPacketInput,\n BuildApplicationPacketResult,\n ContextProposalResult,\n CreateApplicationRunInput,\n ApplicationNextQuestions,\n ProcessApplicationInput,\n ProcessApplicationResult,\n ProcessReplyInput,\n ProcessReplyResult,\n} from \"./types\";\n\nimport { classifyApplication } from \"./agents/classifier\";\nimport { extractFields } from \"./agents/field-extractor\";\nimport { autoFillFromContext, backfillFromPriorAnswers } from \"./agents/auto-filler\";\nimport { batchQuestions } from \"./agents/batcher\";\nimport { classifyReplyIntent } from \"./agents/reply-router\";\nimport { parseAnswers } from \"./agents/answer-parser\";\nimport { fillFromLookup } from \"./agents/lookup-filler\";\nimport { generateBatchEmail } from \"./agents/email-generator\";\nimport { buildApplicationQualityReport, reviewBatchEmail } from \"./quality\";\nimport { shouldFailQualityGate } from \"../core/quality\";\nimport { planApplicationWorkflow, planReplyActions } from \"./workflow\";\nimport { buildTextSourceSpans, sourceSpanTextHash } from \"../source\";\nimport {\n buildApplicationPacket as buildApplicationPacketFromState,\n createApplicationRun as createApplicationRunFromTemplate,\n planNextApplicationQuestions,\n proposeContextWrites as proposeContextWritesFromState,\n validateApplicationPacket,\n} from \"./intake\";\nimport { buildQuestionGraphFromFields, getActiveApplicationFields } from \"./question-graph\";\nimport type { DocumentChunk } from \"../storage/chunk-types\";\n\nexport function createApplicationPipeline(config: ApplicationPipelineConfig) {\n const {\n generateText,\n generateObject,\n applicationStore,\n templateStore,\n documentStore,\n memoryStore,\n backfillProvider,\n orgContext = [],\n concurrency = 4,\n onTokenUsage,\n onProgress,\n log,\n providerOptions,\n qualityGate = \"warn\",\n modelCapabilities,\n modelBudgetConstraints,\n } = config;\n\n const limit = pLimit(concurrency);\n let totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n function trackUsage(usage?: TokenUsage) {\n if (usage) {\n totalUsage.inputTokens += usage.inputTokens;\n totalUsage.outputTokens += usage.outputTokens;\n onTokenUsage?.(usage);\n }\n }\n\n function resolveBudget(taskKind: ModelTaskKind, hintTokens: number) {\n return resolveModelBudget({\n taskKind,\n hintTokens,\n modelCapabilities,\n constraint: modelBudgetConstraints?.[taskKind],\n });\n }\n\n /**\n * Process a new application PDF through the full intake pipeline:\n * classify -> extract fields -> backfill -> auto-fill -> batch questions\n */\n async function processApplication(\n input: ProcessApplicationInput,\n ): Promise<ProcessApplicationResult> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n const { pdfBase64, context } = input;\n const applicationProviderOptions = input.sourceSpans?.length\n ? { ...providerOptions, sourceSpans: input.sourceSpans }\n : providerOptions;\n const id = input.applicationId ?? `app-${Date.now()}`;\n const now = Date.now();\n if (input.template) {\n await templateStore?.saveTemplate(input.template);\n }\n\n let state: ApplicationState = {\n id,\n templateId: input.template?.id,\n templateVersion: input.template?.version,\n templateSnapshot: input.template,\n pdfBase64: undefined,\n title: undefined,\n applicationType: null,\n questionGraph: input.questionGraph ?? input.template?.questionGraph,\n fields: [],\n qualityReport: undefined,\n batches: undefined,\n currentBatchIndex: 0,\n status: \"classifying\",\n createdAt: now,\n updatedAt: now,\n };\n\n onProgress?.(\"Classifying document...\");\n await applicationStore?.save(state);\n\n let classifyResult;\n try {\n const { result, usage: classifyUsage } = await classifyApplication(\n pdfBase64,\n generateObject,\n applicationProviderOptions,\n resolveBudget(\"application_classify\", 512).maxTokens,\n );\n trackUsage(classifyUsage);\n classifyResult = result;\n } catch (error) {\n await log?.(`Classification failed, treating as non-application: ${error instanceof Error ? error.message : String(error)}`);\n classifyResult = { isApplication: false, confidence: 0, applicationType: null };\n }\n\n if (!classifyResult.isApplication) {\n state.status = \"complete\";\n state.updatedAt = Date.now();\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n state.applicationType = classifyResult.applicationType;\n state.status = \"extracting\";\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 2: Extract Fields --\n onProgress?.(\"Extracting form fields...\");\n let fields: ApplicationField[];\n try {\n const { fields: extractedFields, usage: extractUsage } = await extractFields(\n pdfBase64,\n generateObject,\n applicationProviderOptions,\n resolveBudget(\"application_extract_fields\", 8192).maxTokens,\n );\n trackUsage(extractUsage);\n fields = extractedFields;\n } catch (error) {\n await log?.(`Field extraction failed: ${error instanceof Error ? error.message : String(error)}`);\n fields = [];\n }\n\n if (fields.length === 0) {\n // No fields extracted — complete gracefully rather than crashing\n await log?.(\"No fields extracted, completing pipeline with empty result\");\n state.status = \"complete\";\n state.updatedAt = Date.now();\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n state.fields = fields;\n state.questionGraph = input.questionGraph\n ?? input.template?.questionGraph\n ?? buildQuestionGraphFromFields(fields, {\n id: `${id}:graph`,\n title: classifyResult.applicationType ?? undefined,\n applicationType: classifyResult.applicationType,\n source: \"pdf\",\n });\n state.title = classifyResult.applicationType ?? undefined;\n state.status = \"auto_filling\";\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 3: Backfill + Auto-Fill --\n onProgress?.(`Auto-filling ${fields.length} fields...`);\n\n let workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: Boolean(backfillProvider),\n orgContextCount: orgContext.length,\n hasDocumentStore: Boolean(documentStore),\n hasMemoryStore: Boolean(memoryStore),\n });\n\n // 3a: Vector-based backfill from prior answers\n if (workflowPlan.runBackfill && backfillProvider) {\n try {\n const priorAnswers = await backfillFromPriorAnswers(state.fields, backfillProvider);\n for (const pa of priorAnswers) {\n const field = state.fields.find((f) => f.id === pa.fieldId);\n if (field && !field.value && pa.relevance > 0.8) {\n field.value = pa.value;\n field.source = `backfill: ${pa.source}`;\n field.confidence = pa.confidence ?? \"high\";\n field.validationStatus = pa.sourceSpanIds?.length ? \"valid\" : \"needs_review\";\n field.sourceSpanIds = pa.sourceSpanIds;\n field.userSourceSpanIds = pa.userSourceSpanIds;\n }\n }\n } catch (e) {\n await log?.(`Backfill failed: ${e}`);\n }\n }\n\n workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: false,\n orgContextCount: orgContext.length,\n hasDocumentStore: Boolean(documentStore),\n hasMemoryStore: Boolean(memoryStore),\n });\n\n const fillTasks: Promise<void>[] = [];\n\n // 3b: Context-based auto-fill (LLM agent)\n if (workflowPlan.runContextAutoFill) {\n fillTasks.push(\n limit(async () => {\n const unfilledFields = state.fields.filter((f) => !f.value);\n if (unfilledFields.length === 0) return;\n\n try {\n const { result: autoFillResult, usage: afUsage } = await autoFillFromContext(\n unfilledFields,\n orgContext,\n generateObject,\n providerOptions,\n resolveBudget(\"application_auto_fill\", 4096).maxTokens,\n );\n trackUsage(afUsage);\n\n for (const match of autoFillResult.matches) {\n const field = state.fields.find((f) => f.id === match.fieldId);\n if (field && !field.value) {\n field.value = match.value;\n field.source = `auto-fill: ${match.contextKey}`;\n field.confidence = match.confidence;\n field.validationStatus = \"valid\";\n }\n }\n } catch (e) {\n await log?.(`Auto-fill from context failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }),\n );\n }\n\n // 3c: Document-based backfill (search policies/quotes for matching data)\n if (workflowPlan.documentSearchFields.length > 0 && memoryStore) {\n fillTasks.push(\n (async () => {\n try {\n const searchPromises = workflowPlan.documentSearchFields.map((f) =>\n limit(async () => {\n const chunks = await memoryStore.search(`${f.section} ${f.label}`, { limit: 3 });\n const match = selectMemoryBackfillMatch(f, chunks);\n if (match) {\n const field = state.fields.find((candidate) => candidate.id === f.id);\n if (field && !field.value) {\n field.value = match.value;\n field.source = match.source;\n field.confidence = match.confidence;\n field.validationStatus = match.sourceSpanIds.length > 0 ? \"valid\" : \"needs_review\";\n field.sourceSpanIds = match.sourceSpanIds.length > 0 ? match.sourceSpanIds : undefined;\n }\n }\n }),\n );\n await Promise.all(searchPromises);\n } catch (e) {\n await log?.(`Document backfill search failed: ${e}`);\n }\n })(),\n );\n }\n\n await Promise.all(fillTasks);\n\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 4: Batch remaining questions --\n workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: false,\n orgContextCount: 0,\n hasDocumentStore: false,\n hasMemoryStore: false,\n });\n const unfilledFields = getActiveApplicationFields(state).filter((field) => !field.value);\n if (workflowPlan.runBatching) {\n onProgress?.(`Batching ${unfilledFields.length} remaining questions...`);\n state.status = \"batching\";\n\n try {\n const { result: batchResult, usage: batchUsage } = await batchQuestions(\n unfilledFields,\n generateObject,\n providerOptions,\n resolveBudget(\"application_batch\", 2048).maxTokens,\n );\n trackUsage(batchUsage);\n state.batches = batchResult.batches;\n } catch (error) {\n await log?.(`Batching failed, using single-batch fallback: ${error instanceof Error ? error.message : String(error)}`);\n // Fallback: put all unfilled field IDs into a single batch\n state.batches = [unfilledFields.map((f) => f.id)];\n }\n\n state.currentBatchIndex = 0;\n state.status = \"collecting\";\n } else {\n state.status = \"confirming\";\n }\n\n state.contextProposals = proposeContextWritesFromState(state);\n state.qualityReport = buildApplicationQualityReport(state);\n\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n if (shouldFailQualityGate(qualityGate, state.qualityReport.qualityGateStatus)) {\n throw new Error(\"Application quality gate failed. See state.qualityReport for blocking issues.\");\n }\n\n const filledCount = state.fields.filter((f) => f.value).length;\n onProgress?.(`Application processed: ${filledCount}/${state.fields.length} fields filled, ${state.batches?.length ?? 0} batches to collect.`);\n\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n /**\n * Process a user reply (email, chat message) for an active application.\n * Routes through: intent classification -> answer parsing / lookup / explanation\n */\n async function processReply(input: ProcessReplyInput): Promise<ProcessReplyResult> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n const { applicationId, replyText, context } = input;\n const replySourceSpanIds = input.replySourceSpanIds?.length\n ? input.replySourceSpanIds\n : buildTextSourceSpans({\n documentId: `${applicationId}:reply:${sourceSpanTextHash(replyText).slice(0, 12)}`,\n sourceKind: \"email\",\n text: replyText,\n metadata: { applicationId },\n }).map((span) => span.id);\n\n // Load state\n let state: ApplicationState | null = null;\n if (applicationStore) {\n state = await applicationStore.get(applicationId);\n }\n if (!state) {\n throw new Error(`Application ${applicationId} not found`);\n }\n\n // Get current batch fields\n const currentBatchFieldIds = state.batches?.[state.currentBatchIndex] ?? [];\n const activeFields = getActiveApplicationFields(state);\n const currentBatchFields = activeFields.filter((f) =>\n currentBatchFieldIds.includes(f.id),\n );\n\n // -- Step 1: Classify reply intent --\n onProgress?.(\"Classifying reply...\");\n let intent;\n try {\n const { intent: classifiedIntent, usage: intentUsage } = await classifyReplyIntent(\n currentBatchFields,\n replyText,\n generateObject,\n providerOptions,\n resolveBudget(\"application_classify\", 1024).maxTokens,\n );\n trackUsage(intentUsage);\n intent = classifiedIntent;\n } catch (error) {\n await log?.(`Reply intent classification failed, defaulting to answers_only: ${error instanceof Error ? error.message : String(error)}`);\n intent = {\n primaryIntent: \"answers_only\" as const,\n hasAnswers: true,\n questionText: undefined,\n questionFieldIds: undefined,\n lookupRequests: undefined,\n };\n }\n\n let fieldsFilled = 0;\n let responseText: string | undefined;\n\n let replyPlan = planReplyActions({\n intent,\n currentBatchFields,\n hasDocumentStore: Boolean(documentStore),\n });\n\n // -- Step 2: Parse answers if present --\n if (replyPlan.parseAnswers) {\n onProgress?.(\"Parsing answers...\");\n try {\n const { result: parseResult, usage: parseUsage } = await parseAnswers(\n currentBatchFields,\n replyText,\n generateObject,\n providerOptions,\n resolveBudget(\"application_parse_answers\", 4096).maxTokens,\n );\n trackUsage(parseUsage);\n\n for (const answer of parseResult.answers) {\n const field = state.fields.find((f) => f.id === answer.fieldId);\n if (field) {\n field.value = answer.value;\n field.source = \"user\";\n field.confidence = \"confirmed\";\n field.userSourceSpanIds = replySourceSpanIds;\n field.validationStatus = \"valid\";\n fieldsFilled++;\n }\n }\n } catch (error) {\n await log?.(`Answer parsing failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // -- Step 3: Handle lookup requests --\n if (replyPlan.runLookup && intent.lookupRequests?.length) {\n onProgress?.(\"Processing lookup requests...\");\n let availableData = \"\";\n if (documentStore) {\n try {\n const docs = await documentStore.query({});\n availableData = docs\n .map((d) => {\n const doc = d as Record<string, unknown>;\n return `Document ${doc.id}: ${doc.type} - ${doc.carrier ?? \"unknown carrier\"} - ${doc.insuredName ?? \"\"}`;\n })\n .join(\"\\n\");\n } catch (e) {\n await log?.(`Document query for lookup failed: ${e}`);\n }\n }\n\n if (availableData) {\n const targetFields = state.fields.filter((f) =>\n intent.lookupRequests!.some((lr) => lr.targetFieldIds.includes(f.id)),\n );\n\n try {\n const { result: lookupResult, usage: lookupUsage } = await fillFromLookup(\n intent.lookupRequests,\n targetFields,\n availableData,\n generateObject,\n providerOptions,\n resolveBudget(\"application_lookup\", 4096).maxTokens,\n );\n trackUsage(lookupUsage);\n\n for (const fill of lookupResult.fills) {\n const field = state.fields.find((f) => f.id === fill.fieldId);\n if (field) {\n field.value = fill.value;\n field.source = `lookup: ${fill.source}`;\n field.confidence = \"high\";\n field.validationStatus = fill.sourceSpanIds?.length ? \"valid\" : \"needs_review\";\n if (fill.sourceSpanIds?.length) {\n field.sourceSpanIds = fill.sourceSpanIds;\n }\n fieldsFilled++;\n }\n }\n } catch (error) {\n await log?.(`Lookup fill failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // -- Step 4: Handle questions about fields --\n if (replyPlan.answerQuestion && intent.questionText) {\n try {\n const budget = resolveBudget(\"application_email\", 512);\n const { text, usage } = await generateText({\n prompt: `The user is filling out an insurance application and asked: \"${intent.questionText}\"\\n\\nProvide a brief, helpful explanation (2-3 sentences). End with \"Just reply with the answer when you're ready and I'll fill it in.\"`,\n maxTokens: budget.maxTokens,\n taskKind: \"application_email\",\n budgetDiagnostics: budget,\n providerOptions,\n });\n trackUsage(usage);\n responseText = text;\n } catch (error) {\n await log?.(`Question response generation failed: ${error instanceof Error ? error.message : String(error)}`);\n responseText = `I wasn't able to generate an explanation for your question. Could you rephrase it, or just provide the answer directly?`;\n }\n }\n\n // -- Step 5: Advance batch if current batch is complete --\n const activeCurrentBatchFieldIds = currentBatchFields.map((field) => field.id);\n const currentBatchComplete = activeCurrentBatchFieldIds.every(\n (fid) => state!.fields.find((f) => f.id === fid)?.value,\n );\n\n let nextBatchIndex: number | undefined;\n let nextBatchFields: ApplicationField[] | undefined;\n if (state.batches) {\n for (let index = state.currentBatchIndex + 1; index < state.batches.length; index++) {\n const activeCandidateFields = getActiveApplicationFields(state);\n const candidateFields = activeCandidateFields.filter((f) => state.batches![index].includes(f.id));\n if (candidateFields.some((f) => !f.value)) {\n nextBatchIndex = index;\n nextBatchFields = candidateFields;\n break;\n }\n }\n }\n\n replyPlan = planReplyActions({\n intent,\n currentBatchFields,\n nextBatchFields,\n hasDocumentStore: Boolean(documentStore),\n });\n\n if (currentBatchComplete && replyPlan.advanceBatch && state.batches) {\n if (nextBatchIndex !== undefined && nextBatchFields) {\n state.currentBatchIndex = nextBatchIndex;\n\n const filledCount = state.fields.filter((f) => f.value).length;\n\n if (replyPlan.generateNextEmail) {\n try {\n const { text: emailText, usage: emailUsage } = await generateBatchEmail(\n nextBatchFields,\n state.currentBatchIndex,\n state.batches.length,\n {\n appTitle: state.title,\n totalFieldCount: state.fields.length,\n filledFieldCount: filledCount,\n companyName: context?.companyName,\n },\n generateText,\n providerOptions,\n resolveBudget(\"application_email\", 2048).maxTokens,\n );\n trackUsage(emailUsage);\n const emailReview = reviewBatchEmail(emailText, nextBatchFields);\n state.qualityReport = {\n ...(buildApplicationQualityReport(state)),\n emailReview,\n };\n\n if (!responseText) {\n responseText = emailText;\n } else {\n responseText += `\\n\\n${emailText}`;\n }\n } catch (error) {\n await log?.(`Batch email generation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } else {\n // All batches complete\n state.status = \"confirming\";\n }\n }\n\n state.updatedAt = Date.now();\n state.contextProposals = proposeContextWritesFromState(state);\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n\n if (shouldFailQualityGate(qualityGate, state.qualityReport.qualityGateStatus)) {\n throw new Error(\"Application quality gate failed. See state.qualityReport for blocking issues.\");\n }\n\n return {\n state,\n intent: intent.primaryIntent,\n fieldsFilled,\n responseText,\n tokenUsage: totalUsage,\n reviewReport: state.qualityReport,\n };\n }\n\n /**\n * Generate the email for the current batch of questions.\n */\n async function generateCurrentBatchEmail(\n applicationId: string,\n opts?: { companyName?: string; previousBatchSummary?: string },\n ): Promise<{ text: string; tokenUsage: TokenUsage }> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n if (!state.batches?.length) throw new Error(\"No batches available\");\n\n const batchFieldIds = state.batches[state.currentBatchIndex];\n const batchFields = getActiveApplicationFields(state).filter((f) => batchFieldIds.includes(f.id));\n const filledCount = state.fields.filter((f) => f.value).length;\n\n const { text, usage } = await generateBatchEmail(\n batchFields,\n state.currentBatchIndex,\n state.batches.length,\n {\n appTitle: state.title,\n totalFieldCount: state.fields.length,\n filledFieldCount: filledCount,\n companyName: opts?.companyName,\n previousBatchSummary: opts?.previousBatchSummary,\n },\n generateText,\n providerOptions,\n resolveBudget(\"application_email\", 2048).maxTokens,\n );\n trackUsage(usage);\n\n const emailReview = reviewBatchEmail(text, batchFields);\n state.qualityReport = {\n ...(buildApplicationQualityReport(state)),\n emailReview,\n };\n await applicationStore?.save(state);\n\n return { text, tokenUsage: totalUsage };\n }\n\n /**\n * Get a summary of the current application state for confirmation.\n */\n async function getConfirmationSummary(\n applicationId: string,\n ): Promise<{ text: string; tokenUsage: TokenUsage }> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n\n const filledFields = state.fields.filter((f) => f.value);\n const fieldSummary = filledFields\n .map((f) => `${f.section} > ${f.label}: ${f.value} (source: ${f.source ?? \"unknown\"})`)\n .join(\"\\n\");\n\n const budget = resolveBudget(\"application_email\", 4096);\n const { text, usage } = await generateText({\n prompt: `Format these filled insurance application fields as a clean confirmation summary for the user to review. Group by section, show each field as \"Label: Value\". End with a note asking them to confirm or request changes.\\n\\nApplication: ${state.title ?? \"Insurance Application\"}\\n\\nFields:\\n${fieldSummary}`,\n maxTokens: budget.maxTokens,\n taskKind: \"application_email\",\n budgetDiagnostics: budget,\n providerOptions,\n });\n trackUsage(usage);\n\n return { text, tokenUsage: totalUsage };\n }\n\n async function createApplicationRun(input: CreateApplicationRunInput): Promise<ApplicationState> {\n const state = createApplicationRunFromTemplate(input);\n await applicationStore?.save(state);\n return state;\n }\n\n async function planNextQuestions(applicationId: string, limit?: number): Promise<ApplicationNextQuestions> {\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n return planNextApplicationQuestions(state, limit);\n }\n\n async function proposeContextWrites(applicationId: string): Promise<ContextProposalResult> {\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n const proposals = proposeContextWritesFromState(state);\n await applicationStore?.save({\n ...state,\n contextProposals: proposals,\n updatedAt: Date.now(),\n });\n return { proposals };\n }\n\n async function buildApplicationPacket(input: BuildApplicationPacketInput): Promise<BuildApplicationPacketResult> {\n const state = await applicationStore?.get(input.applicationId);\n if (!state) throw new Error(`Application ${input.applicationId} not found`);\n const packet = buildApplicationPacketFromState(state, {\n submissionNotes: input.submissionNotes,\n now: input.now,\n });\n const reviewReport = validateApplicationPacket(packet);\n await applicationStore?.save({\n ...state,\n packet: { ...packet, qualityReport: reviewReport },\n status: reviewReport.qualityGateStatus === \"failed\" ? \"broker_review\" : \"packet_ready\",\n qualityReport: reviewReport,\n updatedAt: Date.now(),\n });\n return { packet: { ...packet, qualityReport: reviewReport }, reviewReport };\n }\n\n return {\n processApplication,\n processReply,\n generateCurrentBatchEmail,\n getConfirmationSummary,\n createApplicationRun,\n planNextQuestions,\n proposeContextWrites,\n buildApplicationPacket,\n };\n}\n\nfunction selectMemoryBackfillMatch(\n field: ApplicationField,\n chunks: DocumentChunk[],\n): { value: string; source: string; confidence: \"high\" | \"medium\"; sourceSpanIds: string[] } | null {\n for (const chunk of chunks) {\n const value = chunk.metadata.value\n ?? chunk.metadata.answer\n ?? chunk.metadata.fieldValue;\n if (!value) continue;\n\n const metadataFieldId = chunk.metadata.fieldId ?? chunk.metadata.applicationFieldId;\n const metadataLabel = chunk.metadata.fieldLabel?.toLowerCase();\n const labelMatches = metadataLabel === field.label.toLowerCase();\n if (metadataFieldId && metadataFieldId !== field.id && !labelMatches) continue;\n\n return {\n value,\n source: chunk.metadata.source ?? `memory: ${chunk.documentId}`,\n confidence: metadataFieldId === field.id || labelMatches ? \"high\" : \"medium\",\n sourceSpanIds: parseSourceSpanIds(chunk.metadata.sourceSpanIds),\n };\n }\n\n return null;\n}\n\nfunction parseSourceSpanIds(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed) return [];\n if (trimmed.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(trimmed);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === \"string\") : [];\n } catch {\n return [];\n }\n }\n return trimmed.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n"],"mappings":";AA8EA,SAAS,gBAAgB,OAA+C;AACtE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,KAAK,MAAM,KAAK,IAChB;AACN;AAEO,SAAS,mBAAmB,QAAyD;AAC1F,QAAM,EAAE,UAAU,mBAAmB,WAAW,IAAI;AACpD,QAAM,aAAa,gBAAgB,OAAO,UAAU,KAAK;AACzD,QAAM,iBAAiB,gBAAgB,mBAAmB,mBAAmB,QAAQ,CAAC;AACtF,QAAM,qBAAqB,aAAa,yBACpC,gBAAgB,mBAAmB,oBAAoB,IACvD;AACJ,QAAM,oBAAoB,gBAAgB,mBAAmB,mBAAmB;AAChF,QAAM,wBAAwB,gBAAgB,YAAY,YAAY;AACtE,QAAM,kBAAkB,gBAAgB,YAAY,eAAe;AACnE,QAAM,uBAAuB,gBAAgB,mBAAmB,eAAe;AAC/E,QAAM,0BAA0B,gBAAgB,OAAO,uBAAuB;AAC9E,QAAM,sBAAsB,gBAAgB,YAAY,eAAe,KAAK;AAC5E,QAAM,uBAAuB,eAAe,OAAO,iBAAiB;AACpE,QAAM,eAAe,eAAe,OAAO,eAAe,KAAK;AAC/D,QAAM,qBAAqB,gBAAgB,OAAO,kBAAkB,KAAK;AACzE,QAAM,WAAqB,CAAC;AAE5B,QAAM,wBACJ,yBACG,kBACA,sBACA,cACA;AAEL,MAAI,YAAY;AAEhB,MAAI,iBAAiB;AACnB,gBAAY,KAAK,IAAI,WAAW,eAAe;AAAA,EACjD;AAEA,MAAI,sBAAsB;AACxB,QAAI,YAAY,sBAAsB;AACpC,eAAS,KAAK,YAAY,QAAQ,gDAAgD;AAAA,IACpF;AACA,gBAAY,KAAK,IAAI,WAAW,oBAAoB;AAAA,EACtD;AAEA,MAAI,qBAAqB;AACvB,QAAI,YAAY,qBAAqB;AACnC,eAAS,KAAK,YAAY,QAAQ,qEAAqE;AAAA,IACzG;AACA,gBAAY,KAAK,IAAI,WAAW,mBAAmB;AAAA,EACrD;AAEA,QAAM,sBAAsB,0BAA0B,UAAU,cAAc,oBAAoB,UAAU;AAC5G,QAAM,uBAAuB,YAAY,sBAAsB,OAC3D,SACA,YAAY,sBACV,WACA;AAEN,MAAI,yBAAyB,OAAO;AAClC,aAAS,KAAK,YAAY,QAAQ,2DAA2D;AAAA,EAC/F;AAEA,QAAM,iBAAiB,gBAAgB,mBAAmB,cAAc;AACxE,MAAI,wBAAwB,kBAAkB,uBAAuB,iBAAiB,KAAK;AACzF,aAAS,KAAK,aAAa,QAAQ,uEAAuE;AAAA,EAC5G;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAA+C;AACrE,QAAM,WAAW,gBAAgB,KAAK;AACtC,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,KAAK,KAAK,WAAW,CAAC;AAC/B;AAEA,SAAS,0BACP,UACA,cACA,oBACA,YACQ;AACR,QAAM,iBAAiB,aAAa,yBAAyB,KAAK;AAClE,QAAM,YAAY,qBAAqB,IAAI,qBAAqB,iBAAiB;AACjF,SAAO,KAAK,IAAI,KAAK,KAAK,eAAe,GAAG,GAAG,WAAW,KAAK,MAAM,aAAa,IAAI,CAAC;AACzF;;;ACzKO,SAAS,OAAO,aAAqB;AAC1C,QAAM,iBAAiB,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,IAAI;AAC7F,MAAI,SAAS;AACb,QAAM,QAA2B,CAAC;AAElC,WAAS,OAAO;AACd,QAAI,MAAM,SAAS,KAAK,SAAS,gBAAgB;AAC/C;AACA,YAAM,MAAM,EAAG;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,CAAI,OACT,IAAI,QAAW,CAAC,SAAS,WAAW;AAClC,UAAM,MAAM,MAAM;AAChB,SAAG,EAAE,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM;AACvC;AACA,aAAK;AAAA,MACP,CAAC;AAAA,IACH;AACA,UAAM,KAAK,GAAG;AACd,SAAK;AAAA,EACP,CAAC;AACL;;;ACzBA,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAOtB,SAAS,iBAAiB,OAAyB;AACjD,MAAI,iBAAiB,OAAO;AAC1B,UAAM,MAAM,MAAM,QAAQ,YAAY;AAEtC,QAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,mBAAmB,GAAG;AACjG,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,SAAS,+BAA+B,EAAG,QAAO;AAC1D,QAAI,IAAI,SAAS,qBAAqB,EAAG,QAAO;AAChD,QAAI,IAAI,SAAS,YAAY,EAAG,QAAO;AACvC,QAAI,IAAI,SAAS,uBAAuB,EAAG,QAAO;AAClD,QAAI,IAAI,SAAS,qBAAqB,EAAG,QAAO;AAChD,QAAI,IAAI,SAAS,iBAAiB,EAAG,QAAO;AAAA,EAC9C;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,SAAU,MAAkC,UAAW,MAAkC;AAC/F,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,IAAK,QAAO;AAAA,EACrG;AACA,SAAO;AACT;AAEA,eAAsB,UACpB,IACA,KACA,SACY;AACZ,QAAM,aAAa,SAAS,cAAc;AAC1C,QAAM,cAAc,SAAS,eAAe;AAC5C,WAAS,UAAU,KAAK,WAAW;AACjC,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,UAAI,CAAC,iBAAiB,KAAK,KAAK,WAAW,YAAY;AACrD,cAAM;AAAA,MACR;AACA,YAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,OAAO,IAAI;AACnD,YAAM,MAAM,iCAAiC,QAAQ,KAAM,QAAQ,CAAC,CAAC,cAAc,UAAU,CAAC,IAAI,UAAU,MAAM;AAClH,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;;;AClDO,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACF3C,SAAS,SAAS;AAIX,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,IAAI,EAAE,OAAO;AAAA,EACb,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW;AAAA,EACX,UAAU,EAAE,QAAQ;AAAA,EACpB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,0BAA0B,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/C,WAAW,EACR,OAAO;AAAA,IACN,WAAW,EAAE,OAAO;AAAA,IACpB,WAAW,EAAE,OAAO;AAAA,EACtB,CAAC,EACA,SAAS;AAAA,EACZ,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,EAC3F,YAAY,EAAE,KAAK,CAAC,aAAa,QAAQ,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EACpE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,kEAAkE;AAAA,EACzH,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,EAC1H,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,EACtH,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6EAA6E;AAAA,EAC3H,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,EAC5F,kBAAkB,EAAE,KAAK,CAAC,SAAS,gBAAgB,eAAe,SAAS,CAAC,EAAE,SAAS;AACzF,CAAC;AAKM,IAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,WAAW,EAAE,OAAO;AAAA,EACpB,UAAU,EAAE,KAAK,CAAC,UAAU,cAAc,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC9E,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACvC,CAAC;AAGM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EAC7C,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAsBM,IAAM,gCAAoE,EAAE;AAAA,EAAK,MACtF,EAAE,OAAO;AAAA,IACP,IAAI,EAAE,OAAO;AAAA,IACb,UAAU,EAAE,KAAK,CAAC,SAAS,YAAY,gBAAgB,OAAO,CAAC;AAAA,IAC/D,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,IAC/C,OAAO,EAAE,OAAO;AAAA,IAChB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAW,gBAAgB,SAAS;AAAA,IACpC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACtC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACtC,WAAW,mCAAmC,SAAS;AAAA,IACvD,QAAQ,wBAAwB,SAAS;AAAA,IACzC,UAAU,EAAE,MAAM,6BAA6B,EAAE,SAAS;AAAA,EAC5D,CAAC;AACH;AAEO,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,YAAY,WAAW,CAAC,EAAE,QAAQ,WAAW;AAAA,EAC9E,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC1C,OAAO,EAAE,MAAM,6BAA6B;AAC9C,CAAC;AAGM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,eAAe;AAAA,EACf,QAAQ,EAAE,MAAM,sBAAsB,EAAE,SAAS;AACnD,CAAC;AAKM,IAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,eAAe,EAAE,QAAQ;AAAA,EACzB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC,CAAC;AAKM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,QAAQ,EAAE,MAAM,sBAAsB;AACxC,CAAC;AAKM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC;AAAA,EAChC,YAAY,EAAE,OAAO;AACvB,CAAC;AAGM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,SAAS,EAAE,MAAM,mBAAmB;AACtC,CAAC;AAKM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,kCAAkC,CAAC;AACnF,CAAC;AAKM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO,EAAE,SAAS,gDAAgD;AAAA,EAC1E,aAAa,EAAE,OAAO;AAAA,EACtB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC;AACpC,CAAC;AAGM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,eAAe,EAAE,KAAK,CAAC,gBAAgB,YAAY,kBAAkB,OAAO,CAAC;AAAA,EAC7E,YAAY,EAAE,QAAQ;AAAA,EACtB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC/C,gBAAgB,EAAE,MAAM,mBAAmB,EAAE,SAAS;AACxD,CAAC;AAKM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAGM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,SAAS,EAAE,MAAM,kBAAkB;AAAA,EACnC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,kCAAkC;AAC7E,CAAC;AAKM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,QAAQ,EAAE,OAAO,EAAE,SAAS,oEAAoE;AAAA,EAChG,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAC9C,CAAC;AAGM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,OAAO,EAAE,MAAM,gBAAgB;AAAA,EAC/B,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC9B,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAKM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,OAAO;AAAA,EACf,GAAG,EAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAC1D,GAAG,EAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,EACzD,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,aAAa,EAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAGM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAClB,CAAC;AAKD,IAAM,0BAA0B,EAAE,KAAK,CAAC,UAAU,WAAW,QAAQ,CAAC;AACtE,IAAM,wBAAwB,EAAE,KAAK,CAAC,QAAQ,WAAW,UAAU,CAAC;AAE7D,IAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,MAAM,EAAE,OAAO;AAAA,EACf,UAAU;AAAA,EACV,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,EACf,QAAQ;AAAA,EACR,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,QAAQ,EAAE,MAAM,6BAA6B;AAAA,EAC7C,mBAAmB;AACrB,CAAC;AAEM,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,QAAQ,EAAE,MAAM,6BAA6B;AAAA,EAC7C,QAAQ,EAAE,MAAM,6BAA6B,EAAE,SAAS;AAAA,EACxD,WAAW,EAAE,MAAM,gCAAgC,EAAE,SAAS;AAAA,EAC9D,aAAa,6BAA6B,SAAS;AAAA,EACnD,mBAAmB;AACrB,CAAC;AAIM,IAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,KAAK,EAAE,OAAO;AAAA,EACd,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,KAAK,CAAC,eAAe,QAAQ,UAAU,UAAU,SAAS,QAAQ,YAAY,KAAK,CAAC;AAAA,EAC9F,YAAY,EAAE,KAAK,CAAC,aAAa,QAAQ,UAAU,KAAK,CAAC;AAAA,EACzD,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAClD,CAAC;AAGM,IAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,QAAQ,EAAE,OAAO;AAAA,EACjB,YAAY,EAAE,KAAK,CAAC,aAAa,QAAQ,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EACpE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAClD,CAAC;AAGM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,IAAI,EAAE,OAAO;AAAA,EACb,eAAe,EAAE,OAAO;AAAA,EACxB,OAAO,EAAE,OAAO;AAAA,EAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,gBAAgB,WAAW,CAAC;AAAA,EACrD,SAAS,EAAE,MAAM,6BAA6B;AAAA,EAC9C,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACnC,eAAe;AAAA,EACf,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,OAAO;AACtB,CAAC;AAKM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,IAAI,EAAE,OAAO;AAAA,EACb,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EAClF,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,kBAAkB,0BAA0B,SAAS;AAAA,EACrD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,eAAe,+BAA+B,SAAS;AAAA,EACvD,QAAQ,EAAE,MAAM,sBAAsB;AAAA,EACtC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EAC/C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACvC,kBAAkB,EAAE,MAAM,gCAAgC,EAAE,SAAS;AAAA,EACrE,QAAQ,wBAAwB,SAAS;AAAA,EACzC,eAAe,+BAA+B,SAAS;AAAA,EACvD,QAAQ,EAAE,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,OAAO;AACtB,CAAC;;;AC9UD,eAAsB,oBACpB,YACA,gBACA,iBACA,YAAY,KACwD;AACpE,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb,QAAQ,GAAG,2BAA2B;AAAA;AAAA;AAAA,MACtC,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB;AAAA,QACf,GAAG;AAAA,QACH,WAAW,iBAAiB,aAAa;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAAqC,MAAM;AAC9D;;;AC7BO,SAAS,6BAAqC;AACnD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCT;;;AChCA,SAAS,cAAc,OAAmC;AACxD,QAAM,cAAc,SAAS,IAC1B,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAEzB,SAAO,cAAc;AACvB;AAEA,SAAS,SAAS,OAAuB;AACvC,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,YAAQ,MAAM,WAAW,KAAK;AAC9B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AACA,UAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AAC9D;AAEO,SAAS,8BAA8B,OAA4F;AACxI,QAAM,OAAO,MAAM,aAAa,IAAI,MAAM,UAAU,KAAK;AACzD,QAAM,UAAU,cAAc,MAAM,OAAO;AAC3C,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,QAAM,eAAe,cAAc,MAAM,YAAY;AACrD,QAAM,OAAO,SAAS,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,YAAY,EAAE;AACnE,SAAO,oBAAoB,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI;AAC7D;AAEO,SAAS,8BAA8B,OAA4H;AACxK,QAAM,OAAO,MAAM,aAAa,IAAI,MAAM,UAAU,KAAK;AACzD,QAAM,UAAU,cAAc,MAAM,OAAO;AAC3C,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,QAAM,YAAY,cAAc,MAAM,SAAS;AAC/C,QAAM,SAAS,MAAM,iBAAiB,8BAA8B,KAAK;AACzE,QAAM,OAAO,SAAS,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,IAAI,MAAM,gBAAgB,EAAE,IAAI,MAAM,EAAE;AACtG,SAAO,aAAa,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI;AACtD;AAEO,SAAS,2BAA2B,QAAgD;AACzF,QAAM,OAAO,oBAAI,IAAoB;AAErC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,gBAAgB,MAAM,iBAAiB,8BAA8B,KAAK;AAChF,UAAM,SAAS,8BAA8B,EAAE,GAAG,OAAO,cAAc,CAAC;AACxE,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,SAAK,IAAI,QAAQ,QAAQ,CAAC;AAE1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,IAAI,UAAU,IAAI,SAAS,GAAG,MAAM,IAAI,QAAQ,CAAC;AAAA,MACjD;AAAA,MACA,kBAAkB,MAAM,qBAAqB,MAAM,QAAQ,iBAAiB;AAAA,IAC9E;AAAA,EACF,CAAC;AACH;;;AC9CA,eAAsB,cACpB,YACA,gBACA,iBACA,YAAY,MACiD;AAC7D,QAAM,SAAS,GAAG,2BAA2B,CAAC;AAAA;AAAA;AAE9C,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB;AAAA,QACf,GAAG;AAAA,QACH,WAAW,iBAAiB,aAAa;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS;AACf,SAAO,EAAE,QAAQ,2BAA2B,OAAO,MAAM,GAAG,MAAM;AACpE;;;ACjCO,SAAS,oBACd,QACA,YACQ;AACR,QAAM,YAAY,OACf,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,SAAS,cAAc,EAAE,OAAO,GAAG,EAC5E,KAAK,IAAI;AACZ,QAAM,cAAc,WACjB,IAAI,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,EAAE,KAAK,gBAAgB,EAAE,QAAQ,GAAG,EAC/D,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA;AAAA,EAGT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBb;;;ACxBA,eAAsB,oBACpB,QACA,YACA,gBACA,iBACA,YAAY,MAC6C;AACzD,QAAM,iBAAiB,OAAO,IAAI,CAAC,OAAO;AAAA,IACxC,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAW,EAAE;AAAA,IACb,SAAS,EAAE;AAAA,EACb,EAAE;AAEF,QAAM,SAAS,oBAAoB,gBAAgB,UAAU;AAE7D,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAA0B,MAAM;AACnD;AAMA,eAAsB,yBACpB,QACA,kBACwB;AACxB,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;AAC9C,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,SAAO,iBAAiB;AAAA,IACtB,SAAS,IAAI,CAAC,OAAO;AAAA,MACnB,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,IACf,EAAE;AAAA,IACF,EAAE,OAAO,SAAS,SAAS,EAAE;AAAA,EAC/B;AACF;;;AC3DO,SAAS,yBACd,gBACQ;AACR,QAAM,YAAY,eACf;AAAA,IACC,CAAC,MAAM;AACL,UAAI,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,MAAM,EAAE,SAAS,cAAc,EAAE,OAAO,eAAe,EAAE,QAAQ;AAC5G,UAAI,EAAE,UAAW,SAAQ,iBAAiB,EAAE,UAAU,SAAS,UAAU,EAAE,UAAU,SAAS;AAC9F,aAAO;AAAA,IACT;AAAA,EACF,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBX;;;AC3BA,eAAsB,eACpB,gBACA,gBACA,iBACA,YAAY,MACkD;AAC9D,QAAM,iBAAiB,eAAe,IAAI,CAAC,OAAO;AAAA,IAChD,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,WAAW,EAAE;AAAA,IACb,SAAS,EAAE;AAAA,IACX,UAAU,EAAE;AAAA,IACZ,WAAW,EAAE;AAAA,EACf,EAAE;AAEF,QAAM,SAAS,yBAAyB,cAAc;AAEtD,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAA+B,MAAM;AACxD;;;ACtCO,SAAS,qCACd,WACA,WACQ;AACR,QAAM,eAAe,UAClB,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,EAC/C,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,YAAY;AAAA;AAAA;AAAA,EAGZ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBX;;;AC9BA,eAAsB,oBACpB,QACA,WACA,gBACA,iBACA,YAAY,MAC0C;AACtD,QAAM,iBAAiB,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE;AACvE,QAAM,SAAS,qCAAqC,gBAAgB,SAAS;AAE7E,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAAuB,MAAM;AAChD;;;AC9BO,SAAS,yBACd,WACA,WACQ;AACR,QAAM,eAAe,UAClB;AAAA,IACC,CAAC,GAAG,MACF,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,YAAY,EAAE,SAAS;AAAA,EACnE,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,YAAY;AAAA;AAAA;AAAA,EAGZ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BX;;;AClCA,eAAsB,aACpB,QACA,WACA,gBACA,iBACA,YAAY,MACkD;AAC9D,QAAM,YAAY,OAAO,IAAI,CAAC,OAAO;AAAA,IACnC,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,WAAW,EAAE;AAAA,EACf,EAAE;AAEF,QAAM,SAAS,yBAAyB,WAAW,SAAS;AAE5D,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAA+B,MAAM;AACxD;;;ACkDO,SAAS,sBACd,UACA,cACA,eACQ;AACR,QAAM,cAAc,SACjB,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,oBAAoB,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,EAC1F,KAAK,IAAI;AACZ,QAAM,YAAY,aACf,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,SAAS,GAAG,EACrD,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,WAAW;AAAA;AAAA;AAAA,EAGX,SAAS;AAAA;AAAA;AAAA,EAGT,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBf;;;ACtHA,eAAsB,eACpB,UACA,cACA,eACA,gBACA,iBACA,YAAY,MAC+C;AAC3D,QAAM,mBAAmB,SAAS,IAAI,CAAC,OAAO;AAAA,IAC5C,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,gBAAgB,EAAE;AAAA,EACpB,EAAE;AAEF,QAAM,iBAAiB,aAAa,IAAI,CAAC,OAAO;AAAA,IAC9C,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAW,EAAE;AAAA,EACf,EAAE;AAEF,QAAM,SAAS,sBAAsB,kBAAkB,gBAAgB,aAAa;AAEpF,QAAM,EAAE,QAAQ,MAAM,IAAI,MAAM;AAAA,IAAU,MACxC,eAAe;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,QAA4B,MAAM;AACrD;;;AC1CO,SAAS,gCACd,aACA,YACA,cACA,UACA,iBACA,kBACA,sBACA,aACQ;AAER,QAAM,uBAAuB,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS;AACnE,QAAM,oBAAoB,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS;AAE/D,QAAM,YAAY,qBACf,IAAI,CAAC,GAAG,MAAM;AACb,QAAI,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,SAAS;AACxE,QAAI,EAAE,QAAS,SAAQ,aAAa,EAAE,QAAQ,KAAK,IAAI,CAAC;AACxD,WAAO;AAAA,EACT,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,kBAAkB,kBAAkB,SAAS,IAC/C;AAAA;AAAA;AAAA,EAA+I,kBAAkB,IAAI,CAAC,MAAM,SAAS,EAAE,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,UAAW,SAAS,OAAO,EAAE,UAAW,SAAS,GAAG,EAAE,KAAK,IAAI,CAAC,KAC9R;AAEJ,QAAM,UAAU,eAAe;AAC/B,QAAM,kBAAkB,kBAAkB;AAE1C,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,kBAAkB,GAAG,CAAC;AAEhE,SAAO,8GAA8G,OAAO,kBAAkB,OAAO;AAAA;AAAA,eAExI,YAAY,uBAAuB;AAAA,WACvC,OAAO;AAAA,YACN,gBAAgB,OAAO,eAAe,kBAAkB,eAAe,gBAAgB,UAAU;AAAA,EAC3G,uBAAuB;AAAA;AAAA,EAAiC,oBAAoB;AAAA,IAAO,EAAE;AAAA;AAAA,EAErF,SAAS,GAAG,eAAe;AAAA;AAAA;AAAA,IAGzB,uBAAuB,kWAAwW,8BAA8B;AAAA;AAAA,SAExZ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBhB;;;ACtDA,eAAsB,mBACpB,aACA,YACA,cACA,MAOA,cACA,iBACA,YAAY,MACmC;AAC/C,QAAM,iBAAiB,YAAY,IAAI,CAAC,OAAO;AAAA,IAC7C,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAW,EAAE;AAAA,IACb,SAAS,EAAE;AAAA,IACX,WAAW,EAAE;AAAA,EACf,EAAE;AAEF,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAEA,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM;AAAA,IAAU,MACtC,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,MAAM;AACvB;;;ACvBO,SAAS,oBAAoB,QAGd;AACpB,QAAM,EAAE,QAAQ,mBAAmB,MAAM,IAAI;AAC7C,QAAM,cAAc,OAAO,KAAK,CAAC,UAAU,MAAM,aAAa,UAAU;AACxE,QAAM,cAAc,OAAO,KAAK,CAAC,UAAU,MAAM,aAAa,SAAS,KAAK;AAC5E,SAAO,cAAc,WAAW,cAAc,YAAY;AAC5D;AAEO,SAAS,sBACd,MACA,QACS;AACT,SAAO,SAAS,YAAY,WAAW;AACzC;;;ACvBA,SAAS,cAAc,QAAqC;AAC1D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,SAAO,eAAe,aACjB,WAAW,SAAS,kBAAkB,KACtC,WAAW,SAAS,gBAAgB,KACpC,eAAe,aACf,eAAe;AACtB;AAEA,SAAS,4BAA4B,OAAkC;AACrE,MAAI,CAAC,MAAM,MAAO,QAAO;AACzB,QAAM,SAAS,MAAM,QAAQ,YAAY,KAAK;AAC9C,MAAI,MAAM,eAAe,OAAQ,QAAO;AACxC,MAAI,MAAM,mBAAmB,OAAQ,QAAO;AAE5C,QAAM,QAAQ,GAAG,MAAM,OAAO,IAAI,MAAM,KAAK,GAAG,YAAY;AAC5D,QAAM,iBAAiB,2KAA2K,KAAK,KAAK;AAC5M,QAAM,gBAAgB,MAAM,cAAc,cAAc,MAAM,cAAc,UAAU,MAAM,cAAc,aAAa,MAAM,cAAc;AAC3I,QAAM,uBAAuB,yDAAyD,KAAK,MAAM;AAEjG,SAAO,yBAAyB,kBAAkB;AACpD;AAEO,SAAS,8BAA8B,OAAmD;AAC/F,QAAM,SAAoC,CAAC;AAC3C,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,QAAQ,IAAI,MAAM,EAAE,GAAG;AACzB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,UAAU,MAAM,KAAK,yBAAyB,MAAM,EAAE;AAAA,QAC/D,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AACA,YAAQ,IAAI,MAAM,EAAE;AAEpB,QAAI,MAAM,YAAY,CAAC,MAAM,OAAO;AAClC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,mBAAmB,MAAM,KAAK;AAAA,QACvC,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,SAAS,CAAC,MAAM,QAAQ;AAChC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iBAAiB,MAAM,KAAK;AAAA,QACrC,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,SAAS,cAAc,MAAM,MAAM,GAAG;AAC9C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iBAAiB,MAAM,KAAK;AAAA,QACrC,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,UAAU,CAAC,MAAM,cAAc,MAAM,eAAe,QAAQ;AACpE,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,iBAAiB,MAAM,KAAK;AAAA,QACrC,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,QAAI,4BAA4B,KAAK,GAAG;AACtC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,gCAAgC,MAAM,KAAK;AAAA,QACpD,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,WAAW;AAAA,MACT,EAAE,MAAM,sBAAsB,OAAO,sBAAsB,WAAW,MAAM,OAAO,OAAO;AAAA,IAC5F;AAAA,IACA,mBAAmB,oBAAoB,EAAE,OAAO,CAAC;AAAA,EACnD;AACF;AAEO,SAAS,iBAAiB,MAAc,aAAyD;AACtG,QAAM,SAAoC,CAAC;AAC3C,QAAM,aAAa,KAAK,YAAY;AAEpC,aAAW,SAAS,aAAa;AAC/B,UAAM,QAAQ,MAAM,MAAM,KAAK,EAAE,YAAY;AAC7C,QAAI,MAAM,UAAU,KAAK,CAAC,WAAW,SAAS,KAAK,GAAG;AACpD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,mDAAmD,MAAM,KAAK;AAAA,QACvE,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,oBAAoB,EAAE,OAAO,CAAC;AAAA,EACnD;AACF;;;ACvIA,IAAM,6BAA6B;AACnC,IAAM,8BAA8B;AAiC7B,SAAS,wBAAwB,OAA8D;AACpG,QAAM,iBAAiB,MAAM,OAAO,OAAO,UAAU;AACrD,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA,MAAM,oBAAoB,MAAM;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,aAAa,MAAM,uBAAuB,eAAe,SAAS;AAAA,IAClE,oBAAoB,MAAM,kBAAkB,KAAK,eAAe,SAAS;AAAA,IACzE;AAAA,IACA,aAAa,eAAe,SAAS;AAAA,IACrC;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAA8C;AAC7E,QAAM,mBAAmB,MAAM,mBAAmB,SAAS;AAC3D,QAAM,yBAAyB,MAAM,mBAAmB,CAAC,GAAG,KAAK,UAAU;AAC3E,QAAM,qBAAqB,MAAM,OAAO,gBAAgB,UAAU,KAAK;AAEvE,SAAO;AAAA,IACL,cAAc,MAAM,OAAO,cAAc;AAAA,IACzC,WAAW,qBAAqB,MAAM;AAAA,IACtC,gBAAgB,QAAQ,MAAM,OAAO,YAAY,MAC3C,MAAM,OAAO,kBAAkB,cAAc,MAAM,OAAO,kBAAkB;AAAA,IAClF,cAAe,oBAAoB,MAAM,mBAAmB,MAAM,CAAC,UAAU,CAAC,WAAW,KAAK,CAAC,KACzF,CAAC,oBAAoB;AAAA,IAC3B,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,yBACP,gBACA,WACoB;AACpB,MAAI,CAAC,aAAa,eAAe,WAAW,EAAG,QAAO,CAAC;AAEvD,QAAM,mBAAmB,eAAe,OAAO,sBAAsB;AACrE,MAAI,iBAAiB,WAAW,EAAG,QAAO,CAAC;AAE3C,QAAM,gBAAgB,IAAI,iBAAiB,SAAS,eAAe;AACnE,MAAI,eAAe,SAAS,8BAA8B,gBAAgB,6BAA6B;AACrG,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,iBAAiB,MAAM,GAAG,0BAA0B;AAC7D;AAEA,SAAS,WAAW,OAAkC;AACpD,SAAO,MAAM,UAAU,UAAa,MAAM,MAAM,KAAK,MAAM;AAC7D;AAEA,SAAS,uBAAuB,OAAkC;AAChE,QAAM,OAAO,GAAG,MAAM,OAAO,IAAI,MAAM,KAAK,GAAG,YAAY;AAE3D,MAAI,MAAM,SAAU,QAAO;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC;AACtC;;;AC/GA,SAAS,KAAAA,UAAS;;;ACAlB,SAAS,KAAAC,UAAS;AAEX,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,qBAAqBA,GAAE,KAAK,eAAe;AAGjD,IAAM,mBAAiD;AAAA,EAC5D,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAaO,IAAM,4BAA4D;AAAA,EACvE,mBAAmB,CAAC,KAAK;AAAA,EACzB,qBAAqB,CAAC,OAAO;AAAA,EAC7B,iBAAiB,CAAC,OAAO;AAAA,EACzB,gBAAgB,CAAC,OAAO;AAAA,EACxB,cAAc,CAAC,MAAM;AAAA,EACrB,UAAU,CAAC,OAAO;AAAA,EAClB,kBAAkB,CAAC,OAAO;AAAA,EAC1B,wBAAwB,CAAC,IAAI;AAAA,EAC7B,OAAO,CAAC,MAAM;AAAA,EACd,MAAM,CAAC,MAAM;AAAA,EACb,oBAAoB,CAAC,IAAI;AAAA,EACzB,qBAAqB,CAAC,OAAO;AAAA,EAC7B,gBAAgB,CAAC,OAAO;AAAA,EACxB,eAAe,CAAC,OAAO;AAAA,EACvB,eAAe,CAAC,OAAO;AAAA,EACvB,eAAe,CAAC,MAAM;AAAA,EACtB,cAAc,CAAC,OAAO;AAAA,EACtB,QAAQ,CAAC,MAAM;AAAA,EACf,mBAAmB,CAAC,MAAM;AAAA,EAC1B,KAAK,CAAC,KAAK;AAAA,EACX,8BAA8B,CAAC,MAAM,QAAQ,OAAO;AAAA,EACpD,UAAU,CAAC,MAAM;AAAA,EACjB,gBAAgB,CAAC,MAAM;AAAA,EACvB,gBAAgB,CAAC,MAAM;AAAA,EACvB,aAAa,CAAC,MAAM;AAAA,EACpB,WAAW,CAAC,MAAM;AAAA,EAClB,eAAe,CAAC,OAAO;AAAA,EACvB,aAAa,CAAC,OAAO;AAAA,EACrB,eAAe,CAAC,OAAO;AAAA,EACvB,mBAAmB,CAAC,OAAO;AAAA,EAC3B,YAAY,CAAC,OAAO;AAAA,EACpB,eAAe,CAAC,OAAO;AAAA,EACvB,YAAY,CAAC,IAAI;AAAA,EACjB,wBAAwB,CAAC,OAAO;AAAA,EAChC,YAAY,CAAC,MAAM;AAAA,EACnB,sBAAsB,CAAC,MAAM;AAAA,EAC7B,YAAY,CAAC,MAAM;AAAA,EACnB,MAAM,CAAC,IAAI;AAAA,EACX,kBAAkB,CAAC,OAAO;AAAA,EAC1B,YAAY,CAAC,OAAO;AAAA,EACpB,gBAAgB,CAAC,IAAI;AAAA,EACrB,KAAK,CAAC,IAAI;AAAA,EACV,QAAQ,CAAC,IAAI;AAAA,EACb,gBAAgB,CAAC,IAAI;AAAA,EACrB,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO,CAAC,IAAI;AAAA,EACZ,SAAS,CAAC,IAAI;AAAA,EACd,MAAM,CAAC,OAAO;AAAA,EACd,OAAO,CAAC,OAAO;AAAA,EACf,MAAM,CAAC,OAAO;AAAA,EACd,WAAW,CAAC,OAAO;AAAA,EACnB,SAAS,CAAC,IAAI;AAAA,EACd,KAAK,CAAC,IAAI;AAAA,EACV,YAAY,CAAC,MAAM;AAAA,EACnB,SAAS,CAAC,MAAM;AAAA,EAChB,OAAO,CAAC,OAAO;AAAA,EACf,MAAM,CAAC,MAAM;AAAA,EACb,YAAY,CAAC,YAAY;AAC3B;AAoBA,SAAS,OAAyB,QAAW,KAAkC;AAC7E,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACzD;AAEA,SAAS,mBAAmB,OAAe;AACzC,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,MAAM,OAAO,EACrB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,GAAG;AACvB;AASO,SAAS,UAAU,OAAuC;AAC/D,SAAO,OAAO,UAAU,YAAY,OAAO,kBAAkB,KAAK;AACpE;AAsBO,SAAS,WAAW,QAA4C;AACrE,QAAM,SAAS,QAAQ,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,KAAK,CAAC;AACxF,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC,IAAI;AACrC,QAAM,QAAwB,CAAC;AAC/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,UAAU,OAAO,GAAG;AACtB,YAAM,KAAK,OAAO;AAClB;AAAA,IACF;AACA,QAAI,QAAQ,YAAY,MAAM,QAAQ;AACpC,YAAM,KAAK,OAAO;AAClB;AAAA,IACF;AACA,UAAM,SAAS,0BAA0B,mBAAmB,OAAO,CAAC;AACpE,QAAI,QAAQ;AACV,YAAM,KAAK,GAAG,MAAM;AACpB;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,YAAY;AAClC,QAAI,UAAU,KAAK,GAAG;AACpB,YAAM,KAAK,KAAK;AAChB;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC;AAClC;;;AD1VO,IAAM,uBAAuBC,GAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,uBAAuBA,GAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,mBAAmBA,GAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,GAAGA,GAAE,OAAO;AAAA,EACZ,GAAGA,GAAE,OAAO;AAAA,EACZ,OAAOA,GAAE,OAAO;AAAA,EAChB,QAAQA,GAAE,OAAO;AACnB,CAAC;AAGM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EACnD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EACjD,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAGM,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EACpD,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EAClD,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EACrD,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAUA,GAAE,QAAQ,EAAE,SAAS;AACjC,CAAC;AAGM,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EACvC,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,YAAY,iBAAiB,SAAS;AAAA,EACtC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM;AAAA,EACN,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,qBAAqB,SAAS;AAAA,EAC1C,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,OAAO,8BAA8B,SAAS;AAAA,EAC9C,MAAMA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,EAC7C,UAAU,yBAAyB,SAAS;AAAA,EAC5C,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC;AAGM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,cAAcA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,UAAU,yBAAyB,SAAS;AAC9C,CAAC;AAGM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EACxC,MAAMA,GAAE,OAAO;AAAA,EACf,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAGM,IAAM,+BAA+BA,GAAE,KAAK;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,MAAM;AAAA,EACN,OAAOA,GAAE,OAAO;AAAA,EAChB,aAAaA,GAAE,OAAO;AAAA,EACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA,EACxC,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,MAAMA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,EAC7C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,MAAMA,GAAE,OAAO;AAAA,EACf,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACvD,CAAC;AAGM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,OAAOA,GAAE,OAAO;AAAA,EAChB,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,YAAYA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC9D,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAGM,IAAM,mCAAmCA,GAAE,OAAO;AAAA,EACvD,OAAOA,GAAE,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAOA,GAAE,OAAO;AAAA,EAChB,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,WAAWA,GAAE,KAAK,CAAC,UAAU,UAAU,QAAQ,SAAS,WAAW,QAAQ,SAAS,CAAC,EAAE,QAAQ,QAAQ;AAAA,EACvG,SAAS,yBAAyB,SAAS;AAAA,EAC3C,YAAYA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC9D,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGM,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EACpD,MAAMA,GAAE,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EAAE,QAAQ,OAAO;AAAA,EAClB,OAAOA,GAAE,OAAO;AAAA,EAChB,OAAOA,GAAE,OAAO;AAAA,EAChB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGM,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EACpD,MAAMA,GAAE,OAAO;AAAA,EACf,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACvC,QAAQA,GAAE,MAAM,6BAA6B,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO;AAAA,EACf,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGM,IAAM,sCAAsCA,GAAE,OAAO;AAAA,EAC1D,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GAAE,KAAK,CAAC,aAAa,YAAY,iBAAiB,CAAC;AAAA,EAC3D,SAASA,GAAE,OAAO;AAAA,EAClB,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAGD,SAAS,8BAA8B,OAAgB;AACrD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,SAAS;AACf,MAAI,qBAAqB,OAAQ,QAAO;AACxC,MAAI,EAAE,iBAAiB,QAAS,QAAO;AACvC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB,OAAO;AAAA,EAC1B;AACF;AAEA,IAAM,mCAAmCA,GAAE;AAAA,EACzC,CAAC,UAAW,MAAM,QAAQ,KAAK,IAAI,WAAW,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,CAAC,IAAI;AAAA,EAClHA,GAAE,MAAM,kBAAkB,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC5C;AAEO,IAAM,iCAAiCA,GAAE;AAAA,EAC9C;AAAA,EACAA,GAAE,OAAO;AAAA,IACP,cAAcA,GAAE,KAAK,CAAC,UAAU,OAAO,CAAC,EAAE,QAAQ,QAAQ;AAAA,IAC1D,iBAAiB;AAAA,IACjB,cAAc,wBAAwB,SAAS;AAAA,IAC/C,cAAc,wBAAwB,SAAS;AAAA,IAC/C,SAAS,wBAAwB,SAAS;AAAA,IAC1C,QAAQ,wBAAwB,SAAS;AAAA,IACzC,eAAe,wBAAwB,SAAS;AAAA,IAChD,gBAAgB,wBAAwB,SAAS;AAAA,IACjD,iBAAiB,wBAAwB,SAAS;AAAA,IAClD,SAAS,wBAAwB,SAAS;AAAA,IAC1C,kBAAkBA,GAAE,MAAM,gCAAgC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACtE,WAAWA,GAAE,MAAM,6BAA6B,EAAE,QAAQ,CAAC,CAAC;AAAA,IAC5D,SAASA,GAAE,MAAM,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAAA,IACnD,oBAAoBA,GAAE,MAAM,mCAAmC,EAAE,QAAQ,CAAC,CAAC;AAAA,IAC3E,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACpD,eAAeA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACpD,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC1C,CAAC;AACH;;;AEhRA,SAAS,cAAc,MAAsB;AAC3C,SAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACxC;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO,KAAK,UAAU,KAAK,KAAK;AAAA,EAClC;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,SAAS;AACf,SAAO,IAAI,OAAO,KAAK,MAAM,EAC1B,KAAK,EACL,OAAO,CAAC,QAAQ,OAAO,GAAG,MAAM,MAAS,EACzC,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,gBAAgB,OAAO,GAAG,CAAC,CAAC,EAAE,EACrE,KAAK,GAAG,CAAC;AACd;AAEO,SAAS,WAAW,OAAwB;AACjD,QAAM,QAAQ,gBAAgB,KAAK;AACnC,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,OAAO,MAAM,WAAW,KAAK;AACnC,aAAS;AACT,YAAQ,KAAK,KAAK,OAAO,QAAU;AACnC,aAAS,OAAO;AAChB,YAAQ,KAAK,KAAK,OAAO,SAAU;AAAA,EACrC;AACA,SAAO,IAAI,UAAU,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,UAAU,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACrG;AAEO,SAAS,mBAAmB,MAAsB;AACvD,SAAO,WAAW,cAAc,IAAI,CAAC;AACvC;;;ACJA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,qBAAqB,GAAG;AAC/C;AAEO,SAAS,gBAAgB,OAA4B,aAAa,GAAe;AACtF,QAAM,OAAO,oBAAoB,MAAM,IAAI;AAC3C,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,WAAW,MAAM,aAAa;AACpC,QAAM,KAAK;AAAA,IACT,eAAe,MAAM,UAAU;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM,GAAG,EAAE;AAAA,EACtB,EAAE,KAAK,GAAG;AAEV,SAAO,iBAAiB,MAAM;AAAA,IAC5B;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,MAAM,MAAM,WAAW,SAAS,MAAM,IAAI,aAAa;AAAA,IACvD;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,IACpB,OAAO,MAAM;AAAA,IACb,UAAU;AAAA,MACR,MAAM,MAAM,cAAc,MAAM,UAAU,MAAM,YAAY;AAAA,MAC5D,WAAW,MAAM;AAAA,MACjB,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,IACnB;AAAA,IACA,UAAU,MAAM;AAAA,EAClB,CAAC;AACH;AA4DO,SAAS,qBAAqB,OAA4B,UAA8B,CAAC,GAAiB;AAC/G,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,eAAe,KAAK,IAAI,QAAQ,gBAAgB,GAAG,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;AAClF,QAAM,OAAO,oBAAoB,MAAM,IAAI;AAC3C,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,QAAsB,CAAC;AAC7B,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,QAAQ;AAC3B,UAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,SAAS,QAAQ;AACnD,UAAM,WAAW,KAAK,MAAM,QAAQ,GAAG;AACvC,UAAM,KAAK,gBAAgB,EAAE,GAAG,OAAO,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC;AACtE,QAAI,QAAQ,KAAK,OAAQ;AACzB,aAAS,MAAM;AAAA,EACjB;AAEA,SAAO;AACT;;;ACvJO,SAAS,6BACd,QACA,SAC0B;AAC1B,QAAM,eAAe,oBAAI,IAAqC;AAC9D,QAAM,QAAmC,CAAC;AAE1C,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC7C,UAAM,YAAY,aAAa,CAAC,WAAW,MAAM,OAAO,CAAC;AACzD,QAAI,cAAc,aAAa,IAAI,SAAS;AAC5C,QAAI,CAAC,aAAa;AAChB,oBAAc;AAAA,QACZ,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,OAAO,MAAM;AAAA,QACb,OAAO,aAAa;AAAA,QACpB,UAAU,CAAC;AAAA,MACb;AACA,mBAAa,IAAI,WAAW,WAAW;AACvC,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,UAAM,QAAiC;AAAA,MACrC,IAAI,MAAM,iBAAiB,aAAa,CAAC,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,MACzF,UAAU,MAAM,cAAc,UAAU,UAAU;AAAA,MAClD,SAAS,MAAM;AAAA,MACf,WAAW,GAAG,MAAM,OAAO,IAAI,MAAM,EAAE;AAAA,MACvC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,WAAW,MAAM,YACb;AAAA,QACE,WAAW,MAAM,UAAU;AAAA,QAC3B,UAAU;AAAA,QACV,OAAO,MAAM,UAAU;AAAA,QACvB,WAAW,MAAM,UAAU;AAAA,MAC7B,IACA;AAAA,IACN;AACA,gBAAY,WAAW,CAAC,GAAI,YAAY,YAAY,CAAC,GAAI,KAAK;AAAA,EAChE;AAEA,SAAO,kCAAkC;AAAA,IACvC,IAAI,QAAQ;AAAA,IACZ,SAAS,QAAQ,WAAW;AAAA,IAC5B,OAAO,QAAQ;AAAA,IACf,iBAAiB,QAAQ;AAAA,IACzB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IACxC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kCAAkC,OAA2D;AAC3G,QAAM,kBAAkB,MAAM,MAC3B,IAAI,CAAC,MAAM,UAAU,cAAc,MAAM,QAAW,KAAK,CAAC,EAC1D,KAAK,YAAY;AAEpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,MAAM,aAAa,SAC5B,MAAM,cACN,gBAAgB,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,OAAqD;AACxF,QAAM,SAA6B,CAAC;AAEpC,aAAW,QAAQ,MAAM,MAAM,KAAK,YAAY,GAAG;AACjD,kBAAc,MAAM,MAAM;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,OAA+E;AACxH,QAAM,iBAAiB,IAAI;AAAA,IACzB,MAAM,OACH,OAAO,CAAC,UAAU,MAAM,UAAU,UAAa,MAAM,MAAM,KAAK,MAAM,EAAE,EACxE,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,SAAS,EAAE,CAAC;AAAA,EACjD;AACA,QAAM,kBAAkB,oBAAI,IAA0C;AAEtE,aAAW,QAAQ,MAAM,eAAe,SAAS,CAAC,GAAG;AACnD,0BAAsB,MAAM,eAAe;AAAA,EAC7C;AAEA,SAAO,MAAM,OAAO,OAAO,CAAC,UAAU;AACpC,UAAM,iBAAiB,gBAAgB,IAAI,MAAM,EAAE;AACnD,WAAO,qBAAqB,MAAM,WAAW,cAAc,KACtD,6BAA6B,gBAAgB,cAAc;AAAA,EAClE,CAAC;AACH;AAEO,SAAS,4BACd,OACA,QAAQ,GACY;AACpB,QAAM,iBAAiB,2BAA2B,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK;AACvF,MAAI,eAAe,WAAW,EAAG,QAAO,CAAC;AAEzC,QAAM,kBAAkB,MAAM,UAAU,MAAM,iBAAiB,KAAK,CAAC;AACrE,QAAM,qBAAqB,eAAe,OAAO,CAAC,UAAU,gBAAgB,SAAS,MAAM,EAAE,CAAC;AAC9F,UAAQ,mBAAmB,SAAS,IAAI,qBAAqB,gBAAgB,MAAM,GAAG,KAAK;AAC7F;AAEA,SAAS,cACP,MACA,UACA,OACyB;AACzB,QAAM,WAAW,KAAK,UAAU,IAAI,CAAC,OAAO,eAAe,cAAc,OAAO,KAAK,IAAI,UAAU,CAAC;AACpG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,KAAK,YAAY;AAAA,IAC3B,OAAO,KAAK,SAAS;AAAA,IACrB,WAAW,KAAK,cAAc,KAAK,UAAU,CAAC,KAAK,SAAS,KAAK,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,IAAI;AAAA,IACtG;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAA+B,QAAkC;AACtF,OAAK,KAAK,aAAa,cAAc,KAAK,aAAa,YAAY,KAAK,SAAS;AAC/E,WAAO,KAAK;AAAA,MACV,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK,WAAW;AAAA,MACzB,WAAW,KAAK,cAAc,KAAK,aAAa,UAAU,UAAU;AAAA,MACpE,UAAU,KAAK,YAAY;AAAA,MAC3B,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,WAAW,KAAK,YACZ;AAAA,QACE,WAAW,KAAK,UAAU;AAAA,QAC1B,WAAW,KAAK,UAAU,SAAS,KAAK,UAAU,aAAa;AAAA,MACjE,IACA;AAAA,MACJ,eAAe,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,KAAK,YAAY,CAAC,GAAG;AACvC,kBAAc,OAAO,MAAM;AAAA,EAC7B;AACF;AAEA,SAAS,sBAAsB,MAA+B,YAA6D;AACzH,MAAI,KAAK,WAAW,KAAK,WAAW;AAClC,eAAW,IAAI,KAAK,SAAS,KAAK,SAAS;AAAA,EAC7C;AACA,aAAW,SAAS,KAAK,YAAY,CAAC,GAAG;AACvC,0BAAsB,OAAO,UAAU;AAAA,EACzC;AACF;AAEA,SAAS,qBACP,WACA,gBACS;AACT,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,UAAU,eAAe,IAAI,UAAU,SAAS;AACtD,SAAO,eAAe,OAAO,MAAM,eAAe,UAAU,SAAS;AACvE;AAEA,SAAS,6BACP,WACA,gBACS;AACT,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,UAAU,eAAe,IAAI,UAAU,SAAS;AACtD,QAAM,WAAW,UAAU,SAAS,UAAU;AAC9C,QAAM,SAAS,UAAU,WAAW,aAAa,SAAY,CAAC,QAAQ,IAAI,CAAC;AAE3E,UAAQ,UAAU,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,YAAY,UAAa,QAAQ,KAAK,MAAM;AAAA,IACrD,KAAK;AACH,aAAO,eAAe,OAAO,MAAM,eAAe,QAAQ;AAAA,IAC5D,KAAK;AACH,aAAO,OAAO,IAAI,cAAc,EAAE,SAAS,eAAe,OAAO,CAAC;AAAA,IACpE,KAAK;AACH,aAAO,CAAC,OAAO,IAAI,cAAc,EAAE,SAAS,eAAe,OAAO,CAAC;AAAA,IACrE,KAAK;AAAA,IACL;AACE,aAAO,eAAe,OAAO,MAAM,eAAe,QAAQ;AAAA,EAC9D;AACF;AAEA,SAAS,aAAa,GAA4B,GAAoC;AACpF,UAAQ,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE;AACnE;AAEA,SAAS,eAAe,OAAmC;AACzD,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAEA,SAAS,aAAa,OAAyB;AAC7C,SAAO,MACJ,KAAK,GAAG,EACR,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,KACpB;AACP;;;AClMO,SAAS,+BACd,QACA,SAO0B;AAC1B,SAAO,6BAA6B,QAAQ,OAAO;AACrD;AAEO,SAAS,qBAAqB,QAAsD;AACzF,QAAM,MAAM,OAAO,OAAO,KAAK,IAAI;AACnC,QAAM,QAAQ,kCAAkC,OAAO,SAAS,aAAa;AAC7E,QAAM,SAAS,OAAO,SAAS,QAAQ,SACnC,OAAO,SAAS,SAChB,qBAAqB,KAAK;AAE9B,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,YAAY,OAAO,SAAS;AAAA,IAC5B,iBAAiB,OAAO,SAAS;AAAA,IACjC,kBAAkB,OAAO;AAAA,IACzB,OAAO,OAAO,SAAS;AAAA,IACvB,iBAAiB,OAAO,SAAS;AAAA,IACjC,eAAe;AAAA,IACf;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEO,SAAS,6BACd,OACA,OAC0F;AAC1F,QAAM,SAAS,4BAA4B,OAAO,KAAK;AACvD,SAAO;AAAA,IACL,QAAQ,OAAO,WAAW,IAAI,aAAa;AAAA,IAC3C,UAAU,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,IACxC;AAAA,EACF;AACF;AAEO,SAAS,wBACd,OACA,SACA,MAAM,KAAK,IAAI,GACG;AAClB,QAAM,kBAAkB,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,CAAC;AACjF,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,UAAU;AACzC,UAAM,SAAS,gBAAgB,IAAI,MAAM,EAAE;AAC3C,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO,UAAU;AAAA,MACzB,YAAY,OAAO,cAAc;AAAA,MACjC,eAAe,OAAO,iBAAiB,MAAM;AAAA,MAC7C,mBAAmB,OAAO,qBAAqB,MAAM;AAAA,MACrD,kBAAkB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,YAA8B;AAAA,IAClC,GAAG;AAAA,IACH;AAAA,IACA,WAAW;AAAA,EACb;AAEA,QAAM,gBAAgB,6BAA6B,SAAS;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,cAAc,WAAW,aAAa,eAAe,UAAU;AAAA,IACvE,eAAe,8BAA8B,SAAS;AAAA,EACxD;AACF;AAEO,SAAS,qBAAqB,OAAuD;AAC1F,SAAO,2BAA2B,KAAK,EACpC,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,cAAc,MAAM,eAAe,KAAK,EAC/E,IAAI,CAAC,WAAW;AAAA,IACf,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE;AAAA,IAC3B,SAAS,MAAM;AAAA,IACf,KAAK,iBAAiB,KAAK;AAAA,IAC3B,OAAO,MAAM,SAAS;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,QAAQ,WAAW,SAAS,IAAI,WAAW;AAAA,IACzD,YAAY,MAAM,cAAc;AAAA,IAChC,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,EAC3B,EAAE;AACN;AAEO,SAAS,uBACd,OACA,UAAsD,CAAC,GACpC;AACnB,QAAM,gBAAgB,8BAA8B,KAAK;AACzD,QAAM,eAAe,2BAA2B,KAAK;AACrD,QAAM,UAAU,aACb,OAAO,CAAC,UAAU,MAAM,KAAK,EAC7B,IAAI,CAAC,WAAW;AAAA,IACf,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM,UAAU;AAAA,IACxB,YAAY,MAAM;AAAA,IAClB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,EAC3B,EAAE;AAEJ,QAAM,kBAAkB,aACrB,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,MAAM,KAAK,EAChD,IAAI,CAAC,UAAU,MAAM,EAAE;AAE1B,SAAO;AAAA,IACL,IAAI,GAAG,MAAM,EAAE;AAAA,IACf,eAAe,MAAM;AAAA,IACrB,OAAO,MAAM,SAAS,MAAM,mBAAmB;AAAA,IAC/C,QAAQ,cAAc,sBAAsB,YAAY,gBAAgB,SAAS,IAAI,UAAU;AAAA,IAC/F;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,QAAQ;AAAA,IACzB,WAAW,QAAQ,OAAO,KAAK,IAAI;AAAA,EACrC;AACF;AAEO,SAAS,0BAA0B,QAAqD;AAC7F,QAAM,SAAS,CAAC,GAAG,OAAO,cAAc,MAAM;AAE9C,MAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,GAAG,OAAO;AAAA,IACV;AAAA,IACA,mBAAmB,OAAO,KAAK,CAAC,UAAU,MAAM,aAAa,UAAU,IACnE,WACA,OAAO,cAAc;AAAA,EAC3B;AACF;AAEA,SAAS,iBAAiB,OAAiC;AACzD,SAAO,GAAG,MAAM,OAAO,IAAI,MAAM,KAAK,GACnC,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;;;ACxJO,SAAS,0BAA0B,QAAmC;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,CAAC;AAAA,IACd,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,QAAQ,OAAO,WAAW;AAChC,MAAI,aAAyB,EAAE,aAAa,GAAG,cAAc,EAAE;AAE/D,WAAS,WAAW,OAAoB;AACtC,QAAI,OAAO;AACT,iBAAW,eAAe,MAAM;AAChC,iBAAW,gBAAgB,MAAM;AACjC,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,WAAS,cAAc,UAAyB,YAAoB;AAClE,WAAO,mBAAmB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,yBAAyB,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACH;AAMA,iBAAe,mBACb,OACmC;AACnC,iBAAa,EAAE,aAAa,GAAG,cAAc,EAAE;AAC/C,UAAM,EAAE,WAAW,QAAQ,IAAI;AAC/B,UAAM,6BAA6B,MAAM,aAAa,SAClD,EAAE,GAAG,iBAAiB,aAAa,MAAM,YAAY,IACrD;AACJ,UAAM,KAAK,MAAM,iBAAiB,OAAO,KAAK,IAAI,CAAC;AACnD,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,UAAU;AAClB,YAAM,eAAe,aAAa,MAAM,QAAQ;AAAA,IAClD;AAEA,QAAI,QAA0B;AAAA,MAC5B;AAAA,MACA,YAAY,MAAM,UAAU;AAAA,MAC5B,iBAAiB,MAAM,UAAU;AAAA,MACjC,kBAAkB,MAAM;AAAA,MACxB,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,eAAe,MAAM,iBAAiB,MAAM,UAAU;AAAA,MACtD,QAAQ,CAAC;AAAA,MACT,eAAe;AAAA,MACf,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAEA,iBAAa,yBAAyB;AACtC,UAAM,kBAAkB,KAAK,KAAK;AAElC,QAAI;AACJ,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,cAAc,IAAI,MAAM;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,wBAAwB,GAAG,EAAE;AAAA,MAC7C;AACA,iBAAW,aAAa;AACxB,uBAAiB;AAAA,IACnB,SAAS,OAAO;AACd,YAAM,MAAM,uDAAuD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC3H,uBAAiB,EAAE,eAAe,OAAO,YAAY,GAAG,iBAAiB,KAAK;AAAA,IAChF;AAEA,QAAI,CAAC,eAAe,eAAe;AACjC,YAAM,SAAS;AACf,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,gBAAgB,8BAA8B,KAAK;AACzD,YAAM,kBAAkB,KAAK,KAAK;AAClC,aAAO,EAAE,OAAO,YAAY,YAAY,cAAc,MAAM,cAAc;AAAA,IAC5E;AAEA,UAAM,kBAAkB,eAAe;AACvC,UAAM,SAAS;AACf,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,kBAAkB,KAAK,KAAK;AAGlC,iBAAa,2BAA2B;AACxC,QAAI;AACJ,QAAI;AACF,YAAM,EAAE,QAAQ,iBAAiB,OAAO,aAAa,IAAI,MAAM;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,8BAA8B,IAAI,EAAE;AAAA,MACpD;AACA,iBAAW,YAAY;AACvB,eAAS;AAAA,IACX,SAAS,OAAO;AACd,YAAM,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAChG,eAAS,CAAC;AAAA,IACZ;AAEA,QAAI,OAAO,WAAW,GAAG;AAEvB,YAAM,MAAM,4DAA4D;AACxE,YAAM,SAAS;AACf,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,gBAAgB,8BAA8B,KAAK;AACzD,YAAM,kBAAkB,KAAK,KAAK;AAClC,aAAO,EAAE,OAAO,YAAY,YAAY,cAAc,MAAM,cAAc;AAAA,IAC5E;AAEA,UAAM,SAAS;AACf,UAAM,gBAAgB,MAAM,iBACvB,MAAM,UAAU,iBAChB,6BAA6B,QAAQ;AAAA,MACtC,IAAI,GAAG,EAAE;AAAA,MACT,OAAO,eAAe,mBAAmB;AAAA,MACzC,iBAAiB,eAAe;AAAA,MAChC,QAAQ;AAAA,IACV,CAAC;AACH,UAAM,QAAQ,eAAe,mBAAmB;AAChD,UAAM,SAAS;AACf,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,kBAAkB,KAAK,KAAK;AAGlC,iBAAa,gBAAgB,OAAO,MAAM,YAAY;AAEtD,QAAI,eAAe,wBAAwB;AAAA,MACzC,QAAQ,MAAM;AAAA,MACd,qBAAqB,QAAQ,gBAAgB;AAAA,MAC7C,iBAAiB,WAAW;AAAA,MAC5B,kBAAkB,QAAQ,aAAa;AAAA,MACvC,gBAAgB,QAAQ,WAAW;AAAA,IACrC,CAAC;AAGD,QAAI,aAAa,eAAe,kBAAkB;AAChD,UAAI;AACF,cAAM,eAAe,MAAM,yBAAyB,MAAM,QAAQ,gBAAgB;AAClF,mBAAW,MAAM,cAAc;AAC7B,gBAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;AAC1D,cAAI,SAAS,CAAC,MAAM,SAAS,GAAG,YAAY,KAAK;AAC/C,kBAAM,QAAQ,GAAG;AACjB,kBAAM,SAAS,aAAa,GAAG,MAAM;AACrC,kBAAM,aAAa,GAAG,cAAc;AACpC,kBAAM,mBAAmB,GAAG,eAAe,SAAS,UAAU;AAC9D,kBAAM,gBAAgB,GAAG;AACzB,kBAAM,oBAAoB,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,cAAM,MAAM,oBAAoB,CAAC,EAAE;AAAA,MACrC;AAAA,IACF;AAEA,mBAAe,wBAAwB;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,qBAAqB;AAAA,MACrB,iBAAiB,WAAW;AAAA,MAC5B,kBAAkB,QAAQ,aAAa;AAAA,MACvC,gBAAgB,QAAQ,WAAW;AAAA,IACrC,CAAC;AAED,UAAM,YAA6B,CAAC;AAGpC,QAAI,aAAa,oBAAoB;AACnC,gBAAU;AAAA,QACR,MAAM,YAAY;AAChB,gBAAMC,kBAAiB,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;AAC1D,cAAIA,gBAAe,WAAW,EAAG;AAEjC,cAAI;AACF,kBAAM,EAAE,QAAQ,gBAAgB,OAAO,QAAQ,IAAI,MAAM;AAAA,cACvDA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAc,yBAAyB,IAAI,EAAE;AAAA,YAC/C;AACA,uBAAW,OAAO;AAElB,uBAAW,SAAS,eAAe,SAAS;AAC1C,oBAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,OAAO;AAC7D,kBAAI,SAAS,CAAC,MAAM,OAAO;AACzB,sBAAM,QAAQ,MAAM;AACpB,sBAAM,SAAS,cAAc,MAAM,UAAU;AAC7C,sBAAM,aAAa,MAAM;AACzB,sBAAM,mBAAmB;AAAA,cAC3B;AAAA,YACF;AAAA,UACF,SAAS,GAAG;AACV,kBAAM,MAAM,kCAAkC,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,UAC5F;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,aAAa,qBAAqB,SAAS,KAAK,aAAa;AAC/D,gBAAU;AAAA,SACP,YAAY;AACX,cAAI;AACF,kBAAM,iBAAiB,aAAa,qBAAqB;AAAA,cAAI,CAAC,MAC5D,MAAM,YAAY;AAChB,sBAAM,SAAS,MAAM,YAAY,OAAO,GAAG,EAAE,OAAO,IAAI,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/E,sBAAM,QAAQ,0BAA0B,GAAG,MAAM;AACjD,oBAAI,OAAO;AACT,wBAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE,EAAE;AACpE,sBAAI,SAAS,CAAC,MAAM,OAAO;AACzB,0BAAM,QAAQ,MAAM;AACpB,0BAAM,SAAS,MAAM;AACrB,0BAAM,aAAa,MAAM;AACzB,0BAAM,mBAAmB,MAAM,cAAc,SAAS,IAAI,UAAU;AACpE,0BAAM,gBAAgB,MAAM,cAAc,SAAS,IAAI,MAAM,gBAAgB;AAAA,kBAC/E;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AACA,kBAAM,QAAQ,IAAI,cAAc;AAAA,UAClC,SAAS,GAAG;AACV,kBAAM,MAAM,oCAAoC,CAAC,EAAE;AAAA,UACrD;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,SAAS;AAE3B,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,kBAAkB,KAAK,KAAK;AAGlC,mBAAe,wBAAwB;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,qBAAqB;AAAA,MACrB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAClB,CAAC;AACD,UAAM,iBAAiB,2BAA2B,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK;AACvF,QAAI,aAAa,aAAa;AAC5B,mBAAa,YAAY,eAAe,MAAM,yBAAyB;AACvE,YAAM,SAAS;AAEf,UAAI;AACF,cAAM,EAAE,QAAQ,aAAa,OAAO,WAAW,IAAI,MAAM;AAAA,UACvD;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,qBAAqB,IAAI,EAAE;AAAA,QAC3C;AACA,mBAAW,UAAU;AACrB,cAAM,UAAU,YAAY;AAAA,MAC9B,SAAS,OAAO;AACd,cAAM,MAAM,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAErH,cAAM,UAAU,CAAC,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,MAClD;AAEA,YAAM,oBAAoB;AAC1B,YAAM,SAAS;AAAA,IACjB,OAAO;AACL,YAAM,SAAS;AAAA,IACjB;AAEA,UAAM,mBAAmB,qBAA8B,KAAK;AAC5D,UAAM,gBAAgB,8BAA8B,KAAK;AAEzD,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,kBAAkB,KAAK,KAAK;AAElC,QAAI,sBAAsB,aAAa,MAAM,cAAc,iBAAiB,GAAG;AAC7E,YAAM,IAAI,MAAM,+EAA+E;AAAA,IACjG;AAEA,UAAM,cAAc,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AACxD,iBAAa,0BAA0B,WAAW,IAAI,MAAM,OAAO,MAAM,mBAAmB,MAAM,SAAS,UAAU,CAAC,sBAAsB;AAE5I,WAAO,EAAE,OAAO,YAAY,YAAY,cAAc,MAAM,cAAc;AAAA,EAC5E;AAMA,iBAAe,aAAa,OAAuD;AACjF,iBAAa,EAAE,aAAa,GAAG,cAAc,EAAE;AAC/C,UAAM,EAAE,eAAe,WAAW,QAAQ,IAAI;AAC9C,UAAM,qBAAqB,MAAM,oBAAoB,SACjD,MAAM,qBACN,qBAAqB;AAAA,MACnB,YAAY,GAAG,aAAa,UAAU,mBAAmB,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,MAChF,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU,EAAE,cAAc;AAAA,IAC5B,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,EAAE;AAG5B,QAAI,QAAiC;AACrC,QAAI,kBAAkB;AACpB,cAAQ,MAAM,iBAAiB,IAAI,aAAa;AAAA,IAClD;AACA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,eAAe,aAAa,YAAY;AAAA,IAC1D;AAGA,UAAM,uBAAuB,MAAM,UAAU,MAAM,iBAAiB,KAAK,CAAC;AAC1E,UAAM,eAAe,2BAA2B,KAAK;AACrD,UAAM,qBAAqB,aAAa;AAAA,MAAO,CAAC,MAC9C,qBAAqB,SAAS,EAAE,EAAE;AAAA,IACpC;AAGA,iBAAa,sBAAsB;AACnC,QAAI;AACJ,QAAI;AACF,YAAM,EAAE,QAAQ,kBAAkB,OAAO,YAAY,IAAI,MAAM;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,wBAAwB,IAAI,EAAE;AAAA,MAC9C;AACA,iBAAW,WAAW;AACtB,eAAS;AAAA,IACX,SAAS,OAAO;AACd,YAAM,MAAM,mEAAmE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AACvI,eAAS;AAAA,QACP,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,eAAe;AACnB,QAAI;AAEJ,QAAI,YAAY,iBAAiB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,kBAAkB,QAAQ,aAAa;AAAA,IACzC,CAAC;AAGD,QAAI,UAAU,cAAc;AAC1B,mBAAa,oBAAoB;AACjC,UAAI;AACF,cAAM,EAAE,QAAQ,aAAa,OAAO,WAAW,IAAI,MAAM;AAAA,UACvD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,6BAA6B,IAAI,EAAE;AAAA,QACnD;AACA,mBAAW,UAAU;AAErB,mBAAW,UAAU,YAAY,SAAS;AACxC,gBAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,OAAO;AAC9D,cAAI,OAAO;AACT,kBAAM,QAAQ,OAAO;AACrB,kBAAM,SAAS;AACf,kBAAM,aAAa;AACnB,kBAAM,oBAAoB;AAC1B,kBAAM,mBAAmB;AACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,MAAM,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAChG;AAAA,IACF;AAGA,QAAI,UAAU,aAAa,OAAO,gBAAgB,QAAQ;AACxD,mBAAa,+BAA+B;AAC5C,UAAI,gBAAgB;AACpB,UAAI,eAAe;AACjB,YAAI;AACF,gBAAM,OAAO,MAAM,cAAc,MAAM,CAAC,CAAC;AACzC,0BAAgB,KACb,IAAI,CAAC,MAAM;AACV,kBAAM,MAAM;AACZ,mBAAO,YAAY,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,IAAI,WAAW,iBAAiB,MAAM,IAAI,eAAe,EAAE;AAAA,UACzG,CAAC,EACA,KAAK,IAAI;AAAA,QACd,SAAS,GAAG;AACV,gBAAM,MAAM,qCAAqC,CAAC,EAAE;AAAA,QACtD;AAAA,MACF;AAEA,UAAI,eAAe;AACjB,cAAM,eAAe,MAAM,OAAO;AAAA,UAAO,CAAC,MACxC,OAAO,eAAgB,KAAK,CAAC,OAAO,GAAG,eAAe,SAAS,EAAE,EAAE,CAAC;AAAA,QACtE;AAEA,YAAI;AACF,gBAAM,EAAE,QAAQ,cAAc,OAAO,YAAY,IAAI,MAAM;AAAA,YACzD,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc,sBAAsB,IAAI,EAAE;AAAA,UAC5C;AACA,qBAAW,WAAW;AAEtB,qBAAW,QAAQ,aAAa,OAAO;AACrC,kBAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO;AAC5D,gBAAI,OAAO;AACT,oBAAM,QAAQ,KAAK;AACnB,oBAAM,SAAS,WAAW,KAAK,MAAM;AACrC,oBAAM,aAAa;AACnB,oBAAM,mBAAmB,KAAK,eAAe,SAAS,UAAU;AAChE,kBAAI,KAAK,eAAe,QAAQ;AAC9B,sBAAM,gBAAgB,KAAK;AAAA,cAC7B;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,MAAM,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,kBAAkB,OAAO,cAAc;AACnD,UAAI;AACF,cAAM,SAAS,cAAc,qBAAqB,GAAG;AACrD,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa;AAAA,UACzC,QAAQ,gEAAgE,OAAO,YAAY;AAAA;AAAA;AAAA,UAC3F,WAAW,OAAO;AAAA,UAClB,UAAU;AAAA,UACV,mBAAmB;AAAA,UACnB;AAAA,QACF,CAAC;AACD,mBAAW,KAAK;AAChB,uBAAe;AAAA,MACjB,SAAS,OAAO;AACd,cAAM,MAAM,wCAAwC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC5G,uBAAe;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,6BAA6B,mBAAmB,IAAI,CAAC,UAAU,MAAM,EAAE;AAC7E,UAAM,uBAAuB,2BAA2B;AAAA,MACtD,CAAC,QAAQ,MAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG;AAAA,IACpD;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI,MAAM,SAAS;AACjB,eAAS,QAAQ,MAAM,oBAAoB,GAAG,QAAQ,MAAM,QAAQ,QAAQ,SAAS;AACnF,cAAM,wBAAwB,2BAA2B,KAAK;AAC9D,cAAM,kBAAkB,sBAAsB,OAAO,CAAC,MAAM,MAAM,QAAS,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;AAChG,YAAI,gBAAgB,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG;AACzC,2BAAiB;AACjB,4BAAkB;AAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,gBAAY,iBAAiB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,QAAQ,aAAa;AAAA,IACzC,CAAC;AAED,QAAI,wBAAwB,UAAU,gBAAgB,MAAM,SAAS;AACnE,UAAI,mBAAmB,UAAa,iBAAiB;AACnD,cAAM,oBAAoB;AAE1B,cAAM,cAAc,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAExD,YAAI,UAAU,mBAAmB;AAC/B,cAAI;AACF,kBAAM,EAAE,MAAM,WAAW,OAAO,WAAW,IAAI,MAAM;AAAA,cACnD;AAAA,cACA,MAAM;AAAA,cACN,MAAM,QAAQ;AAAA,cACd;AAAA,gBACE,UAAU,MAAM;AAAA,gBAChB,iBAAiB,MAAM,OAAO;AAAA,gBAC9B,kBAAkB;AAAA,gBAClB,aAAa,SAAS;AAAA,cACxB;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAc,qBAAqB,IAAI,EAAE;AAAA,YAC3C;AACA,uBAAW,UAAU;AACrB,kBAAM,cAAc,iBAAiB,WAAW,eAAe;AAC/D,kBAAM,gBAAgB;AAAA,cACpB,GAAI,8BAA8B,KAAK;AAAA,cACvC;AAAA,YACF;AAEA,gBAAI,CAAC,cAAc;AACjB,6BAAe;AAAA,YACjB,OAAO;AACL,8BAAgB;AAAA;AAAA,EAAO,SAAS;AAAA,YAClC;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,MAAM,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,UACxG;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,mBAAmB,qBAA8B,KAAK;AAC5D,UAAM,gBAAgB,8BAA8B,KAAK;AACzD,UAAM,kBAAkB,KAAK,KAAK;AAElC,QAAI,sBAAsB,aAAa,MAAM,cAAc,iBAAiB,GAAG;AAC7E,YAAM,IAAI,MAAM,+EAA+E;AAAA,IACjG;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,cAAc,MAAM;AAAA,IACtB;AAAA,EACF;AAKA,iBAAe,0BACb,eACA,MACmD;AACnD,iBAAa,EAAE,aAAa,GAAG,cAAc,EAAE;AAE/C,UAAM,QAAQ,MAAM,kBAAkB,IAAI,aAAa;AACvD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe,aAAa,YAAY;AACpE,QAAI,CAAC,MAAM,SAAS,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AAElE,UAAM,gBAAgB,MAAM,QAAQ,MAAM,iBAAiB;AAC3D,UAAM,cAAc,2BAA2B,KAAK,EAAE,OAAO,CAAC,MAAM,cAAc,SAAS,EAAE,EAAE,CAAC;AAChG,UAAM,cAAc,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAExD,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM;AAAA,MAC5B;AAAA,MACA,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd;AAAA,QACE,UAAU,MAAM;AAAA,QAChB,iBAAiB,MAAM,OAAO;AAAA,QAC9B,kBAAkB;AAAA,QAClB,aAAa,MAAM;AAAA,QACnB,sBAAsB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,qBAAqB,IAAI,EAAE;AAAA,IAC3C;AACA,eAAW,KAAK;AAEhB,UAAM,cAAc,iBAAiB,MAAM,WAAW;AACtD,UAAM,gBAAgB;AAAA,MACpB,GAAI,8BAA8B,KAAK;AAAA,MACvC;AAAA,IACF;AACA,UAAM,kBAAkB,KAAK,KAAK;AAElC,WAAO,EAAE,MAAM,YAAY,WAAW;AAAA,EACxC;AAKA,iBAAe,uBACb,eACmD;AACnD,iBAAa,EAAE,aAAa,GAAG,cAAc,EAAE;AAE/C,UAAM,QAAQ,MAAM,kBAAkB,IAAI,aAAa;AACvD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe,aAAa,YAAY;AAEpE,UAAM,eAAe,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK;AACvD,UAAM,eAAe,aAClB,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,aAAa,EAAE,UAAU,SAAS,GAAG,EACrF,KAAK,IAAI;AAEZ,UAAM,SAAS,cAAc,qBAAqB,IAAI;AACtD,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa;AAAA,MACzC,QAAQ;AAAA;AAAA,eAA4O,MAAM,SAAS,uBAAuB;AAAA;AAAA;AAAA,EAAgB,YAAY;AAAA,MACtT,WAAW,OAAO;AAAA,MAClB,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB;AAAA,IACF,CAAC;AACD,eAAW,KAAK;AAEhB,WAAO,EAAE,MAAM,YAAY,WAAW;AAAA,EACxC;AAEA,iBAAeC,sBAAqB,OAA6D;AAC/F,UAAM,QAAQ,qBAAiC,KAAK;AACpD,UAAM,kBAAkB,KAAK,KAAK;AAClC,WAAO;AAAA,EACT;AAEA,iBAAe,kBAAkB,eAAuBC,QAAmD;AACzG,UAAM,QAAQ,MAAM,kBAAkB,IAAI,aAAa;AACvD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe,aAAa,YAAY;AACpE,WAAO,6BAA6B,OAAOA,MAAK;AAAA,EAClD;AAEA,iBAAeC,sBAAqB,eAAuD;AACzF,UAAM,QAAQ,MAAM,kBAAkB,IAAI,aAAa;AACvD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe,aAAa,YAAY;AACpE,UAAM,YAAY,qBAA8B,KAAK;AACrD,UAAM,kBAAkB,KAAK;AAAA,MAC3B,GAAG;AAAA,MACH,kBAAkB;AAAA,MAClB,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AACD,WAAO,EAAE,UAAU;AAAA,EACrB;AAEA,iBAAeC,wBAAuB,OAA2E;AAC/G,UAAM,QAAQ,MAAM,kBAAkB,IAAI,MAAM,aAAa;AAC7D,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe,MAAM,aAAa,YAAY;AAC1E,UAAM,SAAS,uBAAgC,OAAO;AAAA,MACpD,iBAAiB,MAAM;AAAA,MACvB,KAAK,MAAM;AAAA,IACb,CAAC;AACD,UAAM,eAAe,0BAA0B,MAAM;AACrD,UAAM,kBAAkB,KAAK;AAAA,MAC3B,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,QAAQ,eAAe,aAAa;AAAA,MACjD,QAAQ,aAAa,sBAAsB,WAAW,kBAAkB;AAAA,MACxE,eAAe;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AACD,WAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,eAAe,aAAa,GAAG,aAAa;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAAH;AAAA,IACA;AAAA,IACA,sBAAAE;AAAA,IACA,wBAAAC;AAAA,EACF;AACF;AAEA,SAAS,0BACP,OACA,QACkG;AAClG,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,MAAM,SAAS,SACxB,MAAM,SAAS,UACf,MAAM,SAAS;AACpB,QAAI,CAAC,MAAO;AAEZ,UAAM,kBAAkB,MAAM,SAAS,WAAW,MAAM,SAAS;AACjE,UAAM,gBAAgB,MAAM,SAAS,YAAY,YAAY;AAC7D,UAAM,eAAe,kBAAkB,MAAM,MAAM,YAAY;AAC/D,QAAI,mBAAmB,oBAAoB,MAAM,MAAM,CAAC,aAAc;AAEtE,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,MAAM,SAAS,UAAU,WAAW,MAAM,UAAU;AAAA,MAC5D,YAAY,oBAAoB,MAAM,MAAM,eAAe,SAAS;AAAA,MACpE,eAAe,mBAAmB,MAAM,SAAS,aAAa;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAqC;AAC/D,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,aAAO,MAAM,QAAQ,MAAM,IAAI,OAAO,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtG,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AACrE;","names":["z","z","z","unfilledFields","createApplicationRun","limit","proposeContextWrites","buildApplicationPacket"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/model-budget.ts","../src/core/concurrency.ts","../src/core/retry.ts","../src/prompts/application/classify.ts","../src/schemas/application.ts","../src/application/agents/classifier.ts","../src/prompts/application/field-extraction.ts","../src/application/field-ids.ts","../src/application/agents/field-extractor.ts","../src/prompts/application/auto-fill.ts","../src/application/agents/auto-filler.ts","../src/prompts/application/question-batch.ts","../src/application/agents/batcher.ts","../src/prompts/application/reply-intent.ts","../src/application/agents/reply-router.ts","../src/prompts/application/answer-parsing.ts","../src/application/agents/answer-parser.ts","../src/prompts/application/pdf-mapping.ts","../src/application/agents/lookup-filler.ts","../src/prompts/application/batch-email.ts","../src/application/agents/email-generator.ts","../src/core/quality.ts","../src/application/quality.ts","../src/application/workflow.ts","../src/source/schemas.ts","../src/schemas/lines-of-business.ts","../src/source/ids.ts","../src/source/extraction.ts","../src/application/question-graph.ts","../src/application/intake.ts","../src/application/coordinator.ts"],"sourcesContent":["export type ModelTaskKind =\n | \"extraction_classify\"\n | \"extraction_source_tree\"\n | \"extraction_operational_profile\"\n | \"extraction_page_map\"\n | \"extraction_focused\"\n | \"extraction_long_list\"\n | \"extraction_referential_lookup\"\n | \"extraction_coverage_cleanup\"\n | \"extraction_review\"\n | \"extraction_summary\"\n | \"extraction_format\"\n | \"query_attachment\"\n | \"query_classify\"\n | \"query_reason\"\n | \"query_verify\"\n | \"query_respond\"\n | \"application_classify\"\n | \"application_extract_fields\"\n | \"application_auto_fill\"\n | \"application_lookup\"\n | \"application_parse_answers\"\n | \"application_batch\"\n | \"application_email\"\n | \"application_pdf_mapping\"\n | \"pce_impact_analysis\"\n | \"pce_reply_parse\"\n | \"pce_packet_generation\";\n\nexport interface ModelCapabilities {\n /** Human-readable model identifier for diagnostics. */\n model?: string;\n modelName?: string;\n /** Provider/model input context limit for diagnostics. */\n maxInputTokens?: number;\n /** Provider/model hard output limit. Resolved budgets will not exceed this. */\n maxOutputTokens?: number;\n /** Default preferred budget when a task has no specific capability hint. */\n defaultOutputTokens?: number;\n /** Preferred budget for long list extraction tasks such as schedules and sections. */\n longListOutputTokens?: number;\n /** Preferred budgets for individual task kinds. */\n taskOutputTokens?: Partial<Record<ModelTaskKind, number>>;\n}\n\nexport interface ModelBudgetConstraint {\n /** Preferred budget for this call. */\n outputTokens?: number;\n /** Explicit hard limit for this call, useful for keeping small calls small. */\n maxOutputTokens?: number;\n /** Lower bound after all other preferences are applied. */\n minOutputTokens?: number;\n}\n\nexport interface ResolveModelBudgetParams {\n taskKind: ModelTaskKind;\n /** Existing per-task constant, now treated as a compatibility hint. */\n hintTokens: number;\n modelCapabilities?: ModelCapabilities;\n constraint?: ModelBudgetConstraint;\n schemaSizeBytes?: number;\n expectedListLength?: number;\n inputContextBytes?: number;\n providerMaxOutputTokens?: number;\n}\n\nexport interface ModelBudgetResolution {\n taskKind: ModelTaskKind;\n maxTokens: number;\n hintTokens: number;\n preferredOutputTokens?: number;\n modelMaxOutputTokens?: number;\n hardMaxOutputTokens?: number;\n estimatedInputTokens?: number;\n outputTruncationRisk: \"low\" | \"medium\" | \"high\";\n warnings: string[];\n}\n\nfunction positiveInteger(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.floor(value)\n : undefined;\n}\n\nexport function resolveModelBudget(params: ResolveModelBudgetParams): ModelBudgetResolution {\n const { taskKind, modelCapabilities, constraint } = params;\n const hintTokens = positiveInteger(params.hintTokens) ?? 4096;\n const taskCapability = positiveInteger(modelCapabilities?.taskOutputTokens?.[taskKind]);\n const longListCapability = taskKind === \"extraction_long_list\"\n ? positiveInteger(modelCapabilities?.longListOutputTokens)\n : undefined;\n const defaultCapability = positiveInteger(modelCapabilities?.defaultOutputTokens);\n const constrainedPreference = positiveInteger(constraint?.outputTokens);\n const minOutputTokens = positiveInteger(constraint?.minOutputTokens);\n const modelMaxOutputTokens = positiveInteger(modelCapabilities?.maxOutputTokens);\n const providerMaxOutputTokens = positiveInteger(params.providerMaxOutputTokens);\n const hardMaxOutputTokens = positiveInteger(constraint?.maxOutputTokens) ?? providerMaxOutputTokens;\n const estimatedInputTokens = estimateTokens(params.inputContextBytes);\n const schemaTokens = estimateTokens(params.schemaSizeBytes) ?? 0;\n const expectedListLength = positiveInteger(params.expectedListLength) ?? 0;\n const warnings: string[] = [];\n\n const preferredOutputTokens =\n constrainedPreference\n ?? taskCapability\n ?? longListCapability\n ?? hintTokens\n ?? defaultCapability;\n\n let maxTokens = preferredOutputTokens;\n\n if (minOutputTokens) {\n maxTokens = Math.max(maxTokens, minOutputTokens);\n }\n\n if (modelMaxOutputTokens) {\n if (maxTokens > modelMaxOutputTokens) {\n warnings.push(`Resolved ${taskKind} budget was capped by model max output tokens.`);\n }\n maxTokens = Math.min(maxTokens, modelMaxOutputTokens);\n }\n\n if (hardMaxOutputTokens) {\n if (maxTokens > hardMaxOutputTokens) {\n warnings.push(`Resolved ${taskKind} budget was capped by an explicit hard max output token constraint.`);\n }\n maxTokens = Math.min(maxTokens, hardMaxOutputTokens);\n }\n\n const expectedOutputFloor = expectedOutputTokensFloor(taskKind, schemaTokens, expectedListLength, hintTokens);\n const outputTruncationRisk = maxTokens < expectedOutputFloor * 0.65\n ? \"high\"\n : maxTokens < expectedOutputFloor\n ? \"medium\"\n : \"low\";\n\n if (outputTruncationRisk !== \"low\") {\n warnings.push(`Resolved ${taskKind} budget may be under-sized for the expected output shape.`);\n }\n\n const maxInputTokens = positiveInteger(modelCapabilities?.maxInputTokens);\n if (estimatedInputTokens && maxInputTokens && estimatedInputTokens > maxInputTokens * 0.9) {\n warnings.push(`Estimated ${taskKind} input context is close to or above the configured model input limit.`);\n }\n\n return {\n taskKind,\n maxTokens,\n hintTokens,\n preferredOutputTokens,\n modelMaxOutputTokens,\n hardMaxOutputTokens,\n estimatedInputTokens,\n outputTruncationRisk,\n warnings,\n };\n}\n\nfunction estimateTokens(bytes: number | undefined): number | undefined {\n const positive = positiveInteger(bytes);\n if (!positive) return undefined;\n return Math.ceil(positive / 4);\n}\n\nfunction expectedOutputTokensFloor(\n taskKind: ModelTaskKind,\n schemaTokens: number,\n expectedListLength: number,\n hintTokens: number,\n): number {\n const listMultiplier = taskKind === \"extraction_long_list\" ? 90 : 45;\n const listFloor = expectedListLength > 0 ? expectedListLength * listMultiplier : 0;\n return Math.max(Math.ceil(schemaTokens * 1.5), listFloor, Math.floor(hintTokens * 0.75));\n}\n","/**\n * Concurrency limiter — returns a function that wraps async tasks\n * so at most `concurrency` run simultaneously.\n */\nexport function pLimit(concurrency: number) {\n const maxConcurrency = Number.isFinite(concurrency) ? Math.max(1, Math.floor(concurrency)) : 1;\n let active = 0;\n const queue: Array<() => void> = [];\n\n function next() {\n if (queue.length > 0 && active < maxConcurrency) {\n active++;\n queue.shift()!();\n }\n }\n\n return <T>(fn: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n const run = () => {\n fn().then(resolve, reject).finally(() => {\n active--;\n next();\n });\n };\n queue.push(run);\n next();\n });\n}\n","import type { LogFn } from \"./types\";\n\nconst MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 2000;\n\nexport interface RetryOptions {\n maxRetries?: number;\n baseDelayMs?: number;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n // Rate limits\n if (msg.includes(\"rate limit\") || msg.includes(\"rate_limit\") || msg.includes(\"too many requests\")) {\n return true;\n }\n // Transient provider errors\n if (msg.includes(\"grammar compilation timed out\")) return true;\n if (msg.includes(\"no output generated\")) return true;\n if (msg.includes(\"overloaded\")) return true;\n if (msg.includes(\"internal server error\")) return true;\n if (msg.includes(\"service unavailable\")) return true;\n if (msg.includes(\"gateway timeout\")) return true;\n }\n if (typeof error === \"object\" && error !== null) {\n const status = (error as Record<string, unknown>).status ?? (error as Record<string, unknown>).statusCode;\n if (status === 429 || status === 500 || status === 502 || status === 503 || status === 504) return true;\n }\n return false;\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n log?: LogFn,\n options?: RetryOptions,\n): Promise<T> {\n const maxRetries = options?.maxRetries ?? MAX_RETRIES;\n const baseDelayMs = options?.baseDelayMs ?? BASE_DELAY_MS;\n for (let attempt = 0; ; attempt++) {\n try {\n return await fn();\n } catch (error) {\n if (!isRetryableError(error) || attempt >= maxRetries) {\n throw error;\n }\n const jitter = Math.random() * 1000;\n const delay = baseDelayMs * Math.pow(2, attempt) + jitter;\n await log?.(`Retryable error, retrying in ${(delay / 1000).toFixed(1)}s (attempt ${attempt + 1}/${maxRetries})...`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n","// Prompts for insurance application processing\n\nexport const APPLICATION_CLASSIFY_PROMPT = `You are classifying a PDF document. Determine if this is an insurance APPLICATION FORM (a form to be filled out to apply for insurance) versus a policy document, quote, certificate, or other document.\n\nInsurance applications typically:\n- Have blank fields, checkboxes, or spaces to fill in\n- Ask for company information, coverage limits, loss history\n- Include ACORD form numbers or \"Application for\" in the title\n- Request signatures and dates\n\nRespond with JSON only:\n{\n \"isApplication\": boolean,\n \"confidence\": number (0-1),\n \"applicationType\": string | null // e.g. \"General Liability\", \"Professional Liability\", \"Commercial Property\", \"Workers Compensation\", \"ACORD 125\", etc.\n}`;\n","import { z } from \"zod\";\n\n// ── Field Types ──\n\nexport const FieldTypeSchema = z.enum([\n \"text\",\n \"numeric\",\n \"currency\",\n \"date\",\n \"yes_no\",\n \"table\",\n \"declaration\",\n]);\nexport type FieldType = z.infer<typeof FieldTypeSchema>;\n\n// ── Application Field (extracted from PDF) ──\n\nexport const ApplicationFieldSchema = z.object({\n id: z.string(),\n label: z.string(),\n section: z.string(),\n fieldType: FieldTypeSchema,\n required: z.boolean(),\n options: z.array(z.string()).optional(),\n columns: z.array(z.string()).optional(),\n requiresExplanationIfYes: z.boolean().optional(),\n condition: z\n .object({\n dependsOn: z.string(),\n whenValue: z.string(),\n })\n .optional(),\n value: z.string().optional(),\n source: z.string().optional().describe(\"Where the value came from: auto-fill, user, lookup\"),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]).optional(),\n sourceSpanIds: z.array(z.string()).optional().describe(\"Stable source spans that support the field value or field anchor\"),\n userSourceSpanIds: z.array(z.string()).optional().describe(\"Message or attachment spans that support user-provided values\"),\n pageNumber: z.number().int().positive().optional().describe(\"Application page where the field label or anchor appears\"),\n fieldAnchorId: z.string().optional().describe(\"Stable field anchor ID derived from page, section, label, and form metadata\"),\n acroFormName: z.string().optional().describe(\"Native PDF AcroForm field name when available\"),\n validationStatus: z.enum([\"valid\", \"needs_review\", \"unsupported\", \"missing\"]).optional(),\n});\nexport type ApplicationField = z.infer<typeof ApplicationFieldSchema>;\n\n// ── Versioned Question Graph ──\n\nexport const ApplicationQuestionConditionSchema = z.object({\n dependsOn: z.string(),\n operator: z.enum([\"equals\", \"not_equals\", \"in\", \"not_in\", \"exists\"]).optional(),\n value: z.string().optional(),\n whenValue: z.string().optional(),\n values: z.array(z.string()).optional(),\n});\nexport type ApplicationQuestionCondition = z.infer<typeof ApplicationQuestionConditionSchema>;\n\nexport const ApplicationRepeatSchema = z.object({\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n label: z.string().optional(),\n});\nexport type ApplicationRepeat = z.infer<typeof ApplicationRepeatSchema>;\n\nexport interface ApplicationQuestionNode {\n id: string;\n nodeType: \"group\" | \"question\" | \"repeat_group\" | \"table\";\n fieldId?: string;\n fieldPath?: string;\n parentId?: string;\n order?: number;\n label: string;\n section?: string;\n fieldType?: FieldType;\n required?: boolean;\n prompt?: string;\n options?: string[];\n columns?: string[];\n condition?: ApplicationQuestionCondition;\n repeat?: ApplicationRepeat;\n children?: ApplicationQuestionNode[];\n}\n\nexport const ApplicationQuestionNodeSchema: z.ZodType<ApplicationQuestionNode> = z.lazy(() =>\n z.object({\n id: z.string(),\n nodeType: z.enum([\"group\", \"question\", \"repeat_group\", \"table\"]),\n fieldId: z.string().optional(),\n fieldPath: z.string().optional(),\n parentId: z.string().optional(),\n order: z.number().int().nonnegative().optional(),\n label: z.string(),\n section: z.string().optional(),\n fieldType: FieldTypeSchema.optional(),\n required: z.boolean().optional(),\n prompt: z.string().optional(),\n options: z.array(z.string()).optional(),\n columns: z.array(z.string()).optional(),\n condition: ApplicationQuestionConditionSchema.optional(),\n repeat: ApplicationRepeatSchema.optional(),\n children: z.array(ApplicationQuestionNodeSchema).optional(),\n }),\n);\n\nexport const ApplicationQuestionGraphSchema = z.object({\n id: z.string(),\n version: z.string(),\n title: z.string().optional(),\n applicationType: z.string().nullable().optional(),\n source: z.enum([\"pdf\", \"manual\", \"imported\", \"generated\"]).default(\"generated\"),\n rootNodeIds: z.array(z.string()).optional(),\n nodes: z.array(ApplicationQuestionNodeSchema),\n});\nexport type ApplicationQuestionGraph = z.infer<typeof ApplicationQuestionGraphSchema>;\n\nexport const ApplicationTemplateSchema = z.object({\n id: z.string(),\n version: z.string(),\n title: z.string(),\n applicationType: z.string().nullable().optional(),\n questionGraph: ApplicationQuestionGraphSchema,\n fields: z.array(ApplicationFieldSchema).optional(),\n});\nexport type ApplicationTemplate = z.infer<typeof ApplicationTemplateSchema>;\n\n// ── Classify Result ──\n\nexport const ApplicationClassifyResultSchema = z.object({\n isApplication: z.boolean(),\n confidence: z.number().min(0).max(1),\n applicationType: z.string().nullable(),\n});\nexport type ApplicationClassifyResult = z.infer<typeof ApplicationClassifyResultSchema>;\n\n// ── Field Extraction Result ──\n\nexport const FieldExtractionResultSchema = z.object({\n fields: z.array(ApplicationFieldSchema),\n});\nexport type FieldExtractionResult = z.infer<typeof FieldExtractionResultSchema>;\n\n// ── Auto-Fill Match ──\n\nexport const AutoFillMatchSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n confidence: z.enum([\"confirmed\"]),\n contextKey: z.string(),\n});\nexport type AutoFillMatch = z.infer<typeof AutoFillMatchSchema>;\n\nexport const AutoFillResultSchema = z.object({\n matches: z.array(AutoFillMatchSchema),\n});\nexport type AutoFillResult = z.infer<typeof AutoFillResultSchema>;\n\n// ── Question Batch ──\n\nexport const QuestionBatchResultSchema = z.object({\n batches: z.array(z.array(z.string()).describe(\"Array of field IDs in this batch\")),\n});\nexport type QuestionBatchResult = z.infer<typeof QuestionBatchResultSchema>;\n\n// ── Reply Intent ──\n\nexport const LookupRequestSchema = z.object({\n type: z.string().describe(\"Type of lookup: 'records', 'website', 'policy'\"),\n description: z.string(),\n url: z.string().optional(),\n targetFieldIds: z.array(z.string()),\n});\nexport type LookupRequest = z.infer<typeof LookupRequestSchema>;\n\nexport const ReplyIntentSchema = z.object({\n primaryIntent: z.enum([\"answers_only\", \"question\", \"lookup_request\", \"mixed\"]),\n hasAnswers: z.boolean(),\n questionText: z.string().optional(),\n questionFieldIds: z.array(z.string()).optional(),\n lookupRequests: z.array(LookupRequestSchema).optional(),\n});\nexport type ReplyIntent = z.infer<typeof ReplyIntentSchema>;\n\n// ── Parsed Answer ──\n\nexport const ParsedAnswerSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n explanation: z.string().optional(),\n});\nexport type ParsedAnswer = z.infer<typeof ParsedAnswerSchema>;\n\nexport const AnswerParsingResultSchema = z.object({\n answers: z.array(ParsedAnswerSchema),\n unanswered: z.array(z.string()).describe(\"Field IDs that were not answered\"),\n});\nexport type AnswerParsingResult = z.infer<typeof AnswerParsingResultSchema>;\n\n// ── Lookup Fill ──\n\nexport const LookupFillSchema = z.object({\n fieldId: z.string(),\n value: z.string(),\n source: z.string().describe(\"Specific citable reference, e.g. 'GL Policy #POL-12345 (Hartford)'\"),\n sourceSpanIds: z.array(z.string()).optional(),\n});\nexport type LookupFill = z.infer<typeof LookupFillSchema>;\n\nexport const LookupFillResultSchema = z.object({\n fills: z.array(LookupFillSchema),\n unfillable: z.array(z.string()),\n explanation: z.string().optional(),\n});\nexport type LookupFillResult = z.infer<typeof LookupFillResultSchema>;\n\n// ── PDF Mapping ──\n\nexport const FlatPdfPlacementSchema = z.object({\n fieldId: z.string(),\n page: z.number(),\n x: z.number().describe(\"Percentage from left edge (0-100)\"),\n y: z.number().describe(\"Percentage from top edge (0-100)\"),\n text: z.string(),\n fontSize: z.number().optional(),\n isCheckmark: z.boolean().optional(),\n});\nexport type FlatPdfPlacement = z.infer<typeof FlatPdfPlacementSchema>;\n\nexport const AcroFormMappingSchema = z.object({\n fieldId: z.string(),\n acroFormName: z.string(),\n value: z.string(),\n});\nexport type AcroFormMapping = z.infer<typeof AcroFormMappingSchema>;\n\n// ── Quality Report (shared schema for serialization) ──\n\nconst QualityGateStatusSchema = z.enum([\"passed\", \"warning\", \"failed\"]);\nconst QualitySeveritySchema = z.enum([\"info\", \"warning\", \"blocking\"]);\n\nexport const ApplicationQualityIssueSchema = z.object({\n code: z.string(),\n severity: QualitySeveritySchema,\n message: z.string(),\n fieldId: z.string().optional(),\n});\n\nexport const ApplicationQualityRoundSchema = z.object({\n round: z.number(),\n kind: z.string(),\n status: QualityGateStatusSchema,\n summary: z.string().optional(),\n});\n\nexport const ApplicationQualityArtifactSchema = z.object({\n kind: z.string(),\n label: z.string().optional(),\n itemCount: z.number().optional(),\n});\n\nexport const ApplicationEmailReviewSchema = z.object({\n issues: z.array(ApplicationQualityIssueSchema),\n qualityGateStatus: QualityGateStatusSchema,\n});\n\nexport const ApplicationQualityReportSchema = z.object({\n issues: z.array(ApplicationQualityIssueSchema),\n rounds: z.array(ApplicationQualityRoundSchema).optional(),\n artifacts: z.array(ApplicationQualityArtifactSchema).optional(),\n emailReview: ApplicationEmailReviewSchema.optional(),\n qualityGateStatus: QualityGateStatusSchema,\n});\n\n// ── Context Proposals And Packets ──\n\nexport const ApplicationContextProposalSchema = z.object({\n id: z.string(),\n fieldId: z.string().optional(),\n key: z.string(),\n value: z.string(),\n category: z.string(),\n source: z.enum([\"application\", \"user\", \"lookup\", \"policy\", \"email\", \"chat\", \"imessage\", \"mcp\"]),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]),\n sourceSpanIds: z.array(z.string()).optional(),\n userSourceSpanIds: z.array(z.string()).optional(),\n});\nexport type ApplicationContextProposal = z.infer<typeof ApplicationContextProposalSchema>;\n\nexport const ApplicationPacketAnswerSchema = z.object({\n fieldId: z.string(),\n label: z.string(),\n section: z.string(),\n value: z.string(),\n source: z.string(),\n confidence: z.enum([\"confirmed\", \"high\", \"medium\", \"low\"]).optional(),\n sourceSpanIds: z.array(z.string()).optional(),\n userSourceSpanIds: z.array(z.string()).optional(),\n});\nexport type ApplicationPacketAnswer = z.infer<typeof ApplicationPacketAnswerSchema>;\n\nexport const ApplicationPacketSchema = z.object({\n id: z.string(),\n applicationId: z.string(),\n title: z.string(),\n status: z.enum([\"draft\", \"broker_ready\", \"submitted\"]),\n answers: z.array(ApplicationPacketAnswerSchema),\n missingFieldIds: z.array(z.string()),\n qualityReport: ApplicationQualityReportSchema,\n submissionNotes: z.string().optional(),\n createdAt: z.number(),\n});\nexport type ApplicationPacket = z.infer<typeof ApplicationPacketSchema>;\n\n// ── Application State (persistent) ──\n\nexport const ApplicationStateSchema = z.object({\n id: z.string(),\n pdfBase64: z.string().optional().describe(\"Original PDF, omitted after extraction\"),\n templateId: z.string().optional(),\n templateVersion: z.string().optional(),\n templateSnapshot: ApplicationTemplateSchema.optional(),\n title: z.string().optional(),\n applicationType: z.string().nullable().optional(),\n questionGraph: ApplicationQuestionGraphSchema.optional(),\n fields: z.array(ApplicationFieldSchema),\n batches: z.array(z.array(z.string())).optional(),\n currentBatchIndex: z.number().default(0),\n contextProposals: z.array(ApplicationContextProposalSchema).optional(),\n packet: ApplicationPacketSchema.optional(),\n qualityReport: ApplicationQualityReportSchema.optional(),\n status: z.enum([\n \"classifying\",\n \"extracting\",\n \"auto_filling\",\n \"batching\",\n \"collecting\",\n \"confirming\",\n \"mapping\",\n \"broker_review\",\n \"packet_ready\",\n \"submitted\",\n \"cancelled\",\n \"complete\",\n ]),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\nexport type ApplicationState = z.infer<typeof ApplicationStateSchema>;\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { APPLICATION_CLASSIFY_PROMPT } from \"../../prompts/application/classify\";\nimport { ApplicationClassifyResultSchema, type ApplicationClassifyResult } from \"../../schemas/application\";\n\n/**\n * Classify whether a PDF is an insurance application form.\n * Small, fast agent — suitable for cheap/fast models.\n */\nexport async function classifyApplication(\n pdfContent: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 512,\n): Promise<{ result: ApplicationClassifyResult; usage?: TokenUsage }> {\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt: `${APPLICATION_CLASSIFY_PROMPT}\\n\\nAnalyze the attached insurance document. If text source units are provided in provider options, use them as supporting context. Do not infer from base64 text.`,\n schema: ApplicationClassifyResultSchema,\n maxTokens,\n taskKind: \"application_classify\",\n providerOptions: {\n ...providerOptions,\n pdfBase64: providerOptions?.pdfBase64 ?? pdfContent,\n },\n }),\n );\n\n return { result: object as ApplicationClassifyResult, usage };\n}\n","export function buildFieldExtractionPrompt(): string {\n return `Extract all fillable fields from this insurance application PDF as a JSON array. Be concise — use short IDs and minimal keys.\n\nField types: \"text\", \"numeric\", \"currency\", \"date\", \"yes_no\", \"table\", \"declaration\"\n\nRequired keys per field:\n- \"id\": short provisional snake_case ID. The SDK will replace this with a stable deterministic ID.\n- \"label\": field label — a clear, natural question that a human would understand\n- \"section\": section heading\n- \"fieldType\": one of the types above\n- \"required\": boolean\n\nOptional keys (only include when applicable):\n- \"sourceSpanIds\": stable source span IDs if the caller provided source units for this application\n- \"pageNumber\": PDF page number where the field label/anchor appears\n- \"fieldAnchorId\": stable caller-provided field anchor ID, when available\n- \"acroFormName\": native PDF form field name, when visible or provided\n- \"validationStatus\": \"missing\" for extracted blank fields, \"needs_review\" for prefilled fields that need source validation\n- \"options\": array of strings — for fields with checkboxes/radio buttons/multiple choices (e.g. business type, state selections). Use \"text\" fieldType with options.\n- \"columns\": array of {\"name\",\"type\"} — tables only\n- \"requiresExplanationIfYes\": boolean — declarations only\n- \"condition\": {\"dependsOn\":\"field_id\",\"whenValue\":\"value\"} — conditional fields only\n\nIMPORTANT — Grouped fields: When you see a group of checkboxes or radio buttons for a single question (e.g. \"Type of Business: Corporation / Partnership / LLC / Individual / Joint Venture / Other\"), extract as ONE field with the group label and an \"options\" array — NOT as separate fields for each option. The label should describe what's being asked (e.g. \"Type of Business Entity\"), and options lists the choices.\n\nExample:\n[\n {\"id\":\"company_name\",\"label\":\"Applicant Name\",\"section\":\"General Info\",\"fieldType\":\"text\",\"required\":true},\n {\"id\":\"business_type\",\"label\":\"Type of Business Entity\",\"section\":\"General Info\",\"fieldType\":\"text\",\"required\":true,\"options\":[\"Corporation\",\"Partnership\",\"LLC\",\"Individual\",\"Joint Venture\",\"Other\"]},\n {\"id\":\"loss_history\",\"label\":\"Loss History\",\"section\":\"Losses\",\"fieldType\":\"table\",\"required\":true,\"columns\":[{\"name\":\"Year\",\"type\":\"numeric\"},{\"name\":\"Amount\",\"type\":\"currency\"}]},\n {\"id\":\"prior_claims\",\"text\":\"Any claims in past 5 years?\",\"section\":\"Declarations\",\"fieldType\":\"declaration\",\"required\":true,\"requiresExplanationIfYes\":true}\n]\n\nExtract ALL fields. Prefer page numbers and source span IDs over model-generated guesses whenever source units are supplied. Respond with ONLY the JSON array, no other text.`;\n}\n","import type { ApplicationField } from \"../schemas/application\";\n\nfunction normalizePart(value: string | undefined): string {\n const normalized = (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || \"unknown\";\n}\n\nfunction hashText(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index++) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\").slice(0, 8);\n}\n\nexport function buildApplicationFieldAnchorId(field: Pick<ApplicationField, \"section\" | \"label\" | \"pageNumber\" | \"acroFormName\">): string {\n const page = field.pageNumber ? `p${field.pageNumber}` : \"pna\";\n const section = normalizePart(field.section);\n const label = normalizePart(field.label);\n const acroFormName = normalizePart(field.acroFormName);\n const hash = hashText(`${page}|${section}|${label}|${acroFormName}`);\n return `app_field_anchor:${page}:${section}:${label}:${hash}`;\n}\n\nexport function buildStableApplicationFieldId(field: Pick<ApplicationField, \"section\" | \"label\" | \"fieldType\" | \"pageNumber\" | \"fieldAnchorId\" | \"acroFormName\">): string {\n const page = field.pageNumber ? `p${field.pageNumber}` : \"pna\";\n const section = normalizePart(field.section);\n const label = normalizePart(field.label);\n const fieldType = normalizePart(field.fieldType);\n const anchor = field.fieldAnchorId ?? buildApplicationFieldAnchorId(field);\n const hash = hashText(`${page}|${section}|${label}|${fieldType}|${field.acroFormName ?? \"\"}|${anchor}`);\n return `app_field:${page}:${section}:${label}:${hash}`;\n}\n\nexport function normalizeApplicationFields(fields: ApplicationField[]): ApplicationField[] {\n const seen = new Map<string, number>();\n\n return fields.map((field) => {\n const fieldAnchorId = field.fieldAnchorId ?? buildApplicationFieldAnchorId(field);\n const baseId = buildStableApplicationFieldId({ ...field, fieldAnchorId });\n const count = seen.get(baseId) ?? 0;\n seen.set(baseId, count + 1);\n\n return {\n ...field,\n id: count === 0 ? baseId : `${baseId}:${count + 1}`,\n fieldAnchorId,\n validationStatus: field.validationStatus ?? (field.value ? \"needs_review\" : \"missing\"),\n };\n });\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildFieldExtractionPrompt } from \"../../prompts/application/field-extraction\";\nimport { FieldExtractionResultSchema, type ApplicationField } from \"../../schemas/application\";\nimport { normalizeApplicationFields } from \"../field-ids\";\n\n/**\n * Extract all fillable fields from an application PDF.\n * Moderate agent — needs enough context to see the full form.\n */\nexport async function extractFields(\n pdfContent: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 8192,\n): Promise<{ fields: ApplicationField[]; usage?: TokenUsage }> {\n const prompt = `${buildFieldExtractionPrompt()}\\n\\nExtract fields from the attached application PDF. Use provider-supplied source units/spans for page numbers and anchors when present. Do not treat raw base64 as readable document text.`;\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: FieldExtractionResultSchema,\n maxTokens,\n taskKind: \"application_extract_fields\",\n providerOptions: {\n ...providerOptions,\n pdfBase64: providerOptions?.pdfBase64 ?? pdfContent,\n },\n }),\n );\n\n const result = object as { fields: ApplicationField[] };\n return { fields: normalizeApplicationFields(result.fields), usage };\n}\n","export function buildAutoFillPrompt(\n fields: { id: string; label: string; fieldType: string; section: string }[],\n orgContext: { key: string; value: string; category: string }[],\n): string {\n const fieldList = fields\n .map((f) => `- ${f.id}: \"${f.label}\" (${f.fieldType}, section: ${f.section})`)\n .join(\"\\n\");\n const contextList = orgContext\n .map((c) => `- ${c.key}: \"${c.value}\" (category: ${c.category})`)\n .join(\"\\n\");\n\n return `You are matching insurance application fields to existing business context data.\n\nAPPLICATION FIELDS:\n${fieldList}\n\nAVAILABLE BUSINESS CONTEXT:\n${contextList}\n\nFor each field that can be filled from the context, provide a match. Only match when you are confident the context value correctly answers the field. For date fields, ensure format compatibility.\n\nRespond with JSON only:\n{\n \"matches\": [\n {\n \"fieldId\": \"company_name\",\n \"value\": \"Acme Corp\",\n \"confidence\": \"confirmed\",\n \"contextKey\": \"company_name\"\n }\n ]\n}\n\nOnly include fields you can confidently fill. Do not guess or fabricate values.`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildAutoFillPrompt } from \"../../prompts/application/auto-fill\";\nimport { AutoFillResultSchema, type AutoFillResult, type ApplicationField } from \"../../schemas/application\";\nimport type { BackfillProvider, PriorAnswer } from \"../store\";\n\n/**\n * Auto-fill fields from business context and prior answers.\n * Small agent — simple matching task, fast model works well.\n */\nexport async function autoFillFromContext(\n fields: ApplicationField[],\n orgContext: { key: string; value: string; category: string }[],\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: AutoFillResult; usage?: TokenUsage }> {\n const fieldSummaries = fields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n section: f.section,\n }));\n\n const prompt = buildAutoFillPrompt(fieldSummaries, orgContext);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: AutoFillResultSchema,\n maxTokens,\n taskKind: \"application_auto_fill\",\n providerOptions,\n }),\n );\n\n return { result: object as AutoFillResult, usage };\n}\n\n/**\n * Backfill fields from prior application answers using vector search.\n * No LLM call — pure retrieval from the backfill provider.\n */\nexport async function backfillFromPriorAnswers(\n fields: ApplicationField[],\n backfillProvider: BackfillProvider,\n): Promise<PriorAnswer[]> {\n const unfilled = fields.filter((f) => !f.value);\n if (unfilled.length === 0) return [];\n\n return backfillProvider.searchPriorAnswers(\n unfilled.map((f) => ({\n id: f.id,\n label: f.label,\n section: f.section,\n fieldType: f.fieldType,\n })),\n { limit: unfilled.length * 2 },\n );\n}\n","export function buildQuestionBatchPrompt(\n unfilledFields: { id: string; label?: string; text?: string; fieldType: string; section: string; required: boolean; condition?: { dependsOn: string; whenValue: string } }[],\n): string {\n const fieldList = unfilledFields\n .map(\n (f) => {\n let line = `- ${f.id}: \"${f.label ?? f.text}\" (${f.fieldType}, section: ${f.section}, required: ${f.required})`;\n if (f.condition) line += ` [depends on: ${f.condition.dependsOn} when \"${f.condition.whenValue}\"]`;\n return line;\n },\n )\n .join(\"\\n\");\n\n return `You are organizing insurance application questions into topic-based email batches. Each batch = one email, grouped by topic so the recipient can answer related questions together.\n\nUNFILLED FIELDS:\n${fieldList}\n\nRules:\n- Group by TOPIC, not by fixed size. All questions about the same topic belong in the same batch.\n- Typical topics: Company/Applicant Info, Business Operations, Financial/Revenue, Coverage/Limits, Loss History, Declarations, Premises/Location, etc.\n- A batch can have as many questions as the topic requires — don't split a natural topic group across multiple emails.\n- If a topic has 20+ fields, you may split into sub-topics (e.g. \"Premises - Location\" vs \"Premises - Details\").\n- Put required fields before optional ones within each batch.\n- Keep conditional fields in the same batch as the field they depend on, with the parent field listed BEFORE dependents.\n- Keep related address-like fields (street, city, state, zip, address) in the same batch so the email generator can merge them into a single compound question.\n- Order batches by importance: company info first, then operations, financial, coverage, declarations last.\n- Aim for roughly 3-8 batches total. Fewer large topical batches are better than many tiny ones.\n\nRespond with JSON only:\n{\n \"batches\": [\n [\"field_id_1\", \"field_id_2\", \"field_id_3\", ...],\n [\"field_id_4\", \"field_id_5\", ...]\n ]\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildQuestionBatchPrompt } from \"../../prompts/application/question-batch\";\nimport { QuestionBatchResultSchema, type QuestionBatchResult, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Organize unfilled fields into topic-based batches for user collection.\n * Small agent — grouping task, fast model is fine.\n */\nexport async function batchQuestions(\n unfilledFields: ApplicationField[],\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 2048,\n): Promise<{ result: QuestionBatchResult; usage?: TokenUsage }> {\n const fieldSummaries = unfilledFields.map((f) => ({\n id: f.id,\n label: f.label,\n text: f.label,\n fieldType: f.fieldType,\n section: f.section,\n required: f.required,\n condition: f.condition,\n }));\n\n const prompt = buildQuestionBatchPrompt(fieldSummaries);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: QuestionBatchResultSchema,\n maxTokens,\n taskKind: \"application_batch\",\n providerOptions,\n }),\n );\n\n return { result: object as QuestionBatchResult, usage };\n}\n","export function buildReplyIntentClassificationPrompt(\n questions: { id: string; label: string }[],\n emailBody: string,\n): string {\n const questionList = questions\n .map((q, i) => `${i + 1}. ${q.id}: \"${q.label}\"`)\n .join(\"\\n\");\n\n return `Classify the intent of this email reply to insurance application questions.\n\nQUESTIONS THAT WERE ASKED:\n${questionList}\n\nUSER'S EMAIL REPLY:\n${emailBody}\n\nClassify the primary intent:\n- \"answers_only\": User is providing answers to the questions\n- \"question\": User is asking a question about one or more fields (e.g. \"What does aggregate limit mean?\")\n- \"lookup_request\": User is requesting data be pulled from existing records OR from a third-party website (e.g. \"Use our GL policy for coverage info\", \"Check Stripe's site for PCI compliance info\", \"Pull from our last application\")\n- \"mixed\": User is providing some answers AND asking questions or requesting lookups\n\nIMPORTANT: When a user provides answers AND asks you to look something up (e.g. \"Yes we use Stripe, check their site for PCI info\"), classify as \"mixed\" with hasAnswers=true and a lookupRequest — NOT as \"question\". A \"question\" is when the user asks what a field means, not when they direct you to a data source.\n\nRespond with JSON only:\n{\n \"primaryIntent\": \"answers_only\" | \"question\" | \"lookup_request\" | \"mixed\",\n \"hasAnswers\": boolean,\n \"questionText\": \"the user's question if any, or null\",\n \"questionFieldIds\": [\"field_ids the question is about, if identifiable\"],\n \"lookupRequests\": [\n {\n \"type\": \"policy\" | \"quote\" | \"profile\" | \"business_context\" | \"web\",\n \"description\": \"what they want looked up\",\n \"url\": \"URL or domain mentioned (e.g. 'stripe.com'), or null if not a web lookup\",\n \"targetFieldIds\": [\"field_ids to fill from the lookup\"]\n }\n ]\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildReplyIntentClassificationPrompt } from \"../../prompts/application/reply-intent\";\nimport { ReplyIntentSchema, type ReplyIntent, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Classify user reply intent — answers, questions, lookup requests, or mixed.\n * Tiny agent — fast classification task.\n */\nexport async function classifyReplyIntent(\n fields: ApplicationField[],\n replyText: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 1024,\n): Promise<{ intent: ReplyIntent; usage?: TokenUsage }> {\n const fieldSummaries = fields.map((f) => ({ id: f.id, label: f.label }));\n const prompt = buildReplyIntentClassificationPrompt(fieldSummaries, replyText);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: ReplyIntentSchema,\n maxTokens,\n taskKind: \"application_classify\",\n providerOptions,\n }),\n );\n\n return { intent: object as ReplyIntent, usage };\n}\n","export function buildAnswerParsingPrompt(\n questions: { id: string; label?: string; text?: string; fieldType: string }[],\n emailBody: string,\n): string {\n const questionList = questions\n .map(\n (q, i) =>\n `${i + 1}. ${q.id}: \"${q.label ?? q.text}\" (type: ${q.fieldType})`,\n )\n .join(\"\\n\");\n\n return `You are parsing a user's email reply to extract answers for specific insurance application questions.\n\nQUESTIONS ASKED:\n${questionList}\n\nUSER'S EMAIL REPLY:\n${emailBody}\n\nExtract answers for each question. Handle:\n- Direct numbered answers (1. answer, 2. answer)\n- Inline answers referencing the question\n- Table data provided as lists or comma-separated values\n- Yes/no answers with optional explanations\n- Partial responses (some questions answered, others skipped)\n\nRespond with JSON only:\n{\n \"answers\": [\n {\n \"fieldId\": \"company_name\",\n \"value\": \"Acme Corp\"\n },\n {\n \"fieldId\": \"prior_claims_decl\",\n \"value\": \"yes\",\n \"explanation\": \"One claim in 2024 for water damage, $15,000 paid\"\n }\n ],\n \"unanswered\": [\"field_id_that_was_not_answered\"]\n}\n\nOnly include answers you are confident about. If a response is ambiguous, include the field in \"unanswered\".`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildAnswerParsingPrompt } from \"../../prompts/application/answer-parsing\";\nimport { AnswerParsingResultSchema, type AnswerParsingResult, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Parse answers from user reply text.\n * Small agent — extraction task, fast model works well.\n */\nexport async function parseAnswers(\n fields: ApplicationField[],\n replyText: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: AnswerParsingResult; usage?: TokenUsage }> {\n const questions = fields.map((f) => ({\n id: f.id,\n label: f.label,\n text: f.label,\n fieldType: f.fieldType,\n }));\n\n const prompt = buildAnswerParsingPrompt(questions, replyText);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: AnswerParsingResultSchema,\n maxTokens,\n taskKind: \"application_parse_answers\",\n providerOptions,\n }),\n );\n\n return { result: object as AnswerParsingResult, usage };\n}\n","export function buildFlatPdfMappingPrompt(\n extractedFields: { id: string; label: string; value: string; fieldType: string }[],\n): string {\n const fieldList = extractedFields\n .map((f) => `- ${f.id}: \"${f.label}\" = \"${f.value}\" (${f.fieldType})`)\n .join(\"\\n\");\n\n return `You are mapping filled insurance application values to their exact positions on a flat (non-fillable) PDF form. I will show you the PDF. For each field value, identify where on the PDF it should be written.\n\nFIELD VALUES TO PLACE:\n${fieldList}\n\nFor each field, provide:\n- page: 0-indexed page number where this field appears\n- x: horizontal position as percentage from the LEFT edge (0-100). Place the text where the blank/underline/box starts, NOT on top of the label.\n- y: vertical position as percentage from the TOP edge (0-100). Place the text vertically centered within the field's answer area.\n- fontSize: appropriate font size (typically 8-10 for standard forms, smaller for tight spaces)\n- isCheckmark: true for yes/no or checkbox fields where you should place an \"X\" mark\n\nCRITICAL POSITIONING RULES:\n- x/y indicate where the VALUE text should START (top-left corner of the text)\n- Place text INSIDE the blank field area (the line, box, or empty space), not on the label\n- For fields with underlines: place text slightly above the line\n- For fields with boxes: place text inside the box\n- For checkbox/yes-no fields: place the X inside the checkbox box. If there are \"Yes\" and \"No\" checkboxes, place it in the correct one based on the value\n- Typical form layout: label on the left, fill area to the right or below\n- Be precise — a few percentage points off will misplace text visibly\n\nRespond with JSON only:\n{\n \"placements\": [\n {\n \"fieldId\": \"company_name\",\n \"page\": 0,\n \"x\": 25.5,\n \"y\": 12.3,\n \"text\": \"Acme Corp\",\n \"fontSize\": 10,\n \"isCheckmark\": false\n }\n ]\n}\n\nOnly include fields you can confidently locate on the PDF. Skip fields where the location is ambiguous.`;\n}\n\nexport function buildAcroFormMappingPrompt(\n extractedFields: { id: string; label: string; value?: string }[],\n acroFormFields: { name: string; type: string; options?: string[] }[],\n): string {\n const extracted = extractedFields\n .filter((f) => (f as any).value)\n .map((f) => `- ${f.id}: \"${f.label}\" = \"${(f as any).value}\"`)\n .join(\"\\n\");\n const acroFields = acroFormFields\n .map((f) => {\n let line = `- \"${f.name}\" (${f.type})`;\n if (f.options?.length) line += ` options: [${f.options.join(\", \")}]`;\n return line;\n })\n .join(\"\\n\");\n\n return `You are mapping extracted insurance application answers to AcroForm PDF field names.\n\nEXTRACTED FIELD VALUES (semantic IDs with values):\n${extracted}\n\nACROFORM FIELDS IN THE PDF:\n${acroFields}\n\nFor each extracted field that has a value, find the best matching AcroForm field name. Match by semantic meaning — field names in PDFs are often abbreviated or coded (e.g. \"FirstNamed\" for company name, \"Addr1\" for address).\n\nRules:\n- Only include mappings where you are confident of the match\n- For checkbox fields, the value should be \"yes\"/\"no\" or \"true\"/\"false\"\n- For radio/dropdown fields, the value must be one of the available options\n- Skip fields with no clear match\n\nRespond with JSON only:\n{\n \"mappings\": [\n { \"fieldId\": \"company_name\", \"acroFormName\": \"FirstNamed\", \"value\": \"Acme Corp\" }\n ]\n}`;\n}\n\nexport function buildLookupFillPrompt(\n requests: { type: string; description: string; targetFieldIds: string[] }[],\n targetFields: { id: string; label: string; fieldType: string }[],\n availableData: string,\n): string {\n const requestList = requests\n .map((r) => `- ${r.type}: ${r.description} (target fields: ${r.targetFieldIds.join(\", \")})`)\n .join(\"\\n\");\n const fieldList = targetFields\n .map((f) => `- ${f.id}: \"${f.label}\" (${f.fieldType})`)\n .join(\"\\n\");\n\n return `You are an internal risk management assistant filling out an insurance application for your company. A colleague asked you to look up data from existing company records to fill certain fields.\n\nLOOKUP REQUESTS:\n${requestList}\n\nTARGET FIELDS:\n${fieldList}\n\nAVAILABLE DATA:\n${availableData}\n\nMatch the available data to the target fields. Only fill fields where you have a confident match.\n\nIMPORTANT: The \"source\" field must be a specific, citable reference that will be shown to the user. Examples:\n- \"GL Policy #POL-12345 (Hartford)\"\n- \"vercel.com (Security page)\"\n- \"Business Context (company_info)\"\n- \"User Profile\"\nNever use vague sources like \"existing records\" or \"available data\".\nIf AVAILABLE DATA contains sourceSpanId values, include them in \"sourceSpanIds\" for every value filled from that source. Existing policy values such as policy numbers, dates, limits, deductibles, premiums, coverages, exclusions, conditions, endorsements, locations, vehicles, or named insureds must not be filled without sourceSpanIds unless the value is explicitly marked for review.\n\nRespond with JSON only:\n{\n \"fills\": [\n { \"fieldId\": \"field_id\", \"value\": \"the value from data\", \"source\": \"Specific source with identifier (e.g. GL Policy #ABC123, stripe.com)\", \"sourceSpanIds\": [\"doc-1:span:1:0:abcd1234\"] }\n ],\n \"unfillable\": [\"field_ids that couldn't be matched\"],\n \"explanation\": \"Brief note about what was filled and what couldn't be found, citing sources\"\n}`;\n}\n","import type { GenerateObject, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildLookupFillPrompt } from \"../../prompts/application/pdf-mapping\";\nimport { LookupFillResultSchema, type LookupFillResult, type LookupRequest, type ApplicationField } from \"../../schemas/application\";\n\n/**\n * Fill fields from company records / policy data based on lookup requests.\n * Small agent — matching task against available data.\n */\nexport async function fillFromLookup(\n requests: LookupRequest[],\n targetFields: ApplicationField[],\n availableData: string,\n generateObject: GenerateObject,\n providerOptions?: Record<string, unknown>,\n maxTokens = 4096,\n): Promise<{ result: LookupFillResult; usage?: TokenUsage }> {\n const requestSummaries = requests.map((r) => ({\n type: r.type,\n description: r.description,\n targetFieldIds: r.targetFieldIds,\n }));\n\n const fieldSummaries = targetFields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n }));\n\n const prompt = buildLookupFillPrompt(requestSummaries, fieldSummaries, availableData);\n\n const { object, usage } = await withRetry(() =>\n generateObject({\n prompt,\n schema: LookupFillResultSchema,\n maxTokens,\n taskKind: \"application_lookup\",\n providerOptions,\n }),\n );\n\n return { result: object as LookupFillResult, usage };\n}\n","export function buildBatchEmailGenerationPrompt(\n batchFields: { id: string; label: string; fieldType: string; options?: string[]; condition?: { dependsOn: string; whenValue: string } }[],\n batchIndex: number,\n totalBatches: number,\n appTitle: string | undefined,\n totalFieldCount: number,\n filledFieldCount: number,\n previousBatchSummary?: string,\n companyName?: string,\n): string {\n // Separate conditional fields from non-conditional fields\n const nonConditionalFields = batchFields.filter((f) => !f.condition);\n const conditionalFields = batchFields.filter((f) => f.condition);\n\n const fieldList = nonConditionalFields\n .map((f, i) => {\n let line = `${i + 1}. id=\"${f.id}\" label=\"${f.label}\" type=${f.fieldType}`;\n if (f.options) line += ` options=[${f.options.join(\", \")}]`;\n return line;\n })\n .join(\"\\n\");\n\n const conditionalNote = conditionalFields.length > 0\n ? `\\n\\nCONDITIONAL FIELDS (DO NOT include in this email — they will be asked as follow-ups in a separate email after the parent is answered):\\n${conditionalFields.map((f) => `- id=\"${f.id}\" label=\"${f.label}\" depends on ${f.condition!.dependsOn} = \"${f.condition!.whenValue}\"`).join(\"\\n\")}`\n : \"\";\n\n const company = companyName ?? \"the company\";\n const remainingFields = totalFieldCount - filledFieldCount;\n // Estimate ~30 seconds per remaining field\n const estMinutes = Math.max(1, Math.round(remainingFields * 0.5));\n\n return `You are an internal risk management assistant helping your colleague fill out an insurance application for ${company}. You work FOR ${company} — you are NOT the insurer, broker, or any external party.\n\nAPPLICATION: ${appTitle ?? \"Insurance Application\"}\nCOMPANY: ${company}\nPROGRESS: ${filledFieldCount} of ${totalFieldCount} fields done, ~${remainingFields} remaining (~${estMinutes} min of questions left)\n${previousBatchSummary ? `\\nPREVIOUS ANSWERS RECEIVED:\\n${previousBatchSummary}\\n` : \"\"}\nFIELDS TO ASK ABOUT:\n${fieldList}${conditionalNote}\n\nRules:\n- ${previousBatchSummary ? \"Start by acknowledging previous answers or auto-filled data. If fields were auto-filled, list each field with its value AND cite the specific source (e.g. \\\"from your GL Policy #ABC123\\\", \\\"from vercel.com\\\", \\\"from your business context\\\"). If a web lookup was done, name the URL that was checked. Ask them to reply with corrections if anything is wrong.\" : \"Start with a one-line intro.\"}\n- Mention progress once using estimated time remaining. Don't mention section/batch numbers or field counts.\n- Use \"${company}\" by name when referring to the company. Also fine: \"we\" or \"our\". Never \"our company\" or \"the company\".\n- Ask questions plainly. No em-dashes for dramatic effect, no filler phrases like \"need to nail down\" or \"let's dive into\". Just ask.\n- For yes/no questions, ask naturally in one sentence. Don't list \"Yes / No\" as options. Mention what you'll need if the answer triggers a follow-up (e.g. \"If not, I'll need a brief explanation.\").\n- For fields with 2-3 options, mention them inline. 4+ options can be a short list.\n- Group related fields (address, coverage limits) into single compound questions.\n- Do NOT include conditional/follow-up fields. They will be sent separately.\n- Number each question.\n- Note expected format where relevant: dollar amounts for currency, MM/DD/YYYY for dates, column descriptions for tables.\n- End with a short closing.\n- Tone: professional, brief, matter-of-fact. Write like a busy coworker, not a chatbot. No flourishes, no em-dashes between clauses, no editorializing about the questions.\n\nNEVER:\n- Sound like a salesperson or customer service agent\n- Use em-dashes for emphasis or dramatic pacing\n- Editorialize (\"these two should wrap up this section\", \"just a couple more\")\n- List \"Yes / No / N/A\" as bullet options\n- Include conditional follow-up questions\n- Mention section numbers, batch numbers, or field counts\n\nOutput the email body text ONLY. No subject line, no JSON. Use markdown for numbered lists.`;\n}\n","import type { GenerateText, TokenUsage } from \"../../core/types\";\nimport { withRetry } from \"../../core/retry\";\nimport { buildBatchEmailGenerationPrompt } from \"../../prompts/application/batch-email\";\nimport type { ApplicationField } from \"../../schemas/application\";\n\n/**\n * Generate a professional email requesting answers for a batch of fields.\n * Small agent — text generation, fast model produces good emails.\n */\nexport async function generateBatchEmail(\n batchFields: ApplicationField[],\n batchIndex: number,\n totalBatches: number,\n opts: {\n appTitle?: string;\n totalFieldCount: number;\n filledFieldCount: number;\n previousBatchSummary?: string;\n companyName?: string;\n },\n generateText: GenerateText,\n providerOptions?: Record<string, unknown>,\n maxTokens = 2048,\n): Promise<{ text: string; usage?: TokenUsage }> {\n const fieldSummaries = batchFields.map((f) => ({\n id: f.id,\n label: f.label,\n fieldType: f.fieldType,\n options: f.options,\n condition: f.condition,\n }));\n\n const prompt = buildBatchEmailGenerationPrompt(\n fieldSummaries,\n batchIndex,\n totalBatches,\n opts.appTitle,\n opts.totalFieldCount,\n opts.filledFieldCount,\n opts.previousBatchSummary,\n opts.companyName,\n );\n\n const { text, usage } = await withRetry(() =>\n generateText({\n prompt,\n maxTokens,\n taskKind: \"application_email\",\n providerOptions,\n }),\n );\n\n return { text, usage };\n}\n","export type QualitySeverity = \"info\" | \"warning\" | \"blocking\";\nexport type QualityGateStatus = \"passed\" | \"warning\" | \"failed\";\nexport type QualityGateMode = \"off\" | \"warn\" | \"strict\";\n\nexport interface BaseQualityIssue {\n code: string;\n severity: QualitySeverity;\n message: string;\n}\n\nexport interface QualityRound {\n round: number;\n kind: string;\n status: \"passed\" | \"warning\" | \"failed\";\n summary?: string;\n}\n\nexport interface QualityArtifact {\n kind: string;\n label?: string;\n itemCount?: number;\n}\n\nexport interface UnifiedQualityReport<TIssue extends BaseQualityIssue = BaseQualityIssue> {\n issues: TIssue[];\n rounds: QualityRound[];\n artifacts: QualityArtifact[];\n qualityGateStatus: QualityGateStatus;\n}\n\nexport function evaluateQualityGate(params: {\n issues: Array<{ severity: QualitySeverity }>;\n hasRoundWarnings?: boolean;\n}): QualityGateStatus {\n const { issues, hasRoundWarnings = false } = params;\n const hasBlocking = issues.some((issue) => issue.severity === \"blocking\");\n const hasWarnings = issues.some((issue) => issue.severity === \"warning\") || hasRoundWarnings;\n return hasBlocking ? \"failed\" : hasWarnings ? \"warning\" : \"passed\";\n}\n\nexport function shouldFailQualityGate(\n mode: QualityGateMode,\n status: QualityGateStatus,\n): boolean {\n return mode === \"strict\" && status === \"failed\";\n}\n","import type { ApplicationField, ApplicationState } from \"../schemas/application\";\nimport type { BaseQualityIssue, QualityArtifact, QualityGateStatus, QualityRound } from \"../core/quality\";\nimport { evaluateQualityGate } from \"../core/quality\";\n\nexport interface ApplicationQualityIssue extends BaseQualityIssue {\n message: string;\n fieldId?: string;\n}\n\nexport interface ApplicationEmailReview {\n issues: ApplicationQualityIssue[];\n qualityGateStatus: QualityGateStatus;\n}\n\nexport interface ApplicationQualityReport {\n issues: ApplicationQualityIssue[];\n rounds?: QualityRound[];\n artifacts?: QualityArtifact[];\n emailReview?: ApplicationEmailReview;\n qualityGateStatus: QualityGateStatus;\n}\n\nfunction isVagueSource(source: string | undefined): boolean {\n if (!source) return true;\n const normalized = source.trim().toLowerCase();\n return normalized === \"unknown\"\n || normalized.includes(\"existing records\")\n || normalized.includes(\"available data\")\n || normalized === \"context\"\n || normalized === \"user provided\";\n}\n\nfunction isSourceGroundedPolicyValue(field: ApplicationField): boolean {\n if (!field.value) return false;\n const source = field.source?.toLowerCase() ?? \"\";\n if (field.sourceSpanIds?.length) return false;\n if (field.userSourceSpanIds?.length) return false;\n\n const label = `${field.section} ${field.label}`.toLowerCase();\n const highValueLabel = /\\b(policy|effective|expiration|date|limit|deductible|premium|coverage|exclusion|condition|endorsement|location|vehicle|named insured|revenue|payroll|loss|claim|prior)\\b/.test(label);\n const highValueType = field.fieldType === \"currency\" || field.fieldType === \"date\" || field.fieldType === \"numeric\" || field.fieldType === \"declaration\";\n const fromPolicyLikeSource = /\\b(policy|quote|document|lookup|carrier|endorsement)\\b/.test(source);\n\n return fromPolicyLikeSource && (highValueLabel || highValueType);\n}\n\nexport function buildApplicationQualityReport(state: ApplicationState): ApplicationQualityReport {\n const issues: ApplicationQualityIssue[] = [];\n const seenIds = new Set<string>();\n\n for (const field of state.fields) {\n if (seenIds.has(field.id)) {\n issues.push({\n code: \"duplicate_field_id\",\n severity: \"blocking\",\n message: `Field \"${field.label}\" has a duplicate id \"${field.id}\".`,\n fieldId: field.id,\n });\n }\n seenIds.add(field.id);\n\n if (field.required && !field.value) {\n issues.push({\n code: \"required_field_unfilled\",\n severity: \"warning\",\n message: `Required field \"${field.label}\" is still unfilled.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && !field.source) {\n issues.push({\n code: \"filled_field_missing_source\",\n severity: \"blocking\",\n message: `Filled field \"${field.label}\" is missing source provenance.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && isVagueSource(field.source)) {\n issues.push({\n code: \"filled_field_vague_source\",\n severity: \"warning\",\n message: `Filled field \"${field.label}\" has a vague or non-citable source.`,\n fieldId: field.id,\n });\n }\n\n if (field.value && (!field.confidence || field.confidence === \"low\")) {\n issues.push({\n code: \"filled_field_low_confidence\",\n severity: \"warning\",\n message: `Filled field \"${field.label}\" has low or missing confidence.`,\n fieldId: field.id,\n });\n }\n\n if (isSourceGroundedPolicyValue(field)) {\n issues.push({\n code: \"policy_value_missing_source_span\",\n severity: \"blocking\",\n message: `Filled policy-derived field \"${field.label}\" is missing source span evidence.`,\n fieldId: field.id,\n });\n }\n }\n\n return {\n issues,\n rounds: [],\n artifacts: [\n { kind: \"application_fields\", label: \"Application Fields\", itemCount: state.fields.length },\n ],\n qualityGateStatus: evaluateQualityGate({ issues }),\n };\n}\n\nexport function reviewBatchEmail(text: string, batchFields: ApplicationField[]): ApplicationEmailReview {\n const issues: ApplicationQualityIssue[] = [];\n const normalized = text.toLowerCase();\n\n for (const field of batchFields) {\n const label = field.label.trim().toLowerCase();\n if (label.length >= 6 && !normalized.includes(label)) {\n issues.push({\n code: \"email_missing_field_prompt\",\n severity: \"warning\",\n message: `Generated email does not clearly mention field \"${field.label}\".`,\n fieldId: field.id,\n });\n }\n }\n\n return {\n issues,\n qualityGateStatus: evaluateQualityGate({ issues }),\n };\n}\n","import type { ApplicationField, ReplyIntent } from \"../schemas/application\";\n\nconst MAX_DOCUMENT_SEARCH_FIELDS = 5;\nconst LOW_VALUE_FIELD_RATIO_LIMIT = 0.6;\n\nexport interface ApplicationWorkflowPlan {\n runBackfill: boolean;\n runContextAutoFill: boolean;\n documentSearchFields: ApplicationField[];\n runBatching: boolean;\n unfilledFields: ApplicationField[];\n}\n\nexport interface ApplicationWorkflowPlanInput {\n fields: ApplicationField[];\n hasBackfillProvider: boolean;\n orgContextCount: number;\n hasDocumentStore: boolean;\n hasMemoryStore: boolean;\n}\n\nexport interface ReplyActionPlan {\n parseAnswers: boolean;\n runLookup: boolean;\n answerQuestion: boolean;\n advanceBatch: boolean;\n generateNextEmail: boolean;\n}\n\nexport interface ReplyActionPlanInput {\n intent: ReplyIntent;\n currentBatchFields: ApplicationField[];\n nextBatchFields?: ApplicationField[];\n hasDocumentStore: boolean;\n}\n\nexport function planApplicationWorkflow(input: ApplicationWorkflowPlanInput): ApplicationWorkflowPlan {\n const unfilledFields = input.fields.filter(isUnfilled);\n const documentSearchFields = planDocumentSearchFields(\n unfilledFields,\n input.hasDocumentStore && input.hasMemoryStore,\n );\n\n return {\n runBackfill: input.hasBackfillProvider && unfilledFields.length > 0,\n runContextAutoFill: input.orgContextCount > 0 && unfilledFields.length > 0,\n documentSearchFields,\n runBatching: unfilledFields.length > 0,\n unfilledFields,\n };\n}\n\nexport function planReplyActions(input: ReplyActionPlanInput): ReplyActionPlan {\n const hasCurrentFields = input.currentBatchFields.length > 0;\n const nextBatchNeedsAnswers = (input.nextBatchFields ?? []).some(isUnfilled);\n const hasLookupRequests = (input.intent.lookupRequests?.length ?? 0) > 0;\n\n return {\n parseAnswers: input.intent.hasAnswers && hasCurrentFields,\n runLookup: hasLookupRequests && input.hasDocumentStore,\n answerQuestion: Boolean(input.intent.questionText)\n && (input.intent.primaryIntent === \"question\" || input.intent.primaryIntent === \"mixed\"),\n advanceBatch: (hasCurrentFields && input.currentBatchFields.every((field) => !isUnfilled(field)))\n || (!hasCurrentFields && nextBatchNeedsAnswers),\n generateNextEmail: nextBatchNeedsAnswers,\n };\n}\n\nfunction planDocumentSearchFields(\n unfilledFields: ApplicationField[],\n hasStores: boolean,\n): ApplicationField[] {\n if (!hasStores || unfilledFields.length === 0) return [];\n\n const searchableFields = unfilledFields.filter(isHighValueLookupField);\n if (searchableFields.length === 0) return [];\n\n const lowValueRatio = 1 - searchableFields.length / unfilledFields.length;\n if (unfilledFields.length > MAX_DOCUMENT_SEARCH_FIELDS && lowValueRatio > LOW_VALUE_FIELD_RATIO_LIMIT) {\n return [];\n }\n\n return searchableFields.slice(0, MAX_DOCUMENT_SEARCH_FIELDS);\n}\n\nfunction isUnfilled(field: ApplicationField): boolean {\n return field.value === undefined || field.value.trim() === \"\";\n}\n\nfunction isHighValueLookupField(field: ApplicationField): boolean {\n const text = `${field.section} ${field.label}`.toLowerCase();\n\n if (field.required) return true;\n\n return [\n \"carrier\",\n \"policy\",\n \"premium\",\n \"limit\",\n \"deductible\",\n \"insured\",\n \"address\",\n \"revenue\",\n \"payroll\",\n \"effective\",\n \"expiration\",\n \"coverage\",\n \"class code\",\n \"fein\",\n \"entity\",\n ].some((term) => text.includes(term));\n}\n","import { z } from \"zod\";\nimport { AcordLobCodeSchema, toLobCodes } from \"../schemas/lines-of-business\";\n\nexport const SourceSpanKindSchema = z.enum([\n \"pdf_text\",\n \"pdf_image\",\n \"html\",\n \"markdown\",\n \"plain_text\",\n \"structured_field\",\n]);\nexport type SourceSpanKind = z.infer<typeof SourceSpanKindSchema>;\n\nexport const SourceSpanUnitSchema = z.enum([\n \"page\",\n \"section\",\n \"table\",\n \"table_row\",\n \"table_cell\",\n \"key_value\",\n \"text\",\n]);\nexport type SourceSpanUnit = z.infer<typeof SourceSpanUnitSchema>;\n\nexport const SourceKindSchema = z.enum([\n \"policy_pdf\",\n \"application_pdf\",\n \"email\",\n \"attachment\",\n \"manual_note\",\n]);\nexport type SourceKind = z.infer<typeof SourceKindSchema>;\n\nexport const SourceSpanBBoxSchema = z.object({\n page: z.number().int().positive(),\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n});\nexport type SourceSpanBBox = z.infer<typeof SourceSpanBBoxSchema>;\n\nexport const SourceSpanLocationSchema = z.object({\n page: z.number().int().positive().optional(),\n startPage: z.number().int().positive().optional(),\n endPage: z.number().int().positive().optional(),\n charStart: z.number().int().nonnegative().optional(),\n charEnd: z.number().int().nonnegative().optional(),\n lineStart: z.number().int().positive().optional(),\n lineEnd: z.number().int().positive().optional(),\n fieldPath: z.string().optional(),\n});\nexport type SourceSpanLocation = z.infer<typeof SourceSpanLocationSchema>;\n\nexport const SourceSpanTableLocationSchema = z.object({\n tableId: z.string().optional(),\n rowIndex: z.number().int().nonnegative().optional(),\n columnIndex: z.number().int().nonnegative().optional(),\n columnName: z.string().optional(),\n rowSpanId: z.string().optional(),\n tableSpanId: z.string().optional(),\n isHeader: z.boolean().optional(),\n});\nexport type SourceSpanTableLocation = z.infer<typeof SourceSpanTableLocationSchema>;\n\nexport const SourceSpanSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceKind: SourceKindSchema.optional(),\n chunkId: z.string().optional(),\n kind: SourceSpanKindSchema,\n text: z.string(),\n hash: z.string().min(1),\n textHash: z.string().optional(),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n sectionId: z.string().optional(),\n formNumber: z.string().optional(),\n sourceUnit: SourceSpanUnitSchema.optional(),\n parentSpanId: z.string().optional(),\n table: SourceSpanTableLocationSchema.optional(),\n bbox: z.array(SourceSpanBBoxSchema).optional(),\n location: SourceSpanLocationSchema.optional(),\n metadata: z.record(z.string(), z.string()).optional(),\n});\nexport type SourceSpan = z.infer<typeof SourceSpanSchema>;\n\nexport const SourceSpanRefSchema = z.object({\n sourceSpanId: z.string().min(1),\n documentId: z.string().min(1).optional(),\n chunkId: z.string().optional(),\n quote: z.string().optional(),\n hash: z.string().optional(),\n location: SourceSpanLocationSchema.optional(),\n});\nexport type SourceSpanRef = z.infer<typeof SourceSpanRefSchema>;\n\nexport const SourceChunkSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceSpanIds: z.array(z.string().min(1)),\n text: z.string(),\n textHash: z.string().min(1),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.string()).default({}),\n});\nexport type SourceChunk = z.infer<typeof SourceChunkSchema>;\n\nexport const DocumentSourceNodeKindSchema = z.enum([\n \"document\",\n \"page_group\",\n \"page\",\n \"form\",\n \"endorsement\",\n \"section\",\n \"schedule\",\n \"clause\",\n \"table\",\n \"table_row\",\n \"table_cell\",\n \"text\",\n]);\nexport type DocumentSourceNodeKind = z.infer<typeof DocumentSourceNodeKindSchema>;\n\nexport const DocumentSourceNodeSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n parentId: z.string().optional(),\n kind: DocumentSourceNodeKindSchema,\n title: z.string(),\n description: z.string(),\n textExcerpt: z.string().optional(),\n sourceSpanIds: z.array(z.string().min(1)),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n bbox: z.array(SourceSpanBBoxSchema).optional(),\n order: z.number().int().nonnegative(),\n path: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\nexport type DocumentSourceNode = z.infer<typeof DocumentSourceNodeSchema>;\n\nexport const SourceBackedValueSchema = z.object({\n value: z.string(),\n normalizedValue: z.string().optional(),\n confidence: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type SourceBackedValue = z.infer<typeof SourceBackedValueSchema>;\n\nexport const OperationalAddressSchema = z.object({\n street1: z.string().optional(),\n street2: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n zip: z.string().optional(),\n country: z.string().optional(),\n formatted: z.string().optional(),\n});\nexport type OperationalAddress = z.infer<typeof OperationalAddressSchema>;\n\nexport const OperationalDeclarationFactSchema = z.object({\n field: z.enum([\n \"namedInsured\",\n \"mailingAddress\",\n \"dba\",\n \"entityType\",\n \"taxId\",\n \"additionalNamedInsured\",\n \"policyNumber\",\n \"insurer\",\n \"broker\",\n \"effectiveDate\",\n \"expirationDate\",\n \"premium\",\n \"other\",\n ]),\n label: z.string().optional(),\n value: z.string(),\n normalizedValue: z.string().optional(),\n valueKind: z.enum([\"string\", \"number\", \"date\", \"money\", \"address\", \"list\", \"unknown\"]).default(\"string\"),\n address: OperationalAddressSchema.optional(),\n confidence: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalDeclarationFact = z.infer<typeof OperationalDeclarationFactSchema>;\n\nexport const OperationalCoverageTermSchema = z.object({\n kind: z.enum([\n \"each_claim_limit\",\n \"each_occurrence_limit\",\n \"each_loss_limit\",\n \"aggregate_limit\",\n \"sublimit\",\n \"retention\",\n \"deductible\",\n \"retroactive_date\",\n \"premium\",\n \"other\",\n ]).default(\"other\"),\n label: z.string(),\n value: z.string(),\n amount: z.number().optional(),\n appliesTo: z.string().optional(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalCoverageTerm = z.infer<typeof OperationalCoverageTermSchema>;\n\nexport const OperationalCoverageLineSchema = z.object({\n name: z.string(),\n lineOfBusiness: AcordLobCodeSchema.optional(),\n coverageCode: z.string().optional(),\n limit: z.string().optional(),\n deductible: z.string().optional(),\n premium: z.string().optional(),\n retroactiveDate: z.string().optional(),\n formNumber: z.string().optional(),\n sectionRef: z.string().optional(),\n endorsementNumber: z.string().optional(),\n limits: z.array(OperationalCoverageTermSchema).default([]),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalCoverageLine = z.infer<typeof OperationalCoverageLineSchema>;\n\nexport const OperationalPartySchema = z.object({\n role: z.string(),\n name: z.string(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalParty = z.infer<typeof OperationalPartySchema>;\n\nexport const OperationalEndorsementSupportSchema = z.object({\n kind: z.string(),\n status: z.enum([\"supported\", \"excluded\", \"requires_review\"]),\n summary: z.string(),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n});\nexport type OperationalEndorsementSupport = z.infer<typeof OperationalEndorsementSupportSchema>;\n\nfunction legacyOperationalProfileInput(value: unknown) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n const record = value as Record<string, unknown>;\n if (\"linesOfBusiness\" in record) return value;\n if (!(\"policyTypes\" in record)) return value;\n return {\n ...record,\n linesOfBusiness: record.policyTypes,\n };\n}\n\nconst OperationalLinesOfBusinessSchema = z.preprocess(\n (value) => (Array.isArray(value) ? toLobCodes(value.filter((item): item is string => typeof item === \"string\")) : undefined),\n z.array(AcordLobCodeSchema).default([\"UN\"]),\n);\n\nexport const PolicyOperationalProfileSchema = z.preprocess(\n legacyOperationalProfileInput,\n z.object({\n documentType: z.enum([\"policy\", \"quote\"]).default(\"policy\"),\n linesOfBusiness: OperationalLinesOfBusinessSchema,\n policyNumber: SourceBackedValueSchema.optional(),\n namedInsured: SourceBackedValueSchema.optional(),\n insurer: SourceBackedValueSchema.optional(),\n broker: SourceBackedValueSchema.optional(),\n effectiveDate: SourceBackedValueSchema.optional(),\n expirationDate: SourceBackedValueSchema.optional(),\n retroactiveDate: SourceBackedValueSchema.optional(),\n premium: SourceBackedValueSchema.optional(),\n declarationFacts: z.array(OperationalDeclarationFactSchema).default([]),\n coverages: z.array(OperationalCoverageLineSchema).default([]),\n parties: z.array(OperationalPartySchema).default([]),\n endorsementSupport: z.array(OperationalEndorsementSupportSchema).default([]),\n sourceNodeIds: z.array(z.string().min(1)).default([]),\n sourceSpanIds: z.array(z.string().min(1)).default([]),\n warnings: z.array(z.string()).default([]),\n }),\n);\nexport type PolicyOperationalProfile = z.infer<typeof PolicyOperationalProfileSchema>;\n","import { z } from \"zod\";\n\nexport const ACORD_LOB_CODES = [\n \"AAPPL\",\n \"AGLIA\",\n \"AGPP\",\n \"AGPR\",\n \"AIRC\",\n \"AIRPFB\",\n \"APKG\",\n \"APKGE\",\n \"APROD\",\n \"ARVP\",\n \"AUTO\",\n \"AUTOB\",\n \"AUTOP\",\n \"AVPKG\",\n \"BANDM\",\n \"BLANK\",\n \"BMISC\",\n \"BOAT\",\n \"BOP\",\n \"BOPGL\",\n \"BOPPR\",\n \"CAVN\",\n \"CEQFL\",\n \"CFIRE\",\n \"CFRM\",\n \"CGL\",\n \"COMAR\",\n \"COMR\",\n \"CONTR\",\n \"CPKGE\",\n \"CPMP\",\n \"CRIME\",\n \"DFIRE\",\n \"DISAB\",\n \"DO\",\n \"EDP\",\n \"EL\",\n \"EO\",\n \"EPLI\",\n \"EQ\",\n \"EQPFL\",\n \"EXLIA\",\n \"FIDTY\",\n \"FIDUC\",\n \"FINEA\",\n \"FLOOD\",\n \"GARAG\",\n \"GL\",\n \"GLASS\",\n \"HANG\",\n \"HBB\",\n \"HOME\",\n \"INBR\",\n \"INMAR\",\n \"INMRC\",\n \"INMRP\",\n \"JUDCL\",\n \"KIDRA\",\n \"LL\",\n \"MHOME\",\n \"MMAL\",\n \"Motorcycle\",\n \"MTRTK\",\n \"OLIB\",\n \"PHYS\",\n \"PKG\",\n \"PL\",\n \"PLMSC\",\n \"PPKGE\",\n \"PROP\",\n \"PROPC\",\n \"PUBOF\",\n \"RECV\",\n \"SCHPR\",\n \"SIGNS\",\n \"SMP\",\n \"SURE\",\n \"TRANS\",\n \"TRUCK\",\n \"UMBRC\",\n \"UMBRL\",\n \"UMBRP\",\n \"UN\",\n \"WCMA\",\n \"WIND\",\n \"WORK\",\n \"WORKP\",\n \"WORKV\",\n] as const;\n\nexport const AcordLobCodeSchema = z.enum(ACORD_LOB_CODES);\nexport type AcordLobCode = z.infer<typeof AcordLobCodeSchema>;\n\nexport const ACORD_LOB_LABELS: Record<AcordLobCode, string> = {\n AAPPL: \"Aircraft / Aerial Applicator\",\n AGLIA: \"Agricultural Liability\",\n AGPP: \"Agricultural Personal Property\",\n AGPR: \"Agricultural Property\",\n AIRC: \"Aircraft\",\n AIRPFB: \"Airport / Fixed Base Operator\",\n APKG: \"Agricultural Package\",\n APKGE: \"Agricultural Package (Extended)\",\n APROD: \"Agricultural Products\",\n ARVP: \"Recreational Vehicle Package\",\n AUTO: \"Automobile\",\n AUTOB: \"Business Auto\",\n AUTOP: \"Personal Auto\",\n AVPKG: \"Aviation Package\",\n BANDM: \"Boiler & Machinery\",\n BLANK: \"Blanket\",\n BMISC: \"Business Miscellaneous\",\n BOAT: \"Boat\",\n BOP: \"Businessowners Policy\",\n BOPGL: \"BOP - General Liability\",\n BOPPR: \"BOP - Property\",\n CAVN: \"Commercial Aviation\",\n CEQFL: \"Contractors Equipment Floater\",\n CFIRE: \"Commercial Fire\",\n CFRM: \"Commercial Farm\",\n CGL: \"Commercial General Liability\",\n COMAR: \"Commercial Marine / Ocean Marine\",\n COMR: \"Commercial (misc.)\",\n CONTR: \"Contractors\",\n CPKGE: \"Commercial Package\",\n CPMP: \"Commercial Package (multi-peril)\",\n CRIME: \"Crime\",\n DFIRE: \"Dwelling Fire\",\n DISAB: \"Disability\",\n DO: \"Directors & Officers Liability\",\n EDP: \"Electronic Data Processing\",\n EL: \"Employers Liability\",\n EO: \"Errors & Omissions\",\n EPLI: \"Employment Practices Liability\",\n EQ: \"Earthquake\",\n EQPFL: \"Equipment Floater\",\n EXLIA: \"Excess Liability\",\n FIDTY: \"Fidelity\",\n FIDUC: \"Fiduciary Liability\",\n FINEA: \"Fine Arts\",\n FLOOD: \"Flood\",\n GARAG: \"Garage\",\n GL: \"General Liability\",\n GLASS: \"Glass\",\n HANG: \"Hangar (Aviation)\",\n HBB: \"Home-Based Business\",\n HOME: \"Homeowners\",\n INBR: \"Inland Marine - Brokers\",\n INMAR: \"Inland Marine\",\n INMRC: \"Inland Marine - Commercial\",\n INMRP: \"Inland Marine - Personal\",\n JUDCL: \"Judicial Bonds\",\n KIDRA: \"Kidnap & Ransom\",\n LL: \"Liquor Liability\",\n MHOME: \"Mobile Home\",\n MMAL: \"Medical Malpractice\",\n Motorcycle: \"Motorcycle\",\n MTRTK: \"Motor Truck Cargo\",\n OLIB: \"Other Liability\",\n PHYS: \"Physical Damage\",\n PKG: \"Package\",\n PL: \"Professional Liability\",\n PLMSC: \"Personal Lines Miscellaneous\",\n PPKGE: \"Personal Package\",\n PROP: \"Property\",\n PROPC: \"Property - Commercial\",\n PUBOF: \"Public Officials Liability\",\n RECV: \"Recreational Vehicle\",\n SCHPR: \"Scheduled Property\",\n SIGNS: \"Signs\",\n SMP: \"Special Multi-Peril\",\n SURE: \"Surety\",\n TRANS: \"Transportation\",\n TRUCK: \"Trucking\",\n UMBRC: \"Umbrella - Commercial\",\n UMBRL: \"Umbrella\",\n UMBRP: \"Umbrella - Personal\",\n UN: \"Unspecified / Unknown\",\n WCMA: \"Workers Comp - Monopolistic/State\",\n WIND: \"Wind\",\n WORK: \"Workers Compensation\",\n WORKP: \"Workers Compensation (Personal/Package)\",\n WORKV: \"Workers Compensation (Voluntary)\",\n};\n\nexport const EXCLUDED_ACORD_LOB_CODES = new Set([\n \"ACHE\",\n \"INTER\",\n \"LICPT\",\n \"LSTIN\",\n \"NWFGR\",\n \"PAPER\",\n \"SCAP\",\n \"SFRNC\",\n]);\n\nexport const LEGACY_POLICY_TYPE_TO_LOB: Record<string, AcordLobCode[]> = {\n general_liability: [\"CGL\"],\n commercial_property: [\"PROPC\"],\n commercial_auto: [\"AUTOB\"],\n non_owned_auto: [\"AUTOB\"],\n workers_comp: [\"WORK\"],\n umbrella: [\"UMBRC\"],\n excess_liability: [\"EXLIA\"],\n professional_liability: [\"EO\"],\n cyber: [\"OLIB\"],\n epli: [\"EPLI\"],\n directors_officers: [\"DO\"],\n fiduciary_liability: [\"FIDUC\"],\n crime_fidelity: [\"CRIME\"],\n inland_marine: [\"INMRC\"],\n builders_risk: [\"INMRC\"],\n environmental: [\"OLIB\"],\n ocean_marine: [\"COMAR\"],\n surety: [\"SURE\"],\n product_liability: [\"OLIB\"],\n bop: [\"BOP\"],\n management_liability_package: [\"DO\", \"EPLI\", \"FIDUC\"],\n property: [\"PROP\"],\n homeowners_ho3: [\"HOME\"],\n homeowners_ho5: [\"HOME\"],\n renters_ho4: [\"HOME\"],\n condo_ho6: [\"HOME\"],\n dwelling_fire: [\"DFIRE\"],\n mobile_home: [\"MHOME\"],\n personal_auto: [\"AUTOP\"],\n personal_umbrella: [\"UMBRP\"],\n flood_nfip: [\"FLOOD\"],\n flood_private: [\"FLOOD\"],\n earthquake: [\"EQ\"],\n personal_inland_marine: [\"INMRP\"],\n watercraft: [\"BOAT\"],\n recreational_vehicle: [\"RECV\"],\n farm_ranch: [\"CFRM\"],\n life: [\"UN\"],\n critical_illness: [\"DISAB\"],\n disability: [\"DISAB\"],\n long_term_care: [\"UN\"],\n pet: [\"UN\"],\n travel: [\"UN\"],\n identity_theft: [\"UN\"],\n title: [\"UN\"],\n other: [\"UN\"],\n unknown: [\"UN\"],\n auto: [\"AUTOB\"],\n crime: [\"CRIME\"],\n crim: [\"CRIME\"],\n fiduciary: [\"FIDUC\"],\n d_and_o: [\"DO\"],\n d_o: [\"DO\"],\n homeowners: [\"HOME\"],\n renters: [\"HOME\"],\n flood: [\"FLOOD\"],\n boat: [\"BOAT\"],\n motorcycle: [\"Motorcycle\"],\n};\n\nexport const PERSONAL_LOB_CODES = new Set<AcordLobCode>([\n \"AUTOP\",\n \"HOME\",\n \"MHOME\",\n \"DFIRE\",\n \"FLOOD\",\n \"EQ\",\n \"INMRP\",\n \"UMBRP\",\n \"BOAT\",\n \"RECV\",\n \"Motorcycle\",\n \"PPKGE\",\n \"DISAB\",\n \"PLMSC\",\n \"HBB\",\n]);\n\nfunction hasOwn<T extends object>(object: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction canonicalLegacyKey(value: string) {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \" and \")\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_+/g, \"_\");\n}\n\nfunction humanize(value: string) {\n return value\n .trim()\n .replace(/[_-]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function isLobCode(value: unknown): value is AcordLobCode {\n return typeof value === \"string\" && hasOwn(ACORD_LOB_LABELS, value);\n}\n\nfunction resolveLobCode(value: string): AcordLobCode | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (isLobCode(trimmed)) return trimmed;\n if (trimmed.toLowerCase() === \"motorcycle\") return \"Motorcycle\";\n const legacy = LEGACY_POLICY_TYPE_TO_LOB[canonicalLegacyKey(trimmed)];\n if (legacy?.[0]) return legacy[0];\n const upper = trimmed.toUpperCase();\n if (upper === \"CRIM\") return \"CRIME\";\n if (isLobCode(upper)) return upper;\n return undefined;\n}\n\nexport function normalizeOperationalLinesOfBusiness(values: unknown): AcordLobCode[] {\n const source = Array.isArray(values)\n ? values.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n return toLobCodes(source);\n}\n\nexport function toLobCodes(values?: readonly string[]): AcordLobCode[] {\n const source = values?.filter((value) => typeof value === \"string\" && value.trim()) ?? [];\n if (source.length === 0) return [\"UN\"];\n const codes: AcordLobCode[] = [];\n for (const value of source) {\n const trimmed = value.trim();\n if (isLobCode(trimmed)) {\n codes.push(trimmed);\n continue;\n }\n if (trimmed.toUpperCase() === \"CRIM\") {\n codes.push(\"CRIME\");\n continue;\n }\n const mapped = LEGACY_POLICY_TYPE_TO_LOB[canonicalLegacyKey(trimmed)];\n if (mapped) {\n codes.push(...mapped);\n continue;\n }\n const upper = trimmed.toUpperCase();\n if (isLobCode(upper)) {\n codes.push(upper);\n continue;\n }\n codes.push(\"UN\");\n }\n return Array.from(new Set(codes));\n}\n\nexport function lobLabel(value: string): string {\n const code = resolveLobCode(value);\n return code ? ACORD_LOB_LABELS[code] : humanize(value);\n}\n\nexport function isPersonalLob(code: string): boolean {\n return isLobCode(code) && PERSONAL_LOB_CODES.has(code);\n}\n","import type { SourceSpanLocation } from \"./schemas\";\n\nexport interface SourceSpanIdInput {\n documentId: string;\n chunkId?: string;\n text?: string;\n location?: SourceSpanLocation;\n fieldPath?: string;\n}\n\nfunction normalizeText(text: string): string {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"undefined\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .filter((key) => record[key] !== undefined)\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nexport function stableHash(value: unknown): string {\n const input = stableStringify(value);\n let hashA = 0x811c9dc5;\n let hashB = 0x45d9f3b;\n for (let index = 0; index < input.length; index++) {\n const char = input.charCodeAt(index);\n hashA ^= char;\n hashA = Math.imul(hashA, 0x01000193);\n hashB ^= char + index;\n hashB = Math.imul(hashB, 0x27d4eb2d);\n }\n return `${(hashA >>> 0).toString(16).padStart(8, \"0\")}${(hashB >>> 0).toString(16).padStart(8, \"0\")}`;\n}\n\nexport function sourceSpanTextHash(text: string): string {\n return stableHash(normalizeText(text));\n}\n\nexport function buildSourceSpanId(input: SourceSpanIdInput): string {\n const hash = stableHash({\n documentId: input.documentId,\n chunkId: input.chunkId,\n fieldPath: input.fieldPath,\n location: input.location,\n text: input.text ? normalizeText(input.text) : undefined,\n }).slice(0, 16);\n\n return [input.documentId, input.chunkId, input.fieldPath, hash]\n .filter((part): part is string => !!part)\n .map((part) => part.replace(/[^a-zA-Z0-9_.:-]/g, \"_\"))\n .join(\":\");\n}\n","import {\n SourceChunkSchema,\n SourceSpanSchema,\n type SourceChunk,\n type SourceKind,\n type SourceSpan,\n type SourceSpanTableLocation,\n type SourceSpanUnit,\n} from \"./schemas\";\nimport { sourceSpanTextHash, stableHash } from \"./ids\";\n\nexport interface SourceTextUnitInput {\n documentId: string;\n sourceKind: SourceKind;\n text: string;\n pageStart?: number;\n pageEnd?: number;\n sectionId?: string;\n formNumber?: string;\n sourceUnit?: SourceSpanUnit;\n parentSpanId?: string;\n table?: SourceSpanTableLocation;\n metadata?: Record<string, string>;\n}\n\nexport interface SourcePageInput {\n documentId: string;\n sourceKind?: SourceKind;\n pageNumber: number;\n text: string;\n sectionId?: string;\n formNumber?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface SectionSourceSpanOptions {\n minSectionChars?: number;\n headingPattern?: RegExp;\n}\n\nexport interface SourceChunkOptions {\n maxChars?: number;\n overlapChars?: number;\n}\n\ntype SourceSpanWithOriginalIndex = SourceSpan & { __originalIndex: number };\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_.:-]/g, \"_\");\n}\n\nexport function buildSourceSpan(input: SourceTextUnitInput, localIndex = 0): SourceSpan {\n const text = normalizeWhitespace(input.text);\n const textHash = sourceSpanTextHash(text);\n const pagePart = input.pageStart ?? \"na\";\n const id = [\n sanitizeIdPart(input.documentId),\n \"span\",\n pagePart,\n localIndex,\n textHash.slice(0, 12),\n ].join(\":\");\n\n return SourceSpanSchema.parse({\n id,\n documentId: input.documentId,\n sourceKind: input.sourceKind,\n kind: input.sourceKind.endsWith(\"_pdf\") ? \"pdf_text\" : \"plain_text\",\n text,\n hash: textHash,\n textHash,\n pageStart: input.pageStart,\n pageEnd: input.pageEnd,\n sectionId: input.sectionId,\n formNumber: input.formNumber,\n sourceUnit: input.sourceUnit,\n parentSpanId: input.parentSpanId,\n table: input.table,\n location: {\n page: input.pageStart === input.pageEnd ? input.pageStart : undefined,\n startPage: input.pageStart,\n endPage: input.pageEnd,\n fieldPath: input.sectionId,\n },\n metadata: input.metadata,\n });\n}\n\nexport function buildPageSourceSpans(pages: SourcePageInput[]): SourceSpan[] {\n return pages\n .filter((page) => normalizeWhitespace(page.text).length > 0)\n .map((page, index) =>\n buildSourceSpan(\n {\n documentId: page.documentId,\n sourceKind: page.sourceKind ?? \"policy_pdf\",\n text: page.text,\n pageStart: page.pageNumber,\n pageEnd: page.pageNumber,\n sectionId: page.sectionId,\n formNumber: page.formNumber,\n sourceUnit: \"page\",\n metadata: {\n ...(page.metadata ?? {}),\n sourceUnit: page.metadata?.sourceUnit ?? \"page\",\n },\n },\n index,\n ),\n );\n}\n\nexport function buildSectionSourceSpans(\n pages: SourcePageInput[],\n options: SectionSourceSpanOptions = {},\n): SourceSpan[] {\n const headingPattern = options.headingPattern ?? /^(?:SECTION|COVERAGE|EXCLUSION|EXCLUSIONS|CONDITION|CONDITIONS|ENDORSEMENT|ENDORSEMENTS|DEFINITION|DEFINITIONS|DECLARATIONS?|SCHEDULE|FORM)\\b[\\s:.-]*(.*)$/i;\n const minSectionChars = options.minSectionChars ?? 120;\n const spans: SourceSpan[] = [];\n\n for (const page of pages) {\n const sections = splitPageIntoSections(page.text, headingPattern, minSectionChars);\n for (const section of sections) {\n spans.push(buildSourceSpan(\n {\n documentId: page.documentId,\n sourceKind: page.sourceKind ?? \"policy_pdf\",\n text: section.text,\n pageStart: page.pageNumber,\n pageEnd: page.pageNumber,\n sectionId: section.title,\n formNumber: inferFormNumber(section.text),\n sourceUnit: \"section\",\n metadata: {\n ...(page.metadata ?? {}),\n sourceUnit: \"section_candidate\",\n },\n },\n spans.length,\n ));\n }\n }\n\n return spans;\n}\n\nexport function buildTextSourceSpans(input: SourceTextUnitInput, options: SourceChunkOptions = {}): SourceSpan[] {\n const maxChars = options.maxChars ?? 4000;\n const overlapChars = Math.min(options.overlapChars ?? 0, Math.max(0, maxChars - 1));\n const text = normalizeWhitespace(input.text);\n if (!text) return [];\n\n const spans: SourceSpan[] = [];\n let cursor = 0;\n while (cursor < text.length) {\n const end = Math.min(text.length, cursor + maxChars);\n const unitText = text.slice(cursor, end);\n spans.push(buildSourceSpan({ ...input, text: unitText }, spans.length));\n if (end === text.length) break;\n cursor = end - overlapChars;\n }\n\n return spans;\n}\n\nexport function chunkSourceSpans(spans: SourceSpan[], options: SourceChunkOptions = {}): SourceChunk[] {\n const maxChars = options.maxChars ?? 6000;\n const chunks: SourceChunk[] = [];\n let current: SourceSpan[] = [];\n let currentLength = 0;\n const spansForChunking = filterChunkableSourceSpans(spans);\n\n const flush = () => {\n if (current.length === 0) return;\n const text = current.map((span) => span.text).join(\"\\n\\n\");\n const textHash = sourceSpanTextHash(text);\n const pageStart = firstNumber(current.map((span) => span.pageStart));\n const pageEnd = lastNumber(current.map((span) => span.pageEnd ?? span.pageStart));\n const chunk: SourceChunk = {\n id: `${sanitizeIdPart(current[0].documentId)}:source_chunk:${chunks.length}:${stableHash({\n sourceSpanIds: current.map((span) => span.id),\n textHash,\n }).slice(0, 12)}`,\n documentId: current[0].documentId,\n sourceSpanIds: current.map((span) => span.id),\n text,\n textHash,\n pageStart,\n pageEnd,\n metadata: mergeMetadata(current),\n };\n chunks.push(SourceChunkSchema.parse(chunk));\n current = [];\n currentLength = 0;\n };\n\n for (const span of spansForChunking) {\n const nextLength = currentLength + span.text.length + (current.length > 0 ? 2 : 0);\n if (current.length > 0 && nextLength > maxChars) {\n flush();\n }\n current.push(span);\n currentLength += span.text.length + (current.length > 1 ? 2 : 0);\n }\n flush();\n\n return chunks;\n}\n\nexport function normalizeSourceSpans(spans: SourceSpan[]): SourceSpan[] {\n const droppedParentSpanIds = new Set<string>();\n const cleaned: SourceSpanWithOriginalIndex[] = [];\n\n for (const [index, span] of spans.entries()) {\n if (span.parentSpanId && droppedParentSpanIds.has(span.parentSpanId)) continue;\n const normalized = normalizeSourceSpanText(span);\n if (!normalized) {\n droppedParentSpanIds.add(span.id);\n continue;\n }\n cleaned.push({ ...normalized, __originalIndex: index });\n }\n\n return mergeTextRuns(cleaned).map(({ __originalIndex: _index, ...span }) => span);\n}\n\nfunction sourceUnit(span: SourceSpan): string | undefined {\n return span.sourceUnit ?? span.metadata?.sourceUnit;\n}\n\nfunction spanPage(span: SourceSpan): number | undefined {\n return span.pageStart ?? span.location?.page ?? span.location?.startPage;\n}\n\nfunction normalizeSourceSpanText(span: SourceSpan): SourceSpan | undefined {\n const unit = sourceUnit(span);\n const text = normalizeWhitespace(span.text);\n if (!text) return undefined;\n if (isDiscardableBoilerplate(text, unit)) return undefined;\n\n const cleanedText = cleanBoilerplateLines(text);\n if (!cleanedText) return undefined;\n if (cleanedText === text) return span;\n\n return retextSpan(span, cleanedText, {\n boilerplateRemoved: \"true\",\n removedBoilerplateText: removedBoilerplateLines(text).join(\" | \").slice(0, 500),\n });\n}\n\nfunction isDiscardableBoilerplate(text: string, unit?: string): boolean {\n const cleaned = normalizeWhitespace(text.replace(/\\bColumn\\s+\\d+:\\s*/gi, \"\"));\n if (/^SPECIMEN POLICY\\s+[-—]\\s+FOR TESTING ONLY$/i.test(cleaned)) return true;\n if (/^Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n if (/^[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}$/i.test(cleaned)) return true;\n if (/^[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}\\s*\\|\\s*Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n if (unit === \"table_row\" && /^[^|]{0,40}\\|\\s*Page\\s+\\d+\\s+of\\s+\\d+$/i.test(cleaned)) return true;\n return false;\n}\n\nfunction isBoilerplateLine(line: string): boolean {\n const cleaned = normalizeWhitespace(line.replace(/\\bColumn\\s+\\d+:\\s*/gi, \"\"));\n return isDiscardableBoilerplate(cleaned) ||\n /^THIS IS A CLAIMS-MADE AND REPORTED POLICY\\.? PLEASE READ IT CAREFULLY\\.?$/i.test(cleaned);\n}\n\nfunction removedBoilerplateLines(text: string): string[] {\n return text\n .split(/\\s{2,}|\\r?\\n/)\n .map(normalizeWhitespace)\n .filter((line) => line && isBoilerplateLine(line));\n}\n\nfunction cleanBoilerplateLines(text: string): string {\n const withoutInlineBoilerplate = text\n .replace(/\\b(?:Column\\s+\\d+:\\s*)?[A-Z]{2,}(?:-[A-Z0-9]{2,})+\\s+\\d{2}\\s+\\d{2}\\s+(?:\\|\\s*)?(?:Column\\s+\\d+:\\s*)?Page\\s+\\d+\\s+of\\s+\\d+\\b/gi, \" \")\n .replace(/\\bSPECIMEN POLICY\\s+[-—]\\s+FOR TESTING ONLY\\b/gi, \" \")\n .replace(/\\bPage\\s+\\d+\\s+of\\s+\\d+\\b/gi, \" \");\n const lines = withoutInlineBoilerplate.split(/\\r?\\n/);\n const filtered = lines\n .map(normalizeWhitespace)\n .filter((line) => line && !isBoilerplateLine(line));\n return normalizeWhitespace(filtered.join(\" \"));\n}\n\nfunction shouldMergeTextSpan(left: SourceSpanWithOriginalIndex, right: SourceSpanWithOriginalIndex): boolean {\n if (sourceUnit(left) !== \"text\" || sourceUnit(right) !== \"text\") return false;\n if (spanPage(left) !== spanPage(right)) return false;\n if ((left.metadata?.elementType === \"title\") || (right.metadata?.elementType === \"title\")) return false;\n const leftText = normalizeWhitespace(left.text);\n const rightText = normalizeWhitespace(right.text);\n if (!leftText || !rightText) return false;\n if (/[:.;!?)]$/.test(leftText)) return false;\n if (/^(?:[A-Z][A-Z0-9 &/(),.-]{8,}|Item\\s+\\d+|Section\\s+\\d+|Part\\s+[A-Z]\\b)/.test(rightText)) return false;\n return /^[a-z(]/.test(rightText) ||\n /\\b(?:a|an|and|any|as|at|by|for|from|in|into|may|must|of|or|that|the|this|to|with|within|you|your)$/i.test(leftText);\n}\n\nfunction mergeTextRuns(spans: SourceSpanWithOriginalIndex[]): SourceSpanWithOriginalIndex[] {\n const result: SourceSpanWithOriginalIndex[] = [];\n let current: SourceSpanWithOriginalIndex | undefined;\n\n for (const span of spans) {\n if (current && shouldMergeTextSpan(current, span)) {\n current = mergeTextSpanPair(current, span);\n continue;\n }\n if (current) result.push(current);\n current = span;\n }\n if (current) result.push(current);\n return result;\n}\n\nfunction mergeTextSpanPair(left: SourceSpanWithOriginalIndex, right: SourceSpanWithOriginalIndex): SourceSpanWithOriginalIndex {\n const text = normalizeWhitespace(`${left.text} ${right.text}`);\n const merged = retextSpan(left, text, {\n mergedSourceSpanIds: [left.metadata?.mergedSourceSpanIds, left.id, right.id, right.metadata?.mergedSourceSpanIds]\n .filter(Boolean)\n .join(\",\"),\n sourceSpanNormalization: \"merged_text_run\",\n });\n return {\n ...merged,\n bbox: [...(left.bbox ?? []), ...(right.bbox ?? [])],\n pageEnd: right.pageEnd ?? left.pageEnd,\n location: {\n ...left.location,\n endPage: right.location?.endPage ?? right.pageEnd ?? left.location?.endPage,\n },\n __originalIndex: left.__originalIndex,\n };\n}\n\nfunction retextSpan(span: SourceSpan, text: string, metadata: Record<string, string>): SourceSpan {\n const textHash = sourceSpanTextHash(text);\n return SourceSpanSchema.parse({\n ...span,\n id: `${span.id.split(\":\").slice(0, -1).join(\":\")}:${textHash.slice(0, 12)}`,\n text,\n hash: textHash,\n textHash,\n metadata: {\n ...(span.metadata ?? {}),\n ...metadata,\n },\n });\n}\n\nfunction filterChunkableSourceSpans(spans: SourceSpan[]): SourceSpan[] {\n const rowIds = new Set(\n spans\n .filter((span) => sourceUnit(span) === \"table_row\")\n .map((span) => span.id),\n );\n if (rowIds.size === 0) return spans;\n return spans.filter((span) => {\n if (sourceUnit(span) !== \"table_cell\") return true;\n const rowId = span.parentSpanId ?? span.table?.rowSpanId ?? span.metadata?.rowSpanId;\n return !rowId || !rowIds.has(rowId);\n });\n}\n\nfunction splitPageIntoSections(\n text: string,\n headingPattern: RegExp,\n minSectionChars: number,\n): Array<{ title: string; text: string }> {\n const lines = text.split(/\\r?\\n/);\n const sections: Array<{ title: string; lines: string[] }> = [];\n let current: { title: string; lines: string[] } | undefined;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n const match = line.match(headingPattern);\n if (match) {\n if (current) sections.push(current);\n const suffix = match[1]?.trim();\n current = {\n title: normalizeWhitespace(suffix ? `${line}` : line).slice(0, 120),\n lines: [line],\n };\n continue;\n }\n current?.lines.push(rawLine);\n }\n if (current) sections.push(current);\n\n return sections\n .map((section) => ({\n title: section.title,\n text: normalizeWhitespace(section.lines.join(\"\\n\")),\n }))\n .filter((section) => section.text.length >= minSectionChars);\n}\n\nfunction inferFormNumber(text: string): string | undefined {\n return text.match(/\\b[A-Z]{2,8}\\s+\\d{2,5}(?:\\s+\\d{2,4})?\\b/)?.[0];\n}\n\nfunction firstNumber(values: Array<number | undefined>): number | undefined {\n return values.find((value): value is number => typeof value === \"number\");\n}\n\nfunction lastNumber(values: Array<number | undefined>): number | undefined {\n return [...values].reverse().find((value): value is number => typeof value === \"number\");\n}\n\nfunction mergeMetadata(spans: SourceSpan[]): Record<string, string> {\n const metadata: Record<string, string> = {};\n for (const span of spans) {\n for (const [key, value] of Object.entries(span.metadata ?? {})) {\n metadata[key] = metadata[key] ? `${metadata[key]},${value}` : value;\n }\n if (span.formNumber) metadata.formNumber = span.formNumber;\n if (span.sectionId) metadata.sectionId = span.sectionId;\n if (span.sourceKind) metadata.sourceKind = span.sourceKind;\n }\n return metadata;\n}\n","import type {\n ApplicationField,\n ApplicationQuestionCondition,\n ApplicationQuestionGraph,\n ApplicationQuestionNode,\n ApplicationState,\n} from \"../schemas/application\";\n\nexport interface BuildQuestionGraphOptions {\n id: string;\n version?: string;\n title?: string;\n applicationType?: string | null;\n source?: ApplicationQuestionGraph[\"source\"];\n}\n\nexport function buildQuestionGraphFromFields(\n fields: ApplicationField[],\n options: BuildQuestionGraphOptions,\n): ApplicationQuestionGraph {\n const sectionNodes = new Map<string, ApplicationQuestionNode>();\n const nodes: ApplicationQuestionNode[] = [];\n\n for (const [index, field] of fields.entries()) {\n const sectionId = stableNodeId([\"section\", field.section]);\n let sectionNode = sectionNodes.get(sectionId);\n if (!sectionNode) {\n sectionNode = {\n id: sectionId,\n nodeType: \"group\",\n label: field.section,\n order: sectionNodes.size,\n children: [],\n };\n sectionNodes.set(sectionId, sectionNode);\n nodes.push(sectionNode);\n }\n\n const child: ApplicationQuestionNode = {\n id: field.fieldAnchorId ?? stableNodeId([\"field\", field.section, field.id || field.label]),\n nodeType: field.fieldType === \"table\" ? \"table\" : \"question\",\n fieldId: field.id,\n fieldPath: `${field.section}.${field.id}`,\n parentId: sectionId,\n order: index,\n label: field.label,\n section: field.section,\n fieldType: field.fieldType,\n required: field.required,\n options: field.options,\n columns: field.columns,\n condition: field.condition\n ? {\n dependsOn: field.condition.dependsOn,\n operator: \"equals\",\n value: field.condition.whenValue,\n whenValue: field.condition.whenValue,\n }\n : undefined,\n };\n sectionNode.children = [...(sectionNode.children ?? []), child];\n }\n\n return normalizeApplicationQuestionGraph({\n id: options.id,\n version: options.version ?? \"v1\",\n title: options.title,\n applicationType: options.applicationType,\n source: options.source ?? \"generated\",\n rootNodeIds: nodes.map((node) => node.id),\n nodes,\n });\n}\n\nexport function normalizeApplicationQuestionGraph(graph: ApplicationQuestionGraph): ApplicationQuestionGraph {\n const normalizedNodes = graph.nodes\n .map((node, index) => normalizeNode(node, undefined, index))\n .sort(compareNodes);\n\n return {\n ...graph,\n rootNodeIds: graph.rootNodeIds?.length\n ? graph.rootNodeIds\n : normalizedNodes.map((node) => node.id),\n nodes: normalizedNodes,\n };\n}\n\nexport function flattenQuestionGraph(graph: ApplicationQuestionGraph): ApplicationField[] {\n const fields: ApplicationField[] = [];\n\n for (const node of graph.nodes.sort(compareNodes)) {\n collectFields(node, fields);\n }\n\n return fields;\n}\n\nexport function getActiveApplicationFields(state: Pick<ApplicationState, \"fields\" | \"questionGraph\">): ApplicationField[] {\n const valueByFieldId = new Map(\n state.fields\n .filter((field) => field.value !== undefined && field.value.trim() !== \"\")\n .map((field) => [field.id, field.value ?? \"\"]),\n );\n const graphConditions = new Map<string, ApplicationQuestionCondition>();\n\n for (const node of state.questionGraph?.nodes ?? []) {\n collectNodeConditions(node, graphConditions);\n }\n\n return state.fields.filter((field) => {\n const graphCondition = graphConditions.get(field.id);\n return isConditionSatisfied(field.condition, valueByFieldId)\n && isQuestionConditionSatisfied(graphCondition, valueByFieldId);\n });\n}\n\nexport function getNextApplicationQuestions(\n state: Pick<ApplicationState, \"fields\" | \"questionGraph\" | \"batches\" | \"currentBatchIndex\">,\n limit = 8,\n): ApplicationField[] {\n const activeUnfilled = getActiveApplicationFields(state).filter((field) => !field.value);\n if (activeUnfilled.length === 0) return [];\n\n const currentBatchIds = state.batches?.[state.currentBatchIndex] ?? [];\n const currentBatchFields = activeUnfilled.filter((field) => currentBatchIds.includes(field.id));\n return (currentBatchFields.length > 0 ? currentBatchFields : activeUnfilled).slice(0, limit);\n}\n\nfunction normalizeNode(\n node: ApplicationQuestionNode,\n parentId: string | undefined,\n index: number,\n): ApplicationQuestionNode {\n const children = node.children?.map((child, childIndex) => normalizeNode(child, node.id, childIndex));\n return {\n ...node,\n parentId: node.parentId ?? parentId,\n order: node.order ?? index,\n fieldPath: node.fieldPath ?? (node.fieldId ? [node.section, node.fieldId].filter(Boolean).join(\".\") : undefined),\n children,\n };\n}\n\nfunction collectFields(node: ApplicationQuestionNode, fields: ApplicationField[]): void {\n if ((node.nodeType === \"question\" || node.nodeType === \"table\") && node.fieldId) {\n fields.push({\n id: node.fieldId,\n label: node.label,\n section: node.section ?? \"General\",\n fieldType: node.fieldType ?? (node.nodeType === \"table\" ? \"table\" : \"text\"),\n required: node.required ?? false,\n options: node.options,\n columns: node.columns,\n condition: node.condition\n ? {\n dependsOn: node.condition.dependsOn,\n whenValue: node.condition.value ?? node.condition.whenValue ?? \"\",\n }\n : undefined,\n fieldAnchorId: node.id,\n });\n }\n\n for (const child of node.children ?? []) {\n collectFields(child, fields);\n }\n}\n\nfunction collectNodeConditions(node: ApplicationQuestionNode, conditions: Map<string, ApplicationQuestionCondition>): void {\n if (node.fieldId && node.condition) {\n conditions.set(node.fieldId, node.condition);\n }\n for (const child of node.children ?? []) {\n collectNodeConditions(child, conditions);\n }\n}\n\nfunction isConditionSatisfied(\n condition: ApplicationField[\"condition\"] | undefined,\n valueByFieldId: Map<string, string>,\n): boolean {\n if (!condition) return true;\n const current = valueByFieldId.get(condition.dependsOn);\n return normalizeValue(current) === normalizeValue(condition.whenValue);\n}\n\nfunction isQuestionConditionSatisfied(\n condition: ApplicationQuestionCondition | undefined,\n valueByFieldId: Map<string, string>,\n): boolean {\n if (!condition) return true;\n const current = valueByFieldId.get(condition.dependsOn);\n const expected = condition.value ?? condition.whenValue;\n const values = condition.values ?? (expected !== undefined ? [expected] : []);\n\n switch (condition.operator) {\n case \"exists\":\n return current !== undefined && current.trim() !== \"\";\n case \"not_equals\":\n return normalizeValue(current) !== normalizeValue(expected);\n case \"in\":\n return values.map(normalizeValue).includes(normalizeValue(current));\n case \"not_in\":\n return !values.map(normalizeValue).includes(normalizeValue(current));\n case \"equals\":\n default:\n return normalizeValue(current) === normalizeValue(expected);\n }\n}\n\nfunction compareNodes(a: ApplicationQuestionNode, b: ApplicationQuestionNode): number {\n return (a.order ?? 0) - (b.order ?? 0) || a.id.localeCompare(b.id);\n}\n\nfunction normalizeValue(value: string | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction stableNodeId(parts: string[]): string {\n return parts\n .join(\":\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n || \"node\";\n}\n","import type {\n ApplicationContextProposal,\n ApplicationField,\n ApplicationPacket,\n ApplicationQuestionGraph,\n ApplicationState,\n ApplicationTemplate,\n} from \"../schemas/application\";\nimport { buildApplicationQualityReport, type ApplicationQualityReport } from \"./quality\";\nimport {\n buildQuestionGraphFromFields,\n flattenQuestionGraph,\n getActiveApplicationFields,\n getNextApplicationQuestions,\n normalizeApplicationQuestionGraph,\n} from \"./question-graph\";\n\nexport interface CreateApplicationRunParams {\n applicationId: string;\n template: ApplicationTemplate;\n now?: number;\n}\n\nexport interface ApplyApplicationAnswer {\n fieldId: string;\n value: string;\n source?: string;\n confidence?: ApplicationField[\"confidence\"];\n sourceSpanIds?: string[];\n userSourceSpanIds?: string[];\n}\n\nexport function extractQuestionGraphFromFields(\n fields: ApplicationField[],\n options: {\n id: string;\n version?: string;\n title?: string;\n applicationType?: string | null;\n source?: ApplicationQuestionGraph[\"source\"];\n },\n): ApplicationQuestionGraph {\n return buildQuestionGraphFromFields(fields, options);\n}\n\nexport function createApplicationRun(params: CreateApplicationRunParams): ApplicationState {\n const now = params.now ?? Date.now();\n const graph = normalizeApplicationQuestionGraph(params.template.questionGraph);\n const fields = params.template.fields?.length\n ? params.template.fields\n : flattenQuestionGraph(graph);\n\n return {\n id: params.applicationId,\n templateId: params.template.id,\n templateVersion: params.template.version,\n templateSnapshot: params.template,\n title: params.template.title,\n applicationType: params.template.applicationType,\n questionGraph: graph,\n fields,\n currentBatchIndex: 0,\n status: \"collecting\",\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport function planNextApplicationQuestions(\n state: Pick<ApplicationState, \"fields\" | \"questionGraph\" | \"batches\" | \"currentBatchIndex\">,\n limit?: number,\n): { status: \"complete\" | \"needs_answers\"; fieldIds: string[]; fields: ApplicationField[] } {\n const fields = getNextApplicationQuestions(state, limit);\n return {\n status: fields.length === 0 ? \"complete\" : \"needs_answers\",\n fieldIds: fields.map((field) => field.id),\n fields,\n };\n}\n\nexport function applyApplicationAnswers(\n state: ApplicationState,\n answers: ApplyApplicationAnswer[],\n now = Date.now(),\n): ApplicationState {\n const answerByFieldId = new Map(answers.map((answer) => [answer.fieldId, answer]));\n const fields = state.fields.map((field) => {\n const answer = answerByFieldId.get(field.id);\n if (!answer) return field;\n return {\n ...field,\n value: answer.value,\n source: answer.source ?? \"user\",\n confidence: answer.confidence ?? \"confirmed\",\n sourceSpanIds: answer.sourceSpanIds ?? field.sourceSpanIds,\n userSourceSpanIds: answer.userSourceSpanIds ?? field.userSourceSpanIds,\n validationStatus: \"valid\" as const,\n };\n });\n\n const nextState: ApplicationState = {\n ...state,\n fields,\n updatedAt: now,\n };\n\n const nextQuestions = planNextApplicationQuestions(nextState);\n return {\n ...nextState,\n status: nextQuestions.status === \"complete\" ? \"confirming\" : nextState.status,\n qualityReport: buildApplicationQualityReport(nextState),\n };\n}\n\nexport function proposeContextWrites(state: ApplicationState): ApplicationContextProposal[] {\n return getActiveApplicationFields(state)\n .filter((field) => field.value && field.confidence && field.confidence !== \"low\")\n .map((field) => ({\n id: `${state.id}:${field.id}:context`,\n fieldId: field.id,\n key: stableContextKey(field),\n value: field.value ?? \"\",\n category: field.section,\n source: field.source?.startsWith(\"lookup:\") ? \"lookup\" : \"application\",\n confidence: field.confidence ?? \"medium\",\n sourceSpanIds: field.sourceSpanIds,\n userSourceSpanIds: field.userSourceSpanIds,\n }));\n}\n\nexport function buildApplicationPacket(\n state: ApplicationState,\n options: { submissionNotes?: string; now?: number } = {},\n): ApplicationPacket {\n const qualityReport = buildApplicationQualityReport(state);\n const activeFields = getActiveApplicationFields(state);\n const answers = activeFields\n .filter((field) => field.value)\n .map((field) => ({\n fieldId: field.id,\n label: field.label,\n section: field.section,\n value: field.value ?? \"\",\n source: field.source ?? \"unknown\",\n confidence: field.confidence,\n sourceSpanIds: field.sourceSpanIds,\n userSourceSpanIds: field.userSourceSpanIds,\n }));\n\n const missingFieldIds = activeFields\n .filter((field) => field.required && !field.value)\n .map((field) => field.id);\n\n return {\n id: `${state.id}:packet`,\n applicationId: state.id,\n title: state.title ?? state.applicationType ?? \"Insurance Application\",\n status: qualityReport.qualityGateStatus === \"failed\" || missingFieldIds.length > 0 ? \"draft\" : \"broker_ready\",\n answers,\n missingFieldIds,\n qualityReport,\n submissionNotes: options.submissionNotes,\n createdAt: options.now ?? Date.now(),\n };\n}\n\nexport function validateApplicationPacket(packet: ApplicationPacket): ApplicationQualityReport {\n const issues = [...packet.qualityReport.issues];\n\n if (packet.missingFieldIds.length > 0) {\n issues.push({\n code: \"packet_missing_required_answers\",\n severity: \"blocking\",\n message: \"Packet still has required unanswered application fields.\",\n });\n }\n\n return {\n ...packet.qualityReport,\n issues,\n qualityGateStatus: issues.some((issue) => issue.severity === \"blocking\")\n ? \"failed\"\n : packet.qualityReport.qualityGateStatus,\n };\n}\n\nfunction stableContextKey(field: ApplicationField): string {\n return `${field.section}.${field.label}`\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n","import type { TokenUsage } from \"../core/types\";\nimport type { ModelTaskKind } from \"../core/model-budget\";\nimport { resolveModelBudget } from \"../core/model-budget\";\nimport { pLimit } from \"../core/concurrency\";\nimport type { ApplicationState, ApplicationField } from \"../schemas/application\";\nimport type {\n ApplicationPipelineConfig,\n BuildApplicationPacketInput,\n BuildApplicationPacketResult,\n ContextProposalResult,\n CreateApplicationRunInput,\n ApplicationNextQuestions,\n ProcessApplicationInput,\n ProcessApplicationResult,\n ProcessReplyInput,\n ProcessReplyResult,\n} from \"./types\";\n\nimport { classifyApplication } from \"./agents/classifier\";\nimport { extractFields } from \"./agents/field-extractor\";\nimport { autoFillFromContext, backfillFromPriorAnswers } from \"./agents/auto-filler\";\nimport { batchQuestions } from \"./agents/batcher\";\nimport { classifyReplyIntent } from \"./agents/reply-router\";\nimport { parseAnswers } from \"./agents/answer-parser\";\nimport { fillFromLookup } from \"./agents/lookup-filler\";\nimport { generateBatchEmail } from \"./agents/email-generator\";\nimport { buildApplicationQualityReport, reviewBatchEmail } from \"./quality\";\nimport { shouldFailQualityGate } from \"../core/quality\";\nimport { planApplicationWorkflow, planReplyActions } from \"./workflow\";\nimport { buildTextSourceSpans, sourceSpanTextHash } from \"../source\";\nimport {\n buildApplicationPacket as buildApplicationPacketFromState,\n createApplicationRun as createApplicationRunFromTemplate,\n planNextApplicationQuestions,\n proposeContextWrites as proposeContextWritesFromState,\n validateApplicationPacket,\n} from \"./intake\";\nimport { buildQuestionGraphFromFields, getActiveApplicationFields } from \"./question-graph\";\nimport type { DocumentChunk } from \"../storage/chunk-types\";\n\nexport function createApplicationPipeline(config: ApplicationPipelineConfig) {\n const {\n generateText,\n generateObject,\n applicationStore,\n templateStore,\n documentStore,\n memoryStore,\n backfillProvider,\n orgContext = [],\n concurrency = 4,\n onTokenUsage,\n onProgress,\n log,\n providerOptions,\n qualityGate = \"warn\",\n modelCapabilities,\n modelBudgetConstraints,\n } = config;\n\n const limit = pLimit(concurrency);\n let totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n function trackUsage(usage?: TokenUsage) {\n if (usage) {\n totalUsage.inputTokens += usage.inputTokens;\n totalUsage.outputTokens += usage.outputTokens;\n onTokenUsage?.(usage);\n }\n }\n\n function resolveBudget(taskKind: ModelTaskKind, hintTokens: number) {\n return resolveModelBudget({\n taskKind,\n hintTokens,\n modelCapabilities,\n constraint: modelBudgetConstraints?.[taskKind],\n });\n }\n\n /**\n * Process a new application PDF through the full intake pipeline:\n * classify -> extract fields -> backfill -> auto-fill -> batch questions\n */\n async function processApplication(\n input: ProcessApplicationInput,\n ): Promise<ProcessApplicationResult> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n const { pdfBase64, context } = input;\n const applicationProviderOptions = input.sourceSpans?.length\n ? { ...providerOptions, sourceSpans: input.sourceSpans }\n : providerOptions;\n const id = input.applicationId ?? `app-${Date.now()}`;\n const now = Date.now();\n if (input.template) {\n await templateStore?.saveTemplate(input.template);\n }\n\n let state: ApplicationState = {\n id,\n templateId: input.template?.id,\n templateVersion: input.template?.version,\n templateSnapshot: input.template,\n pdfBase64: undefined,\n title: undefined,\n applicationType: null,\n questionGraph: input.questionGraph ?? input.template?.questionGraph,\n fields: [],\n qualityReport: undefined,\n batches: undefined,\n currentBatchIndex: 0,\n status: \"classifying\",\n createdAt: now,\n updatedAt: now,\n };\n\n onProgress?.(\"Classifying document...\");\n await applicationStore?.save(state);\n\n let classifyResult;\n try {\n const { result, usage: classifyUsage } = await classifyApplication(\n pdfBase64,\n generateObject,\n applicationProviderOptions,\n resolveBudget(\"application_classify\", 512).maxTokens,\n );\n trackUsage(classifyUsage);\n classifyResult = result;\n } catch (error) {\n await log?.(`Classification failed, treating as non-application: ${error instanceof Error ? error.message : String(error)}`);\n classifyResult = { isApplication: false, confidence: 0, applicationType: null };\n }\n\n if (!classifyResult.isApplication) {\n state.status = \"complete\";\n state.updatedAt = Date.now();\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n state.applicationType = classifyResult.applicationType;\n state.status = \"extracting\";\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 2: Extract Fields --\n onProgress?.(\"Extracting form fields...\");\n let fields: ApplicationField[];\n try {\n const { fields: extractedFields, usage: extractUsage } = await extractFields(\n pdfBase64,\n generateObject,\n applicationProviderOptions,\n resolveBudget(\"application_extract_fields\", 8192).maxTokens,\n );\n trackUsage(extractUsage);\n fields = extractedFields;\n } catch (error) {\n await log?.(`Field extraction failed: ${error instanceof Error ? error.message : String(error)}`);\n fields = [];\n }\n\n if (fields.length === 0) {\n // No fields extracted — complete gracefully rather than crashing\n await log?.(\"No fields extracted, completing pipeline with empty result\");\n state.status = \"complete\";\n state.updatedAt = Date.now();\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n state.fields = fields;\n state.questionGraph = input.questionGraph\n ?? input.template?.questionGraph\n ?? buildQuestionGraphFromFields(fields, {\n id: `${id}:graph`,\n title: classifyResult.applicationType ?? undefined,\n applicationType: classifyResult.applicationType,\n source: \"pdf\",\n });\n state.title = classifyResult.applicationType ?? undefined;\n state.status = \"auto_filling\";\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 3: Backfill + Auto-Fill --\n onProgress?.(`Auto-filling ${fields.length} fields...`);\n\n let workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: Boolean(backfillProvider),\n orgContextCount: orgContext.length,\n hasDocumentStore: Boolean(documentStore),\n hasMemoryStore: Boolean(memoryStore),\n });\n\n // 3a: Vector-based backfill from prior answers\n if (workflowPlan.runBackfill && backfillProvider) {\n try {\n const priorAnswers = await backfillFromPriorAnswers(state.fields, backfillProvider);\n for (const pa of priorAnswers) {\n const field = state.fields.find((f) => f.id === pa.fieldId);\n if (field && !field.value && pa.relevance > 0.8) {\n field.value = pa.value;\n field.source = `backfill: ${pa.source}`;\n field.confidence = pa.confidence ?? \"high\";\n field.validationStatus = pa.sourceSpanIds?.length ? \"valid\" : \"needs_review\";\n field.sourceSpanIds = pa.sourceSpanIds;\n field.userSourceSpanIds = pa.userSourceSpanIds;\n }\n }\n } catch (e) {\n await log?.(`Backfill failed: ${e}`);\n }\n }\n\n workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: false,\n orgContextCount: orgContext.length,\n hasDocumentStore: Boolean(documentStore),\n hasMemoryStore: Boolean(memoryStore),\n });\n\n const fillTasks: Promise<void>[] = [];\n\n // 3b: Context-based auto-fill (LLM agent)\n if (workflowPlan.runContextAutoFill) {\n fillTasks.push(\n limit(async () => {\n const unfilledFields = state.fields.filter((f) => !f.value);\n if (unfilledFields.length === 0) return;\n\n try {\n const { result: autoFillResult, usage: afUsage } = await autoFillFromContext(\n unfilledFields,\n orgContext,\n generateObject,\n providerOptions,\n resolveBudget(\"application_auto_fill\", 4096).maxTokens,\n );\n trackUsage(afUsage);\n\n for (const match of autoFillResult.matches) {\n const field = state.fields.find((f) => f.id === match.fieldId);\n if (field && !field.value) {\n field.value = match.value;\n field.source = `auto-fill: ${match.contextKey}`;\n field.confidence = match.confidence;\n field.validationStatus = \"valid\";\n }\n }\n } catch (e) {\n await log?.(`Auto-fill from context failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }),\n );\n }\n\n // 3c: Document-based backfill (search policies/quotes for matching data)\n if (workflowPlan.documentSearchFields.length > 0 && memoryStore) {\n fillTasks.push(\n (async () => {\n try {\n const searchPromises = workflowPlan.documentSearchFields.map((f) =>\n limit(async () => {\n const chunks = await memoryStore.search(`${f.section} ${f.label}`, { limit: 3 });\n const match = selectMemoryBackfillMatch(f, chunks);\n if (match) {\n const field = state.fields.find((candidate) => candidate.id === f.id);\n if (field && !field.value) {\n field.value = match.value;\n field.source = match.source;\n field.confidence = match.confidence;\n field.validationStatus = match.sourceSpanIds.length > 0 ? \"valid\" : \"needs_review\";\n field.sourceSpanIds = match.sourceSpanIds.length > 0 ? match.sourceSpanIds : undefined;\n }\n }\n }),\n );\n await Promise.all(searchPromises);\n } catch (e) {\n await log?.(`Document backfill search failed: ${e}`);\n }\n })(),\n );\n }\n\n await Promise.all(fillTasks);\n\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n // -- Phase 4: Batch remaining questions --\n workflowPlan = planApplicationWorkflow({\n fields: state.fields,\n hasBackfillProvider: false,\n orgContextCount: 0,\n hasDocumentStore: false,\n hasMemoryStore: false,\n });\n const unfilledFields = getActiveApplicationFields(state).filter((field) => !field.value);\n if (workflowPlan.runBatching) {\n onProgress?.(`Batching ${unfilledFields.length} remaining questions...`);\n state.status = \"batching\";\n\n try {\n const { result: batchResult, usage: batchUsage } = await batchQuestions(\n unfilledFields,\n generateObject,\n providerOptions,\n resolveBudget(\"application_batch\", 2048).maxTokens,\n );\n trackUsage(batchUsage);\n state.batches = batchResult.batches;\n } catch (error) {\n await log?.(`Batching failed, using single-batch fallback: ${error instanceof Error ? error.message : String(error)}`);\n // Fallback: put all unfilled field IDs into a single batch\n state.batches = [unfilledFields.map((f) => f.id)];\n }\n\n state.currentBatchIndex = 0;\n state.status = \"collecting\";\n } else {\n state.status = \"confirming\";\n }\n\n state.contextProposals = proposeContextWritesFromState(state);\n state.qualityReport = buildApplicationQualityReport(state);\n\n state.updatedAt = Date.now();\n await applicationStore?.save(state);\n\n if (shouldFailQualityGate(qualityGate, state.qualityReport.qualityGateStatus)) {\n throw new Error(\"Application quality gate failed. See state.qualityReport for blocking issues.\");\n }\n\n const filledCount = state.fields.filter((f) => f.value).length;\n onProgress?.(`Application processed: ${filledCount}/${state.fields.length} fields filled, ${state.batches?.length ?? 0} batches to collect.`);\n\n return { state, tokenUsage: totalUsage, reviewReport: state.qualityReport };\n }\n\n /**\n * Process a user reply (email, chat message) for an active application.\n * Routes through: intent classification -> answer parsing / lookup / explanation\n */\n async function processReply(input: ProcessReplyInput): Promise<ProcessReplyResult> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n const { applicationId, replyText, context } = input;\n const replySourceSpanIds = input.replySourceSpanIds?.length\n ? input.replySourceSpanIds\n : buildTextSourceSpans({\n documentId: `${applicationId}:reply:${sourceSpanTextHash(replyText).slice(0, 12)}`,\n sourceKind: \"email\",\n text: replyText,\n metadata: { applicationId },\n }).map((span) => span.id);\n\n // Load state\n let state: ApplicationState | null = null;\n if (applicationStore) {\n state = await applicationStore.get(applicationId);\n }\n if (!state) {\n throw new Error(`Application ${applicationId} not found`);\n }\n\n // Get current batch fields\n const currentBatchFieldIds = state.batches?.[state.currentBatchIndex] ?? [];\n const activeFields = getActiveApplicationFields(state);\n const currentBatchFields = activeFields.filter((f) =>\n currentBatchFieldIds.includes(f.id),\n );\n\n // -- Step 1: Classify reply intent --\n onProgress?.(\"Classifying reply...\");\n let intent;\n try {\n const { intent: classifiedIntent, usage: intentUsage } = await classifyReplyIntent(\n currentBatchFields,\n replyText,\n generateObject,\n providerOptions,\n resolveBudget(\"application_classify\", 1024).maxTokens,\n );\n trackUsage(intentUsage);\n intent = classifiedIntent;\n } catch (error) {\n await log?.(`Reply intent classification failed, defaulting to answers_only: ${error instanceof Error ? error.message : String(error)}`);\n intent = {\n primaryIntent: \"answers_only\" as const,\n hasAnswers: true,\n questionText: undefined,\n questionFieldIds: undefined,\n lookupRequests: undefined,\n };\n }\n\n let fieldsFilled = 0;\n let responseText: string | undefined;\n\n let replyPlan = planReplyActions({\n intent,\n currentBatchFields,\n hasDocumentStore: Boolean(documentStore),\n });\n\n // -- Step 2: Parse answers if present --\n if (replyPlan.parseAnswers) {\n onProgress?.(\"Parsing answers...\");\n try {\n const { result: parseResult, usage: parseUsage } = await parseAnswers(\n currentBatchFields,\n replyText,\n generateObject,\n providerOptions,\n resolveBudget(\"application_parse_answers\", 4096).maxTokens,\n );\n trackUsage(parseUsage);\n\n for (const answer of parseResult.answers) {\n const field = state.fields.find((f) => f.id === answer.fieldId);\n if (field) {\n field.value = answer.value;\n field.source = \"user\";\n field.confidence = \"confirmed\";\n field.userSourceSpanIds = replySourceSpanIds;\n field.validationStatus = \"valid\";\n fieldsFilled++;\n }\n }\n } catch (error) {\n await log?.(`Answer parsing failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // -- Step 3: Handle lookup requests --\n if (replyPlan.runLookup && intent.lookupRequests?.length) {\n onProgress?.(\"Processing lookup requests...\");\n let availableData = \"\";\n if (documentStore) {\n try {\n const docs = await documentStore.query({});\n availableData = docs\n .map((d) => {\n const doc = d as Record<string, unknown>;\n return `Document ${doc.id}: ${doc.type} - ${doc.carrier ?? \"unknown carrier\"} - ${doc.insuredName ?? \"\"}`;\n })\n .join(\"\\n\");\n } catch (e) {\n await log?.(`Document query for lookup failed: ${e}`);\n }\n }\n\n if (availableData) {\n const targetFields = state.fields.filter((f) =>\n intent.lookupRequests!.some((lr) => lr.targetFieldIds.includes(f.id)),\n );\n\n try {\n const { result: lookupResult, usage: lookupUsage } = await fillFromLookup(\n intent.lookupRequests,\n targetFields,\n availableData,\n generateObject,\n providerOptions,\n resolveBudget(\"application_lookup\", 4096).maxTokens,\n );\n trackUsage(lookupUsage);\n\n for (const fill of lookupResult.fills) {\n const field = state.fields.find((f) => f.id === fill.fieldId);\n if (field) {\n field.value = fill.value;\n field.source = `lookup: ${fill.source}`;\n field.confidence = \"high\";\n field.validationStatus = fill.sourceSpanIds?.length ? \"valid\" : \"needs_review\";\n if (fill.sourceSpanIds?.length) {\n field.sourceSpanIds = fill.sourceSpanIds;\n }\n fieldsFilled++;\n }\n }\n } catch (error) {\n await log?.(`Lookup fill failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // -- Step 4: Handle questions about fields --\n if (replyPlan.answerQuestion && intent.questionText) {\n try {\n const budget = resolveBudget(\"application_email\", 512);\n const { text, usage } = await generateText({\n prompt: `The user is filling out an insurance application and asked: \"${intent.questionText}\"\\n\\nProvide a brief, helpful explanation (2-3 sentences). End with \"Just reply with the answer when you're ready and I'll fill it in.\"`,\n maxTokens: budget.maxTokens,\n taskKind: \"application_email\",\n budgetDiagnostics: budget,\n providerOptions,\n });\n trackUsage(usage);\n responseText = text;\n } catch (error) {\n await log?.(`Question response generation failed: ${error instanceof Error ? error.message : String(error)}`);\n responseText = `I wasn't able to generate an explanation for your question. Could you rephrase it, or just provide the answer directly?`;\n }\n }\n\n // -- Step 5: Advance batch if current batch is complete --\n const activeCurrentBatchFieldIds = currentBatchFields.map((field) => field.id);\n const currentBatchComplete = activeCurrentBatchFieldIds.every(\n (fid) => state!.fields.find((f) => f.id === fid)?.value,\n );\n\n let nextBatchIndex: number | undefined;\n let nextBatchFields: ApplicationField[] | undefined;\n if (state.batches) {\n for (let index = state.currentBatchIndex + 1; index < state.batches.length; index++) {\n const activeCandidateFields = getActiveApplicationFields(state);\n const candidateFields = activeCandidateFields.filter((f) => state.batches![index].includes(f.id));\n if (candidateFields.some((f) => !f.value)) {\n nextBatchIndex = index;\n nextBatchFields = candidateFields;\n break;\n }\n }\n }\n\n replyPlan = planReplyActions({\n intent,\n currentBatchFields,\n nextBatchFields,\n hasDocumentStore: Boolean(documentStore),\n });\n\n if (currentBatchComplete && replyPlan.advanceBatch && state.batches) {\n if (nextBatchIndex !== undefined && nextBatchFields) {\n state.currentBatchIndex = nextBatchIndex;\n\n const filledCount = state.fields.filter((f) => f.value).length;\n\n if (replyPlan.generateNextEmail) {\n try {\n const { text: emailText, usage: emailUsage } = await generateBatchEmail(\n nextBatchFields,\n state.currentBatchIndex,\n state.batches.length,\n {\n appTitle: state.title,\n totalFieldCount: state.fields.length,\n filledFieldCount: filledCount,\n companyName: context?.companyName,\n },\n generateText,\n providerOptions,\n resolveBudget(\"application_email\", 2048).maxTokens,\n );\n trackUsage(emailUsage);\n const emailReview = reviewBatchEmail(emailText, nextBatchFields);\n state.qualityReport = {\n ...(buildApplicationQualityReport(state)),\n emailReview,\n };\n\n if (!responseText) {\n responseText = emailText;\n } else {\n responseText += `\\n\\n${emailText}`;\n }\n } catch (error) {\n await log?.(`Batch email generation failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } else {\n // All batches complete\n state.status = \"confirming\";\n }\n }\n\n state.updatedAt = Date.now();\n state.contextProposals = proposeContextWritesFromState(state);\n state.qualityReport = buildApplicationQualityReport(state);\n await applicationStore?.save(state);\n\n if (shouldFailQualityGate(qualityGate, state.qualityReport.qualityGateStatus)) {\n throw new Error(\"Application quality gate failed. See state.qualityReport for blocking issues.\");\n }\n\n return {\n state,\n intent: intent.primaryIntent,\n fieldsFilled,\n responseText,\n tokenUsage: totalUsage,\n reviewReport: state.qualityReport,\n };\n }\n\n /**\n * Generate the email for the current batch of questions.\n */\n async function generateCurrentBatchEmail(\n applicationId: string,\n opts?: { companyName?: string; previousBatchSummary?: string },\n ): Promise<{ text: string; tokenUsage: TokenUsage }> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n if (!state.batches?.length) throw new Error(\"No batches available\");\n\n const batchFieldIds = state.batches[state.currentBatchIndex];\n const batchFields = getActiveApplicationFields(state).filter((f) => batchFieldIds.includes(f.id));\n const filledCount = state.fields.filter((f) => f.value).length;\n\n const { text, usage } = await generateBatchEmail(\n batchFields,\n state.currentBatchIndex,\n state.batches.length,\n {\n appTitle: state.title,\n totalFieldCount: state.fields.length,\n filledFieldCount: filledCount,\n companyName: opts?.companyName,\n previousBatchSummary: opts?.previousBatchSummary,\n },\n generateText,\n providerOptions,\n resolveBudget(\"application_email\", 2048).maxTokens,\n );\n trackUsage(usage);\n\n const emailReview = reviewBatchEmail(text, batchFields);\n state.qualityReport = {\n ...(buildApplicationQualityReport(state)),\n emailReview,\n };\n await applicationStore?.save(state);\n\n return { text, tokenUsage: totalUsage };\n }\n\n /**\n * Get a summary of the current application state for confirmation.\n */\n async function getConfirmationSummary(\n applicationId: string,\n ): Promise<{ text: string; tokenUsage: TokenUsage }> {\n totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n\n const filledFields = state.fields.filter((f) => f.value);\n const fieldSummary = filledFields\n .map((f) => `${f.section} > ${f.label}: ${f.value} (source: ${f.source ?? \"unknown\"})`)\n .join(\"\\n\");\n\n const budget = resolveBudget(\"application_email\", 4096);\n const { text, usage } = await generateText({\n prompt: `Format these filled insurance application fields as a clean confirmation summary for the user to review. Group by section, show each field as \"Label: Value\". End with a note asking them to confirm or request changes.\\n\\nApplication: ${state.title ?? \"Insurance Application\"}\\n\\nFields:\\n${fieldSummary}`,\n maxTokens: budget.maxTokens,\n taskKind: \"application_email\",\n budgetDiagnostics: budget,\n providerOptions,\n });\n trackUsage(usage);\n\n return { text, tokenUsage: totalUsage };\n }\n\n async function createApplicationRun(input: CreateApplicationRunInput): Promise<ApplicationState> {\n const state = createApplicationRunFromTemplate(input);\n await applicationStore?.save(state);\n return state;\n }\n\n async function planNextQuestions(applicationId: string, limit?: number): Promise<ApplicationNextQuestions> {\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n return planNextApplicationQuestions(state, limit);\n }\n\n async function proposeContextWrites(applicationId: string): Promise<ContextProposalResult> {\n const state = await applicationStore?.get(applicationId);\n if (!state) throw new Error(`Application ${applicationId} not found`);\n const proposals = proposeContextWritesFromState(state);\n await applicationStore?.save({\n ...state,\n contextProposals: proposals,\n updatedAt: Date.now(),\n });\n return { proposals };\n }\n\n async function buildApplicationPacket(input: BuildApplicationPacketInput): Promise<BuildApplicationPacketResult> {\n const state = await applicationStore?.get(input.applicationId);\n if (!state) throw new Error(`Application ${input.applicationId} not found`);\n const packet = buildApplicationPacketFromState(state, {\n submissionNotes: input.submissionNotes,\n now: input.now,\n });\n const reviewReport = validateApplicationPacket(packet);\n await applicationStore?.save({\n ...state,\n packet: { ...packet, qualityReport: reviewReport },\n status: reviewReport.qualityGateStatus === \"failed\" ? \"broker_review\" : \"packet_ready\",\n qualityReport: reviewReport,\n updatedAt: Date.now(),\n });\n return { packet: { ...packet, qualityReport: reviewReport }, reviewReport };\n }\n\n return {\n processApplication,\n processReply,\n generateCurrentBatchEmail,\n getConfirmationSummary,\n createApplicationRun,\n planNextQuestions,\n proposeContextWrites,\n buildApplicationPacket,\n };\n}\n\nfunction selectMemoryBackfillMatch(\n field: ApplicationField,\n chunks: DocumentChunk[],\n): { value: string; source: string; confidence: \"high\" | \"medium\"; sourceSpanIds: string[] } | null {\n for (const chunk of chunks) {\n const value = chunk.metadata.value\n ?? chunk.metadata.answer\n ?? chunk.metadata.fieldValue;\n if (!value) continue;\n\n const metadataFieldId = chunk.metadata.fieldId ?? chunk.metadata.applicationFieldId;\n const metadataLabel = chunk.metadata.fieldLabel?.toLowerCase();\n const labelMatches = metadataLabel === field.label.toLowerCase();\n if (metadataFieldId && metadataFieldId !== field.id && !labelMatches) continue;\n\n return {\n value,\n source: chunk.metadata.source ?? `memory: ${chunk.documentId}`,\n confidence: metadataFieldId === field.id || labelMatches ? \"high\" : \"medium\",\n sourceSpanIds: parseSourceSpanIds(chunk.metadata.sourceSpanIds),\n };\n }\n\n return null;\n}\n\nfunction parseSourceSpanIds(value: string | undefined): string[] {\n if (!value) return [];\n const trimmed = value.trim();\n if (!trimmed) return [];\n if (trimmed.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(trimmed);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === \"string\") : [];\n } catch {\n return [];\n }\n }\n return trimmed.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n"],"mappings":"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","names":["z","z","z","unfilledFields","createApplicationRun","limit","proposeContextWrites","buildApplicationPacket"]}
|