opensentinel 3.6.1 → 3.7.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/README.md +12 -0
- package/dist/{agent-manager-7N7REQZQ.js → agent-manager-JZ4IM7XI.js} +8 -8
- package/dist/{agent-processor-I23VWQY3.js → agent-processor-DDDHC2SO.js} +22 -21
- package/dist/{agent-processor-I23VWQY3.js.map → agent-processor-DDDHC2SO.js.map} +1 -1
- package/dist/{alerting-4I37GG4U.js → alerting-LK7VVYTX.js} +4 -4
- package/dist/alerting-LK7VVYTX.js.map +1 -0
- package/dist/analyzer-OTWE3ARE.js +22 -0
- package/dist/{archiver-XLRIIXPY.js → archiver-FPGKRP6P.js} +16 -85
- package/dist/archiver-FPGKRP6P.js.map +1 -0
- package/dist/{audit-logger-AU3TMWKI.js → audit-logger-CI4WZQPD.js} +5 -5
- package/dist/bot-VDHBGUVI.js +47 -0
- package/dist/{brain-SLA474EU.js → brain-6QTXN4QP.js} +18 -17
- package/dist/{chunk-AR34B6XR.js → chunk-2I5QHYG6.js} +3 -3
- package/dist/chunk-2I5QHYG6.js.map +1 -0
- package/dist/chunk-3AWAWRWB.js +143 -0
- package/dist/chunk-3AWAWRWB.js.map +1 -0
- package/dist/{chunk-PUNIMPMY.js → chunk-4KIHDIXZ.js} +13 -2
- package/dist/chunk-4KIHDIXZ.js.map +1 -0
- package/dist/{chunk-GUKKW7JI.js → chunk-4WH6MFEW.js} +2 -2
- package/dist/chunk-4WH6MFEW.js.map +1 -0
- package/dist/{chunk-M7YLQHFP.js → chunk-56UJS2LA.js} +6 -6
- package/dist/{chunk-S4NJJS5C.js → chunk-5BTVJR7R.js} +3 -3
- package/dist/{chunk-HKOPRRDJ.js → chunk-5JJTLWOR.js} +3 -3
- package/dist/chunk-5JJTLWOR.js.map +1 -0
- package/dist/chunk-66SAOZPU.js +236 -0
- package/dist/chunk-66SAOZPU.js.map +1 -0
- package/dist/chunk-6HGMRR4J.js +113 -0
- package/dist/chunk-6HGMRR4J.js.map +1 -0
- package/dist/{chunk-BMOUYXLX.js → chunk-6ZNCY2GI.js} +5 -5
- package/dist/chunk-7BNFELEK.js +31 -0
- package/dist/chunk-7BNFELEK.js.map +1 -0
- package/dist/{chunk-KABG5PG3.js → chunk-BBN4VCNK.js} +4 -4
- package/dist/chunk-BBN4VCNK.js.map +1 -0
- package/dist/{chunk-4YJRBMMA.js → chunk-BNZHWAZC.js} +2 -2
- package/dist/{chunk-TAAZB5KN.js → chunk-CWT6CAE5.js} +2 -2
- package/dist/{chunk-UWUIJTT4.js → chunk-CZTMGHUC.js} +1 -1
- package/dist/chunk-CZTMGHUC.js.map +1 -0
- package/dist/chunk-DTISLIMB.js +89 -0
- package/dist/chunk-DTISLIMB.js.map +1 -0
- package/dist/{chunk-VKMFUIVA.js → chunk-GBVJTRXS.js} +2 -2
- package/dist/{chunk-MFK34XSY.js → chunk-GJETKBOY.js} +15 -15
- package/dist/chunk-GJETKBOY.js.map +1 -0
- package/dist/{chunk-HTF2GIQC.js → chunk-GW6V4D43.js} +2 -2
- package/dist/chunk-GW6V4D43.js.map +1 -0
- package/dist/{chunk-2RGPWU77.js → chunk-HJSEEFO3.js} +2 -2
- package/dist/{chunk-JOA5A3G3.js → chunk-HQZQFEAX.js} +5 -5
- package/dist/{chunk-45YXODSB.js → chunk-J4JW73TT.js} +2 -2
- package/dist/{chunk-KT7NLIXP.js → chunk-JHYYFPKX.js} +2 -2
- package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
- package/dist/chunk-P64EV4YY.js.map +1 -0
- package/dist/chunk-PBOCSGNL.js +84 -0
- package/dist/chunk-PBOCSGNL.js.map +1 -0
- package/dist/{chunk-H3BOLSTS.js → chunk-PD3CTDO6.js} +2 -2
- package/dist/{chunk-6UZPE35A.js → chunk-QPY3WRVM.js} +10 -87
- package/dist/chunk-QPY3WRVM.js.map +1 -0
- package/dist/{chunk-AD6YEH6U.js → chunk-S2EOIVF4.js} +590 -91
- package/dist/chunk-S2EOIVF4.js.map +1 -0
- package/dist/chunk-SDLOMKCW.js +213 -0
- package/dist/chunk-SDLOMKCW.js.map +1 -0
- package/dist/{chunk-7MZN73J2.js → chunk-TKBVW7ZJ.js} +4 -4
- package/dist/{chunk-A24GPVLY.js → chunk-V3OKHQUX.js} +5 -5
- package/dist/{chunk-NMSHVO5O.js → chunk-WMDVOWN6.js} +4 -4
- package/dist/{chunk-643M3AP5.js → chunk-WMFYI7XC.js} +7 -7
- package/dist/{chunk-6LTLIYAQ.js → chunk-YEDEAX6Y.js} +3 -3
- package/dist/{chunk-NYVBXUGD.js → chunk-ZIBRVA3Y.js} +60 -1
- package/dist/chunk-ZIBRVA3Y.js.map +1 -0
- package/dist/{chunk-6JY4HNUH.js → chunk-ZMML6T63.js} +361 -24
- package/dist/chunk-ZMML6T63.js.map +1 -0
- package/dist/{chunk-FFV2SXFD.js → chunk-ZVHG4KF2.js} +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/{cost-tracker-EMOIOYH7.js → cost-tracker-KZQSTSE2.js} +2 -2
- package/dist/{db-LRIOKQBO.js → db-I7MNG6CL.js} +10 -4
- package/dist/{discord-NKR3X4AV.js → discord-6UQHCN27.js} +24 -23
- package/dist/{documents-EYIYLZK2.js → documents-PFHSK7SZ.js} +19 -19
- package/dist/{email-EAQNULVD.js → email-6OIN4SYL.js} +22 -21
- package/dist/email-6OIN4SYL.js.map +1 -0
- package/dist/{enhanced-retrieval-OGHT6TS5.js → enhanced-retrieval-JWX2HWU4.js} +7 -6
- package/dist/{enhanced-retrieval-OGHT6TS5.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
- package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
- package/dist/{entity-resolution-4X4JU43O.js → entity-resolution-7Z6STVXX.js} +5 -5
- package/dist/{env-CHOFICED.js → env-GN5VHI43.js} +2 -2
- package/dist/{error-tracker-SVQSDQDW.js → error-tracker-64DEH3D7.js} +6 -6
- package/dist/{github-KGNILDWJ.js → github-DUWSXCNP.js} +4 -4
- package/dist/graph-client-NB475AK5.js +17 -0
- package/dist/{imessage-V2XNDDHT.js → imessage-DSGSGUZS.js} +19 -18
- package/dist/{inbox-summarizer-DKKRYXDR.js → inbox-summarizer-F2KAU72V.js} +19 -18
- package/dist/{incident-response-ZTIKUWEO.js → incident-response-E3UGMX5G.js} +5 -5
- package/dist/incident-response-E3UGMX5G.js.map +1 -0
- package/dist/{knowledge-base-J7PJ7MZ3.js → knowledge-base-5SMMOGQJ.js} +5 -5
- package/dist/lib.d.ts +21 -0
- package/dist/lib.js +64 -57
- package/dist/lib.js.map +1 -1
- package/dist/{matrix-XHTR53VQ.js → matrix-WYGEOZL5.js} +18 -17
- package/dist/{matrix-XHTR53VQ.js.map → matrix-WYGEOZL5.js.map} +1 -1
- package/dist/{mcp-3C2TN67D.js → mcp-DJ2QDA6A.js} +2 -2
- package/dist/{metrics-VJDWQWU7.js → metrics-BH3ZLGEV.js} +5 -5
- package/dist/{multi-user-S56GUD6L.js → multi-user-XAEMB244.js} +4 -4
- package/dist/oauth-UPJYFOVU.js +34 -0
- package/dist/{ocr-LGUIPKVZ.js → ocr-UONKTQU7.js} +4 -4
- package/dist/{presentations-HXTAMGHT.js → presentations-UOET2FVZ.js} +2 -2
- package/dist/{providers-H6YIC3MG.js → providers-2YQ6E3IF.js} +3 -3
- package/dist/{scheduler-CA5UNHZV.js → scheduler-6PLLAQI7.js} +21 -20
- package/dist/{schema-ALJ67YVG.js → schema-ETY7L2VA.js} +8 -2
- package/dist/sharepoint-V5P4Q62L.js +30 -0
- package/dist/{signal-X7IQJGRQ.js → signal-7D5EPGVL.js} +19 -18
- package/dist/{slack-P2LFUJUQ.js → slack-KSS6YK5Z.js} +23 -22
- package/dist/slack-KSS6YK5Z.js.map +1 -0
- package/dist/{sms-4VME2HUL.js → sms-CSUCC7HL.js} +3 -3
- package/dist/sms-CSUCC7HL.js.map +1 -0
- package/dist/{src-S5KX4YEV.js → src-GO7GGW7O.js} +48 -41
- package/dist/{src-S5KX4YEV.js.map → src-GO7GGW7O.js.map} +1 -1
- package/dist/token-store-SEWRX6RE.js +20 -0
- package/dist/token-store-SEWRX6RE.js.map +1 -0
- package/dist/{tools-FGPN522P.js → tools-PJZ6RI4P.js} +18 -17
- package/dist/tools-PJZ6RI4P.js.map +1 -0
- package/dist/{whatsapp-KRPQ4YUX.js → whatsapp-DWXK25V2.js} +19 -18
- package/dist/whatsapp-DWXK25V2.js.map +1 -0
- package/dist/{word-document-D6N2C47N.js → word-document-AV3YB4L2.js} +2 -2
- package/dist/{workflow-store-ZYAYE5P6.js → workflow-store-5Y56GUP7.js} +4 -4
- package/drizzle/0002_mushy_master_mold.sql +139 -139
- package/drizzle/0003_overjoyed_rhodey.sql +46 -0
- package/drizzle/meta/0002_snapshot.json +3636 -3636
- package/drizzle/meta/0003_snapshot.json +3946 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +110 -110
- package/dist/alerting-4I37GG4U.js.map +0 -1
- package/dist/archiver-XLRIIXPY.js.map +0 -1
- package/dist/bot-MU2TJQ3Y.js +0 -46
- package/dist/chunk-6JY4HNUH.js.map +0 -1
- package/dist/chunk-6UZPE35A.js.map +0 -1
- package/dist/chunk-AD6YEH6U.js.map +0 -1
- package/dist/chunk-AR34B6XR.js.map +0 -1
- package/dist/chunk-GUKKW7JI.js.map +0 -1
- package/dist/chunk-HKOPRRDJ.js.map +0 -1
- package/dist/chunk-HTF2GIQC.js.map +0 -1
- package/dist/chunk-KABG5PG3.js.map +0 -1
- package/dist/chunk-MFK34XSY.js.map +0 -1
- package/dist/chunk-NYVBXUGD.js.map +0 -1
- package/dist/chunk-PUNIMPMY.js.map +0 -1
- package/dist/chunk-UWUIJTT4.js.map +0 -1
- package/dist/chunk-XMCVRVTF.js.map +0 -1
- package/dist/email-EAQNULVD.js.map +0 -1
- package/dist/enrichment-pipeline-CMUVBDC7.js +0 -14
- package/dist/incident-response-ZTIKUWEO.js.map +0 -1
- /package/dist/{agent-manager-7N7REQZQ.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
- /package/dist/{audit-logger-AU3TMWKI.js.map → analyzer-OTWE3ARE.js.map} +0 -0
- /package/dist/{bot-MU2TJQ3Y.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
- /package/dist/{brain-SLA474EU.js.map → bot-VDHBGUVI.js.map} +0 -0
- /package/dist/{cost-tracker-EMOIOYH7.js.map → brain-6QTXN4QP.js.map} +0 -0
- /package/dist/{chunk-M7YLQHFP.js.map → chunk-56UJS2LA.js.map} +0 -0
- /package/dist/{chunk-S4NJJS5C.js.map → chunk-5BTVJR7R.js.map} +0 -0
- /package/dist/{chunk-BMOUYXLX.js.map → chunk-6ZNCY2GI.js.map} +0 -0
- /package/dist/{chunk-4YJRBMMA.js.map → chunk-BNZHWAZC.js.map} +0 -0
- /package/dist/{chunk-TAAZB5KN.js.map → chunk-CWT6CAE5.js.map} +0 -0
- /package/dist/{chunk-VKMFUIVA.js.map → chunk-GBVJTRXS.js.map} +0 -0
- /package/dist/{chunk-2RGPWU77.js.map → chunk-HJSEEFO3.js.map} +0 -0
- /package/dist/{chunk-JOA5A3G3.js.map → chunk-HQZQFEAX.js.map} +0 -0
- /package/dist/{chunk-45YXODSB.js.map → chunk-J4JW73TT.js.map} +0 -0
- /package/dist/{chunk-KT7NLIXP.js.map → chunk-JHYYFPKX.js.map} +0 -0
- /package/dist/{chunk-H3BOLSTS.js.map → chunk-PD3CTDO6.js.map} +0 -0
- /package/dist/{chunk-7MZN73J2.js.map → chunk-TKBVW7ZJ.js.map} +0 -0
- /package/dist/{chunk-A24GPVLY.js.map → chunk-V3OKHQUX.js.map} +0 -0
- /package/dist/{chunk-NMSHVO5O.js.map → chunk-WMDVOWN6.js.map} +0 -0
- /package/dist/{chunk-643M3AP5.js.map → chunk-WMFYI7XC.js.map} +0 -0
- /package/dist/{chunk-6LTLIYAQ.js.map → chunk-YEDEAX6Y.js.map} +0 -0
- /package/dist/{chunk-FFV2SXFD.js.map → chunk-ZVHG4KF2.js.map} +0 -0
- /package/dist/{db-LRIOKQBO.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
- /package/dist/{discord-NKR3X4AV.js.map → db-I7MNG6CL.js.map} +0 -0
- /package/dist/{enrichment-pipeline-CMUVBDC7.js.map → discord-6UQHCN27.js.map} +0 -0
- /package/dist/{documents-EYIYLZK2.js.map → documents-PFHSK7SZ.js.map} +0 -0
- /package/dist/{entity-resolution-4X4JU43O.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
- /package/dist/{env-CHOFICED.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
- /package/dist/{error-tracker-SVQSDQDW.js.map → env-GN5VHI43.js.map} +0 -0
- /package/dist/{imessage-V2XNDDHT.js.map → error-tracker-64DEH3D7.js.map} +0 -0
- /package/dist/{github-KGNILDWJ.js.map → github-DUWSXCNP.js.map} +0 -0
- /package/dist/{inbox-summarizer-DKKRYXDR.js.map → graph-client-NB475AK5.js.map} +0 -0
- /package/dist/{knowledge-base-J7PJ7MZ3.js.map → imessage-DSGSGUZS.js.map} +0 -0
- /package/dist/{mcp-3C2TN67D.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
- /package/dist/{metrics-VJDWQWU7.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
- /package/dist/{ocr-LGUIPKVZ.js.map → mcp-DJ2QDA6A.js.map} +0 -0
- /package/dist/{providers-H6YIC3MG.js.map → metrics-BH3ZLGEV.js.map} +0 -0
- /package/dist/{multi-user-S56GUD6L.js.map → multi-user-XAEMB244.js.map} +0 -0
- /package/dist/{scheduler-CA5UNHZV.js.map → oauth-UPJYFOVU.js.map} +0 -0
- /package/dist/{schema-ALJ67YVG.js.map → ocr-UONKTQU7.js.map} +0 -0
- /package/dist/{presentations-HXTAMGHT.js.map → presentations-UOET2FVZ.js.map} +0 -0
- /package/dist/{signal-X7IQJGRQ.js.map → providers-2YQ6E3IF.js.map} +0 -0
- /package/dist/{slack-P2LFUJUQ.js.map → scheduler-6PLLAQI7.js.map} +0 -0
- /package/dist/{sms-4VME2HUL.js.map → schema-ETY7L2VA.js.map} +0 -0
- /package/dist/{tools-FGPN522P.js.map → sharepoint-V5P4Q62L.js.map} +0 -0
- /package/dist/{whatsapp-KRPQ4YUX.js.map → signal-7D5EPGVL.js.map} +0 -0
- /package/dist/{word-document-D6N2C47N.js.map → word-document-AV3YB4L2.js.map} +0 -0
- /package/dist/{workflow-store-ZYAYE5P6.js.map → workflow-store-5Y56GUP7.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/providers/anthropic-provider.ts","../src/core/providers/gemini.ts","../src/core/providers/registry.ts","../src/core/providers/index.ts"],"sourcesContent":["/**\n * Anthropic Provider — Wraps the Anthropic SDK\n *\n * Converts between provider-agnostic LLM types and Anthropic's SDK types.\n * Handles extended thinking, vision, and tool use natively.\n */\n\nimport Anthropic from \"@anthropic-ai/sdk\";\nimport type { LLMProvider } from \"./provider\";\nimport type {\n LLMProviderCapabilities,\n LLMProviderConfig,\n LLMRequest,\n LLMResponse,\n LLMContentBlock,\n LLMStreamEvent,\n LLMStreamResult,\n LLMMessage,\n LLMTool,\n} from \"./types\";\n\nexport class AnthropicProvider implements LLMProvider {\n readonly id: string;\n readonly name: string;\n readonly type = \"anthropic\";\n private client: Anthropic;\n\n constructor(config: LLMProviderConfig) {\n this.id = config.id;\n this.name = config.name;\n this.client = new Anthropic({ apiKey: config.apiKey });\n }\n\n getCapabilities(): LLMProviderCapabilities {\n return {\n supportsVision: true,\n supportsToolUse: true,\n supportsStreaming: true,\n supportsExtendedThinking: true,\n supportsSystemPrompt: true,\n maxContextWindow: 200000,\n };\n }\n\n async createMessage(request: LLMRequest): Promise<LLMResponse> {\n const { system, messages } = this.extractSystem(request);\n\n const params: any = {\n model: request.model,\n max_tokens: request.max_tokens,\n system,\n messages,\n };\n\n if (request.tools?.length) {\n params.tools = request.tools.map(toLLMToolToAnthropicTool);\n }\n\n if (request.thinking) {\n params.thinking = request.thinking;\n }\n\n const response = await this.client.messages.create(params);\n\n return {\n content: response.content.map(anthropicBlockToLLM),\n stop_reason: mapStopReason(response.stop_reason),\n usage: {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n },\n model: response.model,\n };\n }\n\n streamMessage(request: LLMRequest): LLMStreamResult {\n const { system, messages } = this.extractSystem(request);\n\n const params: any = {\n model: request.model,\n max_tokens: request.max_tokens,\n system,\n messages,\n };\n\n if (request.tools?.length) {\n params.tools = request.tools.map(toLLMToolToAnthropicTool);\n }\n\n const stream = this.client.messages.stream(params);\n\n const events: AsyncIterable<LLMStreamEvent> = {\n async *[Symbol.asyncIterator]() {\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && (event.delta as any).type === \"text_delta\") {\n yield {\n type: \"content_block_delta\" as const,\n delta: { type: \"text_delta\" as const, text: (event.delta as any).text },\n };\n }\n }\n },\n };\n\n return {\n events,\n async finalMessage(): Promise<LLMResponse> {\n const msg = await stream.finalMessage();\n return {\n content: msg.content.map(anthropicBlockToLLM),\n stop_reason: mapStopReason(msg.stop_reason),\n usage: {\n input_tokens: msg.usage.input_tokens,\n output_tokens: msg.usage.output_tokens,\n },\n model: msg.model,\n };\n },\n };\n }\n\n async listModels(): Promise<string[]> {\n return [\n \"claude-haiku-4-5-20251001\",\n \"claude-sonnet-4-20250514\",\n \"claude-opus-4-20250514\",\n ];\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n // Minimal API call to check connectivity\n await this.client.messages.create({\n model: \"claude-haiku-4-5-20251001\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /** Get the raw Anthropic client (for specialized use cases like vision) */\n getClient(): Anthropic {\n return this.client;\n }\n\n /**\n * Extract system messages and convert LLMMessages to Anthropic MessageParam format.\n * Anthropic uses a separate `system` parameter instead of a system role message.\n */\n private extractSystem(request: LLMRequest): {\n system: string;\n messages: any[];\n } {\n let system = request.system || \"\";\n\n const messages = request.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => llmMessageToAnthropicMessage(m));\n\n return { system, messages };\n }\n}\n\n// ============================================\n// Conversion helpers\n// ============================================\n\nfunction toLLMToolToAnthropicTool(tool: LLMTool): any {\n // Anthropic uses the same format: { name, description, input_schema }\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.input_schema,\n };\n}\n\nfunction llmMessageToAnthropicMessage(msg: LLMMessage): any {\n if (typeof msg.content === \"string\") {\n return { role: msg.role, content: msg.content };\n }\n\n // Convert content blocks\n const anthropicContent = msg.content.map((block) => {\n switch (block.type) {\n case \"text\":\n return { type: \"text\", text: block.text };\n case \"image\":\n return {\n type: \"image\",\n source: {\n type: block.source?.type || \"base64\",\n media_type: block.source?.mediaType || \"image/jpeg\",\n data: block.source?.data,\n ...(block.source?.url ? { url: block.source.url } : {}),\n },\n };\n case \"tool_use\":\n return {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: block.tool_use_id,\n content: block.content,\n };\n default:\n return { type: \"text\", text: block.text || \"\" };\n }\n });\n\n return { role: msg.role, content: anthropicContent };\n}\n\nfunction anthropicBlockToLLM(block: any): LLMContentBlock {\n switch (block.type) {\n case \"text\":\n return { type: \"text\", text: block.text };\n case \"tool_use\":\n return {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n default:\n return { type: \"text\", text: block.text || \"\" };\n }\n}\n\nfunction mapStopReason(reason: string | null): LLMResponse[\"stop_reason\"] {\n switch (reason) {\n case \"end_turn\":\n return \"end_turn\";\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n default:\n return \"end_turn\";\n }\n}\n","/**\r\n * Google Gemini Provider\r\n *\r\n * Extends the OpenAI-compatible provider for Google's Gemini API.\r\n * Gemini exposes an OpenAI-compatible endpoint at\r\n * https://generativelanguage.googleapis.com/v1beta/openai/\r\n */\r\n\r\nimport { OpenAICompatibleProvider } from \"./openai-compatible-provider\";\r\nimport type { LLMProviderCapabilities } from \"./types\";\r\n\r\nexport class GeminiProvider extends OpenAICompatibleProvider {\r\n constructor(\r\n apiKey: string,\r\n defaultModel: string = \"gemini-2.0-flash\"\r\n ) {\r\n super({\r\n id: \"gemini\",\r\n name: \"Google Gemini\",\r\n type: \"openai-compatible\",\r\n apiKey,\r\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai/\",\r\n defaultModel,\r\n enabled: true,\r\n });\r\n }\r\n\r\n /**\r\n * Gemini 2.0 Flash supports vision, tool use, and streaming\r\n * with a 1M token context window.\r\n */\r\n override getCapabilities(): LLMProviderCapabilities {\r\n return {\r\n supportsVision: true,\r\n supportsToolUse: true,\r\n supportsStreaming: true,\r\n supportsExtendedThinking: false,\r\n supportsSystemPrompt: true,\r\n maxContextWindow: 1048576, // 1M tokens\r\n };\r\n }\r\n}\r\n","/**\n * Provider Registry — Manages all configured LLM providers\n */\n\nimport type { LLMProvider } from \"./provider\";\n\nexport class ProviderRegistry {\n private providers: Map<string, LLMProvider> = new Map();\n private defaultProviderId: string | null = null;\n\n register(provider: LLMProvider): void {\n this.providers.set(provider.id, provider);\n // First registered provider becomes default\n if (!this.defaultProviderId) {\n this.defaultProviderId = provider.id;\n }\n }\n\n unregister(id: string): void {\n this.providers.delete(id);\n if (this.defaultProviderId === id) {\n this.defaultProviderId = this.providers.keys().next().value || null;\n }\n }\n\n get(id: string): LLMProvider | undefined {\n return this.providers.get(id);\n }\n\n getDefault(): LLMProvider {\n if (!this.defaultProviderId) {\n throw new Error(\n \"[ProviderRegistry] No LLM providers configured. Set CLAUDE_API_KEY, OPENROUTER_API_KEY, or OLLAMA_ENABLED.\"\n );\n }\n const provider = this.providers.get(this.defaultProviderId);\n if (!provider) {\n throw new Error(`[ProviderRegistry] Default provider '${this.defaultProviderId}' not found.`);\n }\n return provider;\n }\n\n setDefault(id: string): void {\n if (!this.providers.has(id)) {\n console.warn(`[ProviderRegistry] Provider '${id}' not registered, cannot set as default.`);\n return;\n }\n this.defaultProviderId = id;\n }\n\n getDefaultId(): string | null {\n return this.defaultProviderId;\n }\n\n has(id: string): boolean {\n return this.providers.has(id);\n }\n\n listProviders(): Array<{ id: string; name: string; type: string }> {\n return Array.from(this.providers.values()).map((p) => ({\n id: p.id,\n name: p.name,\n type: p.type,\n }));\n }\n\n getProviderCount(): number {\n return this.providers.size;\n }\n\n clear(): void {\n this.providers.clear();\n this.defaultProviderId = null;\n }\n}\n\nexport const providerRegistry = new ProviderRegistry();\n","/**\r\n * Provider initialization and re-exports\r\n */\r\n\r\nimport { env } from \"../../config/env\";\r\nimport { AnthropicProvider } from \"./anthropic-provider\";\r\nimport { OpenAICompatibleProvider } from \"./openai-compatible-provider\";\r\nimport { GeminiProvider } from \"./gemini\";\r\nimport { providerRegistry } from \"./registry\";\r\n\r\n/**\r\n * Initialize all configured LLM providers from environment variables.\r\n * Called once during application startup.\r\n */\r\nexport async function initializeProviders(): Promise<void> {\r\n // Always register Anthropic if CLAUDE_API_KEY is set\r\n if (env.CLAUDE_API_KEY) {\r\n providerRegistry.register(\r\n new AnthropicProvider({\r\n id: \"anthropic\",\r\n name: \"Anthropic\",\r\n type: \"anthropic\",\r\n apiKey: env.CLAUDE_API_KEY,\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: Anthropic\");\r\n }\r\n\r\n // Register OpenAI if key is set (for LLM use, separate from Whisper STT)\r\n if ((env as any).OPENAI_LLM_ENABLED && env.OPENAI_API_KEY) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"openai\",\r\n name: \"OpenAI\",\r\n type: \"openai\",\r\n apiKey: env.OPENAI_API_KEY,\r\n baseUrl: \"https://api.openai.com/v1\",\r\n defaultModel: \"gpt-4o\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: OpenAI\");\r\n }\r\n\r\n // Register OpenRouter if configured\r\n if ((env as any).OPENROUTER_API_KEY) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"openrouter\",\r\n name: \"OpenRouter\",\r\n type: \"openai-compatible\",\r\n apiKey: (env as any).OPENROUTER_API_KEY,\r\n baseUrl: (env as any).OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\r\n defaultModel: \"anthropic/claude-sonnet-4-20250514\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: OpenRouter\");\r\n }\r\n\r\n // Register Groq if configured\r\n if ((env as any).GROQ_API_KEY) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"groq\",\r\n name: \"Groq\",\r\n type: \"openai-compatible\",\r\n apiKey: (env as any).GROQ_API_KEY,\r\n baseUrl: \"https://api.groq.com/openai/v1\",\r\n defaultModel: \"llama-3.1-70b-versatile\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: Groq\");\r\n }\r\n\r\n // Register Mistral if configured\r\n if ((env as any).MISTRAL_API_KEY) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"mistral\",\r\n name: \"Mistral\",\r\n type: \"openai-compatible\",\r\n apiKey: (env as any).MISTRAL_API_KEY,\r\n baseUrl: \"https://api.mistral.ai/v1\",\r\n defaultModel: \"mistral-large-latest\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: Mistral\");\r\n }\r\n\r\n // Register Google Gemini if configured\r\n if ((env as any).GEMINI_API_KEY) {\r\n providerRegistry.register(\r\n new GeminiProvider(\r\n (env as any).GEMINI_API_KEY,\r\n (env as any).GEMINI_DEFAULT_MODEL || \"gemini-2.0-flash\"\r\n )\r\n );\r\n console.log(\"[LLM] Registered provider: Google Gemini\");\r\n }\r\n\r\n // Register xAI (Grok) if configured\r\n if ((env as any).XAI_API_KEY) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"xai\",\r\n name: \"xAI (Grok)\",\r\n type: \"openai-compatible\",\r\n apiKey: (env as any).XAI_API_KEY,\r\n baseUrl: \"https://api.x.ai/v1\",\r\n defaultModel: (env as any).XAI_DEFAULT_MODEL || \"grok-2\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: xAI (Grok)\");\r\n }\r\n\r\n // Register generic OpenAI-compatible endpoint if configured\r\n if ((env as any).OPENAI_COMPATIBLE_BASE_URL) {\r\n providerRegistry.register(\r\n new OpenAICompatibleProvider({\r\n id: \"custom\",\r\n name: \"Custom Provider\",\r\n type: \"openai-compatible\",\r\n apiKey: (env as any).OPENAI_COMPATIBLE_API_KEY || \"not-needed\",\r\n baseUrl: (env as any).OPENAI_COMPATIBLE_BASE_URL,\r\n defaultModel: (env as any).OPENAI_COMPATIBLE_MODEL || \"default\",\r\n enabled: true,\r\n })\r\n );\r\n console.log(\"[LLM] Registered provider: Custom (\" + (env as any).OPENAI_COMPATIBLE_BASE_URL + \")\");\r\n }\r\n\r\n // Register Ollama if enabled (requires async probe)\r\n if ((env as any).OLLAMA_ENABLED) {\r\n try {\r\n const { OllamaProvider } = await import(\"./ollama\");\r\n const ollamaBaseUrl = (env as any).OLLAMA_BASE_URL || \"http://localhost:11434\";\r\n const ollamaModel = (env as any).OLLAMA_DEFAULT_MODEL || \"llama3.1\";\r\n const ollama = new OllamaProvider(ollamaBaseUrl, ollamaModel);\r\n\r\n const available = await ollama.isAvailable();\r\n if (available) {\r\n providerRegistry.register(ollama);\r\n const models = await ollama.listModels();\r\n console.log(`[LLM] Registered provider: Ollama (${models.length} model(s): ${models.slice(0, 5).join(\", \")})`);\r\n } else {\r\n console.warn(`[LLM] Ollama enabled but not reachable at ${ollamaBaseUrl}`);\r\n }\r\n } catch (err: any) {\r\n console.warn(\"[LLM] Failed to initialize Ollama:\", err.message);\r\n }\r\n }\r\n\r\n // Set default provider\r\n const defaultId = (env as any).LLM_PROVIDER || \"anthropic\";\r\n if (providerRegistry.has(defaultId)) {\r\n providerRegistry.setDefault(defaultId);\r\n }\r\n\r\n const providers = providerRegistry.listProviders();\r\n if (providers.length === 0) {\r\n console.warn(\"[LLM] No LLM providers configured. Set CLAUDE_API_KEY or another provider key.\");\r\n } else {\r\n console.log(\r\n `[LLM] ${providers.length} provider(s) ready. Default: ${providerRegistry.getDefaultId()}`\r\n );\r\n }\r\n}\r\n\r\n// Re-exports\r\nexport { providerRegistry } from \"./registry\";\r\nexport { AnthropicProvider } from \"./anthropic-provider\";\r\nexport { OpenAICompatibleProvider } from \"./openai-compatible-provider\";\r\nexport { OllamaProvider } from \"./ollama\";\r\nexport { GeminiProvider } from \"./gemini\";\r\nexport type { LLMProvider } from \"./provider\";\r\nexport type {\r\n LLMMessage,\r\n LLMContentBlock,\r\n LLMTool,\r\n LLMRequest,\r\n LLMResponse,\r\n LLMStreamEvent,\r\n LLMStreamResult,\r\n LLMProviderCapabilities,\r\n LLMProviderConfig,\r\n} from \"./types\";\r\n"],"mappings":"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","names":["OllamaProvider"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
env
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
4
4
|
import {
|
|
5
5
|
__require
|
|
6
6
|
} from "./chunk-UP2VWCW5.js";
|
|
@@ -193,4 +193,4 @@ export {
|
|
|
193
193
|
validateTwilioSignature,
|
|
194
194
|
isTwilioConfigured
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=chunk-
|
|
196
|
+
//# sourceMappingURL=chunk-HJSEEFO3.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
textToSpeech
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-J4JW73TT.js";
|
|
4
4
|
import {
|
|
5
5
|
transcribeAudio
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BNZHWAZC.js";
|
|
7
7
|
import {
|
|
8
8
|
scheduleReminder
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-GJETKBOY.js";
|
|
10
10
|
import {
|
|
11
11
|
chatWithTools
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-ZMML6T63.js";
|
|
13
13
|
|
|
14
14
|
// src/inputs/discord/index.ts
|
|
15
15
|
import {
|
|
@@ -803,4 +803,4 @@ export {
|
|
|
803
803
|
createDiscordBot,
|
|
804
804
|
discord_default
|
|
805
805
|
};
|
|
806
|
-
//# sourceMappingURL=chunk-
|
|
806
|
+
//# sourceMappingURL=chunk-HQZQFEAX.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
env
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
4
4
|
|
|
5
5
|
// src/outputs/tts.ts
|
|
6
6
|
var ELEVENLABS_API_URL = "https://api.elevenlabs.io/v1";
|
|
@@ -48,4 +48,4 @@ async function textToSpeech(text, options = {}) {
|
|
|
48
48
|
export {
|
|
49
49
|
textToSpeech
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-J4JW73TT.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatWithTools
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZMML6T63.js";
|
|
4
4
|
|
|
5
5
|
// src/inputs/signal/index.ts
|
|
6
6
|
import { spawn } from "child_process";
|
|
@@ -126,4 +126,4 @@ export {
|
|
|
126
126
|
SignalBot,
|
|
127
127
|
signal_default
|
|
128
128
|
};
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-JHYYFPKX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/utils.ts"],"sourcesContent":["/**\r\n * Shared CLI utilities for OpenSentinel commands.\r\n */\r\n\r\nimport { createInterface } from \"node:readline\";\r\nimport { exec as execCb } from \"node:child_process\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\nimport { existsSync, mkdirSync, readFileSync } from \"node:fs\";\r\n\r\n// ── Colors (ANSI escape codes) ───────────────────────────────────────────────\r\n\r\nexport const colors = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n green: \"\\x1b[32m\",\r\n cyan: \"\\x1b[36m\",\r\n yellow: \"\\x1b[33m\",\r\n red: \"\\x1b[31m\",\r\n magenta: \"\\x1b[35m\",\r\n};\r\n\r\n// ── Interactive prompts ──────────────────────────────────────────────────────\r\n\r\nexport async function prompt(question: string): Promise<string> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\nexport async function confirm(question: string, defaultYes = true): Promise<boolean> {\r\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\r\n const answer = await prompt(`${question} ${hint} `);\r\n if (answer === \"\") return defaultYes;\r\n return answer.toLowerCase().startsWith(\"y\");\r\n}\r\n\r\nexport async function promptSecret(question: string): Promise<string> {\r\n const rl = createInterface({ input: process.stdin, output: process.stdout });\r\n // Disable echo for secret input\r\n if (process.stdin.isTTY) {\r\n process.stdin.setRawMode?.(false);\r\n }\r\n return new Promise((resolve) => {\r\n rl.question(question, (answer) => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n// ── Shell execution ──────────────────────────────────────────────────────────\r\n\r\nexport interface ExecResult {\r\n stdout: string;\r\n stderr: string;\r\n exitCode: number;\r\n}\r\n\r\nexport async function exec(cmd: string, opts?: { throws?: boolean; input?: string }): Promise<ExecResult> {\r\n return new Promise((resolve, reject) => {\r\n const child = execCb(cmd, { maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {\r\n const exitCode = error?.code ?? 0;\r\n const result = { stdout: stdout.toString(), stderr: stderr.toString(), exitCode: typeof exitCode === \"number\" ? exitCode : 1 };\r\n if (error && opts?.throws !== false) {\r\n reject(Object.assign(error, result));\r\n } else {\r\n resolve(result);\r\n }\r\n });\r\n if (opts?.input) {\r\n child.stdin?.write(opts.input);\r\n child.stdin?.end();\r\n }\r\n });\r\n}\r\n\r\nexport async function which(binary: string): Promise<string | null> {\r\n try {\r\n const result = await exec(`which ${binary}`, { throws: false });\r\n return result.stdout.trim() || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ── Platform detection ───────────────────────────────────────────────────────\r\n\r\nexport interface Platform {\r\n os: \"linux\" | \"darwin\" | \"other\";\r\n distro: string;\r\n packageManager: \"apt\" | \"brew\" | \"dnf\" | \"pacman\" | \"unknown\";\r\n}\r\n\r\nexport function detectPlatform(): Platform {\r\n const os = process.platform === \"linux\" ? \"linux\"\r\n : process.platform === \"darwin\" ? \"darwin\"\r\n : \"other\" as const;\r\n\r\n let distro = \"unknown\";\r\n let packageManager: Platform[\"packageManager\"] = \"unknown\";\r\n\r\n if (os === \"linux\") {\r\n try {\r\n const osRelease = readFileSync(\"/etc/os-release\", \"utf-8\");\r\n const idMatch = osRelease.match(/^ID=(.+)$/m);\r\n const idLikeMatch = osRelease.match(/^ID_LIKE=(.+)$/m);\r\n distro = idMatch?.[1]?.replace(/\"/g, \"\") || \"unknown\";\r\n const idLike = idLikeMatch?.[1]?.replace(/\"/g, \"\") || \"\";\r\n\r\n if (distro === \"ubuntu\" || distro === \"debian\" || idLike.includes(\"debian\")) {\r\n packageManager = \"apt\";\r\n } else if (distro === \"fedora\" || idLike.includes(\"fedora\") || idLike.includes(\"rhel\")) {\r\n packageManager = \"dnf\";\r\n } else if (distro === \"arch\" || idLike.includes(\"arch\")) {\r\n packageManager = \"pacman\";\r\n }\r\n } catch {}\r\n } else if (os === \"darwin\") {\r\n packageManager = \"brew\";\r\n distro = \"macos\";\r\n }\r\n\r\n return { os, distro, packageManager };\r\n}\r\n\r\n// ── Config directory ─────────────────────────────────────────────────────────\r\n\r\nexport function getConfigDir(): string {\r\n const dir = process.env.OPENSENTINEL_HOME || join(homedir(), \".opensentinel\");\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n return dir;\r\n}\r\n\r\nexport function getPackageRoot(): string {\r\n // When running from source: import.meta.dirname is src/commands/\r\n // When installed globally: import.meta.dirname is dist/commands/ or dist/\r\n // Go up to find package.json\r\n let dir = import.meta.dirname || __dirname;\r\n for (let i = 0; i < 5; i++) {\r\n if (existsSync(join(dir, \"package.json\"))) {\r\n return dir;\r\n }\r\n dir = join(dir, \"..\");\r\n }\r\n return process.cwd();\r\n}\r\n\r\nexport function getMigrationsDir(): string {\r\n return join(getPackageRoot(), \"drizzle\");\r\n}\r\n\r\n// ── Port and service checks ──────────────────────────────────────────────────\r\n\r\nexport async function checkPort(port: number): Promise<boolean> {\r\n try {\r\n const result = await exec(`ss -tlnp 2>/dev/null | grep :${port} || netstat -tlnp 2>/dev/null | grep :${port}`, { throws: false });\r\n return result.stdout.trim().length > 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function checkPostgres(): Promise<{ installed: boolean; running: boolean; port: number }> {\r\n const installed = !!(await which(\"psql\"));\r\n let running = false;\r\n let port = 5432;\r\n\r\n if (installed) {\r\n const result = await exec(\"pg_isready -q 2>/dev/null\", { throws: false });\r\n running = result.exitCode === 0;\r\n }\r\n\r\n // Also check if running on non-standard port\r\n if (!running) {\r\n const port5445 = await checkPort(5445);\r\n if (port5445) {\r\n running = true;\r\n port = 5445;\r\n }\r\n }\r\n\r\n return { installed, running, port };\r\n}\r\n\r\nexport async function checkRedis(): Promise<{ installed: boolean; running: boolean; port: number }> {\r\n const installed = !!(await which(\"redis-cli\"));\r\n let running = false;\r\n let port = 6379;\r\n\r\n if (installed) {\r\n const result = await exec(\"redis-cli ping 2>/dev/null\", { throws: false });\r\n running = result.stdout.trim() === \"PONG\";\r\n }\r\n\r\n // Check alternate ports\r\n if (!running) {\r\n for (const p of [6384, 6380]) {\r\n const result = await exec(`redis-cli -p ${p} ping 2>/dev/null`, { throws: false });\r\n if (result.stdout.trim() === \"PONG\") {\r\n running = true;\r\n port = p;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return { installed, running, port };\r\n}\r\n\r\n// ── Banner ───────────────────────────────────────────────────────────────────\r\n\r\nexport function printBanner() {\r\n console.log(`\r\n${colors.cyan}${colors.bold}╔══════════════════════════════════════════╗\r\n║ OPENSENTINEL v3.0.0 ║\r\n║ Your Personal AI Assistant ║\r\n╚══════════════════════════════════════════╝${colors.reset}\r\n`);\r\n}\r\n\r\n// ── .env file loading ────────────────────────────────────────────────────────\r\n\r\nexport function loadEnvFile(): string | null {\r\n const candidates = [\r\n process.env.OPENSENTINEL_HOME && join(process.env.OPENSENTINEL_HOME, \".env\"),\r\n join(homedir(), \".opensentinel\", \".env\"),\r\n join(process.cwd(), \".env\"),\r\n ].filter(Boolean) as string[];\r\n\r\n for (const candidate of candidates) {\r\n if (existsSync(candidate)) {\r\n const content = readFileSync(candidate, \"utf-8\");\r\n for (const line of content.split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eqIndex = trimmed.indexOf(\"=\");\r\n if (eqIndex === -1) continue;\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n const value = trimmed.slice(eqIndex + 1).trim();\r\n // Don't override existing env vars\r\n if (!process.env[key]) {\r\n process.env[key] = value;\r\n }\r\n }\r\n return candidate;\r\n }\r\n }\r\n return null;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createLogger
|
|
3
|
+
} from "./chunk-7BNFELEK.js";
|
|
4
|
+
|
|
5
|
+
// src/integrations/m365/graph-client.ts
|
|
6
|
+
var log = createLogger("m365:graph");
|
|
7
|
+
var GRAPH_ROOT = "https://graph.microsoft.com/v1.0";
|
|
8
|
+
var GraphError = class extends Error {
|
|
9
|
+
constructor(status, code, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = "GraphError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
async function graphFetch(accessToken, path, init) {
|
|
17
|
+
const url = path.startsWith("http") ? path : `${GRAPH_ROOT}${path}`;
|
|
18
|
+
const res = await fetch(url, {
|
|
19
|
+
...init,
|
|
20
|
+
headers: {
|
|
21
|
+
Authorization: `Bearer ${accessToken}`,
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
...init?.headers ?? {}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
let body = null;
|
|
28
|
+
try {
|
|
29
|
+
body = await res.json();
|
|
30
|
+
} catch {
|
|
31
|
+
}
|
|
32
|
+
const code = body?.error?.code || String(res.status);
|
|
33
|
+
const message = body?.error?.message || res.statusText;
|
|
34
|
+
log.warn("graph call failed", { path, status: res.status, code });
|
|
35
|
+
throw new GraphError(res.status, code, message);
|
|
36
|
+
}
|
|
37
|
+
if (res.status === 204) return void 0;
|
|
38
|
+
return await res.json();
|
|
39
|
+
}
|
|
40
|
+
async function getMe(accessToken) {
|
|
41
|
+
return graphFetch(accessToken, "/me");
|
|
42
|
+
}
|
|
43
|
+
async function listMessages(accessToken, opts = {}) {
|
|
44
|
+
const top = Math.max(1, Math.min(opts.top ?? 20, 100));
|
|
45
|
+
const params = new URLSearchParams();
|
|
46
|
+
params.set("$top", String(top));
|
|
47
|
+
if (opts.skip) params.set("$skip", String(opts.skip));
|
|
48
|
+
params.set(
|
|
49
|
+
"$select",
|
|
50
|
+
"id,subject,bodyPreview,from,toRecipients,receivedDateTime,isRead,webLink"
|
|
51
|
+
);
|
|
52
|
+
params.set("$orderby", "receivedDateTime desc");
|
|
53
|
+
if (opts.unreadOnly) params.set("$filter", "isRead eq false");
|
|
54
|
+
if (opts.search) params.set("$search", `"${opts.search.replace(/"/g, "")}"`);
|
|
55
|
+
const base = opts.folder ? `/me/mailFolders/${encodeURIComponent(opts.folder)}/messages` : "/me/messages";
|
|
56
|
+
const resp = await graphFetch(
|
|
57
|
+
accessToken,
|
|
58
|
+
`${base}?${params.toString()}`
|
|
59
|
+
);
|
|
60
|
+
return { value: resp.value, nextLink: resp["@odata.nextLink"] };
|
|
61
|
+
}
|
|
62
|
+
async function getMessage(accessToken, id) {
|
|
63
|
+
const params = new URLSearchParams();
|
|
64
|
+
params.set(
|
|
65
|
+
"$select",
|
|
66
|
+
"id,subject,bodyPreview,from,toRecipients,receivedDateTime,isRead,webLink,body,internetMessageHeaders"
|
|
67
|
+
);
|
|
68
|
+
return graphFetch(
|
|
69
|
+
accessToken,
|
|
70
|
+
`/me/messages/${encodeURIComponent(id)}?${params.toString()}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
function stripHtml(html) {
|
|
74
|
+
return html.replace(/<style[\s\S]*?<\/style>/gi, " ").replace(/<script[\s\S]*?<\/script>/gi, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export {
|
|
78
|
+
GraphError,
|
|
79
|
+
getMe,
|
|
80
|
+
listMessages,
|
|
81
|
+
getMessage,
|
|
82
|
+
stripHtml
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=chunk-PBOCSGNL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/m365/graph-client.ts"],"sourcesContent":["/**\n * Thin Microsoft Graph client — fetch based, no SDK dep.\n *\n * Only the surface needed by routes lives here. Extend as needed; the one-off\n * helpers match the patterns from docs.microsoft.com/graph/api.\n */\n\nimport { createLogger } from \"../../core/logger\";\n\nconst log = createLogger(\"m365:graph\");\nconst GRAPH_ROOT = \"https://graph.microsoft.com/v1.0\";\n\nexport interface GraphMe {\n id: string;\n userPrincipalName?: string;\n mail?: string;\n displayName?: string;\n givenName?: string;\n surname?: string;\n jobTitle?: string;\n}\n\nexport interface GraphMessageSummary {\n id: string;\n subject: string;\n bodyPreview: string;\n from?: { emailAddress: { name: string; address: string } };\n toRecipients?: Array<{ emailAddress: { name: string; address: string } }>;\n receivedDateTime: string;\n isRead: boolean;\n webLink?: string;\n}\n\nexport interface GraphMessageFull extends GraphMessageSummary {\n body?: { contentType: \"html\" | \"text\"; content: string };\n internetMessageHeaders?: Array<{ name: string; value: string }>;\n}\n\nexport class GraphError extends Error {\n constructor(public status: number, public code: string, message: string) {\n super(message);\n this.name = \"GraphError\";\n }\n}\n\nasync function graphFetch<T>(accessToken: string, path: string, init?: RequestInit): Promise<T> {\n const url = path.startsWith(\"http\") ? path : `${GRAPH_ROOT}${path}`;\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n\n if (!res.ok) {\n let body: any = null;\n try {\n body = await res.json();\n } catch {\n /* ignore */\n }\n const code = body?.error?.code || String(res.status);\n const message = body?.error?.message || res.statusText;\n log.warn(\"graph call failed\", { path, status: res.status, code });\n throw new GraphError(res.status, code, message);\n }\n\n // 204 No Content\n if (res.status === 204) return undefined as unknown as T;\n return (await res.json()) as T;\n}\n\nexport async function getMe(accessToken: string): Promise<GraphMe> {\n return graphFetch<GraphMe>(accessToken, \"/me\");\n}\n\nexport interface ListMessagesOptions {\n top?: number;\n skip?: number;\n folder?: string; // e.g. \"inbox\", \"sentitems\"\n unreadOnly?: boolean;\n search?: string;\n}\n\nexport async function listMessages(\n accessToken: string,\n opts: ListMessagesOptions = {}\n): Promise<{ value: GraphMessageSummary[]; nextLink?: string }> {\n const top = Math.max(1, Math.min(opts.top ?? 20, 100));\n const params = new URLSearchParams();\n params.set(\"$top\", String(top));\n if (opts.skip) params.set(\"$skip\", String(opts.skip));\n params.set(\n \"$select\",\n \"id,subject,bodyPreview,from,toRecipients,receivedDateTime,isRead,webLink\"\n );\n params.set(\"$orderby\", \"receivedDateTime desc\");\n if (opts.unreadOnly) params.set(\"$filter\", \"isRead eq false\");\n if (opts.search) params.set(\"$search\", `\"${opts.search.replace(/\"/g, \"\")}\"`);\n\n const base = opts.folder\n ? `/me/mailFolders/${encodeURIComponent(opts.folder)}/messages`\n : \"/me/messages\";\n const resp = await graphFetch<{ value: GraphMessageSummary[]; \"@odata.nextLink\"?: string }>(\n accessToken,\n `${base}?${params.toString()}`\n );\n return { value: resp.value, nextLink: resp[\"@odata.nextLink\"] };\n}\n\nexport async function getMessage(accessToken: string, id: string): Promise<GraphMessageFull> {\n const params = new URLSearchParams();\n params.set(\n \"$select\",\n \"id,subject,bodyPreview,from,toRecipients,receivedDateTime,isRead,webLink,body,internetMessageHeaders\"\n );\n return graphFetch<GraphMessageFull>(\n accessToken,\n `/me/messages/${encodeURIComponent(id)}?${params.toString()}`\n );\n}\n\nexport function stripHtml(html: string): string {\n return html\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n"],"mappings":";;;;;AASA,IAAM,MAAM,aAAa,YAAY;AACrC,IAAM,aAAa;AA4BZ,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAmB,QAAuB,MAAc,SAAiB;AACvE,UAAM,OAAO;AADI;AAAuB;AAExC,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAe,WAAc,aAAqB,MAAc,MAAgC;AAC9F,QAAM,MAAM,KAAK,WAAW,MAAM,IAAI,OAAO,GAAG,UAAU,GAAG,IAAI;AACjE,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,GAAG;AAAA,IACH,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,gBAAgB;AAAA,MAChB,GAAI,MAAM,WAAW,CAAC;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,QAAI,OAAY;AAChB,QAAI;AACF,aAAO,MAAM,IAAI,KAAK;AAAA,IACxB,QAAQ;AAAA,IAER;AACA,UAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,IAAI,MAAM;AACnD,UAAM,UAAU,MAAM,OAAO,WAAW,IAAI;AAC5C,QAAI,KAAK,qBAAqB,EAAE,MAAM,QAAQ,IAAI,QAAQ,KAAK,CAAC;AAChE,UAAM,IAAI,WAAW,IAAI,QAAQ,MAAM,OAAO;AAAA,EAChD;AAGA,MAAI,IAAI,WAAW,IAAK,QAAO;AAC/B,SAAQ,MAAM,IAAI,KAAK;AACzB;AAEA,eAAsB,MAAM,aAAuC;AACjE,SAAO,WAAoB,aAAa,KAAK;AAC/C;AAUA,eAAsB,aACpB,aACA,OAA4B,CAAC,GACiC;AAC9D,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC;AACrD,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO,IAAI,QAAQ,OAAO,GAAG,CAAC;AAC9B,MAAI,KAAK,KAAM,QAAO,IAAI,SAAS,OAAO,KAAK,IAAI,CAAC;AACpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACA,SAAO,IAAI,YAAY,uBAAuB;AAC9C,MAAI,KAAK,WAAY,QAAO,IAAI,WAAW,iBAAiB;AAC5D,MAAI,KAAK,OAAQ,QAAO,IAAI,WAAW,IAAI,KAAK,OAAO,QAAQ,MAAM,EAAE,CAAC,GAAG;AAE3E,QAAM,OAAO,KAAK,SACd,mBAAmB,mBAAmB,KAAK,MAAM,CAAC,cAClD;AACJ,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA,GAAG,IAAI,IAAI,OAAO,SAAS,CAAC;AAAA,EAC9B;AACA,SAAO,EAAE,OAAO,KAAK,OAAO,UAAU,KAAK,iBAAiB,EAAE;AAChE;AAEA,eAAsB,WAAW,aAAqB,IAAuC;AAC3F,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,mBAAmB,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC;AAAA,EAC7D;AACF;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KACJ,QAAQ,6BAA6B,GAAG,EACxC,QAAQ,+BAA+B,GAAG,EAC1C,QAAQ,YAAY,GAAG,EACvB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatWithTools
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZMML6T63.js";
|
|
4
4
|
|
|
5
5
|
// src/inputs/whatsapp/index.ts
|
|
6
6
|
import makeWASocket, {
|
|
@@ -120,4 +120,4 @@ export {
|
|
|
120
120
|
WhatsAppBot,
|
|
121
121
|
whatsapp_default
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-PD3CTDO6.js.map
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decryptField,
|
|
3
|
+
encryptField,
|
|
4
|
+
isEncryptionAvailable
|
|
5
|
+
} from "./chunk-DTISLIMB.js";
|
|
1
6
|
import {
|
|
2
7
|
db
|
|
3
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-5BTVJR7R.js";
|
|
4
9
|
import {
|
|
5
10
|
env
|
|
6
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
7
12
|
import {
|
|
8
13
|
archivedMemories,
|
|
9
14
|
memories
|
|
10
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
11
16
|
|
|
12
17
|
// src/core/embeddings/provider.ts
|
|
13
18
|
var AbstractEmbeddingProvider = class {
|
|
@@ -389,87 +394,6 @@ async function generateEmbedding(text) {
|
|
|
389
394
|
// src/core/memory.ts
|
|
390
395
|
import { eq, desc, sql } from "drizzle-orm";
|
|
391
396
|
import OpenAI from "openai";
|
|
392
|
-
|
|
393
|
-
// src/core/security/field-encryption.ts
|
|
394
|
-
import { createCipheriv, createDecipheriv, randomBytes } from "crypto";
|
|
395
|
-
var ALGORITHM = "aes-256-gcm";
|
|
396
|
-
var IV_LENGTH = 16;
|
|
397
|
-
var TAG_LENGTH = 16;
|
|
398
|
-
var KEY_LENGTH = 32;
|
|
399
|
-
var CURRENT_KEY_VERSION = 1;
|
|
400
|
-
var _masterKey = null;
|
|
401
|
-
function getMasterKey() {
|
|
402
|
-
if (_masterKey) return _masterKey;
|
|
403
|
-
const keyBase64 = env.ENCRYPTION_MASTER_KEY;
|
|
404
|
-
if (keyBase64) {
|
|
405
|
-
const key = Buffer.from(keyBase64, "base64");
|
|
406
|
-
if (key.length !== KEY_LENGTH) {
|
|
407
|
-
throw new Error(
|
|
408
|
-
`ENCRYPTION_MASTER_KEY must be ${KEY_LENGTH} bytes (${KEY_LENGTH * 4 / 3} base64 chars). Got ${key.length} bytes.`
|
|
409
|
-
);
|
|
410
|
-
}
|
|
411
|
-
_masterKey = key;
|
|
412
|
-
return _masterKey;
|
|
413
|
-
}
|
|
414
|
-
if (env.NODE_ENV === "production") {
|
|
415
|
-
throw new Error(
|
|
416
|
-
`ENCRYPTION_MASTER_KEY is required in production for SOC 2 compliance. Generate one with: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"`
|
|
417
|
-
);
|
|
418
|
-
}
|
|
419
|
-
console.warn("[field-encryption] No ENCRYPTION_MASTER_KEY set \u2014 using ephemeral key (dev only)");
|
|
420
|
-
_masterKey = randomBytes(KEY_LENGTH);
|
|
421
|
-
return _masterKey;
|
|
422
|
-
}
|
|
423
|
-
function encryptField(plaintext) {
|
|
424
|
-
if (plaintext === null || plaintext === void 0) return null;
|
|
425
|
-
const key = getMasterKey();
|
|
426
|
-
const iv = randomBytes(IV_LENGTH);
|
|
427
|
-
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
428
|
-
const encrypted = Buffer.concat([
|
|
429
|
-
cipher.update(plaintext, "utf8"),
|
|
430
|
-
cipher.final()
|
|
431
|
-
]);
|
|
432
|
-
const tag = cipher.getAuthTag();
|
|
433
|
-
const combined = Buffer.concat([
|
|
434
|
-
Buffer.from([CURRENT_KEY_VERSION]),
|
|
435
|
-
iv,
|
|
436
|
-
tag,
|
|
437
|
-
encrypted
|
|
438
|
-
]);
|
|
439
|
-
return combined.toString("base64");
|
|
440
|
-
}
|
|
441
|
-
function decryptField(encryptedBase64) {
|
|
442
|
-
if (encryptedBase64 === null || encryptedBase64 === void 0) return null;
|
|
443
|
-
const combined = Buffer.from(encryptedBase64, "base64");
|
|
444
|
-
if (combined.length < 1 + IV_LENGTH + TAG_LENGTH + 1) {
|
|
445
|
-
throw new Error("Encrypted data too short");
|
|
446
|
-
}
|
|
447
|
-
const keyVersion = combined[0];
|
|
448
|
-
if (keyVersion !== CURRENT_KEY_VERSION) {
|
|
449
|
-
throw new Error(`Unsupported encryption key version: ${keyVersion}`);
|
|
450
|
-
}
|
|
451
|
-
const iv = combined.subarray(1, 1 + IV_LENGTH);
|
|
452
|
-
const tag = combined.subarray(1 + IV_LENGTH, 1 + IV_LENGTH + TAG_LENGTH);
|
|
453
|
-
const ciphertext = combined.subarray(1 + IV_LENGTH + TAG_LENGTH);
|
|
454
|
-
const key = getMasterKey();
|
|
455
|
-
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
456
|
-
decipher.setAuthTag(tag);
|
|
457
|
-
const decrypted = Buffer.concat([
|
|
458
|
-
decipher.update(ciphertext),
|
|
459
|
-
decipher.final()
|
|
460
|
-
]);
|
|
461
|
-
return decrypted.toString("utf8");
|
|
462
|
-
}
|
|
463
|
-
function isEncryptionAvailable() {
|
|
464
|
-
try {
|
|
465
|
-
getMasterKey();
|
|
466
|
-
return true;
|
|
467
|
-
} catch {
|
|
468
|
-
return false;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// src/core/memory.ts
|
|
473
397
|
var _openai = null;
|
|
474
398
|
function getOpenAI() {
|
|
475
399
|
if (!_openai) {
|
|
@@ -674,7 +598,7 @@ async function buildMemoryContext(query, userId, conversationHistory) {
|
|
|
674
598
|
const anyAdvancedEnabled = env.HYDE_ENABLED || env.RERANK_ENABLED || env.MULTISTEP_RAG_ENABLED || env.RETRIEVAL_CACHE_ENABLED || env.CONTEXTUAL_QUERY_ENABLED;
|
|
675
599
|
if (anyAdvancedEnabled) {
|
|
676
600
|
try {
|
|
677
|
-
const { enhancedRetrieve } = await import("./enhanced-retrieval-
|
|
601
|
+
const { enhancedRetrieve } = await import("./enhanced-retrieval-JWX2HWU4.js");
|
|
678
602
|
const result = await enhancedRetrieve(query, { userId, limit: 5, conversationHistory });
|
|
679
603
|
if (result.results.length === 0) {
|
|
680
604
|
return "";
|
|
@@ -709,7 +633,6 @@ ${memoryStrings.join("\n")}`;
|
|
|
709
633
|
|
|
710
634
|
export {
|
|
711
635
|
TFIDFProvider,
|
|
712
|
-
decryptField,
|
|
713
636
|
initializeEmbeddings,
|
|
714
637
|
generateEmbedding2 as generateEmbedding,
|
|
715
638
|
storeMemory,
|
|
@@ -721,4 +644,4 @@ export {
|
|
|
721
644
|
extractMemories,
|
|
722
645
|
buildMemoryContext
|
|
723
646
|
};
|
|
724
|
-
//# sourceMappingURL=chunk-
|
|
647
|
+
//# sourceMappingURL=chunk-QPY3WRVM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/embeddings/provider.ts","../src/core/embeddings/adapter.ts","../src/core/embeddings/registry.ts","../src/core/embeddings/index.ts","../src/core/memory.ts"],"sourcesContent":["/**\n * Embedding Provider Interface & Implementations\n *\n * Unified embedding system supporting OpenAI, HuggingFace, and TF-IDF backends.\n * Extracted from src/core/intelligence/rag-pipeline.ts and extended.\n */\n\nexport interface EmbeddingProvider {\n name: string;\n dimensions: number;\n embed(texts: string[]): Promise<number[][]>;\n embedSingle(text: string): Promise<number[]>;\n}\n\nexport abstract class AbstractEmbeddingProvider implements EmbeddingProvider {\n abstract name: string;\n abstract dimensions: number;\n abstract embed(texts: string[]): Promise<number[][]>;\n\n async embedSingle(text: string): Promise<number[]> {\n const [embedding] = await this.embed([text]);\n return embedding;\n }\n}\n\n/**\n * OpenAI Embedding Provider\n */\nexport class OpenAIEmbeddingProvider extends AbstractEmbeddingProvider {\n name = \"openai\";\n dimensions: number;\n private apiKey: string;\n private model: string;\n\n private static MODEL_DIMENSIONS: Record<string, number> = {\n \"text-embedding-3-small\": 1536,\n \"text-embedding-3-large\": 3072,\n \"text-embedding-ada-002\": 1536,\n };\n\n constructor(apiKey: string, model = \"text-embedding-3-small\") {\n super();\n this.apiKey = apiKey;\n this.model = model;\n this.dimensions =\n OpenAIEmbeddingProvider.MODEL_DIMENSIONS[model] ?? 1536;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ input: texts, model: this.model }),\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI embedding failed: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n return data.data.map((d) => d.embedding);\n }\n}\n\n/**\n * HuggingFace Inference API Embedding Provider\n */\nexport class HuggingFaceEmbeddingProvider extends AbstractEmbeddingProvider {\n name = \"huggingface\";\n dimensions: number;\n private accessToken: string;\n private model: string;\n private batchSize: number;\n\n constructor(\n accessToken: string,\n model = \"sentence-transformers/all-MiniLM-L6-v2\",\n dimensions = 384,\n batchSize = 32\n ) {\n super();\n this.accessToken = accessToken;\n this.model = model;\n this.dimensions = dimensions;\n this.batchSize = batchSize;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n const allEmbeddings: number[][] = [];\n\n for (let i = 0; i < texts.length; i += this.batchSize) {\n const batch = texts.slice(i, i + this.batchSize);\n const embeddings = await this.embedBatch(batch);\n allEmbeddings.push(...embeddings);\n }\n\n return allEmbeddings;\n }\n\n private async embedBatch(\n texts: string[],\n retries = 3\n ): Promise<number[][]> {\n const url = `https://api-inference.huggingface.co/pipeline/feature-extraction/${this.model}`;\n\n for (let attempt = 0; attempt < retries; attempt++) {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n inputs: texts,\n options: { wait_for_model: true },\n }),\n });\n\n if (response.status === 429) {\n const delay = Math.pow(2, attempt) * 1000;\n await new Promise((r) => setTimeout(r, delay));\n continue;\n }\n\n if (response.status === 503) {\n // Model loading, wait and retry\n const delay = Math.pow(2, attempt) * 2000;\n await new Promise((r) => setTimeout(r, delay));\n continue;\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `HuggingFace embedding failed: ${response.status} ${body}`\n );\n }\n\n const data = await response.json();\n return this.processResponse(data, texts.length);\n }\n\n throw new Error(\n `HuggingFace embedding failed after ${retries} retries`\n );\n }\n\n /**\n * HuggingFace returns different shapes depending on the model:\n * - Sentence-level: number[][] (one embedding per input)\n * - Token-level: number[][][] (one embedding per token per input, needs mean pooling)\n */\n private processResponse(\n data: unknown,\n expectedCount: number\n ): number[][] {\n if (!Array.isArray(data) || data.length === 0) {\n throw new Error(\"HuggingFace returned empty response\");\n }\n\n // Sentence-level: [[0.1, 0.2, ...], [0.3, 0.4, ...]]\n if (typeof data[0][0] === \"number\") {\n return (data as number[][]).map((v) => this.l2Normalize(v));\n }\n\n // Token-level: [[[0.1, 0.2, ...], [0.3, 0.4, ...]], ...]\n // Need mean pooling across tokens\n if (Array.isArray(data[0][0])) {\n return (data as number[][][]).map((tokenEmbeddings) =>\n this.l2Normalize(this.meanPool(tokenEmbeddings))\n );\n }\n\n throw new Error(\n `Unexpected HuggingFace response shape: ${typeof data[0][0]}`\n );\n }\n\n private meanPool(tokenEmbeddings: number[][]): number[] {\n if (tokenEmbeddings.length === 0) return [];\n const dims = tokenEmbeddings[0].length;\n const result = new Array(dims).fill(0);\n\n for (const token of tokenEmbeddings) {\n for (let i = 0; i < dims; i++) {\n result[i] += token[i];\n }\n }\n\n const count = tokenEmbeddings.length;\n for (let i = 0; i < dims; i++) {\n result[i] /= count;\n }\n\n return result;\n }\n\n private l2Normalize(vector: number[]): number[] {\n const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));\n if (norm === 0) return vector;\n return vector.map((v) => v / norm);\n }\n}\n\n/**\n * TF-IDF Embedding Provider (zero-dependency fallback)\n */\nexport class TFIDFProvider extends AbstractEmbeddingProvider {\n name = \"tfidf\";\n dimensions = 256;\n private vocabulary = new Map<string, number>();\n private idf = new Map<string, number>();\n private docCount = 0;\n\n private tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length > 1);\n }\n\n buildVocabulary(documents: string[]): void {\n this.docCount = documents.length;\n const docFreq = new Map<string, number>();\n\n for (const doc of documents) {\n const tokens = new Set(this.tokenize(doc));\n for (const token of tokens) {\n docFreq.set(token, (docFreq.get(token) || 0) + 1);\n }\n }\n\n const sorted = Array.from(docFreq.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, this.dimensions);\n\n sorted.forEach(([term, df], i) => {\n this.vocabulary.set(term, i);\n this.idf.set(term, Math.log(this.docCount / (1 + df)));\n });\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (this.vocabulary.size === 0) {\n this.buildVocabulary(texts);\n }\n\n return texts.map((text) => {\n const tokens = this.tokenize(text);\n const tf = new Map<string, number>();\n for (const token of tokens) {\n tf.set(token, (tf.get(token) || 0) + 1);\n }\n\n const vector = new Array(this.dimensions).fill(0);\n for (const [term, freq] of tf) {\n const idx = this.vocabulary.get(term);\n if (idx !== undefined) {\n const tfidf =\n (freq / tokens.length) * (this.idf.get(term) || 1);\n vector[idx] = tfidf;\n }\n }\n\n // L2 normalize\n const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));\n if (norm > 0) {\n for (let i = 0; i < vector.length; i++) {\n vector[i] /= norm;\n }\n }\n return vector;\n });\n }\n}\n","/**\n * Dimension Adapter\n *\n * Bridges provider-native embedding dimensions with database column dimensions.\n * Zero-padding preserves cosine similarity for same-provider vectors.\n */\n\nexport class DimensionAdapter {\n private providerDimensions: number;\n private dbDimensions: number;\n\n constructor(providerDimensions: number, dbDimensions: number) {\n this.providerDimensions = providerDimensions;\n this.dbDimensions = dbDimensions;\n }\n\n needsAdaptation(): boolean {\n return this.providerDimensions !== this.dbDimensions;\n }\n\n adapt(embedding: number[]): number[] {\n if (embedding.length === this.dbDimensions) return embedding;\n\n if (embedding.length < this.dbDimensions) {\n // Zero-pad: cosine similarity is preserved for same-provider vectors\n const padded = new Array(this.dbDimensions).fill(0);\n for (let i = 0; i < embedding.length; i++) {\n padded[i] = embedding[i];\n }\n return padded;\n }\n\n // Truncate (valid for Matryoshka models like OpenAI text-embedding-3-*)\n return embedding.slice(0, this.dbDimensions);\n }\n\n adaptBatch(embeddings: number[][]): number[][] {\n if (!this.needsAdaptation()) return embeddings;\n return embeddings.map((e) => this.adapt(e));\n }\n\n getProviderDimensions(): number {\n return this.providerDimensions;\n }\n\n getDbDimensions(): number {\n return this.dbDimensions;\n }\n}\n","/**\n * Embedding Registry - Singleton\n *\n * Manages the active embedding provider and dimension adapter.\n */\n\nimport type { EmbeddingProvider } from \"./provider\";\nimport { DimensionAdapter } from \"./adapter\";\n\nexport interface EmbeddingConfig {\n provider: \"openai\" | \"huggingface\" | \"tfidf\";\n model?: string;\n dimensions: number;\n dbDimensions: number;\n}\n\nconst MODEL_DIMENSIONS: Record<string, number> = {\n // OpenAI\n \"text-embedding-3-small\": 1536,\n \"text-embedding-3-large\": 3072,\n \"text-embedding-ada-002\": 1536,\n // HuggingFace sentence-transformers\n \"sentence-transformers/all-MiniLM-L6-v2\": 384,\n \"sentence-transformers/all-mpnet-base-v2\": 768,\n \"sentence-transformers/all-MiniLM-L12-v2\": 384,\n \"sentence-transformers/paraphrase-MiniLM-L6-v2\": 384,\n // BAAI\n \"BAAI/bge-small-en-v1.5\": 384,\n \"BAAI/bge-base-en-v1.5\": 768,\n \"BAAI/bge-large-en-v1.5\": 1024,\n};\n\nexport class EmbeddingRegistry {\n private provider: EmbeddingProvider | null = null;\n private adapter: DimensionAdapter | null = null;\n private config: EmbeddingConfig | null = null;\n\n initialize(provider: EmbeddingProvider, config: EmbeddingConfig): void {\n this.provider = provider;\n this.config = config;\n this.adapter = new DimensionAdapter(\n provider.dimensions,\n config.dbDimensions\n );\n\n if (this.adapter.needsAdaptation()) {\n const action =\n provider.dimensions < config.dbDimensions\n ? \"zero-padded\"\n : \"truncated\";\n console.log(\n `[Embeddings] Provider: ${provider.name} (${provider.dimensions} dims, ${action} to ${config.dbDimensions})`\n );\n } else {\n console.log(\n `[Embeddings] Provider: ${provider.name} (${provider.dimensions} dims)`\n );\n }\n }\n\n isInitialized(): boolean {\n return this.provider !== null;\n }\n\n getProvider(): EmbeddingProvider {\n if (!this.provider) {\n throw new Error(\n \"[Embeddings] Not initialized. Call initializeEmbeddings() first.\"\n );\n }\n return this.provider;\n }\n\n getAdapter(): DimensionAdapter {\n if (!this.adapter) {\n throw new Error(\n \"[Embeddings] Not initialized. Call initializeEmbeddings() first.\"\n );\n }\n return this.adapter;\n }\n\n getConfig(): EmbeddingConfig {\n if (!this.config) {\n throw new Error(\n \"[Embeddings] Not initialized. Call initializeEmbeddings() first.\"\n );\n }\n return this.config;\n }\n\n getDimensions(): number {\n return this.getProvider().dimensions;\n }\n\n getDbDimensions(): number {\n return this.getConfig().dbDimensions;\n }\n\n static resolveModelDimensions(\n model: string,\n explicitDimensions?: number\n ): number {\n return explicitDimensions ?? MODEL_DIMENSIONS[model] ?? 384;\n }\n}\n\nexport const embeddingRegistry = new EmbeddingRegistry();\n","/**\n * Embedding System - Public API\n *\n * Unified entry point for all embedding operations.\n * Supports OpenAI, HuggingFace, and TF-IDF backends.\n */\n\nimport { env } from \"../../config/env\";\nimport {\n OpenAIEmbeddingProvider,\n HuggingFaceEmbeddingProvider,\n TFIDFProvider,\n} from \"./provider\";\nimport { embeddingRegistry } from \"./registry\";\nimport { EmbeddingRegistry } from \"./registry\";\nimport type { EmbeddingProvider } from \"./provider\";\n\nexport type { EmbeddingProvider } from \"./provider\";\nexport {\n OpenAIEmbeddingProvider,\n HuggingFaceEmbeddingProvider,\n TFIDFProvider,\n} from \"./provider\";\nexport { embeddingRegistry } from \"./registry\";\nexport { DimensionAdapter } from \"./adapter\";\n\nlet _initPromise: Promise<void> | null = null;\n\n/**\n * Initialize the embedding subsystem from environment config.\n * Called at startup; also auto-called lazily on first use.\n */\nexport async function initializeEmbeddings(): Promise<void> {\n if (embeddingRegistry.isInitialized()) return;\n\n const providerType = ((env as any).EMBEDDING_PROVIDER || \"openai\") as\n | \"openai\"\n | \"huggingface\"\n | \"tfidf\";\n const model = (env as any).EMBEDDING_MODEL as string | undefined;\n const explicitDimensions = (env as any).EMBEDDING_DIMENSIONS as\n | number\n | undefined;\n const dbDimensions =\n ((env as any).EMBEDDING_DB_DIMENSIONS as number | undefined) ?? 1536;\n\n let provider: EmbeddingProvider;\n\n switch (providerType) {\n case \"huggingface\": {\n const token = env.HUGGINGFACE_ACCESS_TOKEN;\n if (!token) {\n throw new Error(\n \"[Embeddings] HUGGINGFACE_ACCESS_TOKEN required for huggingface provider\"\n );\n }\n const hfModel = model || \"sentence-transformers/all-MiniLM-L6-v2\";\n const dims = EmbeddingRegistry.resolveModelDimensions(\n hfModel,\n explicitDimensions\n );\n const batchSize =\n ((env as any).EMBEDDING_BATCH_SIZE as number | undefined) ?? 32;\n provider = new HuggingFaceEmbeddingProvider(\n token,\n hfModel,\n dims,\n batchSize\n );\n break;\n }\n case \"tfidf\": {\n provider = new TFIDFProvider();\n console.log(\"[Embeddings] Using TF-IDF fallback (no API required)\");\n break;\n }\n case \"openai\":\n default: {\n const apiKey = env.OPENAI_API_KEY;\n if (!apiKey) {\n console.warn(\n \"[Embeddings] OPENAI_API_KEY not set, falling back to TF-IDF\"\n );\n provider = new TFIDFProvider();\n break;\n }\n const oaiModel = model || \"text-embedding-3-small\";\n provider = new OpenAIEmbeddingProvider(apiKey, oaiModel);\n break;\n }\n }\n\n embeddingRegistry.initialize(provider, {\n provider: providerType,\n model,\n dimensions: provider.dimensions,\n dbDimensions,\n });\n}\n\n/**\n * Ensure embeddings are initialized (lazy fallback).\n */\nasync function ensureInitialized(): Promise<void> {\n if (embeddingRegistry.isInitialized()) return;\n if (!_initPromise) {\n _initPromise = initializeEmbeddings();\n }\n await _initPromise;\n}\n\n/**\n * Generate an embedding for a single text.\n * Returns a vector adapted to the database column dimensions.\n */\nexport async function generateEmbedding(text: string): Promise<number[]> {\n await ensureInitialized();\n const provider = embeddingRegistry.getProvider();\n const adapter = embeddingRegistry.getAdapter();\n const raw = await provider.embedSingle(text);\n return adapter.adapt(raw);\n}\n\n/**\n * Generate embeddings for multiple texts in batch.\n * Returns vectors adapted to the database column dimensions.\n */\nexport async function generateEmbeddings(\n texts: string[]\n): Promise<number[][]> {\n if (texts.length === 0) return [];\n await ensureInitialized();\n const provider = embeddingRegistry.getProvider();\n const adapter = embeddingRegistry.getAdapter();\n const raw = await provider.embed(texts);\n return adapter.adaptBatch(raw);\n}\n\n/**\n * Get the native provider dimensions (before adaptation).\n */\nexport function getEmbeddingDimensions(): number {\n return embeddingRegistry.getDimensions();\n}\n\n/**\n * Get the database column dimensions (after adaptation).\n */\nexport function getEmbeddingDbDimensions(): number {\n return embeddingRegistry.getDbDimensions();\n}\n\n/**\n * Get the active embedding provider name.\n */\nexport function getEmbeddingProviderName(): string {\n return embeddingRegistry.getProvider().name;\n}\n","import { db, memories, archivedMemories, type NewMemory, type Memory } from \"../db\";\r\nimport { eq, desc, sql, and } from \"drizzle-orm\";\r\nimport OpenAI from \"openai\";\r\nimport { env } from \"../config/env\";\r\nimport { encryptField, decryptField, isEncryptionAvailable } from \"./security/field-encryption\";\r\nimport { generateEmbedding as embeddingGenerateEmbedding } from \"./embeddings\";\r\n\r\n// Lazy OpenAI client — used only for extractMemories (LLM call, not embeddings)\r\nlet _openai: OpenAI | null = null;\r\nfunction getOpenAI(): OpenAI {\r\n if (!_openai) {\r\n _openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });\r\n }\r\n return _openai;\r\n}\r\nconst openai = new Proxy({} as OpenAI, {\r\n get(_target, prop) {\r\n const instance = getOpenAI();\r\n const value = (instance as any)[prop];\r\n if (typeof value === \"function\") {\r\n return value.bind(instance);\r\n }\r\n return value;\r\n },\r\n});\r\n\r\n// Generate embedding using the configured provider (OpenAI, HuggingFace, or TF-IDF)\r\nexport async function generateEmbedding(text: string): Promise<number[]> {\r\n return embeddingGenerateEmbedding(text);\r\n}\r\n\r\n// Store a new memory with embedding and tsvector\r\n// Content is encrypted at rest when ENCRYPTION_MASTER_KEY is configured\r\nexport async function storeMemory(\r\n memory: Omit<NewMemory, \"embedding\" | \"searchVector\">\r\n): Promise<Memory> {\r\n // Generate embedding from plaintext BEFORE encryption (vectors can't be encrypted)\r\n const embedding = await generateEmbedding(memory.content);\r\n\r\n // Encrypt content at rest if encryption is available\r\n const shouldEncrypt = isEncryptionAvailable();\r\n const contentForDb = shouldEncrypt ? encryptField(memory.content)! : memory.content;\r\n\r\n const [stored] = await db\r\n .insert(memories)\r\n .values({\r\n ...memory,\r\n content: contentForDb,\r\n encrypted: shouldEncrypt,\r\n embedding,\r\n provenance: memory.provenance || `${memory.source || \"unknown\"}:auto`,\r\n })\r\n .returning();\r\n\r\n // Update tsvector for full-text search (uses plaintext for indexing)\r\n try {\r\n await db.execute(sql`\r\n UPDATE memories\r\n SET search_vector = to_tsvector('english', ${memory.content})\r\n WHERE id = ${stored.id}\r\n `);\r\n } catch {\r\n // tsvector update is non-critical\r\n }\r\n\r\n // Return with plaintext content (caller expects readable content)\r\n return { ...stored, content: memory.content };\r\n}\r\n\r\n// Update an existing memory\r\nexport async function updateMemory(\r\n id: string,\r\n updates: { content?: string; type?: string; importance?: number }\r\n): Promise<Memory | null> {\r\n // Build SET clause dynamically\r\n const setClauses: any[] = [];\r\n if (updates.content) {\r\n const newEmbedding = await generateEmbedding(updates.content);\r\n setClauses.push(sql`content = ${updates.content}`);\r\n setClauses.push(sql`embedding = ${JSON.stringify(newEmbedding)}::vector`);\r\n setClauses.push(sql`search_vector = to_tsvector('english', ${updates.content})`);\r\n }\r\n if (updates.type) {\r\n setClauses.push(sql`type = ${updates.type}`);\r\n }\r\n if (updates.importance !== undefined) {\r\n setClauses.push(sql`importance = ${updates.importance}`);\r\n }\r\n\r\n if (setClauses.length === 0) return null;\r\n\r\n const result = await db.execute(sql`\r\n UPDATE memories\r\n SET ${sql.join(setClauses, sql`, `)}\r\n WHERE id = ${id}\r\n RETURNING *\r\n `);\r\n\r\n return (result as any[])[0] || null;\r\n}\r\n\r\n// Delete a memory (soft-delete: move to archived)\r\nexport async function deleteMemory(id: string): Promise<boolean> {\r\n // Get the memory first\r\n const result = await db.execute(sql`\r\n SELECT * FROM memories WHERE id = ${id}\r\n `);\r\n const memory = (result as any[])[0];\r\n if (!memory) return false;\r\n\r\n // Archive it\r\n await db.insert(archivedMemories).values({\r\n originalMemoryId: memory.id,\r\n userId: memory.user_id,\r\n type: memory.type,\r\n content: memory.content,\r\n reason: \"user_request\",\r\n originalCreatedAt: memory.created_at,\r\n });\r\n\r\n // Delete from active memories\r\n await db.execute(sql`DELETE FROM memories WHERE id = ${id}`);\r\n\r\n return true;\r\n}\r\n\r\n// Export memories as Markdown or JSON\r\nexport async function exportMemories(\r\n userId?: string,\r\n format: \"markdown\" | \"json\" = \"markdown\"\r\n): Promise<string> {\r\n const mems = await db\r\n .select()\r\n .from(memories)\r\n .where(userId ? eq(memories.userId, userId) : undefined)\r\n .orderBy(desc(memories.createdAt));\r\n\r\n // Decrypt encrypted memories\r\n for (const m of mems) {\r\n if ((m as any).encrypted) {\r\n try {\r\n (m as any).content = decryptField(m.content) ?? m.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n }\r\n\r\n if (format === \"json\") {\r\n return JSON.stringify(\r\n mems.map((m) => ({\r\n id: m.id,\r\n type: m.type,\r\n content: m.content,\r\n importance: m.importance,\r\n source: m.source,\r\n provenance: (m as any).provenance,\r\n createdAt: m.createdAt,\r\n })),\r\n null,\r\n 2\r\n );\r\n }\r\n\r\n // Markdown format\r\n const lines = [\r\n \"# Memories Export\",\r\n `Exported: ${new Date().toISOString()}`,\r\n `Total: ${mems.length} memories`,\r\n \"\",\r\n ];\r\n\r\n for (const m of mems) {\r\n lines.push(`## [${m.type}] (Importance: ${m.importance}/10)`);\r\n lines.push(m.content);\r\n lines.push(`_Source: ${m.source || \"unknown\"} | Created: ${m.createdAt.toISOString()}_`);\r\n lines.push(\"\");\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n// Search memories by semantic similarity\r\nexport async function searchMemories(\r\n query: string,\r\n userId?: string,\r\n limit = 5\r\n): Promise<Memory[]> {\r\n const queryEmbedding = await generateEmbedding(query);\r\n\r\n // Use pgvector cosine similarity search\r\n const results = await db.execute(sql`\r\n SELECT\r\n id, user_id, type, content, importance, source, provenance, metadata,\r\n last_accessed, created_at,\r\n 1 - (embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity\r\n FROM memories\r\n ${userId ? sql`WHERE user_id = ${userId}` : sql``}\r\n ORDER BY embedding <=> ${JSON.stringify(queryEmbedding)}::vector\r\n LIMIT ${limit}\r\n `);\r\n\r\n // Update last_accessed for retrieved memories\r\n const rows = results as any[];\r\n const memoryIds = rows.map((r: any) => r.id);\r\n if (memoryIds.length > 0) {\r\n await db.execute(sql`\r\n UPDATE memories\r\n SET last_accessed = NOW()\r\n WHERE id = ANY(${memoryIds}::uuid[])\r\n `);\r\n }\r\n\r\n // Decrypt content for any encrypted memories\r\n for (const row of rows) {\r\n if (row.encrypted) {\r\n try {\r\n row.content = decryptField(row.content) ?? row.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n }\r\n\r\n return rows as Memory[];\r\n}\r\n\r\n// Get a single memory by ID\r\nexport async function getMemoryById(id: string): Promise<Memory | null> {\r\n const result = await db.execute(sql`\r\n SELECT * FROM memories WHERE id = ${id}\r\n `);\r\n const row = (result as any[])[0] || null;\r\n if (row && row.encrypted) {\r\n try {\r\n row.content = decryptField(row.content) ?? row.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n return row;\r\n}\r\n\r\n// Get recent memories for a user\r\nexport async function getRecentMemories(\r\n userId: string,\r\n limit = 10\r\n): Promise<Memory[]> {\r\n return db\r\n .select()\r\n .from(memories)\r\n .where(eq(memories.userId, userId))\r\n .orderBy(desc(memories.createdAt))\r\n .limit(limit);\r\n}\r\n\r\n// Extract and store memories from a conversation turn\r\nexport async function extractMemories(\r\n content: string,\r\n userId?: string\r\n): Promise<Memory[]> {\r\n // Use Claude to extract memorable facts\r\n const extractionPrompt = `Analyze this text and extract any important facts that should be remembered about the user or their preferences. Return a JSON array of objects with \"content\" (the fact), \"type\" (semantic/episodic/procedural), and \"importance\" (1-10).\r\n\r\nText: \"${content}\"\r\n\r\nReturn only the JSON array, no other text. If no memorable facts, return [].`;\r\n\r\n try {\r\n const response = await openai.chat.completions.create({\r\n model: \"gpt-4o-mini\",\r\n messages: [{ role: \"user\", content: extractionPrompt }],\r\n response_format: { type: \"json_object\" },\r\n });\r\n\r\n const extracted = JSON.parse(\r\n response.choices[0].message.content || '{\"memories\":[]}'\r\n );\r\n const memoriesToStore = extracted.memories || extracted || [];\r\n\r\n const storedMemories: Memory[] = [];\r\n for (const mem of memoriesToStore) {\r\n if (mem.content && mem.content.length > 5) {\r\n const stored = await storeMemory({\r\n userId,\r\n content: mem.content,\r\n type: mem.type || \"semantic\",\r\n importance: mem.importance || 5,\r\n source: \"conversation\",\r\n provenance: \"extraction:auto\",\r\n });\r\n storedMemories.push(stored);\r\n }\r\n }\r\n\r\n return storedMemories;\r\n } catch (error) {\r\n console.error(\"Error extracting memories:\", error);\r\n return [];\r\n }\r\n}\r\n\r\n// Build context string from relevant memories\r\nexport async function buildMemoryContext(\r\n query: string,\r\n userId?: string,\r\n conversationHistory?: Array<{ role: \"user\" | \"assistant\"; content: string }>\r\n): Promise<string> {\r\n // Use enhanced retrieval pipeline when any advanced RAG feature is enabled\r\n const anyAdvancedEnabled = env.HYDE_ENABLED || env.RERANK_ENABLED ||\r\n env.MULTISTEP_RAG_ENABLED || env.RETRIEVAL_CACHE_ENABLED || env.CONTEXTUAL_QUERY_ENABLED;\r\n\r\n if (anyAdvancedEnabled) {\r\n try {\r\n const { enhancedRetrieve } = await import(\"./memory/enhanced-retrieval\");\r\n const result = await enhancedRetrieve(query, { userId, limit: 5, conversationHistory });\r\n\r\n if (result.results.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const memoryStrings = result.results.map((m: any) => {\r\n const provenance = m.provenance ? ` [${m.provenance}]` : \"\";\r\n const score = m.rerankScore != null\r\n ? `rerank: ${m.rerankScore}/10`\r\n : `relevance: ${((m.similarity || 0) * 100).toFixed(0)}%`;\r\n return `- [${m.type}] ${m.content} (${score})${provenance}`;\r\n });\r\n\r\n return `\\n\\nRelevant memories about the user:\\n${memoryStrings.join(\"\\n\")}`;\r\n } catch {\r\n // Enhanced retrieval failed, fall back to basic search\r\n }\r\n }\r\n\r\n // Fallback: basic vector search\r\n const relevantMemories = await searchMemories(query, userId, 5);\r\n\r\n if (relevantMemories.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const memoryStrings = relevantMemories.map(\r\n (m: any) => {\r\n const provenance = m.provenance ? ` [${m.provenance}]` : \"\";\r\n return `- [${m.type}] ${m.content} (relevance: ${(m.similarity * 100).toFixed(0)}%)${provenance}`;\r\n }\r\n );\r\n\r\n return `\\n\\nRelevant memories about the user:\\n${memoryStrings.join(\"\\n\")}`;\r\n}\r\n"],"mappings":"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","names":["generateEmbedding","memoryStrings"]}
|