@mzhub/cortex 0.1.0 → 0.1.1
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/adapters/index.d.mts +2 -2
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +1 -1
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/{index-DnOyj7gs.d.ts → index-DYNiiClR.d.ts} +6 -6
- package/dist/{index-C_w3EJQT.d.mts → index-fTN1gEXd.d.mts} +6 -6
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/middleware/index.d.mts +1 -1
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { b as MemoryMiddlewareOptions, e as MiddlewareRequest, f as MiddlewareResponse, N as NextFunction, c as createMemoryMiddleware, d as digestAfterResponse, w as withMemory } from '../index-
|
|
1
|
+
export { b as MemoryMiddlewareOptions, e as MiddlewareRequest, f as MiddlewareResponse, N as NextFunction, c as createMemoryMiddleware, d as digestAfterResponse, w as withMemory } from '../index-fTN1gEXd.mjs';
|
|
2
2
|
import '../types-DybcUhEZ.mjs';
|
|
3
3
|
import '../BaseAdapter-Bjj4JG_S.mjs';
|
|
4
4
|
import '../BaseProvider-B8x1pJXP.mjs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { b as MemoryMiddlewareOptions, e as MiddlewareRequest, f as MiddlewareResponse, N as NextFunction, c as createMemoryMiddleware, d as digestAfterResponse, w as withMemory } from '../index-
|
|
1
|
+
export { b as MemoryMiddlewareOptions, e as MiddlewareRequest, f as MiddlewareResponse, N as NextFunction, c as createMemoryMiddleware, d as digestAfterResponse, w as withMemory } from '../index-DYNiiClR.js';
|
|
2
2
|
import '../types-DybcUhEZ.js';
|
|
3
3
|
import '../BaseAdapter-WunbfD_n.js';
|
|
4
4
|
import '../BaseProvider-BIkJVjtg.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;AAiFO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM,MAAA;AAAA,IACnE,UAAA,GAAa,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,OAAA;AAAA,IAChC,eAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAE9B,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAGpD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,aAAA,GAAgB,OAAA;AACpB,QAAA,IAAI,IAAI,MAAA,EAAQ;AACd,UAAA,GAAA,CAAI,OAAO,aAAA,GAAgB,OAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAiBO,SAAS,mBAAA,CACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,iBAAA,EACM;AAEN,EAAA,YAAA,CAAa,MAAM;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,iBAAiB,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;AAmBO,SAAS,UAAA,CAGd,MAAA,EACA,OAAA,EACA,OAAA,GAGI,EAAC,EACL;AACA,EAAA,OAAO,OAAO,GAAA,KAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,GAAY,GAAG,KAAK,IAAA,EAAM,MAAA;AACjD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GAAa,IAAI,KAAK,IAAA,EAAM,OAAA;AAEpD,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAI,QAAA;AAAA,UACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,mCAAmC,CAAA;AAAA,UAC3D,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAS,EAAE,cAAA,EAAgB,oBAAmB;AAAE,SACjE;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AACpD,MAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AACzD,MAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,QACtD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF","file":"index.js","sourcesContent":["import type { MemoryOS } from \"../MemoryOS\";\r\nimport type { HydratedContext } from \"../types\";\r\n\r\n/**\r\n * Express/Connect-style request object\r\n */\r\nexport interface MiddlewareRequest {\r\n body?: { userId?: string; message?: string; [key: string]: unknown };\r\n params?: Record<string, string>;\r\n query?: Record<string, string>;\r\n headers?: Record<string, string | string[] | undefined>;\r\n user?: { id?: string; userId?: string; [key: string]: unknown };\r\n memoryContext?: HydratedContext;\r\n}\r\n\r\n/**\r\n * Express/Connect-style response object\r\n */\r\nexport interface MiddlewareResponse {\r\n locals?: Record<string, unknown>;\r\n json?: (body: unknown) => void;\r\n on?: (event: string, callback: () => void) => void;\r\n}\r\n\r\n/**\r\n * Next function to call the next middleware\r\n */\r\nexport type NextFunction = (error?: unknown) => void;\r\n\r\n/**\r\n * Options for the memory middleware\r\n */\r\nexport interface MemoryMiddlewareOptions {\r\n /** Function to extract userId from request */\r\n getUserId?: (req: MiddlewareRequest) => string | undefined;\r\n /** Function to extract user message from request */\r\n getMessage?: (req: MiddlewareRequest) => string | undefined;\r\n /** Attach context to request object */\r\n attachToRequest?: boolean;\r\n /** Auto-digest on response finish (requires response body capture) */\r\n autoDigest?: boolean;\r\n}\r\n\r\n/**\r\n * Result attached to request/response\r\n */\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace Express {\r\n interface Request {\r\n memoryContext?: HydratedContext;\r\n }\r\n interface Locals {\r\n memoryContext?: HydratedContext;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Express middleware for automatic context hydration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import express from 'express';\r\n * import { MemoryOS } from '
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;AAiFO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM,MAAA;AAAA,IACnE,UAAA,GAAa,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,OAAA;AAAA,IAChC,eAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAE9B,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAGpD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,aAAA,GAAgB,OAAA;AACpB,QAAA,IAAI,IAAI,MAAA,EAAQ;AACd,UAAA,GAAA,CAAI,OAAO,aAAA,GAAgB,OAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAiBO,SAAS,mBAAA,CACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,iBAAA,EACM;AAEN,EAAA,YAAA,CAAa,MAAM;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,iBAAiB,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;AAmBO,SAAS,UAAA,CAGd,MAAA,EACA,OAAA,EACA,OAAA,GAGI,EAAC,EACL;AACA,EAAA,OAAO,OAAO,GAAA,KAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,GAAY,GAAG,KAAK,IAAA,EAAM,MAAA;AACjD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GAAa,IAAI,KAAK,IAAA,EAAM,OAAA;AAEpD,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAI,QAAA;AAAA,UACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,mCAAmC,CAAA;AAAA,UAC3D,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAS,EAAE,cAAA,EAAgB,oBAAmB;AAAE,SACjE;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AACpD,MAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AACzD,MAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,QACtD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF","file":"index.js","sourcesContent":["import type { MemoryOS } from \"../MemoryOS\";\r\nimport type { HydratedContext } from \"../types\";\r\n\r\n/**\r\n * Express/Connect-style request object\r\n */\r\nexport interface MiddlewareRequest {\r\n body?: { userId?: string; message?: string; [key: string]: unknown };\r\n params?: Record<string, string>;\r\n query?: Record<string, string>;\r\n headers?: Record<string, string | string[] | undefined>;\r\n user?: { id?: string; userId?: string; [key: string]: unknown };\r\n memoryContext?: HydratedContext;\r\n}\r\n\r\n/**\r\n * Express/Connect-style response object\r\n */\r\nexport interface MiddlewareResponse {\r\n locals?: Record<string, unknown>;\r\n json?: (body: unknown) => void;\r\n on?: (event: string, callback: () => void) => void;\r\n}\r\n\r\n/**\r\n * Next function to call the next middleware\r\n */\r\nexport type NextFunction = (error?: unknown) => void;\r\n\r\n/**\r\n * Options for the memory middleware\r\n */\r\nexport interface MemoryMiddlewareOptions {\r\n /** Function to extract userId from request */\r\n getUserId?: (req: MiddlewareRequest) => string | undefined;\r\n /** Function to extract user message from request */\r\n getMessage?: (req: MiddlewareRequest) => string | undefined;\r\n /** Attach context to request object */\r\n attachToRequest?: boolean;\r\n /** Auto-digest on response finish (requires response body capture) */\r\n autoDigest?: boolean;\r\n}\r\n\r\n/**\r\n * Result attached to request/response\r\n */\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace Express {\r\n interface Request {\r\n memoryContext?: HydratedContext;\r\n }\r\n interface Locals {\r\n memoryContext?: HydratedContext;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Express middleware for automatic context hydration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import express from 'express';\r\n * import { MemoryOS } from 'cortex';\r\n * import { createMemoryMiddleware } from 'cortex/middleware';\r\n *\r\n * const app = express();\r\n * const memory = new MemoryOS({ ... });\r\n *\r\n * app.use('/chat', createMemoryMiddleware(memory, {\r\n * getUserId: (req) => req.user?.id,\r\n * getMessage: (req) => req.body?.message,\r\n * }));\r\n *\r\n * app.post('/chat', (req, res) => {\r\n * const context = req.memoryContext;\r\n * // Use context.compiledPrompt in your LLM call\r\n * });\r\n * ```\r\n */\r\nexport function createMemoryMiddleware(\r\n memory: MemoryOS,\r\n options: MemoryMiddlewareOptions = {},\r\n) {\r\n const {\r\n getUserId = (req) => req.user?.id || req.user?.userId || req.body?.userId,\r\n getMessage = (req) => req.body?.message,\r\n attachToRequest = true,\r\n } = options;\r\n\r\n return async (\r\n req: MiddlewareRequest,\r\n res: MiddlewareResponse,\r\n next: NextFunction,\r\n ): Promise<void> => {\r\n try {\r\n const userId = getUserId(req);\r\n const message = getMessage(req);\r\n\r\n if (!userId || !message) {\r\n return next();\r\n }\r\n\r\n // Hydrate context\r\n const context = await memory.hydrate(userId, message);\r\n\r\n // Attach to request\r\n if (attachToRequest) {\r\n req.memoryContext = context;\r\n if (res.locals) {\r\n res.locals.memoryContext = context;\r\n }\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to digest after response in Express.\r\n * Call this after sending the response.\r\n *\r\n * @example\r\n * ```typescript\r\n * app.post('/chat', async (req, res) => {\r\n * const response = await callLLM(req.memoryContext, req.body.message);\r\n * res.json({ message: response });\r\n *\r\n * // Digest in background\r\n * digestAfterResponse(memory, req.user.id, req.body.message, response);\r\n * });\r\n * ```\r\n */\r\nexport function digestAfterResponse(\r\n memory: MemoryOS,\r\n userId: string,\r\n userMessage: string,\r\n assistantResponse: string,\r\n): void {\r\n // Fire and forget\r\n setImmediate(() => {\r\n memory.digest(userId, userMessage, assistantResponse);\r\n });\r\n}\r\n\r\n/**\r\n * Create a Next.js API route handler wrapper.\r\n *\r\n * @example\r\n * ```typescript\r\n * // pages/api/chat.ts or app/api/chat/route.ts\r\n * import { withMemory } from 'cortex/middleware';\r\n *\r\n * export const POST = withMemory(memory, async (req, context) => {\r\n * const { message } = await req.json();\r\n * const response = await callLLM(context.compiledPrompt, message);\r\n * return Response.json({ message: response });\r\n * }, {\r\n * getUserId: (req) => req.headers.get('x-user-id'),\r\n * });\r\n * ```\r\n */\r\nexport function withMemory<\r\n T extends { json: () => Promise<{ message?: string; userId?: string }> },\r\n>(\r\n memory: MemoryOS,\r\n handler: (req: T, context: HydratedContext) => Promise<Response>,\r\n options: {\r\n getUserId?: (req: T) => string | null | undefined;\r\n getMessage?: (body: { message?: string }) => string | undefined;\r\n } = {},\r\n) {\r\n return async (req: T): Promise<Response> => {\r\n try {\r\n const body = await req.json();\r\n const userId = options.getUserId?.(req) || body?.userId;\r\n const message = options.getMessage?.(body) || body?.message;\r\n\r\n if (!userId || !message) {\r\n return new Response(\r\n JSON.stringify({ error: \"userId and message are required\" }),\r\n { status: 400, headers: { \"Content-Type\": \"application/json\" } },\r\n );\r\n }\r\n\r\n const context = await memory.hydrate(userId, message);\r\n return handler(req, context);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : \"Internal error\";\r\n return new Response(JSON.stringify({ error: message }), {\r\n status: 500,\r\n headers: { \"Content-Type\": \"application/json\" },\r\n });\r\n }\r\n };\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/index.ts"],"names":[],"mappings":";AAiFO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM,MAAA;AAAA,IACnE,UAAA,GAAa,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,OAAA;AAAA,IAChC,eAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAE9B,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAGpD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,aAAA,GAAgB,OAAA;AACpB,QAAA,IAAI,IAAI,MAAA,EAAQ;AACd,UAAA,GAAA,CAAI,OAAO,aAAA,GAAgB,OAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAiBO,SAAS,mBAAA,CACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,iBAAA,EACM;AAEN,EAAA,YAAA,CAAa,MAAM;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,iBAAiB,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;AAmBO,SAAS,UAAA,CAGd,MAAA,EACA,OAAA,EACA,OAAA,GAGI,EAAC,EACL;AACA,EAAA,OAAO,OAAO,GAAA,KAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,GAAY,GAAG,KAAK,IAAA,EAAM,MAAA;AACjD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GAAa,IAAI,KAAK,IAAA,EAAM,OAAA;AAEpD,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAI,QAAA;AAAA,UACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,mCAAmC,CAAA;AAAA,UAC3D,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAS,EAAE,cAAA,EAAgB,oBAAmB;AAAE,SACjE;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AACpD,MAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AACzD,MAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,QACtD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF","file":"index.mjs","sourcesContent":["import type { MemoryOS } from \"../MemoryOS\";\r\nimport type { HydratedContext } from \"../types\";\r\n\r\n/**\r\n * Express/Connect-style request object\r\n */\r\nexport interface MiddlewareRequest {\r\n body?: { userId?: string; message?: string; [key: string]: unknown };\r\n params?: Record<string, string>;\r\n query?: Record<string, string>;\r\n headers?: Record<string, string | string[] | undefined>;\r\n user?: { id?: string; userId?: string; [key: string]: unknown };\r\n memoryContext?: HydratedContext;\r\n}\r\n\r\n/**\r\n * Express/Connect-style response object\r\n */\r\nexport interface MiddlewareResponse {\r\n locals?: Record<string, unknown>;\r\n json?: (body: unknown) => void;\r\n on?: (event: string, callback: () => void) => void;\r\n}\r\n\r\n/**\r\n * Next function to call the next middleware\r\n */\r\nexport type NextFunction = (error?: unknown) => void;\r\n\r\n/**\r\n * Options for the memory middleware\r\n */\r\nexport interface MemoryMiddlewareOptions {\r\n /** Function to extract userId from request */\r\n getUserId?: (req: MiddlewareRequest) => string | undefined;\r\n /** Function to extract user message from request */\r\n getMessage?: (req: MiddlewareRequest) => string | undefined;\r\n /** Attach context to request object */\r\n attachToRequest?: boolean;\r\n /** Auto-digest on response finish (requires response body capture) */\r\n autoDigest?: boolean;\r\n}\r\n\r\n/**\r\n * Result attached to request/response\r\n */\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace Express {\r\n interface Request {\r\n memoryContext?: HydratedContext;\r\n }\r\n interface Locals {\r\n memoryContext?: HydratedContext;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Express middleware for automatic context hydration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import express from 'express';\r\n * import { MemoryOS } from '
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/index.ts"],"names":[],"mappings":";AAiFO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM,MAAA;AAAA,IACnE,UAAA,GAAa,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,EAAM,OAAA;AAAA,IAChC,eAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAE9B,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAGpD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,aAAA,GAAgB,OAAA;AACpB,QAAA,IAAI,IAAI,MAAA,EAAQ;AACd,UAAA,GAAA,CAAI,OAAO,aAAA,GAAgB,OAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACF;AAiBO,SAAS,mBAAA,CACd,MAAA,EACA,MAAA,EACA,WAAA,EACA,iBAAA,EACM;AAEN,EAAA,YAAA,CAAa,MAAM;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa,iBAAiB,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;AAmBO,SAAS,UAAA,CAGd,MAAA,EACA,OAAA,EACA,OAAA,GAGI,EAAC,EACL;AACA,EAAA,OAAO,OAAO,GAAA,KAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,GAAY,GAAG,KAAK,IAAA,EAAM,MAAA;AACjD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GAAa,IAAI,KAAK,IAAA,EAAM,OAAA;AAEpD,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,QAAA,OAAO,IAAI,QAAA;AAAA,UACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,mCAAmC,CAAA;AAAA,UAC3D,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAS,EAAE,cAAA,EAAgB,oBAAmB;AAAE,SACjE;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AACpD,MAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gBAAA;AACzD,MAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,QACtD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF","file":"index.mjs","sourcesContent":["import type { MemoryOS } from \"../MemoryOS\";\r\nimport type { HydratedContext } from \"../types\";\r\n\r\n/**\r\n * Express/Connect-style request object\r\n */\r\nexport interface MiddlewareRequest {\r\n body?: { userId?: string; message?: string; [key: string]: unknown };\r\n params?: Record<string, string>;\r\n query?: Record<string, string>;\r\n headers?: Record<string, string | string[] | undefined>;\r\n user?: { id?: string; userId?: string; [key: string]: unknown };\r\n memoryContext?: HydratedContext;\r\n}\r\n\r\n/**\r\n * Express/Connect-style response object\r\n */\r\nexport interface MiddlewareResponse {\r\n locals?: Record<string, unknown>;\r\n json?: (body: unknown) => void;\r\n on?: (event: string, callback: () => void) => void;\r\n}\r\n\r\n/**\r\n * Next function to call the next middleware\r\n */\r\nexport type NextFunction = (error?: unknown) => void;\r\n\r\n/**\r\n * Options for the memory middleware\r\n */\r\nexport interface MemoryMiddlewareOptions {\r\n /** Function to extract userId from request */\r\n getUserId?: (req: MiddlewareRequest) => string | undefined;\r\n /** Function to extract user message from request */\r\n getMessage?: (req: MiddlewareRequest) => string | undefined;\r\n /** Attach context to request object */\r\n attachToRequest?: boolean;\r\n /** Auto-digest on response finish (requires response body capture) */\r\n autoDigest?: boolean;\r\n}\r\n\r\n/**\r\n * Result attached to request/response\r\n */\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace Express {\r\n interface Request {\r\n memoryContext?: HydratedContext;\r\n }\r\n interface Locals {\r\n memoryContext?: HydratedContext;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create Express middleware for automatic context hydration.\r\n *\r\n * @example\r\n * ```typescript\r\n * import express from 'express';\r\n * import { MemoryOS } from 'cortex';\r\n * import { createMemoryMiddleware } from 'cortex/middleware';\r\n *\r\n * const app = express();\r\n * const memory = new MemoryOS({ ... });\r\n *\r\n * app.use('/chat', createMemoryMiddleware(memory, {\r\n * getUserId: (req) => req.user?.id,\r\n * getMessage: (req) => req.body?.message,\r\n * }));\r\n *\r\n * app.post('/chat', (req, res) => {\r\n * const context = req.memoryContext;\r\n * // Use context.compiledPrompt in your LLM call\r\n * });\r\n * ```\r\n */\r\nexport function createMemoryMiddleware(\r\n memory: MemoryOS,\r\n options: MemoryMiddlewareOptions = {},\r\n) {\r\n const {\r\n getUserId = (req) => req.user?.id || req.user?.userId || req.body?.userId,\r\n getMessage = (req) => req.body?.message,\r\n attachToRequest = true,\r\n } = options;\r\n\r\n return async (\r\n req: MiddlewareRequest,\r\n res: MiddlewareResponse,\r\n next: NextFunction,\r\n ): Promise<void> => {\r\n try {\r\n const userId = getUserId(req);\r\n const message = getMessage(req);\r\n\r\n if (!userId || !message) {\r\n return next();\r\n }\r\n\r\n // Hydrate context\r\n const context = await memory.hydrate(userId, message);\r\n\r\n // Attach to request\r\n if (attachToRequest) {\r\n req.memoryContext = context;\r\n if (res.locals) {\r\n res.locals.memoryContext = context;\r\n }\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to digest after response in Express.\r\n * Call this after sending the response.\r\n *\r\n * @example\r\n * ```typescript\r\n * app.post('/chat', async (req, res) => {\r\n * const response = await callLLM(req.memoryContext, req.body.message);\r\n * res.json({ message: response });\r\n *\r\n * // Digest in background\r\n * digestAfterResponse(memory, req.user.id, req.body.message, response);\r\n * });\r\n * ```\r\n */\r\nexport function digestAfterResponse(\r\n memory: MemoryOS,\r\n userId: string,\r\n userMessage: string,\r\n assistantResponse: string,\r\n): void {\r\n // Fire and forget\r\n setImmediate(() => {\r\n memory.digest(userId, userMessage, assistantResponse);\r\n });\r\n}\r\n\r\n/**\r\n * Create a Next.js API route handler wrapper.\r\n *\r\n * @example\r\n * ```typescript\r\n * // pages/api/chat.ts or app/api/chat/route.ts\r\n * import { withMemory } from 'cortex/middleware';\r\n *\r\n * export const POST = withMemory(memory, async (req, context) => {\r\n * const { message } = await req.json();\r\n * const response = await callLLM(context.compiledPrompt, message);\r\n * return Response.json({ message: response });\r\n * }, {\r\n * getUserId: (req) => req.headers.get('x-user-id'),\r\n * });\r\n * ```\r\n */\r\nexport function withMemory<\r\n T extends { json: () => Promise<{ message?: string; userId?: string }> },\r\n>(\r\n memory: MemoryOS,\r\n handler: (req: T, context: HydratedContext) => Promise<Response>,\r\n options: {\r\n getUserId?: (req: T) => string | null | undefined;\r\n getMessage?: (body: { message?: string }) => string | undefined;\r\n } = {},\r\n) {\r\n return async (req: T): Promise<Response> => {\r\n try {\r\n const body = await req.json();\r\n const userId = options.getUserId?.(req) || body?.userId;\r\n const message = options.getMessage?.(body) || body?.message;\r\n\r\n if (!userId || !message) {\r\n return new Response(\r\n JSON.stringify({ error: \"userId and message are required\" }),\r\n { status: 400, headers: { \"Content-Type\": \"application/json\" } },\r\n );\r\n }\r\n\r\n const context = await memory.hydrate(userId, message);\r\n return handler(req, context);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : \"Internal error\";\r\n return new Response(JSON.stringify({ error: message }), {\r\n status: 500,\r\n headers: { \"Content-Type\": \"application/json\" },\r\n });\r\n }\r\n };\r\n}\r\n"]}
|
package/package.json
CHANGED