{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-6VFOPK7I.cjs","../../src/services/document-advice.service.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACCO,IAAM,sBAAA,EAAN,MAA4B;AAAA,EAC1B;AAAA,EACA;AAAA,EAER,WAAA,CAAY,WAAA,EAA0B,YAAA,EAA4B;AACjE,IAAA,IAAA,CAAK,YAAA,EAAc,WAAA;AACnB,IAAA,IAAA,CAAK,aAAA,EAAe,YAAA;AAAA,EACrB;AAAA,EAEA,MAAA,CAAO,oBAAA,CACN,UAAA,EACA,OAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,MAAM,eAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,CAAA;AAC3D,IAAA,GAAA,CAAI,CAAC,cAAA,EAAgB;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,oCAAoC,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,SAAA,EAAW,MAAM,cAAA,CAAe,WAAA,CAAY,UAAU,CAAA;AAC5D,IAAA,GAAA,CAAI,CAAC,QAAA,EAAU;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAA;AAClD,IAAA;AAE+C,IAAA;AACE,IAAA;AAEzB,IAAA;AAEG,IAAA;AACR,IAAA;AAClB,MAAA;AAC0C,MAAA;AACX,MAAA;AAC/B,IAAA;AAEuC,IAAA;AACF,IAAA;AACE,IAAA;AAChC,MAAA;AACP,MAAA;AACA,IAAA;AAEa,IAAA;AACa,IAAA;AAC1B,MAAA;AACC,MAAA;AACD,MAAA;AACD,IAAA;AACkC,IAAA;AACZ,MAAA;AACJ,QAAA;AACjB,MAAA;AAC0B,MAAA;AACF,QAAA;AACqB,QAAA;AAC7C,MAAA;AACD,IAAA;AAEqB,IAAA;AACD,MAAA;AAClB,QAAA;AACyB,QAAA;AACzB,MAAA;AACD,MAAA;AACD,IAAA;AAEI,IAAA;AAG6C,MAAA;AACf,QAAA;AAChC,MAAA;AACkB,IAAA;AACC,MAAA;AACnB,QAAA;AACO,QAAA;AACP,MAAA;AACF,IAAA;AAEgD,IAAA;AAC/C,MAAA;AACsB,MAAA;AACG,MAAA;AACzB,IAAA;AACF,EAAA;AACD;ADfwD;AACA;AACA;AACA","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-6VFOPK7I.cjs","sourcesContent":[null,"import type { MemoryModule, ModelModule } from \"@/modules\";\nimport type { StreamEvent } from \"@/types/stream.js\";\nimport { renderDocument } from \"@/utils/document-render.js\";\nimport { loggers } from \"@/utils/logger.js\";\nimport documentAdvicePrompt from \"./prompts/document-advice.js\";\n\n/**\n * Generates AI advice for a document by running a single-turn streaming model\n * completion over the document's rendered content, then caches the result on\n * `document.advice`.\n */\nexport class DocumentAdviceService {\n\tprivate modelModule: ModelModule;\n\tprivate memoryModule: MemoryModule;\n\n\tconstructor(modelModule: ModelModule, memoryModule: MemoryModule) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.memoryModule = memoryModule;\n\t}\n\n\tasync *generateAdviceStream(\n\t\tdocumentId: string,\n\t\toptions?: { advicePrompt?: string },\n\t\tsignal?: AbortSignal,\n\t): AsyncGenerator<StreamEvent> {\n\t\tconst documentMemory = this.memoryModule.getDocumentMemory();\n\t\tif (!documentMemory) {\n\t\t\tthrow new Error(\"Document memory is not initialized\");\n\t\t}\n\t\tconst document = await documentMemory.getDocument(documentId);\n\t\tif (!document) {\n\t\t\tthrow new Error(`Document not found: ${documentId}`);\n\t\t}\n\n\t\tconst renderedContent = renderDocument(document);\n\t\tconst customPrompt = options?.advicePrompt?.trim();\n\t\tconst systemPrompt =\n\t\t\tcustomPrompt || (await documentAdvicePrompt(this.memoryModule));\n\n\t\tconst startedAt = Date.now();\n\t\tloggers.agent.info(\"Generating document advice (single inference)\", {\n\t\t\tdocumentId,\n\t\t\tpromptSource: customPrompt ? \"template\" : \"default\",\n\t\t\tcontentLength: renderedContent.length,\n\t\t});\n\n\t\tconst model = this.modelModule.getModel();\n\t\tconst modelOptions = this.modelModule.getModelOptions();\n\t\tconst messages = model.generateMessages({\n\t\t\tquery: renderedContent,\n\t\t\tsystemPrompt,\n\t\t});\n\n\t\tlet content = \"\";\n\t\tconst stream = await model.fetchStreamWithContextMessage(\n\t\t\tmessages,\n\t\t\t[],\n\t\t\tmodelOptions,\n\t\t);\n\t\tfor await (const chunk of stream) {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"Advice generation aborted by client\");\n\t\t\t}\n\t\t\tif (chunk.delta?.content) {\n\t\t\t\tcontent += chunk.delta.content;\n\t\t\t\tyield { event: \"text_chunk\", data: { delta: chunk.delta.content } };\n\t\t\t}\n\t\t}\n\n\t\tif (!content.trim()) {\n\t\t\tloggers.agent.warn(\"Document advice generation produced no content\", {\n\t\t\t\tdocumentId,\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Persist only the advice (metadata); do NOT bump version off a\n\t\t\t// pre-stream read, which could clobber a concurrent edit (lost update).\n\t\t\tawait documentMemory.updateDocument(documentId, {\n\t\t\t\tadvice: { content, generatedAt: new Date().toISOString() },\n\t\t\t});\n\t\t} catch (saveError) {\n\t\t\tloggers.agent.error(\"Failed to cache document advice\", {\n\t\t\t\tdocumentId,\n\t\t\t\terror: saveError,\n\t\t\t});\n\t\t}\n\n\t\tloggers.agent.info(\"Document advice generated\", {\n\t\t\tdocumentId,\n\t\t\tadviceLength: content.length,\n\t\t\tdurationMs: Date.now() - startedAt,\n\t\t});\n\t}\n}\n"]}