@kat-ai/sdk 0.1.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/client.d.mts +45 -0
- package/dist/client.d.ts +45 -0
- package/dist/client.js +26 -0
- package/dist/client.js.map +1 -0
- package/dist/client.mjs +24 -0
- package/dist/client.mjs.map +1 -0
- package/dist/core-pLiFHTBe.d.mts +406 -0
- package/dist/core-pLiFHTBe.d.ts +406 -0
- package/dist/index.d.mts +2829 -0
- package/dist/index.d.ts +2829 -0
- package/dist/index.js +8028 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7918 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/openaiDefaults.ts","../src/introspection/manifest-generator.ts","../src/types/config.ts","../src/runtime/config.ts","../src/logger.ts","../src/adapters/trace.ts","../src/agentContext.ts","../src/composition/registry.ts","../src/disambiguation/extractor.ts","../src/disambiguation/reducer.ts","../src/disambiguation/questionGenerator.ts","../src/disambiguation/redirectGenerator.ts","../src/disambiguation/scopeDetector.ts","../src/disambiguation/index.ts","../src/kbCatalog.ts","../src/executor/queryBuilder.ts","../src/planner.ts","../src/executor/snippetFormatter.ts","../src/providers/trace.ts","../src/executor/kbRunner.ts","../src/executor/synthesis.ts","../src/executor/core.ts","../src/providers/openai.ts","../src/providers/pinecone.ts","../src/providers/template.ts","../src/runtime/context.ts","../src/agent/runner.ts","../src/agent/runnerStreaming.ts","../src/adapters/citations.ts","../src/adapters/nextjs.ts","../src/adapters/vercel-ai.ts","../src/middleware/index.ts","../src/orchestration/planExecutor.ts","../src/providers/streaming.ts","../src/index.ts","../src/introspection/question-formulator.ts","../src/introspection/response-validator.ts","../src/introspection/schema-inference.ts","../src/introspection/usage-tracker.ts","../src/introspection/types.ts","../src/introspection/engine.ts","../src/introspection/index.ts"],"names":["DEFAULT_OPENAI_CHAT_MODEL_ID","buildComponentEvidence","z","EvidenceSchema","generateObject","openai","CapabilityWithEvidenceSchema","SlotDefinitionSchema","text","path","join","readFileSync","fs","getSlotDefinition","buildSlotsSchema","kbCatalog","isSlotFilled","now","normalizeKbId","findKbById","config","plan","result","responsesIndicateNoInfo","stream","generateText","streamText","Pinecone","formatSlotValue","outcome","initializeContext","createDisambiguationTraceStep","createPlanningTraceStep","updatePlanningTraceStep","formatExtractedSlots","buildEmptyTrace","extractCitations","createEmptyContext","pinecone","generateManifestFromState"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Default OpenAI chat model IDs and env-based resolution.\n *\n * Agent runtime continues to use `agent.config.json` (`llm.models`) via `getModel()`.\n * These helpers apply to introspection, CLI helpers, and other code paths that\n * do not load an agent config.\n *\n * Env precedence for introspection:\n * 1. Explicit `ProgressiveIntrospectionConfig.llmModel` / API base field\n * 2. `KBS_INTROSPECTION_MODEL`\n * 3. `KBS_DEFAULT_OPENAI_MODEL`\n * 4. `OPENAI_DEFAULT_CHAT_MODEL`\n * 5. {@link DEFAULT_OPENAI_CHAT_MODEL_ID}\n */\n\nexport const DEFAULT_OPENAI_CHAT_MODEL_ID = 'gpt-4o-mini' as const;\n\n/**\n * Model id for progressive introspection and manifest generation (OpenAI).\n */\nexport function resolveIntrospectionOpenAiModelId(explicit?: string | null): string {\n const trimmed = explicit?.trim();\n if (trimmed) return trimmed;\n return (\n process.env.KBS_INTROSPECTION_MODEL?.trim() ||\n process.env.KBS_DEFAULT_OPENAI_MODEL?.trim() ||\n process.env.OPENAI_DEFAULT_CHAT_MODEL?.trim() ||\n DEFAULT_OPENAI_CHAT_MODEL_ID\n );\n}\n\n/**\n * Generic default chat model when no agent config applies (CLI tools, eval grader, etc.).\n */\nexport function resolveDefaultOpenAiChatModelId(explicit?: string | null): string {\n const trimmed = explicit?.trim();\n if (trimmed) return trimmed;\n return (\n process.env.KBS_DEFAULT_OPENAI_MODEL?.trim() ||\n process.env.OPENAI_DEFAULT_CHAT_MODEL?.trim() ||\n DEFAULT_OPENAI_CHAT_MODEL_ID\n );\n}\n\n/** Stronger model for structured JSON / complex generation (`KBS_STRONG_OPENAI_MODEL`, default gpt-4o). */\nexport function resolveStrongOpenAiModelId(explicit?: string | null): string {\n const trimmed = explicit?.trim();\n if (trimmed) return trimmed;\n return process.env.KBS_STRONG_OPENAI_MODEL?.trim() || 'gpt-4o';\n}\n","/**\n * Manifest Generator\n *\n * Converts introspection state into a KB manifest using multi-step\n * LLM-assisted generation for each manifest component.\n */\n\nimport { generateObject } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport type { KBManifest, KBGoal, KBRelevanceHints, KBQueryTemplate, KBScopeDefinition, ComponentEvidence, KBInputField } from '../types/composition.js';\nimport type { IntrospectionState, IntrospectionCallbacks } from './types.js';\nimport type { UsageTracker } from './usage-tracker.js';\nimport { resolveIntrospectionOpenAiModelId } from '../config/openaiDefaults.js';\n\n// ============================================================================\n// SCHEMAS\n// ============================================================================\n\n/**\n * Schema for evidence citations in manifest generation\n */\nconst EvidenceSchema = z.object({\n reasoning: z.string(),\n qaNumbers: z.array(z.number()).optional(),\n answerExcerpts: z.array(z.string()).optional(),\n});\n\nconst SlotDefinitionSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'boolean', 'enum']),\n description: z.string(),\n required: z.boolean().optional(),\n prompt: z.string().optional(),\n examples: z.array(z.string()).optional(),\n normalization: z.enum(['lower_snake', 'lowercase', 'uppercase', 'none']).optional(),\n enumValues: z.array(z.string()).optional(),\n evidence: EvidenceSchema.optional(),\n extractionBehavior: z.enum(['identifier', 'categorization', 'freeform']).optional(),\n extractionGuidance: z.string().optional(),\n});\n\nconst QueryTemplateSectionSchema = z.object({\n text: z.string(),\n requires: z.array(z.string()).optional(),\n optional: z.boolean().optional(),\n fallback: z.string().optional(),\n});\n\nconst QueryTemplateSchema = z.object({\n preamble: z.string().optional(),\n sections: z.array(QueryTemplateSectionSchema).optional(),\n closing: z.array(z.string()).optional(),\n});\n\nconst ScopeDefinitionSchema = z.object({\n description: z.string(),\n inScopeExamples: z.array(z.string()).optional(),\n outOfScopeExamples: z.array(z.string()).optional(),\n excludedIntents: z.array(z.string()).optional(),\n edgeCaseExamples: z.array(z.string()).optional(),\n ambiguousCases: z.array(z.string()).optional(),\n evidence: EvidenceSchema.optional(),\n}).passthrough();\n\nconst GoalSchema = z.object({\n name: z.string(),\n description: z.string(),\n evidence: EvidenceSchema.optional(),\n});\n\n/**\n * Schema for capabilities with evidence\n */\nconst CapabilityWithEvidenceSchema = z.object({\n text: z.string(),\n evidence: EvidenceSchema.optional(),\n});\n\nconst ManifestProposalSchema = z.object({\n description: z.string(),\n descriptionEvidence: EvidenceSchema.optional(),\n capabilities: z.array(CapabilityWithEvidenceSchema).min(1),\n outputs: z.array(z.string()).min(1),\n slots: z.array(SlotDefinitionSchema).min(1),\n goals: z.array(GoalSchema).optional(),\n relevance: z\n .object({\n goalKeywords: z.array(z.string()).optional(),\n slotTriggers: z.array(z.string()).optional(),\n domains: z.array(z.string()).optional(),\n })\n .optional(),\n queryTemplate: QueryTemplateSchema.optional(),\n scope: ScopeDefinitionSchema.optional(),\n}).passthrough();\n\ntype ManifestProposal = z.infer<typeof ManifestProposalSchema>;\n\n// ============================================================================\n// EVIDENCE BUILDER\n// ============================================================================\n\n/**\n * Build ComponentEvidence from extracted LLM evidence data and introspection state\n */\nfunction buildComponentEvidence(\n evidenceData: { reasoning: string; qaNumbers?: number[]; answerExcerpts?: string[] } | undefined,\n state: IntrospectionState\n): ComponentEvidence | undefined {\n if (!evidenceData || !evidenceData.reasoning) return undefined;\n\n // Build Q&A exchanges from qaNumbers\n const qaExchanges: ComponentEvidence['qaExchanges'] = [];\n if (evidenceData.qaNumbers && Array.isArray(evidenceData.qaNumbers)) {\n for (let i = 0; i < evidenceData.qaNumbers.length; i++) {\n const qNum = evidenceData.qaNumbers[i];\n const idx = qNum - 1; // Convert to 0-indexed\n if (idx >= 0 && idx < state.conversationHistory.length) {\n const entry = state.conversationHistory[idx];\n qaExchanges.push({\n questionNumber: qNum,\n question: entry.question,\n answerExcerpt: evidenceData.answerExcerpts?.[i] || entry.answer.substring(0, 300),\n });\n }\n }\n }\n\n // Get relevant document snippets (top 3 by score)\n const documentSnippets = state.documentSnippets\n .slice(0, 3)\n .map(s => ({\n content: s.content,\n sourceFile: s.sourceFile,\n score: s.score,\n }));\n\n return {\n reasoning: evidenceData.reasoning,\n qaExchanges,\n documentSnippets,\n };\n}\n\n// ============================================================================\n// CONTEXT BUILDER\n// ============================================================================\n\n/**\n * Build the base context for manifest generation prompts\n */\nfunction buildBaseContext(\n base: { kbId: string; assistantName: string; domain?: string },\n state: IntrospectionState\n): string {\n const categoriesList = Array.from(state.categories.values())\n .map(c => `- ${c.name}${c.children.length > 0 ? ` (subtopics: ${c.children.join(', ')})` : ''}`)\n .join('\\n');\n\n const entitiesList = Array.from(state.entities.values())\n .map(e => `- ${e.name}${e.category ? ` (under: ${e.category})` : ''}`)\n .join('\\n');\n\n const conversationSummary = state.conversationHistory\n .map((h, i) => `Q${i + 1}: ${h.question}\\nA${i + 1}: ${h.answer}`)\n .join('\\n\\n');\n\n const sourceFilesList = Array.from(state.sourceFiles).join('\\n- ') || 'No source files discovered';\n\n const sampleSnippets = state.documentSnippets\n .slice(0, 10)\n .map(s => `[${s.sourceFile}]: \"${s.content.substring(0, 150)}...\"`)\n .join('\\n');\n\n return `You are helping generate a knowledge base manifest based on progressive introspection of a Pinecone Assistant.\n\nCRITICAL: Generate manifest components ONLY based on what was ACTUALLY DISCOVERED during introspection. Do NOT hallucinate or add topics, categories, or inputs that were not found.\n\n=== GROUND TRUTH: ACTUAL INDEXED DOCUMENTS ===\nThese are the REAL files in this knowledge base (from Context API):\n- ${sourceFilesList}\n\n=== SAMPLE CONTENT FROM DOCUMENTS ===\n${sampleSnippets || 'No snippets captured'}\n\n=== DISCOVERED CATEGORIES ===\n${categoriesList || 'None discovered'}\n\n=== DISCOVERED ENTITIES ===\n${entitiesList || 'None discovered'}\n\n=== EXAMPLE QUESTIONS ===\n${state.exampleQuestions.slice(0, 15).join('\\n') || 'None gathered'}\n\n=== SCOPE INFORMATION ===\nOut of scope: ${state.scopeInfo.outOfScope.join('; ') || 'Not specified'}\n\n=== CONVERSATION HISTORY ===\n${conversationSummary}\n\nDomain: ${base.domain || 'infer from the source files and content above'}\n\nCRITICAL RULES:\n1. The INDEXED DOCUMENTS list above is the GROUND TRUTH - only include topics actually covered by these files\n2. Do NOT include topics like \"Health and Medicine\", \"Finance\", etc. unless they appear in the actual documents\n3. Do NOT use inputs/templates from other domains (no \"product_type\", \"warranty\" for academic KBs)\n4. Base all generations on the ACTUAL CONTENT discovered, not hypothetical capabilities`;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n// ============================================================================\n// MANIFEST GENERATION\n// ============================================================================\n\n/**\n * Generate a complete manifest from introspection state\n */\nexport async function generateManifestFromState(\n base: { kbId: string; assistantName: string; domain?: string; llmModel?: string },\n state: IntrospectionState,\n callbacks?: IntrospectionCallbacks,\n tracker?: UsageTracker\n): Promise<KBManifest> {\n const llmModel = resolveIntrospectionOpenAiModelId(base.llmModel);\n const baseContext = buildBaseContext(base, state);\n const result: Partial<ManifestProposal> = {};\n const totalSteps = 8;\n\n // Step 1: Description with evidence\n callbacks?.onManifestStep?.(1, totalSteps, 'Generating description...');\n const DescriptionSchema = z.object({ \n description: z.string(),\n evidence: EvidenceSchema.optional(),\n });\n const { object: descObj, usage: descUsage } = await generateObject({\n model: openai(llmModel),\n schema: DescriptionSchema,\n prompt: `${baseContext}\n\nGenerate a clear, comprehensive description of what this knowledge base covers based on the discovered categories and entities.\n\nEVIDENCE REQUIREMENT:\nProvide an \"evidence\" object with:\n1. \"reasoning\": Explain how you derived the description from the discovered content\n2. \"qaNumbers\": Which Q&A exchange numbers (1-indexed) informed the description\n3. \"answerExcerpts\": Brief quotes from those answers supporting the description\n\nReturn JSON with: { \"description\": \"...\", \"evidence\": { \"reasoning\": \"...\", \"qaNumbers\": [...], \"answerExcerpts\": [...] } }`,\n });\n if (tracker && descUsage) {\n tracker.record({ step: 'manifest_description', model: llmModel, provider: 'openai', usage: descUsage });\n }\n result.description = descObj.description;\n (result as any).descriptionEvidence = buildComponentEvidence(descObj.evidence, state);\n\n // Step 2: Capabilities with evidence\n callbacks?.onManifestStep?.(2, totalSteps, 'Generating capabilities...');\n const CapabilitiesSchema = z.object({ capabilities: z.array(CapabilityWithEvidenceSchema).min(1) });\n const { object: capsObj, usage: capsUsage } = await generateObject({\n model: openai(llmModel),\n schema: CapabilitiesSchema,\n prompt: `${baseContext}\n\nGenerate SEMANTICALLY RICH capability descriptions based on the discovered categories, entities, and example questions. These will be used for semantic search to route user queries.\n\nEach capability should be a COMPLETE, DESCRIPTIVE SENTENCE that explains what the KB helps with.\n\nEVIDENCE REQUIREMENT (CRITICAL):\nFor EACH capability, provide an \"evidence\" object with:\n1. \"reasoning\": Explain WHY this capability was identified based on discovered content\n2. \"qaNumbers\": Which Q&A exchange numbers (1-indexed) support this capability\n3. \"answerExcerpts\": Brief quotes from those answers that justify this capability\n\nExample:\n{\n \"capabilities\": [\n {\n \"text\": \"Explain agricultural laws from the Mishna regarding corner-of-field donations\",\n \"evidence\": {\n \"reasoning\": \"Q&A exchanges revealed detailed content about peah laws and agricultural practices\",\n \"qaNumbers\": [1, 3, 7],\n \"answerExcerpts\": [\"The tractate covers laws of peah...\", \"Agricultural tithes...\"]\n }\n }\n ]\n}\n\nGenerate 3-7 capabilities based on the major categories discovered.\n\nReturn JSON with: { \"capabilities\": [{ \"text\": \"...\", \"evidence\": {...} }, ...] }`,\n });\n if (tracker && capsUsage) {\n tracker.record({ step: 'manifest_capabilities', model: llmModel, provider: 'openai', usage: capsUsage });\n }\n // Process capabilities with evidence\n result.capabilities = (capsObj.capabilities || []).map(cap => ({\n text: cap.text,\n evidence: buildComponentEvidence(cap.evidence, state),\n })) as any;\n\n // Step 3: Outputs\n callbacks?.onManifestStep?.(3, totalSteps, 'Generating outputs...');\n const OutputsSchema = z.object({ outputs: z.array(z.string()).min(1) });\n const { object: outputsObj, usage: outputsUsage } = await generateObject({\n model: openai(llmModel),\n schema: OutputsSchema,\n prompt: `${baseContext}\\n\\nWhat information does this KB typically provide based on the conversation history?\\n\\nReturn JSON with: { \"outputs\": [\"output1\", ...] }`,\n });\n if (tracker && outputsUsage) {\n tracker.record({ step: 'manifest_outputs', model: llmModel, provider: 'openai', usage: outputsUsage });\n }\n result.outputs = Array.isArray(outputsObj?.outputs) ? outputsObj.outputs : [];\n\n // Step 4: Slots\n callbacks?.onManifestStep?.(4, totalSteps, 'Generating slots...');\n const SlotsSchema = z.object({ slots: z.array(SlotDefinitionSchema).min(1) });\n \n // Build inline list of discovered content for the prompt\n const discoveredCategories = Array.from(state.categories.values()).slice(0, 10).map(c => c.name).join(', ');\n const discoveredEntities = Array.from(state.entities.values()).slice(0, 15).map(e => e.name).join(', ');\n \n // Use extracted schemas if available (from vector-native discovery)\n const extractedSchemasText = state.extractedSchemas && state.extractedSchemas.length > 0\n ? `\\n\\n=== EXTRACTED SCHEMAS FROM DOCUMENTS ===\n${state.extractedSchemas\n .filter(s => s && s.intent && s.slots && Array.isArray(s.slots))\n .map(s => \n `Intent: ${s.intent}\\nSlots: ${s.slots\n .filter(slot => slot && slot.name && slot.type !== undefined)\n .map(slot => {\n const parts = [`${slot.name} (${slot.type}`, `required: ${slot.required ?? false}`];\n if (slot.validation_rule) parts.push(`validation: ${slot.validation_rule}`);\n if (slot.enumValues && Array.isArray(slot.enumValues) && slot.enumValues.length > 0) {\n parts.push(`enum values: ${slot.enumValues.join(', ')}`);\n }\n return parts.join(', ') + ')';\n }).join(', ')}`\n ).join('\\n\\n')}`\n : '';\n\n const { object: slotsObj, usage: slotsUsage } = await generateObject({\n model: openai(llmModel),\n schema: SlotsSchema,\n prompt: `${baseContext}${extractedSchemasText}\n\nGenerate slot definitions based on the discovered categories, entities, extracted schemas, AND the document structure visible in the sample content above.\n\n=== DISCOVERED CONTENT TO BASE SLOTS ON ===\nCategories: ${discoveredCategories || 'None'}\nEntities: ${discoveredEntities || 'None'}\n\n=== CRITICAL: ANALYZE DOCUMENT STRUCTURE ===\nLook at the SAMPLE CONTENT FROM DOCUMENTS section above. If you see repeated structural fields (like \"**FieldName:** value\" patterns), these reveal what DIMENSIONS exist in the data:\n- Identifier fields (Model, ID, Name, Code) ā suggest a required string slot for lookup\n- Type/Category fields ā suggest an enum slot if values repeat across documents\n- Unique identifiers (Serial, UUID) ā usually NOT user-provided, skip these\n\nIf every document has a particular field, users will likely need to specify that value to get relevant answers!\n\n=== WHAT SLOTS SHOULD CAPTURE ===\nSlots represent the SEMANTIC DIMENSIONS that distinguish different types of user queries.\nThink: \"What aspects of the user's question help us understand what kind of answer they need?\"\n\n=== GOOD SLOTS capture user intent ===\n- \"analysis_goal\" (enum: comparison, prediction, estimation, testing)\n- \"explanation_depth\" (enum: intuition, worked_example, formal_proof)\n- \"application_context\" (string: what real-world scenario)\n- \"product_model\" (string: which specific product/item)\n\n=== BAD SLOTS are structural - AVOID THESE ===\n- \"chapter\", \"section\", \"page_number\" - document navigation, not user intent\n- \"topic\" (too generic) - what ASPECT of the topic?\n- \"document_title\" - users don't think in terms of source documents\n\n=== REQUIRED vs OPTIONAL SLOTS ===\nMark slots as REQUIRED when:\n1. The slot identifies WHICH SPECIFIC ITEM/ENTITY the user is asking about (e.g., product_model, device_id, course_id)\n2. Without this slot, you literally CANNOT look up the relevant information\n3. The slot is something the USER would KNOW and PROVIDE - NOT data the KB contains\n\nMark slots as OPTIONAL when:\n- The slot provides additional CONTEXT or FILTERING (e.g., country, language, user_type)\n- The KB can still provide useful information without it\n\nIMPORTANT - DO NOT create slots for data the KB CONTAINS/PROVIDES:\n- warranty_period, warranty_duration, coverage_months ā these are DATA in the KB, not user inputs\n- price, cost, specifications ā these are DATA the KB returns, not slots\n- Slots are what the USER BRINGS (product model they own, purchase date they remember)\n\n=== RULES ===\n- Keep slots to 3-6 meaningful dimensions\n- For enum slots, ONLY use values that were ACTUALLY DISCOVERED in the categories/entities or extracted schemas\n- If enum values are provided in the extracted schemas above, USE THOSE EXACT VALUES for enumValues field\n- Each slot should help route the query to the right kind of answer\n- Slot names should be specific and descriptive (e.g., \"statistical_method\" not just \"method\")\n- If extracted schemas are provided above, prioritize slots from those schemas that represent user-facing parameters\n- CRITICAL: Enum values MUST be human-readable with proper capitalization and spacing (e.g., \"Kitchen Appliances\", \"Premium Coverage\", \"In-Home Service\"), NOT snake_case or lowercase. Users will see these values in the UI.\n\nEVIDENCE REQUIREMENT:\nFor EACH slot, provide an \"evidence\" object with:\n1. \"reasoning\": Explain WHY this slot is needed and what dimension it captures\n2. \"qaNumbers\": Which Q&A exchanges revealed this slot dimension\n3. \"answerExcerpts\": Brief quotes supporting this slot\n\nReturn JSON with: { \"slots\": [{\"name\": \"...\", \"type\": \"string|boolean|enum\", \"required\": true/false, \"description\": \"...\", \"enumValues\": [...] (if enum type), \"evidence\": {...}}, ...] }`,\n });\n if (tracker && slotsUsage) {\n tracker.record({ step: 'manifest_slots', model: llmModel, provider: 'openai', usage: slotsUsage });\n }\n \n // Process slots with evidence\n result.slots = Array.isArray(slotsObj?.slots) \n ? slotsObj.slots.map(slot => ({\n ...slot,\n evidence: buildComponentEvidence(slot.evidence, state),\n }))\n : [];\n\n // Generate extraction guidance and determine required status for each slot using LLM\n // This replaces hardcoded pattern matching with domain-aware LLM reasoning\n if (result.slots && result.slots.length > 0) {\n const ExtractionGuidanceSchema = z.object({\n slotGuidance: z.array(z.object({\n slotName: z.string(),\n required: z.boolean(),\n extractionBehavior: z.enum(['identifier', 'categorization', 'freeform']),\n extractionGuidance: z.string(),\n }))\n });\n \n const slotsForGuidance = result.slots.map(s => ({\n name: s.name,\n type: s.type,\n description: s.description,\n required: s.required,\n examples: s.examples,\n enumValues: s.enumValues,\n }));\n \n const { object: guidanceObj, usage: guidanceUsage } = await generateObject({\n model: openai(llmModel),\n schema: ExtractionGuidanceSchema,\n prompt: `You are analyzing slots for a ${base.domain || 'knowledge base'} domain to determine extraction behavior and requirements.\n\nFor each slot, determine:\n\n1. **required**: Should this slot be REQUIRED (true) or optional (false)?\n Mark as REQUIRED (true) when:\n - The slot identifies WHICH SPECIFIC ITEM/ENTITY the user is asking about (e.g., which product, which account, which order)\n - Without this information, the KB literally CANNOT look up or provide accurate information\n - It's a unique identifier that distinguishes between different records/items\n \n Mark as OPTIONAL (false) when:\n - The slot provides additional context or filtering but isn't essential for lookup\n - The KB can still provide useful information without it\n - It's descriptive rather than identifying\n\n2. **extractionBehavior**: How should the extractor handle user input for this slot?\n - 'identifier': Requires a SPECIFIC identifier (model number, serial number, product name, account ID, etc.). General categories/types are NOT valid identifiers.\n - 'categorization': Classifies into categories/types. Only fill when user EXPLICITLY indicates a specific category - vague descriptions should leave it empty for clarification.\n - 'freeform': Any relevant text the user provides is acceptable.\n\n3. **extractionGuidance**: A concise instruction (1-2 sentences) for the LLM extractor explaining:\n - What constitutes a VALID value for this slot in this domain\n - What should be considered AMBIGUOUS and left empty (for identifier/categorization slots)\n - Domain-specific examples when helpful\n\n=== SLOTS TO ANALYZE ===\n${JSON.stringify(slotsForGuidance, null, 2)}\n\n=== GUIDANCE PRINCIPLES ===\n- Identifier slots need SPECIFIC values: \"CrispToast 450\" is a product model, \"toaster\" is just a device type\n- Categorization slots need EXPLICIT user indication: \"electrical problem\" indicates a category, \"not working\" does not\n- Freeform slots accept whatever the user says\n- Think about what information is ESSENTIAL to answer queries in this domain vs what is nice-to-have\n\nReturn guidance for ALL slots.`,\n });\n if (tracker && guidanceUsage) {\n tracker.record({ step: 'manifest_extraction_guidance', model: llmModel, provider: 'openai', usage: guidanceUsage });\n }\n \n // Merge guidance into slots\n if (guidanceObj?.slotGuidance) {\n for (const guidance of guidanceObj.slotGuidance) {\n const slot = result.slots.find(s => s.name === guidance.slotName);\n if (slot) {\n slot.required = guidance.required;\n slot.extractionBehavior = guidance.extractionBehavior;\n slot.extractionGuidance = guidance.extractionGuidance;\n }\n }\n }\n }\n \n // Post-process slots to inject extracted enum values and evidence from extracted schemas\n if (state.extractedSchemas && state.extractedSchemas.length > 0 && result.slots && Array.isArray(result.slots)) {\n for (const slot of result.slots) {\n if (slot && slot.name) {\n // Find matching slot in extracted schemas\n for (const schema of state.extractedSchemas) {\n if (schema && schema.slots && Array.isArray(schema.slots)) {\n const extractedSlot = schema.slots.find(s => s && s.name === slot.name);\n if (extractedSlot) {\n // Inject enum values if available\n if (slot.type === 'enum' && extractedSlot.enumValues && Array.isArray(extractedSlot.enumValues) && extractedSlot.enumValues.length > 0) {\n slot.enumValues = extractedSlot.enumValues;\n }\n // Inject evidence from extracted schema if not already present\n if (!slot.evidence && (extractedSlot as any).evidence) {\n slot.evidence = (extractedSlot as any).evidence;\n }\n break;\n }\n }\n }\n }\n }\n }\n\n // Step 5: Goals\n callbacks?.onManifestStep?.(5, totalSteps, 'Generating goals...');\n const GoalsSchema = z.object({ goals: z.array(GoalSchema).min(1) });\n const { object: goalsObj, usage: goalsUsage } = await generateObject({\n model: openai(llmModel),\n schema: GoalsSchema,\n prompt: `${baseContext}\n\nGenerate user goals/intents that this knowledge base can help with. Goals represent what users want to ACCOMPLISH or ACHIEVE when querying this KB.\n\nCRITICAL RULES:\n- Goals should be ABSTRACT USER INTENTS, not specific actions or entities\n- Use snake_case for goal names (e.g., \"understand_concept\", \"troubleshoot_issue\")\n- Each goal should represent a distinct user objective\n- Goals should align with the discovered capabilities and categories\n- Generate 4-6 goals based on the major use cases discovered\n\nGOOD GOAL EXAMPLES:\nā
\"understand_concept\" - User wants to understand a concept or theory\nā
\"troubleshoot_issue\" - User needs help diagnosing and fixing a problem\nā
\"find_examples\" - User is looking for examples or applications\nā
\"compare_options\" - User wants to compare different options or approaches\nā
\"get_instructions\" - User needs step-by-step instructions\nā
\"verify_information\" - User wants to verify or validate information\n\nBAD GOAL EXAMPLES (too specific or entity-like):\nā \"reset_password_for_user\" - too specific\nā \"fix_product_xyz789\" - contains entity\nā \"understand_john_doe\" - contains entity\n\nBased on the discovered categories, capabilities, and content, generate goals that represent what users typically want to accomplish with this knowledge base.\n\nEVIDENCE REQUIREMENT:\nFor EACH goal, provide an \"evidence\" object with:\n1. \"reasoning\": Explain WHY this goal was identified based on example questions\n2. \"qaNumbers\": Which Q&A exchanges show users pursuing this goal\n3. \"answerExcerpts\": Brief quotes demonstrating this goal being addressed\n\nReturn JSON with: { \"goals\": [{\"name\": \"goal_name\", \"description\": \"...\", \"evidence\": {...}}, ...] }`,\n });\n if (tracker && goalsUsage) {\n tracker.record({ step: 'manifest_goals', model: llmModel, provider: 'openai', usage: goalsUsage });\n }\n // Process goals with evidence\n result.goals = Array.isArray(goalsObj?.goals) \n ? goalsObj.goals.map(goal => ({\n name: goal.name,\n description: goal.description,\n evidence: buildComponentEvidence(goal.evidence, state),\n }))\n : [];\n\n // Step 6: Relevance\n callbacks?.onManifestStep?.(6, totalSteps, 'Generating relevance...');\n try {\n const slotNames = Array.isArray(result.slots)\n ? result.slots\n .filter(slot => slot && typeof slot === 'object' && (slot as { name?: unknown }).name)\n .map(slot => String((slot as { name: unknown }).name))\n : [];\n const slotsListText = slotNames.length > 0\n ? `\\n\\nSlots defined for this KB: ${slotNames.join(', ')}`\n : '';\n\n const RelevanceSchema = z.object({\n relevance: z.object({\n goalKeywords: z.array(z.string()).optional(),\n slotTriggers: z.array(z.string()).optional(),\n domains: z.array(z.string()).optional(),\n }).optional(),\n });\n const { object: relObj, usage: relUsage } = await generateObject({\n model: openai(llmModel),\n schema: RelevanceSchema,\n prompt: `${baseContext}${slotsListText}\n\nGenerate relevance hints:\n\nCRITICAL:\n- goalKeywords: Array of keywords/phrases that indicate user INTENT or GOALS this KB can help with (5-15 keywords).\n - Examples: [\"troubleshoot\", \"fix\", \"configure\", \"install\", \"calculate\", \"analyze\", \"compare\"]\n - These should be ACTION VERBS or GOAL-ORIENTED phrases that users might use when asking questions\n - Based on the discovered categories, entities, and capabilities\n- slotTriggers: MUST be slot names from the list above (${slotNames.join(', ')}). Do NOT invent slot names.\n- domains: Should be the TOP-LEVEL categories ONLY (5-15 max). Do NOT list every subcategory.\n - For a science/math KB: domains might be [\"Mathematics\", \"Physics\", \"Statistics\", \"Engineering\"]\n - Do NOT list 100+ domains - keep it to main subject areas only\n\nReturn JSON with: { \"relevance\": {\"goalKeywords\": [...], \"slotTriggers\": [...], \"domains\": [...]} }`,\n });\n if (tracker && relUsage) {\n tracker.record({ step: 'manifest_relevance', model: llmModel, provider: 'openai', usage: relUsage });\n }\n result.relevance = relObj.relevance;\n } catch {\n // Skip relevance if it fails\n }\n\n // Step 7: Query Template\n callbacks?.onManifestStep?.(7, totalSteps, 'Generating query template...');\n try {\n const slotNames = Array.isArray(result.slots)\n ? result.slots\n .filter(slot => slot && typeof slot === 'object' && (slot as { name?: unknown }).name)\n .map(slot => String((slot as { name: unknown }).name))\n : [];\n const QueryTemplateOnlySchema = z.object({ queryTemplate: QueryTemplateSchema.optional() });\n const { object: qtObj, usage: qtUsage } = await generateObject({\n model: openai(llmModel),\n schema: QueryTemplateOnlySchema,\n prompt: `${baseContext}\n\nGenerate a queryTemplate for constructing queries to THIS specific knowledge base.\n\n=== RULES ===\n- The template should reflect USER INTENT, not document structure\n- Only use slot names that exist: ${slotNames.join(', ')}\n- Each section's \"text\" field MUST include {{slot_name}} placeholders using ONLY the slots listed above\n- The template should read naturally, like how a user would phrase their question\n\n=== GOOD EXAMPLE (intent-focused) ===\nFor a statistics KB with slots [statistical_method, use_case, explanation_depth]:\n{\n \"preamble\": \"I need help with:\",\n \"sections\": [\n {\"text\": \"Method: {{statistical_method}}\", \"requires\": [\"statistical_method\"]},\n {\"text\": \"For this use case: {{use_case}}\", \"optional\": true},\n {\"text\": \"Explanation level: {{explanation_depth}}\", \"optional\": true}\n ],\n \"closing\": [\"Please explain with relevant examples.\"]\n}\n\n=== BAD EXAMPLE (structural - DO NOT DO THIS) ===\n{\n \"sections\": [\n {\"text\": \"Chapter: {{chapter}}\", ...},\n {\"text\": \"Section: {{section}}\", ...}\n ]\n}\n\nReturn JSON with: { \"queryTemplate\": {\"preamble\": \"...\", \"sections\": [...], \"closing\": [...]} }`,\n });\n if (tracker && qtUsage) {\n tracker.record({ step: 'manifest_query_template', model: llmModel, provider: 'openai', usage: qtUsage });\n }\n result.queryTemplate = qtObj.queryTemplate;\n } catch {\n // Skip query template if it fails\n }\n\n // Step 8: Scope with evidence\n callbacks?.onManifestStep?.(8, totalSteps, 'Generating scope...');\n try {\n const ScopeOnlySchema = z.object({ scope: ScopeDefinitionSchema.optional() });\n const { object: scopeObj, usage: scopeUsage } = await generateObject({\n model: openai(llmModel),\n schema: ScopeOnlySchema,\n prompt: `${baseContext}\n\nGenerate scope definition with in-scope examples (based on discovered categories/entities) and out-of-scope examples (based on scope info gathered).\n\nEVIDENCE REQUIREMENT:\nProvide an \"evidence\" object with:\n1. \"reasoning\": Explain HOW the scope boundaries were determined from the content\n2. \"qaNumbers\": Which Q&A exchanges helped define what's in/out of scope\n3. \"answerExcerpts\": Brief quotes showing scope boundaries\n\nReturn JSON with: { \"scope\": { \"description\": \"...\", \"inScopeExamples\": [...], \"outOfScopeExamples\": [...], \"evidence\": {...} } }`,\n });\n if (tracker && scopeUsage) {\n tracker.record({ step: 'manifest_scope', model: llmModel, provider: 'openai', usage: scopeUsage });\n }\n // Process scope with evidence\n if (scopeObj.scope) {\n result.scope = {\n ...scopeObj.scope,\n evidence: buildComponentEvidence(scopeObj.scope.evidence, state),\n };\n }\n } catch {\n // Skip scope if it fails\n }\n\n // Merge into final manifest\n return mergeManifest(base, result as ManifestProposal & { descriptionEvidence?: ComponentEvidence });\n}\n\n/**\n * Merge generated proposal into final manifest format\n */\nfunction mergeManifest(\n baseInfo: { kbId: string; assistantName: string; domain?: string },\n proposal: ManifestProposal & { descriptionEvidence?: ComponentEvidence }\n): KBManifest {\n const normalizedDescription = normalizeText(proposal.description);\n const fallbackDescription = baseInfo.domain\n ? `Knowledge base for ${baseInfo.domain}`\n : `Knowledge base served by ${baseInfo.assistantName}`;\n\n const validSlots = Array.isArray(proposal.slots)\n ? proposal.slots\n .filter(slot => slot && !!slot.name && !!slot.type && !!slot.description)\n .map(slot => ({\n name: normalizeText(slot!.name)!,\n type: slot!.type!,\n description: normalizeText(slot!.description)!,\n required: (slot as any)!.required,\n prompt: normalizeText(slot!.prompt),\n examples: dedupeNonEmptyStrings(slot!.examples),\n normalization: slot!.normalization,\n enumValues: dedupeNonEmptyStrings(slot!.enumValues),\n evidence: (slot as any)!.evidence as ComponentEvidence | undefined,\n extractionBehavior: (slot as any)!.extractionBehavior,\n extractionGuidance: normalizeText((slot as any)!.extractionGuidance),\n }))\n : [];\n const slotNameSet = new Set(validSlots.map(slot => slot.name));\n\n // Process capabilities - they can be strings or objects with evidence\n const validCapabilities: KBManifest['capabilities'] = Array.isArray(proposal.capabilities)\n ? proposal.capabilities\n .map(cap => {\n if (typeof cap === 'string') {\n const text = normalizeText(cap);\n return text ? text : null;\n }\n // It's an object with text and evidence\n const text = normalizeText((cap as any).text);\n if (!text) {\n return null;\n }\n return {\n text,\n evidence: (cap as any).evidence as ComponentEvidence | undefined,\n };\n })\n .filter((cap): cap is NonNullable<typeof cap> => cap !== null)\n : [];\n if (validCapabilities.length === 0) {\n validCapabilities.push(normalizedDescription || fallbackDescription);\n }\n\n // Process goals with evidence\n const validGoals = Array.isArray(proposal.goals)\n ? proposal.goals.reduce<KBGoal[]>((acc, goal) => {\n const name = normalizeText(goal.name);\n const description = normalizeText(goal.description);\n if (!name || !description) {\n return acc;\n }\n acc.push({\n name,\n description,\n evidence: (goal as any).evidence as ComponentEvidence | undefined,\n });\n return acc;\n }, [])\n : undefined;\n\n const validOutputs = dedupeNonEmptyStrings(proposal.outputs);\n if (validOutputs.length === 0) {\n validOutputs.push('answer');\n }\n\n const inputs = deriveInputsFromSlots(validSlots);\n const relevance = sanitizeRelevance(proposal.relevance, slotNameSet);\n const queryTemplate = sanitizeQueryTemplate(proposal.queryTemplate, slotNameSet);\n const scope = sanitizeScope(proposal.scope);\n\n const manifest: KBManifest = {\n id: baseInfo.kbId,\n assistantName: baseInfo.assistantName,\n domain: normalizeText(baseInfo.domain) || relevance?.domains?.[0] || 'general',\n description: normalizedDescription || fallbackDescription,\n descriptionEvidence: proposal.descriptionEvidence,\n capabilities: validCapabilities,\n outputs: validOutputs,\n inputs: inputs.length > 0 ? inputs : undefined,\n slots: validSlots,\n goals: validGoals,\n relevance,\n queryTemplate,\n scope,\n };\n\n return manifest;\n}\n\nfunction normalizeText(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction dedupeNonEmptyStrings(values: unknown): string[] {\n if (!Array.isArray(values)) return [];\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const value of values) {\n const normalized = normalizeText(value);\n if (!normalized) continue;\n if (seen.has(normalized)) continue;\n seen.add(normalized);\n deduped.push(normalized);\n }\n return deduped;\n}\n\nfunction deriveInputsFromSlots(slots: KBManifest['slots']): KBInputField[] {\n return slots.map(slot => ({\n slot: slot.name,\n required: slot.required === true,\n description: slot.description,\n evidence: slot.evidence,\n }));\n}\n\nfunction extractTemplateSlotReferences(text: string): string[] {\n const matches = [...text.matchAll(/\\{\\{\\s*([^{}\\s]+)\\s*\\}\\}/g)];\n return matches.map(match => match[1]).filter(token => token !== 'userUtterance');\n}\n\nfunction sanitizeRelevance(\n relevance: ManifestProposal['relevance'],\n slotNameSet: Set<string>\n): KBRelevanceHints | undefined {\n if (!relevance) return undefined;\n\n const goalKeywords = dedupeNonEmptyStrings(relevance.goalKeywords);\n const domains = dedupeNonEmptyStrings(relevance.domains);\n const slotTriggers = dedupeNonEmptyStrings(relevance.slotTriggers)\n .filter(slot => slotNameSet.has(slot));\n\n const sanitized: KBRelevanceHints = {};\n if (goalKeywords.length > 0) sanitized.goalKeywords = goalKeywords;\n if (domains.length > 0) sanitized.domains = domains;\n if (slotTriggers.length > 0) sanitized.slotTriggers = slotTriggers;\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction sanitizeQueryTemplate(\n queryTemplate: ManifestProposal['queryTemplate'],\n slotNameSet: Set<string>\n): KBQueryTemplate | undefined {\n if (!queryTemplate) return undefined;\n\n const preamble = normalizeText(queryTemplate.preamble);\n const closing = dedupeNonEmptyStrings(queryTemplate.closing);\n\n const sections = Array.isArray(queryTemplate.sections)\n ? queryTemplate.sections\n .map(section => {\n const text = normalizeText(section.text);\n if (!text) return undefined;\n\n const requiredFromSchema = dedupeNonEmptyStrings(section.requires);\n const requiredFromTemplate = extractTemplateSlotReferences(text);\n const requires = dedupeNonEmptyStrings([...requiredFromSchema, ...requiredFromTemplate])\n .filter(slot => slotNameSet.has(slot));\n\n const fallback = normalizeText(section.fallback);\n const optional = section.optional === true ? true : undefined;\n\n const sanitizedSection: NonNullable<KBQueryTemplate['sections']>[number] = { text };\n if (requires.length > 0) sanitizedSection.requires = requires;\n if (fallback) sanitizedSection.fallback = fallback;\n if (optional) sanitizedSection.optional = optional;\n return sanitizedSection;\n })\n .filter((section): section is NonNullable<typeof section> => Boolean(section))\n : [];\n\n const sanitized: KBQueryTemplate = {};\n if (preamble) sanitized.preamble = preamble;\n if (sections.length > 0) sanitized.sections = sections;\n if (closing.length > 0) sanitized.closing = closing;\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction sanitizeScope(scope: ManifestProposal['scope']): KBScopeDefinition | undefined {\n if (!scope) return undefined;\n const description = normalizeText(scope.description);\n if (!description) return undefined;\n\n const sanitized: KBScopeDefinition = {\n description,\n evidence: (scope as any).evidence as ComponentEvidence | undefined,\n };\n\n const inScopeExamples = dedupeNonEmptyStrings(scope.inScopeExamples);\n const outOfScopeExamples = dedupeNonEmptyStrings(scope.outOfScopeExamples);\n const excludedIntents = dedupeNonEmptyStrings(scope.excludedIntents);\n const edgeCaseExamples = dedupeNonEmptyStrings(scope.edgeCaseExamples);\n const ambiguousCases = dedupeNonEmptyStrings(scope.ambiguousCases);\n\n if (inScopeExamples.length > 0) sanitized.inScopeExamples = inScopeExamples;\n if (outOfScopeExamples.length > 0) sanitized.outOfScopeExamples = outOfScopeExamples;\n if (excludedIntents.length > 0) sanitized.excludedIntents = excludedIntents;\n if (edgeCaseExamples.length > 0) sanitized.edgeCaseExamples = edgeCaseExamples;\n if (ambiguousCases.length > 0) sanitized.ambiguousCases = ambiguousCases;\n\n return sanitized;\n}\n","/**\n * Configuration Types\n *\n * Zod schemas and TypeScript types for agent configuration.\n */\n\nimport { z } from 'zod';\n\n/** Slot definition schema */\nexport const SlotDefinitionSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'boolean', 'enum']),\n required: z.boolean().optional().default(false),\n description: z.string(),\n prompt: z.string(),\n examples: z.array(z.string()).optional(),\n normalization: z.enum(['lower_snake', 'lowercase', 'uppercase', 'none']).optional(),\n enumValues: z.array(z.string()).optional(),\n format: z.object({\n true: z.string(),\n false: z.string(),\n }).optional(),\n});\n\nexport type SlotDefinition = z.infer<typeof SlotDefinitionSchema>;\n\n/** LLM configuration schema */\nexport const LLMConfigSchema = z.object({\n provider: z.enum(['openai', 'anthropic']),\n models: z.object({\n planning: z.string(),\n extraction: z.string(),\n synthesis: z.string(),\n questionGeneration: z.string().optional(),\n }),\n});\n\nexport type LLMConfig = z.infer<typeof LLMConfigSchema>;\n\n/** Prompts configuration schema */\nexport const PromptsConfigSchema = z.object({\n plannerSystemRole: z.string(),\n synthesisSystemRole: z.string(),\n planningInstructions: z.string().optional(),\n synthesisInstructions: z.string().optional(),\n extractionInstructions: z.string().optional(),\n});\n\nexport type PromptsConfig = z.infer<typeof PromptsConfigSchema>;\n\n/** Goal examples for extraction */\nexport const GoalExamplesSchema = z.array(z.object({\n name: z.string(),\n description: z.string().optional(),\n}));\n\nexport type GoalExamples = z.infer<typeof GoalExamplesSchema>;\n\n/** Messages configuration schema */\nexport const MessagesConfigSchema = z.object({\n allKBsFailed: z.string(),\n noRelevantInfo: z.string(),\n synthesisError: z.string(),\n});\n\nexport type MessagesConfig = z.infer<typeof MessagesConfigSchema>;\n\n/** Citations configuration schema */\nexport const CitationsConfigSchema = z.object({\n format: z.enum(['brackets', 'footnotes', 'superscript']),\n labelPrefix: z.string(),\n});\n\nexport type CitationsConfig = z.infer<typeof CitationsConfigSchema>;\n\n/** Behavior configuration schema */\nexport const BehaviorConfigSchema = z.object({\n maxDisambiguationAttempts: z.number().default(3),\n fallbackStrategy: z.enum(['use_first', 'use_all', 'fail']).default('use_first'),\n enablePlanModification: z.boolean().default(true),\n});\n\nexport type BehaviorConfig = z.infer<typeof BehaviorConfigSchema>;\n\n/** KB Provider configuration schema */\nexport const KBProviderConfigSchema = z.object({\n type: z.enum(['pinecone', 'elasticsearch', 'custom']).default('pinecone'),\n // Pinecone-specific settings\n topK: z.number().default(5),\n // Name normalization (e.g., replace underscores with hyphens)\n normalizeNames: z.boolean().default(true),\n});\n\nexport type KBProviderConfig = z.infer<typeof KBProviderConfigSchema>;\n\n/** Session/logging configuration schema */\nexport const SessionConfigSchema = z.object({\n maxLogsPerSession: z.number().default(1000),\n maxTraceStepsPerSession: z.number().default(500),\n});\n\nexport type SessionConfig = z.infer<typeof SessionConfigSchema>;\n\n/** Providers configuration schema (aggregates all provider settings) */\nexport const ProvidersConfigSchema = z.object({\n kb: KBProviderConfigSchema.optional().default({}),\n session: SessionConfigSchema.optional().default({}),\n});\n\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigSchema>;\n\n/** Slot mappings schema - maps canonical slot names to KB-specific original names */\nexport const SlotMappingsSchema = z.record(\n z.string(), // KB ID\n z.record(z.string(), z.string()) // canonical slot name -> original slot name\n);\n\nexport type SlotMappings = z.infer<typeof SlotMappingsSchema>;\n\n/** Main agent configuration schema */\nexport const AgentConfigSchema = z.object({\n // Identity\n name: z.string(),\n domain: z.string(),\n\n // LLM settings\n llm: LLMConfigSchema,\n\n // Prompts\n prompts: PromptsConfigSchema,\n\n // Messages\n messages: MessagesConfigSchema,\n\n // Slot definitions\n slots: z.array(SlotDefinitionSchema),\n\n // Slot priority for disambiguation\n slotPriority: z.array(z.string()),\n\n // Goal examples for extraction\n goals: GoalExamplesSchema.optional(),\n\n // Default KB for fallback\n defaultKbId: z.string(),\n\n // Citation formatting\n citations: CitationsConfigSchema,\n\n // Behavioral settings\n behavior: BehaviorConfigSchema,\n\n // Provider settings (optional, with defaults)\n providers: ProvidersConfigSchema.optional().default({}),\n\n // Slot mappings for reconciled slots (maps canonical -> original per KB)\n slotMappings: SlotMappingsSchema.optional(),\n});\n\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n/** Helper type for dynamic Slots based on config */\nexport type DynamicSlots = {\n [key: string]: string | boolean | undefined;\n};\n\n","import { z } from 'zod';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { AgentConfig, AgentConfigSchema, SlotDefinition } from '../types/config';\n\n/** Cached config */\nlet cachedConfig: AgentConfig | null = null;\nlet cachedSlotsSchema: z.ZodObject<any> | null = null;\n\n/** Runtime config override (for SaaS multi-tenant use) */\nlet runtimeConfig: AgentConfig | null = null;\n\n/** Base path for config and composition files (defaults to cwd) */\nlet configBasePath: string | null = null;\n\n/**\n * Set the base path for loading config and composition files.\n * This is useful for testing where fixtures are in a different directory.\n * \n * @param basePath - The base directory path, or null to reset to cwd\n */\nexport function setConfigBasePath(basePath: string | null): void {\n configBasePath = basePath;\n}\n\n/**\n * Get the current base path for config files\n */\nexport function getConfigBasePath(): string {\n return configBasePath || process.cwd();\n}\n\n/**\n * Load and validate the agent configuration from agent.config.json\n */\nexport function loadConfig(configPath?: string): AgentConfig {\n if (cachedConfig) {\n return cachedConfig;\n }\n\n const path = configPath || join(getConfigBasePath(), 'agent.config.json');\n\n try {\n const configFile = readFileSync(path, 'utf-8');\n const rawConfig = JSON.parse(configFile);\n\n // Validate against schema\n const config = AgentConfigSchema.parse(rawConfig);\n cachedConfig = config;\n\n return config;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.issues.map(i => ` - ${i.path.join('.')}: ${i.message}`).join('\\n');\n throw new Error(`Invalid agent configuration:\\n${issues}`);\n }\n if (error instanceof Error && error.message.includes('ENOENT')) {\n throw new Error(`Agent configuration file not found: ${path}`);\n }\n throw error;\n }\n}\n\n/**\n * Get the current config (loads if not already loaded)\n * If a runtime config is set, returns that instead.\n */\nexport function getConfig(): AgentConfig {\n if (runtimeConfig) {\n return runtimeConfig;\n }\n return loadConfig();\n}\n\n/**\n * Set a runtime config override (for SaaS multi-tenant use).\n * This allows dynamic config without a static agent.config.json file.\n * \n * @param config - The config to use, or null to clear\n */\nexport function setRuntimeConfig(config: AgentConfig | null): void {\n runtimeConfig = config;\n}\n\n/**\n * Get the current runtime config (if set)\n */\nexport function getRuntimeConfig(): AgentConfig | null {\n return runtimeConfig;\n}\n\n/**\n * Build a Zod schema for slots based on config\n */\nexport function buildSlotsSchema(config?: AgentConfig): z.ZodObject<any> {\n if (cachedSlotsSchema && !config) {\n return cachedSlotsSchema;\n }\n\n const cfg = config || getConfig();\n\n const schemaShape: Record<string, z.ZodTypeAny> = {};\n\n for (const slot of cfg.slots) {\n if (slot.type === 'boolean') {\n schemaShape[slot.name] = z.boolean().optional();\n } else {\n schemaShape[slot.name] = z.string().optional();\n }\n }\n\n const schema = z.object(schemaShape);\n\n if (!config) {\n cachedSlotsSchema = schema;\n }\n\n return schema;\n}\n\n/**\n * Get slot definition by name\n */\nexport function getSlotDefinition(slotName: string, config?: AgentConfig): SlotDefinition | undefined {\n const cfg = config || getConfig();\n return cfg.slots.find(s => s.name === slotName);\n}\n\n/**\n * Get all slot names\n */\nexport function getSlotNames(config?: AgentConfig): string[] {\n const cfg = config || getConfig();\n return cfg.slots.map(s => s.name);\n}\n\n/**\n * Get required slot names\n */\nexport function getRequiredSlots(config?: AgentConfig): string[] {\n const cfg = config || getConfig();\n return cfg.slots.filter(s => s.required).map(s => s.name);\n}\n\n/**\n * Format a slot value based on its type\n */\nexport function formatSlotValue(\n slotName: string,\n value: string | boolean | undefined,\n config?: AgentConfig\n): string | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n\n const cfg = config || getConfig();\n const slotDef = cfg.slots.find(s => s.name === slotName);\n\n if (typeof value === 'boolean') {\n if (slotDef?.format) {\n return value ? slotDef.format.true : slotDef.format.false;\n }\n return value ? 'yes' : 'no';\n }\n\n return String(value);\n}\n\n/**\n * Get the LLM model for a specific purpose\n */\nexport function getModel(purpose: 'planning' | 'extraction' | 'synthesis' | 'questionGeneration', config?: AgentConfig): string {\n const cfg = config || getConfig();\n return cfg.llm.models[purpose] || cfg.llm.models.extraction;\n}\n\n/**\n * Format citation label based on config\n */\nexport function formatCitationLabel(index: number, config?: AgentConfig): string {\n const cfg = config || getConfig();\n return `${cfg.citations.labelPrefix}${index + 1}`;\n}\n\n/**\n * Clear cached config (useful for testing)\n * \n * @param resetBasePath - If true, also resets the base path to default (cwd)\n * @param clearRuntime - If true, also clears the runtime config override\n */\nexport function clearConfigCache(resetBasePath = false, clearRuntime = false): void {\n cachedConfig = null;\n cachedSlotsSchema = null;\n if (resetBasePath) {\n configBasePath = null;\n }\n if (clearRuntime) {\n runtimeConfig = null;\n }\n}\n\n/**\n * Get prompt template with substitutions\n */\nexport function getPrompt(\n key: 'plannerSystemRole' | 'synthesisSystemRole' | 'planningInstructions' | 'synthesisInstructions',\n config?: AgentConfig\n): string {\n const cfg = config || getConfig();\n return cfg.prompts[key] || '';\n}\n\n/**\n * Get fallback message\n */\nexport function getMessage(\n key: 'allKBsFailed' | 'noRelevantInfo' | 'synthesisError',\n config?: AgentConfig\n): string {\n const cfg = config || getConfig();\n return cfg.messages[key];\n}\n\n/**\n * Get KB provider configuration\n */\nexport function getKBProviderConfig(config?: AgentConfig) {\n const cfg = config || getConfig();\n return cfg.providers?.kb ?? {\n type: 'pinecone' as const,\n topK: 5,\n normalizeNames: true,\n };\n}\n\n/**\n * Get session configuration\n */\nexport function getSessionConfig(config?: AgentConfig) {\n const cfg = config || getConfig();\n return cfg.providers?.session ?? {\n maxLogsPerSession: 1000,\n maxTraceStepsPerSession: 500,\n };\n}\n\n/** Re-export types for backwards compatibility */\nexport * from '../types/config';\n","/**\n * Logger Module\n *\n * Utility for capturing and streaming logs via SSE (Server-Sent Events).\n * Provides session-scoped logging and trace step streaming.\n */\n\nimport { getSessionConfig } from './runtime/config';\n\nexport type LogLevel = 'log' | 'info' | 'warn' | 'error' | 'debug';\n\nexport interface LogEntry {\n id: string;\n sessionId: string;\n level: LogLevel;\n message: string;\n timestamp: string;\n data?: any;\n stack?: string;\n}\n\n/** Store for active log streams per session */\nconst logStreams = new Map<string, Set<(log: LogEntry) => void>>();\n\n/** Store logs per session for retrieval */\nconst sessionLogs = new Map<string, LogEntry[]>();\n\n/** Store for active trace step streams per session */\nconst traceStepStreams = new Map<string, Set<(traceStep: any) => void>>();\n\n/** Store trace steps per session for retrieval */\nconst sessionTraceSteps = new Map<string, any[]>();\n\n/**\n * Subscribe to log entries for a specific session\n *\n * @param sessionId - The session identifier to subscribe to\n * @param callback - Function called when a log entry is emitted\n * @returns Unsubscribe function to stop receiving logs\n */\nexport function subscribeToLogs(sessionId: string, callback: (log: LogEntry) => void): () => void {\n if (!logStreams.has(sessionId)) {\n logStreams.set(sessionId, new Set());\n }\n \n const callbacks = logStreams.get(sessionId)!;\n callbacks.add(callback);\n \n // Send any existing logs for this session\n const existingLogs = sessionLogs.get(sessionId) || [];\n existingLogs.forEach(log => callback(log));\n \n // Return unsubscribe function\n return () => {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n logStreams.delete(sessionId);\n }\n };\n}\n\n/**\n * Emit a log entry for a session\n *\n * @param sessionId - The session identifier\n * @param level - Log level (log, info, warn, error, debug)\n * @param message - The log message\n * @param data - Optional additional data to include\n * @param error - Optional error object for error-level logs\n */\nexport function emitLog(sessionId: string, level: LogLevel, message: string, data?: any, error?: Error) {\n const logEntry: LogEntry = {\n id: `${sessionId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n sessionId,\n level,\n message,\n timestamp: new Date().toISOString(),\n data,\n stack: error?.stack,\n };\n \n // Store log\n if (!sessionLogs.has(sessionId)) {\n sessionLogs.set(sessionId, []);\n }\n const logs = sessionLogs.get(sessionId)!;\n logs.push(logEntry);\n \n // Keep only last N logs per session (configurable)\n const sessionConfig = getSessionConfig();\n if (logs.length > sessionConfig.maxLogsPerSession) {\n logs.shift();\n }\n \n // Emit to all subscribers\n const callbacks = logStreams.get(sessionId);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback(logEntry);\n } catch (err) {\n // Don't log full error object - it may contain non-serializable structures\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error('Error in log callback:', errMsg);\n }\n });\n }\n \n // Also log to console for debugging\n const consoleMethod = level === 'debug' ? 'log' : level;\n if (consoleMethod === 'error' && error) {\n // Don't log full error object - it may contain non-serializable structures\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n console[consoleMethod](`[${sessionId}] ${message}`, errorMsg);\n if (errorStack) console[consoleMethod](`[${sessionId}] Stack:`, errorStack);\n } else if (data) {\n console[consoleMethod](`[${sessionId}] ${message}`, data);\n } else {\n console[consoleMethod](`[${sessionId}] ${message}`);\n }\n}\n\n/**\n * Get all stored logs for a session\n *\n * @param sessionId - The session identifier\n * @returns Array of log entries for the session\n */\nexport function getSessionLogs(sessionId: string): LogEntry[] {\n return sessionLogs.get(sessionId) || [];\n}\n\n/**\n * Clear all logs and trace steps for a session\n *\n * @param sessionId - The session identifier\n */\nexport function clearSessionLogs(sessionId: string) {\n sessionLogs.delete(sessionId);\n logStreams.delete(sessionId);\n sessionTraceSteps.delete(sessionId);\n traceStepStreams.delete(sessionId);\n}\n\n/**\n * Subscribe to trace steps for a session\n *\n * @param sessionId - The session identifier to subscribe to\n * @param callback - Function called when a trace step is emitted\n * @returns Unsubscribe function to stop receiving trace steps\n */\nexport function subscribeToTraceSteps(sessionId: string, callback: (traceStep: any) => void): () => void {\n if (!traceStepStreams.has(sessionId)) {\n traceStepStreams.set(sessionId, new Set());\n }\n \n const callbacks = traceStepStreams.get(sessionId)!;\n callbacks.add(callback);\n \n // Send any existing trace steps for this session\n const existingSteps = sessionTraceSteps.get(sessionId) || [];\n existingSteps.forEach(step => callback(step));\n \n // Return unsubscribe function\n return () => {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n traceStepStreams.delete(sessionId);\n }\n };\n}\n\n/**\n * Emit a trace step for a session\n *\n * @param sessionId - The session identifier\n * @param traceStep - The trace step object to emit\n */\nexport function emitTraceStep(sessionId: string, traceStep: any) {\n // Store trace step\n if (!sessionTraceSteps.has(sessionId)) {\n sessionTraceSteps.set(sessionId, []);\n }\n const steps = sessionTraceSteps.get(sessionId)!;\n steps.push(traceStep);\n \n // Keep only last N trace steps per session (configurable)\n const sessionConfig = getSessionConfig();\n if (steps.length > sessionConfig.maxTraceStepsPerSession) {\n steps.shift();\n }\n \n // Emit to all subscribers\n const callbacks = traceStepStreams.get(sessionId);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback(traceStep);\n } catch (err) {\n // Don't log full error object - it may contain non-serializable structures\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error('Error in trace step callback:', errMsg);\n }\n });\n }\n}\n\n/**\n * Get all stored trace steps for a session\n *\n * @param sessionId - The session identifier\n * @returns Array of trace steps for the session\n */\nexport function getSessionTraceSteps(sessionId: string): any[] {\n return sessionTraceSteps.get(sessionId) || [];\n}\n\n/**\n * Create a logger instance for a specific session\n *\n * @param sessionId - The session identifier\n * @returns Logger object with log, info, warn, error, and debug methods\n */\nexport function createSessionLogger(sessionId: string) {\n return {\n log: (message: string, data?: any) => emitLog(sessionId, 'log', message, data),\n info: (message: string, data?: any) => emitLog(sessionId, 'info', message, data),\n warn: (message: string, data?: any) => emitLog(sessionId, 'warn', message, data),\n error: (message: string, error?: Error, data?: any) => emitLog(sessionId, 'error', message, data, error),\n debug: (message: string, data?: any) => emitLog(sessionId, 'debug', message, data),\n };\n}\n\n","/**\n * Trace Adapter System\n *\n * Pluggable adapters for emitting trace events to different outputs.\n * Implement the TraceAdapter interface to create custom trace UIs.\n */\n\nimport { TraceEvent } from '../types';\nimport { emitTraceStep } from '../logger';\n\n/**\n * TraceAdapter Interface\n *\n * Implement this interface to create custom trace outputs (e.g., custom UI, logging, analytics).\n * Uses a single emit() method with a discriminated union for all event types.\n *\n * @example\n * ```typescript\n * class MyCustomTraceAdapter implements TraceAdapter {\n * emit(event: TraceEvent) {\n * switch (event.type) {\n * case 'step':\n * myUI.showStep(event.step);\n * break;\n * case 'trace_complete':\n * myAnalytics.track('agent_complete', event.trace);\n * break;\n * case 'follow_up':\n * myUI.showQuestions(event.questions);\n * break;\n * case 'session_id':\n * myLogger.setSessionId(event.sessionId);\n * break;\n * }\n * }\n * }\n * ```\n */\nexport interface TraceAdapter {\n /**\n * Emit a trace event.\n * Handle different event types by switching on event.type.\n */\n emit(event: TraceEvent): void | Promise<void>;\n}\n\n/**\n * Data stream writer interface for Vercel AI SDK compatibility\n */\nexport interface DataStreamWriter {\n writeData(data: unknown): void;\n}\n\n/**\n * SSE Trace Adapter\n *\n * Emits trace steps via Server-Sent Events using the existing logger infrastructure.\n * This is the default adapter for the standard (non-streaming) app.\n */\nexport class SSETraceAdapter implements TraceAdapter {\n constructor(private readonly sessionId: string) {}\n\n emit(event: TraceEvent): void {\n switch (event.type) {\n case 'step':\n emitTraceStep(this.sessionId, event.step);\n break;\n case 'trace_complete':\n // Trace complete is sent as part of the response body, not SSE\n break;\n case 'follow_up':\n // Follow-up questions are sent as part of the response body\n break;\n case 'session_id':\n // Session ID is already known at construction\n break;\n }\n }\n}\n\n/**\n * Stream annotation for Vercel AI SDK data stream protocol\n */\nexport interface StreamAnnotation {\n type: 'trace_step' | 'trace_complete' | 'follow_up' | 'session_id';\n step?: unknown;\n trace?: unknown;\n questions?: string[];\n sessionId?: string;\n}\n\n/**\n * Vercel Data Stream Trace Adapter\n *\n * Emits trace steps as data stream annotations for Vercel AI SDK streaming responses.\n * Use with createDataStreamResponse() from the 'ai' package.\n */\nexport class VercelDataStreamAdapter implements TraceAdapter {\n private dataStream: DataStreamWriter | null = null;\n\n /**\n * Set the data stream to write to.\n * Must be called before any trace methods.\n */\n setDataStream(dataStream: DataStreamWriter): void {\n this.dataStream = dataStream;\n }\n\n emit(event: TraceEvent): void {\n if (!this.dataStream) return;\n\n switch (event.type) {\n case 'step':\n this.dataStream.writeData({\n type: 'trace_step',\n step: JSON.parse(JSON.stringify(event.step)),\n });\n break;\n case 'trace_complete':\n this.dataStream.writeData({\n type: 'trace_complete',\n trace: JSON.parse(JSON.stringify(event.trace)),\n });\n break;\n case 'follow_up':\n this.dataStream.writeData({\n type: 'follow_up',\n questions: event.questions,\n });\n break;\n case 'session_id':\n this.dataStream.writeData({\n type: 'session_id',\n sessionId: event.sessionId,\n });\n break;\n }\n }\n}\n\n/**\n * Buffering Vercel Data Stream Trace Adapter\n *\n * Buffers trace events for progressive streaming. Events are stored in a buffer\n * and can be flushed to a response stream on demand. This enables true progressive\n * streaming where trace annotations are interleaved with text chunks.\n *\n * @example\n * ```typescript\n * const adapter = new BufferingVercelDataStreamAdapter();\n * const streamingResult = await runAgentStreaming({ message, traceAdapter: adapter });\n * return toVercelAIStreamingResponse(streamingResult, adapter);\n * ```\n */\nexport class BufferingVercelDataStreamAdapter implements TraceAdapter {\n private buffer: StreamAnnotation[] = [];\n private onFlush: ((annotations: StreamAnnotation[]) => void) | null = null;\n\n /**\n * Set a callback to be invoked when annotations are ready to flush.\n * Used internally by toVercelAIStreamingResponse.\n */\n setFlushCallback(callback: (annotations: StreamAnnotation[]) => void): void {\n this.onFlush = callback;\n // Immediately flush any buffered annotations\n if (this.buffer.length > 0) {\n callback(this.buffer);\n this.buffer = [];\n }\n }\n\n /**\n * Get and clear all buffered annotations.\n */\n flush(): StreamAnnotation[] {\n const annotations = this.buffer;\n this.buffer = [];\n return annotations;\n }\n\n /**\n * Check if there are buffered annotations.\n */\n hasBufferedAnnotations(): boolean {\n return this.buffer.length > 0;\n }\n\n emit(event: TraceEvent): void {\n let annotation: StreamAnnotation;\n\n switch (event.type) {\n case 'step':\n annotation = {\n type: 'trace_step',\n step: JSON.parse(JSON.stringify(event.step)),\n };\n break;\n case 'trace_complete':\n annotation = {\n type: 'trace_complete',\n trace: JSON.parse(JSON.stringify(event.trace)),\n };\n break;\n case 'follow_up':\n annotation = {\n type: 'follow_up',\n questions: event.questions,\n };\n break;\n case 'session_id':\n annotation = {\n type: 'session_id',\n sessionId: event.sessionId,\n };\n break;\n default:\n return;\n }\n\n // If we have a flush callback, send immediately\n if (this.onFlush) {\n this.onFlush([annotation]);\n } else {\n // Otherwise buffer for later\n this.buffer.push(annotation);\n }\n }\n}\n\n/**\n * No-Op Trace Adapter\n *\n * Does nothing with trace events. Useful for testing or when tracing is not needed.\n */\nexport class NoOpTraceAdapter implements TraceAdapter {\n emit(_event: TraceEvent): void {}\n}\n\n/**\n * Callback Trace Adapter\n *\n * Allows passing a callback function for trace events.\n * Convenient for simple custom integrations without creating a full class.\n */\nexport class CallbackTraceAdapter implements TraceAdapter {\n constructor(\n private readonly callback: (event: TraceEvent) => void | Promise<void>\n ) {}\n\n emit(event: TraceEvent): void | Promise<void> {\n return this.callback(event);\n }\n}\n\n/**\n * Create an SSE trace adapter for a session\n */\nexport function createSSETraceAdapter(sessionId: string): TraceAdapter {\n return new SSETraceAdapter(sessionId);\n}\n\n/**\n * Create a Vercel data stream trace adapter\n */\nexport function createVercelDataStreamAdapter(): VercelDataStreamAdapter {\n return new VercelDataStreamAdapter();\n}\n\n/**\n * Create a buffering Vercel data stream trace adapter for progressive streaming\n */\nexport function createBufferingVercelDataStreamAdapter(): BufferingVercelDataStreamAdapter {\n return new BufferingVercelDataStreamAdapter();\n}\n\n/**\n * Create a no-op trace adapter\n */\nexport function createNoOpTraceAdapter(): TraceAdapter {\n return new NoOpTraceAdapter();\n}\n\n/**\n * Create a callback-based trace adapter\n */\nexport function createCallbackTraceAdapter(\n callback: (event: TraceEvent) => void | Promise<void>\n): TraceAdapter {\n return new CallbackTraceAdapter(callback);\n}\n","/**\n * Agent Context Factory\n *\n * Creates and manages the conversation state context for agents.\n */\n\nimport { AgentContext } from './types';\n\n/**\n * Initialize a new AgentContext\n *\n * @param userUtterance - The user's initial message or current utterance\n * @param previousContext - Optional previous context to merge with (for multi-turn conversations)\n * @returns A new or merged AgentContext\n */\nexport function createAgentContext(userUtterance: string, previousContext?: AgentContext): AgentContext {\n const now = new Date().toISOString();\n\n // If there's a previous context, we'll merge with it\n if (previousContext) {\n return {\n ...previousContext,\n userObjective: previousContext.userObjective || userUtterance,\n agentThinking: [\n ...previousContext.agentThinking,\n {\n phase: 'disambiguation',\n timestamp: now,\n reasoning: `Continuing conversation. New user message: \"${userUtterance}\"`,\n },\n ],\n // Preserve step counts for incrementing step IDs across turns\n stepCounts: previousContext.stepCounts || {},\n };\n }\n\n // Create new context\n return {\n userObjective: userUtterance,\n missingInformation: {\n slots: [],\n unobtainableSlots: [],\n descriptions: {},\n questionHistory: [],\n },\n collectedInformation: {\n slots: {},\n collectionHistory: [],\n },\n kbRetrievals: [],\n agentThinking: [\n {\n phase: 'disambiguation',\n timestamp: now,\n reasoning: `Starting new conversation. User objective: \"${userUtterance}\"`,\n },\n ],\n stepCounts: {},\n };\n}\n\n","import fs from 'fs';\nimport path from 'path';\nimport { z, ZodTypeAny } from 'zod';\nimport {\n CompositionRegistry,\n KBManifest,\n SlotDefinition,\n SlotSchemaShape,\n} from '../types/composition';\nimport { getConfig, getConfigBasePath, SlotDefinition as ConfigSlotDefinition } from '../runtime/config';\n\nlet cachedRegistry: CompositionRegistry | null = null;\n\nfunction readManifests(): KBManifest[] {\n // Look for manifests in composition/manifests relative to the config base path\n // This allows the framework to work with any example app structure\n const manifestsDir = path.join(getConfigBasePath(), 'composition', 'manifests');\n if (!fs.existsSync(manifestsDir)) {\n return [];\n }\n\n const files = fs\n .readdirSync(manifestsDir)\n .filter(file => file.endsWith('.json'));\n\n return files.map(file => {\n const raw = fs.readFileSync(path.join(manifestsDir, file), 'utf-8');\n const parsed = JSON.parse(raw) as KBManifest;\n return parsed;\n });\n}\n\n/**\n * Builds a lookup map of slot definitions from the agent configuration.\n * \n * Reads slot definitions from agent.config.json and converts them into a Map\n * structure keyed by slot name. This map is used throughout the system to look up\n * slot metadata (type, description, prompts, normalization rules, etc.) when\n * processing user inputs or generating questions.\n * \n * @returns Map where keys are slot names and values are SlotDefinition objects\n */\nfunction buildSlotMapFromConfig(): Map<string, SlotDefinition> {\n const config = getConfig();\n const slotMap = new Map<string, SlotDefinition>();\n\n config.slots.forEach((slot: ConfigSlotDefinition) => {\n // Convert from config format to registry format\n const slotDef: SlotDefinition = {\n name: slot.name,\n type: slot.type,\n description: slot.description,\n prompt: slot.prompt,\n examples: slot.examples,\n normalization: slot.normalization,\n };\n slotMap.set(slot.name, slotDef);\n });\n\n return slotMap;\n}\n\nexport function loadCompositionRegistry(): CompositionRegistry {\n if (cachedRegistry) {\n return cachedRegistry;\n }\n\n const manifests = readManifests();\n // Use slot definitions from config instead of manifests\n const slotMap = buildSlotMapFromConfig();\n cachedRegistry = {\n manifests,\n slotMap,\n };\n return cachedRegistry;\n}\n\n/**\n * Clear the cached composition registry (useful for testing)\n */\nexport function clearCompositionCache(): void {\n cachedRegistry = null;\n}\n\nexport function getSlotDefinitions(): SlotDefinition[] {\n return Array.from(loadCompositionRegistry().slotMap.values());\n}\n\nexport function getSlotDefinition(name: string): SlotDefinition | undefined {\n return loadCompositionRegistry().slotMap.get(name);\n}\n\nfunction createSchemaForSlot(slot: SlotDefinition): ZodTypeAny {\n switch (slot.type) {\n case 'boolean':\n return z.boolean().optional();\n case 'enum':\n if (!slot.enumValues || slot.enumValues.length === 0) {\n return z.string().optional();\n }\n return z.enum(slot.enumValues as [string, ...string[]]).optional();\n case 'string':\n default:\n return z\n .string()\n .min(1)\n .transform(value => value.trim())\n .optional();\n }\n}\n\nexport function buildSlotsSchema(): z.ZodObject<SlotSchemaShape> {\n const slotDefs = getSlotDefinitions();\n const shape: SlotSchemaShape = {};\n\n slotDefs.forEach(slot => {\n shape[slot.name] = createSchemaForSlot(slot);\n });\n\n return z.object(shape).partial();\n}\n\nexport function getKBManifests(): KBManifest[] {\n return loadCompositionRegistry().manifests;\n}\n\nexport function getKBManifestById(kbId: string): KBManifest | undefined {\n return getKBManifests().find(manifest => manifest.id === kbId);\n}\n\n/**\n * Get all unique capabilities across all knowledge base manifests.\n * Used for generating redirect messages that show what the agent can help with.\n */\nexport function getAllCapabilities(): string[] {\n const manifests = getKBManifests();\n const capabilitiesSet = new Set<string>();\n \n manifests.forEach(manifest => {\n manifest.capabilities.forEach(cap => {\n // Capabilities can be strings or objects with evidence\n const capText = typeof cap === 'string' ? cap : cap.text;\n capabilitiesSet.add(capText);\n });\n });\n \n return Array.from(capabilitiesSet);\n}\n\n/**\n * Get all unique domains across all knowledge base manifests.\n * Used for generating redirect messages.\n */\nexport function getAllDomains(): string[] {\n const manifests = getKBManifests();\n const domainsSet = new Set<string>();\n \n manifests.forEach(manifest => {\n domainsSet.add(manifest.domain);\n });\n \n return Array.from(domainsSet);\n}\n","/**\n * LLM-based slot extractor.\n * Extracts facts from user utterance - no decisions, just observations.\n */\n\nimport { z } from 'zod';\nimport { LLMExtractionFacts, Slots, AgentContext, ConversationMessage, KBMeta, FrameworkContext } from '../types';\nimport { getSlotDefinition, getSlotDefinitions } from '../composition/registry';\nimport { getModel, getConfig } from '../runtime/config';\n\n/**\n * Build a permissive schema for extraction that allows empty strings.\n * We filter them out after extraction.\n * \n * NOTE: This is called dynamically each time to support SaaS multi-tenant use\n * where slot definitions come from manifests and change per-request.\n */\nfunction buildPermissiveSlotsSchema(): z.ZodObject<any> {\n const slotDefs = getSlotDefinitions();\n const shape: Record<string, z.ZodTypeAny> = {};\n\n slotDefs.forEach(slot => {\n if (slot.type === 'boolean') {\n shape[slot.name] = z.boolean().nullable().optional();\n } else {\n // Allow any string including empty or null - we filter after\n shape[slot.name] = z.string().nullable().optional();\n }\n });\n\n return z.object(shape).partial();\n}\n\n/**\n * Build the extraction schema dynamically.\n * This needs to be called per-request to pick up runtime config slot definitions.\n */\nfunction buildExtractionSchema() {\n const permissiveSlotsSchema = buildPermissiveSlotsSchema();\n \n return z.object({\n slots: permissiveSlotsSchema,\n goals: z.array(z.string()),\n kbHints: z.array(z.string()),\n intentSummary: z.string(),\n // LLM determines if user couldn't answer the pending question\n nonAnswer: z.boolean().optional(),\n // LLM determines if user has changed topics (e.g., from one entity/subject to another)\n topicShift: z.boolean().optional(),\n // LLM determines if query is fundamentally outside the agent's scope\n isOutOfScope: z.boolean().optional(),\n // LLM's reasoning about the extraction\n reasoning: z.string().optional(),\n });\n}\n\n/**\n * Check if a slot value is considered \"filled\" (has a meaningful value).\n * Note: boolean false IS considered a valid filled value!\n */\nfunction isSlotFilled(value: string | boolean | undefined): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'boolean') return true; // false is a valid boolean value\n if (typeof value === 'string' && value === '') return false;\n return true;\n}\n\n/**\n * Build a concise summary of context for LLM\n */\nfunction summarizeContext(context: AgentContext): string {\n const parts: string[] = [];\n\n if (context.userObjective) {\n parts.push(`Objective: ${context.userObjective}`);\n }\n\n const slots = context.collectedInformation.slots;\n const filledSlots = Object.entries(slots)\n .filter(([, v]) => isSlotFilled(v))\n .map(([k, v]) => `${k}=\"${v}\"`);\n\n if (filledSlots.length > 0) {\n parts.push(`Known: ${filledSlots.join(', ')}`);\n }\n\n const missing = context.missingInformation.slots;\n if (missing.length > 0) {\n parts.push(`Missing: ${missing.join(', ')}`);\n }\n\n return parts.join('. ');\n}\n\n/**\n * Build slot metadata for LLM reference, including extraction guidance from manifest.\n */\nfunction buildSlotMetadata(): string {\n return getSlotDefinitions()\n .map(slot => {\n const examples = slot.examples?.length ? ` Examples: ${slot.examples.join(', ')}.` : '';\n \n // Use LLM-generated extraction guidance if available, otherwise fall back to behavior hint\n let guidanceText = '';\n if (slot.extractionGuidance) {\n guidanceText = ` [EXTRACTION: ${slot.extractionGuidance}]`;\n } else if (slot.extractionBehavior === 'identifier') {\n guidanceText = ' [IDENTIFIER: requires specific value, not just a category/type]';\n } else if (slot.extractionBehavior === 'categorization' || slot.type === 'enum') {\n guidanceText = ' [CATEGORIZATION: only fill if user explicitly indicates a specific category]';\n }\n \n return `- ${slot.name}: ${slot.description}.${examples}${guidanceText}`;\n })\n .join('\\n');\n}\n\n/**\n * Build extraction guidance based on slot definitions.\n * Uses LLM-generated guidance from manifest when available.\n */\nfunction buildExtractionGuidance(): string {\n const slots = getSlotDefinitions();\n \n // Collect slots with specific guidance\n const slotsWithGuidance = slots.filter(s => \n s.extractionGuidance || s.extractionBehavior === 'identifier' || s.extractionBehavior === 'categorization' || s.type === 'enum'\n );\n \n if (slotsWithGuidance.length === 0) {\n return '';\n }\n \n let guidance = '\\n **SLOT-SPECIFIC EXTRACTION RULES:**';\n \n for (const slot of slotsWithGuidance) {\n if (slot.extractionGuidance) {\n // Use the LLM-generated guidance from manifest\n guidance += `\\n - **${slot.name}**: ${slot.extractionGuidance}`;\n } else if (slot.extractionBehavior === 'identifier') {\n guidance += `\\n - **${slot.name}** [IDENTIFIER]: Requires a specific identifier, not a general category/type. Leave empty if user only provides a general category.`;\n } else if (slot.extractionBehavior === 'categorization' || slot.type === 'enum') {\n guidance += `\\n - **${slot.name}** [CATEGORIZATION]: Only fill if user explicitly indicates a specific category. Vague descriptions should leave this empty.`;\n }\n }\n \n return guidance;\n}\n\n/**\n * Normalize a slot value based on its definition\n */\nfunction normalizeSlotValue(slotName: string, value: string | boolean | undefined): string | boolean | undefined {\n if (typeof value !== 'string') return value;\n\n const slotDef = getSlotDefinition(slotName);\n if (!slotDef?.normalization || slotDef.normalization === 'none') {\n return value;\n }\n\n switch (slotDef.normalization) {\n case 'lower_snake':\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .replace(/\\s+/g, '_');\n case 'lowercase':\n return value.toLowerCase();\n case 'uppercase':\n return value.toUpperCase();\n default:\n return value;\n }\n}\n\n\n/**\n * Format conversation history for LLM prompt\n */\nfunction formatConversationHistory(history?: ConversationMessage[]): string {\n if (!history || history.length === 0) {\n return '';\n }\n\n const formatted = history.map((msg, idx) => {\n const roleLabel = msg.role === 'user' ? 'User' : 'Assistant';\n const timestamp = msg.timestamp ? new Date(msg.timestamp).toLocaleTimeString() : '';\n return `${idx + 1}. [${roleLabel}${timestamp ? ` at ${timestamp}` : ''}]: ${msg.content}`;\n }).join('\\n');\n\n return `\\n\\nFull Conversation History (in chronological order):\n${formatted}\n\nThe current message is the latest user message in this conversation.`;\n}\n\n/**\n * Build scope context from KB manifests for LLM scope assessment.\n * This dynamically generates scope information from the manifests,\n * making the framework domain-agnostic.\n */\nfunction buildScopeContext(kbCatalog: KBMeta[]): string {\n const scopeDescriptions: string[] = [];\n const allInScopeExamples: string[] = [];\n const allOutOfScopeExamples: string[] = [];\n const allExcludedIntents: string[] = [];\n\n kbCatalog.forEach(kb => {\n if (kb.scope) {\n if (kb.scope.description) {\n scopeDescriptions.push(`- ${kb.id}: ${kb.scope.description}`);\n }\n if (kb.scope.inScopeExamples) {\n allInScopeExamples.push(...kb.scope.inScopeExamples);\n }\n if (kb.scope.outOfScopeExamples) {\n allOutOfScopeExamples.push(...kb.scope.outOfScopeExamples);\n }\n if (kb.scope.excludedIntents) {\n allExcludedIntents.push(...kb.scope.excludedIntents);\n }\n }\n });\n\n // If no scope definitions exist, return empty string\n if (scopeDescriptions.length === 0 && allInScopeExamples.length === 0 && \n allOutOfScopeExamples.length === 0 && allExcludedIntents.length === 0) {\n return '';\n }\n\n let context = '\\n\\n=== SCOPE BOUNDARIES (CRITICAL FOR SCOPE ASSESSMENT) ===';\n \n if (scopeDescriptions.length > 0) {\n context += `\\n\\nWhat this agent helps with:\\n${scopeDescriptions.join('\\n')}`;\n }\n \n if (allExcludedIntents.length > 0) {\n const uniqueExcluded = [...new Set(allExcludedIntents)];\n context += `\\n\\nThe agent explicitly CANNOT help with these intent types: ${uniqueExcluded.join(', ')}`;\n }\n \n if (allInScopeExamples.length > 0) {\n context += `\\n\\nExamples of IN-SCOPE queries (these ARE within scope):\\n${allInScopeExamples.map(e => `- \"${e}\"`).join('\\n')}`;\n }\n \n if (allOutOfScopeExamples.length > 0) {\n context += `\\n\\nExamples of OUT-OF-SCOPE queries (these are NOT within scope, even if they mention valid products):\\n${allOutOfScopeExamples.map(e => `- \"${e}\"`).join('\\n')}`;\n }\n\n context += '\\n\\n=== END SCOPE BOUNDARIES ===';\n\n return context;\n}\n\n/**\n * Extract slots and hints from user utterance using LLM.\n * This is a pure fact-finding function - no decisions about what to do next.\n *\n * @param utterance - The user's current message\n * @param context - Agent context with conversation state\n * @param kbCatalog - Available knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n * @param conversationHistory - Optional conversation history\n */\nexport async function llmExtractFacts(\n utterance: string,\n context: AgentContext,\n kbCatalog: KBMeta[],\n frameworkContext: FrameworkContext,\n conversationHistory?: ConversationMessage[]\n): Promise<LLMExtractionFacts> {\n const contextSummary = summarizeContext(context);\n const slotMetadata = buildSlotMetadata();\n const conversationHistoryText = formatConversationHistory(conversationHistory);\n\n // Build KB summary for hints and scope detection\n const kbSummary = kbCatalog\n .map(kb => {\n const domain = kb.domain;\n const capabilities = kb.capabilities.join(', ');\n const goalKeywords = kb.relevance?.goalKeywords?.join(', ') || 'none';\n return `${kb.id} (domain: ${domain}):\\n Description: ${kb.description}\\n Capabilities: ${capabilities}\\n Goal keywords: ${goalKeywords}`;\n })\n .join('\\n\\n');\n\n // Add pending question context if present\n const pendingContext = context.pendingQuestion\n ? `\\nIMPORTANT: There is a pending question that was asked to the user:\nQuestion: \"${context.pendingQuestion.question}\"\nSlot being asked about: ${context.pendingQuestion.slot}\n\nThe user's current message is likely answering this question. You should:\n- Interpret their response in the context of this question\n- Extract the appropriate slot value(s) based on their answer\n- If they said \"yes\" to a boolean question, extract true\n- If they said \"no\" to a boolean question, extract false\n- If they said \"yes\" but the slot is not boolean, try to infer what they mean based on the context of the pending question\n- If they couldn't answer (said \"I don't know\", \"not sure\", etc.), set nonAnswer: true\n- If they're providing a direct answer, extract it into the appropriate slot`\n : '';\n\n const pendingQuestion = context.pendingQuestion;\n const slotDef = pendingQuestion\n ? getSlotDefinition(pendingQuestion.slot)\n : null;\n const pendingSlotInfo = pendingQuestion && slotDef\n ? `\\nThe pending slot \"${pendingQuestion.slot}\" is of type: ${slotDef.type}${slotDef.description ? ` (${slotDef.description})` : ''}`\n : '';\n\n const config = getConfig();\n const agentDomain = config.domain;\n const extractionInstructions = config.prompts.extractionInstructions || '';\n\n // Build goals list from config\n const goalsInfo = config.goals?.length\n ? `\\nAvailable goals:\\n${config.goals.map(g => `- ${g.name}: ${g.description || ''}`).join('\\n')}`\n : '';\n\n // Build scope context from manifests\n const scopeContext = buildScopeContext(kbCatalog);\n\n // Extract original objective for prominent display\n const originalObjective = context.userObjective || utterance;\n const isFollowUp = context.userObjective && context.userObjective !== utterance;\n\n // Build dynamic extraction guidance based on slot definitions\n const extractionGuidance = buildExtractionGuidance();\n\n // Build the extraction schema dynamically to pick up runtime config slots\n const ExtractionSchema = buildExtractionSchema();\n\n const { object } = await frameworkContext.llm.generateObject(\n ExtractionSchema,\n `You are extracting structured information from a user's message for a ${agentDomain} assistant.\n\nCurrent user message: \"${utterance}\"\n${isFollowUp ? `\n=== ORIGINAL USER OBJECTIVE (CRITICAL FOR KB SELECTION) ===\n\"${originalObjective}\"\nThe current message is a FOLLOW-UP to this original question. When selecting KBs, you MUST address ALL aspects of the ORIGINAL objective, not just the current message.\n=== END ORIGINAL OBJECTIVE ===\n` : ''}${contextSummary ? `\\nConversation context summary: ${contextSummary}` : ''}${conversationHistoryText}${pendingContext}${pendingSlotInfo}\n\nAvailable knowledge bases:\n${kbSummary}\n${scopeContext}\n\nSlot definitions:\n${slotMetadata}\n${goalsInfo}\n\nYour task:\n1. **DETECT TOPIC SHIFTS FIRST**: Determine if the user has changed topics:\n - If there's a pending question about one subject but the user is now asking about something completely different, this is a topic shift\n - If the user's current message is about a different subject or goal than what was being discussed, set topicShift: true\n - If topicShift is true, treat this as a completely new conversation - ignore previous context for slot extraction\n - If topicShift is false or undefined, continue with normal extraction using context\n\n2. **ASSESS SCOPE (CRITICAL)**: Determine if the user's query is fundamentally outside the agent's scope:\n - **Focus on the USER'S GOAL/INTENT, not just whether a recognized entity is mentioned**\n - Review the SCOPE BOUNDARIES section above carefully - it defines what IS and ISN'T within scope\n - If the user's goal matches any \"excludedIntents\" or \"outOfScopeExamples\", set isOutOfScope: true\n - If the user's goal matches ANY of the available KB capabilities, set isOutOfScope: false\n - Just because a recognized entity is mentioned does NOT mean the query is in scope - the user's INTENT matters\n - Set isOutOfScope: true if the query is about something the agent explicitly cannot help with\n - Set isOutOfScope: false if the query relates to any KB's capabilities, even if more information is needed\n\n3. Extract slots using the **EXPLICIT vs INFERRED** framework:\n\n **CRITICAL DISTINCTION - You must understand this before extracting ANY slot:**\n - **EXPLICIT information**: Facts directly stated in the user's words. The user said it.\n - **INFERRED information**: Conclusions YOU draw that the user did NOT state. You're guessing.\n \n **THE RULE**: For slots marked as IDENTIFIER or CATEGORIZATION (see slot definitions below), you may ONLY fill them with EXPLICIT information. NEVER fill these slots with inferred/assumed values.\n \n **ā ļø STRICT PROHIBITION FOR CATEGORIZATION/ENUM SLOTS ā ļø**\n For any slot marked [CATEGORIZATION] or with enum values:\n - \"isn't working\", \"not working\", \"broken\", \"has a problem\" ā Leave slot EMPTY (these are vague)\n - \"has cooling issues\", \"makes noise\", \"electrical problem\" ā Fill with matching category (these are specific)\n - You MUST NOT infer or assume a category from vague descriptions\n - If you're tempted to write \"inferred\" or \"based on context\" in your reasoning for a categorization slot, STOP - that slot should be left EMPTY\n - When in doubt, leave it EMPTY - the system will ask the user to clarify\n \n **HOW TO APPLY THIS:**\n - If user provides a vague description that doesn't clearly match a specific slot value, leave that slot EMPTY\n - The system will ask a clarifying question - this is the CORRECT behavior\n - A general category/type is NOT a specific identifier\n - Only select enum values when user's words CLEARLY and EXPLICITLY match\n${extractionGuidance}\n\n **EXTRACTION RULES:**\n - If answering a yes/no question about a boolean slot, extract true/false\n - If answering a question with a short response, infer the slot value from the PENDING QUESTION context\n - For dates, extract in natural format (will be normalized later)\n - **IMPORTANT**: If topicShift is true, extract slots ONLY from the current message\n - If the user states a specific desired action/outcome, populate outcome slots\n - When a piece of explicit information fits multiple slots, fill all of them\n${extractionInstructions ? ` - ${extractionInstructions}` : ''}\n\n4. Determine goals: What does the user want to achieve? Consider the ORIGINAL OBJECTIVE:\n - **IMPORTANT**: Look at the \"Objective:\" in the context summary - this is the user's original question/goal\n - Even if the current message is just providing requested information, the goals should reflect the ORIGINAL objective\n - If topicShift is true, use goals from the CURRENT message only\n - Include ALL goals from the original objective - if user asked about multiple options, include goals for ALL of them\n - Use goal names from the available goals list when applicable\n\n5. Identify relevant KBs: Which knowledge base IDs are needed to FULLY address the user's ORIGINAL objective?\n \n **MULTI-KB QUERIES ARE COMMON** - Most real queries span multiple domains. You MUST select MULTIPLE KBs when the query involves multiple aspects.\n \n - **CRITICAL**: If there's an ORIGINAL USER OBJECTIVE section above, that is what you must address - NOT just the current message!\n - **CRITICAL**: Look at the ORIGINAL user objective, NOT just the current message\n - **DECOMPOSE the query into ALL its aspects**:\n * WHAT the user wants to DO (e.g., \"write a program\", \"understand\", \"compare\") ā look for KBs with this capability\n * WHAT DOMAIN/TOPIC is involved (e.g., \"physics\", \"programming\", \"statistics\") ā look for KBs covering this domain\n * HOW they want to achieve it (e.g., \"using Python\", \"with visualization\") ā look for KBs with these tools/methods\n - **MATCH EACH ASPECT TO A KB** - Go through EACH available KB and check if it addresses ANY aspect:\n * \"write a Python program\" ā need a PROGRAMMING KB (check: does any KB cover Python/programming?)\n * \"about physics concepts\" ā need a PHYSICS KB (check: does any KB cover physics?)\n * If BOTH aspects are present ā include BOTH KBs!\n - **CONCRETE EXAMPLE**: \"write a python program to explain acceleration and velocity\"\n * Aspect 1: \"write a python program\" ā kb-tech (Programming and Computer Science)\n * Aspect 2: \"acceleration and velocity\" ā kb-sci (Physics)\n * Result: kbHints should be [\"kb-tech\", \"kb-sci\"]\n - The current message might just be answering a follow-up question, but you must consider what KBs are needed for the ORIGINAL question\n - **ALWAYS include ALL KBs that match ANY part of the decomposed query**\n - When in doubt, include more KBs rather than fewer - it's better to have comprehensive coverage\n - Review ALL available KBs and their capabilities - don't stop at the first match!\n - If isOutOfScope is true, leave kbHints empty\n\n6. Summarize intent: Brief (5-10 word) description that reflects the current message and conversation context\n\n7. Assess if user couldn't answer: If there was a pending question and the user explicitly couldn't answer it (said \"I don't know\", \"not sure\", \"can't remember\", etc.), set nonAnswer: true\n - **IMPORTANT**: If topicShift is true, do NOT set nonAnswer - the user is starting a new topic, not refusing to answer\n\n8. Provide reasoning: Briefly explain your extraction decisions, especially for scope assessment. Explain WHY the query is or isn't within scope.\n\nGuidelines:\n- Check for topic shifts first - if the user is asking about a different subject, it's a topic shift\n- Be intelligent about context - interpret short responses based on the pending question\n- The conversation history shows the sequence of interactions - use it to understand context\n- **SCOPE IS CRITICAL**: A query mentioning valid entities can still be OUT OF SCOPE if the user's goal doesn't match any KB's capabilities\n- **EXTRACTION PHILOSOPHY**: Your job is to extract what the user SAID, not to guess what they MIGHT mean. For categorization slots, if the user's words don't clearly indicate a category, leave it empty. The system will ask them to clarify. This is the CORRECT behavior - it leads to accurate answers rather than wrong assumptions.`,\n { model: getModel('extraction') }\n );\n\n // Normalize extracted slots\n const normalizedSlots: Partial<Slots> = {};\n Object.entries(object.slots || {}).forEach(([key, value]) => {\n const normalized = normalizeSlotValue(key, value as string | boolean | undefined);\n if (isSlotFilled(normalized)) {\n normalizedSlots[key as keyof Slots] = normalized;\n }\n });\n\n return {\n slots: normalizedSlots,\n goals: object.goals || [],\n kbHints: object.kbHints || [],\n intentSummary: object.intentSummary || 'User query',\n nonAnswer: object.nonAnswer || false,\n topicShift: object.topicShift || false,\n isOutOfScope: object.isOutOfScope || false,\n reasoning: object.reasoning,\n };\n}\n\n/**\n * This function has been removed - all reasoning is now done by the LLM in llmExtractFacts.\n * The LLM handles interpretation of yes/no, confirmations, non-answers, etc. based on context.\n */\n","/**\n * Pure state reducer for disambiguation.\n * No LLM calls - just deterministic state transitions based on facts.\n */\n\nimport { AgentContext, Slots, PendingQuestion, DisambiguationAction, KBMeta } from '../types';\nimport { getConfig } from '../runtime/config';\n\nconst MAX_ATTEMPTS_PER_SLOT = 3;\n\ninterface ReducerFacts {\n slots: Partial<Slots>;\n nonAnswer: boolean;\n newUtterance: string;\n kbHints: string[];\n goals: string[];\n isOutOfScope?: boolean;\n}\n\n/**\n * Check if a slot value is considered \"filled\" (has a meaningful value).\n *\n * A slot is filled if it has a value that is not:\n * - undefined\n * - null\n * - empty string ('')\n *\n * Note: boolean false IS considered a valid filled value!\n */\nfunction isSlotFilled(value: string | boolean | undefined): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'boolean') return true; // false is a valid boolean value\n if (typeof value === 'string' && value === '') return false;\n return true;\n}\n\n/** Details about why a KB was selected during routing */\nexport interface KBRoutingReason {\n kbId: string;\n selectedBy: 'llm_hint' | 'slot_trigger' | 'input_match' | 'fallback';\n trigger?: string; // The specific hint or slot that triggered selection\n}\n\n/** Details about the routing decision for tracing */\nexport interface RoutingDecision {\n kbHintsReceived: string[];\n kbsFromHints: string[];\n slotTriggersMatched: Array<{ kbId: string; trigger: string }>;\n kbsFromSlotTriggers: string[];\n kbsFromFallback: string[];\n finalKBs: string[];\n routingReasons: KBRoutingReason[];\n}\n\ninterface ReducerResult {\n context: AgentContext;\n action: DisambiguationAction;\n relevantKBs: KBMeta[];\n routingDecision: RoutingDecision;\n}\n\n/**\n * Normalize a KB ID for matching purposes.\n * Handles common LLM transformations like underscores vs hyphens.\n */\nfunction normalizeKbId(id: string): string {\n return id.toLowerCase().replace(/[-_]/g, '');\n}\n\n/**\n * Find a KB in the catalog by ID, with fuzzy matching for LLM variations.\n * LLMs sometimes transform IDs (e.g., \"kb-sci\" ā \"kb_sci\"), so we use\n * normalized matching to handle these cases.\n */\nfunction findKbById(id: string, catalog: KBMeta[]): KBMeta | undefined {\n // Try exact match first\n const exact = catalog.find(kb => kb.id === id);\n if (exact) return exact;\n\n // Fall back to normalized matching\n const normalizedInput = normalizeKbId(id);\n return catalog.find(kb => normalizeKbId(kb.id) === normalizedInput);\n}\n\n/**\n * Determine which KBs are relevant based on LLM hints and slot triggers.\n * Returns both the selected KBs and detailed routing decision for tracing.\n *\n * ROUTING STRATEGY (in priority order):\n * =====================================\n *\n * 1. PRIMARY: kbHints from LLM extractor (semantic understanding of capabilities)\n * - The LLM analyzes the user's query against rich KB capability descriptions\n * - This is the most reliable routing mechanism as it uses natural language understanding\n * - Example: User asks \"how do I return my blender\" ā LLM identifies \"returns_kb\"\n *\n * 2. SECONDARY: slotTriggers - specific slots that indicate KB relevance\n * - KBs can define slots that, when filled, automatically trigger them\n * - Provides declarative routing based on extracted information\n * - Example: If \"warranty_claim_number\" is filled, trigger \"warranty_kb\"\n *\n * 3. FALLBACK: Slot-based matching on input entities\n * - Simple heuristic: if a KB accepts a slot as input and we have that slot, include it\n * - Less precise than LLM hints but provides coverage when hints are missing\n * - Example: KB requires \"product_model\", we have it ā include KB\n *\n * 4. LAST RESORT: Return all KBs\n * - If no routing strategy matched, include all KBs\n * - The planner will decide which ones are actually relevant\n *\n * NOTE: We intentionally do NOT use simple keyword matching. The LLM in the extractor\n * understands the rich capability descriptions and generates appropriate kbHints,\n * which provides much better semantic routing than keywords alone.\n */\nfunction routeToKBs(\n goals: string[],\n kbHints: string[],\n slots: Partial<Slots>,\n kbCatalog: KBMeta[]\n): { kbs: KBMeta[]; decision: RoutingDecision } {\n const relevantKBs = new Set<KBMeta>();\n const routingReasons: KBRoutingReason[] = [];\n\n // Initialize routing decision tracking for observability\n const decision: RoutingDecision = {\n kbHintsReceived: [...kbHints],\n kbsFromHints: [],\n slotTriggersMatched: [],\n kbsFromSlotTriggers: [],\n kbsFromFallback: [],\n finalKBs: [],\n routingReasons: [],\n };\n\n // ============================================================================\n // TIER 1: LLM-based semantic routing (PRIMARY)\n // ============================================================================\n // The LLM extractor has already analyzed the user's intent against rich\n // capability descriptions. It provides KB IDs that semantically match.\n // This is the most reliable routing mechanism as it uses natural language\n // understanding rather than simple keyword matching.\n //\n // Why this works well:\n // - LLM sees full capability descriptions, not just keywords\n // - Can understand synonyms, paraphrasing, and intent\n // - Handles complex multi-goal queries by selecting multiple KBs\n\n if (kbHints.length > 0) {\n const hintedKBs = kbHints\n .map(id => findKbById(id, kbCatalog))\n .filter(Boolean) as KBMeta[];\n\n hintedKBs.forEach(kb => {\n relevantKBs.add(kb);\n decision.kbsFromHints.push(kb.id);\n routingReasons.push({\n kbId: kb.id,\n selectedBy: 'llm_hint',\n trigger: `LLM identified this KB based on capabilities`,\n });\n });\n }\n\n // ============================================================================\n // TIER 2: Slot-based triggers (SECONDARY)\n // ============================================================================\n // Some KBs define explicit slot triggers in their relevance configuration.\n // Example: If \"product_model\" is filled, trigger the \"product_kb\"\n //\n // This provides a declarative way to route based on extracted information.\n // Slot triggers are useful when:\n // - Certain slots are strongly associated with specific KBs\n // - You want deterministic routing for specific data patterns\n // - LLM hints might miss a KB that's clearly relevant based on data\n\n const filledSlots = Object.keys(slots).filter(\n k => isSlotFilled(slots[k as keyof Slots])\n );\n\n kbCatalog.forEach(kb => {\n // Check if this KB has slot triggers defined in its manifest\n if (kb.relevance?.slotTriggers) {\n const triggeredSlot = kb.relevance.slotTriggers.find(trigger =>\n filledSlots.includes(trigger)\n );\n\n if (triggeredSlot) {\n const wasAlreadySelected = relevantKBs.has(kb);\n relevantKBs.add(kb);\n\n // Track that this trigger fired (useful for debugging)\n decision.slotTriggersMatched.push({ kbId: kb.id, trigger: triggeredSlot });\n\n // Only record as \"from slot trigger\" if not already selected by LLM hint\n // This keeps the routing reasons accurate and non-duplicative\n if (!wasAlreadySelected) {\n decision.kbsFromSlotTriggers.push(kb.id);\n routingReasons.push({\n kbId: kb.id,\n selectedBy: 'slot_trigger',\n trigger: `Slot \"${triggeredSlot}\" triggered this KB`,\n });\n }\n }\n }\n });\n\n // If we found relevant KBs through semantic or trigger routing, return them\n // This is the ideal case - we have confident routing decisions\n if (relevantKBs.size > 0) {\n decision.finalKBs = Array.from(relevantKBs).map(kb => kb.id);\n decision.routingReasons = routingReasons;\n return { kbs: Array.from(relevantKBs), decision };\n }\n\n // ============================================================================\n // TIER 3: Input entity matching (FALLBACK)\n // ============================================================================\n // If no LLM hints or slot triggers fired, fall back to matching filled slots\n // against KB input requirements. This is a simple heuristic: if a KB accepts\n // a slot as input and we have that slot filled, consider it relevant.\n //\n // This is less precise than LLM hints because:\n // - A KB might accept many inputs but only be relevant for certain queries\n // - Multiple KBs might accept the same inputs\n // But it provides coverage when semantic routing doesn't fire.\n\n const slotMatched = kbCatalog.filter(kb =>\n filledSlots.some(slot => kb.inputEntities.includes(slot))\n );\n\n if (slotMatched.length > 0) {\n slotMatched.forEach(kb => {\n const matchedSlot = filledSlots.find(slot => kb.inputEntities.includes(slot));\n decision.kbsFromFallback.push(kb.id);\n routingReasons.push({\n kbId: kb.id,\n selectedBy: 'input_match',\n trigger: `Slot \"${matchedSlot}\" matches KB input requirements`,\n });\n });\n decision.finalKBs = slotMatched.map(kb => kb.id);\n decision.routingReasons = routingReasons;\n return { kbs: slotMatched, decision };\n }\n\n // ============================================================================\n // TIER 4: Return all KBs (LAST RESORT)\n // ============================================================================\n // If no routing strategy matched, include all KBs. The planner will decide\n // which ones are actually relevant based on the user's goals and query.\n //\n // This is a safety net to ensure we always have some KBs to query.\n // The planner is smart enough to filter down to the most relevant ones.\n\n kbCatalog.forEach(kb => {\n decision.kbsFromFallback.push(kb.id);\n routingReasons.push({\n kbId: kb.id,\n selectedBy: 'fallback',\n trigger: 'No specific routing matched, including all KBs',\n });\n });\n\n decision.finalKBs = kbCatalog.map(kb => kb.id);\n decision.routingReasons = routingReasons;\n return { kbs: kbCatalog, decision };\n}\n\n/**\n * Compute which slots are missing based on KB requirements\n * Returns both required and optional slots that are not filled\n * Uses canonical slot names (from agent config) in the result\n */\nfunction computeMissingSlots(\n slots: Partial<Slots>,\n relevantKBs: KBMeta[],\n unobtainableSlots: Set<string>\n): string[] {\n const config = getConfig();\n const agentRequiredSlots = new Set(\n config.slots.filter(slot => slot.required).map(slot => slot.name)\n );\n \n // Build forward mappings (original -> canonical per KB) and collect all original slots\n const originalToCanonical = new Map<string, string>(); // Maps original slot name -> canonical name\n const allOriginalSlots = new Set<string>();\n \n relevantKBs.forEach(kb => {\n kb.inputRequirements.forEach(input => {\n allOriginalSlots.add(input.slot);\n \n // If there's a slot mapping, find the canonical name for this original slot\n if (config.slotMappings?.[kb.id]) {\n const kbMappings = config.slotMappings[kb.id];\n // Find canonical name that maps to this original slot\n const canonicalName = Object.keys(kbMappings).find(\n canonical => kbMappings[canonical] === input.slot\n );\n if (canonicalName) {\n originalToCanonical.set(input.slot, canonicalName);\n }\n }\n });\n });\n\n // Find slots that are missing (not filled and not unobtainable)\n // Check both canonical names (from slots) and original names (from KB requirements)\n const filledSlots = new Set(\n Object.keys(slots).filter(k => {\n const v = slots[k as keyof Slots];\n return isSlotFilled(v);\n })\n );\n\n // Collect missing slots using canonical names when available\n const missing = new Set<string>();\n \n for (const originalSlot of allOriginalSlots) {\n const canonicalName = originalToCanonical.get(originalSlot);\n const isUnobtainable =\n unobtainableSlots.has(originalSlot) ||\n (canonicalName ? unobtainableSlots.has(canonicalName) : false);\n if (isUnobtainable) continue;\n \n const isFilled = canonicalName\n ? filledSlots.has(canonicalName)\n : filledSlots.has(originalSlot);\n \n if (!isFilled) {\n missing.add(canonicalName || originalSlot);\n }\n }\n \n // Ensure agent-level required slots are also considered missing when absent\n agentRequiredSlots.forEach(requiredSlot => {\n if (unobtainableSlots.has(requiredSlot)) {\n return;\n }\n if (!filledSlots.has(requiredSlot)) {\n missing.add(requiredSlot);\n }\n });\n\n return Array.from(missing);\n}\n\n/**\n * Compute missing required slots per KB to allow selecting the KBs\n * that are closest to being actionable. This avoids unioning all\n * required slots across loosely-related KBs (e.g., warranty + FAQ).\n */\nfunction computeMissingRequiredByKB(\n slots: Partial<Slots>,\n relevantKBs: KBMeta[],\n unobtainableSlots: Set<string>\n): Array<{ kb: KBMeta; missingRequired: string[] }> {\n const config = getConfig();\n const agentRequiredSlots = new Set(\n config.slots.filter(slot => slot.required).map(slot => slot.name)\n );\n const filledSlots = new Set(\n Object.keys(slots).filter(k => {\n const v = slots[k as keyof Slots];\n return isSlotFilled(v);\n })\n );\n\n return relevantKBs.map(kb => {\n const kbMappings = config.slotMappings?.[kb.id];\n const toCanonical = (slot: string) => {\n if (!kbMappings) return slot;\n const canonical = Object.keys(kbMappings).find(\n canonicalName => kbMappings[canonicalName] === slot\n );\n return canonical || slot;\n };\n\n const isSlotFilled = (slot: string) => {\n if (filledSlots.has(slot)) return true;\n if (kbMappings && kbMappings[slot] && filledSlots.has(kbMappings[slot])) {\n return true;\n }\n return false;\n };\n\n const requiredSlots = new Set<string>();\n\n // KB-required inputs (mapped to canonical names when available)\n kb.inputRequirements\n .filter(input => input.required !== false)\n .forEach(input => requiredSlots.add(toCanonical(input.slot)));\n\n // Agent-level required slots from config (canonical names)\n agentRequiredSlots.forEach(slot => requiredSlots.add(slot));\n\n const missingRequired = Array.from(requiredSlots).filter(slot => {\n if (unobtainableSlots.has(slot)) {\n return false; // Don't count unobtainable slots as missing\n }\n if (isSlotFilled(slot)) {\n return false; // Slot is filled (canonical or mapped)\n }\n return true;\n });\n\n return { kb, missingRequired };\n });\n}\n\n/**\n * Build reverse slot mappings (canonical -> original per KB) from config\n */\nfunction buildReverseSlotMappings(relevantKBs: KBMeta[]): Map<string, Set<string>> {\n const config = getConfig();\n const reverseMappings = new Map<string, Set<string>>();\n \n if (!config.slotMappings) {\n return reverseMappings;\n }\n \n // For each KB, build reverse mapping: canonical -> original\n relevantKBs.forEach(kb => {\n const kbMappings = config.slotMappings?.[kb.id];\n if (kbMappings) {\n Object.entries(kbMappings).forEach(([canonicalName, originalName]) => {\n if (!reverseMappings.has(canonicalName)) {\n reverseMappings.set(canonicalName, new Set());\n }\n reverseMappings.get(canonicalName)!.add(originalName);\n });\n }\n });\n \n return reverseMappings;\n}\n\n/**\n * Check if only optional slots are missing\n */\nfunction onlyOptionalSlotsMissing(\n missingSlots: string[],\n relevantKBs: KBMeta[]\n): boolean {\n if (missingSlots.length === 0) return false;\n\n // Build set of required slots from all relevant KBs (using original slot names)\n const requiredSlots = new Set<string>();\n const agentRequiredSlots = new Set(\n getConfig().slots.filter(slot => slot.required).map(slot => slot.name)\n );\n\n relevantKBs.forEach(kb => {\n kb.inputRequirements.forEach(input => {\n if (input.required !== false) {\n requiredSlots.add(input.slot);\n }\n });\n });\n\n // Add agent-level required slots (canonical names)\n agentRequiredSlots.forEach(slot => requiredSlots.add(slot));\n\n // Build reverse slot mappings (canonical -> original)\n const reverseMappings = buildReverseSlotMappings(relevantKBs);\n\n // Check if any missing slot is required\n // A slot is required if:\n // 1. The canonical name itself is in requiredSlots, OR\n // 2. Any of its mapped original names are in requiredSlots\n return !missingSlots.some(slot => {\n // Check canonical name directly\n if (requiredSlots.has(slot)) {\n return true;\n }\n \n // Check mapped original names\n const mappedOriginals = reverseMappings.get(slot);\n if (mappedOriginals) {\n return Array.from(mappedOriginals).some(original => requiredSlots.has(original));\n }\n \n return false;\n });\n}\n\n/**\n * Choose which slot to ask about next (prioritization logic)\n * Skips slots that have already been asked about\n */\nfunction chooseSlotToAsk(\n missingSlots: string[],\n slots: Partial<Slots>,\n questionHistory?: Array<{ slot: string; answered: boolean }>\n): string | null {\n if (missingSlots.length === 0) return null;\n\n // Filter out slots that have already been asked about\n const askedSlots = new Set(\n questionHistory?.filter(q => q.slot).map(q => q.slot) || []\n );\n const unaskedSlots = missingSlots.filter(slot => !askedSlots.has(slot));\n\n if (unaskedSlots.length === 0) {\n // All missing slots have been asked - return null to avoid loops\n return null;\n }\n\n // Use priority from config\n const config = getConfig();\n const priority = config.slotPriority;\n\n for (const slot of priority) {\n if (unaskedSlots.includes(slot)) {\n return slot;\n }\n }\n\n return unaskedSlots[0];\n}\n\n/**\n * Check if we can proceed with partial information\n */\nfunction canProceedPartially(\n missingSlots: string[],\n slots: Partial<Slots>,\n relevantKBs: KBMeta[]\n): boolean {\n // Allow partial proceed if only optional slots are missing\n // This means all required slots are filled, but some optional slots are not\n return onlyOptionalSlotsMissing(missingSlots, relevantKBs);\n}\n\n/**\n * Pure state reducer - the heart of the disambiguation policy.\n * Takes old context + facts, produces new context + action.\n */\nexport function reduceDisambiguation(\n context: AgentContext,\n facts: ReducerFacts,\n kbCatalog: KBMeta[]\n): ReducerResult {\n const now = new Date().toISOString();\n\n // Start with a copy of context\n const newContext: AgentContext = {\n ...context,\n collectedInformation: {\n ...context.collectedInformation,\n slots: { ...context.collectedInformation.slots },\n collectionHistory: [...context.collectedInformation.collectionHistory],\n },\n missingInformation: {\n ...context.missingInformation,\n unobtainableSlots: [...context.missingInformation.unobtainableSlots],\n questionHistory: [...(context.missingInformation.questionHistory || [])],\n },\n agentThinking: [...context.agentThinking],\n };\n\n const unobtainableSlots = new Set(newContext.missingInformation.unobtainableSlots);\n\n // Handle pending question state\n if (context.pendingQuestion) {\n const pendingSlot = context.pendingQuestion.slot;\n\n if (facts.nonAnswer) {\n // User explicitly couldn't answer - mark as unobtainable immediately\n unobtainableSlots.add(pendingSlot);\n newContext.pendingQuestion = undefined;\n\n // Mark in question history\n newContext.missingInformation.questionHistory?.forEach(q => {\n if (q.slot === pendingSlot && !q.answered) {\n q.answered = true;\n }\n });\n } else if (facts.slots[pendingSlot as keyof Slots] !== undefined) {\n // User answered the pending question with actual info\n newContext.pendingQuestion = undefined;\n\n // Mark in question history\n newContext.missingInformation.questionHistory?.forEach(q => {\n if (q.slot === pendingSlot && !q.answered) {\n q.answered = true;\n }\n });\n } else {\n // User responded but LLM didn't extract the slot value and didn't mark as nonAnswer\n // This could mean the response was ambiguous or didn't contain the needed information\n // No slot should be asked for more than once - mark as unobtainable\n unobtainableSlots.add(pendingSlot);\n newContext.pendingQuestion = undefined;\n\n // Mark in question history\n newContext.missingInformation.questionHistory?.forEach(q => {\n if (q.slot === pendingSlot && !q.answered) {\n q.answered = true;\n }\n });\n }\n }\n\n // Merge new slots into collected information\n Object.entries(facts.slots).forEach(([key, value]) => {\n if (isSlotFilled(value)) {\n const existing = newContext.collectedInformation.slots[key as keyof Slots];\n if (existing !== value) {\n newContext.collectedInformation.slots[key as keyof Slots] = value;\n newContext.collectedInformation.collectionHistory.push({\n timestamp: now,\n slot: key,\n value,\n source: context.pendingQuestion ? 'user_response' : 'initial_extraction',\n });\n }\n }\n });\n\n // Normalize closely related slots to avoid redundant follow-ups.\n // If user specified solution_type (e.g., replacement) but desired_outcome is empty, mirror it.\n const solutionType = newContext.collectedInformation.slots.solution_type;\n const desiredOutcome = newContext.collectedInformation.slots.desired_outcome;\n if (!desiredOutcome && solutionType) {\n newContext.collectedInformation.slots.desired_outcome = solutionType;\n newContext.collectedInformation.collectionHistory.push({\n timestamp: now,\n slot: 'desired_outcome',\n value: solutionType,\n source: 'merged',\n });\n } else if (!solutionType && desiredOutcome) {\n newContext.collectedInformation.slots.solution_type = desiredOutcome;\n newContext.collectedInformation.collectionHistory.push({\n timestamp: now,\n slot: 'solution_type',\n value: desiredOutcome,\n source: 'merged',\n });\n }\n\n // Normalize symptom slots (LLM may fill issue_type/problem_description but not problem_symptom)\n const problemSymptom = newContext.collectedInformation.slots.problem_symptom;\n const issueType = newContext.collectedInformation.slots.issue_type;\n const problemDescription = newContext.collectedInformation.slots.problem_description;\n if (!problemSymptom) {\n const inferred = issueType || problemDescription;\n if (inferred) {\n newContext.collectedInformation.slots.problem_symptom = inferred;\n newContext.collectedInformation.collectionHistory.push({\n timestamp: now,\n slot: 'problem_symptom',\n value: inferred,\n source: 'merged',\n });\n }\n }\n\n // Update unobtainable slots in context\n newContext.missingInformation.unobtainableSlots = Array.from(unobtainableSlots);\n\n // Route to relevant KBs (do this first, but LLM scope assessment takes precedence)\n let { kbs: initialRelevantKBs, decision: routingDecision } = routeToKBs(\n facts.goals,\n facts.kbHints,\n newContext.collectedInformation.slots,\n kbCatalog\n );\n\n // Trust the LLM's scope assessment - it uses semantic understanding of the user's intent\n // and the scope boundaries defined in manifests. Even if we found matching KBs based on\n // keywords, the user's actual GOAL may be outside scope (e.g., mentioning a recognized\n // entity but asking about something unrelated to the agent's capabilities)\n let isOutOfScope = facts.isOutOfScope === true;\n\n // When fallbackStrategy is \"use_all\", override the scope decision and route to all KBs.\n // This allows the KB responses to determine relevance rather than the LLM's upfront\n // scope assessment, which can be overly conservative for broad/cross-cutting queries.\n if (isOutOfScope && getConfig().behavior?.fallbackStrategy === 'use_all' && kbCatalog.length > 0) {\n isOutOfScope = false;\n if (initialRelevantKBs.length === 0) {\n initialRelevantKBs = kbCatalog;\n }\n }\n\n // Compute missing slots (only if not out of scope)\n // Select the KBs that are closest to being actionable (fewest missing required slots)\n let relevantKBs = initialRelevantKBs;\n let missingSlots: string[] = [];\n\n if (!isOutOfScope) {\n const missingByKB = computeMissingRequiredByKB(\n newContext.collectedInformation.slots,\n initialRelevantKBs,\n unobtainableSlots\n );\n\n // Find the minimum count of missing required slots\n const minMissing = Math.min(...missingByKB.map(m => m.missingRequired.length), Infinity);\n\n // IMPORTANT: If the LLM explicitly hinted at KBs (semantic routing), we should ALWAYS\n // trust those hints. The LLM understood the user's INTENT and selected KBs based on\n // semantic understanding of capabilities, not just slot availability.\n //\n // Only apply slot-based filtering when we have NO LLM hints (relying on fallback routing)\n const hasLLMHints = facts.kbHints.length > 0;\n\n if (hasLLMHints) {\n // Trust the LLM - keep all KBs it identified\n // The LLM selected these based on semantic understanding of user intent\n relevantKBs = initialRelevantKBs;\n } else {\n // No LLM hints - apply slot-based filtering for fallback routing\n // Keep only KBs with the minimal missing required slots to avoid\n // unioning stricter KBs that would force unnecessary follow-ups.\n relevantKBs = missingByKB\n .filter(m => m.missingRequired.length === minMissing)\n .map(m => m.kb);\n }\n\n // Reflect narrowed KB set in routing decision for trace/debug parity\n routingDecision.finalKBs = relevantKBs.map(kb => kb.id);\n\n missingSlots = computeMissingSlots(\n newContext.collectedInformation.slots,\n relevantKBs,\n unobtainableSlots\n );\n }\n\n newContext.missingInformation.slots = missingSlots;\n\n // Add thinking with detailed routing decision\n newContext.agentThinking.push({\n phase: 'disambiguation',\n timestamp: now,\n reasoning: isOutOfScope\n ? `Reducer: Query is out of scope. LLM determined user's intent is outside agent capabilities based on scope boundaries.`\n : `Reducer: Merged ${Object.keys(facts.slots).length} slot(s). ` +\n `${missingSlots.length} missing, ${unobtainableSlots.size} unobtainable. ` +\n `Relevant KBs: ${relevantKBs.map(kb => kb.id).join(', ')}. ` +\n `Routing: ${routingDecision.kbsFromHints.length} from LLM hints, ${routingDecision.kbsFromSlotTriggers.length} from slot triggers.`,\n details: {\n mergedSlots: facts.slots,\n missingSlots,\n unobtainableSlots: Array.from(unobtainableSlots),\n relevantKBs: relevantKBs.map(kb => kb.id),\n isOutOfScope,\n llmScopeAssessment: facts.isOutOfScope,\n routingDecision,\n },\n });\n\n // Decide action\n let action: DisambiguationAction;\n\n // If out of scope, return OUT_OF_SCOPE action (redirect message will be generated later)\n if (isOutOfScope) {\n action = {\n type: 'OUT_OF_SCOPE',\n redirectMessage: '', // Will be filled by orchestrator\n availableCapabilities: [], // Will be filled by orchestrator\n };\n return { context: newContext, action, relevantKBs: [], routingDecision };\n }\n\n if (missingSlots.length === 0) {\n // Ready to call KB - all slots filled\n action = {\n type: 'CALL_KB',\n kbIds: relevantKBs.map(kb => kb.id),\n slots: newContext.collectedInformation.slots,\n };\n } else if (canProceedPartially(missingSlots, newContext.collectedInformation.slots, relevantKBs)) {\n // Only optional slots are missing - proceed without asking\n // This is the key change: we check for partial proceed BEFORE trying to ask for optional slots\n action = {\n type: 'PARTIAL_PROCEED',\n kbIds: relevantKBs.map(kb => kb.id),\n slots: newContext.collectedInformation.slots,\n missingSlots,\n };\n } else {\n // Required slots are missing - try to ask for them\n // Only ask about REQUIRED slots, not optional ones\n const config = getConfig();\n const agentRequiredSlots = new Set(\n config.slots.filter(slot => slot.required).map(slot => slot.name)\n );\n \n const requiredSlots = new Set<string>();\n // Add KB-level required slots (using original slot names from KBs)\n relevantKBs.forEach(kb => {\n kb.inputRequirements.forEach(input => {\n if (input.required !== false) {\n requiredSlots.add(input.slot);\n }\n });\n });\n \n // Add agent-level required slots (using canonical names from config)\n // These are already in canonical form, so add them directly\n agentRequiredSlots.forEach(slot => requiredSlots.add(slot));\n \n // Build reverse slot mappings (canonical -> original)\n const reverseMappings = buildReverseSlotMappings(relevantKBs);\n \n // Filter missing slots to only include required ones\n // A slot is required if:\n // 1. The canonical name itself is in requiredSlots (agent-level required), OR\n // 2. The canonical name maps to an original name that's in requiredSlots (KB-level required), OR\n // 3. Any of its mapped original names are in requiredSlots\n // \n // IMPORTANT: Also include agent-level required slots even if they're not in missingSlots yet\n // (this handles cases where the slot name in config doesn't match what's in KBs)\n const missingRequiredSlots = new Set<string>();\n \n // First, filter missingSlots to only include required ones\n missingSlots.forEach(slot => {\n // Check canonical name directly (for agent-level required slots)\n if (requiredSlots.has(slot)) {\n missingRequiredSlots.add(slot);\n return;\n }\n \n // Check mapped original names (for KB-level required slots)\n const mappedOriginals = reverseMappings.get(slot);\n if (mappedOriginals) {\n if (Array.from(mappedOriginals).some(original => requiredSlots.has(original))) {\n missingRequiredSlots.add(slot);\n return;\n }\n }\n });\n \n // CRITICAL FIX: Also add agent-level required slots that are missing but might not be in missingSlots\n // This handles cases where the slot name in agent config doesn't match KB slot names\n agentRequiredSlots.forEach(requiredSlot => {\n if (!isSlotFilled(newContext.collectedInformation.slots[requiredSlot as keyof Slots]) &&\n !unobtainableSlots.has(requiredSlot)) {\n missingRequiredSlots.add(requiredSlot);\n }\n });\n \n // CRITICAL FIX: Also add KB-level required slots (mapped to canonical) that are missing\n // This ensures KB-required slots like \"purchase_date\" are asked about even if they don't appear in missingSlots\n // due to slot name mismatches or other issues\n relevantKBs.forEach(kb => {\n const kbMappings = config.slotMappings?.[kb.id];\n kb.inputRequirements.forEach(input => {\n if (input.required !== false) {\n // Map to canonical name if mapping exists, otherwise use original\n const canonicalName = kbMappings \n ? Object.keys(kbMappings).find(canonical => kbMappings[canonical] === input.slot) || input.slot\n : input.slot;\n \n // Check if slot is filled (using canonical name)\n const isFilled = isSlotFilled(newContext.collectedInformation.slots[canonicalName as keyof Slots]);\n \n if (!isFilled && !unobtainableSlots.has(canonicalName) && !unobtainableSlots.has(input.slot)) {\n missingRequiredSlots.add(canonicalName);\n }\n }\n });\n });\n \n const slotToAsk = chooseSlotToAsk(\n Array.from(missingRequiredSlots),\n newContext.collectedInformation.slots,\n newContext.missingInformation.questionHistory\n );\n\n if (slotToAsk) {\n // We'll fill in the question text later (from generateQuestionForSlot)\n action = {\n type: 'ASK_SLOT',\n slot: slotToAsk,\n question: '', // Placeholder - will be filled by orchestrator\n };\n } else {\n // No required slots left to ask about (all already asked or unobtainable)\n // Blocked - required slots are missing and couldn't be obtained\n const missingRequiredSlotsArray = Array.from(missingRequiredSlots);\n const allAsked = missingRequiredSlotsArray.length > 0 && \n missingRequiredSlotsArray.every((slot: string) => \n newContext.missingInformation.questionHistory?.some(q => q.slot === slot)\n );\n \n action = {\n type: 'BLOCKED',\n reason: allAsked \n ? 'All required information has been requested but could not be obtained'\n : 'No actionable slots to ask about',\n };\n }\n }\n\n return { context: newContext, action, relevantKBs, routingDecision };\n}\n","/**\n * Question generator for missing slots.\n * Uses LLM just for natural phrasing and generating contextual multi-choice options.\n */\n\nimport { AgentContext, KBMeta, FrameworkContext, MultiChoiceOption } from '../types';\nimport { getSlotDefinition } from '../composition/registry';\nimport { getModel, getPrompt } from '../runtime/config';\nimport { z } from 'zod';\n\n/**\n * Check if a slot value is considered \"filled\" (has a meaningful value).\n * Note: boolean false IS considered a valid filled value!\n */\nfunction isSlotFilled(value: string | boolean | undefined): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'boolean') return true; // false is a valid boolean value\n if (typeof value === 'string' && value === '') return false;\n return true;\n}\n\n/**\n * Collect slot hints (enumValues/examples) from KB manifests (if present).\n */\nfunction getSlotHintsFromKBs(slot: string, relevantKBs: KBMeta[]): { enumValues: string[]; examples: string[] } {\n const enums = new Set<string>();\n const examples = new Set<string>();\n\n relevantKBs.forEach(kb => {\n (kb.slots || []).forEach(def => {\n if (def.name !== slot) return;\n def.enumValues?.forEach(v => enums.add(v));\n def.examples?.forEach(e => examples.add(e));\n });\n });\n\n return {\n enumValues: Array.from(enums),\n examples: Array.from(examples),\n };\n}\n\n/**\n * Get the prompt/description for a slot from KB catalog or slot definition\n */\nfunction getSlotPrompt(slot: string, relevantKBs: KBMeta[]): string {\n // First try KB inputPrompts\n for (const kb of relevantKBs) {\n if (kb.inputPrompts[slot]) {\n return kb.inputPrompts[slot];\n }\n }\n\n // Fall back to slot definition\n const slotDef = getSlotDefinition(slot);\n if (slotDef?.prompt) {\n return slotDef.prompt;\n }\n\n // Last resort: humanize the slot name\n return `Please provide ${slot.replace(/_/g, ' ')}`;\n}\n\n/**\n * Generate a natural, contextual question for a missing slot.\n *\n * @param slot - The slot name to ask about\n * @param context - Agent context with conversation state\n * @param relevantKBs - Relevant knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n */\nexport async function generateQuestionForSlot(\n slot: string,\n context: AgentContext,\n relevantKBs: KBMeta[],\n frameworkContext: FrameworkContext\n): Promise<string> {\n const slotPrompt = getSlotPrompt(slot, relevantKBs);\n\n // Build context about what we know\n const knownInfo = Object.entries(context.collectedInformation.slots)\n .filter(([, v]) => isSlotFilled(v))\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n const synthesisRole = getPrompt('synthesisSystemRole');\n\n const result = await frameworkContext.llm.generateText(\n `You are ${synthesisRole}.\n\nUser's objective: \"${context.userObjective}\"\n${knownInfo ? `Known information: ${knownInfo}` : 'No information collected yet'}\n\nI need to ask about: ${slot}\nDefault prompt: \"${slotPrompt}\"\n\nGenerate ONE friendly, contextual follow-up question to ask the user for the \"${slot}\" information.\n\nCRITICAL RULES:\n1. The question MUST ask for the \"${slot}\" value - this is non-negotiable\n2. The user's answer to your question should directly provide the \"${slot}\" value\n3. Do NOT ask about something else (like the issue or problem) when you need a different slot value\n4. Be natural and conversational, but stay focused on getting the \"${slot}\" information\n5. Reference what we already know to make the question feel connected to the conversation\n6. Be a single sentence\n\nIf the default prompt makes sense, you can use a variation of it.\nIf the slot already seems to be answered by what we know, generate a clarifying question.\n\nReturn only the question, no explanation.`,\n { model: getModel('questionGeneration') }\n );\n\n // Clean up the response\n const question = result.text.trim().replace(/^[\"']|[\"']$/g, '');\n\n // Fallback if LLM returns empty or weird response\n if (!question || question.length < 5) {\n return slotPrompt;\n }\n\n return question;\n}\n\n/** Schema for multi-choice option generation */\nconst MultiChoiceOptionsSchema = z.object({\n options: z.array(z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n })).min(2).max(5),\n});\n\n/**\n * Generate contextual multi-choice options for a slot question.\n * Uses LLM to analyze the slot definition, user objective, and context\n * to generate relevant choices.\n *\n * @param slot - The slot name to generate options for\n * @param context - Agent context with conversation state\n * @param relevantKBs - Relevant knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n * @param question - Optional: the actual question being asked (options should match this)\n * @returns Array of multi-choice options (3-5 options)\n */\nexport async function generateMultiChoiceOptions(\n slot: string,\n context: AgentContext,\n relevantKBs: KBMeta[],\n frameworkContext: FrameworkContext,\n question?: string\n): Promise<MultiChoiceOption[]> {\n const slotDef = getSlotDefinition(slot);\n const kbSlotHints = getSlotHintsFromKBs(slot, relevantKBs);\n const slotPrompt = getSlotPrompt(slot, relevantKBs);\n\n const enumValues =\n (slotDef?.enumValues && slotDef.enumValues.length > 0 ? slotDef.enumValues : undefined) ||\n (kbSlotHints.enumValues.length > 0 ? kbSlotHints.enumValues : undefined);\n\n // If slot has enum values (config or KB manifest), return deterministic options to avoid hallucination\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((value, idx) => ({\n id: `${slot}_${idx + 1}`,\n label: value,\n }));\n }\n\n // If we have examples (config or KB manifest), use them as deterministic options\n const exampleValues =\n (slotDef?.examples && slotDef.examples.length > 0 ? slotDef.examples : undefined) ||\n (kbSlotHints.examples.length > 0 ? kbSlotHints.examples : undefined);\n\n if (exampleValues && exampleValues.length > 0) {\n return exampleValues.slice(0, 5).map((value, idx) => ({\n id: `${slot}_ex_${idx + 1}`,\n label: value,\n }));\n }\n\n // Build context about what we know\n const knownInfo = Object.entries(context.collectedInformation.slots)\n .filter(([, v]) => isSlotFilled(v))\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n // Get slot examples if available\n const examples = slotDef?.examples?.join(', ') || '';\n\n // Get enum values string if this is an enum slot (for prompt context)\n const enumValuesStr = slotDef?.enumValues?.join(', ') || '';\n\n const synthesisRole = getPrompt('synthesisSystemRole');\n\n // If a question is provided, options should answer that question\n const questionContext = question \n ? `\\nActual question being asked: \"${question}\"\\n\\nIMPORTANT: The options MUST be valid answers to the question above, not just valid values for the slot.`\n : '';\n\n try {\n const result = await frameworkContext.llm.generateObject(\n MultiChoiceOptionsSchema,\n `You are ${synthesisRole}.\n\nUser's objective: \"${context.userObjective}\"\n${knownInfo ? `Known information: ${knownInfo}` : 'No information collected yet'}\n\nSlot being asked about: ${slot}\nSlot description: \"${slotPrompt}\"\n${examples ? `Example values: ${examples}` : ''}\n${enumValuesStr ? `Valid values: ${enumValuesStr}` : ''}${questionContext}\n\nGenerate 3-5 contextually relevant options for the user to choose from.\nEach option should:\n1. Be a likely value based on the user's objective and context\n2. Be clear and specific\n3. Have a short, human-friendly label\n4. Optionally include a brief description for clarity\n${question ? '5. CRITICALLY: Be a valid answer to the actual question being asked' : ''}\n\nThe options should cover the most common or likely choices for this scenario.\nIf there are predefined valid values, prioritize those.`,\n { model: getModel('questionGeneration') }\n );\n\n return result.object.options;\n } catch (error) {\n // If generation fails, return empty array (question will be asked without options)\n // Don't log full error object - AI SDK errors can contain non-serializable structures\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn('Failed to generate multi-choice options:', errorMsg);\n return [];\n }\n}\n\n/**\n * Generate both a question and multi-choice options for a slot.\n * Generates the question first, then passes it to the options generator\n * so that options match the actual question being asked.\n *\n * @param slot - The slot name to ask about\n * @param context - Agent context with conversation state\n * @param relevantKBs - Relevant knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n * @returns Object containing the question and options\n */\nexport async function generateQuestionWithOptions(\n slot: string,\n context: AgentContext,\n relevantKBs: KBMeta[],\n frameworkContext: FrameworkContext\n): Promise<{ question: string; options: MultiChoiceOption[] }> {\n // Generate question first\n const question = await generateQuestionForSlot(slot, context, relevantKBs, frameworkContext);\n \n // Then generate options that match the question\n const options = await generateMultiChoiceOptions(slot, context, relevantKBs, frameworkContext, question);\n\n return { question, options };\n}\n\n/**\n * Update context with the generated question (for tracking)\n */\nexport function recordQuestion(\n context: AgentContext,\n slot: string,\n question: string,\n options?: MultiChoiceOption[]\n): AgentContext {\n const now = new Date().toISOString();\n\n // Initialize question history if needed\n if (!context.missingInformation.questionHistory) {\n context.missingInformation.questionHistory = [];\n }\n\n // Add to question history\n context.missingInformation.questionHistory.push({\n slot,\n question,\n timestamp: now,\n answered: false,\n });\n\n // Set as pending question\n context.pendingQuestion = {\n slot,\n question,\n askedAt: now,\n attempts: 0,\n options,\n };\n\n return context;\n}\n","/**\n * Redirect Message Generator\n *\n * Generates alignment questions when queries are outside the agent's scope.\n * Instead of just listing capabilities, asks a question that bridges the user's\n * intent toward something the agent can help with.\n */\n\nimport { KBMeta, FrameworkContext } from '../types';\nimport { getAllCapabilities, getAllDomains } from '../composition/registry';\nimport { getModel, getConfig } from '../runtime/config';\n\n/**\n * Build a summary of available KB capabilities for the LLM prompt\n */\nfunction buildKBCapabilitiesSummary(kbCatalog: KBMeta[]): string {\n const summaries = kbCatalog.map(kb => {\n const capabilities = kb.capabilities.join(', ');\n const domain = kb.domain;\n const description = kb.description;\n return `- ${kb.id} (${domain}): ${description}\\n Capabilities: ${capabilities}`;\n });\n\n return summaries.join('\\n\\n');\n}\n\n/**\n * Generate an alignment question when a query is outside scope.\n *\n * Instead of just listing what the agent can do, this generates a question\n * that attempts to find a connection between the user's original intent\n * and the agent's capabilities. This is more conversational and helps\n * guide users toward something useful.\n *\n * @param userUtterance - The user's query that was out of scope\n * @param goals - Goals extracted from the user's query\n * @param kbCatalog - All available knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n * @returns An alignment question to guide the user\n */\nexport async function generateRedirectMessage(\n userUtterance: string,\n goals: string[],\n kbCatalog: KBMeta[],\n frameworkContext: FrameworkContext\n): Promise<string> {\n const config = getConfig();\n const agentDomain = config.domain;\n const allCapabilities = getAllCapabilities();\n const allDomains = getAllDomains();\n const kbSummary = buildKBCapabilitiesSummary(kbCatalog);\n\n const model = getModel('extraction'); // Use extraction model for consistency\n\n const prompt = `You are a helpful ${agentDomain} assistant. A user asked something outside your scope.\n\nUser's query: \"${userUtterance}\"\nUser's goals: ${goals.length > 0 ? goals.join(', ') : 'Not clearly identified'}\n\nYour capabilities:\n${kbSummary}\n\nAvailable domains: ${allDomains.join(', ')}\nAvailable capabilities: ${allCapabilities.join(', ')}\n\nGenerate a SINGLE alignment question that:\n1. Briefly acknowledges your specialty/domain (not what you can't do)\n2. Asks if there's a related aspect of their query you CAN help with\n3. Tries to bridge their intent to your capabilities creatively\n\nKeep it to 1-2 sentences max. Be warm and helpful. Do NOT list examples or bullet points.\n\nExample good responses:\n- \"I specialize in electrical appliance support. Were you perhaps asking about a smart device or appliance feature I could help with?\"\n- \"I focus on Talmud studies. Is there a related tractate or topic I could help you explore?\"\n- \"I'm here to help with warranty and FAQ questions for appliances. Is there something about your product I could look into?\"\n\nGenerate only the question, nothing else:`;\n\n const result = await frameworkContext.llm.generateText(prompt, { model });\n\n return result.text.trim();\n}\n\n\n\n\n\n","/**\n * Scope Detector Module\n *\n * Handles late-stage scope detection when KBs return no results.\n * This is a fallback mechanism to the early scope detection in the extractor.\n *\n * The two-tier scope detection approach:\n * 1. EARLY (extractor.ts): During disambiguation, the LLM analyzes the query\n * against KB capabilities and sets isOutOfScope in the extraction results.\n * This catches obvious out-of-scope queries before any KB calls are made.\n *\n * 2. LATE (this module): After KB calls return no results, we perform a second\n * check to determine if the query is fundamentally outside scope vs. just\n * missing information. This distinguishes between:\n * - \"We don't have this information\" (in-scope but missing data)\n * - \"This isn't something we can help with\" (out-of-scope)\n */\n\nimport { Intent, KBMeta, FrameworkContext } from '../types';\nimport { getModel } from '../runtime/config';\n\n/**\n * Build a summary of KB capabilities for scope analysis\n *\n * @param kbCatalog - Available knowledge bases\n * @returns Formatted string describing all KBs and their capabilities\n */\nfunction buildKBSummary(kbCatalog: KBMeta[]): string {\n return kbCatalog\n .map(kb => {\n const domain = kb.domain;\n const capabilities = kb.capabilities.join(', ');\n const description = kb.description;\n const goalKeywords = kb.relevance?.goalKeywords?.join(', ') || 'none';\n return `${kb.id} (domain: ${domain}):\\n Description: ${description}\\n Capabilities: ${capabilities}\\n Goal keywords: ${goalKeywords}`;\n })\n .join('\\n\\n');\n}\n\n/**\n * Check if a query is fundamentally out of scope using LLM analysis.\n *\n * This is used for late detection when:\n * - KBs return no results\n * - Early disambiguation didn't catch the scope violation\n * - The user's query might be fundamentally outside all capabilities\n *\n * @param intent - User intent with utterance and goals\n * @param kbCatalog - Available knowledge bases\n * @param frameworkContext - Framework context with LLM provider\n * @returns true if query is out of scope, false otherwise\n */\nexport async function checkIfOutOfScope(\n intent: Intent,\n kbCatalog: KBMeta[],\n frameworkContext: FrameworkContext\n): Promise<boolean> {\n const { logger, llm } = frameworkContext;\n\n // Build KB summary for scope analysis\n const kbSummary = buildKBSummary(kbCatalog);\n const model = getModel('extraction');\n\n try {\n const prompt = `Analyze whether the user's query is fundamentally outside the scope of the available knowledge bases.\n\nUser's query: \"${intent.userUtterance}\"\nUser's goals: ${intent.goals.join(', ')}\n\nAvailable knowledge bases:\n${kbSummary}\n\nDetermine if this query is OUTSIDE the scope of ALL available knowledge bases. Consider:\n- Is the query about something completely unrelated to the domains covered?\n- Does the query fall outside all capabilities listed?\n- Is this a general knowledge question that has nothing to do with the agent's purpose?\n\nRespond with ONLY \"YES\" if the query is out of scope, or \"NO\" if it could potentially be answered by one of the knowledge bases (even if information is currently missing).\n\nResponse:`;\n\n const result = await llm.generateText(prompt, { model });\n\n const response = result.text.trim().toUpperCase();\n const isOutOfScope = response.startsWith('YES');\n\n logger.debug('Late scope detection', {\n query: intent.userUtterance,\n isOutOfScope,\n llmResponse: result.text,\n });\n\n return isOutOfScope;\n } catch (error) {\n logger.warn('Failed to check scope, defaulting to false', error);\n return false; // Default to false if check fails\n }\n}\n\n","/**\n * Disambiguation orchestrator.\n * Thin layer that coordinates between:\n * - LLM extractor (facts)\n * - State reducer (decisions)\n * - Question generator (phrasing)\n */\n\nimport { Intent, AgentContext, DisambiguationResult, Slots, ConversationMessage, KBMeta, FrameworkContext } from '../types';\nimport { llmExtractFacts } from './extractor';\nimport { reduceDisambiguation, RoutingDecision } from './reducer';\nimport { generateQuestionWithOptions, recordQuestion } from './questionGenerator';\nimport { generateRedirectMessage } from './redirectGenerator';\nimport { getAllCapabilities } from '../composition/registry';\n\n// Re-export routing types for use in routes\nexport type { RoutingDecision, KBRoutingReason } from './reducer';\n\n/**\n * Create an empty context for a new conversation\n */\nfunction createEmptyContext(utterance: string): AgentContext {\n const now = new Date().toISOString();\n return {\n userObjective: utterance,\n missingInformation: {\n slots: [],\n unobtainableSlots: [],\n descriptions: {},\n questionHistory: [],\n },\n collectedInformation: {\n slots: {},\n collectionHistory: [],\n },\n kbRetrievals: [],\n agentThinking: [\n {\n phase: 'disambiguation',\n timestamp: now,\n reasoning: `Starting new conversation: \"${utterance}\"`,\n },\n ],\n };\n}\n\n/**\n * Build an Intent object from context and goals\n */\nfunction buildIntent(\n context: AgentContext,\n goals: string[],\n intentSummary: string,\n missingSlots: string[],\n topicShift?: boolean,\n currentUtterance?: string\n): Intent {\n // Only use the current utterance if there was a topic shift detected.\n // Otherwise, always use the original objective so synthesis answers the right question.\n // Previously we used currentUtterance whenever goals.length > 0, but this caused\n // synthesis to answer follow-up messages like \"nothing comes to mind\" instead of\n // the original question like \"explain the chain rule\".\n const useCurrentUtterance = topicShift && currentUtterance;\n \n return {\n intentId: intentSummary,\n userUtterance: useCurrentUtterance ? currentUtterance : context.userObjective,\n slots: context.collectedInformation.slots as Slots,\n goals,\n missingSlots: missingSlots.length > 0 ? missingSlots : undefined,\n };\n}\n\n/**\n * Main disambiguation function.\n * Orchestrates the three-layer architecture:\n * 1. Extract facts from LLM (handles all reasoning including yes/no, confirmations, etc.)\n * 2. Run state reducer to get action\n * 3. Generate question if needed\n *\n * @param utterance - The user's current message\n * @param kbCatalog - Available knowledge bases\n * @param context - Current agent context (optional)\n * @param conversationHistory - Full conversation history (optional)\n * @param frameworkContext - Framework context with LLM provider\n */\nexport async function disambiguate(\n utterance: string,\n kbCatalog: KBMeta[],\n context: AgentContext | undefined,\n conversationHistory: ConversationMessage[] | undefined,\n frameworkContext: FrameworkContext\n): Promise<DisambiguationResult> {\n // Initialize context if needed\n let ctx = context ?? createEmptyContext(utterance);\n\n // Ensure user objective is set\n if (!ctx.userObjective) {\n ctx.userObjective = utterance;\n }\n\n // Step 1: Extract facts from LLM\n // The LLM handles all reasoning including:\n // - Interpreting yes/no answers in context of pending questions\n // - Extracting boolean values for boolean slots\n // - Determining if user couldn't answer (nonAnswer)\n // - Understanding confirmations and short responses\n // - Understanding conversation flow and topic shifts\n const llmFacts = await llmExtractFacts(utterance, ctx, kbCatalog, frameworkContext, conversationHistory);\n\n // Step 1.5: Handle topic shift - reset context if user changed topics\n if (llmFacts.topicShift) {\n // User has changed topics - start fresh with new context\n ctx = createEmptyContext(utterance);\n // Add thinking note about topic shift\n const now = new Date().toISOString();\n ctx.agentThinking.push({\n phase: 'disambiguation',\n timestamp: now,\n reasoning: `Topic shift detected: User changed topics. Starting fresh context for new query: \"${utterance}\". Previous context has been reset.`,\n });\n }\n\n // Step 2: Run deterministic state reducer\n // The reducer takes the current context + extracted facts and deterministically decides\n // what action to take (ASK_SLOT, CALL_KB, PARTIAL_PROCEED, BLOCKED, or OUT_OF_SCOPE). It has no\n // side effects, no LLM calls, and no async operations - same inputs always produce\n // same outputs. This makes the decision logic testable and predictable.\n const { context: newContext, action, relevantKBs, routingDecision } = reduceDisambiguation(\n ctx,\n {\n slots: llmFacts.slots,\n nonAnswer: llmFacts.nonAnswer || false,\n newUtterance: utterance,\n kbHints: llmFacts.kbHints,\n goals: llmFacts.goals,\n isOutOfScope: llmFacts.isOutOfScope,\n },\n kbCatalog\n );\n\n // Step 3: Handle actions that need async generation (questions or redirects)\n let finalAction = action;\n let finalContext = newContext;\n\n if (action.type === 'ASK_SLOT') {\n const { question, options } = await generateQuestionWithOptions(\n action.slot,\n newContext,\n relevantKBs,\n frameworkContext\n );\n\n // Update action with generated question and options\n finalAction = {\n type: 'ASK_SLOT',\n slot: action.slot,\n question,\n options: options.length > 0 ? options : undefined,\n };\n\n // Record the question in context (with options)\n finalContext = recordQuestion(newContext, action.slot, question, options.length > 0 ? options : undefined);\n } else if (action.type === 'OUT_OF_SCOPE') {\n // Generate personalized redirect message\n const redirectMessage = await generateRedirectMessage(\n utterance,\n llmFacts.goals,\n kbCatalog,\n frameworkContext\n );\n const availableCapabilities = getAllCapabilities();\n\n // Update action with generated redirect message\n finalAction = {\n type: 'OUT_OF_SCOPE',\n redirectMessage,\n availableCapabilities,\n };\n }\n\n // Build intent - pass topicShift flag to determine which utterance to use\n const intent = buildIntent(\n finalContext,\n llmFacts.goals,\n llmFacts.intentSummary,\n finalContext.missingInformation.slots,\n llmFacts.topicShift,\n utterance\n );\n\n // Add final thinking\n const now = new Date().toISOString();\n const isComplete = finalAction.type === 'CALL_KB' || finalAction.type === 'PARTIAL_PROCEED';\n finalContext.agentThinking.push({\n phase: 'disambiguation',\n timestamp: now,\n reasoning: isComplete\n ? `Disambiguation complete. Action: ${finalAction.type}. ` +\n (finalAction.type === 'CALL_KB' || finalAction.type === 'PARTIAL_PROCEED'\n ? `Proceeding with KBs: ${finalAction.kbIds.join(', ')}`\n : '')\n : `Disambiguation phase finished. Action: ${finalAction.type}. ` +\n (finalAction.type === 'ASK_SLOT'\n ? `Asking about ${finalAction.slot} - need more information before proceeding`\n : finalAction.type === 'OUT_OF_SCOPE'\n ? `Query is outside agent scope. Generated redirect message to guide user.`\n : `Blocked: ${(finalAction as any).reason || 'unknown'}`),\n details: {\n action: finalAction,\n extractedSlots: llmFacts.slots,\n extractionReasoning: llmFacts.reasoning,\n goals: llmFacts.goals,\n relevantKBs: relevantKBs.map(kb => kb.id),\n isOutOfScope: llmFacts.isOutOfScope,\n },\n });\n\n return {\n intent,\n updatedContext: finalContext,\n action: finalAction,\n // Include detailed disambiguation info for tracing\n disambiguationDetails: {\n llmExtraction: {\n kbHints: llmFacts.kbHints,\n goals: llmFacts.goals,\n reasoning: llmFacts.reasoning,\n isOutOfScope: llmFacts.isOutOfScope,\n },\n routingDecision,\n },\n };\n}\n\n/** Re-export for convenience */\nexport { generateQuestionForSlot, generateMultiChoiceOptions, generateQuestionWithOptions } from './questionGenerator';\nexport { llmExtractFacts } from './extractor';\nexport { reduceDisambiguation } from './reducer';\nexport { checkIfOutOfScope } from './scopeDetector';\n","/**\n * KB Catalog Module\n *\n * Manages the catalog of available knowledge bases by converting\n * manifest definitions into runtime KBMeta objects.\n */\n\nimport { getKBManifests } from './composition/registry';\nimport { getConfig, getSlotDefinition } from './runtime/config';\nimport { KBMeta, KBManifest } from './types';\nimport { AgentConfig } from './types/config';\nimport { KBInputField, SlotDefinition } from './types/composition';\n\n/**\n * When a manifest lists `inputs` but no `slots`, derive slot definitions for runtime.\n * Uses agent.config slot types (e.g. boolean) when the name matches.\n */\nfunction slotDefinitionsFromInputs(inputs: KBInputField[], config: AgentConfig): SlotDefinition[] {\n const byName = new Map(config.slots.map(s => [s.name, s]));\n return inputs.map(input => {\n const fromAgent = byName.get(input.slot);\n const type: SlotDefinition['type'] =\n fromAgent?.type === 'boolean' ? 'boolean' : fromAgent?.type === 'enum' ? 'enum' : 'string';\n return {\n name: input.slot,\n type,\n description: input.description ?? fromAgent?.description ?? '',\n required: input.required !== false,\n prompt: fromAgent?.prompt,\n examples: fromAgent?.examples,\n normalization: fromAgent?.normalization,\n enumValues: fromAgent?.enumValues,\n };\n });\n}\n\n/**\n * Critical slot patterns that should ALWAYS be marked as required.\n * These are identifying/discriminating slots that are essential for lookup.\n * Duplicated from manifest-generator.ts to ensure runtime enforcement.\n */\nconst CRITICAL_SLOT_PATTERNS = [\n // Product/Item identification\n /product[_-]?model/i,\n /model[_-]?number/i,\n /model[_-]?name/i,\n /^model$/i,\n /device[_-]?model/i,\n /item[_-]?model/i,\n /part[_-]?number/i,\n /sku/i,\n /serial[_-]?number/i,\n\n // Specific identifiers\n /product[_-]?id/i,\n /device[_-]?id/i,\n /item[_-]?id/i,\n /course[_-]?id/i,\n /chapter[_-]?id/i,\n /section[_-]?id/i,\n\n // Type discriminators (when they're the primary classifier)\n /product[_-]?type/i,\n /device[_-]?type/i,\n /appliance[_-]?type/i,\n /equipment[_-]?type/i,\n];\n\n/**\n * Ensure that critical identifying slots are marked as required at runtime.\n * This prevents issues where manifests were saved without proper required flags.\n */\nfunction ensureCriticalSlotsRequired(slots: SlotDefinition[]): SlotDefinition[] {\n return slots.map(slot => {\n // Check if this slot matches any critical pattern\n const isCritical = CRITICAL_SLOT_PATTERNS.some(pattern => pattern.test(slot.name));\n\n if (isCritical && slot.required !== true) {\n // Auto-mark this as required at runtime\n return { ...slot, required: true };\n }\n\n return slot;\n });\n}\n\n/**\n * Patterns that indicate a slot expects a specific identifier (not just a category/type).\n */\nconst IDENTIFIER_SLOT_PATTERNS = [\n /product[_-]?model/i,\n /model[_-]?number/i,\n /model[_-]?name/i,\n /^model$/i,\n /device[_-]?model/i,\n /item[_-]?model/i,\n /part[_-]?number/i,\n /sku/i,\n /serial[_-]?number/i,\n /product[_-]?id/i,\n /device[_-]?id/i,\n /item[_-]?id/i,\n /order[_-]?id/i,\n /order[_-]?number/i,\n /account[_-]?id/i,\n /user[_-]?id/i,\n /^name$/i,\n /product[_-]?name/i,\n];\n\n/**\n * Patterns that indicate a slot is a categorization slot.\n */\nconst CATEGORIZATION_SLOT_PATTERNS = [\n /[_-]type$/i,\n /^type$/i,\n /[_-]category$/i,\n /^category$/i,\n /[_-]kind$/i,\n /^kind$/i,\n /failure[_-]?type/i,\n /issue[_-]?type/i,\n /problem[_-]?type/i,\n /[_-]symptom/i,\n /^symptom$/i,\n];\n\n/**\n * Infer and set extractionBehavior for slots at runtime.\n * This helps the extractor understand how to handle vague/ambiguous input.\n */\nfunction inferExtractionBehavior(slots: SlotDefinition[]): SlotDefinition[] {\n return slots.map(slot => {\n // If already set, don't override\n if (slot.extractionBehavior) return slot;\n \n // Check if it's an identifier slot\n const isIdentifier = IDENTIFIER_SLOT_PATTERNS.some(pattern => pattern.test(slot.name));\n if (isIdentifier) {\n return { ...slot, extractionBehavior: 'identifier' as const };\n }\n \n // Check if it's a categorization slot\n const isCategorization = \n CATEGORIZATION_SLOT_PATTERNS.some(pattern => pattern.test(slot.name)) ||\n slot.type === 'enum' ||\n (slot.enumValues && slot.enumValues.length > 0);\n if (isCategorization) {\n return { ...slot, extractionBehavior: 'categorization' as const };\n }\n \n // Default to freeform\n return { ...slot, extractionBehavior: 'freeform' as const };\n });\n}\n\n/**\n * Build input prompts for a knowledge base from slot definitions\n *\n * @param inputEntities - Array of slot names that the KB requires as input\n * @param config - Optional config to use for slot definitions\n * @returns Record mapping slot names to their prompt strings\n */\nfunction buildInputPrompts(\n inputEntities: string[],\n config?: AgentConfig\n): Record<string, string> {\n const prompts: Record<string, string> = {};\n inputEntities.forEach(slotName => {\n const slotDef = getSlotDefinition(slotName, config);\n if (slotDef?.prompt) {\n prompts[slotName] = slotDef.prompt;\n }\n });\n return prompts;\n}\n\n/**\n * Convert a KB manifest to runtime KBMeta format\n *\n * @param manifest - The KB manifest definition from composition\n * @param config - Optional config to use for slot definitions\n * @returns KBMeta object with all runtime-required fields\n */\nfunction manifestToKBMeta(manifest: KBManifest, config?: AgentConfig): KBMeta {\n const cfg = config ?? getConfig();\n const sourceSlots: SlotDefinition[] =\n manifest.slots?.length\n ? manifest.slots\n : manifest.inputs?.length\n ? slotDefinitionsFromInputs(manifest.inputs, cfg)\n : [];\n\n // CRITICAL: Apply runtime enforcement of required slots for identifying fields\n // This ensures manifests saved without proper required flags still work correctly\n let normalizedSlots = ensureCriticalSlotsRequired(sourceSlots);\n\n // Infer extraction behavior for slots that don't have it set\n normalizedSlots = inferExtractionBehavior(normalizedSlots);\n\n // Derive inputRequirements from slots with required=true (after normalization)\n const inputRequirements = normalizedSlots\n .filter(s => s.required)\n .map(s => ({ slot: s.name, required: true as const, description: s.description }));\n\n const inputEntities = inputRequirements.map(i => i.slot);\n // Normalize capabilities - they can be strings or objects with evidence\n const capabilities = manifest.capabilities.map(cap =>\n typeof cap === 'string' ? cap : cap.text\n );\n return {\n id: manifest.id,\n assistantName: manifest.assistantName,\n domain: manifest.domain,\n description: manifest.description,\n inputEntities,\n outputEntities: manifest.outputs,\n capabilities,\n inputPrompts: buildInputPrompts(inputEntities, config),\n relevance: manifest.relevance,\n queryTemplate: manifest.queryTemplate,\n inputRequirements,\n scope: manifest.scope,\n slots: manifest.slots?.length ? manifest.slots : normalizedSlots,\n };\n}\n\n/** Catalog of all available knowledge bases (static, from files) */\nexport const kbCatalog: KBMeta[] = getKBManifests().map((m) => manifestToKBMeta(m));\n\n/**\n * Build a KB catalog from manifests (for dynamic/SaaS use)\n *\n * @param manifests - Array of KB manifests\n * @param config - Optional config to use for slot definitions\n * @returns Array of KBMeta objects\n */\nexport function buildKBCatalog(manifests: KBManifest[], config?: AgentConfig): KBMeta[] {\n return manifests.map((m) => manifestToKBMeta(m, config));\n}\n\n/**\n * Normalize a KB ID for matching purposes.\n * Handles common LLM transformations like underscores vs hyphens.\n */\nfunction normalizeKbId(id: string): string {\n return id.toLowerCase().replace(/[-_]/g, '');\n}\n\n/**\n * Find a KB in the catalog by ID, with fuzzy matching for LLM variations.\n * LLMs sometimes transform IDs (e.g., \"kb-sci\" ā \"kb_sci\"), so we use\n * normalized matching to handle these cases.\n */\nfunction findKbById(kbId: string, catalog: KBMeta[]): KBMeta | undefined {\n // Try exact match first\n const exact = catalog.find(kb => kb.id === kbId);\n if (exact) return exact;\n\n // Fall back to normalized matching\n const normalizedInput = normalizeKbId(kbId);\n return catalog.find(kb => normalizeKbId(kb.id) === normalizedInput);\n}\n\n/**\n * Get metadata for a specific knowledge base from the static catalog\n *\n * @param kbId - The unique identifier of the knowledge base\n * @returns KBMeta object if found, undefined otherwise\n */\nexport function getKBMeta(kbId: string): KBMeta | undefined {\n return findKbById(kbId, kbCatalog);\n}\n\n/**\n * Get metadata for a specific knowledge base from a dynamic catalog\n *\n * @param kbId - The unique identifier of the knowledge base\n * @param catalog - The catalog to search in\n * @returns KBMeta object if found, undefined otherwise\n */\nexport function getKBMetaFromCatalog(kbId: string, catalog: KBMeta[]): KBMeta | undefined {\n return findKbById(kbId, catalog);\n}\n","/**\n * Query Builder Module\n * \n * Handles building query prompts from knowledge base templates and slot values\n */\n\nimport { Intent, Slots, KBMeta } from '../types';\nimport { formatSlotValue, getRuntimeConfig } from '../runtime/config';\nimport type { SlotMappings } from '../types/config';\n\n/**\n * Translates canonical slot names to KB-specific original slot names\n * \n * @param inputs - Slot values with canonical names\n * @param kbId - The KB to translate for\n * @param slotMappings - Mappings from config (canonical -> original per KB)\n * @returns Slot values with KB-specific names\n */\nexport function translateSlotsForKB(\n inputs: Partial<Slots>,\n kbId: string,\n slotMappings?: SlotMappings\n): Partial<Slots> {\n // Start with a shallow copy\n const translated: Partial<Slots> = { ...inputs };\n\n // Apply explicit slot mappings first (canonical -> KB-specific)\n if (slotMappings && slotMappings[kbId]) {\n const kbMappings = slotMappings[kbId];\n for (const [canonicalName, value] of Object.entries(inputs)) {\n const originalName = kbMappings[canonicalName];\n if (originalName && originalName !== canonicalName) {\n translated[originalName as keyof Slots] = value;\n delete translated[canonicalName as keyof Slots];\n }\n }\n }\n\n // Heuristic backfills to reduce template/metadata mismatches when mappings are absent\n // Map appliance_type -> product_type\n if (!translated.product_type && translated.appliance_type) {\n translated.product_type = translated.appliance_type;\n }\n // Map model/model_name -> product_model\n if (!translated.product_model && translated.model) {\n translated.product_model = translated.model;\n }\n if (!translated.product_model && (translated as any).model_name) {\n translated.product_model = (translated as any).model_name as any;\n }\n // Map issue_type/problem_symptom -> issue_type_faq\n if (!translated.issue_type_faq && translated.issue_type) {\n translated.issue_type_faq = translated.issue_type as any;\n }\n if (!translated.issue_type_faq && translated.problem_symptom) {\n translated.issue_type_faq = translated.problem_symptom as any;\n }\n\n return translated;\n}\n\n/**\n * Converts a slot value to a string representation\n * Handles formatting based on slot name (if provided) or type\n * \n * @param value - The slot value (string, boolean, or undefined)\n * @param slotName - Optional slot name for custom formatting\n * @returns Formatted string value, or undefined if value is empty/null\n */\nexport function slotValueToString(value: string | boolean | undefined, slotName?: string): string | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n if (slotName) {\n return formatSlotValue(slotName, value);\n }\n // Fallback for cases where slot name is not provided\n if (typeof value === 'boolean') {\n return value ? 'yes' : 'no';\n }\n return String(value);\n}\n\n/**\n * Builds a query prompt for a knowledge base using its query template\n * \n * The query template can include:\n * - preamble: Text that appears at the start\n * - sections: Conditional sections that require specific slots\n * - closing: Text that appears at the end\n * \n * Template variables use {{variableName}} syntax and can reference:\n * - userUtterance: The original user question\n * - Any slot name from stepInputs\n * \n * Sections are only included if all required slots are present.\n * If required slots are missing, the section's fallback text is used instead.\n * \n * @param kbMeta - Knowledge base metadata containing query template\n * @param stepInputs - Slot values to interpolate into the template\n * @param intent - User intent containing the original utterance\n * @returns Formatted query string, or userUtterance if no template exists\n */\nexport function buildKBQueryPrompt(\n kbMeta: KBMeta,\n stepInputs: Partial<Slots>,\n intent: Intent\n): string {\n if (!kbMeta.queryTemplate) {\n return intent.userUtterance;\n }\n\n // Translate slot names from canonical to KB-specific if mappings exist\n const config = getRuntimeConfig();\n const kbId = kbMeta.id;\n const translatedInputs = translateSlotsForKB(stepInputs, kbId, config?.slotMappings);\n\n const { preamble, sections = [], closing = [] } = kbMeta.queryTemplate;\n const lines: string[] = [];\n\n // Helper function to render template variables\n // Replaces {{variableName}} with actual values from translatedInputs or intent\n const render = (template: string | undefined) => {\n if (!template) return '';\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (_, token) => {\n const key = token.trim();\n if (key === 'userUtterance') {\n return intent.userUtterance;\n }\n // Try translated inputs first, then fall back to original inputs\n const value = slotValueToString(translatedInputs[key as keyof Slots]) \n ?? slotValueToString(stepInputs[key as keyof Slots]);\n return value ?? '';\n }).trim();\n };\n\n // Add preamble if present\n if (preamble) {\n lines.push(preamble);\n }\n\n // Process conditional sections\n // Sections are included only if all required slots are present\n sections.forEach(section => {\n const required = section.requires || [];\n // Check both translated and original inputs for required slots\n const hasAllRequired = required.every(slot => \n slotValueToString(translatedInputs[slot as keyof Slots]) \n ?? slotValueToString(stepInputs[slot as keyof Slots])\n );\n\n // Include section text if all required slots are available\n if (hasAllRequired) {\n const rendered = render(section.text);\n if (rendered) {\n lines.push(rendered);\n }\n return;\n }\n\n // Use fallback text if required slots are missing\n if (section.fallback) {\n const fallbackText = render(section.fallback);\n if (fallbackText) {\n lines.push(fallbackText);\n }\n }\n });\n\n if (closing.length > 0) {\n lines.push(...closing);\n }\n\n const result = lines\n .map(line => line.trim())\n .filter(Boolean)\n .join('\\n');\n\n return result || intent.userUtterance;\n}\n\n","import { z } from 'zod';\nimport { Plan, PlanStep, Intent, AgentContext, KBMeta, FrameworkContext } from './types';\nimport { getConfig, getModel, getPrompt, buildSlotsSchema } from './runtime/config';\nimport { getKBMetaFromCatalog } from './kbCatalog';\nimport { translateSlotsForKB } from './executor/queryBuilder';\n\n/**\n * Schema for a plan step that calls a knowledge base (KB).\n *\n * This represents a single query to a specific knowledge base with the required inputs.\n * The executor will use this step to retrieve information from the specified KB.\n *\n * Fields:\n * - id: Unique identifier for this step (e.g., \"kb_query_1\")\n * - type: Discriminator field, must be \"kb_call\"\n * - kbId: The ID of the knowledge base to query (as defined in composition manifests)\n * - inputs: Object containing all input parameters needed by the KB. These are optional\n * because different KBs require different inputs, and some may not be available at planning time.\n * Common inputs include product details, issue types, dates, and location information.\n * - expectedOutputs: Array of entity names that this KB call is expected to return.\n * Used for validation and to understand what information will be available after execution.\n */\n\n/**\n * Schema describing why a specific knowledge base is relevant to the user's query.\n * \n * This is used in the enhanced planning process to provide transparency about\n * KB selection decisions. It helps explain the planner's reasoning and can be\n * used for debugging or user-facing explanations.\n * \n * Fields:\n * - kbId: The knowledge base being analyzed\n * - reason: Human-readable explanation of why this KB is relevant\n * - priority: Numeric priority (higher = more important). Used to order KB calls.\n * - requiredSlots: List of input slot names that this KB needs to function properly\n * - confidence: Numeric confidence (0-1) in the relevance assessment\n */\nconst KBRelevanceSchema = z.object({\n kbId: z.string(),\n reason: z.string(),\n priority: z.number(),\n requiredSlots: z.array(z.string()),\n confidence: z.number(),\n});\n\n/**\n * Build Zod schemas dynamically using the CURRENT runtime config.\n * We cannot cache these at module load because SaaS mode sets runtime config\n * per-request; cached schemas would miss dynamically provided slots.\n */\nfunction buildPlanSchemas() {\n // Allow arbitrary inputs so we don't drop slots when config slots are incomplete\n const inputsSchema = z.record(z.string(), z.unknown()).default({});\n\n const PlanStepKBCallSchema = z.object({\n id: z.string(),\n type: z.literal('kb_call'),\n kbId: z.string(),\n inputs: inputsSchema,\n expectedOutputs: z.array(z.string()),\n });\n\n const PlanStepSynthesisSchema = z.object({\n id: z.string(),\n type: z.literal('llm_synthesis'),\n fromSteps: z.array(z.string()),\n });\n\n const PlanStepSchema = z.discriminatedUnion('type', [\n PlanStepKBCallSchema,\n PlanStepSynthesisSchema,\n ]);\n\n const EnhancedPlanSchema = z.object({\n planId: z.string(),\n steps: z.array(PlanStepSchema),\n reasoning: z.string().optional().default('Plan generated'),\n confidence: z.number().optional().default(0.7),\n kbAnalysis: z.array(KBRelevanceSchema).optional().default([]),\n goalAnalysis: z.string().optional().default(''),\n riskAssessment: z.string().optional().default(''),\n });\n\n return { PlanStepSchema, EnhancedPlanSchema };\n}\n\n/**\n * Creates an execution plan to answer a user's query using available knowledge bases.\n * \n * This is the main planning function that uses an LLM to intelligently select and sequence\n * knowledge base calls to answer the user's question. The planner:\n * 1. Analyzes the user's intent and goals\n * 2. Selects relevant knowledge bases from the catalog\n * 3. Determines the optimal sequence of KB calls\n * 4. Adds synthesis steps when multiple KBs are needed\n * 5. Provides reasoning and confidence scores\n * \n * The function respects disambiguation results: if `relevantKBs` is provided (from the\n * disambiguation/reducer phase), it only considers those KBs, ensuring the plan aligns\n * with the user's current goals rather than the original query.\n * \n * @param intent - The user's intent containing their query, goals, available slots, and missing information\n * @param kbCatalog - Full catalog of available knowledge bases with their metadata\n * @param context - Optional agent context containing conversation history, collected information, and previous thinking\n * @param relevantKBs - Optional filtered list of KBs from disambiguation. If provided, only these KBs will be considered.\n * This allows the planner to adapt to evolving user goals during multi-turn conversations.\n * \n * @returns A promise resolving to:\n * - plan: The execution plan with steps, reasoning, and confidence\n * - updatedContext: Updated agent context with planning reasoning added to agentThinking\n * \n * @example\n * ```typescript\n * const { plan, updatedContext } = await plan(\n * { userUtterance: \"How do I resolve this issue?\", goals: [\"help\"], ... },\n * kbCatalog,\n * existingContext,\n * relevantKBs // Only consider specific KBs if disambiguation narrowed it down\n * );\n * ```\n */\nexport async function plan(\n intent: Intent,\n kbCatalog: KBMeta[],\n context?: AgentContext,\n relevantKBs?: KBMeta[],\n frameworkContext?: FrameworkContext // TODO: Make required once all call sites verified\n): Promise<{ plan: Plan; updatedContext: AgentContext }> {\n const planId = `plan_${Date.now()}`;\n\n // If relevantKBs are provided (from disambiguation), only consider those KBs\n // This ensures the planner respects the reducer's KB selection based on current goals\n // This is crucial for multi-turn conversations where user goals may have evolved\n const kbCatalogToUse = relevantKBs && relevantKBs.length > 0 ? relevantKBs : kbCatalog;\n\n /**\n * Ensure kb_call steps carry the user's collected slots.\n * If the planner (LLM) leaves inputs empty, we back-fill from the current intent,\n * using slot translation to map canonical slot names to KB-specific names.\n */\n const backfillKbInputs = (planSteps: PlanStep[], catalog: KBMeta[]) => {\n const findMeta = (kbId: string) => getKBMetaFromCatalog(kbId, catalog);\n const config = getConfig();\n planSteps.forEach(step => {\n if (step.type !== 'kb_call') return;\n const kbMeta = findMeta(step.kbId);\n const hasInputs = step.inputs && Object.keys(step.inputs).length > 0;\n if (hasInputs) return;\n\n const availableSlots = intent.slots || {};\n \n // Translate slots to KB-specific names (handles model->product_model, etc.)\n const translatedSlots = translateSlotsForKB(availableSlots, step.kbId, config.slotMappings);\n\n if (kbMeta?.inputEntities?.length) {\n // Filter to only include slots the KB expects (using translated names)\n const filtered: any = {};\n kbMeta.inputEntities.forEach(slotName => {\n // Check both translated and original slot names\n if (translatedSlots[slotName as keyof typeof translatedSlots] !== undefined) {\n filtered[slotName] = translatedSlots[slotName as keyof typeof translatedSlots];\n } else if (availableSlots[slotName as keyof typeof availableSlots] !== undefined) {\n filtered[slotName] = availableSlots[slotName as keyof typeof availableSlots];\n }\n });\n if (Object.keys(filtered).length > 0) {\n step.inputs = filtered;\n return;\n }\n }\n\n // Fallback: pass all translated slots (translation handles canonical->KB mapping)\n step.inputs = { ...translatedSlots };\n });\n };\n\n // Prepare KB catalog summary for the LLM\n // Extract only the fields needed for planning decisions to keep the prompt focused\n const kbSummary = kbCatalogToUse.map(kb => ({\n id: kb.id,\n domain: kb.domain,\n description: kb.description,\n capabilities: kb.capabilities,\n inputEntities: kb.inputEntities,\n outputEntities: kb.outputEntities,\n inputPrompts: kb.inputPrompts,\n }));\n\n // Get config for model and prompts\n const config = getConfig();\n const planningModel = getModel('planning');\n const systemRole = getPrompt('plannerSystemRole');\n\n // Build the planning prompt\n const planningPrompt = `You are ${systemRole}. Create a reasoned execution plan to answer the user's question using available knowledge bases.\n\nUser Query: \"${intent.userUtterance}\"\nUser Goals: ${intent.goals.join(', ')}\n${relevantKBs && relevantKBs.length > 0\n ? `\\nPRIMARY KBs identified as relevant: ${relevantKBs.map(kb => kb.id).join(', ')}. \nThese were identified during disambiguation, but you should ALSO consider if the ORIGINAL query requires additional KBs.\nIf the user's query has MULTIPLE aspects (e.g., \"write a Python program about physics\" needs both programming AND physics KBs), include ALL relevant KBs even if they weren't in the primary list.`\n : ''}\nAvailable Information: ${Object.entries(intent.slots)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '')\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ') || 'No specific information available'}\n${intent.missingSlots && intent.missingSlots.length > 0 ? `Missing Information: ${intent.missingSlots.join(', ')}` : 'All required information is available'}\n${context?.missingInformation?.questionHistory?.length\n ? `\\nQuestions already asked (avoid re-asking): ${context.missingInformation.questionHistory\n .filter(q => !q.answered)\n .map(q => `${q.slot}: \"${q.question}\"`)\n .join('; ')}`\n : ''}\n\nKnowledge Base Options:\n${kbSummary.map(kb => `\n${kb.id}:\n Purpose: ${kb.description}\n Capabilities: ${kb.capabilities.join(', ')}\n Requires: ${kb.inputEntities.join(', ')}\n Provides: ${kb.outputEntities.join(', ')}\n ${kb.inputPrompts ? `Typical queries: ${Object.values(kb.inputPrompts).slice(0, 2).join('; ')}` : ''}\n`).join('\\n')}\n\nThink step-by-step and create a plan:\n\n1. **Goal Analysis**: What does the user want to achieve? What specific information do they need?\n\n2. **KB Selection**: Which knowledge bases are most relevant? Consider:\n - How well each KB's capabilities match the user's goals\n - What information is available vs. what each KB needs\n - Whether multiple KBs are needed for a complete answer\n - Priority order (which KB should be consulted first)\n\n3. **Plan Construction**: Create execution steps that will efficiently gather and synthesize the needed information.\n\n4. **Risk Assessment**: What could go wrong? Are there gaps in information or potential conflicts between KB responses?\n\nReturn a JSON plan with:\n- planId: \"${planId}\"\n- steps: Array of execution steps (kb_call and llm_synthesis)\n- reasoning: Your overall explanation of why this plan makes sense\n- confidence: Number 0-1 indicating how confident you are in this plan\n- kbAnalysis: Array explaining why each selected KB was chosen\n- goalAnalysis: Summary of what you're trying to achieve\n- riskAssessment: Potential issues or limitations\n\nGuidelines:\n- Only call KBs that are genuinely needed and relevant\n- If no KB is clearly relevant, still provide a best-effort plan\n- Consider information dependencies between steps\n- Always include synthesis if calling multiple KBs or if complex reasoning is needed`;\n\n // Use the LLM provider from framework context\n if (!frameworkContext) {\n throw new Error('plan() requires frameworkContext with LLM provider');\n }\n \n let plan: Plan;\n const now = new Date().toISOString();\n \n // Initialize or clone the agent context\n // If no context exists, create a new one with empty collections\n // If context exists, clone it so we can add planning reasoning without mutating the original\n const updatedContext: AgentContext = context ? { ...context } : {\n userObjective: intent.userUtterance,\n missingInformation: { slots: [], unobtainableSlots: [], descriptions: {} },\n collectedInformation: { slots: intent.slots, collectionHistory: [] },\n kbRetrievals: [],\n agentThinking: [],\n };\n\n // Build schemas using the current runtime config (SaaS mode updates config per request)\n const { EnhancedPlanSchema } = buildPlanSchemas();\n\n try {\n const result = await frameworkContext.llm.generateObject(\n EnhancedPlanSchema,\n planningPrompt,\n { model: planningModel }\n );\n const object = result.object;\n\n // Extract the plan from the LLM response\n // Note: We only use the basic Plan fields (planId, steps, reasoning, confidence)\n // The enhanced fields (kbAnalysis, goalAnalysis, riskAssessment) are used by the LLM\n // for reasoning but aren't part of the Plan type used by the executor\n plan = {\n planId: object.planId,\n steps: object.steps as PlanStep[], // LLM returns steps with correct structure\n reasoning: object.reasoning,\n confidence: object.confidence,\n };\n\n // Backfill KB call inputs with collected slots if the plan omitted them\n backfillKbInputs(plan.steps, kbCatalogToUse);\n } catch (planningError) {\n // Log the error for debugging but use fallback instead of failing\n console.warn('LLM plan generation failed, using fallback plan:', planningError instanceof Error ? planningError.message : planningError);\n \n // Create fallback plan using relevant KBs\n const defaultKbId = config.defaultKbId;\n const fallbackKb = (relevantKBs && relevantKBs.length > 0) \n ? relevantKBs[0] \n : getKBMetaFromCatalog(defaultKbId, kbCatalog) || kbCatalog[0];\n \n if (fallbackKb) {\n const kbSteps = (relevantKBs && relevantKBs.length > 0 ? relevantKBs : [fallbackKb]).map((kb, idx) => ({\n id: `${kb.id}_query_${idx}`,\n type: 'kb_call' as const,\n kbId: kb.id,\n inputs: intent.slots,\n expectedOutputs: kb.outputEntities,\n }));\n \n plan = {\n planId,\n steps: [\n ...kbSteps,\n {\n id: 'answer_synthesis',\n type: 'llm_synthesis' as const,\n fromSteps: kbSteps.map(s => s.id),\n },\n ],\n reasoning: 'Fallback plan using relevant knowledge bases (LLM planning failed)',\n confidence: 0.4,\n };\n backfillKbInputs(plan.steps, kbCatalogToUse);\n } else {\n // No KBs available at all - create empty plan that will fail gracefully later\n plan = {\n planId,\n steps: [],\n reasoning: 'No knowledge bases available for fallback',\n confidence: 0.1,\n };\n }\n }\n\n // Minimal fallback: If somehow no plan was created, use the default KB from config\n // This is a safety mechanism in case the LLM fails to generate a valid plan\n if (!plan.steps || plan.steps.length === 0) {\n console.warn('Planner returned empty plan, using minimal fallback');\n\n const defaultKbId = config.defaultKbId;\n const defaultKb = getKBMetaFromCatalog(defaultKbId, kbCatalog) || kbCatalog[0];\n if (defaultKb) {\n // Create a simple two-step plan: query the default KB, then synthesize the answer\n plan = {\n planId,\n steps: [\n {\n id: `${defaultKb.id}_query`,\n type: 'kb_call',\n kbId: defaultKb.id,\n inputs: intent.slots,\n expectedOutputs: defaultKb.outputEntities,\n },\n {\n id: 'answer_synthesis',\n type: 'llm_synthesis',\n fromSteps: [`${defaultKb.id}_query`],\n },\n ],\n reasoning: 'Fallback plan using most general knowledge base',\n confidence: 0.3, // Low confidence since this is a fallback\n };\n backfillKbInputs(plan.steps, kbCatalogToUse);\n }\n }\n\n // Extract step information for logging and context updates\n // Separate KB call steps from synthesis steps to provide detailed reasoning\n const kbCallSteps = plan.steps.filter(step => step.type === 'kb_call');\n const synthesisStep = plan.steps.find(step => step.type === 'llm_synthesis');\n\n // Build a human-readable summary of the planning decision for the agent's thinking log\n // This helps with debugging and provides transparency about planning decisions\n const reasoning = `Reasoning-based planning: ${plan.reasoning || 'Created execution plan'}. ` +\n `Confidence: ${(plan.confidence || 0).toFixed(2)}. ` +\n `${kbCallSteps.length} KB call(s): ${kbCallSteps.map(step => step.kbId).join(', ')}. ` +\n `${synthesisStep ? 'Includes synthesis step.' : 'No synthesis needed.'}`;\n\n // Record the planning decision in the agent's thinking log\n // This creates an audit trail of why certain decisions were made\n updatedContext.agentThinking.push({\n phase: 'planning',\n timestamp: now,\n reasoning,\n details: {\n planId: plan.planId,\n confidence: plan.confidence,\n planReasoning: plan.reasoning,\n kbCalls: kbCallSteps.map(step => ({\n stepId: step.id,\n kbId: step.kbId,\n inputs: step.inputs,\n expectedOutputs: step.expectedOutputs,\n })),\n hasSynthesis: !!synthesisStep,\n },\n });\n\n return { plan, updatedContext };\n}\n\n/**\n * Dynamically modifies an execution plan based on intermediate results from completed steps.\n * \n * This function enables adaptive planning - the ability to adjust the plan mid-execution\n * when things don't go as expected or when new information suggests a better approach.\n * \n * The function analyzes the execution state and decides whether to modify the plan by:\n * 1. Checking if any steps failed (may need alternative approaches)\n * 2. Checking if successful results make some remaining steps unnecessary\n * 3. Identifying if dependencies are broken (synthesis steps depending on failed KB calls)\n * 4. Using an LLM to determine if modifications would improve the plan\n * \n * This is particularly useful for:\n * - Handling KB failures gracefully (e.g., if a KB returns no results)\n * - Optimizing execution (skipping redundant steps if earlier steps already provided answers)\n * - Adapting to unexpected results (e.g., if a KB returns different information than expected)\n * \n * @param originalPlan - The plan that was originally created and is now being executed\n * @param completedSteps - Array of steps that have already been executed, with their results.\n * Each entry includes the stepId, optional kbId, success status, and results.\n * @param remainingSteps - Array of steps that haven't been executed yet. These may be modified or removed.\n * @param intent - The user's original intent (used to understand goals if plan needs to change)\n * @param kbCatalog - Full catalog of available knowledge bases (for finding alternatives)\n * @param context - Optional agent context for maintaining conversation state\n * \n * @returns A promise resolving to:\n * - modifiedPlan: The potentially modified plan (same as original if shouldModify is false)\n * - shouldModify: Boolean indicating whether the plan was actually modified\n * - updatedContext: Updated agent context with modification reasoning added to agentThinking\n * \n * @example\n * ```typescript\n * // After executing some steps, check if plan needs modification\n * const { modifiedPlan, shouldModify, updatedContext } = await modifyPlan(\n * originalPlan,\n * [{ stepId: 'kb_query_1', kbId: 'my_kb', success: false, results: null }],\n * remainingSteps,\n * intent,\n * kbCatalog,\n * context\n * );\n * \n * if (shouldModify) {\n * // Use the modified plan instead of the original\n * plan = modifiedPlan;\n * }\n * ```\n */\nexport async function modifyPlan(\n originalPlan: Plan,\n completedSteps: Array<{ stepId: string; kbId?: string; success: boolean; results?: any }>,\n remainingSteps: PlanStep[],\n intent: Intent,\n kbCatalog: KBMeta[],\n context?: AgentContext,\n frameworkContext?: FrameworkContext\n): Promise<{ modifiedPlan: Plan; shouldModify: boolean; updatedContext: AgentContext }> {\n // Early exit: Only consider plan modification if we have completed some steps and have remaining steps\n // If nothing has been executed yet, or everything is done, there's nothing to modify\n if (completedSteps.length === 0 || remainingSteps.length === 0) {\n return {\n modifiedPlan: originalPlan,\n shouldModify: false,\n updatedContext: context || {\n userObjective: intent.userUtterance,\n missingInformation: { slots: [], unobtainableSlots: [], descriptions: {} },\n collectedInformation: { slots: intent.slots, collectionHistory: [] },\n kbRetrievals: [],\n agentThinking: [],\n }\n };\n }\n\n const now = new Date().toISOString();\n // Initialize or clone the agent context (same pattern as in plan function)\n const updatedContext: AgentContext = context ? { ...context } : {\n userObjective: intent.userUtterance,\n missingInformation: { slots: [], unobtainableSlots: [], descriptions: {} },\n collectedInformation: { slots: intent.slots, collectionHistory: [] },\n kbRetrievals: [],\n agentThinking: [],\n };\n\n // Analyze completed steps to determine if plan modification is needed\n // Separate failed and successful steps to understand the execution state\n const failedSteps = completedSteps.filter(step => !step.success);\n const successfulSteps = completedSteps.filter(step => step.success);\n\n // Check if any remaining synthesis steps depend on failed KB calls\n // If a synthesis step depends on a failed step, it can't produce useful results\n // This is a strong signal that the plan needs modification\n const hasFailedDependencies = remainingSteps.some(step =>\n step.type === 'llm_synthesis' &&\n step.fromSteps.some(fromStep => failedSteps.some(failed => failed.stepId === fromStep))\n );\n\n // If we have successful results, they might make some remaining steps unnecessary\n // For example, if an early KB call already answered the question, we might skip later steps\n const hasSuccessfulResults = successfulSteps.length > 0;\n\n // Optimization: Only call the LLM for plan modification if there are meaningful reasons\n // This avoids unnecessary LLM calls when the plan is working as expected\n // We only modify if there are failures that break dependencies OR successful results that might optimize the plan\n if (!hasFailedDependencies && !hasSuccessfulResults) {\n return {\n modifiedPlan: originalPlan,\n shouldModify: false,\n updatedContext\n };\n }\n\n // Create a concise summary of the execution state for the LLM\n // This helps the LLM understand what has happened and what remains to be done\n // without overwhelming it with full result objects\n const executionSummary = {\n completedSteps: completedSteps.map(step => ({\n stepId: step.stepId,\n kbId: step.kbId,\n success: step.success,\n hasResults: !!step.results, // Just indicate if results exist, not the full results\n })),\n remainingSteps: remainingSteps.map(step => ({\n stepId: step.id,\n type: step.type,\n kbId: step.type === 'kb_call' ? step.kbId : undefined,\n })),\n originalPlanSteps: originalPlan.steps.length,\n userGoals: intent.goals,\n };\n\n /**\n * Schema for the LLM's plan modification decision.\n * \n * The LLM analyzes the execution state and decides whether and how to modify the plan.\n * This schema structures that decision with:\n * - shouldModify: Whether any changes are needed\n * - reasoning: Explanation of the decision\n * - confidence: How confident the LLM is in the modification (0-1)\n * - modifications: Array of specific changes to make (only if shouldModify is true)\n * \n * Modification types:\n * - add_step: Add a new step (e.g., alternative KB call if one failed)\n * - remove_step: Remove a step that's no longer needed\n * - modify_step: Change an existing step (not fully implemented yet)\n * - reorder_steps: Change the execution order (not fully implemented yet)\n */\n const planModificationSchema = z.object({\n shouldModify: z.boolean(),\n reasoning: z.string(),\n confidence: z.number(),\n modifications: z.array(z.object({\n type: z.enum(['add_step', 'remove_step', 'modify_step', 'reorder_steps']),\n stepId: z.string().optional(), // Required for remove_step, modify_step\n newStep: z.any().optional(), // Required for add_step (should be a PlanStep)\n reason: z.string(),\n })).optional(),\n });\n\n const modifyPrompt = `You are an adaptive planning agent. Review the current execution state and decide if the original plan should be modified.\n\nOriginal Plan: ${originalPlan.reasoning || 'Standard execution plan'}\nUser Goals: ${intent.goals.join(', ')}\n\nExecution State:\nCompleted Steps: ${executionSummary.completedSteps.map(s =>\n `${s.stepId} (${s.kbId || 'synthesis'}): ${s.success ? 'SUCCESS' : 'FAILED'}${s.hasResults ? ' with results' : ''}`\n).join(', ')}\n\nRemaining Steps: ${executionSummary.remainingSteps.map(s =>\n `${s.stepId} (${s.type}${s.kbId ? `:${s.kbId}` : ''})`\n).join(', ')}\n\nAvailable KBs: ${kbCatalog.map(kb => `${kb.id}: ${kb.description}`).join(', ')}\n\nShould the plan be modified? Consider:\n1. If steps failed, are there alternative approaches?\n2. If we have successful results, can we skip redundant steps?\n3. Are there new information sources that would be helpful?\n4. Can we optimize the remaining execution?\n\nReturn JSON with:\n- shouldModify: true/false\n- reasoning: explanation of decision\n- confidence: 0-1 confidence in the modification\n- modifications: array of changes if shouldModify=true\n\nGuidelines:\n- Only modify if there's a clear benefit\n- Prefer adding helpful steps over removing necessary ones\n- Consider information dependencies\n- Be conservative - don't over-modify`;\n\n // Use the LLM provider from framework context\n if (!frameworkContext) {\n throw new Error('modifyPlan() requires frameworkContext with LLM provider');\n }\n \n const result = await frameworkContext.llm.generateObject(\n planModificationSchema,\n modifyPrompt,\n { model: getModel('planning') }\n );\n const object = result.object;\n\n // If the LLM determined no modification is needed, record that decision and return\n if (!object.shouldModify) {\n // Add thinking about why we didn't modify the plan\n // This provides transparency even when we decide not to change anything\n updatedContext.agentThinking.push({\n phase: 'planning',\n timestamp: now,\n reasoning: `Dynamic planning: No modification needed. ${object.reasoning}`,\n details: {\n originalPlanId: originalPlan.planId,\n shouldModify: false,\n confidence: object.confidence,\n reasoning: object.reasoning,\n },\n });\n\n return {\n modifiedPlan: originalPlan,\n shouldModify: false,\n updatedContext\n };\n }\n\n // Create a new plan ID for the modified plan to distinguish it from the original\n const modifiedPlanId = `modified_${originalPlan.planId}_${Date.now()}`;\n // Start with a copy of the original plan's steps\n let modifiedSteps = [...originalPlan.steps];\n\n // Apply the modifications suggested by the LLM\n // Currently supports: remove_step and add_step\n // modify_step and reorder_steps are defined in the schema but not yet implemented\n if (object.modifications) {\n for (const mod of object.modifications) {\n switch (mod.type) {\n case 'remove_step':\n // Remove a step that's no longer needed (e.g., redundant or dependent on failed step)\n if (mod.stepId) {\n modifiedSteps = modifiedSteps.filter(step => step.id !== mod.stepId);\n }\n break;\n case 'add_step':\n // Add a new step (e.g., alternative KB call to replace a failed one)\n if (mod.newStep) {\n modifiedSteps.push(mod.newStep);\n }\n break;\n // Other modification types (modify_step, reorder_steps) can be implemented as needed\n // For now, they're defined in the schema but not processed here\n }\n }\n }\n\n // Construct the modified plan with updated steps and new reasoning\n const modifiedPlan: Plan = {\n planId: modifiedPlanId,\n steps: modifiedSteps,\n reasoning: `Modified plan: ${object.reasoning}`, // Include the LLM's reasoning for the modification\n confidence: object.confidence,\n };\n\n // Record the modification decision in the agent's thinking log\n // This creates a complete audit trail of why and how the plan was changed\n updatedContext.agentThinking.push({\n phase: 'planning',\n timestamp: now,\n reasoning: `Dynamic planning: Modified original plan. ${object.reasoning} Confidence: ${object.confidence.toFixed(2)}`,\n details: {\n originalPlanId: originalPlan.planId,\n modifiedPlanId: modifiedPlan.planId,\n modifications: object.modifications,\n reasoning: object.reasoning,\n confidence: object.confidence,\n },\n });\n\n return {\n modifiedPlan,\n shouldModify: true,\n updatedContext\n };\n}\n\n","/**\n * Snippet Formatter Module\n * \n * Handles formatting and summarizing snippet references for display\n */\n\n/**\n * Strip markdown formatting from a string for cleaner display\n * Removes headers, bold, italic, links, etc.\n * \n * @param text - String that may contain markdown\n * @returns Clean text without markdown formatting\n */\nfunction stripMarkdown(text: string): string {\n if (!text) return '';\n \n return text\n // Remove markdown headers (# Title)\n .replace(/^#+\\s*/gm, '')\n // Remove bold (**text** or __text__)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/__([^_]+)__/g, '$1')\n // Remove italic (*text* or _text_)\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n // Remove links [text](url)\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // Remove code blocks and inline code\n .replace(/`{1,3}[^`]*`{1,3}/g, '')\n // Collapse multiple spaces\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Parse common patterns from snippet content to extract a title\n * Handles patterns like \"# FAQ 106 **Category:** X **Product Type:** Y\"\n * \n * @param content - Raw snippet content\n * @returns Extracted concise title or null\n */\nfunction extractTitleFromContent(content: string): string | null {\n if (!content) return null;\n \n // Match FAQ pattern: \"# FAQ 106\" or \"FAQ 106\" at start\n const faqMatch = content.match(/^#?\\s*(FAQ\\s*\\d+)/i);\n if (faqMatch) {\n // Try to extract model name if present\n const modelMatch = content.match(/\\*\\*Model:\\*\\*\\s*([^\\s*]+(?:\\s+[^\\s*]+)?)/i);\n const typeMatch = content.match(/\\*\\*Product Type:\\*\\*\\s*([^\\s*]+)/i);\n \n if (modelMatch) {\n return `${faqMatch[1]} - ${stripMarkdown(modelMatch[1])}`;\n }\n if (typeMatch) {\n return `${faqMatch[1]} - ${stripMarkdown(typeMatch[1])}`;\n }\n return faqMatch[1];\n }\n \n // Match Warranty pattern: \"# Warranty 28\" or \"Warranty 28\"\n const warrantyMatch = content.match(/^#?\\s*(Warranty\\s*\\d+)/i);\n if (warrantyMatch) {\n // Try to extract model name if present\n const modelMatch = content.match(/\\*\\*Model:\\*\\*\\s*([^\\s*]+(?:\\s+[^\\s*]+)?)/i);\n const typeMatch = content.match(/\\*\\*Product Type:\\*\\*\\s*([^\\s*]+)/i);\n \n if (modelMatch) {\n return `${warrantyMatch[1]} - ${stripMarkdown(modelMatch[1])}`;\n }\n if (typeMatch) {\n return `${warrantyMatch[1]} - ${stripMarkdown(typeMatch[1])}`;\n }\n return warrantyMatch[1];\n }\n \n return null;\n}\n\n/**\n * Formats a snippet reference into a human-readable string\n * Extracts metadata like title, name, category, row_id, and source\n * Produces concise titles suitable for citation display chips\n * \n * @param snippet - Snippet object with reference metadata\n * @returns Formatted string like \"FAQ 106 - DrySwift 600\" or \"Warranty 28 - Toaster\"\n */\nexport function summarizeSnippetReference(snippet: any): string {\n const reference = snippet?.reference;\n const fileMeta = reference?.file?.metadata || {};\n \n // First, try to extract a clean title from content patterns\n const contentTitle = extractTitleFromContent(snippet?.content);\n if (contentTitle) {\n return contentTitle;\n }\n \n // Build a concise summary from metadata\n const parts: string[] = [];\n \n // Prefer FAQ ID or Warranty ID format from metadata\n if (fileMeta.faq_id) {\n parts.push(`FAQ ${fileMeta.faq_id}`);\n } else if (fileMeta.warranty_id) {\n parts.push(`Warranty ${fileMeta.warranty_id}`);\n } else if (fileMeta.row_id) {\n parts.push(`Doc ${fileMeta.row_id}`);\n }\n \n // Add model name for context (concise)\n if (fileMeta.model) {\n parts.push(stripMarkdown(String(fileMeta.model)));\n } else if (fileMeta.type) {\n parts.push(stripMarkdown(String(fileMeta.type)));\n } else if (fileMeta.category) {\n parts.push(stripMarkdown(String(fileMeta.category)));\n }\n \n if (parts.length > 0) {\n return parts.join(' - ');\n }\n \n // Fallback to file name or title\n const name =\n fileMeta.title ||\n fileMeta.name ||\n reference?.file?.name ||\n reference?.id;\n\n if (name) {\n // Strip markdown and truncate if too long\n const cleanName = stripMarkdown(String(name));\n return cleanName.length > 50 ? cleanName.substring(0, 47) + '...' : cleanName;\n }\n\n return 'Source document';\n}\n\n","/**\n * Trace Collector Implementation\n *\n * Implementation of the TraceCollector interface for collecting execution traces.\n * Separates tracing concerns from business logic.\n */\n\nimport { TraceStep, TraceCollector, AgentThinking } from '../types';\nimport { emitTraceStep } from '../logger';\n\n/**\n * Step counter for generating unique step IDs.\n * \n * Tracks counts per step type (e.g., disambiguation, planning, slot_filling, synthesis)\n * and generates incrementing IDs like `disambiguation_1`, `disambiguation_2`, etc.\n * \n * Can be initialized from AgentContext.stepCounts to persist across conversation turns.\n */\nexport class StepCounter {\n private counts: Map<string, number> = new Map();\n\n /**\n * Create a new StepCounter, optionally initializing from existing counts.\n * \n * @param initialCounts - Optional initial counts (e.g., from AgentContext.stepCounts)\n */\n constructor(initialCounts?: Record<string, number>) {\n if (initialCounts) {\n for (const [stepType, count] of Object.entries(initialCounts)) {\n this.counts.set(stepType, count);\n }\n }\n }\n\n /**\n * Create a StepCounter from an AgentContext.\n * Use this to continue counting from where a previous request left off.\n */\n static fromContext(context: { stepCounts?: Record<string, number> }): StepCounter {\n return new StepCounter(context.stepCounts);\n }\n\n /**\n * Get the next step ID for a given step type.\n * Increments the counter and returns the new ID.\n * \n * @param stepType - The type of step (e.g., 'disambiguation', 'planning')\n * @returns A unique step ID like 'disambiguation_1'\n */\n next(stepType: string): string {\n const current = this.counts.get(stepType) ?? 0;\n const next = current + 1;\n this.counts.set(stepType, next);\n return `${stepType}_${next}`;\n }\n\n /**\n * Get the current count for a step type (without incrementing).\n */\n current(stepType: string): number {\n return this.counts.get(stepType) ?? 0;\n }\n\n /**\n * Reset the counter for a specific step type or all step types.\n */\n reset(stepType?: string): void {\n if (stepType) {\n this.counts.delete(stepType);\n } else {\n this.counts.clear();\n }\n }\n\n /**\n * Get all counts as a plain object.\n * Use this to persist the counter state to AgentContext.stepCounts.\n */\n toObject(): Record<string, number> {\n return Object.fromEntries(this.counts);\n }\n\n /**\n * Update an AgentContext with the current step counts.\n * Call this before returning the context to the client.\n */\n syncToContext(context: { stepCounts?: Record<string, number> }): void {\n context.stepCounts = this.toObject();\n }\n}\n\n/**\n * Default trace collector implementation\n *\n * Collects trace steps and agent thinking entries for observability.\n * Emits steps in real-time via SSE for the UI.\n */\nexport class DefaultTraceCollector implements TraceCollector {\n readonly sessionId: string;\n\n private steps: TraceStep[] = [];\n private thinking: AgentThinking[] = [];\n\n constructor(sessionId: string) {\n this.sessionId = sessionId;\n }\n\n /**\n * Add a new trace step\n */\n addStep(step: TraceStep): void {\n this.steps.push(step);\n }\n\n /**\n * Update the most recent trace step\n */\n updateLastStep(updates: Partial<TraceStep>): void {\n if (this.steps.length === 0) {\n return;\n }\n\n const lastStep = this.steps[this.steps.length - 1];\n Object.assign(lastStep, updates);\n\n // If updating details, merge rather than replace\n if (updates.details && lastStep.details) {\n lastStep.details = {\n ...lastStep.details,\n ...updates.details,\n };\n }\n }\n\n /**\n * Record agent thinking/reasoning\n */\n recordThinking(thinking: AgentThinking): void {\n this.thinking.push(thinking);\n }\n\n /**\n * Get all collected trace steps\n */\n getSteps(): TraceStep[] {\n return [...this.steps];\n }\n\n /**\n * Get all recorded thinking entries\n */\n getThinking(): AgentThinking[] {\n return [...this.thinking];\n }\n\n /**\n * Emit a trace step for real-time streaming\n */\n emit(step: TraceStep): void {\n emitTraceStep(this.sessionId, step);\n }\n\n /**\n * Convenience method to add and emit a step at once\n */\n addAndEmit(step: TraceStep): void {\n this.addStep(step);\n this.emit(step);\n }\n}\n\n/**\n * Create a new trace collector instance\n */\nexport function createTraceCollector(sessionId: string): TraceCollector {\n return new DefaultTraceCollector(sessionId);\n}\n\n// ============================================================================\n// Trace Step Builders\n// ============================================================================\n\n/**\n * Helper to create a KB call trace step\n */\nexport function createKBCallTraceStep(\n stepId: string,\n kbId: string,\n kbDescription: string,\n inputs: Record<string, any>,\n previousKBCalls: Array<{ kbId: string; stepId: string; success: boolean }>\n): TraceStep {\n // Create summary of inputs for trace step descriptions\n const inputsSummary = Object.entries(inputs)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '')\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n\n // Build context about previous KB calls\n const previousResults = previousKBCalls.length > 0\n ? `So far, I've queried ${previousKBCalls.filter(p => p.success).length} knowledge base(s). `\n : '';\n\n return {\n stepId,\n stepType: 'kb_call',\n timestamp: new Date().toISOString(),\n description: `Querying ${kbDescription} for information`,\n thought: `${previousResults}Now I'm querying ${kbDescription} to find information about: ${inputsSummary || 'the user\\'s question'}. This knowledge base should help me answer the user's question.`,\n understanding: `Based on my plan, I need to query ${kbId} with the following information: ${inputsSummary || 'general query'}. This KB specializes in ${kbDescription} and should provide the details I need.`,\n details: {\n kbId,\n inputs,\n },\n };\n}\n\n/**\n * Helper to create a synthesis trace step\n */\nexport function createSynthesisTraceStep(\n stepId: string,\n userUtterance: string,\n kbCount: number,\n snippetCount: number,\n sourceSteps: string[]\n): TraceStep {\n return {\n stepId,\n stepType: 'synthesis',\n timestamp: new Date().toISOString(),\n description: 'Synthesizing the final answer',\n thought: `I've completed querying ${kbCount} knowledge base(s) and gathered ${snippetCount} relevant document(s). Now I need to combine all this information into a clear, comprehensive answer that directly addresses the user's question: \"${userUtterance}\".`,\n understanding: `I have information from ${kbCount} knowledge base(s). The user asked: \"${userUtterance}\". I need to synthesize the retrieved information into a helpful, accurate response that answers their question completely.`,\n details: {\n sourceSteps,\n },\n };\n}\n\n/**\n * Helper to create an error synthesis trace step\n */\nexport function createErrorSynthesisTraceStep(\n failedSteps: Array<{ stepId: string; error?: string }>,\n kbCount: number\n): TraceStep {\n return {\n stepId: 'synthesis_error',\n stepType: 'synthesis',\n timestamp: new Date().toISOString(),\n description: 'Unable to retrieve information - connecting user with representative',\n thought: `I attempted to query ${kbCount} knowledge base(s), but all of them failed. I cannot provide an answer without access to the knowledge bases.`,\n understanding: `All ${failedSteps.length} knowledge base query(ies) encountered errors: ${failedSteps.map(r => `${r.stepId} (${r.error})`).join(', ')}. Without access to the knowledge bases, I cannot retrieve the information needed to answer the user's question.`,\n learned: `I was unable to access any knowledge bases to retrieve information. The errors suggest there may be a system issue preventing access to the required data.`,\n conclusion: `Since I cannot access the knowledge bases, I should inform the user that I'll connect them with a support representative who can help them directly.`,\n details: {\n allKBCallsFailed: true,\n failedSteps: failedSteps.map(r => ({ stepId: r.stepId, error: r.error })),\n },\n };\n}\n","/**\n * KB Runner Module\n *\n * Handles execution of KB call steps in the plan.\n */\n\nimport { PlanStepKBCall, StepResult, KBRetrieval, Intent, FrameworkContext } from '../types';\nimport { getKBMeta, getKBMetaFromCatalog } from '../kbCatalog';\nimport { buildKBQueryPrompt } from './queryBuilder';\nimport { summarizeSnippetReference } from './snippetFormatter';\nimport { createKBCallTraceStep } from '../providers/trace';\n\n/**\n * Result from running a single KB call step\n */\nexport interface KBCallResult {\n stepResult: StepResult;\n kbRetrieval?: KBRetrieval;\n success: boolean;\n}\n\n/**\n * Execute a single KB call step\n *\n * @param step - The KB call step to execute\n * @param intent - User intent containing the original utterance and goals\n * @param previousKBCalls - Array of previously executed KB calls for context\n * @param frameworkContext - Framework context with all providers\n * @returns Result object containing stepResult, optional kbRetrieval, and success status\n */\nexport async function executeKBCallStep(\n step: PlanStepKBCall,\n intent: Intent,\n previousKBCalls: Array<{ kbId: string; stepId: string; success: boolean }>,\n frameworkContext: FrameworkContext\n): Promise<KBCallResult> {\n const { logger, trace } = frameworkContext;\n\n logger.info(`Executing KB call step: ${step.id}`, { kbId: step.kbId, inputs: step.inputs });\n logger.debug(`Preparing query for ${step.kbId}`);\n\n // Get KB metadata for query template and assistant name\n // Use dynamic catalog from context if available (SaaS mode), otherwise fall back to static\n const kbMeta = frameworkContext.kbCatalog\n ? getKBMetaFromCatalog(step.kbId, frameworkContext.kbCatalog)\n : getKBMeta(step.kbId);\n\n // Create trace step for observability\n const kbCallStep = createKBCallTraceStep(\n step.id,\n step.kbId,\n kbMeta?.description || step.kbId,\n step.inputs,\n previousKBCalls\n );\n trace.addAndEmit(kbCallStep);\n\n try {\n // Validate KB metadata exists\n if (!kbMeta) {\n const error = `KB metadata not found for ${step.kbId}`;\n trace.updateLastStep({\n learned: `I encountered an error: ${error}. I cannot query this knowledge base.`,\n conclusion: `This query failed. I'll continue with other knowledge bases if available.`,\n details: {\n ...kbCallStep.details,\n error,\n },\n });\n\n logger.error(`KB call failed: ${step.id}`, new Error(error), { kbId: step.kbId });\n\n return {\n stepResult: {\n stepId: step.id,\n kbId: step.kbId,\n error,\n },\n success: false,\n };\n }\n\n // Update trace step with KB name\n trace.updateLastStep({\n details: {\n ...kbCallStep.details,\n kbName: kbMeta.description,\n },\n });\n\n // Ensure we have inputs: if planner omitted them, backfill from intent slots\n const stepInputs = step.inputs && Object.keys(step.inputs).length > 0\n ? step.inputs\n : intent.slots || {};\n\n // Build query prompt from template, slot values, and user utterance\n const queryPrompt = buildKBQueryPrompt(kbMeta, stepInputs, intent);\n\n // Update trace step with the actual query\n trace.updateLastStep({\n details: {\n ...kbCallStep.details,\n kbName: kbMeta.description,\n query: queryPrompt,\n },\n });\n\n // Query Pinecone Assistant for context snippets and generate answer\n logger.debug(`Querying Pinecone assistant: ${kbMeta.assistantName}`);\n logger.info(`Searching knowledge base: ${step.kbId}`, { kbId: step.kbId });\n\n const { snippets: contextSnippets, answer: responseContent } = await frameworkContext.kb.query(\n step.kbId,\n queryPrompt\n );\n\n // Filter out irrelevant snippets when user specified critical identifiers (model, type, etc.)\n // CRITICAL FIX: This prevents citation confabulation by removing documents that don't match constraints\n //\n // PROBLEM: Vector search returns semantically similar documents (e.g., all toasters)\n // SOLUTION: Post-filter based on exact metadata matches for user-specified attributes\n const normalizedSlots = {\n model: String(stepInputs.model || (stepInputs as any).model_name || (stepInputs as any).product_model || '').toLowerCase().trim(),\n productType: String(stepInputs.product_type || '').toLowerCase().trim(),\n applianceType: String((stepInputs as any).appliance_type || '').toLowerCase().trim(),\n category: String(stepInputs.category || '').toLowerCase().trim(),\n };\n\n logger.debug(`Filtering snippets with constraints: ${JSON.stringify(normalizedSlots)}`);\n\n const filteredSnippets = (contextSnippets || []).filter(snippet => {\n const meta = (snippet as any)?.metadata || {};\n const metaModel = String(meta.model || meta.model_name || meta.product_model || '').toLowerCase().trim();\n const metaType = String(meta.type || meta.product_type || '').toLowerCase().trim();\n const metaCategory = String(meta.category || '').toLowerCase().trim();\n\n // CRITICAL: If user specified a model, ONLY keep snippets that either:\n // 1. Have NO model metadata (generic docs), OR\n // 2. Have model metadata that EXACTLY matches\n if (normalizedSlots.model) {\n if (metaModel && metaModel !== normalizedSlots.model) {\n logger.debug(`Filtering out snippet with model=\"${metaModel}\" (expected \"${normalizedSlots.model}\")`);\n return false;\n }\n }\n\n // Product type filtering\n if (normalizedSlots.productType) {\n if (metaType && metaType !== normalizedSlots.productType) {\n logger.debug(`Filtering out snippet with type=\"${metaType}\" (expected \"${normalizedSlots.productType}\")`);\n return false;\n }\n }\n\n // Appliance type filtering (use same logic as product type)\n if (normalizedSlots.applianceType) {\n if (metaType && metaType !== normalizedSlots.applianceType) {\n logger.debug(`Filtering out snippet with type=\"${metaType}\" (expected \"${normalizedSlots.applianceType}\")`);\n return false;\n }\n }\n\n // Category filtering\n if (normalizedSlots.category) {\n if (metaCategory && metaCategory !== normalizedSlots.category) {\n logger.debug(`Filtering out snippet with category=\"${metaCategory}\" (expected \"${normalizedSlots.category}\")`);\n return false;\n }\n }\n\n return true;\n });\n\n logger.info(`KB call completed: ${step.id}`, {\n snippetCount: contextSnippets?.length || 0,\n snippetCountFiltered: filteredSnippets.length,\n responseLength: responseContent?.length || 0,\n });\n logger.debug(`Retrieved ${contextSnippets?.length || 0} context snippets from ${kbMeta.description}`);\n\n const kbCallTimestamp = new Date().toISOString();\n\n // Store KB retrieval in context for later reference\n const kbRetrieval: KBRetrieval = {\n kbId: step.kbId,\n kbName: kbMeta.description,\n stepId: step.id,\n query: queryPrompt,\n inputs: step.inputs,\n retrievedInformation: {\n answer: responseContent,\n contextSnippets: filteredSnippets.length\n ? filteredSnippets.map((snippet, index) => ({\n label: snippet.label || `S${index + 1}`,\n content: snippet?.content || '',\n referenceSummary: summarizeSnippetReference(snippet),\n }))\n : undefined,\n },\n timestamp: kbCallTimestamp,\n };\n\n // Update trace step with what was learned from this KB call\n const snippetCount = filteredSnippets.length;\n trace.updateLastStep({\n learned: snippetCount > 0\n ? `I found ${snippetCount} relevant document(s) in ${kbMeta.description}. The information retrieved covers: ${responseContent.substring(0, 150)}${responseContent.length > 150 ? '...' : ''}`\n : `I queried ${kbMeta.description} but didn't find specific information that directly addresses the user's question.`,\n conclusion: snippetCount > 0\n ? `I've gathered useful information from ${kbMeta.description}. ${previousKBCalls.length > 0 ? 'Combined with previous results, ' : ''}I now have enough data to help answer the user's question.`\n : `This knowledge base didn't have the specific information I need. ${previousKBCalls.length > 0 ? 'I\\'ll rely on information from other sources.' : 'I may need to inform the user I cannot fully help.'}`,\n details: {\n ...kbCallStep.details,\n kbName: kbMeta.description,\n query: queryPrompt,\n response: responseContent,\n contextSnippets: filteredSnippets.length\n ? filteredSnippets.map((snippet, index) => ({\n index,\n preview: snippet?.content?.slice(0, 200),\n referenceSummary: summarizeSnippetReference(snippet),\n }))\n : undefined,\n },\n });\n\n // Store step result for synthesis phase\n return {\n stepResult: {\n stepId: step.id,\n kbId: step.kbId,\n requestPayload: {\n assistantName: kbMeta.assistantName,\n message: queryPrompt,\n },\n responsePayload: { answer: responseContent },\n contextSnippets: filteredSnippets, // Preserve snippets with signedUrl for citations\n inputs: stepInputs,\n },\n kbRetrieval,\n success: true,\n };\n } catch (error) {\n // Handle errors during KB call\n const errorMessage = error instanceof Error ? error.message : String(error);\n trace.updateLastStep({\n learned: `I encountered an error while querying ${kbMeta?.description || step.kbId}: ${errorMessage}`,\n conclusion: `This query failed. ${previousKBCalls.length > 0 ? 'I\\'ll continue with information from other sources.' : 'I may need to inform the user I cannot access the required information.'}`,\n details: {\n ...kbCallStep.details,\n error: errorMessage,\n },\n });\n\n return {\n stepResult: {\n stepId: step.id,\n kbId: step.kbId,\n error: errorMessage,\n },\n success: false,\n };\n }\n}\n","/**\n * Synthesis Module\n *\n * Handles the synthesis of final answers from KB responses.\n */\n\nimport { PlanStepSynthesis, StepResult, Intent, FrameworkContext, KBMeta } from '../types';\nimport { getKBMeta, kbCatalog } from '../kbCatalog';\nimport { getModel, getPrompt, getMessage } from '../runtime/config';\nimport { summarizeSnippetReference } from './snippetFormatter';\nimport { createSynthesisTraceStep, createErrorSynthesisTraceStep } from '../providers/trace';\nimport { generateRedirectMessage } from '../disambiguation/redirectGenerator';\nimport { checkIfOutOfScope } from '../disambiguation/scopeDetector';\n\n/**\n * Result from synthesis step\n */\nexport interface SynthesisResult {\n answer: string;\n stepResult: StepResult;\n}\n\n/**\n * Result from streaming synthesis step\n */\nexport interface StreamingSynthesisResult {\n stream: ReadableStream<Uint8Array>;\n stepResult: StepResult;\n}\n\n// ============================================================================\n// Helper Types\n// ============================================================================\n\n/**\n * Represents a KB response with its metadata\n */\ninterface KBResponseEntry {\n kbId: string | undefined;\n kbName: string;\n response: string;\n}\n\n/**\n * Represents a labeled snippet for citation\n */\ninterface LabeledSnippet {\n label: string;\n kbId: string | undefined;\n snippet: any;\n}\n\n/**\n * Formatted snippet for trace display\n */\ninterface TraceSnippet {\n label: string;\n kbId: string | undefined;\n referenceSummary: string;\n preview: string | undefined;\n content: string | undefined;\n reference: any;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Collect KB responses from step results\n *\n * Extracts response content from each successful KB call step and enriches\n * it with KB metadata (name, description).\n *\n * @param fromSteps - Step IDs to collect responses from\n * @param stepResults - All step results from execution\n * @returns Array of KB responses with metadata\n */\nfunction collectKBResponses(\n fromSteps: string[],\n stepResults: StepResult[]\n): KBResponseEntry[] {\n return fromSteps\n .map(stepId => {\n const result = stepResults.find(r => r.stepId === stepId);\n if (result && result.responsePayload) {\n const kbMeta = getKBMeta(result.kbId || '');\n const responseContent =\n result.responsePayload?.answer ||\n (typeof result.responsePayload === 'string'\n ? result.responsePayload\n : JSON.stringify(result.responsePayload, null, 2));\n\n return {\n kbId: result.kbId,\n kbName: kbMeta?.description || result.kbId || 'Unknown KB',\n response: responseContent,\n };\n }\n return null;\n })\n .filter((kb): kb is KBResponseEntry => kb !== null);\n}\n\n/**\n * Collect and label context snippets from step results\n *\n * Gathers all context snippets from KB call results and assigns sequential\n * labels (S1, S2, etc.) for citation purposes.\n *\n * @param fromSteps - Step IDs to collect snippets from\n * @param stepResults - All step results from execution\n * @returns Array of labeled snippets ready for citation\n */\nfunction collectLabeledSnippets(\n fromSteps: string[],\n stepResults: StepResult[]\n): LabeledSnippet[] {\n const snippetEntries = fromSteps.flatMap(stepId => {\n const result = stepResults.find(r => r.stepId === stepId);\n if (result?.contextSnippets && result.contextSnippets.length > 0) {\n return result.contextSnippets.map(snippet => ({\n kbId: result.kbId,\n snippet,\n }));\n }\n return [];\n });\n\n // Label snippets sequentially for citation\n return snippetEntries.map((entry, index) => ({\n label: `S${index + 1}`,\n ...entry,\n }));\n}\n\n/**\n * Format snippets for trace display\n *\n * Converts labeled snippets into a format suitable for trace step details,\n * including reference summaries and signed URLs.\n *\n * @param labeledSnippets - Labeled snippets to format\n * @returns Array of formatted snippets for tracing\n */\nfunction formatSnippetsForTrace(labeledSnippets: LabeledSnippet[]): TraceSnippet[] {\n return labeledSnippets.map(item => ({\n label: item.label,\n kbId: item.kbId,\n referenceSummary: summarizeSnippetReference(item.snippet),\n preview: item.snippet?.content?.slice(0, 200),\n content: item.snippet?.content,\n reference: {\n ...item.snippet?.reference,\n file: {\n ...item.snippet?.reference?.file,\n signedUrl: item.snippet?.reference?.file?.signedUrl || item.snippet?.reference?.file?.signed_url,\n },\n },\n }));\n}\n\n/**\n * Check if KB responses indicate no relevant information\n *\n * Analyzes KB response content for common phrases indicating\n * that no useful information was found.\n *\n * @param kbResponses - KB responses to analyze\n * @returns true if responses indicate no relevant info found\n */\nfunction responsesIndicateNoInfo(kbResponses: KBResponseEntry[]): boolean {\n return kbResponses.some(kb => {\n if (!kb?.response) return true;\n const responseLower = kb.response.toLowerCase();\n return (\n responseLower.includes('no context snippets available') ||\n responseLower.includes(\"i don't have information\") ||\n responseLower.includes('i cannot find') ||\n responseLower.includes('unable to find') ||\n responseLower.includes('no information available') ||\n responseLower.includes(\"i don't have specific information\") ||\n (responseLower.length < 50 && responseLower.includes('no'))\n );\n });\n}\n\n/**\n * Check if LLM response indicates it cannot help\n *\n * Analyzes the synthesized answer for phrases indicating\n * the LLM determined it cannot provide a useful response.\n *\n * @param answer - The synthesized answer to check\n * @returns true if LLM indicates it cannot help\n */\nfunction llmIndicatesNoInfo(answer: string): boolean {\n const answerLower = answer.toLowerCase();\n return (\n answerLower.includes(\"i don't have\") ||\n answerLower.includes('i cannot') ||\n answerLower.includes('unable to') ||\n answerLower.includes('no information') ||\n answerLower.includes(\"i'm unable to help\")\n );\n}\n\n/**\n * Build the synthesis prompt from KB responses and snippets\n *\n * Constructs the prompt sent to the LLM to synthesize a final answer,\n * including all KB responses and context snippets for grounding.\n *\n * @param intent - User intent with original question\n * @param kbResponses - Collected KB responses\n * @param labeledSnippets - Labeled snippets for citation\n * @returns The synthesis prompt string\n */\nfunction buildSynthesisPrompt(\n intent: Intent,\n kbResponses: KBResponseEntry[],\n labeledSnippets: LabeledSnippet[]\n): string {\n const snippetText = labeledSnippets.length\n ? labeledSnippets\n .map(\n item =>\n `[${item.label}] (KB: ${item.kbId || 'unknown'})\\nSource: ${summarizeSnippetReference(item.snippet)}\\nSnippet:\\n${item.snippet?.content}`\n )\n .join('\\n---\\n')\n : 'No context snippets available.';\n\n const synthesisRole = getPrompt('synthesisSystemRole');\n \n // Include current date for time-sensitive calculations (e.g., warranty expiration)\n const currentDate = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format\n \n // Include collected information so the LLM knows what the user already provided\n const collectedInfo = intent.slots && Object.keys(intent.slots).length > 0\n ? `\\nInformation already provided by the user:\\n${Object.entries(intent.slots)\n .filter(([_, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `- ${key}: ${value}`)\n .join('\\n')}\\n`\n : '';\n\n return `You are ${synthesisRole}. Synthesize a clear, user-friendly answer based on the following information.\n\nCurrent date: ${currentDate}\n\nOriginal user question: \"${intent.userUtterance}\"${collectedInfo}\n\nKnowledge base responses:\n${kbResponses\n .map(\n kb => `\n${kb?.kbName}:\n${kb?.response}\n`\n )\n .join('\\n---\\n')}\n\nContext snippets (use these for grounded citations):\n${snippetText}\n\nIMPORTANT: Only provide an answer if the information above directly addresses the user's question. If the information is not relevant, incomplete, or doesn't answer the question, you must respond that you cannot help and that the user will be connected with a representative.\n\nCRITICAL: Do NOT ask the user for information they have already provided. If the knowledge base responses ask for information that is listed above under \"Information already provided by the user\", ignore those requests and proceed with answering based on what is available.\n\nCRITICAL - TIME-BASED CALCULATIONS: When dealing with warranties, subscriptions, trials, or any time-limited coverage:\n- You MUST calculate whether the period has expired based on the current date (${currentDate}) and the purchase/start date provided by the user.\n- Example: If a warranty is 12 months and the purchase date is May 15, 2022, the warranty expired on May 15, 2023. Since today is ${currentDate}, the warranty has EXPIRED.\n- NEVER assume something is \"still covered\" without actually calculating the expiration date.\n- If the calculated expiration date is BEFORE the current date, clearly inform the user that the coverage has expired.\n\nProvide a comprehensive answer that:\n1. Addresses the user's question directly\n2. Includes any relevant procedural steps if provided\n3. Includes any relevant policy or coverage information if provided\n4. Is clear, concise, and actionable\n5. Uses natural, friendly language\n6. CRITICAL - INLINE CITATIONS: You MUST include citations like [S1], [S2] INLINE directly after each statement that uses information from a snippet. Do NOT group citations at the end of your response.\n CORRECT: \"Check your warranty period [S1] and contact customer service [S2] for assistance.\"\n WRONG: \"Check your warranty period and contact customer service. [S1] [S2]\"\n7. For any mathematical expressions or formulas, use LaTeX formatting:\n - Use $...$ for inline math (e.g., $E = mc^2$)\n - Use $$...$$ on separate lines for block equations (e.g., $$\\\\frac{a}{b}$$)\n\nDo not include any meta-commentary about the knowledge bases or the process. Just provide the answer as if you are a knowledgeable assistant.\nDo NOT add follow-up questions at the end of your response. If you need more information, that should have already been handled before this synthesis step.`;\n}\n\n/**\n * Process and format the synthesized answer\n *\n * Adds citation markers if missing and removes any extraneous\n * \"Sources:\" sections the LLM might have added.\n *\n * @param answer - Raw synthesized answer from LLM\n * @param snippetLabels - Available snippet labels for citation\n * @returns Processed answer with proper citations\n */\nfunction processSynthesizedAnswer(answer: string, snippetLabels: string[]): string {\n let processedAnswer = answer;\n\n // Check if answer includes inline citations\n const hasInlineCitations = snippetLabels.some(label =>\n processedAnswer.includes(`[${label}]`)\n );\n\n // Append citations if LLM didn't include them inline\n if (!hasInlineCitations && snippetLabels.length > 0) {\n processedAnswer = `${processedAnswer}\\n\\n${snippetLabels.map(label => `[${label}]`).join(' ')}`;\n }\n\n // Remove any \"Sources:\" section that might have been added by the LLM\n processedAnswer = processedAnswer.replace(/\\n\\nSources:[\\s\\S]*$/i, '').trim();\n\n return processedAnswer;\n}\n\n// ============================================================================\n// Main Synthesis Functions\n// ============================================================================\n\n/**\n * Synthesize a final answer from KB responses\n *\n * This is the main synthesis function that orchestrates the answer generation process.\n * It uses helper functions to:\n * 1. Collect and organize KB responses\n * 2. Gather and label context snippets for citation\n * 3. Check for missing/insufficient information\n * 4. Generate the final synthesized answer\n * 5. Process citations and format the response\n */\nexport async function synthesizeAnswer(\n synthesisStep: PlanStepSynthesis,\n intent: Intent,\n stepResults: StepResult[],\n frameworkContext: FrameworkContext\n): Promise<SynthesisResult> {\n const { logger, trace, llm } = frameworkContext;\n\n logger.info(`Executing synthesis step: ${synthesisStep.id}`, { fromSteps: synthesisStep.fromSteps });\n\n // Calculate metrics for trace\n const successfulResults = stepResults.filter(r => r.kbId && !r.error && r.responsePayload);\n const totalSnippets = stepResults.reduce((sum, r) => sum + (r.contextSnippets?.length || 0), 0);\n\n // Create and emit trace step\n const synthesisTraceStep = createSynthesisTraceStep(\n synthesisStep.id,\n intent.userUtterance,\n successfulResults.length,\n totalSnippets,\n synthesisStep.fromSteps\n );\n trace.addAndEmit(synthesisTraceStep);\n\n try {\n // Step 1: Collect KB responses using helper\n const kbResponses = collectKBResponses(synthesisStep.fromSteps, stepResults);\n logger.debug('Collected KB responses', { count: kbResponses.length });\n\n // Step 2: Collect and label snippets using helper\n const labeledSnippets = collectLabeledSnippets(synthesisStep.fromSteps, stepResults);\n logger.debug('Labeled snippets', { count: labeledSnippets.length });\n\n // Step 3: Format snippets for trace display using helper\n const contextSnippetsForTrace = formatSnippetsForTrace(labeledSnippets);\n\n // Update trace with collected data\n trace.updateLastStep({\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb.kbId,\n kbName: kb.kbName,\n responsePreview: kb.response.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n },\n });\n\n // Step 4: Check if we have relevant information\n const hasNoSnippets = labeledSnippets.length === 0;\n const hasNoResponses = kbResponses.length === 0;\n const noRelevantInfo = responsesIndicateNoInfo(kbResponses);\n\n // Handle case when no relevant information was found\n if (hasNoSnippets || hasNoResponses || noRelevantInfo) {\n logger.warn('No relevant information found', {\n snippets: labeledSnippets.length,\n responses: kbResponses.length,\n indicatesNoInfo: noRelevantInfo,\n });\n\n // Late scope detection\n const isOutOfScope = await checkIfOutOfScope(intent, kbCatalog, frameworkContext);\n\n let answer: string;\n if (isOutOfScope) {\n // Generate redirect message for out-of-scope queries\n answer = await generateRedirectMessage(\n intent.userUtterance,\n intent.goals,\n kbCatalog,\n frameworkContext\n );\n\n trace.updateLastStep({\n learned: `After querying ${kbResponses.length} knowledge base(s), I determined that the user's query \"${intent.userUtterance}\" is outside my scope of capabilities.`,\n conclusion: `I've generated a redirect message to guide the user toward what I can help with.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb.kbId,\n kbName: kb.kbName,\n responsePreview: kb.response.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n noRelevantInformation: true,\n isOutOfScope: true,\n reason: 'Query is outside agent scope',\n },\n });\n } else {\n // In-scope but missing info\n answer = getMessage('noRelevantInfo');\n\n trace.updateLastStep({\n learned: `After querying ${kbResponses.length} knowledge base(s), I found ${labeledSnippets.length} relevant document(s). Unfortunately, the information retrieved doesn't directly address the user's specific question.`,\n conclusion: `I don't have sufficient information in my knowledge base to provide a complete answer.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb.kbId,\n kbName: kb.kbName,\n responsePreview: kb.response.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n noRelevantInformation: true,\n isOutOfScope: false,\n reason: hasNoSnippets ? 'No context snippets retrieved' : hasNoResponses ? 'No KB responses received' : 'KB responses indicate no relevant information found',\n },\n });\n }\n\n return {\n answer,\n stepResult: {\n stepId: synthesisStep.id,\n requestPayload: { originalQuestion: intent.userUtterance, kbResponses, isOutOfScope },\n responsePayload: { answer },\n },\n };\n }\n\n // Step 5: Normal synthesis path - build prompt and generate answer\n const synthesisPrompt = buildSynthesisPrompt(intent, kbResponses, labeledSnippets);\n\n logger.info('Generating final answer with LLM', {\n snippetCount: labeledSnippets.length,\n kbResponseCount: kbResponses.length,\n });\n\n const result = await llm.generateText(synthesisPrompt, {\n model: getModel('synthesis'),\n });\n\n let synthesizedAnswer = result.text;\n\n // Step 6: Check if LLM determined it can't help\n if (llmIndicatesNoInfo(synthesizedAnswer)) {\n const answer = getMessage('noRelevantInfo');\n\n trace.updateLastStep({\n learned: `After analyzing the retrieved information, I determined that it doesn't sufficiently address the user's question.`,\n conclusion: `I should inform the user that I cannot provide a complete answer.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb.kbId,\n kbName: kb.kbName,\n responsePreview: kb.response.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n noRelevantInformation: true,\n reason: 'LLM determined information is not relevant or sufficient',\n },\n });\n\n return {\n answer,\n stepResult: {\n stepId: synthesisStep.id,\n requestPayload: { originalQuestion: intent.userUtterance, kbResponses },\n responsePayload: { answer },\n },\n };\n }\n\n // Step 7: Process the synthesized answer (citations, cleanup)\n const snippetLabels = labeledSnippets.map(item => item.label);\n synthesizedAnswer = processSynthesizedAnswer(synthesizedAnswer, snippetLabels);\n\n // Update trace with success\n trace.updateLastStep({\n learned: `I successfully synthesized information from ${kbResponses.length} knowledge base(s) and ${labeledSnippets.length} document(s) into a comprehensive answer.`,\n conclusion: `I've created a complete answer that combines all the relevant information I found.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb.kbId,\n kbName: kb.kbName,\n responsePreview: kb.response.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n synthesizedAnswer,\n },\n });\n\n return {\n answer: synthesizedAnswer,\n stepResult: {\n stepId: synthesisStep.id,\n requestPayload: { originalQuestion: intent.userUtterance, kbResponses },\n responsePayload: { answer: synthesizedAnswer },\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Synthesis step failed: ${synthesisStep.id}`, error instanceof Error ? error : new Error(errorMessage));\n\n const answer = getMessage('synthesisError');\n\n trace.updateLastStep({\n details: { ...synthesisTraceStep.details, error: errorMessage },\n });\n\n return {\n answer,\n stepResult: { stepId: synthesisStep.id, error: errorMessage },\n };\n }\n}\n\n/**\n * Synthesize a final answer from KB responses with streaming support\n * \n * This version uses streamText for progressive text generation.\n */\nexport async function synthesizeAnswerStreaming(\n synthesisStep: PlanStepSynthesis,\n intent: Intent,\n stepResults: StepResult[],\n frameworkContext: FrameworkContext\n): Promise<StreamingSynthesisResult> {\n const { logger, trace, llm } = frameworkContext;\n\n logger.info(`Executing streaming synthesis step: ${synthesisStep.id}`, { fromSteps: synthesisStep.fromSteps });\n logger.debug(`Collecting responses from ${synthesisStep.fromSteps.length} KB call(s)`);\n\n // Filter to only successful KB call results\n const successfulResults = stepResults.filter(r => r.kbId && !r.error && r.responsePayload);\n const totalSnippets = stepResults.reduce((sum, r) => sum + (r.contextSnippets?.length || 0), 0);\n\n // Create trace step for synthesis phase\n const synthesisTraceStep = createSynthesisTraceStep(\n synthesisStep.id,\n intent.userUtterance,\n successfulResults.length,\n totalSnippets,\n synthesisStep.fromSteps\n );\n trace.addAndEmit(synthesisTraceStep);\n\n try {\n logger.info('Starting streaming answer synthesis', {\n kbResponseCount: synthesisStep.fromSteps.length,\n });\n\n // Collect KB responses from successful steps (same logic as non-streaming)\n const kbResponses = synthesisStep.fromSteps\n .map(stepId => {\n const result = stepResults.find(r => r.stepId === stepId);\n if (result && result.responsePayload) {\n const kbMeta = getKBMeta(result.kbId || '');\n const responseContent =\n result.responsePayload?.answer ||\n (typeof result.responsePayload === 'string'\n ? result.responsePayload\n : JSON.stringify(result.responsePayload, null, 2));\n\n return {\n kbId: result.kbId,\n kbName: kbMeta?.description || result.kbId,\n response: responseContent,\n };\n }\n return null;\n })\n .filter(Boolean);\n\n // Collect all context snippets from successful KB calls\n const snippetEntries = synthesisStep.fromSteps.flatMap(stepId => {\n const result = stepResults.find(r => r.stepId === stepId);\n if (result?.contextSnippets && result.contextSnippets.length > 0) {\n return result.contextSnippets.map(snippet => ({\n kbId: result.kbId,\n snippet,\n }));\n }\n return [];\n });\n\n // Label snippets sequentially for citation\n const labeledSnippets = snippetEntries.map((entry, index) => ({\n label: `S${index + 1}`,\n ...entry,\n }));\n\n // Format snippets for trace display\n const contextSnippetsForTrace = labeledSnippets.map(item => ({\n label: item.label,\n kbId: item.kbId,\n referenceSummary: summarizeSnippetReference(item.snippet),\n preview: item.snippet?.content?.slice(0, 200),\n content: item.snippet?.content,\n reference: {\n ...item.snippet?.reference,\n file: {\n ...item.snippet?.reference?.file,\n signedUrl: item.snippet?.reference?.file?.signedUrl || item.snippet?.reference?.file?.signed_url,\n },\n },\n }));\n\n // Check if we have relevant information to synthesize\n const hasNoSnippets = labeledSnippets.length === 0;\n const hasNoResponses = kbResponses.length === 0;\n\n const responsesIndicateNoInfo = kbResponses.some(kb => {\n if (!kb?.response) return true;\n const responseLower = kb.response.toLowerCase();\n return (\n responseLower.includes('no context snippets available') ||\n responseLower.includes(\"i don't have information\") ||\n responseLower.includes('i cannot find') ||\n responseLower.includes('unable to find') ||\n responseLower.includes('no information available') ||\n responseLower.includes(\"i don't have specific information\") ||\n (responseLower.length < 50 && responseLower.includes('no'))\n );\n });\n\n // If no relevant information, return a non-streaming fallback message\n if (hasNoSnippets || hasNoResponses || responsesIndicateNoInfo) {\n logger.warn(`No relevant information found for streaming`, {\n snippets: labeledSnippets.length,\n responses: kbResponses.length,\n indicatesNoInfo: responsesIndicateNoInfo,\n });\n\n // Check if query is out of scope (same logic as non-streaming)\n const isOutOfScope = await checkIfOutOfScope(intent, kbCatalog, frameworkContext);\n \n let answer: string;\n if (isOutOfScope) {\n answer = await generateRedirectMessage(\n intent.userUtterance,\n intent.goals,\n kbCatalog,\n frameworkContext\n );\n \n trace.updateLastStep({\n learned: `After querying ${kbResponses.length} knowledge base(s), I determined that the user's query \"${intent.userUtterance}\" is outside my scope of capabilities.`,\n conclusion: `I've generated a redirect message to guide the user toward what I can help with.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb?.kbId,\n kbName: kb?.kbName,\n responsePreview: kb?.response?.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n noRelevantInformation: true,\n isOutOfScope: true,\n reason: 'Query is outside agent scope',\n },\n });\n } else {\n answer = getMessage('noRelevantInfo');\n trace.updateLastStep({\n learned: `After querying ${kbResponses.length} knowledge base(s), I found ${labeledSnippets.length} relevant document(s). Unfortunately, the information retrieved doesn't directly address the user's specific question.`,\n conclusion: `I don't have sufficient information in my knowledge base to provide a complete answer.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb?.kbId,\n kbName: kb?.kbName,\n responsePreview: kb?.response?.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n noRelevantInformation: true,\n isOutOfScope: false,\n },\n });\n }\n\n // For fallback cases, return a simple stream with the message\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(encoder.encode(answer));\n controller.close();\n },\n });\n\n return {\n stream,\n stepResult: {\n stepId: synthesisStep.id,\n requestPayload: {\n originalQuestion: intent.userUtterance,\n kbResponses,\n isOutOfScope,\n },\n responsePayload: { answer },\n },\n };\n }\n\n // Normal streaming synthesis path - we have relevant information\n const snippetText = labeledSnippets.length\n ? labeledSnippets\n .map(\n item =>\n `[${item.label}] (KB: ${item.kbId || 'unknown'})\\nSource: ${summarizeSnippetReference(item.snippet)}\\nSnippet:\\n${item.snippet?.content}`\n )\n .join('\\n---\\n')\n : 'No context snippets available.';\n\n logger.info('Generating streaming final answer with LLM', {\n snippetCount: labeledSnippets.length,\n kbResponseCount: kbResponses.length,\n });\n\n // Include current date for time-sensitive calculations (e.g., warranty expiration)\n const currentDate = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format\n \n // Include collected information so the LLM knows what the user already provided\n const collectedInfo = intent.slots && Object.keys(intent.slots).length > 0\n ? `\\nInformation already provided by the user:\\n${Object.entries(intent.slots)\n .filter(([_, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `- ${key}: ${value}`)\n .join('\\n')}\\n`\n : '';\n\n // Get synthesis role from config and generate final answer with streaming\n const synthesisRole = getPrompt('synthesisSystemRole');\n const synthesisPrompt = `You are ${synthesisRole}. Synthesize a clear, user-friendly answer based on the following information.\n\nCurrent date: ${currentDate}\n\nOriginal user question: \"${intent.userUtterance}\"${collectedInfo}\n\nKnowledge base responses:\n${kbResponses\n .map(\n kb => `\n${kb?.kbName}:\n${kb?.response}\n`\n )\n .join('\\n---\\n')}\n\nContext snippets (use these for grounded citations):\n${snippetText}\n\nIMPORTANT: Only provide an answer if the information above directly addresses the user's question. If the information is not relevant, incomplete, or doesn't answer the question, you must respond that you cannot help and that the user will be connected with a representative.\n\nCRITICAL: Do NOT ask the user for information they have already provided. If the knowledge base responses ask for information that is listed above under \"Information already provided by the user\", ignore those requests and proceed with answering based on what is available.\n\nCRITICAL - TIME-BASED CALCULATIONS: When dealing with warranties, subscriptions, trials, or any time-limited coverage:\n- You MUST calculate whether the period has expired based on the current date (${currentDate}) and the purchase/start date provided by the user.\n- Example: If a warranty is 12 months and the purchase date is May 15, 2022, the warranty expired on May 15, 2023. Since today is ${currentDate}, the warranty has EXPIRED.\n- NEVER assume something is \"still covered\" without actually calculating the expiration date.\n- If the calculated expiration date is BEFORE the current date, clearly inform the user that the coverage has expired.\n\nProvide a comprehensive answer that:\n1. Addresses the user's question directly\n2. Includes any relevant procedural steps if provided\n3. Includes any relevant policy or coverage information if provided\n4. Is clear, concise, and actionable\n5. Uses natural, friendly language\n6. CRITICAL - INLINE CITATIONS: You MUST include citations like [S1], [S2] INLINE directly after each statement that uses information from a snippet. Do NOT group citations at the end of your response.\n CORRECT: \"Check your warranty period [S1] and contact customer service [S2] for assistance.\"\n WRONG: \"Check your warranty period and contact customer service. [S1] [S2]\"\n7. For any mathematical expressions or formulas, use LaTeX formatting:\n - Use $...$ for inline math (e.g., $E = mc^2$)\n - Use $$...$$ on separate lines for block equations (e.g., $$\\\\frac{a}{b}$$)\n\nDo not include any meta-commentary about the knowledge bases or the process. Just provide the answer as if you are a knowledgeable assistant.\nDo NOT add follow-up questions at the end of your response. If you need more information, that should have already been handled before this synthesis step.`;\n\n const model = getModel('synthesis');\n\n // Use LLM provider's streamText for streaming generation\n const result = await llm.streamText(synthesisPrompt, { model });\n\n // Update trace step with KB responses and snippets\n trace.updateLastStep({\n learned: `I'm synthesizing information from ${kbResponses.length} knowledge base(s) and ${snippetEntries.length} document(s) into a comprehensive answer.`,\n conclusion: `I'm generating a complete answer that combines all the relevant information I found.`,\n details: {\n ...synthesisTraceStep.details,\n kbResponses: kbResponses.map(kb => ({\n kbId: kb?.kbId,\n kbName: kb?.kbName,\n responsePreview: kb?.response?.substring(0, 200) + '...',\n })),\n contextSnippets: contextSnippetsForTrace,\n },\n });\n\n // Get the stream from the result\n const stream = result.stream;\n\n return {\n stream,\n stepResult: {\n stepId: synthesisStep.id,\n requestPayload: {\n originalQuestion: intent.userUtterance,\n kbResponses,\n },\n responsePayload: { answer: '[streaming]' }, // Placeholder, actual answer is in stream\n },\n };\n } catch (error) {\n // Handle errors during synthesis\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\n `Streaming synthesis step failed: ${synthesisStep.id}`,\n error instanceof Error ? error : new Error(errorMessage)\n );\n\n const answer = getMessage('synthesisError');\n\n trace.updateLastStep({\n details: {\n ...synthesisTraceStep.details,\n error: errorMessage,\n },\n });\n\n // Return error message as stream\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(encoder.encode(answer));\n controller.close();\n },\n });\n\n return {\n stream,\n stepResult: {\n stepId: synthesisStep.id,\n error: errorMessage,\n },\n };\n }\n}\n\n/**\n * Handle the case when all KB calls failed\n */\nexport function handleAllKBsFailed(\n stepResults: StepResult[],\n kbCount: number,\n frameworkContext: FrameworkContext\n): SynthesisResult {\n const { trace } = frameworkContext;\n\n const failedSteps = stepResults.filter(r => r.error);\n const answer = getMessage('allKBsFailed');\n\n // Create and emit error trace step\n const errorTraceStep = createErrorSynthesisTraceStep(\n failedSteps.map(r => ({ stepId: r.stepId, error: r.error })),\n kbCount\n );\n trace.addAndEmit(errorTraceStep);\n\n return {\n answer,\n stepResult: {\n stepId: 'synthesis_error',\n requestPayload: {\n allKBCallsFailed: true,\n },\n responsePayload: { answer },\n },\n };\n}\n","/**\n * Core Executor Module\n *\n * Main entry point for plan execution using the framework context.\n * This is the refactored version that uses dependency injection.\n */\n\nimport { Plan, Intent, StepResult, ExecutionTrace, AgentContext, FrameworkContext } from '../types';\nimport { executeKBCallStep } from './kbRunner';\nimport { synthesizeAnswer, handleAllKBsFailed } from './synthesis';\n\n/**\n * Execute a plan using the framework context\n *\n * This is the main entry point for plan execution with dependency injection.\n *\n * @param intent - User intent containing the original utterance and goals\n * @param plan - The execution plan with steps to run\n * @param context - Optional agent context with prior conversation state\n * @param frameworkContext - Framework context with all providers\n * @returns Object containing the generated answer and execution trace\n */\nexport async function executePlanWithContext(\n intent: Intent,\n plan: Plan,\n context: AgentContext | undefined,\n frameworkContext: FrameworkContext\n): Promise<{ answer: string; trace: ExecutionTrace }> {\n const { logger, trace } = frameworkContext;\n\n // Initialize execution state\n const stepResults: StepResult[] = [];\n const now = new Date().toISOString();\n\n // Initialize or extend agent context\n const updatedContext: AgentContext = context\n ? { ...context }\n : {\n userObjective: intent.userUtterance,\n missingInformation: {\n slots: [],\n unobtainableSlots: [],\n descriptions: {},\n questionHistory: [],\n },\n collectedInformation: {\n slots: intent.slots,\n collectionHistory: [],\n },\n kbRetrievals: [],\n agentThinking: [],\n };\n\n logger.info('Executing plan', { stepCount: plan.steps.length });\n\n // ============================================================================\n // Phase 1: Execute KB Call Steps\n // ============================================================================\n\n const previousKBCalls: Array<{ kbId: string; stepId: string; success: boolean }> = [];\n\n logger.info(`Starting execution of ${plan.steps.length} plan steps`);\n\n // Execute each KB call step sequentially\n for (const step of plan.steps) {\n if (step.type === 'kb_call') {\n const result = await executeKBCallStep(\n step,\n intent,\n previousKBCalls,\n frameworkContext\n );\n\n stepResults.push(result.stepResult);\n\n // Store KB retrieval in context\n if (result.kbRetrieval) {\n updatedContext.kbRetrievals.push(result.kbRetrieval);\n\n // Record agent's reasoning about this KB retrieval\n const kbRetrieval = result.kbRetrieval;\n updatedContext.agentThinking.push({\n phase: 'execution',\n timestamp: kbRetrieval.timestamp,\n reasoning:\n `Retrieved information from ${kbRetrieval.kbName} (${kbRetrieval.kbId}). ` +\n `Query: \"${kbRetrieval.query.substring(0, 100)}${kbRetrieval.query.length > 100 ? '...' : ''}\". ` +\n `Retrieved ${kbRetrieval.retrievedInformation.contextSnippets?.length || 0} context snippet(s).`,\n details: {\n stepId: step.id,\n kbId: step.kbId,\n kbName: kbRetrieval.kbName,\n snippetCount: kbRetrieval.retrievedInformation.contextSnippets?.length || 0,\n },\n });\n }\n\n previousKBCalls.push({\n kbId: step.kbId,\n stepId: step.id,\n success: result.success,\n });\n }\n }\n\n // ============================================================================\n // Phase 2: Execute Synthesis Step\n // ============================================================================\n\n let answer = '';\n const synthesisStep = plan.steps.find(s => s.type === 'llm_synthesis');\n\n // Check if all KB calls failed\n const successfulKBCalls = stepResults.filter(r => r.kbId && !r.error);\n const kbCallCount = plan.steps.filter(s => s.type === 'kb_call').length;\n const allKBCallsFailed = kbCallCount > 0 && successfulKBCalls.length === 0;\n\n if (allKBCallsFailed) {\n // All KB calls failed - use fallback message\n const result = handleAllKBsFailed(stepResults, kbCallCount, frameworkContext);\n answer = result.answer;\n stepResults.push(result.stepResult);\n\n // Record agent's reasoning about the failure\n updatedContext.agentThinking.push({\n phase: 'execution',\n timestamp: new Date().toISOString(),\n reasoning: `All KB calls failed. Informing user they will be connected with a representative.`,\n details: {\n failedSteps: stepResults.filter(r => r.error).length,\n totalSteps: kbCallCount,\n },\n });\n } else if (synthesisStep && synthesisStep.type === 'llm_synthesis') {\n // Normal synthesis path\n const result = await synthesizeAnswer(\n synthesisStep,\n intent,\n stepResults,\n frameworkContext\n );\n answer = result.answer;\n stepResults.push(result.stepResult);\n\n // Record agent's reasoning about the synthesis\n updatedContext.agentThinking.push({\n phase: 'synthesis',\n timestamp: new Date().toISOString(),\n reasoning:\n `Synthesized final answer from ${successfulKBCalls.length} KB response(s). ` +\n `Generated comprehensive answer addressing: ${intent.userUtterance.substring(0, 100)}${intent.userUtterance.length > 100 ? '...' : ''}.`,\n details: {\n stepId: synthesisStep.id,\n sourceKBs: successfulKBCalls.map(r => r.kbId).filter(Boolean),\n answerLength: answer.length,\n },\n });\n }\n\n // ============================================================================\n // Finalize Execution Trace\n // ============================================================================\n\n logger.info('Plan execution completed', {\n stepResultsCount: stepResults.length,\n answerLength: answer?.length || 0,\n });\n\n // Build final execution trace\n const executionTrace: ExecutionTrace = {\n sessionId: trace.sessionId,\n intent,\n plan,\n stepResults,\n traceSteps: trace.getSteps(),\n context: updatedContext,\n };\n\n return { answer, trace: executionTrace };\n}\n","/**\n * OpenAI LLM Provider\n *\n * Implementation of the LLMProvider interface using OpenAI's API via the Vercel AI SDK.\n */\n\nimport { generateText, generateObject, streamText } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport {\n LLMProvider,\n LLMOptions,\n LLMTextResult,\n LLMObjectResult,\n LLMStreamResult,\n} from '../types/providers';\n\n/**\n * Retry a function with exponential backoff\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n baseDelayMs: number = 1000\n): Promise<T> {\n let lastError: Error | undefined;\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n console.warn(`[OpenAI] Attempt ${attempt + 1}/${maxRetries} failed: ${lastError.message}`);\n if (attempt < maxRetries - 1) {\n const delay = baseDelayMs * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n throw lastError;\n}\n\n/**\n * Get OpenAI client with API key from environment\n * Returns a function that can be called with a model ID to get a configured model\n * Note: openai() automatically reads OPENAI_API_KEY from process.env\n */\nfunction getOpenAIClient() {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OPENAI_API_KEY is not set in environment variables');\n }\n // openai() automatically reads from process.env.OPENAI_API_KEY\n return (modelId: string) => openai(modelId);\n}\n\n/**\n * OpenAI LLM Provider implementation\n */\nexport class OpenAILLMProvider implements LLMProvider {\n readonly name = 'openai';\n\n /**\n * Generate text from a prompt using OpenAI\n */\n async generateText(prompt: string, options: LLMOptions): Promise<LLMTextResult> {\n const client = getOpenAIClient();\n const result = await generateText({\n model: client(options.model),\n prompt,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n\n return {\n text: result.text,\n usage: result.usage ? {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens: result.usage.totalTokens,\n } : undefined,\n };\n }\n\n /**\n * Generate a structured object from a prompt using OpenAI\n * Uses retry logic to handle intermittent schema matching failures\n * Uses 'json' mode for more reliable structured output with complex schemas\n */\n async generateObject<T>(\n schema: z.ZodSchema<T>,\n prompt: string,\n options: LLMOptions\n ): Promise<LLMObjectResult<T>> {\n const client = getOpenAIClient();\n \n return withRetry(async () => {\n const result = await generateObject({\n model: client(options.model),\n schema,\n prompt,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n // Use 'json' mode instead of 'auto' (function calling) for more reliable\n // structured output with complex/nested schemas\n mode: 'json',\n });\n\n return {\n object: result.object,\n usage: result.usage ? {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens: result.usage.totalTokens,\n } : undefined,\n };\n }, 3, 1000);\n }\n\n /**\n * Stream text generation from a prompt using OpenAI\n */\n async streamText(prompt: string, options: LLMOptions): Promise<LLMStreamResult> {\n const client = getOpenAIClient();\n const result = streamText({\n model: client(options.model),\n prompt,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n\n // Get the data stream response as a ReadableStream\n const response = result.toDataStreamResponse({\n getErrorMessage: (error) => error instanceof Error ? error.message : String(error),\n sendUsage: false,\n });\n const stream = response.body as ReadableStream<Uint8Array>;\n\n // Create promises for text and usage that resolve when streaming completes\n const textPromise = result.text;\n const usagePromise = result.usage.then(usage => ({\n promptTokens: usage.promptTokens,\n completionTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n }));\n\n return {\n stream,\n textPromise,\n usagePromise,\n };\n }\n}\n\n/**\n * Create a new OpenAI LLM provider instance\n */\nexport function createOpenAIProvider(): LLMProvider {\n return new OpenAILLMProvider();\n}\n","/**\n * Pinecone KB Provider\n *\n * Implementation of the KBProvider interface using Pinecone Assistants API.\n */\n\nimport { Pinecone } from '@pinecone-database/pinecone';\nimport {\n KBProvider,\n KBQueryOptions,\n KBQueryResult,\n KBMetadata,\n KBSnippet,\n LLMProvider,\n Logger,\n} from '../types/providers';\nimport { getModel, getKBProviderConfig, getPrompt } from '../runtime/config';\nimport { kbCatalog, getKBMeta, getKBMetaFromCatalog } from '../kbCatalog';\nimport { KBMeta } from '../types/kb';\n\n/**\n * Pinecone KB Provider implementation\n */\nexport class PineconeKBProvider implements KBProvider {\n readonly type = 'pinecone';\n\n private client: Pinecone | null = null;\n private logger?: Logger;\n private llm?: LLMProvider;\n private dynamicCatalog?: KBMeta[];\n\n constructor(logger?: Logger, llm?: LLMProvider) {\n this.logger = logger;\n this.llm = llm;\n }\n\n /**\n * Set a dynamic KB catalog for SaaS multi-tenant mode\n */\n setDynamicCatalog(catalog: KBMeta[]): void {\n this.dynamicCatalog = catalog;\n }\n\n /**\n * Get KB metadata, using dynamic catalog if available, otherwise static\n */\n private getKBMetaInternal(kbId: string): KBMeta | undefined {\n if (this.dynamicCatalog) {\n return getKBMetaFromCatalog(kbId, this.dynamicCatalog);\n }\n return getKBMeta(kbId);\n }\n\n /**\n * Get or initialize the Pinecone client (singleton pattern)\n */\n private getClient(): Pinecone {\n if (this.client) {\n return this.client;\n }\n\n const apiKey = process.env.PINECONE_API_KEY;\n if (!apiKey) {\n throw new Error('PINECONE_API_KEY is not set');\n }\n\n this.client = new Pinecone({ apiKey });\n return this.client;\n }\n\n /**\n * Query the knowledge base for relevant context\n */\n async query(kbId: string, query: string, options?: KBQueryOptions): Promise<KBQueryResult> {\n const kbMeta = this.getKBMetaInternal(kbId);\n if (!kbMeta) {\n throw new Error(`KB metadata not found for ${kbId}`);\n }\n\n // Get configuration for topK and name normalization\n const kbConfig = getKBProviderConfig();\n const topK = options?.topK ?? kbConfig.topK;\n\n try {\n const pc = this.getClient();\n // Normalize assistant name if configured (e.g., replace underscores with hyphens)\n const normalizedName = kbConfig.normalizeNames\n ? kbMeta.assistantName.replace(/_/g, '-')\n : kbMeta.assistantName;\n const assistant = pc.Assistant(normalizedName);\n\n // Retrieve context snippets from Pinecone Assistant\n let contextSnippets: any[] = [];\n try {\n const contextResponse = await assistant.context({\n messages: [\n {\n role: 'user',\n content: query,\n },\n ],\n topK,\n });\n contextSnippets = contextResponse?.snippets || [];\n\n if (this.logger) {\n this.logger.debug(`Retrieved ${contextSnippets.length} snippets via context API for ${kbId}`);\n }\n } catch (contextError) {\n if (this.logger) {\n this.logger.error(\n `Context API failed for ${kbId}`,\n contextError instanceof Error ? contextError : new Error(String(contextError))\n );\n }\n throw new Error(\n `Failed to retrieve context from Pinecone: ${contextError instanceof Error ? contextError.message : String(contextError)}`\n );\n }\n\n // Format snippets for answer generation\n const snippetText = contextSnippets.length > 0\n ? contextSnippets.map((snippet, index) => {\n const ref = snippet.reference?.file || {};\n const metadata = ref.metadata || {};\n return `[S${index + 1}] Source: ${ref.name || metadata.title || 'Unknown'}\\n${snippet.content || 'No content available'}`;\n }).join('\\n\\n---\\n\\n')\n : 'No context snippets available.';\n\n // Transform snippets to KBSnippet format\n const snippets: KBSnippet[] = contextSnippets.map((snippet, index) => {\n // Merge metadata from multiple possible locations to preserve page numbers and other fields\n const mergedMetadata = {\n ...(snippet.reference?.file?.metadata || {}),\n ...(snippet.reference?.metadata || {}),\n ...(snippet.metadata || {}),\n };\n\n const pages = snippet.reference?.pages;\n\n // Bubble up page hints if present on the snippet or reference\n const pageCandidates = [\n snippet.page,\n snippet.pageNumber,\n snippet.page_number,\n snippet.reference?.page,\n snippet.reference?.pageNumber,\n snippet.reference?.page_number,\n mergedMetadata.page,\n mergedMetadata.pageNumber,\n mergedMetadata.page_number,\n mergedMetadata.pageIndex,\n mergedMetadata.page_index,\n mergedMetadata.pdfPage,\n mergedMetadata.pdf_page,\n Array.isArray(pages) ? pages[0] : undefined,\n ];\n const pageFromSnippet = pageCandidates.find(p => p !== undefined && p !== null && p !== '');\n if (pageFromSnippet !== undefined && pageFromSnippet !== null && pageFromSnippet !== '') {\n mergedMetadata.page = pageFromSnippet;\n }\n\n return {\n content: snippet.content || '',\n reference: {\n file: {\n name: snippet.reference?.file?.name,\n signedUrl: snippet.reference?.file?.signedUrl || snippet.reference?.file?.signed_url,\n metadata: mergedMetadata,\n },\n // Preserve any higher-level reference metadata if present\n id: snippet.reference?.id,\n source: snippet.reference?.source,\n pages: Array.isArray(pages) ? pages : undefined,\n },\n label: `S${index + 1}`,\n referenceSummary: snippet.referenceSummary || snippet.preview || snippet.content?.slice(0, 200),\n preview: snippet.preview || snippet.content?.slice(0, 300),\n };\n });\n\n // Generate answer using LLM provider with context snippets\n if (!this.llm) {\n throw new Error('PineconeKBProvider requires an LLM provider for answer generation');\n }\n \n const synthesisRole = getPrompt('synthesisSystemRole');\n const prompt = `You are ${synthesisRole}. Answer the user's question based on the following context snippets.\n\nUser question: ${query}\n\nContext snippets:\n${snippetText}\n\nIMPORTANT: When referencing information from the snippets above, you MUST include inline citations like [S1], [S2], [S3], etc. directly in your answer text where you mention information from those sources. For example: \"Check the door [S1] and inspect the drive belt [S2].\"\n\nProvide a clear, helpful answer based on the context above. Include inline citations [S1], [S2], etc. throughout your answer where you reference information from the snippets.\n\nAnswer:`;\n\n const result = await this.llm.generateText(prompt, { model: getModel('synthesis') });\n const answer = result.text;\n\n if (this.logger) {\n this.logger.debug(`Generated answer length: ${answer.length}, contains citations: ${/\\[S\\d+\\]/.test(answer)}`);\n }\n\n return { snippets, answer };\n } catch (error) {\n if (this.logger) {\n this.logger.error(\n 'Pinecone context or answer generation error',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n throw new Error(\n `Failed to get context and generate answer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get metadata about a specific knowledge base\n */\n getMetadata(kbId: string): KBMetadata | undefined {\n const kbMeta = this.getKBMetaInternal(kbId);\n if (!kbMeta) {\n return undefined;\n }\n\n return this.kbMetaToMetadata(kbMeta);\n }\n\n /**\n * List all available knowledge bases\n */\n listKBs(): KBMetadata[] {\n const catalog = this.dynamicCatalog ?? kbCatalog;\n return catalog.map(kb => this.kbMetaToMetadata(kb));\n }\n\n /**\n * Convert internal KBMeta to public KBMetadata interface\n */\n private kbMetaToMetadata(kbMeta: KBMeta): KBMetadata {\n return {\n id: kbMeta.id,\n name: kbMeta.assistantName,\n description: kbMeta.description,\n capabilities: kbMeta.capabilities,\n inputEntities: kbMeta.inputEntities,\n outputEntities: kbMeta.outputEntities,\n };\n }\n}\n\n/**\n * Create a new Pinecone KB provider instance\n * \n * @param logger - Optional logger for debug output\n * @param llm - LLM provider for answer generation\n */\nexport function createPineconeProvider(logger?: Logger, llm?: LLMProvider): KBProvider {\n return new PineconeKBProvider(logger, llm);\n}\n","/**\n * Mustache-style Template Engine\n *\n * Implementation of the TemplateEngine interface using {{variable}} syntax.\n */\n\nimport {\n TemplateEngine,\n TemplateContext,\n SlotNormalizer,\n} from '../types/providers';\nimport { Slots } from '../types';\n\n/**\n * Mustache-style template engine implementation\n *\n * Supports:\n * - Simple variable substitution: {{variableName}}\n * - Reserved variable: {{userUtterance}}\n */\nexport class MustacheTemplateEngine implements TemplateEngine {\n readonly name = 'mustache';\n\n private normalizer?: SlotNormalizer;\n\n constructor(normalizer?: SlotNormalizer) {\n this.normalizer = normalizer;\n }\n\n /**\n * Render a template string with context\n */\n render(template: string, context: TemplateContext): string {\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (_, token) => {\n const key = token.trim();\n\n // Handle reserved variable\n if (key === 'userUtterance') {\n return context.userUtterance;\n }\n\n // Get slot value\n const value = context.slots[key as keyof Slots];\n if (value === undefined || value === null || value === '') {\n return '';\n }\n\n // Format using normalizer if available\n if (this.normalizer) {\n return this.normalizer.format(key, value);\n }\n\n // Default formatting\n if (typeof value === 'boolean') {\n return value ? 'yes' : 'no';\n }\n return String(value);\n }).trim();\n }\n}\n\n/**\n * Default slot normalizer implementation\n *\n * Uses configuration-based normalization rules.\n */\nexport class DefaultSlotNormalizer implements SlotNormalizer {\n private formatSlotValue: (slotName: string, value: string | boolean | undefined) => string;\n\n constructor(formatSlotValue: (slotName: string, value: string | boolean | undefined) => string) {\n this.formatSlotValue = formatSlotValue;\n }\n\n /**\n * Normalize a slot value according to its rules\n */\n normalize(slotName: string, value: string | boolean): string {\n return this.formatSlotValue(slotName, value);\n }\n\n /**\n * Format a slot value for display\n */\n format(slotName: string, value: string | boolean | undefined): string {\n return this.formatSlotValue(slotName, value);\n }\n}\n\n/**\n * Create a new Mustache template engine instance\n */\nexport function createTemplateEngine(normalizer?: SlotNormalizer): TemplateEngine {\n return new MustacheTemplateEngine(normalizer);\n}\n\n/**\n * Create a default slot normalizer using the config's formatSlotValue function\n */\nexport function createSlotNormalizer(\n formatSlotValue: (slotName: string, value: string | boolean | undefined) => string\n): SlotNormalizer {\n return new DefaultSlotNormalizer(formatSlotValue);\n}\n","/**\n * Framework Context Factory\n *\n * Creates and manages the dependency injection container for the framework.\n */\n\nimport { FrameworkContext, Logger } from '../types/providers';\nimport { createOpenAIProvider } from '../providers/openai';\nimport { createPineconeProvider } from '../providers/pinecone';\nimport { createTemplateEngine, createSlotNormalizer } from '../providers/template';\nimport { createTraceCollector } from '../providers/trace';\nimport { createSessionLogger } from '../logger';\nimport { formatSlotValue as configFormatSlotValue } from './config';\n\n/**\n * Wrapper for formatSlotValue that ensures a string return type\n */\nfunction formatSlotValue(slotName: string, value: string | boolean | undefined): string {\n return configFormatSlotValue(slotName, value) ?? '';\n}\n\n/**\n * Options for creating a framework context\n */\nexport interface ContextOptions {\n sessionId: string;\n}\n\n/**\n * Create a framework context with all providers initialized\n *\n * This is the main entry point for dependency injection.\n * All engines and components should receive this context.\n */\nexport function createFrameworkContext(options: ContextOptions): FrameworkContext {\n const { sessionId } = options;\n\n // Create logger first as other providers may need it\n const logger = createSessionLogger(sessionId);\n\n // Create slot normalizer using config's formatSlotValue\n const normalizer = createSlotNormalizer(formatSlotValue);\n\n // Create all providers\n // Note: LLM is created first so it can be injected into KB provider\n const llm = createOpenAIProvider();\n const kb = createPineconeProvider(logger, llm);\n const template = createTemplateEngine(normalizer);\n const trace = createTraceCollector(sessionId);\n\n return {\n llm,\n kb,\n template,\n logger,\n trace,\n normalizer,\n };\n}\n\n","/**\n * Agent Runner\n *\n * High-level function that orchestrates the complete agent flow:\n * 1. Context initialization\n * 2. Disambiguation (understanding user intent)\n * 3. Planning (determining which KBs to query)\n * 4. Execution (querying KBs and synthesizing answer)\n *\n * This replaces the 300-500 lines of boilerplate in example apps.\n */\n\nimport {\n AgentContext,\n ExecutionTrace,\n Intent,\n TraceStep,\n Plan,\n StepResult,\n DisambiguationAction,\n KBMeta,\n KBManifest,\n} from '../types';\nimport { RunAgentOptions, AgentResult, AgentOutcome, Citation } from './types';\nimport { TraceAdapter, SSETraceAdapter, NoOpTraceAdapter } from '../adapters/trace';\nimport { createAgentContext } from '../agentContext';\nimport { disambiguate } from '../disambiguation';\nimport { plan as createPlan } from '../planner';\nimport { executePlanWithContext } from '../executor';\nimport { kbCatalog, getKBMeta, buildKBCatalog, getKBMetaFromCatalog } from '../kbCatalog';\nimport { createFrameworkContext } from '../runtime';\nimport { setRuntimeConfig, clearConfigCache } from '../runtime/config';\nimport { AgentConfig, SlotDefinition as ConfigSlotDefinition } from '../types/config';\nimport { createSessionLogger } from '../logger';\nimport { StepCounter } from '../providers/trace';\nimport { getAllCapabilities } from '../composition';\nimport { clearCompositionCache } from '../composition/registry';\n\n/**\n * Build agent slots from manifest slot definitions.\n * The agent's slots are the unique collection of all slots defined in its manifests.\n * Config can override slot properties (like prompt, description) but cannot add\n * slots that don't exist in any manifest.\n */\nfunction mergeManifestSlotsIntoConfig(\n config: AgentConfig,\n manifests: KBManifest[]\n): AgentConfig {\n // Collect all unique slot definitions from manifests\n const manifestSlots = new Map<string, ConfigSlotDefinition>();\n const manifestSlotPriority: string[] = [];\n\n for (const manifest of manifests) {\n // Add slots from manifest\n for (const slot of manifest.slots || []) {\n if (!manifestSlots.has(slot.name)) {\n manifestSlots.set(slot.name, {\n name: slot.name,\n type: slot.type,\n required: false, // Manifest slots default to optional; KB inputRequirements determine required-ness\n description: slot.description,\n prompt: slot.prompt || `Please provide ${slot.name.replace(/_/g, ' ')}`,\n examples: slot.examples,\n normalization: slot.normalization,\n enumValues: slot.enumValues,\n });\n }\n }\n\n // Collect slot priority from manifest\n if (manifest.slotPriority) {\n for (const slot of manifest.slotPriority) {\n if (!manifestSlotPriority.includes(slot)) {\n manifestSlotPriority.push(slot);\n }\n }\n }\n }\n\n // Create a map of config slots for property overrides\n const configSlots = new Map<string, ConfigSlotDefinition>();\n for (const slot of config.slots || []) {\n configSlots.set(slot.name, slot);\n }\n\n // Build final slots: ONLY slots that exist in manifests\n // Config can override properties but cannot add new slots\n const finalSlots: ConfigSlotDefinition[] = [];\n\n for (const [name, manifestSlot] of manifestSlots) {\n const configOverride = configSlots.get(name);\n if (configOverride) {\n // Config slot exists - use it to override manifest properties\n finalSlots.push({\n ...manifestSlot,\n ...configOverride,\n // Ensure name stays consistent\n name: manifestSlot.name,\n });\n } else {\n // No config override - use manifest slot as-is\n finalSlots.push(manifestSlot);\n }\n }\n\n // Build slot priority: only include slots that actually exist in manifests\n const manifestSlotNames = new Set(manifestSlots.keys());\n const finalSlotPriority: string[] = [];\n \n // First add config priorities that exist in manifests\n for (const slot of config.slotPriority || []) {\n if (manifestSlotNames.has(slot) && !finalSlotPriority.includes(slot)) {\n finalSlotPriority.push(slot);\n }\n }\n \n // Then add manifest priorities\n for (const slot of manifestSlotPriority) {\n if (!finalSlotPriority.includes(slot)) {\n finalSlotPriority.push(slot);\n }\n }\n\n return {\n ...config,\n slots: finalSlots,\n slotPriority: finalSlotPriority,\n };\n}\n\n/**\n * Initialize or restore conversation context\n */\nfunction initializeContext(\n message: string,\n previousContext?: AgentContext,\n previousIntent?: Intent\n): AgentContext {\n if (previousContext) {\n return {\n ...previousContext,\n missingInformation: {\n ...(previousContext.missingInformation || {}),\n questionHistory: previousContext.missingInformation?.questionHistory || [],\n },\n };\n }\n\n if (previousIntent) {\n const context = createAgentContext(previousIntent.userUtterance);\n context.collectedInformation.slots = previousIntent.slots;\n if (previousIntent.missingSlots?.length) {\n context.missingInformation.slots = previousIntent.missingSlots;\n }\n if (!context.missingInformation.questionHistory) {\n context.missingInformation.questionHistory = [];\n }\n return context;\n }\n\n return createAgentContext(message);\n}\n\n/**\n * Create a trace step for the disambiguation phase\n */\nfunction createDisambiguationTraceStep(\n stepCounter: StepCounter,\n message: string,\n previousIntent?: Intent\n): TraceStep {\n return {\n stepId: stepCounter.next('disambiguation'),\n stepType: 'disambiguation',\n timestamp: '',\n description: \"Understanding the user's question\",\n thought: previousIntent\n ? `The user is providing additional information. I need to merge this with what I already know: ${JSON.stringify(previousIntent.slots)}. Let me analyze the new message: \"${message}\"`\n : `The user asked: \"${message}\". I need to understand what they're trying to accomplish.`,\n understanding: previousIntent\n ? `From the previous conversation, I know: ${Object.entries(previousIntent.slots).filter(([_, v]) => v).map(([k, v]) => `${k} = ${v}`).join(', ')}. Now I need to extract any new information from this message.`\n : `Starting fresh. The user's message is: \"${message}\". I'll analyze it to understand their goal and extract any relevant details.`,\n details: {\n userMessage: message,\n previousIntent: previousIntent,\n },\n };\n}\n\n/**\n * Create a planning trace step\n */\nfunction createPlanningTraceStep(\n stepCounter: StepCounter,\n intent: Intent,\n relevantKBs: KBMeta[]\n): TraceStep {\n const slotsList = Object.entries(intent.slots)\n .filter(([_, v]) => v)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n\n return {\n stepId: stepCounter.next('planning'),\n stepType: 'planning',\n timestamp: '',\n description: \"Planning how to answer the user's question\",\n thought: `Now I understand what the user needs: ${intent.goals.join(', ')}. I have the following information: ${slotsList}. I need to figure out which knowledge bases to query.`,\n understanding: `The user's intent is: ${intent.intentId}. Their goals are: ${intent.goals.join(', ')}. I've identified ${relevantKBs.length} relevant knowledge base(s): ${relevantKBs.map(kb => kb.id).join(', ')}.`,\n details: {\n intentId: intent.intentId,\n goals: intent.goals,\n availableSlots: intent.slots,\n },\n };\n}\n\n/**\n * Update planning trace step with results\n */\nfunction updatePlanningTraceStep(\n planningStep: TraceStep,\n planResult: Plan,\n catalog: KBMeta[]\n): void {\n const kbCallSteps = planResult.steps.filter(s => s.type === 'kb_call');\n const synthesisStep = planResult.steps.find(s => s.type === 'llm_synthesis');\n\n const selectedKBs = planResult.steps\n .filter(step => step.type === 'kb_call')\n .map(step => {\n const kbMeta = getKBMetaFromCatalog(step.kbId, catalog);\n return {\n kbId: step.kbId,\n reason: `Selected for ${step.id} - ${kbMeta?.description || step.kbId}`,\n };\n });\n\n planningStep.learned = `I've created a plan with ${kbCallSteps.length} knowledge base query(ies): ${kbCallSteps.map(s => s.kbId).join(', ')}. ${synthesisStep ? \"After gathering information, I'll synthesize a comprehensive answer.\" : ''}`;\n planningStep.conclusion = `My plan is ready. I'll execute ${kbCallSteps.length} query(ies) to gather the information needed.`;\n\n planningStep.details = {\n ...planningStep.details,\n selectedKBs,\n plan: planResult,\n };\n}\n\n/**\n * Format extracted slots for display\n */\nfunction formatExtractedSlots(slots: Record<string, unknown>): string {\n return Object.entries(slots)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '' && v !== false)\n .map(([k, v]) => `${k}: \"${v}\"`)\n .join(', ');\n}\n\n/**\n * Build an empty execution trace for early returns\n */\nfunction buildEmptyTrace(\n sessionId: string,\n intent: Intent,\n traceSteps: TraceStep[],\n context: AgentContext\n): ExecutionTrace {\n return {\n sessionId,\n intent,\n plan: { planId: '', steps: [] },\n stepResults: [],\n traceSteps,\n context,\n };\n}\n\n/**\n * Extract citations from step results\n * \n * Always assigns global sequential labels (S1, S2, S3...) to ensure\n * unique labels across all KBs, regardless of per-KB labels.\n */\nfunction extractCitations(stepResults: StepResult[]): Citation[] {\n const citations: Citation[] = [];\n let labelIndex = 1;\n\n for (const result of stepResults) {\n if (result.contextSnippets) {\n for (const snippet of result.contextSnippets) {\n citations.push({\n label: `S${labelIndex}`, // Always use global counter for unique labels\n kbId: result.kbId || 'unknown',\n referenceSummary: snippet.referenceSummary || 'Source document',\n preview: snippet.content?.slice(0, 200),\n content: snippet.content,\n reference: snippet.reference,\n contentType: snippet.contentType,\n fileName: snippet.fileName,\n });\n labelIndex++;\n }\n }\n }\n\n return citations;\n}\n\n/**\n * Run the agent with a user message.\n *\n * This is the main entry point for the high-level API. It handles:\n * - Context initialization and restoration\n * - Disambiguation (understanding intent)\n * - Planning (selecting KBs)\n * - Execution (querying KBs and synthesizing)\n *\n * @example\n * ```typescript\n * // Simple usage\n * const result = await runAgent({ message: 'My toaster is broken' });\n *\n * // Multi-turn conversation\n * const result2 = await runAgent({\n * message: 'It's a T100',\n * previousContext: result.context,\n * });\n *\n * // With custom trace adapter\n * const result3 = await runAgent({\n * message: 'Help me fix it',\n * traceAdapter: new MyCustomTraceAdapter(),\n * });\n * ```\n */\nexport async function runAgent(options: RunAgentOptions): Promise<AgentResult> {\n const {\n message,\n sessionId: providedSessionId,\n previousContext,\n previousIntent,\n conversationHistory,\n traceAdapter: providedTraceAdapter,\n config: dynamicConfig,\n manifests: dynamicManifests,\n } = options;\n\n // Set runtime config if provided (for SaaS multi-tenant use)\n // Merge manifest slot definitions into config so they're available for extraction\n const usingDynamicConfig = !!dynamicConfig;\n let effectiveConfig = dynamicConfig;\n if (dynamicConfig && dynamicManifests) {\n effectiveConfig = mergeManifestSlotsIntoConfig(dynamicConfig, dynamicManifests);\n setRuntimeConfig(effectiveConfig);\n // Clear caches to ensure dynamic config is used\n clearCompositionCache();\n } else if (dynamicConfig) {\n setRuntimeConfig(dynamicConfig);\n // Clear caches to ensure dynamic config is used\n clearCompositionCache();\n }\n\n // Build dynamic KB catalog if manifests provided\n const catalog: KBMeta[] = dynamicManifests\n ? buildKBCatalog(dynamicManifests, effectiveConfig)\n : kbCatalog;\n\n // Helper to get KB meta from the appropriate catalog\n const getKBMetaLocal = (kbId: string): KBMeta | undefined => {\n return dynamicManifests\n ? getKBMetaFromCatalog(kbId, catalog)\n : getKBMeta(kbId);\n };\n\n // Initialize session\n const sessionId = providedSessionId || `session_${Date.now()}`;\n const logger = createSessionLogger(sessionId);\n const frameworkContext = createFrameworkContext({ sessionId });\n // Attach the appropriate KB catalog for dynamic (SaaS) or static mode\n frameworkContext.kbCatalog = catalog;\n // Set the dynamic catalog on the KB provider if it supports it\n if (dynamicManifests && 'setDynamicCatalog' in frameworkContext.kb) {\n (frameworkContext.kb as any).setDynamicCatalog(catalog);\n }\n const traceSteps: TraceStep[] = [];\n\n // Set up trace adapter\n const traceAdapter: TraceAdapter = providedTraceAdapter || new SSETraceAdapter(sessionId);\n await traceAdapter.emit({ type: 'session_id', sessionId });\n\n logger.info('Starting agent execution', { message, sessionId });\n\n // Initialize context\n let context = initializeContext(message, previousContext, previousIntent);\n const stepCounter = StepCounter.fromContext(context);\n\n // ============================================================================\n // PHASE 1: DISAMBIGUATION\n // ============================================================================\n\n logger.info('Starting disambiguation phase');\n const disambiguationStep = createDisambiguationTraceStep(stepCounter, message, previousIntent);\n\n const {\n intent,\n updatedContext: disambiguationContext,\n action: disambiguationAction,\n disambiguationDetails,\n } = await disambiguate(message, catalog, context, conversationHistory, frameworkContext);\n\n context = disambiguationContext;\n disambiguationStep.timestamp = new Date().toISOString();\n\n // Update disambiguation step with results\n const extractedSlotsList = formatExtractedSlots(intent.slots);\n const goalsList = intent.goals.join(', ');\n\n const routingInfo = disambiguationDetails?.routingDecision;\n const routingSummary = routingInfo\n ? `KB Routing: ${routingInfo.finalKBs.join(', ')} (${routingInfo.kbsFromHints.length} from LLM hints, ${routingInfo.kbsFromSlotTriggers.length} from slot triggers)`\n : '';\n\n disambiguationStep.learned = extractedSlotsList\n ? `I extracted: ${extractedSlotsList}. Goals: ${goalsList}. ${routingSummary}`\n : `Goals: ${goalsList}, no specific details yet. ${routingSummary}`;\n\n disambiguationStep.details = {\n ...disambiguationStep.details,\n extractedIntent: intent,\n extractedSlots: intent.slots,\n missingSlots: intent.missingSlots,\n action: disambiguationAction,\n disambiguationDetails: disambiguationDetails\n ? {\n llmExtraction: {\n kbHints: disambiguationDetails.llmExtraction.kbHints,\n goals: disambiguationDetails.llmExtraction.goals,\n reasoning: disambiguationDetails.llmExtraction.reasoning,\n },\n routingDecision: {\n kbHintsReceived: disambiguationDetails.routingDecision.kbHintsReceived,\n kbsFromHints: disambiguationDetails.routingDecision.kbsFromHints,\n slotTriggersMatched: disambiguationDetails.routingDecision.slotTriggersMatched,\n kbsFromSlotTriggers: disambiguationDetails.routingDecision.kbsFromSlotTriggers,\n finalKBs: disambiguationDetails.routingDecision.finalKBs,\n routingReasons: disambiguationDetails.routingDecision.routingReasons,\n },\n }\n : undefined,\n };\n\n traceSteps.push(disambiguationStep);\n await traceAdapter.emit({ type: 'step', step: disambiguationStep });\n\n // Handle early return cases\n if (disambiguationAction.type === 'ASK_SLOT') {\n disambiguationStep.conclusion = `I need more information. Missing: ${disambiguationAction.slot}.`;\n\n // Create slot filling step\n const slotFillingStep: TraceStep = {\n stepId: stepCounter.next('slot_filling'),\n stepType: 'slot_filling',\n timestamp: new Date().toISOString(),\n description: 'Identifying what information is missing',\n thought: `I need to ask the user for: ${disambiguationAction.slot}`,\n understanding: `From my analysis, I understand the user wants: ${goalsList}. However, to answer their question properly, I need: ${disambiguationAction.slot}.`,\n learned: `I've prepared a follow-up question: \"${disambiguationAction.question}\"`,\n conclusion: `I'll ask the user for the missing information before proceeding.`,\n details: {\n missingSlots: [disambiguationAction.slot],\n followUpQuestions: [disambiguationAction.question],\n },\n };\n traceSteps.push(slotFillingStep);\n await traceAdapter.emit({ type: 'step', step: slotFillingStep });\n await traceAdapter.emit({ type: 'follow_up', questions: [disambiguationAction.question] });\n\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const outcome: AgentOutcome = {\n type: 'follow_up',\n question: disambiguationAction.question,\n slot: disambiguationAction.slot,\n options: disambiguationAction.options,\n trace,\n };\n\n // Clean up runtime config if we set it\n if (usingDynamicConfig) {\n setRuntimeConfig(null);\n }\n\n return { outcome, context, sessionId, intent };\n }\n\n if (disambiguationAction.type === 'BLOCKED') {\n disambiguationStep.conclusion = `Blocked: ${disambiguationAction.reason}`;\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const outcome: AgentOutcome = {\n type: 'blocked',\n reason: disambiguationAction.reason,\n trace,\n };\n\n // Clean up runtime config if we set it\n if (usingDynamicConfig) {\n setRuntimeConfig(null);\n }\n\n return { outcome, context, sessionId, intent };\n }\n\n if (disambiguationAction.type === 'OUT_OF_SCOPE') {\n disambiguationStep.conclusion = `Query is outside agent scope.`;\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const outcome: AgentOutcome = {\n type: 'out_of_scope',\n message: disambiguationAction.redirectMessage,\n capabilities: disambiguationAction.availableCapabilities || getAllCapabilities(),\n trace,\n };\n\n // Clean up runtime config if we set it\n if (usingDynamicConfig) {\n setRuntimeConfig(null);\n }\n\n return { outcome, context, sessionId, intent };\n }\n\n // CALL_KB or PARTIAL_PROCEED - continue to planning\n const kbIds = disambiguationAction.kbIds;\n const relevantKBs = kbIds\n .map(id => getKBMetaFromCatalog(id, catalog))\n .filter((kb): kb is KBMeta => kb !== undefined);\n\n disambiguationStep.conclusion =\n disambiguationAction.type === 'PARTIAL_PROCEED'\n ? `Proceeding with partial information. Missing: ${(disambiguationAction as { missingSlots: string[] }).missingSlots.join(', ')}. Relevant KBs: ${kbIds.join(', ')}.`\n : `I have enough information to proceed. Relevant KBs: ${kbIds.join(', ')}.`;\n\n // ============================================================================\n // PHASE 2: PLANNING\n // ============================================================================\n\n logger.info('Starting planning phase');\n const planningStep = createPlanningTraceStep(stepCounter, intent, relevantKBs);\n\n const { plan: planResult, updatedContext: planningContext } = await createPlan(\n intent,\n catalog,\n context,\n relevantKBs,\n frameworkContext\n );\n\n context = planningContext;\n planningStep.timestamp = new Date().toISOString();\n updatePlanningTraceStep(planningStep, planResult, catalog);\n traceSteps.push(planningStep);\n await traceAdapter.emit({ type: 'step', step: planningStep });\n\n logger.info('Planning complete', {\n planSteps: planResult.steps.length,\n kbCalls: planResult.steps.filter(s => s.type === 'kb_call').length,\n });\n\n // ============================================================================\n // PHASE 3: EXECUTION\n // ============================================================================\n\n logger.info('Starting execution phase');\n stepCounter.syncToContext(context);\n\n const { answer, trace: executionTrace } = await executePlanWithContext(\n intent,\n planResult,\n context,\n frameworkContext\n );\n\n logger.info('Execution complete', { answerLength: answer?.length || 0 });\n\n // Merge trace steps\n const fullTrace: ExecutionTrace = {\n ...executionTrace,\n traceSteps: [...traceSteps, ...executionTrace.traceSteps],\n context: executionTrace.context,\n };\n\n // Emit execution trace steps\n for (const step of executionTrace.traceSteps) {\n await traceAdapter.emit({ type: 'step', step });\n }\n\n await traceAdapter.emit({ type: 'trace_complete', trace: fullTrace });\n\n // Extract citations from step results\n const citations = extractCitations(executionTrace.stepResults);\n\n const outcome: AgentOutcome = {\n type: 'answer',\n answer: answer || '',\n citations,\n trace: fullTrace,\n };\n\n // Clean up runtime config if we set it\n if (usingDynamicConfig) {\n setRuntimeConfig(null);\n }\n\n return {\n outcome,\n context: executionTrace.context,\n sessionId,\n intent,\n };\n}\n\n","/**\n * Streaming Agent Runner\n *\n * High-level function that orchestrates the complete agent flow with streaming synthesis:\n * 1. Context initialization\n * 2. Disambiguation (understanding user intent)\n * 3. Planning (determining which KBs to query)\n * 4. Execution with streaming synthesis\n *\n * Use this for Vercel AI SDK integrations that need streaming responses.\n */\n\nimport {\n AgentContext,\n ExecutionTrace,\n Intent,\n TraceStep,\n Plan,\n StepResult,\n KBMeta,\n PlanStepSynthesis,\n} from '../types';\nimport {\n RunAgentStreamingOptions,\n AgentResult,\n AgentOutcome,\n StreamingAgentResult,\n Citation,\n} from './types';\nimport { TraceAdapter, NoOpTraceAdapter } from '../adapters/trace';\nimport { createAgentContext } from '../agentContext';\nimport { disambiguate } from '../disambiguation';\nimport { plan as createPlan } from '../planner';\nimport { executeKBCallStep, synthesizeAnswerStreaming, handleAllKBsFailed } from '../executor';\nimport { kbCatalog, getKBMeta, buildKBCatalog, getKBMetaFromCatalog } from '../kbCatalog';\nimport { createFrameworkContext } from '../runtime';\nimport { setRuntimeConfig, clearConfigCache } from '../runtime/config';\nimport { AgentConfig, SlotDefinition as ConfigSlotDefinition } from '../types/config';\nimport { createSessionLogger } from '../logger';\nimport { StepCounter } from '../providers/trace';\nimport { getAllCapabilities, clearCompositionCache } from '../composition/registry';\nimport { summarizeSnippetReference } from '../executor/snippetFormatter';\nimport type { KBManifest } from '../types';\n\n/**\n * Initialize or restore conversation context\n */\nfunction initializeContext(\n message: string,\n previousContext?: AgentContext,\n previousIntent?: Intent\n): AgentContext {\n if (previousContext) {\n return {\n ...previousContext,\n missingInformation: {\n ...(previousContext.missingInformation || {}),\n questionHistory: previousContext.missingInformation?.questionHistory || [],\n },\n };\n }\n\n if (previousIntent) {\n const context = createAgentContext(previousIntent.userUtterance);\n context.collectedInformation.slots = previousIntent.slots;\n if (previousIntent.missingSlots?.length) {\n context.missingInformation.slots = previousIntent.missingSlots;\n }\n if (!context.missingInformation.questionHistory) {\n context.missingInformation.questionHistory = [];\n }\n return context;\n }\n\n return createAgentContext(message);\n}\n\n/**\n * Create a trace step for the disambiguation phase\n */\nfunction createDisambiguationTraceStep(\n stepCounter: StepCounter,\n message: string,\n previousIntent?: Intent\n): TraceStep {\n return {\n stepId: stepCounter.next('disambiguation'),\n stepType: 'disambiguation',\n timestamp: '',\n description: \"Understanding the user's question\",\n thought: previousIntent\n ? `The user is providing additional information. I need to merge this with what I already know: ${JSON.stringify(previousIntent.slots)}. Let me analyze the new message: \"${message}\"`\n : `The user asked: \"${message}\". I need to understand what they're trying to accomplish.`,\n understanding: previousIntent\n ? `From the previous conversation, I know: ${Object.entries(previousIntent.slots).filter(([_, v]) => v).map(([k, v]) => `${k} = ${v}`).join(', ')}. Now I need to extract any new information from this message.`\n : `Starting fresh. The user's message is: \"${message}\". I'll analyze it to understand their goal and extract any relevant details.`,\n details: {\n userMessage: message,\n previousIntent: previousIntent,\n },\n };\n}\n\n/**\n * Create a planning trace step\n */\nfunction createPlanningTraceStep(\n stepCounter: StepCounter,\n intent: Intent,\n relevantKBs: KBMeta[]\n): TraceStep {\n const slotsList = Object.entries(intent.slots)\n .filter(([_, v]) => v)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n\n return {\n stepId: stepCounter.next('planning'),\n stepType: 'planning',\n timestamp: '',\n description: \"Planning how to answer the user's question\",\n thought: `Now I understand what the user needs: ${intent.goals.join(', ')}. I have the following information: ${slotsList}. I need to figure out which knowledge bases to query.`,\n understanding: `The user's intent is: ${intent.intentId}. Their goals are: ${intent.goals.join(', ')}. I've identified ${relevantKBs.length} relevant knowledge base(s): ${relevantKBs.map(kb => kb.id).join(', ')}.`,\n details: {\n intentId: intent.intentId,\n goals: intent.goals,\n availableSlots: intent.slots,\n },\n };\n}\n\n/**\n * Update planning trace step with results\n */\nfunction updatePlanningTraceStep(\n planningStep: TraceStep,\n planResult: Plan\n): void {\n const kbCallSteps = planResult.steps.filter(s => s.type === 'kb_call');\n const synthesisStep = planResult.steps.find(s => s.type === 'llm_synthesis');\n\n const selectedKBs = planResult.steps\n .filter(step => step.type === 'kb_call')\n .map(step => {\n const kbMeta = getKBMeta(step.kbId);\n return {\n kbId: step.kbId,\n reason: `Selected for ${step.id} - ${kbMeta?.description || step.kbId}`,\n };\n });\n\n planningStep.learned = `I've created a plan with ${kbCallSteps.length} knowledge base query(ies): ${kbCallSteps.map(s => s.kbId).join(', ')}. ${synthesisStep ? \"After gathering information, I'll synthesize a comprehensive answer.\" : ''}`;\n planningStep.conclusion = `My plan is ready. I'll execute ${kbCallSteps.length} query(ies) to gather the information needed.`;\n\n planningStep.details = {\n ...planningStep.details,\n selectedKBs,\n plan: planResult,\n };\n}\n\n/**\n * Format extracted slots for display\n */\nfunction formatExtractedSlots(slots: Record<string, unknown>): string {\n return Object.entries(slots)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '' && v !== false)\n .map(([k, v]) => `${k}: \"${v}\"`)\n .join(', ');\n}\n\n/**\n * Build an empty execution trace for early returns\n */\nfunction buildEmptyTrace(\n sessionId: string,\n intent: Intent,\n traceSteps: TraceStep[],\n context: AgentContext\n): ExecutionTrace {\n return {\n sessionId,\n intent,\n plan: { planId: '', steps: [] },\n stepResults: [],\n traceSteps,\n context,\n };\n}\n\n/**\n * Extract citations from step results\n * \n * Always assigns global sequential labels (S1, S2, S3...) to ensure\n * unique labels across all KBs, regardless of per-KB labels.\n */\nfunction extractCitations(stepResults: StepResult[]): Citation[] {\n const citations: Citation[] = [];\n let labelIndex = 1;\n\n for (const result of stepResults) {\n if (result.contextSnippets) {\n for (const snippet of result.contextSnippets) {\n citations.push({\n label: `S${labelIndex}`, // Always use global counter for unique labels\n kbId: result.kbId || 'unknown',\n referenceSummary: snippet.referenceSummary || summarizeSnippetReference(snippet) || 'Source document',\n preview: snippet.content?.slice(0, 200),\n content: snippet.content,\n reference: snippet.reference,\n });\n labelIndex++;\n }\n }\n }\n\n return citations;\n}\n\n/**\n * Create a text-only readable stream from a string\n */\nfunction createTextStream(text: string): ReadableStream<string> {\n return new ReadableStream<string>({\n start(controller) {\n controller.enqueue(text);\n controller.close();\n },\n });\n}\n\n/**\n * Run the agent with streaming synthesis.\n *\n * This is the main entry point for streaming responses. It returns:\n * - A readable stream of the answer text (null for non-answer outcomes)\n * - A promise that resolves to the complete AgentResult\n *\n * @example\n * ```typescript\n * // With Vercel AI SDK\n * const { stream, result } = await runAgentStreaming({\n * message: 'My toaster is broken',\n * traceAdapter: new VercelDataStreamAdapter(),\n * });\n *\n * // Use the stream for the response\n * return new Response(stream);\n *\n * // Or get the full result\n * const fullResult = await result;\n * ```\n */\nfunction mergeManifestSlotsIntoStreamingConfig(\n config: AgentConfig,\n manifests: KBManifest[]\n): AgentConfig {\n const manifestSlots = new Map<string, ConfigSlotDefinition>();\n for (const manifest of manifests) {\n for (const slot of manifest.slots || []) {\n if (!manifestSlots.has(slot.name)) {\n manifestSlots.set(slot.name, {\n name: slot.name,\n type: slot.type,\n required: false,\n description: slot.description,\n prompt: slot.prompt || `Please provide ${slot.name.replace(/_/g, ' ')}`,\n examples: slot.examples,\n normalization: slot.normalization,\n enumValues: slot.enumValues,\n });\n }\n }\n }\n const configSlots = new Map<string, ConfigSlotDefinition>();\n for (const slot of config.slots || []) {\n configSlots.set(slot.name, slot);\n }\n const finalSlots: ConfigSlotDefinition[] = [];\n for (const [, manifestSlot] of manifestSlots) {\n const configOverride = configSlots.get(manifestSlot.name);\n finalSlots.push(configOverride ? { ...manifestSlot, ...configOverride, name: manifestSlot.name } : manifestSlot);\n }\n return { ...config, slots: finalSlots };\n}\n\nexport async function runAgentStreaming(\n options: RunAgentStreamingOptions\n): Promise<StreamingAgentResult> {\n const {\n message,\n sessionId: providedSessionId,\n previousContext,\n previousIntent,\n conversationHistory,\n traceAdapter: providedTraceAdapter,\n onChunk,\n config: dynamicConfig,\n manifests: dynamicManifests,\n } = options;\n\n // Set runtime config if provided (for SaaS multi-tenant use)\n const usingDynamicConfig = !!dynamicConfig;\n let effectiveConfig = dynamicConfig;\n if (dynamicConfig && dynamicManifests) {\n effectiveConfig = mergeManifestSlotsIntoStreamingConfig(dynamicConfig, dynamicManifests);\n setRuntimeConfig(effectiveConfig);\n clearCompositionCache();\n } else if (dynamicConfig) {\n setRuntimeConfig(dynamicConfig);\n clearCompositionCache();\n }\n\n // Build dynamic KB catalog if manifests provided\n const catalog: KBMeta[] = dynamicManifests\n ? buildKBCatalog(dynamicManifests, effectiveConfig)\n : kbCatalog;\n\n // Initialize session\n const sessionId = providedSessionId || `session_${Date.now()}`;\n const logger = createSessionLogger(sessionId);\n const frameworkContext = createFrameworkContext({ sessionId });\n frameworkContext.kbCatalog = catalog;\n if (dynamicManifests && 'setDynamicCatalog' in frameworkContext.kb) {\n (frameworkContext.kb as any).setDynamicCatalog(catalog);\n }\n const traceSteps: TraceStep[] = [];\n\n // Set up trace adapter\n const traceAdapter: TraceAdapter = providedTraceAdapter || new NoOpTraceAdapter();\n await traceAdapter.emit({ type: 'session_id', sessionId });\n\n logger.info('Starting streaming agent execution', { message, sessionId });\n\n // Initialize context\n let context = initializeContext(message, previousContext, previousIntent);\n const stepCounter = StepCounter.fromContext(context);\n\n // ============================================================================\n // PHASE 1: DISAMBIGUATION\n // ============================================================================\n\n logger.info('Starting disambiguation phase');\n const disambiguationStep = createDisambiguationTraceStep(stepCounter, message, previousIntent);\n\n const {\n intent,\n updatedContext: disambiguationContext,\n action: disambiguationAction,\n disambiguationDetails,\n } = await disambiguate(message, catalog, context, conversationHistory, frameworkContext);\n\n context = disambiguationContext;\n disambiguationStep.timestamp = new Date().toISOString();\n\n // Update disambiguation step with results\n const extractedSlotsList = formatExtractedSlots(intent.slots);\n const goalsList = intent.goals.join(', ');\n\n const routingInfo = disambiguationDetails?.routingDecision;\n const routingSummary = routingInfo\n ? `KB Routing: ${routingInfo.finalKBs.join(', ')} (${routingInfo.kbsFromHints.length} from LLM hints, ${routingInfo.kbsFromSlotTriggers.length} from slot triggers)`\n : '';\n\n disambiguationStep.learned = extractedSlotsList\n ? `I extracted: ${extractedSlotsList}. Goals: ${goalsList}. ${routingSummary}`\n : `Goals: ${goalsList}, no specific details yet. ${routingSummary}`;\n\n disambiguationStep.details = {\n ...disambiguationStep.details,\n extractedIntent: intent,\n extractedSlots: intent.slots,\n missingSlots: intent.missingSlots,\n action: disambiguationAction,\n disambiguationDetails: disambiguationDetails\n ? {\n llmExtraction: {\n kbHints: disambiguationDetails.llmExtraction.kbHints,\n goals: disambiguationDetails.llmExtraction.goals,\n reasoning: disambiguationDetails.llmExtraction.reasoning,\n },\n routingDecision: {\n kbHintsReceived: disambiguationDetails.routingDecision.kbHintsReceived,\n kbsFromHints: disambiguationDetails.routingDecision.kbsFromHints,\n slotTriggersMatched: disambiguationDetails.routingDecision.slotTriggersMatched,\n kbsFromSlotTriggers: disambiguationDetails.routingDecision.kbsFromSlotTriggers,\n finalKBs: disambiguationDetails.routingDecision.finalKBs,\n routingReasons: disambiguationDetails.routingDecision.routingReasons,\n },\n }\n : undefined,\n };\n\n traceSteps.push(disambiguationStep);\n await traceAdapter.emit({ type: 'step', step: disambiguationStep });\n\n // Handle early return cases - return immediately resolved result\n if (disambiguationAction.type === 'ASK_SLOT') {\n disambiguationStep.conclusion = `I need more information. Missing: ${disambiguationAction.slot}.`;\n\n // Create slot filling step\n const slotFillingStep: TraceStep = {\n stepId: stepCounter.next('slot_filling'),\n stepType: 'slot_filling',\n timestamp: new Date().toISOString(),\n description: 'Identifying what information is missing',\n thought: `I need to ask the user for: ${disambiguationAction.slot}`,\n understanding: `From my analysis, I understand the user wants: ${goalsList}. However, to answer their question properly, I need: ${disambiguationAction.slot}.`,\n learned: `I've prepared a follow-up question: \"${disambiguationAction.question}\"`,\n conclusion: `I'll ask the user for the missing information before proceeding.`,\n details: {\n missingSlots: [disambiguationAction.slot],\n followUpQuestions: [disambiguationAction.question],\n },\n };\n traceSteps.push(slotFillingStep);\n await traceAdapter.emit({ type: 'step', step: slotFillingStep });\n await traceAdapter.emit({ type: 'follow_up', questions: [disambiguationAction.question] });\n\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const outcome: AgentOutcome = {\n type: 'follow_up',\n question: disambiguationAction.question,\n slot: disambiguationAction.slot,\n options: disambiguationAction.options,\n trace,\n };\n\n const agentResult: AgentResult = { outcome, context, sessionId, intent };\n\n return {\n stream: createTextStream(disambiguationAction.question),\n result: Promise.resolve(agentResult),\n };\n }\n\n if (disambiguationAction.type === 'BLOCKED') {\n disambiguationStep.conclusion = `Blocked: ${disambiguationAction.reason}`;\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const blockedMessage = `I'm sorry, I cannot help with this request: ${disambiguationAction.reason}`;\n const outcome: AgentOutcome = {\n type: 'blocked',\n reason: disambiguationAction.reason,\n trace,\n };\n\n const agentResult: AgentResult = { outcome, context, sessionId, intent };\n\n return {\n stream: createTextStream(blockedMessage),\n result: Promise.resolve(agentResult),\n };\n }\n\n if (disambiguationAction.type === 'OUT_OF_SCOPE') {\n disambiguationStep.conclusion = `Query is outside agent scope.`;\n stepCounter.syncToContext(context);\n const trace = buildEmptyTrace(sessionId, intent, traceSteps, context);\n await traceAdapter.emit({ type: 'trace_complete', trace });\n\n const outcome: AgentOutcome = {\n type: 'out_of_scope',\n message: disambiguationAction.redirectMessage,\n capabilities: disambiguationAction.availableCapabilities || getAllCapabilities(),\n trace,\n };\n\n const agentResult: AgentResult = { outcome, context, sessionId, intent };\n\n if (usingDynamicConfig) setRuntimeConfig(null);\n return {\n stream: createTextStream(disambiguationAction.redirectMessage),\n result: Promise.resolve(agentResult),\n };\n }\n\n // CALL_KB or PARTIAL_PROCEED - continue to planning\n const kbIds = disambiguationAction.kbIds;\n const relevantKBs = kbIds\n .map(id => getKBMetaFromCatalog(id, catalog))\n .filter((kb): kb is KBMeta => kb !== undefined);\n\n disambiguationStep.conclusion =\n disambiguationAction.type === 'PARTIAL_PROCEED'\n ? `Proceeding with partial information. Missing: ${(disambiguationAction as { missingSlots: string[] }).missingSlots.join(', ')}. Relevant KBs: ${kbIds.join(', ')}.`\n : `I have enough information to proceed. Relevant KBs: ${kbIds.join(', ')}.`;\n\n // ============================================================================\n // PHASE 2: PLANNING\n // ============================================================================\n\n logger.info('Starting planning phase');\n const planningStep = createPlanningTraceStep(stepCounter, intent, relevantKBs);\n\n const { plan: planResult, updatedContext: planningContext } = await createPlan(\n intent,\n catalog,\n context,\n relevantKBs,\n frameworkContext\n );\n\n context = planningContext;\n planningStep.timestamp = new Date().toISOString();\n updatePlanningTraceStep(planningStep, planResult);\n traceSteps.push(planningStep);\n await traceAdapter.emit({ type: 'step', step: planningStep });\n\n logger.info('Planning complete', {\n planSteps: planResult.steps.length,\n kbCalls: planResult.steps.filter(s => s.type === 'kb_call').length,\n });\n\n // ============================================================================\n // PHASE 3: EXECUTION (with streaming synthesis)\n // ============================================================================\n\n logger.info('Starting streaming execution phase');\n\n // Execute KB calls synchronously first\n const stepResults: StepResult[] = [];\n const previousKBCalls: Array<{ kbId: string; stepId: string; success: boolean }> = [];\n\n for (const step of planResult.steps) {\n if (step.type === 'kb_call') {\n const result = await executeKBCallStep(\n step,\n intent,\n previousKBCalls,\n frameworkContext\n );\n stepResults.push(result.stepResult);\n previousKBCalls.push({\n kbId: step.kbId,\n stepId: step.id,\n success: result.success,\n });\n\n // Emit KB call trace step\n for (const traceStep of frameworkContext.trace.getSteps()) {\n if (!traceSteps.some(ts => ts.stepId === traceStep.stepId)) {\n traceSteps.push(traceStep);\n await traceAdapter.emit({ type: 'step', step: traceStep });\n }\n }\n }\n }\n\n // Check if all KB calls failed\n const successfulKBCalls = stepResults.filter(r => r.kbId && !r.error);\n const kbCallCount = planResult.steps.filter(s => s.type === 'kb_call').length;\n const allKBCallsFailed = kbCallCount > 0 && successfulKBCalls.length === 0;\n\n stepCounter.syncToContext(context);\n\n if (allKBCallsFailed) {\n const result = handleAllKBsFailed(stepResults, kbCallCount, frameworkContext);\n stepResults.push(result.stepResult);\n\n const fullTrace: ExecutionTrace = {\n sessionId,\n intent,\n plan: planResult,\n stepResults,\n traceSteps: [...traceSteps, ...frameworkContext.trace.getSteps()],\n context,\n };\n\n await traceAdapter.emit({ type: 'trace_complete', trace: fullTrace });\n\n const outcome: AgentOutcome = {\n type: 'answer',\n answer: result.answer,\n citations: [],\n trace: fullTrace,\n };\n\n const agentResult: AgentResult = { outcome, context, sessionId, intent };\n\n return {\n stream: createTextStream(result.answer),\n result: Promise.resolve(agentResult),\n };\n }\n\n // Normal synthesis with streaming\n const synthesisStep = planResult.steps.find(s => s.type === 'llm_synthesis') as PlanStepSynthesis | undefined;\n\n if (!synthesisStep) {\n // No synthesis step - shouldn't happen but handle gracefully\n const noAnswerMessage = 'Unable to generate a response.';\n const fullTrace: ExecutionTrace = {\n sessionId,\n intent,\n plan: planResult,\n stepResults,\n traceSteps: [...traceSteps, ...frameworkContext.trace.getSteps()],\n context,\n };\n\n await traceAdapter.emit({ type: 'trace_complete', trace: fullTrace });\n\n const outcome: AgentOutcome = {\n type: 'answer',\n answer: noAnswerMessage,\n citations: extractCitations(stepResults),\n trace: fullTrace,\n };\n\n const agentResult: AgentResult = { outcome, context, sessionId, intent };\n\n return {\n stream: createTextStream(noAnswerMessage),\n result: Promise.resolve(agentResult),\n };\n }\n\n // Execute streaming synthesis\n const { stream: synthesisStream, stepResult: synthesisStepResult } = await synthesizeAnswerStreaming(\n synthesisStep,\n intent,\n stepResults,\n frameworkContext\n );\n\n stepResults.push(synthesisStepResult);\n\n // Create stream completion signal and answer accumulator\n let fullAnswer = '';\n let resolveStreamComplete: () => void;\n const streamCompleted = new Promise<void>((resolve) => {\n resolveStreamComplete = resolve;\n });\n\n const textDecoder = new TextDecoder();\n let protocolBuffer = '';\n\n /**\n * Parse Vercel AI SDK stream protocol and extract text deltas.\n * Protocol lines: 0:\"text\" (text delta), f:{...} (format), e:{...} (end), d:{...} (done)\n */\n function extractTextFromProtocol(raw: string): string {\n protocolBuffer += raw;\n const lines = protocolBuffer.split('\\n');\n protocolBuffer = lines.pop() || '';\n let text = '';\n for (const line of lines) {\n if (line.startsWith('0:')) {\n try {\n text += JSON.parse(line.slice(2));\n } catch {\n // not valid JSON, skip\n }\n }\n }\n return text;\n }\n\n // Create the readable stream that processes chunks and signals completion\n const transformedStream = new ReadableStream<string>({\n async start(controller) {\n const reader = synthesisStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const rawChunk = textDecoder.decode(value, { stream: true });\n const textContent = extractTextFromProtocol(rawChunk);\n\n if (textContent) {\n fullAnswer += textContent;\n\n if (onChunk) {\n onChunk(textContent);\n }\n\n controller.enqueue(textContent);\n }\n }\n // Flush any remaining buffer\n if (protocolBuffer.trim()) {\n const remaining = protocolBuffer;\n protocolBuffer = '';\n if (remaining.startsWith('0:')) {\n try {\n const text = JSON.parse(remaining.slice(2));\n if (text) {\n fullAnswer += text;\n if (onChunk) onChunk(text);\n controller.enqueue(text);\n }\n } catch { /* skip */ }\n }\n }\n } finally {\n reader.releaseLock();\n controller.close();\n resolveStreamComplete();\n }\n },\n });\n\n // Create a promise that resolves to the full result after stream completion\n // This does NOT re-consume the stream - it waits for the completion signal\n const resultPromise = streamCompleted.then(async (): Promise<AgentResult> => {\n const fullTrace: ExecutionTrace = {\n sessionId,\n intent,\n plan: planResult,\n stepResults,\n traceSteps: [...traceSteps, ...frameworkContext.trace.getSteps()],\n context,\n };\n\n await traceAdapter.emit({ type: 'trace_complete', trace: fullTrace });\n\n const citations = extractCitations(stepResults);\n\n const outcome: AgentOutcome = {\n type: 'answer',\n answer: fullAnswer || synthesisStepResult.responsePayload?.answer || '',\n citations,\n trace: fullTrace,\n };\n\n if (usingDynamicConfig) setRuntimeConfig(null);\n return { outcome, context, sessionId, intent };\n });\n\n // Return both the stream and the result promise\n // The caller consumes the stream, which triggers completion and resolves resultPromise\n return {\n stream: transformedStream,\n result: resultPromise,\n };\n}\n\n","/**\n * Citation Utilities\n *\n * Shared utilities for extracting and processing citations from execution traces.\n * These utilities are used by both the example app and SaaS backend.\n */\n\nimport { ExecutionTrace, ChatCitation } from '../types';\nimport { Citation } from '../agent/types';\n\n/**\n * Extract citations from an execution trace.\n *\n * This extracts all contextSnippets from trace steps and converts them\n * to ChatCitation format. Uses global sequential labeling (S1, S2, S3...)\n * to ensure unique labels across all KBs.\n *\n * @param trace - The execution trace to extract citations from\n * @returns Array of ChatCitation objects\n *\n * @example\n * ```typescript\n * const citations = extractCitationsFromTrace(result.outcome.trace);\n * ```\n */\nexport function extractCitationsFromTrace(trace?: ExecutionTrace): ChatCitation[] {\n if (!trace?.traceSteps) {\n return [];\n }\n\n const citations: ChatCitation[] = [];\n let labelIndex = 1;\n\n for (const step of trace.traceSteps) {\n const contextSnippets = step.details?.contextSnippets;\n if (Array.isArray(contextSnippets)) {\n for (const snippet of contextSnippets) {\n // Only include snippets that have content (skip trace-only entries without labels)\n if (snippet.content || snippet.preview || snippet.label) {\n citations.push({\n label: `S${labelIndex}`, // Always use global counter for unique labels\n kbId: step.details?.kbId || '',\n referenceSummary: snippet.referenceSummary || '',\n preview: snippet.preview || snippet.content?.substring(0, 200),\n content: snippet.content,\n contentType: snippet.contentType,\n fileName: snippet.fileName || snippet.reference?.file?.name,\n reference: snippet.reference,\n });\n labelIndex++;\n }\n }\n }\n }\n\n return citations;\n}\n\n/**\n * Filter citations to only those that are actually referenced in the answer text.\n * \n * Looks for citation markers like [S1], [S2], etc. in the text and returns\n * only the citations that match those labels.\n *\n * @param citations - All available citations\n * @param answerText - The answer text that may contain citation markers\n * @returns Filtered array of citations that are referenced in the text\n *\n * @example\n * ```typescript\n * const allCitations = extractCitationsFromTrace(trace);\n * const usedCitations = filterCitedOnly(allCitations, response.answer);\n * ```\n */\nexport function filterCitedOnly<T extends { label: string }>(\n citations: T[],\n answerText: string\n): T[] {\n if (!answerText || !citations.length) {\n return [];\n }\n\n // Extract all citation labels from the text (e.g., [S1], [S2], [S10])\n const citedLabels = new Set<string>();\n const citationPattern = /\\[S(\\d+)\\]/g;\n let match;\n \n while ((match = citationPattern.exec(answerText)) !== null) {\n citedLabels.add(`S${match[1]}`);\n }\n\n // Return only citations whose labels appear in the text\n return citations.filter(c => citedLabels.has(c.label));\n}\n\n/**\n * Convert a full Citation (from agent types) to a ChatCitation (for API responses).\n *\n * @param citation - The full Citation object\n * @returns A ChatCitation suitable for API responses\n */\nexport function toChatCitation(citation: Citation): ChatCitation {\n return {\n label: citation.label,\n kbId: citation.kbId,\n referenceSummary: citation.referenceSummary,\n preview: citation.preview,\n content: citation.content,\n contentType: citation.contentType,\n fileName: citation.fileName,\n reference: citation.reference,\n };\n}\n\n/**\n * Convert an array of full Citations to ChatCitations.\n *\n * @param citations - Array of full Citation objects\n * @returns Array of ChatCitation objects\n */\nexport function toChatCitations(citations: Citation[]): ChatCitation[] {\n return citations.map(toChatCitation);\n}\n\n\n","/**\n * Next.js Response Builder\n *\n * Converts AgentResult to Next.js API responses (NextResponse.json).\n * Use this for standard (non-streaming) Next.js API routes.\n */\n\nimport { AgentResult } from '../agent/types';\nimport { ChatResponse, AgentContext, Intent } from '../types';\nimport { toChatCitations } from './citations';\n\n/**\n * Create an empty AgentContext for error cases\n */\nfunction createEmptyContext(): AgentContext {\n return {\n userObjective: '',\n missingInformation: {\n slots: [],\n unobtainableSlots: [],\n descriptions: {},\n questionHistory: [],\n },\n collectedInformation: {\n slots: {},\n collectionHistory: [],\n },\n kbRetrievals: [],\n agentThinking: [],\n stepCounts: {},\n };\n}\n\n/**\n * Create an empty Intent for error cases\n */\nfunction createEmptyIntent(): Intent {\n return {\n intentId: '',\n userUtterance: '',\n slots: {},\n goals: [],\n };\n}\n\n/**\n * Convert an AgentResult to a ChatResponse object.\n *\n * This is the raw response body, which you can return with NextResponse.json()\n * or use with any other framework.\n *\n * The response includes:\n * - sessionId: For conversation tracking\n * - outcome: The type of result ('answer', 'follow_up', 'blocked', 'out_of_scope')\n * - answer/followUpQuestion: The response text\n * - options: Multi-choice options for follow-up questions\n * - citations: References from KB responses\n * - context/intent: For multi-turn conversations\n * - trace: Full execution trace (optional)\n */\nexport function toChatResponse(result: AgentResult): ChatResponse {\n const { outcome, sessionId, context, intent } = result;\n\n // Base response with common fields\n const baseResponse = {\n sessionId,\n context: context || createEmptyContext(),\n intent: intent || createEmptyIntent(),\n trace: outcome.trace,\n };\n\n switch (outcome.type) {\n case 'answer':\n return {\n ...baseResponse,\n outcome: 'answer',\n answer: outcome.answer,\n followUpQuestion: null,\n options: undefined,\n citations: toChatCitations(outcome.citations || []),\n };\n\n case 'follow_up':\n return {\n ...baseResponse,\n outcome: 'follow_up',\n answer: null,\n followUpQuestion: outcome.question,\n options: outcome.options,\n citations: [],\n };\n\n case 'blocked':\n return {\n ...baseResponse,\n outcome: 'blocked',\n answer: `I'm sorry, I cannot help with this request: ${outcome.reason}`,\n followUpQuestion: null,\n options: undefined,\n citations: [],\n };\n\n case 'out_of_scope':\n return {\n ...baseResponse,\n outcome: 'out_of_scope',\n answer: outcome.message,\n followUpQuestion: null,\n options: undefined,\n citations: [],\n };\n }\n}\n\n/**\n * Convert an AgentResult to a Next.js Response.\n *\n * This returns a standard Response object that works with Next.js API routes.\n * For frameworks that need NextResponse, you can import NextResponse and use:\n * `NextResponse.json(toChatResponse(result))`\n *\n * @example\n * ```typescript\n * // In a Next.js API route\n * import { runAgent, toNextResponse } from '@/lib';\n *\n * export async function POST(request: NextRequest) {\n * const { message } = await request.json();\n * const result = await runAgent({ message });\n * return toNextResponse(result);\n * }\n * ```\n */\nexport function toNextResponse(result: AgentResult): Response {\n const body = toChatResponse(result);\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\n/**\n * Convert an error to a Next.js error response.\n */\nexport function toNextErrorResponse(\n error: Error | string,\n sessionId?: string\n): Response {\n const message = error instanceof Error ? error.message : error;\n return new Response(\n JSON.stringify({\n error: 'Internal server error',\n message,\n sessionId,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n}\n\n","/**\n * Vercel AI SDK Response Builder\n *\n * Converts AgentResult and streaming results to Vercel AI SDK responses.\n * Use this for streaming responses with the `ai` package.\n */\n\nimport { AgentResult, StreamingAgentResult } from '../agent/types';\nimport { StreamAnnotation } from '../providers/streaming';\nimport { BufferingVercelDataStreamAdapter, StreamAnnotation as TraceAnnotation } from './trace';\n\n// Re-export StreamAnnotation for convenience\nexport type { StreamAnnotation } from '../providers/streaming';\n\n/**\n * Options for creating a Vercel AI streaming response\n */\nexport interface VercelAIResponseOptions {\n /** Include trace data in the stream annotations */\n includeTrace?: boolean;\n /** Custom error message handler */\n onError?: (error: Error) => string;\n}\n\n/**\n * Create a Vercel AI SDK compatible streaming response.\n *\n * This creates a Response with a ReadableStream that includes:\n * - Data stream annotations for trace steps\n * - The streamed text content\n * - Trace complete annotation at the end\n *\n * @example\n * ```typescript\n * import { runAgentStreaming, toVercelAIResponse } from '@/lib';\n *\n * export async function POST(request: NextRequest) {\n * const { message } = await request.json();\n * const streamingResult = await runAgentStreaming({ message });\n * return toVercelAIResponse(streamingResult);\n * }\n * ```\n */\nexport async function toVercelAIResponse(\n streamingResult: StreamingAgentResult,\n options: VercelAIResponseOptions = {}\n): Promise<Response> {\n const { includeTrace = true, onError } = options;\n\n // Wait for the result to get trace data\n const result = await streamingResult.result;\n const { outcome, sessionId } = result;\n\n // Build the annotations array\n const annotations: StreamAnnotation[] = [];\n\n // Add session ID annotation\n annotations.push({ type: 'session_id', sessionId });\n\n // Add trace step annotations\n if (includeTrace && outcome.trace) {\n for (const step of outcome.trace.traceSteps) {\n annotations.push({\n type: 'trace_step',\n step: JSON.parse(JSON.stringify(step)),\n });\n }\n }\n\n // Handle follow-up outcomes specially\n if (outcome.type === 'follow_up') {\n annotations.push({\n type: 'follow_up',\n questions: [outcome.question],\n });\n }\n\n // Add trace complete annotation\n if (includeTrace && outcome.trace) {\n annotations.push({\n type: 'trace_complete',\n trace: JSON.parse(JSON.stringify(outcome.trace)),\n });\n }\n\n // Create the response stream that combines annotations and text\n const textStream = streamingResult.stream;\n const encoder = new TextEncoder();\n\n const responseStream = new ReadableStream({\n async start(controller) {\n try {\n // Send annotations as data stream format\n for (const annotation of annotations) {\n const dataLine = `2:${JSON.stringify(annotation)}\\n`;\n controller.enqueue(encoder.encode(dataLine));\n }\n\n // If there's a text stream, pipe it through\n if (textStream) {\n const reader = textStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Convert text to data stream format (text chunks use prefix 0:)\n const textLine = `0:${JSON.stringify(value)}\\n`;\n controller.enqueue(encoder.encode(textLine));\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n controller.close();\n } catch (error) {\n const errorMessage = onError\n ? onError(error instanceof Error ? error : new Error(String(error)))\n : error instanceof Error\n ? error.message\n : String(error);\n controller.error(new Error(errorMessage));\n }\n },\n });\n\n return new Response(responseStream, {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'X-Vercel-AI-Data-Stream': 'v1',\n },\n });\n}\n\n/**\n * Create a simple Vercel AI response for non-streaming results.\n *\n * Use this when you have an AgentResult from runAgent() (non-streaming)\n * but want to return it in a Vercel AI compatible format.\n */\nexport function toVercelAISimpleResponse(\n result: AgentResult,\n options: VercelAIResponseOptions = {}\n): Response {\n const { includeTrace = true } = options;\n const { outcome, sessionId } = result;\n\n const annotations: StreamAnnotation[] = [];\n\n annotations.push({ type: 'session_id', sessionId });\n\n if (includeTrace && outcome.trace) {\n for (const step of outcome.trace.traceSteps) {\n annotations.push({\n type: 'trace_step',\n step: JSON.parse(JSON.stringify(step)),\n });\n }\n annotations.push({\n type: 'trace_complete',\n trace: JSON.parse(JSON.stringify(outcome.trace)),\n });\n }\n\n if (outcome.type === 'follow_up') {\n annotations.push({\n type: 'follow_up',\n questions: [outcome.question],\n });\n }\n\n // Get the text content based on outcome type\n let textContent: string;\n switch (outcome.type) {\n case 'answer':\n textContent = outcome.answer;\n break;\n case 'follow_up':\n textContent = outcome.question;\n break;\n case 'blocked':\n textContent = `I'm sorry, I cannot help with this request: ${outcome.reason}`;\n break;\n case 'out_of_scope':\n textContent = outcome.message;\n break;\n }\n\n // Build the data stream format response\n const encoder = new TextEncoder();\n const lines: string[] = [];\n\n for (const annotation of annotations) {\n lines.push(`2:${JSON.stringify(annotation)}`);\n }\n\n // Add text as a single chunk\n lines.push(`0:${JSON.stringify(textContent)}`);\n\n const body = lines.join('\\n') + '\\n';\n\n return new Response(encoder.encode(body), {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'X-Vercel-AI-Data-Stream': 'v1',\n },\n });\n}\n\n/**\n * Utility to extract the text answer from an AgentResult\n */\nexport function getAnswerText(result: AgentResult): string {\n switch (result.outcome.type) {\n case 'answer':\n return result.outcome.answer;\n case 'follow_up':\n return result.outcome.question;\n case 'blocked':\n return `I'm sorry, I cannot help with this request: ${result.outcome.reason}`;\n case 'out_of_scope':\n return result.outcome.message;\n }\n}\n\n/**\n * Create a truly streaming Vercel AI SDK response.\n *\n * Unlike `toVercelAIResponse()`, this function does NOT await the full result.\n * Instead, it interleaves trace annotations with text chunks as they become available,\n * providing a truly progressive streaming experience.\n *\n * IMPORTANT: The `traceAdapter` passed to `runAgentStreaming()` must be a\n * `BufferingVercelDataStreamAdapter` for progressive trace delivery.\n *\n * @example\n * ```typescript\n * import {\n * runAgentStreaming,\n * toVercelAIStreamingResponse,\n * createBufferingVercelDataStreamAdapter,\n * } from '@/lib';\n *\n * export async function POST(request: NextRequest) {\n * const { message } = await request.json();\n * const traceAdapter = createBufferingVercelDataStreamAdapter();\n * const streamingResult = await runAgentStreaming({ message, traceAdapter });\n * return toVercelAIStreamingResponse(streamingResult, traceAdapter);\n * }\n * ```\n */\nexport function toVercelAIStreamingResponse(\n streamingResult: StreamingAgentResult,\n traceAdapter: BufferingVercelDataStreamAdapter,\n options: VercelAIResponseOptions = {}\n): Response {\n const { onError } = options;\n const encoder = new TextEncoder();\n\n // Queue for annotations to be sent\n let pendingAnnotations: TraceAnnotation[] = [];\n let streamStarted = false;\n\n // Set up flush callback to receive annotations as they're emitted\n traceAdapter.setFlushCallback((annotations) => {\n pendingAnnotations.push(...annotations);\n });\n\n // Flush any already-buffered annotations\n pendingAnnotations.push(...traceAdapter.flush());\n\n const responseStream = new ReadableStream({\n async start(controller) {\n try {\n // Helper to send pending annotations\n const flushAnnotations = () => {\n while (pendingAnnotations.length > 0) {\n const annotation = pendingAnnotations.shift()!;\n const dataLine = `2:${JSON.stringify(annotation)}\\n`;\n controller.enqueue(encoder.encode(dataLine));\n }\n };\n\n // Send initial annotations (session_id, early trace steps)\n flushAnnotations();\n streamStarted = true;\n\n // Stream text content if available\n if (streamingResult.stream) {\n const reader = streamingResult.stream.getReader();\n try {\n while (true) {\n // Flush any new annotations before each chunk\n flushAnnotations();\n\n const { done, value } = await reader.read();\n if (done) break;\n\n // Send text chunk in Vercel AI data stream format\n const textLine = `0:${JSON.stringify(value)}\\n`;\n controller.enqueue(encoder.encode(textLine));\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Wait for result to get trace_complete event\n // This happens after stream is consumed, so it won't block streaming\n await streamingResult.result;\n\n // Flush final annotations (trace_complete)\n flushAnnotations();\n\n controller.close();\n } catch (error) {\n const errorMessage = onError\n ? onError(error instanceof Error ? error : new Error(String(error)))\n : error instanceof Error\n ? error.message\n : String(error);\n controller.error(new Error(errorMessage));\n }\n },\n });\n\n return new Response(responseStream, {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'X-Vercel-AI-Data-Stream': 'v1',\n },\n });\n}\n","/**\n * Middleware Module\n *\n * Composable middleware functions for building custom agent pipelines.\n * Use these when you need more control than the high-level runAgent() provides.\n *\n * @example\n * ```typescript\n * import {\n * createPipelineContext,\n * withDisambiguation,\n * withPlanning,\n * withExecution,\n * compose,\n * } from '@/lib/middleware';\n *\n * // Create a custom pipeline\n * const myPipeline = compose(\n * withDisambiguation(),\n * withPlanning(),\n * withExecution(),\n * );\n *\n * // Run it\n * const context = createPipelineContext({ message: 'Help me' });\n * const result = await myPipeline(context);\n * ```\n */\n\nimport {\n AgentContext,\n Intent,\n Plan,\n StepResult,\n TraceStep,\n ExecutionTrace,\n KBMeta,\n ConversationMessage,\n FrameworkContext,\n} from '../types';\nimport { TraceAdapter, NoOpTraceAdapter } from '../adapters/trace';\nimport { createAgentContext } from '../agentContext';\nimport { disambiguate } from '../disambiguation';\nimport { plan as createPlanFn } from '../planner';\nimport { executePlanWithContext } from '../executor';\nimport { kbCatalog, getKBMetaFromCatalog } from '../kbCatalog';\nimport { createFrameworkContext } from '../runtime';\nimport { createSessionLogger } from '../logger';\nimport { StepCounter } from '../providers/trace';\n\n/**\n * Pipeline context passed through middleware functions\n */\nexport interface PipelineContext {\n // Input\n message: string;\n sessionId: string;\n conversationHistory?: ConversationMessage[];\n\n // State\n agentContext: AgentContext;\n stepCounter: StepCounter;\n traceSteps: TraceStep[];\n frameworkContext: FrameworkContext;\n traceAdapter: TraceAdapter;\n\n // Results from middleware\n intent?: Intent;\n disambiguationAction?: {\n type: 'ASK_SLOT' | 'CALL_KB' | 'PARTIAL_PROCEED' | 'BLOCKED' | 'OUT_OF_SCOPE';\n [key: string]: unknown;\n };\n relevantKBs?: KBMeta[];\n plan?: Plan;\n stepResults?: StepResult[];\n answer?: string;\n\n // Flags\n shouldStop?: boolean;\n stopReason?: 'follow_up' | 'blocked' | 'out_of_scope';\n}\n\n/**\n * Middleware function type\n */\nexport type Middleware = (\n context: PipelineContext,\n next: () => Promise<PipelineContext>\n) => Promise<PipelineContext>;\n\n/**\n * Create an initial pipeline context\n */\nexport interface CreatePipelineContextOptions {\n message: string;\n sessionId?: string;\n previousContext?: AgentContext;\n previousIntent?: Intent;\n conversationHistory?: ConversationMessage[];\n traceAdapter?: TraceAdapter;\n}\n\nexport function createPipelineContext(\n options: CreatePipelineContextOptions\n): PipelineContext {\n const {\n message,\n sessionId: providedSessionId,\n previousContext,\n previousIntent,\n conversationHistory,\n traceAdapter,\n } = options;\n\n const sessionId = providedSessionId || `session_${Date.now()}`;\n const frameworkContext = createFrameworkContext({ sessionId });\n\n let agentContext: AgentContext;\n if (previousContext) {\n agentContext = {\n ...previousContext,\n missingInformation: {\n ...(previousContext.missingInformation || {}),\n questionHistory: previousContext.missingInformation?.questionHistory || [],\n },\n };\n } else if (previousIntent) {\n agentContext = createAgentContext(previousIntent.userUtterance);\n agentContext.collectedInformation.slots = previousIntent.slots;\n if (previousIntent.missingSlots?.length) {\n agentContext.missingInformation.slots = previousIntent.missingSlots;\n }\n } else {\n agentContext = createAgentContext(message);\n }\n\n return {\n message,\n sessionId,\n conversationHistory,\n agentContext,\n stepCounter: StepCounter.fromContext(agentContext),\n traceSteps: [],\n frameworkContext,\n traceAdapter: traceAdapter || new NoOpTraceAdapter(),\n };\n}\n\n/**\n * Compose multiple middleware functions into a single function\n */\nexport function compose(...middlewares: Middleware[]): (context: PipelineContext) => Promise<PipelineContext> {\n return async (context: PipelineContext) => {\n let index = -1;\n\n const dispatch = async (i: number): Promise<PipelineContext> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i >= middlewares.length) {\n return context;\n }\n\n const middleware = middlewares[i];\n return middleware(context, () => dispatch(i + 1));\n };\n\n return dispatch(0);\n };\n}\n\n/**\n * Disambiguation middleware\n *\n * Extracts intent and determines routing.\n * Sets: intent, disambiguationAction, relevantKBs\n * May set: shouldStop, stopReason\n */\nexport function withDisambiguation(): Middleware {\n return async (context, next) => {\n const { message, agentContext, stepCounter, traceAdapter, conversationHistory, frameworkContext } = context;\n\n const logger = createSessionLogger(context.sessionId);\n logger.info('Middleware: Starting disambiguation');\n\n // Create trace step\n const disambiguationStep: TraceStep = {\n stepId: stepCounter.next('disambiguation'),\n stepType: 'disambiguation',\n timestamp: '',\n description: \"Understanding the user's question\",\n thought: `The user asked: \"${message}\". I need to understand what they're trying to accomplish.`,\n understanding: `Analyzing the message to extract intent and relevant details.`,\n details: { userMessage: message },\n };\n\n const { intent, updatedContext, action, disambiguationDetails } = await disambiguate(\n message,\n kbCatalog,\n agentContext,\n conversationHistory,\n frameworkContext\n );\n\n disambiguationStep.timestamp = new Date().toISOString();\n disambiguationStep.details = {\n ...disambiguationStep.details,\n extractedIntent: intent,\n action,\n disambiguationDetails,\n };\n context.traceSteps.push(disambiguationStep);\n await traceAdapter.emit({ type: 'step', step: disambiguationStep });\n\n context.agentContext = updatedContext;\n context.intent = intent;\n context.disambiguationAction = action;\n\n // Handle early stops\n if (action.type === 'ASK_SLOT') {\n context.shouldStop = true;\n context.stopReason = 'follow_up';\n return context;\n }\n\n if (action.type === 'BLOCKED') {\n context.shouldStop = true;\n context.stopReason = 'blocked';\n return context;\n }\n\n if (action.type === 'OUT_OF_SCOPE') {\n context.shouldStop = true;\n context.stopReason = 'out_of_scope';\n return context;\n }\n\n // Set relevant KBs for planning\n const kbIds = (action as { kbIds: string[] }).kbIds || [];\n context.relevantKBs = kbIds\n .map(id => getKBMetaFromCatalog(id, kbCatalog))\n .filter((kb): kb is KBMeta => kb !== undefined);\n\n return next();\n };\n}\n\n/**\n * Planning middleware\n *\n * Creates an execution plan based on intent and relevant KBs.\n * Requires: intent, relevantKBs\n * Sets: plan\n */\nexport function withPlanning(): Middleware {\n return async (context, next) => {\n if (context.shouldStop) {\n return next();\n }\n\n const { intent, agentContext, relevantKBs, stepCounter, traceAdapter, frameworkContext } = context;\n\n if (!intent) {\n throw new Error('withPlanning requires intent from withDisambiguation');\n }\n\n const logger = createSessionLogger(context.sessionId);\n logger.info('Middleware: Starting planning');\n\n // Create trace step\n const planningStep: TraceStep = {\n stepId: stepCounter.next('planning'),\n stepType: 'planning',\n timestamp: '',\n description: \"Planning how to answer the user's question\",\n thought: `Creating a plan to query ${relevantKBs?.length || 0} knowledge base(s).`,\n understanding: `Goals: ${intent.goals.join(', ')}`,\n details: { intentId: intent.intentId, goals: intent.goals },\n };\n\n const { plan, updatedContext } = await createPlanFn(\n intent,\n kbCatalog,\n agentContext,\n relevantKBs || [],\n frameworkContext\n );\n\n planningStep.timestamp = new Date().toISOString();\n planningStep.details = {\n ...planningStep.details,\n plan,\n };\n context.traceSteps.push(planningStep);\n await traceAdapter.emit({ type: 'step', step: planningStep });\n\n context.agentContext = updatedContext;\n context.plan = plan;\n\n return next();\n };\n}\n\n/**\n * Execution middleware\n *\n * Executes the plan (KB calls + synthesis).\n * Requires: intent, plan\n * Sets: stepResults, answer\n */\nexport function withExecution(): Middleware {\n return async (context, next) => {\n if (context.shouldStop) {\n return next();\n }\n\n const { intent, plan, agentContext, stepCounter, frameworkContext } = context;\n\n if (!intent || !plan) {\n throw new Error('withExecution requires intent and plan from previous middleware');\n }\n\n const logger = createSessionLogger(context.sessionId);\n logger.info('Middleware: Starting execution');\n\n stepCounter.syncToContext(agentContext);\n\n const { answer, trace } = await executePlanWithContext(\n intent,\n plan,\n agentContext,\n frameworkContext\n );\n\n context.stepResults = trace.stepResults;\n context.answer = answer || undefined;\n context.agentContext = trace.context;\n context.traceSteps.push(...trace.traceSteps);\n\n return next();\n };\n}\n\n/**\n * Build the final execution trace from pipeline context\n */\nexport function buildTrace(context: PipelineContext): ExecutionTrace {\n return {\n sessionId: context.sessionId,\n intent: context.intent || {\n intentId: 'unknown',\n userUtterance: context.message,\n slots: {},\n goals: [],\n },\n plan: context.plan || { planId: '', steps: [] },\n stepResults: context.stepResults || [],\n traceSteps: context.traceSteps,\n context: context.agentContext,\n };\n}\n\n/**\n * Logging middleware - logs each phase\n */\nexport function withLogging(): Middleware {\n return async (context, next) => {\n const logger = createSessionLogger(context.sessionId);\n logger.info('Pipeline started', { message: context.message });\n\n const result = await next();\n\n logger.info('Pipeline completed', {\n shouldStop: result.shouldStop,\n hasAnswer: !!result.answer,\n });\n\n return result;\n };\n}\n\n/**\n * Error handling middleware - catches and logs errors\n */\nexport function withErrorHandling(\n onError?: (error: Error, context: PipelineContext) => void\n): Middleware {\n return async (context, next) => {\n try {\n return await next();\n } catch (error) {\n const logger = createSessionLogger(context.sessionId);\n const err = error instanceof Error ? error : new Error(String(error));\n logger.error('Pipeline error', err);\n\n if (onError) {\n onError(err, context);\n }\n\n throw error;\n }\n };\n}\n\n","/**\n * Plan Executor Mediator\n *\n * Orchestrates plan creation, execution, and adaptive modification.\n * This module breaks the potential circular dependency between planner and executor\n * by acting as a mediator layer.\n *\n * Architecture:\n * ```\n * Agent Runner\n * ā\n * ā¼\n * Plan Executor (this module)\n * ā\n * āāāāāā“āāāāā\n * ā¼ ā¼\n * Planner Executor\n * ```\n *\n * The planner and executor don't import each other directly - all coordination\n * happens through this module. This enables:\n * - Adaptive planning (modifying plans based on execution results)\n * - Clean dependency graph with no cycles\n * - Single point of control for plan lifecycle\n */\n\nimport { Plan, Intent, AgentContext, FrameworkContext, ExecutionTrace } from '../types';\nimport { plan as createPlan, modifyPlan } from '../planner';\nimport { executePlanWithContext } from '../executor';\n\n/**\n * Options for adaptive plan execution\n */\nexport interface AdaptiveExecutionOptions {\n /** Whether to attempt plan modification on failure (default: true) */\n enableAdaptivePlanning?: boolean;\n /** Maximum number of plan modification attempts (default: 1) */\n maxModificationAttempts?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<AdaptiveExecutionOptions> = {\n enableAdaptivePlanning: true,\n maxModificationAttempts: 1,\n};\n\n/**\n * Execute a plan with adaptive modification support\n *\n * This function provides intelligent plan execution with the ability to\n * modify the plan mid-execution if things don't go as expected.\n *\n * Adaptive planning scenarios:\n * 1. All KB calls fail ā Try alternative KBs if available\n * 2. Partial information ā Adjust synthesis to work with what we have\n * 3. Unexpected results ā Re-route to different KBs\n *\n * @param intent - User intent containing the original utterance and goals\n * @param plan - Initial execution plan\n * @param context - Agent context with conversation state\n * @param frameworkContext - Framework context with all providers\n * @param options - Optional adaptive execution settings\n * @returns Object containing the generated answer and execution trace\n *\n * @example\n * ```typescript\n * const { answer, trace } = await executePlanAdaptively(\n * intent,\n * plan,\n * context,\n * frameworkContext,\n * { enableAdaptivePlanning: true }\n * );\n * ```\n */\nexport async function executePlanAdaptively(\n intent: Intent,\n plan: Plan,\n context: AgentContext | undefined,\n frameworkContext: FrameworkContext,\n options?: AdaptiveExecutionOptions\n): Promise<{ answer: string; trace: ExecutionTrace }> {\n const { logger } = frameworkContext;\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n logger.info('Starting adaptive plan execution', {\n planId: plan.planId,\n stepCount: plan.steps.length,\n adaptiveEnabled: opts.enableAdaptivePlanning,\n });\n\n // Execute the initial plan\n const result = await executePlanWithContext(intent, plan, context, frameworkContext);\n\n // If adaptive planning is disabled, return the result as-is\n if (!opts.enableAdaptivePlanning) {\n return result;\n }\n\n // Check if execution suggests plan modification is needed\n const allStepsFailed = result.trace.stepResults.every(r => r.error);\n const kbCallCount = plan.steps.filter(s => s.type === 'kb_call').length;\n\n // Only attempt modification if:\n // 1. All steps failed\n // 2. There were multiple steps (single step failure isn't recoverable)\n // 3. We haven't exceeded modification attempts\n if (allStepsFailed && kbCallCount > 1) {\n logger.info('All steps failed, attempting plan modification', {\n failedSteps: result.trace.stepResults.length,\n });\n\n try {\n // Attempt to create a modified plan\n const { modifiedPlan, shouldModify, updatedContext } = await modifyPlan(\n plan,\n result.trace.stepResults.map(r => ({\n stepId: r.stepId,\n kbId: r.kbId,\n success: !r.error,\n results: r.responsePayload,\n })),\n plan.steps.filter(s => !result.trace.stepResults.some(r => r.stepId === s.id)),\n intent,\n [], // KB catalog would be passed here if needed\n context,\n frameworkContext\n );\n\n if (shouldModify && modifiedPlan.steps.length > 0) {\n logger.info('Executing modified plan', {\n originalPlanId: plan.planId,\n modifiedPlanId: modifiedPlan.planId,\n });\n\n // Execute the modified plan\n return await executePlanWithContext(\n intent,\n modifiedPlan,\n updatedContext,\n frameworkContext\n );\n }\n } catch (error) {\n logger.warn('Plan modification failed, returning original result', error);\n }\n }\n\n return result;\n}\n\n/**\n * Create and execute a plan in one step\n *\n * Convenience function that combines plan creation and execution.\n * Useful for simple cases where you don't need to inspect the plan\n * before execution.\n *\n * @param intent - User intent\n * @param kbCatalog - Available knowledge bases\n * @param context - Agent context\n * @param frameworkContext - Framework context\n * @returns Execution result with answer and trace\n */\nexport async function planAndExecute(\n intent: Intent,\n kbCatalog: any[],\n context: AgentContext | undefined,\n frameworkContext: FrameworkContext\n): Promise<{ answer: string; trace: ExecutionTrace; plan: Plan }> {\n const { logger } = frameworkContext;\n\n // Create the plan\n const { plan, updatedContext } = await createPlan(\n intent,\n kbCatalog,\n context,\n undefined, // relevantKBs - let planner decide\n frameworkContext\n );\n\n logger.info('Plan created, starting execution', {\n planId: plan.planId,\n stepCount: plan.steps.length,\n confidence: plan.confidence,\n });\n\n // Execute with adaptive support\n const result = await executePlanAdaptively(\n intent,\n plan,\n updatedContext,\n frameworkContext\n );\n\n return { ...result, plan };\n}\n\n","/**\n * Streaming Utilities for Vercel AI SDK\n *\n * Provides utilities for streaming chat responses with trace step integration.\n * These types represent the wire format for Vercel AI SDK data streams.\n * \n * Note: The wire format uses 'trace_step' while the internal TraceEvent uses 'step'.\n * The adapter handles the mapping between internal events and wire format.\n */\n\nimport { TraceStep, ExecutionTrace, TraceEvent } from '../types/core';\n\n// Re-export TraceEvent for convenience\nexport type { TraceEvent } from '../types/core';\n\n/**\n * Wire format type for Vercel AI SDK data stream annotations.\n * These match the format expected by the Vercel AI SDK client.\n */\nexport type StreamAnnotation =\n | { type: 'trace_step'; step: TraceStep }\n | { type: 'trace_complete'; trace: ExecutionTrace }\n | { type: 'session_id'; sessionId: string }\n | { type: 'follow_up'; questions: string[] };\n\n/**\n * Convert a TraceEvent to wire format StreamAnnotation\n */\nexport function traceEventToAnnotation(event: TraceEvent): StreamAnnotation {\n switch (event.type) {\n case 'step':\n return { type: 'trace_step', step: event.step };\n case 'trace_complete':\n return { type: 'trace_complete', trace: event.trace };\n case 'session_id':\n return { type: 'session_id', sessionId: event.sessionId };\n case 'follow_up':\n return { type: 'follow_up', questions: event.questions };\n }\n}\n\n/**\n * Create a trace step annotation to append to a StreamData instance\n */\nexport function createTraceStepAnnotation(step: TraceStep): StreamAnnotation {\n return { type: 'trace_step', step };\n}\n\n/**\n * Create a trace complete annotation to append to a StreamData instance\n */\nexport function createTraceCompleteAnnotation(trace: ExecutionTrace): StreamAnnotation {\n return { type: 'trace_complete', trace };\n}\n\n/**\n * Create a session ID annotation to append to a StreamData instance\n */\nexport function createSessionIdAnnotation(sessionId: string): StreamAnnotation {\n return { type: 'session_id', sessionId };\n}\n\n/**\n * Parse stream data annotation from the stream\n */\nexport function parseStreamAnnotation(data: unknown): StreamAnnotation | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n\n const obj = data as Record<string, unknown>;\n \n if (obj.type === 'trace_step' && obj.step) {\n return { type: 'trace_step', step: obj.step as TraceStep };\n }\n \n if (obj.type === 'trace_complete' && obj.trace) {\n return { type: 'trace_complete', trace: obj.trace as ExecutionTrace };\n }\n \n if (obj.type === 'session_id' && typeof obj.sessionId === 'string') {\n return { type: 'session_id', sessionId: obj.sessionId };\n }\n \n if (obj.type === 'follow_up' && Array.isArray(obj.questions)) {\n return { type: 'follow_up', questions: obj.questions as string[] };\n }\n \n return null;\n}\n","/**\n * Multi-KB Orchestration Framework\n *\n * Main entry point for the framework. Import from here for the public API.\n *\n * ## High-Level API (Recommended)\n *\n * Use `runAgent()` or `runAgentStreaming()` for simple integrations:\n *\n * @example\n * ```ts\n * import { runAgent, toNextResponse } from '@/lib';\n *\n * const result = await runAgent({ message: 'Help me with my toaster' });\n * return toNextResponse(result);\n * ```\n *\n * ## Low-Level API (Advanced)\n *\n * For custom pipelines, use the individual orchestration functions:\n *\n * @example\n * ```ts\n * import {\n * disambiguate,\n * plan,\n * executePlanWithContext,\n * kbCatalog,\n * } from '@/lib';\n * ```\n */\n\n// ============================================================================\n// HIGH-LEVEL API (Recommended)\n// ============================================================================\n\n/** Agent runners - single function to run the complete agent pipeline */\nexport { runAgent, runAgentStreaming } from './agent';\nexport type {\n AgentResult,\n AgentOutcome,\n AnswerOutcome,\n FollowUpOutcome,\n BlockedOutcome,\n OutOfScopeOutcome,\n RunAgentOptions,\n RunAgentStreamingOptions,\n StreamingAgentResult,\n Citation,\n} from './agent';\n\n/** Response builders - convert AgentResult to framework-specific responses */\nexport {\n // Next.js\n toChatResponse,\n toNextResponse,\n toNextErrorResponse,\n // Vercel AI SDK\n toVercelAIResponse,\n toVercelAIStreamingResponse,\n toVercelAISimpleResponse,\n getAnswerText,\n // Citation utilities\n extractCitationsFromTrace,\n filterCitedOnly,\n toChatCitation,\n toChatCitations,\n} from './adapters';\nexport type { VercelAIResponseOptions, StreamAnnotation as AdapterStreamAnnotation } from './adapters';\n\n/** Trace adapters - pluggable trace output for custom UIs */\nexport {\n SSETraceAdapter,\n VercelDataStreamAdapter,\n BufferingVercelDataStreamAdapter,\n NoOpTraceAdapter,\n CallbackTraceAdapter,\n createSSETraceAdapter,\n createVercelDataStreamAdapter,\n createBufferingVercelDataStreamAdapter,\n createNoOpTraceAdapter,\n createCallbackTraceAdapter,\n} from './adapters';\nexport type { TraceAdapter, DataStreamWriter } from './adapters';\n\n// ============================================================================\n// MIDDLEWARE API (Composable Pipelines)\n// ============================================================================\n\nexport {\n createPipelineContext,\n compose,\n withDisambiguation,\n withPlanning,\n withExecution,\n withLogging,\n withErrorHandling,\n buildTrace,\n} from './middleware';\nexport type {\n PipelineContext,\n Middleware,\n CreatePipelineContextOptions,\n} from './middleware';\n\n// ============================================================================\n// LOW-LEVEL API (Advanced Use Cases)\n// ============================================================================\n\n// Types - All type definitions\nexport * from './types';\n\n/** Disambiguation - extracts intent, slots, and determines next actions */\nexport { disambiguate } from './disambiguation';\nexport type { RoutingDecision, KBRoutingReason } from './disambiguation';\n\n/** Planning - generates execution plans from intents */\nexport { plan } from './planner';\n\n/** Execution - runs plans and synthesizes answers */\nexport {\n executePlanWithContext,\n executeKBCallStep,\n synthesizeAnswer,\n synthesizeAnswerStreaming,\n handleAllKBsFailed,\n summarizeSnippetReference,\n} from './executor';\nexport type { SynthesisResult, StreamingSynthesisResult } from './executor';\n\n/** Orchestration - mediates between planner and executor for adaptive planning */\nexport { executePlanAdaptively, planAndExecute } from './orchestration';\nexport type { AdaptiveExecutionOptions } from './orchestration';\n\n// ============================================================================\n// Agent Context\n// ============================================================================\nexport { createAgentContext } from './agentContext';\n\n// ============================================================================\n// KB Catalog\n// ============================================================================\nexport { kbCatalog, getKBMeta, buildKBCatalog, getKBMetaFromCatalog } from './kbCatalog';\n\n// ============================================================================\n// Composition & Registry\n// ============================================================================\nexport {\n loadCompositionRegistry,\n getKBManifests,\n getKBManifestById,\n getSlotDefinition as getSlotDefinitionFromRegistry,\n getSlotDefinitions,\n getAllCapabilities,\n getAllDomains,\n buildSlotsSchema as buildSlotsSchemaFromRegistry,\n} from './composition';\n\n// ============================================================================\n// Runtime Configuration\n// ============================================================================\nexport {\n loadConfig,\n getConfig,\n clearConfigCache,\n buildSlotsSchema,\n getSlotDefinition,\n getModel,\n getPrompt,\n getMessage,\n getSessionConfig,\n formatSlotValue,\n formatCitationLabel,\n // Runtime config (for SaaS multi-tenant use)\n setRuntimeConfig,\n getRuntimeConfig,\n} from './runtime';\n\nexport { createFrameworkContext } from './runtime';\nexport type { ContextOptions } from './runtime';\n\n// ============================================================================\n// Logging & Tracing\n// ============================================================================\nexport {\n createSessionLogger,\n subscribeToLogs,\n subscribeToTraceSteps,\n emitTraceStep,\n getSessionLogs,\n clearSessionLogs,\n} from './logger';\nexport type { LogLevel, LogEntry } from './logger';\n\nexport { StepCounter, createTraceCollector } from './providers';\n\n// ============================================================================\n// Streaming Utilities\n// ============================================================================\nexport {\n createTraceStepAnnotation,\n createTraceCompleteAnnotation,\n createSessionIdAnnotation,\n parseStreamAnnotation,\n traceEventToAnnotation,\n} from './providers';\nexport type { StreamAnnotation, TraceEvent } from './providers';\n\n// ============================================================================\n// Default LLM model IDs (introspection / tooling)\n// ============================================================================\nexport {\n DEFAULT_OPENAI_CHAT_MODEL_ID,\n resolveIntrospectionOpenAiModelId,\n resolveDefaultOpenAiChatModelId,\n resolveStrongOpenAiModelId,\n} from './config/openaiDefaults';\n\n// ============================================================================\n// Progressive Introspection\n// ============================================================================\nexport {\n progressiveIntrospect,\n initializeState,\n formulateQuestion,\n validateResponse,\n generateManifestFromState,\n SEED_OBJECTIVES,\n DEFAULT_PROGRESSIVE_CONFIG,\n} from './introspection';\n\nexport { UsageTracker } from './introspection';\nexport type {\n TokenUsage,\n UsageEntry,\n PhaseUsage,\n UsageSummary,\n UsageRecordInput,\n} from './introspection';\n\n/** Smoke-test constant to verify local linking is working. */\nexport const KAT_LINK_CHECK = '@kat/core is locally linked!' as const;\n\nexport type {\n ProgressiveIntrospectionConfig,\n ProgressiveIntrospectionOptions,\n ProgressiveIntrospectionResult,\n QuestionObjective,\n QuestionFormulationContext,\n FormulatedQuestion,\n ExpectedResponseType,\n ResponseClassification,\n RetryStrategy,\n ResponseValidation,\n IntrospectionState,\n DiscoveredCategory,\n DiscoveredEntity,\n DiscoveredRelationship,\n ConversationEntry,\n DocumentSnippet,\n ExpansionTask,\n AskResult,\n IntrospectionCallbacks,\n ComponentEvidence,\n} from './introspection';\n","/**\n * Question Formulator\n *\n * LLM-assisted question generation for progressive introspection.\n * Generates targeted questions to discover KB content and capabilities.\n */\n\nimport { generateObject } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport type {\n QuestionFormulationContext,\n FormulatedQuestion,\n QuestionObjective,\n} from './types.js';\nimport type { UsageTracker } from './usage-tracker.js';\nimport { resolveIntrospectionOpenAiModelId } from '../config/openaiDefaults.js';\n\n// Schema for question formulation\nconst FormulatedQuestionSchema = z.object({\n question: z.string(),\n rationale: z.string(),\n expectedResponseType: z.enum(['list', 'explanation', 'examples', 'boundaries', 'relationships']),\n fallbackQuestions: z.array(z.string()),\n});\n\n// Schema for batch question formulation\nconst BatchFormulatedQuestionsSchema = z.object({\n questions: z.array(z.object({\n question: z.string(),\n rationale: z.string(),\n expectedResponseType: z.enum(['list', 'explanation', 'examples', 'boundaries', 'relationships']),\n })),\n});\n\n/**\n * Objective descriptions for the LLM\n */\nconst OBJECTIVE_DESCRIPTIONS: Record<QuestionObjective, string> = {\n seed_discovery: 'Discover what KNOWLEDGE and INFORMATION this knowledge base contains - what topics, domains, and areas of expertise it covers',\n expand_category: 'Explore specific aspects of the target topic - what detailed information, concepts, and subtopics exist',\n drill_entity: 'Get detailed information about the target - specific facts, principles, rules, or examples the knowledge base knows',\n find_relationships: 'Discover how different topics and concepts connect to each other within the knowledge base',\n validate_scope: 'Understand what questions the knowledge base can and cannot answer based on its actual content',\n gather_examples: 'Collect example questions that demonstrate the knowledge base\\'s actual capabilities and expertise',\n};\n\n/**\n * First questions for each objective type - hardcoded to ensure maximum breadth\n */\nconst FIRST_QUESTIONS: Record<QuestionObjective, string> = {\n seed_discovery: 'What topics and areas of knowledge does this knowledge base cover? What are the main subjects and domains of expertise?',\n expand_category: 'What specific information does this knowledge base contain about this topic? Give me detailed examples of concepts, principles, or facts it knows.',\n drill_entity: 'What detailed information can you provide about this topic? Include specific facts, rules, principles, or examples.',\n find_relationships: 'How does this topic relate to other subjects in your knowledge base? What connections and relationships exist?',\n validate_scope: 'What types of questions CAN you answer about this area, and what types of questions are outside your knowledge?',\n gather_examples: 'Give me 10-15 example questions that demonstrate your knowledge in this area, showing the range and depth of what you know.',\n};\n\n/**\n * Fallback questions for each objective type (used when LLM formulation fails)\n */\nconst FALLBACK_QUESTIONS: Record<QuestionObjective, string> = FIRST_QUESTIONS;\n\n/**\n * Generate a targeted question using LLM assistance\n */\nexport async function formulateQuestion(\n context: QuestionFormulationContext,\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<FormulatedQuestion> {\n // For the very first question with no conversation history, use hardcoded first question\n if (context.recentQA.length === 0 && context.knownCategories.length === 0 && context.knownEntities.length === 0) {\n const baseQuestion = FIRST_QUESTIONS[context.objective];\n return {\n question: baseQuestion,\n rationale: 'Hardcoded initial broad exploratory question to discover knowledge base content',\n expectedResponseType: 'list',\n fallbackQuestions: [],\n };\n }\n\n const knownCategoriesText = context.knownCategories.length > 0\n ? context.knownCategories.join(', ')\n : 'none yet';\n\n const knownEntitiesText = context.knownEntities.length > 0\n ? context.knownEntities.slice(0, 20).join(', ') + (context.knownEntities.length > 20 ? '...' : '')\n : 'none yet';\n\n const recentQAText = context.recentQA.length > 0\n ? context.recentQA.slice(-3).map((qa) => `Q: ${qa.question}\\nA: ${qa.answer.substring(0, 800)}${qa.answer.length > 800 ? '...' : ''}`).join('\\n\\n')\n : 'No prior conversation';\n\n // Extract all previously asked questions to avoid repetition\n const allAskedQuestions = context.recentQA.map(qa => qa.question);\n const previousQuestionsText = allAskedQuestions.length > 0\n ? allAskedQuestions.slice(-10).join('\\n- ')\n : 'None';\n\n const failedApproachesText = context.failedApproaches.length > 0\n ? context.failedApproaches.join('\\n')\n : 'None';\n\n const objectiveDescription = context.target\n ? OBJECTIVE_DESCRIPTIONS[context.objective].replace('the target', `\"${context.target}\"`)\n : OBJECTIVE_DESCRIPTIONS[context.objective];\n\n const prompt = `You are introspecting a knowledge base assistant to discover what it actually knows and can explain.\n\nCRITICAL: Ask questions that reveal the assistant's actual knowledge, expertise, and understanding in specific subject areas.\n\nOBJECTIVE: ${objectiveDescription}\n${context.target ? `TARGET: ${context.target}` : ''}\n${context.parentContext ? `PARENT CONTEXT: ${context.parentContext}` : ''}\nCURRENT DEPTH: ${context.depth}\n${context.domain ? `DOMAIN HINT: ${context.domain}` : ''}\n\nWHAT WE ALREADY KNOW:\n- Topics discovered: ${knownCategoriesText}\n- Concepts discovered: ${knownEntitiesText}\n\nRECENT CONVERSATION:\n${recentQAText}\n\nPREVIOUSLY ASKED QUESTIONS (DO NOT REPEAT THESE):\n- ${previousQuestionsText}\n\nAPPROACHES THAT FAILED (got generic/evasive responses):\n${failedApproachesText}\n\nCRITICAL: Generate a NEW question that is DIFFERENT from all previously asked questions above.\n\n${context.objective === 'seed_discovery' ? `\nSPECIAL INSTRUCTIONS FOR SEED DISCOVERY:\nYou are in the INITIAL EXPLORATION phase. Ask BROAD questions to discover the FULL SCOPE of this knowledge base:\n- \"What are ALL the main topics and subject areas this knowledge base covers?\"\n- \"What different TYPES of information or documents does this contain?\"\n- \"What are the major CATEGORIES or DOMAINS of knowledge here?\"\n- \"What KINDS of questions can users ask about this knowledge base?\"\n\nIMPORTANT: Do NOT focus on specific entities yet. Cast a WIDE NET to understand overall coverage.\nEven if previous answers mentioned specific items, ask about OTHER areas not yet explored.\nBalance between:\n1. Following up on interesting discoveries (30%)\n2. Asking about completely NEW areas not yet discussed (70%)\n` : `\nGenerate a question that will:\n1. MUST reference SPECIFIC content mentioned in recent answers (actual topics, concepts, terms discovered)\n2. Drill deeper into SPECIFIC items mentioned in previous answers (not generic categories)\n3. Ask about CONCRETE facts, principles, rules, or examples that were actually mentioned\n4. Explore specific aspects of knowledge that were revealed in recent answers\n5. Use ACTUAL NAMES of topics, concepts, or entities discovered in the conversation\n6. BE COMPLETELY DIFFERENT from any previously asked question\n\nIMPORTANT: Do NOT use placeholders like \"[topic]\" or \"[specific field]\" - use ACTUAL content from the recent conversation.\n`}\n\n${context.objective === 'expand_category' ? `\nSPECIAL INSTRUCTIONS FOR CATEGORY EXPANSION:\nYour goal is to discover ALL items/entities within this category. Use INDIRECT listing questions:\n\nDISCOVERY QUESTIONS (get lists of entities):\n- \"What are ALL the specific [items/products/topics] within ${context.target}?\"\n- \"Can you LIST everything related to ${context.target}?\"\n- \"What specific names or models exist in ${context.target}?\"\n- \"Give me a COMPLETE inventory of what's covered under ${context.target}\"\n\nVARIATION QUESTIONS (understand dimensions):\n- \"What are the different TYPES or SUBCATEGORIES within ${context.target}?\"\n- \"How are items in ${context.target} organized or classified?\"\n\nIMPORTANT: The goal is to extract as many SPECIFIC NAMES as possible, not general descriptions.\nAsk for LISTS and INVENTORIES, not explanations of a single item.\n` : ''}\n\n${context.objective === 'drill_entity' ? `\nSPECIAL INSTRUCTIONS FOR ENTITY EXPLORATION:\nYour goal is to discover MORE entities and understand what questions can be asked. Use INDIRECT questions:\n\nBREADTH QUESTIONS (prioritize these - discover MORE entities):\n- \"What OTHER [similar items] are there besides ${context.target}?\"\n- \"What ALTERNATIVES or RELATED items exist in the same category as ${context.target}?\"\n- \"Compare ${context.target} to other similar items - what are their names?\"\n- \"What is the COMPLETE LIST of items like ${context.target}?\"\n\nDEPTH QUESTIONS (secondary - understand capabilities):\n- \"What are ALL the different issues or problems related to ${context.target}?\"\n- \"What maintenance or troubleshooting topics exist for ${context.target}?\"\n- \"What would a user need to know or specify when asking about ${context.target}?\"\n\nIMPORTANT: Prioritize questions that will REVEAL MORE ENTITY NAMES over drilling into one entity.\nThe goal is to build a complete catalog of what exists, not deep knowledge of one item.\n` : ''}\n\n${context.objective === 'gather_examples' ? `\nSPECIAL INSTRUCTIONS FOR GATHERING EXAMPLES:\nAsk for DIVERSE examples that reveal BREADTH of the knowledge base:\n- \"What are 10-15 DIFFERENT types of questions users typically ask?\"\n- \"What CATEGORIES of tasks can this knowledge base help with?\"\n- \"Give examples from DIFFERENT subject areas, not just one topic\"\n- \"What are the VARIOUS use cases this supports?\"\n\nIMPORTANT: Ask about VARIETY across the whole knowledge base, not just one product or topic.\nAvoid drilling into a single entity - we want to see the RANGE of capabilities.\n` : ''}\n\n${context.objective === 'validate_scope' ? `\nSPECIAL INSTRUCTIONS FOR VALIDATING SCOPE:\nAsk about the OVERALL BOUNDARIES of the knowledge base:\n- \"What types of questions are OUTSIDE your knowledge?\"\n- \"What TOPICS or AREAS does this NOT cover?\"\n- \"Give examples of questions you CANNOT answer\"\n- \"What are the LIMITATIONS of this knowledge base across ALL topics?\"\n\nIMPORTANT: Focus on overall scope boundaries, not limitations of a single product.\nWe want to understand what the ENTIRE knowledge base can and cannot do.\n` : ''}\n\nGOOD question examples:\n- \"What topics and areas of knowledge does this cover?\"\n- \"What are the main principles about [specific topic discovered]?\"\n- \"How does [concept A] relate to [concept B] that you mentioned?\"\n- \"What specific examples can you give about [discovered topic]?\"\n\nBAD question examples (avoid these):\n- \"What topics do you cover?\" (too vague if we already have topics)\n- \"Can you help with [topic]?\" (yes/no, doesn't elicit knowledge)\n- \"Tell me about...\" (too open-ended)\n\nThe question should:\n- Build on specific discoveries from recent answers\n- Ask for SPECIFIC EXAMPLES, principles, or detailed information\n- Explore relationships and connections between discovered concepts\n- Be focused on revealing actual knowledge and expertise\n\nReturn your response as JSON.`;\n\n try {\n const { object, usage } = await generateObject({\n model: openai(llmModel),\n schema: FormulatedQuestionSchema,\n prompt,\n });\n if (tracker && usage) {\n tracker.record({ step: 'formulate_question', model: llmModel, provider: 'openai', usage });\n }\n return object;\n } catch {\n // Fallback to a simple question if LLM fails\n const baseQuestion = FALLBACK_QUESTIONS[context.objective];\n const question = context.target\n ? baseQuestion.replace('this category', context.target).replace('this topic', context.target)\n : baseQuestion;\n\n return {\n question,\n rationale: 'Fallback question due to formulation error',\n expectedResponseType: context.objective === 'gather_examples' ? 'examples' : 'list',\n fallbackQuestions: [],\n };\n }\n}\n\n/**\n * Generate a batch of diverse questions for an objective\n * This ensures variety by generating multiple questions at once\n */\nexport async function formulateQuestionBatch(\n context: QuestionFormulationContext,\n batchSize: number = 5,\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<FormulatedQuestion[]> {\n const knownCategoriesText = context.knownCategories.length > 0\n ? context.knownCategories.join(', ')\n : 'none yet';\n\n const knownEntitiesText = context.knownEntities.length > 0\n ? context.knownEntities.slice(0, 20).join(', ') + (context.knownEntities.length > 20 ? '...' : '')\n : 'none yet';\n\n const recentQAText = context.recentQA.length > 0\n ? context.recentQA.slice(-3).map((qa) => `Q: ${qa.question}\\nA: ${qa.answer.substring(0, 800)}${qa.answer.length > 800 ? '...' : ''}`).join('\\n\\n')\n : 'No prior conversation';\n\n // Extract all previously asked questions to avoid repetition\n const allAskedQuestions = context.recentQA.map(qa => qa.question);\n const previousQuestionsText = allAskedQuestions.length > 0\n ? allAskedQuestions.slice(-15).join('\\n- ')\n : 'None';\n\n const objectiveDescription = context.target\n ? OBJECTIVE_DESCRIPTIONS[context.objective].replace('the target', `\"${context.target}\"`)\n : OBJECTIVE_DESCRIPTIONS[context.objective];\n\n const prompt = `You are introspecting a knowledge base assistant to discover what it actually knows and can explain.\n\nCRITICAL: Ask questions that reveal the assistant's actual knowledge, expertise, and understanding in specific subject areas.\n\nOBJECTIVE: ${objectiveDescription}\n${context.target ? `TARGET: ${context.target}` : ''}\n${context.parentContext ? `PARENT CONTEXT: ${context.parentContext}` : ''}\nCURRENT DEPTH: ${context.depth}\n${context.domain ? `DOMAIN HINT: ${context.domain}` : ''}\n\nWHAT WE ALREADY KNOW:\n- Topics discovered: ${knownCategoriesText}\n- Concepts discovered: ${knownEntitiesText}\n\nRECENT CONVERSATION:\n${recentQAText}\n\nPREVIOUSLY ASKED QUESTIONS (DO NOT REPEAT OR REPHRASE THESE):\n- ${previousQuestionsText}\n\nCRITICAL TASK: Generate ${batchSize} DIVERSE questions.\n\n${context.objective === 'seed_discovery' ? `\nSPECIAL INSTRUCTIONS FOR SEED DISCOVERY (BROAD EXPLORATION):\nYou are generating questions for INITIAL EXPLORATION. Mix of question types:\n- 2-3 questions exploring NEW AREAS not yet discussed\n- 1-2 questions following up on interesting discoveries\n\nQuestion types to include:\n- \"What other topics or subjects does this knowledge base cover besides [already discovered]?\"\n- \"What different TYPES of content or information are available?\"\n- \"What CATEGORIES of questions can this answer?\"\n- \"What are the main THEMES across all the content?\"\n\nIMPORTANT: Cast a WIDE NET. Don't tunnel into one entity - explore breadth first!\n` : `\nRULES FOR GENERATING QUESTIONS:\n1. MUST reference SPECIFIC content mentioned in the recent answers (e.g., actual document names, chapter titles, topics discovered)\n2. Are ALL COMPLETELY DIFFERENT from each other (no similar phrasings or redundant questions)\n3. Are ALL DIFFERENT from the previously asked questions above\n4. Drill deeper into SPECIFIC items mentioned in answers (not generic categories)\n5. Ask about CONCRETE details from documents that were actually mentioned\n6. Use ACTUAL NAMES of files, chapters, topics, or entities discovered in previous answers\n`}\n\n${context.objective === 'expand_category' ? `\nSPECIAL INSTRUCTIONS FOR CATEGORY EXPANSION:\nGenerate questions that DISCOVER ALL ITEMS within this category:\n- \"What are ALL the specific items/products within ${context.target}?\"\n- \"List EVERYTHING covered under ${context.target}\"\n- \"What specific names or models exist in ${context.target}?\"\n- \"What SUBCATEGORIES exist within ${context.target}?\"\n\nIMPORTANT: Extract as many SPECIFIC NAMES as possible. Ask for LISTS!\n` : ''}\n\n${context.objective === 'drill_entity' ? `\nSPECIAL INSTRUCTIONS FOR ENTITY EXPLORATION:\nGenerate questions that discover MORE entities and understand capabilities:\n- \"What OTHER items are similar to ${context.target}?\"\n- \"What ALTERNATIVES exist to ${context.target}?\"\n- \"What is the COMPLETE LIST of items like ${context.target}?\"\n- \"What different issues or problems exist for items like ${context.target}?\"\n\nIMPORTANT: Prioritize discovering MORE entity names over deep knowledge of one.\n` : ''}\n\n${context.objective === 'gather_examples' ? `\nSPECIAL INSTRUCTIONS FOR GATHERING EXAMPLES:\nGenerate questions that explore BREADTH of the knowledge base:\n- \"What are 10-15 DIFFERENT types of questions users typically ask?\"\n- \"What CATEGORIES of tasks can this knowledge base help with?\"\n- \"Give examples from DIFFERENT subject areas\"\n- \"What are the VARIOUS use cases across ALL topics?\"\n\nIMPORTANT: Ask about VARIETY, not just one product. We want breadth!\n` : ''}\n\n${context.objective === 'validate_scope' ? `\nSPECIAL INSTRUCTIONS FOR VALIDATING SCOPE:\nGenerate questions about OVERALL knowledge base boundaries:\n- \"What types of questions are OUTSIDE your knowledge?\"\n- \"What TOPICS does this NOT cover?\"\n- \"What are the LIMITATIONS across ALL subject areas?\"\n\nIMPORTANT: Focus on OVERALL scope, not single-product limitations.\n` : ''}\n\nGOOD approach - BUILD ON DISCOVERED CONTENT:\nā
If previous answer mentioned \"Mishna Peah.pdf\", ask about SPECIFIC chapters in that document\nā
If answer mentioned \"agricultural laws\", ask about SPECIFIC types of agricultural laws referenced\nā
If answer mentioned specific terms or concepts, ask where ELSE they appear in the documents\nā
If answer gave examples, ask for MORE examples or related cases from the SAME documents\n\nBAD approach - GENERIC QUESTIONS:\nā \"How do documents relate to industry standards?\" (too generic, not based on actual content)\nā \"What topics are covered in [specific field]?\" (placeholder field, not from actual discovery)\nā Asking about hypothetical content not mentioned in previous answers\n\nEach question should drill into SPECIFIC discoveries. For example:\n- If we discovered \"Mishna Peah.pdf contains laws about corner-of-field donations\":\n - Question 1: \"What specific chapters in Mishna Peah.pdf discuss the corner-of-field laws?\"\n - Question 2: \"What are the detailed obligations described in Mishna Peah.pdf regarding Pe'ah?\"\n - Question 3: \"What other agricultural laws besides Pe'ah are covered in Mishna Peah.pdf?\"\n - Question 4: \"Are there other documents besides Mishna Peah.pdf that discuss Pe'ah?\"\n - Question 5: \"What practical examples of Pe'ah application does Mishna Peah.pdf provide?\"\n\nGOOD question examples:\n- \"What topics and areas of knowledge does this knowledge base cover?\"\n- \"What are the main principles or rules about [specific topic discovered]?\"\n- \"How does [concept A] relate to [concept B]?\"\n- \"What specific examples can you give about [discovered topic]?\"\n- \"What other aspects of [topic] can you explain?\"\n\nBAD question examples (avoid these):\n- Repeating the same question with minor word changes\n- Generic questions with placeholders not filled from discoveries\n- Questions that don't build on previous answers\n\nReturn your response as JSON with an array of ${batchSize} diverse questions.`;\n\n try {\n const { object, usage } = await generateObject({\n model: openai(llmModel),\n schema: BatchFormulatedQuestionsSchema,\n prompt,\n });\n if (tracker && usage) {\n tracker.record({ step: 'formulate_question_batch', model: llmModel, provider: 'openai', usage });\n }\n\n return object.questions.map(q => ({\n ...q,\n fallbackQuestions: [],\n }));\n } catch (error) {\n // Don't log full error object - AI SDK errors can contain non-serializable structures\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error('Batch question formulation failed:', errorMsg);\n // Fallback to single question generation\n return [await formulateQuestion(context, tracker, llmModel)];\n }\n}\n\n/**\n * Seed objectives for initial discovery phase\n */\nexport const SEED_OBJECTIVES: QuestionObjective[] = [\n 'seed_discovery',\n 'gather_examples',\n 'validate_scope',\n];\n\n\n","/**\n * Response Validator\n *\n * LLM-assisted validation of assistant responses to detect generic,\n * evasive, or unhelpful responses during introspection.\n */\n\nimport { generateObject } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport type { ResponseValidation, ExpectedResponseType } from './types.js';\nimport type { UsageTracker } from './usage-tracker.js';\nimport { resolveIntrospectionOpenAiModelId } from '../config/openaiDefaults.js';\n\n// Schema for response validation\nconst ResponseValidationSchema = z.object({\n classification: z.enum(['substantive', 'generic', 'evasive', 'off_topic', 'repetitive']),\n confidence: z.number().min(0).max(1),\n isValid: z.boolean(),\n issue: z.string().optional(),\n suggestedRetryStrategy: z.enum(['rephrase', 'simplify', 'anchor_with_examples', 'try_different_angle', 'skip']).optional(),\n extractedEntities: z.array(z.string()),\n extractedCategories: z.array(z.string()),\n newInformation: z.string().optional(),\n});\n\n/**\n * Patterns that indicate a RAG system couldn't find matching documents\n */\nconst NO_RESULTS_PATTERNS = [\n /search results do not provide/i,\n /I don't have (specific )?information (about|on|regarding)/i,\n /I couldn't find (any )?(specific )?(information|documents|results)/i,\n /no relevant (information|documents|results|data)/i,\n /not (available|found) in (my|the) (knowledge|documents|database)/i,\n /I don't have access to (specific )?(information|data|documents)/i,\n /unable to find (any )?(relevant )?(information|content)/i,\n /does not contain (information|data|content) (about|on|regarding)/i,\n /cannot provide (specific )?(information|details) (about|on)/i,\n /no (specific )?(information|data|content) (is )?(available|found)/i,\n];\n\n/**\n * Patterns that indicate generic/boilerplate AI responses\n */\nconst GENERIC_PATTERNS = [\n /I('m| am) an AI|I('m| am) a language model/i,\n /I can help with|I('m| am) designed to|My purpose is/i,\n /feel free to ask/i,\n /various|many|different|multiple/i,\n /it depends/i,\n];\n\n/**\n * Validate a response from the assistant\n */\nexport async function validateResponse(\n question: string,\n response: string,\n expectedType: ExpectedResponseType,\n target: string | undefined,\n knownInformation: string[],\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<ResponseValidation> {\n // First, check for \"no results\" responses from RAG systems\n const isNoResults = NO_RESULTS_PATTERNS.some(pattern => pattern.test(response));\n\n if (isNoResults) {\n return {\n classification: 'off_topic',\n confidence: 0.95,\n isValid: false,\n issue: 'RAG system could not find matching documents for this query',\n suggestedRetryStrategy: 'try_different_angle',\n extractedEntities: [],\n extractedCategories: [],\n newInformation: undefined,\n };\n }\n\n const knownInfoText = knownInformation.length > 0\n ? knownInformation.slice(0, 30).join(', ')\n : 'Nothing yet';\n\n const prompt = `You are evaluating whether a knowledge base assistant's response to an introspection question is USEFUL or GENERIC/EVASIVE.\n\nQUESTION ASKED:\n${question}\n\nEXPECTED RESPONSE TYPE: ${expectedType}\n${target ? `WE WERE TRYING TO LEARN ABOUT: ${target}` : ''}\n\nRESPONSE RECEIVED:\n${response}\n\nWHAT WE ALREADY KNEW:\n${knownInfoText}\n\nEvaluate this response and classify it:\n\n1. SUBSTANTIVE: Contains specific, concrete information we didn't have. Lists actual entities, categories, or capabilities. Provides specific examples or details. Good for our manifest generation.\n\n2. GENERIC: Vague platitudes, boilerplate AI assistant language, capability descriptions without specifics. Examples:\n - \"I can help with many topics...\"\n - \"I have information about various subjects...\"\n - \"Feel free to ask me anything about...\"\n - Just restating what we already know\n\n3. EVASIVE: Deflects the question, gives non-committal answers, uses hedging language excessively. Examples:\n - \"It depends on what you're looking for\"\n - \"There are many possibilities...\"\n - \"I might be able to help with...\"\n\n4. OFF_TOPIC: Response doesn't address what was asked. Talks about unrelated subjects or misunderstands the question.\n\n5. REPETITIVE: Mostly repeats information we already extracted in previous questions. Doesn't add new knowledge.\n\nCRITICAL: Extract any NEW entities and categories from the response that we didn't already know.\n\nENTITY EXTRACTION RULES:\n1. ENTITIES are SPECIFIC IDENTIFIERS that distinguish individual items:\n - Named items, models, or identifiers (specific names that identify particular things)\n - Component names or part names\n - Specific concepts, terms, or named procedures\n \n2. CATEGORIES are BROAD GROUPINGS:\n - Types or classes of things\n - Topic areas or domains\n - Abstract classifications\n\nIMPORTANT: Look for STRUCTURED FIELDS in the response (common patterns like \"Model:\", \"Type:\", \"Name:\", \"ID:\") and extract:\n- Specific identifier values ā as ENTITIES\n- Type/category values ā as CATEGORIES\n\nReturn your evaluation as JSON.`;\n\n try {\n const { object, usage } = await generateObject({\n model: openai(llmModel),\n schema: ResponseValidationSchema,\n prompt,\n });\n if (tracker && usage) {\n tracker.record({ step: 'validate_response', model: llmModel, provider: 'openai', usage });\n }\n\n return object;\n } catch {\n // Fallback validation using simple heuristics\n const isGeneric = GENERIC_PATTERNS.some(pattern => pattern.test(response));\n const hasListItems = (response.match(/[-ā¢*]\\s+\\w+/g) || []).length >= 3;\n const hasSpecificTerms = response.split(/\\s+/).filter(w => w.length > 5).length > 10;\n\n return {\n classification: isGeneric && !hasListItems ? 'generic' : 'substantive',\n confidence: 0.5,\n isValid: hasListItems || hasSpecificTerms,\n extractedEntities: [],\n extractedCategories: [],\n suggestedRetryStrategy: isGeneric ? 'anchor_with_examples' : undefined,\n };\n }\n}\n\n\n\n\n\n\n\n","/**\n * Schema Inference Module\n *\n * LLM-assisted inference of manifest components from introspection conversation.\n * Analyzes discovered knowledge to extract intents, slots, capabilities, and goals.\n */\n\nimport { generateObject } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport type { IntrospectionState, SchemaExtraction, IntrospectionCallbacks, ComponentEvidence } from './types.js';\nimport type { UsageTracker } from './usage-tracker.js';\nimport { resolveIntrospectionOpenAiModelId } from '../config/openaiDefaults.js';\n\n// ============================================================================\n// SCHEMAS\n// ============================================================================\n\n/**\n * Schema for evidence citations - Q&A exchanges and document references\n */\nconst EvidenceSchema = z.object({\n reasoning: z.string(),\n qaNumbers: z.array(z.number()).optional(), // Which Q&A exchange numbers (1-indexed) support this\n answerExcerpts: z.array(z.string()).optional(), // Relevant excerpts from answers\n});\n\nconst SlotSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'boolean', 'enum']),\n required: z.boolean(),\n validation_rule: z.string().optional(),\n enumValues: z.array(z.string()).optional(),\n evidence: EvidenceSchema.optional(), // Evidence supporting this slot\n});\n\nconst SchemaExtractionSchema = z.object({\n intent: z.string(),\n slots: z.array(SlotSchema),\n is_deterministic: z.boolean(),\n reasoning: z.string().optional(), // LLM's reasoning for this specific intent extraction\n});\n\nconst SchemasExtractionSchema = z.object({\n schemas: z.array(SchemaExtractionSchema),\n reasoning: z.string().optional(), // Overall reasoning for the schema extraction process\n});\n\n/**\n * Schema for capabilities with evidence\n */\nconst CapabilityWithEvidenceSchema = z.object({\n text: z.string(),\n evidence: EvidenceSchema,\n});\n\nconst CapabilitiesExtractionSchema = z.object({\n capabilities: z.array(CapabilityWithEvidenceSchema).min(3).max(7),\n reasoning: z.string().optional(), // LLM's reasoning for how capabilities were derived\n});\n\n/**\n * Schema for goals with evidence\n */\nconst GoalWithEvidenceSchema = z.object({\n name: z.string(),\n description: z.string(),\n evidence: EvidenceSchema,\n});\n\nconst GoalsExtractionSchema = z.object({\n goals: z.array(GoalWithEvidenceSchema).min(3).max(6),\n});\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Build evidence object from extracted LLM evidence data and introspection state\n */\nfunction buildComponentEvidence(\n evidenceData: { reasoning: string; qaNumbers?: number[]; answerExcerpts?: string[] } | undefined,\n state: IntrospectionState\n): ComponentEvidence | undefined {\n if (!evidenceData) return undefined;\n\n // Build Q&A exchanges from qaNumbers\n const qaExchanges: ComponentEvidence['qaExchanges'] = [];\n if (evidenceData.qaNumbers && Array.isArray(evidenceData.qaNumbers)) {\n for (const qNum of evidenceData.qaNumbers) {\n const idx = qNum - 1; // Convert to 0-indexed\n if (idx >= 0 && idx < state.conversationHistory.length) {\n const entry = state.conversationHistory[idx];\n qaExchanges.push({\n questionNumber: qNum,\n question: entry.question,\n answerExcerpt: evidenceData.answerExcerpts?.[qaExchanges.length] || entry.answer.substring(0, 300),\n });\n }\n }\n }\n\n // Get relevant document snippets (top 3 by score)\n const documentSnippets = state.documentSnippets\n .slice(0, 3)\n .map(s => ({\n content: s.content,\n sourceFile: s.sourceFile,\n score: s.score,\n }));\n\n return {\n reasoning: evidenceData.reasoning,\n qaExchanges,\n documentSnippets,\n };\n}\n\n// ============================================================================\n// SCHEMA INFERENCE\n// ============================================================================\n\n/**\n * Infer intent schemas (intents + slots) from introspection conversation\n * Analyzes conversation history to identify common query patterns and their parameters\n */\nexport async function inferSchemasFromConversation(\n state: IntrospectionState,\n callbacks?: IntrospectionCallbacks,\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<SchemaExtraction[]> {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Processing ${state.conversationHistory.length} conversation exchanges...`);\n\n // Build context from conversation\n const conversationSummary = state.conversationHistory\n .map((entry, i) => `Q${i + 1}: ${entry.question}\\nA${i + 1}: ${entry.answer}`)\n .join('\\n\\n');\n\n const categoriesList = Array.from(state.categories.values())\n .map(c => c.name)\n .join(', ');\n\n const entitiesList = Array.from(state.entities.values())\n .slice(0, 50)\n .map(e => e.name)\n .join(', ');\n\n const exampleQuestions = state.conversationHistory\n .filter(entry => entry.question.includes('example'))\n .map(entry => entry.answer)\n .join('\\n');\n\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Analyzing ${state.categories.size} categories and ${state.entities.size} entities...`);\n\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Running LLM analysis to extract intent patterns and slot dimensions...');\n\n const prompt = `Analyze this introspection conversation to extract user intent schemas.\n\nCONVERSATION HISTORY:\n${conversationSummary.substring(0, 15000)}${conversationSummary.length > 15000 ? '...' : ''}\n\nDISCOVERED CATEGORIES: ${categoriesList || 'None'}\n\nDISCOVERED ENTITIES: ${entitiesList || 'None'}\n\nEXAMPLE QUESTIONS FROM CONVERSATION:\n${exampleQuestions.substring(0, 3000)}${exampleQuestions.length > 3000 ? '...' : ''}\n\nTASK: Extract common query patterns (intents) and their disambiguation parameters (slots).\n\nFor each intent pattern you identify:\n1. Name the intent using snake_case (e.g., \"lookup_product_specs\", \"troubleshoot_issue\", \"understand_concept\")\n2. Identify slots (parameters that disambiguate queries):\n - Slot name in snake_case (e.g., \"product_model\", \"explanation_depth\", \"topic_area\")\n - Slot type: \"string\", \"boolean\", or \"enum\"\n - For enum slots: extract possible values from discovered entities/categories\n - CRITICAL: Enum values MUST be human-readable with proper capitalization and spacing (e.g., \"Kitchen Appliances\", \"Premium Coverage\", \"In-Home Service\"), NOT snake_case. Users will see these values.\n - REQUIRED vs OPTIONAL (critical distinction):\n\n REQUIRED - Mark as required=true ONLY if:\n * The slot identifies WHICH SPECIFIC ITEM the user is asking about (product_model, document_id, chapter_name)\n * Without this slot, you CANNOT look up any relevant information\n * The KB literally has no way to answer without this parameter\n * Test: \"If user doesn't provide this, can we answer ANY version of their question?\"\n\n OPTIONAL - Mark as required=false if:\n * The slot provides CONTEXT or FILTERING (user_type, explanation_depth, format_preference)\n * The KB can provide a useful answer without it (even if less tailored)\n * The slot helps REFINE the answer but isn't essential for basic lookup\n * Test: \"Can we provide useful answer without this?\"\n\n Examples:\n - product_model: required=true (can't look up specs without knowing which product)\n - explanation_depth: required=false (can provide explanation at any depth)\n - chapter: required=true if KB is organized by chapters and user is asking about chapter content\n - topic: required=false if KB can provide general information about the subject\n3. is_deterministic: true if KB provides clear step-by-step procedures, false if it requires interpretation\n\nCRITICAL RULES:\n- Extract 2-5 distinct intent patterns (NOT more than 5)\n- Focus on the MOST COMMON query patterns from the conversation\n- Slots should represent SEMANTIC DIMENSIONS that distinguish different types of queries\n- Do NOT create slots for every discovered entity - only for dimensions that matter to users\n- Enum values should be ABSTRACT CATEGORIES, not specific instances\n- Enum values MUST be human-readable with proper capitalization (e.g., \"Standard\", \"Premium\", \"Extended\" NOT \"standard\", \"premium\", \"extended\")\n\nEVIDENCE REQUIREMENTS (CRITICAL):\nFor EACH SLOT, you MUST provide an \"evidence\" object containing:\n1. \"reasoning\": Explain WHY this slot was identified and whether it's required/optional\n2. \"qaNumbers\": Array of Q&A exchange numbers (e.g., [1, 3, 5]) that support this slot's existence\n3. \"answerExcerpts\": Brief excerpts from those answers that specifically justify this slot\n\nExample slot with evidence:\n{\n \"name\": \"tractate_name\",\n \"type\": \"string\",\n \"required\": true,\n \"evidence\": {\n \"reasoning\": \"The KB is organized by tractates and users need to specify which tractate they're asking about. Without this, we cannot look up the relevant content.\",\n \"qaNumbers\": [2, 5],\n \"answerExcerpts\": [\"The knowledge base covers tractates Peah, Demai, and Kilayim...\", \"Each tractate has distinct chapters...\"]\n }\n}\n\nREASONING REQUIREMENTS:\n- Provide a \"reasoning\" field at the top level explaining your overall approach to identifying intents and slots\n- For each schema, provide a \"reasoning\" field explaining:\n * Why this intent pattern was identified (what patterns in the conversation led to it)\n * Why each slot is marked as required vs optional (apply the tests above)\n * How enum values were determined (if applicable)\n * Why this intent is distinct from others\n\nReturn JSON with: { \"schemas\": [{ \"intent\": \"...\", \"slots\": [{ ..., \"evidence\": {...} }], \"is_deterministic\": true/false, \"reasoning\": \"...\" }], \"reasoning\": \"Overall reasoning...\" }`;\n\n const promptLength = prompt.length;\n console.log(`[Schema Inference] Prompt length: ${promptLength} characters, Conversation exchanges: ${state.conversationHistory.length}`);\n console.log('[Schema Inference] About to start LLM call...');\n\n try {\n // Use a proper timeout wrapper that cleans up\n const timeoutMs = 60000; // 60 seconds\n let timeoutId: NodeJS.Timeout | null = null;\n \n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n console.error(`[Schema Inference] Timeout triggered after ${timeoutMs}ms`);\n reject(new Error(`Schema inference timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n console.log('[Schema Inference] Creating generateObject promise...');\n const startTime = Date.now();\n \n const generatePromise = generateObject({\n model: openai(llmModel),\n schema: SchemasExtractionSchema,\n prompt,\n maxTokens: 2000, // Limit response size to prevent excessive generation\n }).then(result => {\n // Clear timeout on success\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n console.log('[Schema Inference] generateObject promise resolved');\n return result;\n }).catch(error => {\n // Clear timeout on error\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n // Don't log the full error object - it may contain non-serializable structures\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error('[Schema Inference] generateObject promise rejected:', errMsg);\n throw error;\n });\n\n console.log('[Schema Inference] Starting Promise.race with timeout...');\n\n const result = await Promise.race([generatePromise, timeoutPromise]);\n const duration = Date.now() - startTime;\n console.log(`[Schema Inference] LLM call completed successfully in ${duration}ms`);\n\n // Defensive check for result structure\n if (!result || !result.object) {\n // Don't log full result object - may contain non-serializable structures\n console.error('[Schema Inference] Invalid result structure (hasResult:', !!result, ', hasObject:', !!result?.object, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Schema inference returned invalid result structure');\n return [];\n }\n\n const { object, usage } = result;\n if (tracker && usage) {\n tracker.record({ step: 'infer_schemas', model: llmModel, provider: 'openai', usage });\n }\n\n // Defensive check for schemas array\n if (!object.schemas || !Array.isArray(object.schemas)) {\n // Don't log full object - it may contain non-serializable structures\n console.error('[Schema Inference] Invalid schemas array (schemas type:', typeof object?.schemas, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Schema inference returned invalid schemas array');\n return [];\n }\n\n // Emit overall reasoning if provided\n if (object.reasoning && typeof object.reasoning === 'string') {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `š Reasoning: ${object.reasoning}`);\n }\n\n // Log detailed results for UI\n const validSchemas = object.schemas.filter(\n s => s && typeof s === 'object' && s.intent && Array.isArray(s.slots)\n );\n if (validSchemas.length > 0) {\n const schemasSummary = validSchemas.map(s => {\n const slotNames = (Array.isArray(s.slots) ? s.slots : [])\n .filter(slot => slot && typeof slot === 'object' && (slot as { name?: unknown }).name)\n .map(slot => String((slot as { name: unknown }).name));\n return `${s.intent} (${slotNames.length} slots: ${slotNames.join(', ')})`;\n }).filter(summary => summary).join('; ');\n if (schemasSummary) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Inferred ${validSchemas.length} intent schemas: ${schemasSummary}`);\n }\n }\n\n for (const schema of object.schemas) {\n // Defensive check: ensure schema has required properties\n if (!schema || !schema.intent || !Array.isArray(schema.slots)) {\n // Don't log the full schema object - it may contain non-serializable structures\n console.warn('Invalid schema structure (has intent:', !!schema?.intent, ', has slots array:', Array.isArray(schema?.slots), ')');\n continue;\n }\n\n const requiredSlots = schema.slots.filter(s => s && s.required).map(s => s.name).filter(Boolean);\n const optionalSlots = schema.slots.filter(s => s && !s.required).map(s => s.name).filter(Boolean);\n\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` Intent: ${schema.intent} | Required: [${requiredSlots.join(', ')}] | Optional: [${optionalSlots.join(', ')}]`);\n\n // Emit per-intent reasoning if provided\n if (schema.reasoning && typeof schema.reasoning === 'string') {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `š Reasoning for \"${schema.intent}\": ${schema.reasoning}`);\n }\n\n // Log enum values if discovered\n const enumSlots = schema.slots.filter(s => s && s.type === 'enum' && s.enumValues && Array.isArray(s.enumValues) && s.enumValues.length > 0);\n for (const slot of enumSlots) {\n if (slot && slot.name && slot.enumValues) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` Enum slot \"${slot.name}\": ${slot.enumValues.join(', ')}`);\n }\n }\n\n // Log slot evidence if available\n for (const slot of schema.slots) {\n if (slot?.evidence?.reasoning) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Slot \"${slot.name}\" evidence: ${slot.evidence.reasoning}`);\n if (slot.evidence.qaNumbers && slot.evidence.qaNumbers.length > 0) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Based on: Q${slot.evidence.qaNumbers.join(', Q')}`);\n }\n }\n }\n }\n\n // Return schemas with reasoning field stripped if not a string (for compatibility)\n return object.schemas\n .filter(schema => schema && schema.intent && Array.isArray(schema.slots))\n .map(schema => {\n // Extra defensive check for schema\n if (!schema || typeof schema !== 'object') {\n // Don't log the full schema object - it may contain non-serializable structures\n console.warn('[Schema Inference] Invalid schema object (type:', typeof schema, ')');\n return null;\n }\n\n try {\n return {\n intent: String(schema.intent || ''),\n slots: (schema.slots || [])\n .filter(slot => {\n // Very defensive check - ensure slot is a valid object\n if (!slot || typeof slot !== 'object') {\n // Don't log the full slot object - it may contain non-serializable structures\n console.warn('[Schema Inference] Invalid slot object (type:', typeof slot, ')');\n return false;\n }\n return slot.name && typeof slot.name === 'string' && slot.type !== undefined;\n })\n .map(slot => {\n // Defensive mapping with explicit checks\n const mappedSlot: any = {\n name: String(slot.name),\n type: String(slot.type),\n required: Boolean(slot.required ?? false),\n };\n \n if (slot.validation_rule && typeof slot.validation_rule === 'string') {\n mappedSlot.validation_rule = slot.validation_rule;\n }\n \n if (slot.enumValues && Array.isArray(slot.enumValues)) {\n mappedSlot.enumValues = slot.enumValues.filter(v => v != null).map(v => String(v));\n }\n\n // Build evidence for this slot\n if (slot.evidence) {\n mappedSlot.evidence = buildComponentEvidence(slot.evidence, state);\n }\n \n return mappedSlot;\n }),\n is_deterministic: Boolean(schema.is_deterministic ?? false),\n // Only include reasoning if it's a valid string\n ...(schema.reasoning && typeof schema.reasoning === 'string' ? { reasoning: schema.reasoning } : {}),\n };\n } catch (error) {\n // Don't log the full error or schema object - they may contain non-serializable structures\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error('[Schema Inference] Error mapping schema:', errMsg, '(intent:', schema?.intent, ')');\n return null;\n }\n })\n .filter((schema): schema is NonNullable<typeof schema> => schema !== null);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n console.error('[Schema Inference] Failed:', errorMessage);\n if (errorStack) {\n console.error('[Schema Inference] Stack:', errorStack);\n }\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Schema inference failed: ${errorMessage}. Returning empty schemas array.`);\n return [];\n }\n}\n\n// ============================================================================\n// CAPABILITIES INFERENCE\n// ============================================================================\n\n/**\n * Capability with evidence\n */\nexport interface CapabilityWithEvidence {\n text: string;\n evidence?: ComponentEvidence;\n}\n\n/**\n * Infer capabilities from discovered knowledge\n * Generates semantically rich capability descriptions for manifest with evidence\n */\nexport async function inferCapabilities(\n state: IntrospectionState,\n callbacks?: IntrospectionCallbacks,\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<CapabilityWithEvidence[]> {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Synthesizing capability descriptions from discovered knowledge...');\n\n const categoriesList = Array.from(state.categories.values())\n .map(c => c.name)\n .join(', ');\n\n const exampleQuestions = state.exampleQuestions.join('\\n');\n\n const conversationSample = state.conversationHistory\n .slice(0, 10)\n .map(entry => `Q: ${entry.question}\\nA: ${entry.answer.substring(0, 300)}...`)\n .join('\\n\\n');\n\n const prompt = `Based on this introspection of a knowledge base, generate 3-7 SEMANTICALLY RICH capability descriptions.\n\nDISCOVERED CATEGORIES: ${categoriesList || 'None'}\n\nEXAMPLE QUESTIONS THE KB CAN ANSWER:\n${exampleQuestions.substring(0, 2000)}${exampleQuestions.length > 2000 ? '...' : ''}\n\nSAMPLE CONVERSATION:\n${conversationSample.substring(0, 3000)}\n\nTASK: Generate capability descriptions that will be used for SEMANTIC SEARCH to route user queries.\n\nCRITICAL RULES:\n1. Each capability should be a COMPLETE, DESCRIPTIVE SENTENCE (not just keywords)\n2. Focus on what the KB ACTUALLY helps users accomplish based on discovered content\n3. Use NATURAL LANGUAGE that matches how users would phrase their needs\n4. Be SPECIFIC about the domain and type of help provided\n5. Base descriptions on ACTUAL discovered categories and conversation content\n\nGOOD capability examples:\nā
\"Explain agricultural laws from the Mishna, focusing on corner-of-field donations and tithing practices\"\nā
\"Provide detailed technical specifications and troubleshooting guides for home appliances\"\nā
\"Answer questions about statistical methods, including when to use each test and how to interpret results\"\n\nBAD capability examples:\nā \"Product information\" (too generic)\nā \"Help with documents\" (not specific)\nā \"Technical support\" (no domain context)\n\nEVIDENCE REQUIREMENTS (CRITICAL):\nFor EACH capability, provide an \"evidence\" object containing:\n1. \"reasoning\": Explain WHY this capability was identified and how it maps to discovered content\n2. \"qaNumbers\": Array of Q&A exchange numbers (e.g., [1, 3, 5]) that support this capability\n3. \"answerExcerpts\": Brief excerpts from those answers that justify this capability\n\nExample capability with evidence:\n{\n \"text\": \"Explain agricultural laws from the Mishna, focusing on corner-of-field donations\",\n \"evidence\": {\n \"reasoning\": \"Multiple Q&A exchanges revealed detailed content about Peah (corner laws) and agricultural tithing practices.\",\n \"qaNumbers\": [1, 4, 7],\n \"answerExcerpts\": [\"The tractate covers laws of peah (corner of field)...\", \"Agricultural tithes are discussed in chapters 3-5...\"]\n }\n}\n\nREASONING REQUIREMENT:\n- Provide a \"reasoning\" field explaining:\n * How you analyzed the discovered categories and example questions\n * Why these specific capabilities were chosen (what makes them distinct and useful)\n * How each capability maps to actual discovered knowledge vs generic assumptions\n * Why these capabilities will be effective for semantic search routing\n\nGenerate 3-7 capabilities based on the discovered knowledge.\n\nReturn JSON with: { \"capabilities\": [{ \"text\": \"...\", \"evidence\": {...} }, ...], \"reasoning\": \"Explanation of how capabilities were derived...\" }`;\n\n try {\n // Use a proper timeout wrapper\n const timeoutMs = 60000; // 60 seconds\n let timeoutId: NodeJS.Timeout | null = null;\n \n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n console.error(`[Capabilities Inference] Timeout triggered after ${timeoutMs}ms`);\n reject(new Error(`Capabilities inference timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n console.log(`[Capabilities Inference] Prompt length: ${prompt.length} characters`);\n console.log('[Capabilities Inference] Starting LLM call with timeout...');\n const startTime = Date.now();\n\n const generatePromise = generateObject({\n model: openai(llmModel),\n schema: CapabilitiesExtractionSchema,\n prompt,\n maxTokens: 1500, // Limit response size\n }).then(result => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n return result;\n }).catch(error => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n // Don't log full error - it may contain non-serializable structures\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error('[Capabilities Inference] generateObject rejected:', errMsg);\n throw error;\n });\n\n const result = await Promise.race([generatePromise, timeoutPromise]);\n const duration = Date.now() - startTime;\n console.log(`[Capabilities Inference] LLM call completed in ${duration}ms`);\n\n if (!result || !result.object) {\n // Don't log full result - it may contain non-serializable structures\n console.error('[Capabilities Inference] Invalid result structure (hasResult:', !!result, ', hasObject:', !!result?.object, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Capabilities inference returned invalid result structure');\n return [];\n }\n\n const { object, usage } = result;\n if (tracker && usage) {\n tracker.record({ step: 'infer_capabilities', model: llmModel, provider: 'openai', usage });\n }\n\n if (!object.capabilities || !Array.isArray(object.capabilities)) {\n // Don't log full object - it may contain non-serializable structures\n console.error('[Capabilities Inference] Invalid capabilities array (type:', typeof object?.capabilities, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Capabilities inference returned invalid capabilities array');\n return [];\n }\n\n // Process capabilities with evidence\n const capabilities: CapabilityWithEvidence[] = object.capabilities\n .filter(cap => cap && typeof cap === 'object' && typeof cap.text === 'string' && cap.text.trim().length > 0)\n .map(cap => ({\n text: cap.text.trim(),\n evidence: buildComponentEvidence(cap.evidence, state),\n }));\n\n if (capabilities.length === 0) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Capabilities inference returned no valid capabilities');\n return [];\n }\n\n // Emit reasoning if provided\n if (object.reasoning && typeof object.reasoning === 'string') {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `š Reasoning: ${object.reasoning}`);\n }\n\n // Log each capability with its evidence for UI\n for (const cap of capabilities) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` Capability: ${cap.text}`);\n if (cap.evidence?.reasoning) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Evidence: ${cap.evidence.reasoning}`);\n }\n if (cap.evidence?.qaExchanges && cap.evidence.qaExchanges.length > 0) {\n const qNums = cap.evidence.qaExchanges.map(qa => `Q${qa.questionNumber}`).join(', ');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Based on: ${qNums}`);\n }\n }\n\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Extracted ${capabilities.length} capabilities with evidence`);\n\n return capabilities;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n console.error('[Capabilities Inference] Failed:', errorMessage);\n if (errorStack) {\n console.error('[Capabilities Inference] Stack:', errorStack);\n }\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Capabilities inference failed: ${errorMessage}. Returning empty array`);\n return [];\n }\n}\n\n// ============================================================================\n// GOALS INFERENCE\n// ============================================================================\n\n/**\n * Goal with evidence\n */\nexport interface GoalWithEvidence {\n name: string;\n description: string;\n evidence?: ComponentEvidence;\n}\n\n/**\n * Infer user goals from example question patterns\n * Identifies abstract user objectives that the KB helps with, with evidence\n */\nexport async function inferGoals(\n state: IntrospectionState,\n callbacks?: IntrospectionCallbacks,\n tracker?: UsageTracker,\n llmModel: string = resolveIntrospectionOpenAiModelId()\n): Promise<GoalWithEvidence[]> {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Identifying user goal patterns from example questions...');\n\n const exampleQuestions = state.exampleQuestions.join('\\n');\n\n const conversationSample = state.conversationHistory\n .filter(entry => entry.question.includes('example') || entry.question.includes('can you'))\n .map(entry => entry.answer)\n .join('\\n\\n');\n\n const prompt = `Based on example questions and conversation, identify the main USER GOALS this knowledge base helps with.\n\nEXAMPLE QUESTIONS:\n${exampleQuestions.substring(0, 3000)}${exampleQuestions.length > 3000 ? '...' : ''}\n\nRELEVANT CONVERSATION:\n${conversationSample.substring(0, 3000)}\n\nTASK: Identify 3-6 abstract USER GOALS that represent what users want to ACCOMPLISH.\n\nCRITICAL RULES:\n1. Goals should be ABSTRACT USER INTENTS, not specific actions or entities\n2. Use snake_case for goal names (e.g., \"understand_concept\", \"troubleshoot_issue\")\n3. Each goal should represent a distinct user objective\n4. Goals should align with the patterns seen in example questions\n\nGOOD GOAL EXAMPLES:\nā
\"understand_concept\" - User wants to understand a concept or theory\nā
\"troubleshoot_issue\" - User needs help diagnosing and fixing a problem\nā
\"find_examples\" - User is looking for examples or applications\nā
\"compare_options\" - User wants to compare different options or approaches\nā
\"get_instructions\" - User needs step-by-step instructions\nā
\"verify_information\" - User wants to verify or validate information\n\nBAD GOAL EXAMPLES (too specific or entity-like):\nā \"reset_password_for_user\" - too specific\nā \"fix_product_xyz789\" - contains entity\nā \"understand_john_doe\" - contains entity\n\nEVIDENCE REQUIREMENTS (CRITICAL):\nFor EACH goal, provide an \"evidence\" object containing:\n1. \"reasoning\": Explain WHY this goal was identified based on example questions and conversation\n2. \"qaNumbers\": Array of Q&A exchange numbers that show users pursuing this goal\n3. \"answerExcerpts\": Brief excerpts from answers that demonstrate this goal being addressed\n\nExample goal with evidence:\n{\n \"name\": \"understand_concept\",\n \"description\": \"User wants to understand a religious or agricultural concept in depth\",\n \"evidence\": {\n \"reasoning\": \"Multiple exchanges showed users asking 'what is...' and 'explain...' type questions about tractate concepts.\",\n \"qaNumbers\": [2, 6, 8],\n \"answerExcerpts\": [\"The concept of peah refers to...\", \"This law is explained in Mishna as...\"]\n }\n}\n\nGenerate 3-6 goals that represent what users typically want to accomplish with this KB.\n\nReturn JSON with: { \"goals\": [{\"name\": \"goal_name\", \"description\": \"...\", \"evidence\": {...}}, ...] }`;\n\n try {\n // Use a proper timeout wrapper\n const timeoutMs = 60000; // 60 seconds\n let timeoutId: NodeJS.Timeout | null = null;\n \n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n console.error(`[Goals Inference] Timeout triggered after ${timeoutMs}ms`);\n reject(new Error(`Goals inference timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n console.log(`[Goals Inference] Prompt length: ${prompt.length} characters`);\n console.log('[Goals Inference] Starting LLM call with timeout...');\n const startTime = Date.now();\n\n const generatePromise = generateObject({\n model: openai(llmModel),\n schema: GoalsExtractionSchema,\n prompt,\n maxTokens: 1000, // Limit response size\n }).then(result => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n return result;\n }).catch(error => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n // Don't log full error - it may contain non-serializable structures\n const errMsg = error instanceof Error ? error.message : String(error);\n console.error('[Goals Inference] generateObject rejected:', errMsg);\n throw error;\n });\n\n const result = await Promise.race([generatePromise, timeoutPromise]);\n const duration = Date.now() - startTime;\n console.log(`[Goals Inference] LLM call completed in ${duration}ms`);\n\n if (!result || !result.object) {\n // Don't log full result - it may contain non-serializable structures\n console.error('[Goals Inference] Invalid result structure (hasResult:', !!result, ', hasObject:', !!result?.object, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Goals inference returned invalid result structure');\n return [];\n }\n\n const { object, usage } = result;\n if (tracker && usage) {\n tracker.record({ step: 'infer_goals', model: llmModel, provider: 'openai', usage });\n }\n\n if (!object.goals || !Array.isArray(object.goals)) {\n // Don't log full object - it may contain non-serializable structures\n console.error('[Goals Inference] Invalid goals array (type:', typeof object?.goals, ')');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Goals inference returned invalid goals array');\n return [];\n }\n\n // Process goals with evidence\n const goals: GoalWithEvidence[] = object.goals\n .filter(goal =>\n goal &&\n typeof goal === 'object' &&\n typeof goal.name === 'string' &&\n goal.name.trim().length > 0 &&\n typeof goal.description === 'string' &&\n goal.description.trim().length > 0\n )\n .map(goal => ({\n name: goal.name.trim(),\n description: goal.description.trim(),\n evidence: buildComponentEvidence(goal.evidence, state),\n }));\n\n if (goals.length === 0) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n 'Goals inference returned no valid goals');\n return [];\n }\n\n // Log each goal with its evidence for UI\n for (const goal of goals) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` Goal: ${goal.name} - ${goal.description}`);\n if (goal.evidence?.reasoning) {\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Evidence: ${goal.evidence.reasoning}`);\n }\n if (goal.evidence?.qaExchanges && goal.evidence.qaExchanges.length > 0) {\n const qNums = goal.evidence.qaExchanges.map(qa => `Q${qa.questionNumber}`).join(', ');\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n ` š Based on: ${qNums}`);\n }\n }\n\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Identified ${goals.length} user goals with evidence`);\n\n return goals;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n console.error('[Goals Inference] Failed:', errorMessage);\n if (errorStack) {\n console.error('[Goals Inference] Stack:', errorStack);\n }\n callbacks?.onPhaseProgress?.('abstraction_refinement',\n `Goals inference failed: ${errorMessage}. Returning empty array`);\n return [];\n }\n}\n","/**\n * Usage Tracker\n *\n * Tracks token usage and dollar cost across all LLM calls during introspection.\n * Supports both OpenAI (generateObject) and Pinecone (assistant.chat) providers.\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface UsageEntry {\n phase: string;\n step: string;\n model: string;\n provider: 'openai' | 'pinecone';\n usage: TokenUsage;\n cost: { input: number; output: number; total: number };\n timestamp: number;\n}\n\nexport interface PhaseUsage {\n tokens: TokenUsage;\n cost: number;\n calls: number;\n}\n\nexport interface UsageSummary {\n totalTokens: TokenUsage;\n totalCost: number;\n byPhase: Record<string, PhaseUsage>;\n byProvider: Record<string, PhaseUsage>;\n entries: UsageEntry[];\n}\n\n// ============================================================================\n// PRICING\n// ============================================================================\n\ninterface ModelPricing {\n inputPer1M: number;\n outputPer1M: number;\n}\n\nconst MODEL_PRICING: Record<string, ModelPricing> = {\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.60 },\n 'gpt-4o': { inputPer1M: 2.50, outputPer1M: 10.00 },\n 'gpt-4.1-mini': { inputPer1M: 0.40, outputPer1M: 1.60 },\n 'gpt-4.1-nano': { inputPer1M: 0.10, outputPer1M: 0.40 },\n};\n\n/**\n * Pinecone assistant chat pricing is not publicly metered per-token in the\n * same way, but we track tokens for visibility. Cost is set to 0 unless\n * a custom pricing entry is registered.\n */\nconst DEFAULT_PRICING: ModelPricing = { inputPer1M: 0, outputPer1M: 0 };\n\n// ============================================================================\n// TRACKER\n// ============================================================================\n\nexport interface UsageRecordInput {\n phase?: string;\n step: string;\n model: string;\n provider: 'openai' | 'pinecone';\n usage: { promptTokens: number; completionTokens: number; totalTokens?: number };\n}\n\nexport class UsageTracker {\n private entries: UsageEntry[] = [];\n private onUpdate?: (summary: UsageSummary) => void;\n private _currentPhase = 'unknown';\n\n constructor(onUpdate?: (summary: UsageSummary) => void) {\n this.onUpdate = onUpdate;\n }\n\n /**\n * Set the current phase. Subsequent record() calls will use this phase\n * unless an explicit phase is provided.\n */\n setPhase(phase: string): void {\n this._currentPhase = phase;\n }\n\n record(input: UsageRecordInput): void {\n const phase = input.phase || this._currentPhase;\n const pricing = MODEL_PRICING[input.model] || DEFAULT_PRICING;\n const inputCost = (input.usage.promptTokens / 1_000_000) * pricing.inputPer1M;\n const outputCost = (input.usage.completionTokens / 1_000_000) * pricing.outputPer1M;\n\n this.entries.push({\n phase,\n step: input.step,\n model: input.model,\n provider: input.provider,\n usage: {\n promptTokens: input.usage.promptTokens,\n completionTokens: input.usage.completionTokens,\n totalTokens: input.usage.totalTokens ?? (input.usage.promptTokens + input.usage.completionTokens),\n },\n cost: { input: inputCost, output: outputCost, total: inputCost + outputCost },\n timestamp: Date.now(),\n });\n\n this.onUpdate?.(this.getSummary());\n }\n\n getSummary(): UsageSummary {\n const totalTokens: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n let totalCost = 0;\n const byPhase: Record<string, PhaseUsage> = {};\n const byProvider: Record<string, PhaseUsage> = {};\n\n for (const entry of this.entries) {\n totalTokens.promptTokens += entry.usage.promptTokens;\n totalTokens.completionTokens += entry.usage.completionTokens;\n totalTokens.totalTokens += entry.usage.totalTokens;\n totalCost += entry.cost.total;\n\n // Accumulate by phase\n if (!byPhase[entry.phase]) {\n byPhase[entry.phase] = { tokens: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, cost: 0, calls: 0 };\n }\n byPhase[entry.phase].tokens.promptTokens += entry.usage.promptTokens;\n byPhase[entry.phase].tokens.completionTokens += entry.usage.completionTokens;\n byPhase[entry.phase].tokens.totalTokens += entry.usage.totalTokens;\n byPhase[entry.phase].cost += entry.cost.total;\n byPhase[entry.phase].calls += 1;\n\n // Accumulate by provider\n if (!byProvider[entry.provider]) {\n byProvider[entry.provider] = { tokens: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, cost: 0, calls: 0 };\n }\n byProvider[entry.provider].tokens.promptTokens += entry.usage.promptTokens;\n byProvider[entry.provider].tokens.completionTokens += entry.usage.completionTokens;\n byProvider[entry.provider].tokens.totalTokens += entry.usage.totalTokens;\n byProvider[entry.provider].cost += entry.cost.total;\n byProvider[entry.provider].calls += 1;\n }\n\n return { totalTokens, totalCost, byPhase, byProvider, entries: [...this.entries] };\n }\n}\n","/**\n * Progressive Introspection Types\n *\n * Type definitions for the progressive introspection engine that generates\n * KB manifests by iteratively querying Pinecone assistants.\n */\n\nimport type { KBManifest } from '../types/composition.js';\nimport type { UsageSummary } from './usage-tracker.js';\n\n// ============================================================================\n// VECTOR-NATIVE DISCOVERY TYPES\n// ============================================================================\n\n/**\n * Depth levels for topology discovery\n * 0 = Global (Manifolds)\n * 1 = Manifold (Intents)\n * 2 = Intent (Slots)\n */\nexport type DiscoveryDepth = 0 | 1 | 2;\n\n/**\n * A node in the discovery topology\n */\nexport interface DiscoveryNode {\n id: string;\n name: string;\n depth: DiscoveryDepth;\n parentContext?: string;\n}\n\n/**\n * Topology extraction result for L0/L1 levels\n */\nexport interface TopologyExtraction {\n children: Array<{\n name: string;\n description: string;\n rationale: string;\n }>;\n}\n\n/**\n * Schema extraction result for L2 level\n */\nexport interface SchemaExtraction {\n intent: string;\n slots: Array<{\n name: string;\n type: string;\n required: boolean;\n validation_rule?: string;\n enumValues?: string[]; // Extracted enum values (populated during enum extraction phase)\n }>;\n is_deterministic: boolean;\n reasoning?: string; // LLM's reasoning for this specific intent extraction\n}\n\n// ============================================================================\n// CONFIGURATION\n// ============================================================================\n\n/**\n * Configuration for the progressive introspection process\n */\nexport interface ProgressiveIntrospectionConfig {\n /** Maximum depth to drill down into categories/entities (default: 3) */\n maxDepth: number;\n /** Maximum expansions per discovered entity (default: 5) */\n maxBranchFactor: number;\n /** Minimum new entities needed to continue drilling (default: 2) */\n expansionThreshold: number;\n /** Total question budget cap (default: 50) */\n maxTotalQuestions: number;\n /** Maximum retries per question when getting generic responses (default: 3) */\n maxRetries: number;\n /** Minimum confidence threshold to accept a response (default: 0.4) */\n minConfidenceThreshold: number;\n /**\n * OpenAI model id for introspection LLM calls.\n * Override via config, or env: `KBS_INTROSPECTION_MODEL`, `KBS_DEFAULT_OPENAI_MODEL`, `OPENAI_DEFAULT_CHAT_MODEL`.\n */\n llmModel: string;\n}\n\n/**\n * Default configuration for progressive introspection\n */\nexport const DEFAULT_PROGRESSIVE_CONFIG: ProgressiveIntrospectionConfig = {\n maxDepth: 3,\n maxBranchFactor: 5,\n expansionThreshold: 2,\n maxTotalQuestions: 50,\n maxRetries: 3,\n minConfidenceThreshold: 0.4,\n llmModel: 'gpt-4o-mini',\n};\n\n// ============================================================================\n// QUESTION FORMULATION\n// ============================================================================\n\n/**\n * Objective types for question formulation\n */\nexport type QuestionObjective =\n | 'seed_discovery'\n | 'expand_category'\n | 'drill_entity'\n | 'find_relationships'\n | 'validate_scope'\n | 'gather_examples';\n\n/**\n * Context provided to the question formulator\n */\nexport interface QuestionFormulationContext {\n /** What we're trying to discover */\n objective: QuestionObjective;\n /** The specific category/entity we're exploring (if applicable) */\n target?: string;\n /** Parent context for hierarchical drilling */\n parentContext?: string;\n /** Current depth in the exploration tree */\n depth: number;\n /** What we already know (to avoid redundant questions) */\n knownEntities: string[];\n knownCategories: string[];\n /** Recent conversation history for context */\n recentQA: { question: string; answer: string }[];\n /** Questions that got generic/evasive responses */\n failedApproaches: string[];\n /** Domain hint if available */\n domain?: string;\n}\n\n/**\n * Expected response type from a question\n */\nexport type ExpectedResponseType = 'list' | 'explanation' | 'examples' | 'boundaries' | 'relationships';\n\n/**\n * Output from the question formulator\n */\nexport interface FormulatedQuestion {\n /** The actual question to ask */\n question: string;\n /** Why this question should work */\n rationale: string;\n /** What kind of response we expect */\n expectedResponseType: ExpectedResponseType;\n /** Alternative questions if this one fails */\n fallbackQuestions: string[];\n}\n\n// ============================================================================\n// RESPONSE VALIDATION\n// ============================================================================\n\n/**\n * Classification of a response from the validator\n */\nexport type ResponseClassification = 'substantive' | 'generic' | 'evasive' | 'off_topic' | 'repetitive';\n\n/**\n * Suggested strategy when a response isn't valid\n */\nexport type RetryStrategy = 'rephrase' | 'simplify' | 'anchor_with_examples' | 'try_different_angle' | 'skip';\n\n/**\n * Output from the response validator\n */\nexport interface ResponseValidation {\n /** Whether the response is useful */\n isValid: boolean;\n /** Classification of the response */\n classification: ResponseClassification;\n /** Confidence in the classification (0-1) */\n confidence: number;\n /** What's wrong if not valid */\n issue?: string;\n /** Suggested approach for retry */\n suggestedRetryStrategy?: RetryStrategy;\n /** New entities extracted from the response */\n extractedEntities: string[];\n /** New categories extracted from the response */\n extractedCategories: string[];\n /** Summary of what we learned */\n newInformation?: string;\n}\n\n// ============================================================================\n// EXPANSION TASKS\n// ============================================================================\n\n/**\n * A task in the expansion queue\n */\nexport interface ExpansionTask {\n type: 'category' | 'entity' | 'relationship' | 'examples';\n target: string;\n depth: number;\n parentContext?: string;\n context: { question: string; answer: string }[];\n}\n\n// ============================================================================\n// INTROSPECTION STATE\n// ============================================================================\n\n/**\n * Category discovered during introspection\n */\nexport interface DiscoveredCategory {\n name: string;\n depth: number;\n parent?: string;\n children: string[];\n entities: string[];\n explored: boolean;\n}\n\n/**\n * Entity discovered during introspection\n */\nexport interface DiscoveredEntity {\n name: string;\n category?: string;\n depth: number;\n relatedEntities: string[];\n explored: boolean;\n}\n\n/**\n * Relationship between entities\n */\nexport interface DiscoveredRelationship {\n from: string;\n to: string;\n type: string;\n}\n\n/**\n * A single conversation exchange with validation\n */\nexport interface ConversationEntry {\n question: string;\n answer: string;\n validation?: ResponseValidation;\n}\n\n/**\n * Document snippet from Context API\n */\nexport interface DocumentSnippet {\n content: string;\n score: number;\n sourceFile: string;\n}\n\n/**\n * Evidence supporting a manifest component decision.\n * Contains the LLM's reasoning plus citations to source material.\n */\nexport interface ComponentEvidence {\n /** LLM explanation of why this component exists */\n reasoning: string;\n /** Actual KB content (document snippets) that informed this decision */\n documentSnippets: Array<{\n content: string;\n sourceFile: string;\n score: number;\n }>;\n /** Q&A exchanges that surfaced the evidence during introspection */\n qaExchanges: Array<{\n questionNumber: number;\n question: string;\n answerExcerpt: string;\n }>;\n}\n\n/**\n * State of the progressive introspection process\n */\nexport interface IntrospectionState {\n /** Discovered categories with their exploration status */\n categories: Map<string, DiscoveredCategory>;\n /** Discovered entities */\n entities: Map<string, DiscoveredEntity>;\n /** Discovered relationships between entities */\n relationships: DiscoveredRelationship[];\n /** Full conversation history */\n conversationHistory: ConversationEntry[];\n /** Queue of tasks to process */\n expansionQueue: ExpansionTask[];\n /** Total questions asked */\n questionsAsked: number;\n /** Capabilities discovered (with optional evidence) */\n capabilities: Array<{ text: string; evidence?: ComponentEvidence }>;\n /** Scope information */\n scopeInfo: {\n inScope: string[];\n outOfScope: string[];\n };\n /** Example questions discovered */\n exampleQuestions: string[];\n /** Source files discovered from context API */\n sourceFiles: Set<string>;\n /** Raw snippets from documents (actual content) */\n documentSnippets: DocumentSnippet[];\n /** Extracted schemas from L2 discovery (intents with slots) */\n extractedSchemas?: SchemaExtraction[];\n}\n\n// ============================================================================\n// ASK AND VALIDATE RESULT\n// ============================================================================\n\n/**\n * Result from asking a question and validating the response\n */\nexport interface AskResult {\n success: boolean;\n question: string;\n response?: string;\n validation?: ResponseValidation;\n attempts: number;\n failedApproaches: string[];\n /** Raw snippets from context API (actual document content) */\n snippets?: Array<{\n content: string;\n score: number;\n reference: unknown;\n }>;\n /** Source files discovered */\n sourceFiles?: string[];\n}\n\n// ============================================================================\n// CALLBACKS FOR PROGRESS REPORTING\n// ============================================================================\n\n/**\n * Callbacks for reporting introspection progress.\n * Used by CLI and SaaS to provide their own presentation layer.\n */\nexport interface IntrospectionCallbacks {\n /** Called when a new phase starts */\n onPhaseStart?: (phase: 'seed_discovery' | 'entity_expansion' | 'relationship_discovery' | 'abstraction_refinement' | 'enum_extraction' | 'manifest_generation', assistantName: string) => void;\n /** Called with phase progress updates */\n onPhaseProgress?: (phase: string, message: string) => void;\n /** Called when a question is being asked */\n onQuestion?: (questionNum: number, totalBudget: number, question: string, objective: QuestionObjective) => void;\n /** Called when an answer is received */\n onAnswer?: (questionNum: number, answer: string) => void;\n /** Called when a response is validated */\n onValidation?: (questionNum: number, validation: ResponseValidation) => void;\n /** Called when entities/categories are discovered */\n onDiscovery?: (categories: number, entities: number, sourceFiles: number) => void;\n /** Called when a step in manifest generation completes */\n onManifestStep?: (step: number, totalSteps: number, description: string) => void;\n /** Called on error */\n onError?: (assistantName: string, error: string) => void;\n /** Called when introspection completes for an assistant */\n onComplete?: (assistantName: string, manifest: KBManifest) => void;\n /** Called when LLM usage is recorded (fires after each LLM call) */\n onUsageUpdate?: (summary: UsageSummary) => void;\n}\n\n// ============================================================================\n// INTROSPECTION OPTIONS\n// ============================================================================\n\n/**\n * Options for running progressive introspection\n */\nexport interface ProgressiveIntrospectionOptions {\n /** Pinecone assistant name to introspect */\n assistantName: string;\n /** KB ID for the generated manifest (defaults to assistant name) */\n kbId?: string;\n /** Domain hint (will be inferred if not provided) */\n domain?: string;\n /** Progressive introspection configuration */\n config?: Partial<ProgressiveIntrospectionConfig>;\n /** Callbacks for progress reporting */\n callbacks?: IntrospectionCallbacks;\n /** Pinecone API key (uses env var if not provided) */\n pineconeApiKey?: string;\n /** OpenAI API key (uses env var if not provided) */\n openaiApiKey?: string;\n}\n\n/**\n * Result from progressive introspection\n */\nexport interface ProgressiveIntrospectionResult {\n /** Generated manifest */\n manifest: KBManifest;\n /** Introspection state with all discovered information */\n state: IntrospectionState;\n /** Summary statistics */\n stats: {\n questionsAsked: number;\n categoriesDiscovered: number;\n entitiesDiscovered: number;\n sourceFilesFound: number;\n documentSnippetsCaptured: number;\n /** LLM token usage and cost breakdown */\n usage?: UsageSummary;\n };\n}\n\n\n","/**\n * Progressive Introspection Engine\n *\n * Core orchestrator for the 4-phase progressive introspection process:\n * 1. Seed Discovery - Initial exploration of KB content\n * 2. Entity Expansion - Drill down into discovered categories/entities\n * 3. Relationship Discovery - Find connections between entities\n * 4. Manifest Inference - Extract intents, slots, capabilities from conversation\n */\n\nimport { Pinecone, type Assistant, type ChatModel, type ContextModel } from '@pinecone-database/pinecone';\nimport { formulateQuestion, formulateQuestionBatch, SEED_OBJECTIVES } from './question-formulator.js';\nimport { validateResponse } from './response-validator.js';\nimport { inferSchemasFromConversation, inferCapabilities } from './schema-inference.js';\nimport { UsageTracker } from './usage-tracker.js';\nimport type {\n ProgressiveIntrospectionConfig,\n ProgressiveIntrospectionOptions,\n ProgressiveIntrospectionResult,\n IntrospectionState,\n IntrospectionCallbacks,\n QuestionFormulationContext,\n AskResult,\n ExpansionTask,\n QuestionObjective,\n} from './types.js';\nimport { DEFAULT_PROGRESSIVE_CONFIG as defaultConfig } from './types.js';\nimport { resolveIntrospectionOpenAiModelId } from '../config/openaiDefaults.js';\n\n// ============================================================================\n// STATE INITIALIZATION\n// ============================================================================\n\n/**\n * Initialize a fresh introspection state\n */\nexport function initializeState(): IntrospectionState {\n return {\n categories: new Map(),\n entities: new Map(),\n relationships: [],\n conversationHistory: [],\n expansionQueue: [],\n questionsAsked: 0,\n capabilities: [],\n scopeInfo: {\n inScope: [],\n outOfScope: [],\n },\n exampleQuestions: [],\n sourceFiles: new Set(),\n documentSnippets: [],\n };\n}\n\n// ============================================================================\n// CONTEXT API QUERY\n// ============================================================================\n\n/**\n * Query using the Context API to get raw document snippets.\n * This gives us actual indexed content without LLM hallucination.\n */\nasync function queryContext(\n assistant: Assistant,\n query: string,\n topK: number = 20\n): Promise<{ snippets: Array<{ content: string; score: number; reference: unknown }>; sourceFiles: string[] }> {\n const contextResult: ContextModel = await assistant.context({\n query,\n topK,\n });\n\n const snippets = contextResult.snippets || [];\n\n // Extract unique source files from references\n const sourceFilesSet = new Set<string>();\n for (const snippet of snippets) {\n const ref = snippet.reference as Record<string, unknown>;\n if (ref?.file && typeof ref.file === 'object' && (ref.file as Record<string, unknown>)?.name) {\n sourceFilesSet.add((ref.file as Record<string, unknown>).name as string);\n } else if (ref?.name && typeof ref.name === 'string') {\n sourceFilesSet.add(ref.name);\n }\n }\n const sourceFiles = Array.from(sourceFilesSet);\n\n return { snippets, sourceFiles };\n}\n\n// ============================================================================\n// ASK AND VALIDATE (Core Question Loop)\n// ============================================================================\n\n/**\n * Ask a question, get response, and validate it with retry logic\n */\nasync function askAndValidate(\n assistant: Assistant,\n context: QuestionFormulationContext,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n questionNum?: number,\n totalBudget?: number,\n tracker?: UsageTracker\n): Promise<AskResult> {\n let attempts = 0;\n const failedApproaches: string[] = [...context.failedApproaches];\n let currentContext = { ...context };\n\n while (attempts < config.maxRetries) {\n attempts++;\n\n // Step 1: Formulate question (LLM-assisted)\n const formulated = await formulateQuestion(currentContext, tracker, config.llmModel);\n\n // Emit question callback with the ACTUAL question text\n if (questionNum !== undefined && totalBudget !== undefined) {\n callbacks?.onQuestion?.(questionNum, totalBudget, formulated.question, context.objective);\n }\n\n // Step 2a: First use Context API to get raw document snippets (no hallucination)\n let contextSnippets: Array<{ content: string; score: number; reference: unknown }> = [];\n let sourceFiles: string[] = [];\n\n try {\n const contextResult = await queryContext(assistant, formulated.question);\n contextSnippets = contextResult.snippets;\n sourceFiles = contextResult.sourceFiles;\n } catch {\n // Context API failed, continue with Chat API only\n }\n\n // Step 2b: Use Chat API to get synthesized response\n let response: string;\n try {\n const result: ChatModel = await assistant.chat({\n messages: [\n { role: 'user' as const, content: formulated.question },\n ],\n });\n\n response = result.message?.content || 'No response received';\n\n if (tracker && (result as any).usage) {\n const chatUsage = (result as any).usage;\n tracker.record({\n step: 'pinecone_chat',\n model: 'pinecone-assistant',\n provider: 'pinecone',\n usage: {\n promptTokens: chatUsage.promptTokens ?? chatUsage.prompt_tokens ?? 0,\n completionTokens: chatUsage.completionTokens ?? chatUsage.completion_tokens ?? 0,\n },\n });\n }\n } catch (error) {\n return {\n success: false,\n question: formulated.question,\n attempts,\n failedApproaches,\n };\n }\n\n // Emit answer callback\n if (questionNum !== undefined) {\n callbacks?.onAnswer?.(questionNum, response);\n }\n\n // Step 3: Validate response\n const validation = await validateResponse(\n formulated.question,\n response,\n formulated.expectedResponseType,\n context.target,\n [...context.knownEntities, ...context.knownCategories],\n tracker,\n config.llmModel\n );\n\n // Emit validation callback\n if (questionNum !== undefined) {\n callbacks?.onValidation?.(questionNum, validation);\n }\n\n // If valid or confidence is acceptable, return success\n if (validation.isValid || validation.confidence >= config.minConfidenceThreshold) {\n return {\n success: true,\n question: formulated.question,\n response,\n validation,\n attempts,\n failedApproaches,\n snippets: contextSnippets,\n sourceFiles,\n };\n }\n\n // If not valid and we should retry, update context with failed approach\n failedApproaches.push(formulated.question);\n currentContext = {\n ...currentContext,\n failedApproaches,\n };\n }\n\n // Exhausted retries\n return {\n success: false,\n question: 'Failed to get valid response',\n attempts,\n failedApproaches,\n };\n}\n\n// ============================================================================\n// PHASE 1: SEED DISCOVERY\n// ============================================================================\n\n/**\n * Phase 1: Initial seed questions to discover categories/entities\n * Starts with 1-2 broad exploratory questions, then batches questions to explore facets\n */\nasync function seedDiscovery(\n assistant: Assistant,\n state: IntrospectionState,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n domain?: string,\n tracker?: UsageTracker\n): Promise<void> {\n callbacks?.onPhaseStart?.('seed_discovery', '');\n\n for (const objective of SEED_OBJECTIVES) {\n if (state.questionsAsked >= config.maxTotalQuestions) break;\n\n const context: QuestionFormulationContext = {\n objective,\n depth: 0,\n knownEntities: Array.from(state.entities.keys()),\n knownCategories: Array.from(state.categories.keys()),\n recentQA: state.conversationHistory.slice(-10).map((c) => ({\n question: c.question,\n answer: c.answer,\n })),\n failedApproaches: [],\n domain,\n };\n\n // Determine batch size based on how much we've discovered\n // First few questions: ask 1-2 broad questions to establish breadth\n // After we have foundation: batch 5 questions to explore different facets\n const hasFoundation = state.conversationHistory.length >= 2 || state.categories.size > 0;\n const questionsPerObjective = hasFoundation\n ? Math.min(5, Math.floor(config.maxTotalQuestions / SEED_OBJECTIVES.length))\n : 1; // Just 1 broad question to start\n\n const remainingBudget = config.maxTotalQuestions - state.questionsAsked;\n const batchSize = Math.min(questionsPerObjective, remainingBudget);\n\n if (batchSize <= 0) break;\n\n const questionBatch = hasFoundation\n ? await (async () => {\n callbacks?.onPhaseProgress?.('seed_discovery', `Generating ${batchSize} diverse questions to explore ${objective}...`);\n return formulateQuestionBatch(context, batchSize, tracker, config.llmModel);\n })()\n : await (async () => {\n callbacks?.onPhaseProgress?.('seed_discovery', `Asking exploratory question for ${objective}...`);\n const single = await formulateQuestion(context, tracker, config.llmModel);\n return [single];\n })();\n\n // Ask each question in the batch\n for (const formulated of questionBatch) {\n if (state.questionsAsked >= config.maxTotalQuestions) break;\n\n state.questionsAsked++;\n\n // Emit question callback\n callbacks?.onQuestion?.(state.questionsAsked, config.maxTotalQuestions, formulated.question, context.objective);\n\n // Update context with fresh conversation history for validation\n const freshContext = {\n ...context,\n recentQA: state.conversationHistory.slice(-10).map((c) => ({\n question: c.question,\n answer: c.answer,\n })),\n };\n\n // Ask and validate using the pre-formulated question\n const result = await askWithFormulatedQuestion(\n assistant,\n formulated,\n freshContext,\n config,\n callbacks,\n state.questionsAsked,\n tracker\n );\n\n if (result.success && result.response && result.validation) {\n // Store conversation entry\n state.conversationHistory.push({\n question: result.question,\n answer: result.response,\n validation: result.validation,\n });\n\n // Extract and store new entities/categories\n for (const entity of result.validation.extractedEntities) {\n const key = entity.toLowerCase();\n if (!state.entities.has(key)) {\n state.entities.set(key, {\n name: entity,\n depth: 1,\n relatedEntities: [],\n explored: false,\n });\n }\n }\n\n for (const category of result.validation.extractedCategories) {\n const key = category.toLowerCase();\n if (!state.categories.has(key)) {\n state.categories.set(key, {\n name: category,\n depth: 1,\n parent: undefined,\n children: [],\n entities: [],\n explored: false,\n });\n }\n }\n\n // Store source files from context API\n if (result.sourceFiles) {\n for (const file of result.sourceFiles) {\n state.sourceFiles.add(file);\n }\n }\n\n // Store raw document snippets\n if (result.snippets) {\n for (const snippet of result.snippets) {\n const ref = snippet.reference as Record<string, unknown>;\n const sourceFile =\n (ref?.file as Record<string, unknown>)?.name ||\n ref?.name ||\n 'unknown';\n state.documentSnippets.push({\n content: snippet.content,\n score: snippet.score,\n sourceFile: sourceFile as string,\n });\n }\n }\n\n // Emit discovery callback\n callbacks?.onDiscovery?.(\n state.categories.size,\n state.entities.size,\n state.sourceFiles.size\n );\n }\n }\n }\n}\n\n/**\n * Ask a pre-formulated question and validate the response\n * Similar to askAndValidate but uses a pre-generated question\n */\nasync function askWithFormulatedQuestion(\n assistant: Assistant,\n formulated: { question: string; expectedResponseType: any },\n context: QuestionFormulationContext,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n questionNum?: number,\n tracker?: UsageTracker\n): Promise<AskResult> {\n // Step 1: Use Context API to get raw document snippets\n let contextSnippets: Array<{ content: string; score: number; reference: unknown }> = [];\n let sourceFiles: string[] = [];\n\n try {\n const contextResult = await queryContext(assistant, formulated.question);\n contextSnippets = contextResult.snippets;\n sourceFiles = contextResult.sourceFiles;\n } catch {\n // Context API failed, continue with Chat API only\n }\n\n // Step 2: Use Chat API to get synthesized response\n let response: string;\n try {\n const result: ChatModel = await assistant.chat({\n messages: [\n { role: 'user' as const, content: formulated.question },\n ],\n });\n\n response = result.message?.content || 'No response received';\n\n if (tracker && (result as any).usage) {\n const chatUsage = (result as any).usage;\n tracker.record({\n step: 'pinecone_chat',\n model: 'pinecone-assistant',\n provider: 'pinecone',\n usage: {\n promptTokens: chatUsage.promptTokens ?? chatUsage.prompt_tokens ?? 0,\n completionTokens: chatUsage.completionTokens ?? chatUsage.completion_tokens ?? 0,\n },\n });\n }\n } catch (error) {\n return {\n success: false,\n question: formulated.question,\n attempts: 1,\n failedApproaches: [],\n };\n }\n\n // Emit answer callback\n if (questionNum !== undefined) {\n callbacks?.onAnswer?.(questionNum, response);\n }\n\n // Step 3: Validate response\n const validation = await validateResponse(\n formulated.question,\n response,\n formulated.expectedResponseType,\n context.target,\n [...context.knownEntities, ...context.knownCategories],\n tracker,\n config.llmModel\n );\n\n // Emit validation callback\n if (questionNum !== undefined) {\n callbacks?.onValidation?.(questionNum, validation);\n }\n\n // If valid or confidence is acceptable, return success\n if (validation.isValid || validation.confidence >= config.minConfidenceThreshold) {\n return {\n success: true,\n question: formulated.question,\n response,\n validation,\n attempts: 1,\n failedApproaches: [],\n snippets: contextSnippets,\n sourceFiles,\n };\n }\n\n // Response not valid\n return {\n success: false,\n question: formulated.question,\n response,\n validation,\n attempts: 1,\n failedApproaches: [formulated.question],\n snippets: contextSnippets,\n sourceFiles,\n };\n}\n\n// ============================================================================\n// PHASE 2: ENTITY EXPANSION\n// ============================================================================\n\n/**\n * Phase 2: Drill into promising categories/entities\n */\nasync function entityExpansion(\n assistant: Assistant,\n state: IntrospectionState,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n domain?: string,\n tracker?: UsageTracker\n): Promise<void> {\n callbacks?.onPhaseStart?.('entity_expansion', '');\n\n // Build expansion queue from seed discoveries\n const expansionQueue: ExpansionTask[] = [];\n\n // Add categories for expansion\n for (const category of state.categories.values()) {\n if (!category.explored && category.depth <= config.maxDepth) {\n expansionQueue.push({\n type: 'category',\n target: category.name,\n depth: category.depth,\n context: [], // Will use fresh conversation history when processing\n });\n }\n }\n\n // Add entities for expansion (prioritize unexplored ones)\n for (const entity of state.entities.values()) {\n if (!entity.explored && entity.depth <= config.maxDepth) {\n expansionQueue.push({\n type: 'entity',\n target: entity.name,\n depth: entity.depth,\n parentContext: entity.category,\n context: [], // Will use fresh conversation history when processing\n });\n }\n }\n\n // Process expansion queue\n for (const task of expansionQueue) {\n if (state.questionsAsked >= config.maxTotalQuestions) break;\n\n const objective: QuestionObjective =\n task.type === 'category' ? 'expand_category' : 'drill_entity';\n\n const context: QuestionFormulationContext = {\n objective,\n target: task.target,\n parentContext: task.parentContext,\n depth: task.depth,\n knownEntities: Array.from(state.entities.keys()),\n knownCategories: Array.from(state.categories.keys()),\n recentQA: state.conversationHistory.slice(-10).map((c) => ({\n question: c.question,\n answer: c.answer,\n })),\n failedApproaches: [],\n domain,\n };\n\n state.questionsAsked++;\n const result = await askAndValidate(\n assistant,\n context,\n config,\n callbacks,\n state.questionsAsked,\n config.maxTotalQuestions,\n tracker\n );\n\n if (result.success && result.response && result.validation) {\n // Store conversation\n state.conversationHistory.push({\n question: result.question,\n answer: result.response,\n validation: result.validation,\n });\n\n // Extract new entities/categories\n const newEntitiesCount = result.validation.extractedEntities.length;\n for (const entity of result.validation.extractedEntities) {\n const key = entity.toLowerCase();\n if (!state.entities.has(key)) {\n state.entities.set(key, {\n name: entity,\n category: task.type === 'category' ? task.target : task.parentContext,\n depth: task.depth + 1,\n relatedEntities: [],\n explored: false,\n });\n }\n }\n\n for (const category of result.validation.extractedCategories) {\n const key = category.toLowerCase();\n if (!state.categories.has(key)) {\n state.categories.set(key, {\n name: category,\n depth: task.depth + 1,\n parent: task.type === 'category' ? task.target : undefined,\n children: [],\n entities: [],\n explored: false,\n });\n }\n }\n\n // Mark task as explored\n if (task.type === 'category') {\n const cat = state.categories.get(task.target.toLowerCase());\n if (cat) cat.explored = true;\n } else {\n const ent = state.entities.get(task.target.toLowerCase());\n if (ent) ent.explored = true;\n }\n\n // Store source files from context API\n if (result.sourceFiles) {\n for (const file of result.sourceFiles) {\n state.sourceFiles.add(file);\n }\n }\n\n // Store raw document snippets\n if (result.snippets) {\n for (const snippet of result.snippets) {\n const ref = snippet.reference as Record<string, unknown>;\n const sourceFile =\n (ref?.file as Record<string, unknown>)?.name ||\n ref?.name ||\n 'unknown';\n state.documentSnippets.push({\n content: snippet.content,\n score: snippet.score,\n sourceFile: sourceFile as string,\n });\n }\n }\n\n // Emit discovery callback\n callbacks?.onDiscovery?.(\n state.categories.size,\n state.entities.size,\n state.sourceFiles.size\n );\n\n // If we didn't discover enough new entities, stop drilling into this branch\n if (newEntitiesCount < config.expansionThreshold) {\n callbacks?.onPhaseProgress?.(\n 'entity_expansion',\n `Low yield for \"${task.target}\", stopping this branch`\n );\n }\n }\n }\n}\n\n// ============================================================================\n// PHASE 3: RELATIONSHIP DISCOVERY\n// ============================================================================\n\n/**\n * Phase 3: Discover relationships between entities\n */\nasync function relationshipDiscovery(\n assistant: Assistant,\n state: IntrospectionState,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n domain?: string,\n tracker?: UsageTracker\n): Promise<void> {\n callbacks?.onPhaseStart?.('relationship_discovery', '');\n\n // Sample entities for relationship discovery (don't need to check every pair)\n const entityList = Array.from(state.entities.values());\n const sampleSize = Math.min(10, entityList.length);\n const sampledEntities = entityList.slice(0, sampleSize);\n\n for (let i = 0; i < sampledEntities.length && state.questionsAsked < config.maxTotalQuestions; i++) {\n const entity = sampledEntities[i];\n\n const context: QuestionFormulationContext = {\n objective: 'find_relationships',\n target: entity.name,\n depth: 2,\n knownEntities: Array.from(state.entities.keys()),\n knownCategories: Array.from(state.categories.keys()),\n recentQA: state.conversationHistory.slice(-10).map((c) => ({\n question: c.question,\n answer: c.answer,\n })),\n failedApproaches: [],\n domain,\n };\n\n state.questionsAsked++;\n const result = await askAndValidate(\n assistant,\n context,\n config,\n callbacks,\n state.questionsAsked,\n config.maxTotalQuestions,\n tracker\n );\n\n if (result.success && result.response && result.validation) {\n state.conversationHistory.push({\n question: result.question,\n answer: result.response,\n validation: result.validation,\n });\n\n // Store source files\n if (result.sourceFiles) {\n for (const file of result.sourceFiles) {\n state.sourceFiles.add(file);\n }\n }\n\n // Store raw document snippets\n if (result.snippets) {\n for (const snippet of result.snippets) {\n const ref = snippet.reference as Record<string, unknown>;\n const sourceFile =\n (ref?.file as Record<string, unknown>)?.name ||\n ref?.name ||\n 'unknown';\n state.documentSnippets.push({\n content: snippet.content,\n score: snippet.score,\n sourceFile: sourceFile as string,\n });\n }\n }\n }\n }\n}\n\n// ============================================================================\n// PHASE 4: MANIFEST INFERENCE\n// ============================================================================\n\n/**\n * Phase 4: Analyze conversation to extract manifest components\n * Emits detailed callbacks for UI tracing\n */\nasync function manifestInference(\n state: IntrospectionState,\n config: ProgressiveIntrospectionConfig,\n callbacks?: IntrospectionCallbacks,\n tracker?: UsageTracker\n): Promise<void> {\n callbacks?.onPhaseStart?.('abstraction_refinement', '');\n\n // Extract schemas (intents + slots)\n callbacks?.onPhaseProgress?.('abstraction_refinement', 'Analyzing conversation to infer intent schemas...');\n const schemas = await inferSchemasFromConversation(state, callbacks, tracker, config.llmModel);\n // Ensure schemas is always a valid array\n state.extractedSchemas = Array.isArray(schemas) ? schemas.filter(s => s && s.intent && Array.isArray(s.slots)) : [];\n\n // Log what was inferred for UI\n if (schemas.length > 0) {\n const schemasSummary = schemas\n .filter(s => s && s.intent && s.slots && Array.isArray(s.slots))\n .map(s =>\n `${s.intent} (${s.slots.length} slots: ${s.slots.filter(slot => slot && slot.name).map(slot => slot.name).join(', ')})`\n ).join('; ');\n if (schemasSummary) {\n callbacks?.onPhaseProgress?.('abstraction_refinement', `Inferred ${schemas.length} intent schemas: ${schemasSummary}`);\n }\n }\n\n // Extract capabilities\n callbacks?.onPhaseProgress?.('abstraction_refinement', 'Extracting capabilities from discovered knowledge...');\n const capabilities = await inferCapabilities(state, callbacks, tracker, config.llmModel);\n state.capabilities = capabilities;\n\n if (capabilities.length > 0) {\n callbacks?.onPhaseProgress?.('abstraction_refinement', `Extracted ${capabilities.length} capabilities`);\n }\n}\n\n// ============================================================================\n// PROGRESSIVE INTROSPECTION ENGINE\n// ============================================================================\n\n/**\n * Run progressive introspection on a Pinecone assistant\n */\nexport async function progressiveIntrospect(\n options: ProgressiveIntrospectionOptions\n): Promise<ProgressiveIntrospectionResult> {\n const {\n assistantName,\n kbId = assistantName,\n domain,\n config: configOverrides = {},\n callbacks,\n pineconeApiKey,\n } = options;\n\n // Merge config with defaults; resolve LLM model (explicit ā env ā default)\n const merged = { ...defaultConfig, ...configOverrides };\n const explicitModel =\n configOverrides.llmModel !== undefined && String(configOverrides.llmModel).trim() !== ''\n ? String(configOverrides.llmModel).trim()\n : undefined;\n const config: ProgressiveIntrospectionConfig = {\n ...merged,\n llmModel: resolveIntrospectionOpenAiModelId(explicitModel),\n };\n\n // Initialize Pinecone\n const apiKey = pineconeApiKey || process.env.PINECONE_API_KEY;\n if (!apiKey) {\n throw new Error('PINECONE_API_KEY is required');\n }\n\n const pinecone = new Pinecone({ apiKey });\n const assistant = pinecone.assistant(assistantName);\n\n // Initialize state\n const state = initializeState();\n\n // Initialize usage tracker\n const tracker = new UsageTracker(callbacks?.onUsageUpdate);\n\n try {\n // Phase 1: Seed Discovery\n tracker.setPhase('seed_discovery');\n await seedDiscovery(assistant, state, config, callbacks, domain, tracker);\n\n // Phase 2: Entity Expansion\n tracker.setPhase('entity_expansion');\n await entityExpansion(assistant, state, config, callbacks, domain, tracker);\n\n // Phase 3: Relationship Discovery\n tracker.setPhase('relationship_discovery');\n await relationshipDiscovery(assistant, state, config, callbacks, domain, tracker);\n\n // Phase 4: Manifest Inference\n tracker.setPhase('manifest_inference');\n await manifestInference(state, config, callbacks, tracker);\n\n // Import manifest generator dynamically to avoid circular deps\n const { generateManifestFromState } = await import('./manifest-generator.js');\n\n // Generate manifest\n tracker.setPhase('manifest_generation');\n callbacks?.onPhaseStart?.('manifest_generation', assistantName);\n\n const manifest = await generateManifestFromState(\n { kbId, assistantName, domain, llmModel: config.llmModel },\n state,\n callbacks,\n tracker\n );\n\n callbacks?.onComplete?.(assistantName, manifest);\n\n return {\n manifest,\n state,\n stats: {\n questionsAsked: state.questionsAsked,\n categoriesDiscovered: state.categories.size,\n entitiesDiscovered: state.entities.size,\n sourceFilesFound: state.sourceFiles.size,\n documentSnippetsCaptured: state.documentSnippets.length,\n usage: tracker.getSummary(),\n },\n };\n } catch (error) {\n // Catch any errors and pass to onError callback with full stack trace\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n const errorName = error instanceof Error ? error.name : 'Error';\n \n // Format error message with stack trace for onError callback\n const fullErrorMsg = errorStack \n ? `${errorName}: ${errorMsg}\\n\\nStack trace:\\n${errorStack}`\n : `${errorName}: ${errorMsg}`;\n \n callbacks?.onError?.(assistantName, fullErrorMsg);\n throw error; // Re-throw to maintain error propagation\n }\n}\n","/**\n * Progressive Introspection Module\n *\n * Exports the progressive introspection engine for generating KB manifests\n * using a 4-phase progressive approach with question formulation, validation, and inference.\n */\n\n// Main engine\nexport { progressiveIntrospect, initializeState } from './engine.js';\n\n// Question formulation\nexport { formulateQuestion, formulateQuestionBatch, SEED_OBJECTIVES } from './question-formulator.js';\n\n// Response validation\nexport { validateResponse } from './response-validator.js';\n\n// Schema inference\nexport { inferSchemasFromConversation, inferCapabilities, inferGoals } from './schema-inference.js';\n\n// Manifest generation\nexport { generateManifestFromState } from './manifest-generator.js';\n\n// Usage tracking\nexport { UsageTracker } from './usage-tracker.js';\nexport type {\n TokenUsage,\n UsageEntry,\n PhaseUsage,\n UsageSummary,\n UsageRecordInput,\n} from './usage-tracker.js';\n\n// Types\nexport type {\n // Configuration\n ProgressiveIntrospectionConfig,\n ProgressiveIntrospectionOptions,\n ProgressiveIntrospectionResult,\n // Question formulation\n QuestionObjective,\n QuestionFormulationContext,\n FormulatedQuestion,\n ExpectedResponseType,\n // Response validation\n ResponseClassification,\n RetryStrategy,\n ResponseValidation,\n // State\n IntrospectionState,\n DiscoveredCategory,\n DiscoveredEntity,\n DiscoveredRelationship,\n ConversationEntry,\n DocumentSnippet,\n ExpansionTask,\n AskResult,\n // Callbacks\n IntrospectionCallbacks,\n // Evidence\n ComponentEvidence,\n} from './types.js';\n\nexport { DEFAULT_PROGRESSIVE_CONFIG } from './types.js';\n\n\n"]}
|