{"version":3,"sources":["../src/server/handlers/gateway-memory-client.ts"],"names":[],"mappings":";;;AAkDO,IAAM,sBAAN,MAA0B;AAAA,EACvB,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAAiB,MAAA,EAAgB;AAE3C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,YAAA;AAClE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEQ,WAAW,QAAA,EAA0B;AAC3C,IAAA,OAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,EACjD;AAAA,EAEA,MAAc,OAAA,CAAW,IAAA,EAAc,OAAA,GAAuB,EAAC,EAAe;AAC5E,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,GAAM,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC3B,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,QACrC,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,UACpC,GAAK,OAAA,CAAQ,OAAA,IAAsC;AAAC;AACtD,OACD,CAAA;AAED,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,YAAY,MAAA,EAIuC;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,OAAO,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM,KAAA,CAAM,IAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,OAAO,KAAK,OAAA,CAAQ,CAAA,QAAA,EAAW,KAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,UAAU,QAAA,EAA6D;AAC3E,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,IACrD,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,aAAa,KAAA,IAAS,CAAA,CAAE,QAAQ,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAC5D,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAKoB;AACrC,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAY;AAAA,MAC9B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAA,CACJ,QAAA,EACA,MAAA,EAC2C;AAC3C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAAA,QACnD,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,OAC5B,CAAA;AAAA,IACH,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,aAAa,KAAA,IAAS,CAAA,CAAE,QAAQ,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAC5D,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,QAAA,EAA4C;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,IAC3E,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,CAAA,YAAa,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAM;AACxE,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,YAAA,CACJ,QAAA,EACA,MAAA,EAC+D;AAC/D,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM,KAAA,CAAM,IAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACpE,IAAA,IAAI,OAAO,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AACjD,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,SAAA,EAAY,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACxF,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,aAAa,KAAA,IAAS,CAAA,CAAE,QAAQ,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAC5D,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,eAAA,CAAgB,QAAA,EAAkB,UAAA,EAAyD;AAC/F,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,UAAU,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,aAAA,EAAgB,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,oBAAA,CAAqB,QAAA,EAAkB,UAAA,EAAkE;AAC7G,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,UAAU,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,oBAAA,EAAuB,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACnG,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,CAAA,YAAa,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAK;AAC3E,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CACJ,QAAA,EACA,MAAA,EACyC;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,OAAO,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,MAAA,CAAO,EAAA,CAAG,aAAa,CAAA;AACtD,IAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM,KAAA,CAAM,IAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,qBAAA,EAAwB,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACpG,SAAS,CAAA,EAAY;AACnB,MAAA,IAAI,CAAA,YAAa,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AAC1E,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AACF;AAOO,SAAS,cAAc,EAAA,EAAmB;AAC/C,EAAA,OAAO;AAAA,IACL,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,YAAY,EAAA,CAAG,UAAA;AAAA,IACf,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,IACnB,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,EAAC;AAAA,IAC1B,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS;AAAA,GAClC;AACF;AAKO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,OAAO;AAAA,IACL,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS;AAAA,GAClC;AACF;AAKO,SAAS,gBAAgB,EAAA,EAAqB;AACnD,EAAA,OAAO;AAAA,IACL,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,OAAO,EAAA,CAAG,KAAA;AAAA,IACV,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,YAAY,EAAA,CAAG,UAAA;AAAA,IACf,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS,CAAA;AAAA,IAChC,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS,CAAA;AAAA,IAChC,gBAAgB,EAAA,CAAG,cAAA,GAAiB,IAAI,IAAA,CAAK,EAAA,CAAG,cAAc,CAAA,GAAI,MAAA;AAAA,IAClE,YAAY,EAAA,CAAG,UAAA;AAAA,IACf,iBAAiB,EAAA,CAAG,eAAA;AAAA,IACpB,kBAAA,EAAqB,GAAG,kBAAA,IAAsB,EAAA;AAAA,IAC9C,qBAAqB,EAAA,CAAG,mBAAA;AAAA,IACxB,uBAAuB,EAAA,CAAG,qBAAA;AAAA,IAC1B,sBAAsB,EAAA,CAAG,oBAAA;AAAA,IACzB,cAAc,EAAA,CAAG,YAAA;AAAA,IACjB,aAAa,EAAA,CAAG,WAAA;AAAA,IAChB,wBAAwB,EAAA,CAAG,sBAAA;AAAA,IAC3B,uBAAuB,EAAA,CAAG,qBAAA;AAAA,IAC1B,MAAA,EAAQ,EAAA,CAAG,MAAA,IAAU,EAAC;AAAA,IACtB,yBAAA,EAA2B,EAAA,CAAG,yBAAA,IAA6B,EAAC;AAAA,IAC5D,kBAAA,EAAoB,GAAG,kBAAA,IAAsB,MAAA;AAAA,IAC7C,wBAAA,EAA0B,GAAG,wBAAA,IAA4B,MAAA;AAAA,IACzD,6BAAA,EAA+B,GAAG,6BAAA,IAAiC;AAAA,GACrE;AACF;AAGA,IAAI,cAAA;AAKG,SAAS,gBAAA,GAA+C;AAC7D,EAAA,IAAI,cAAA,KAAmB,QAAW,OAAO,cAAA;AACzC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,+BAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,sBAAA;AACxB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,cAAA,GAAiB,IAAI,mBAAA,CAAoB,GAAA,EAAK,GAAG,CAAA;AACjD,EAAA,OAAO,cAAA;AACT;AAOO,SAAS,eAAe,KAAA,EAAqB;AAClD,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,IAAI,OAAO,SAAS,KAAA,KAAU,QAAA,IAAY,SAAS,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAUA,eAAsB,oBAAoB,KAAA,EAA8B;AACtE,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,KAAA;AAGjB,IAAA,IAAI,OAAO,SAAS,KAAA,KAAU,QAAA,IAAY,SAAS,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9E,MAAA,OAAO,IAAA;AAAA,IACT;AAKA,IAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,UAAA,EAAY;AACtC,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAClD,MAAA,IAAI,GAAA,EAAK;AAEP,QAAA,MAAM,MAAA,GAAS,GAAA;AACf,QAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AACzC,UAAA,MAAM,eAAA,GAAmB,OAAuC,QAAA,EAAS;AACzE,UAAA,MAAM,QAAA,GAAW,eAAA;AAEjB,UAAA,IAAI,QAAA,EAAU,MAAA,IAAU,OAAO,QAAA,CAAS,WAAW,QAAA,EAAU;AAC3D,YAAA,MAAM,QAAA,GAAY,SAAS,MAAA,CAAmC,QAAA;AAC9D,YAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AAClE,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT","file":"chunk-LFZO2LHV.cjs","sourcesContent":["/**\n * HTTP client for the Mastra Memory Gateway REST API.\n * Used to proxy memory operations from the local Mastra server to the remote gateway\n * when agents use `mastra/` model strings.\n */\n\ninterface GatewayThread {\n id: string;\n projectId: string;\n resourceId: string;\n title: string | null;\n metadata: Record | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface GatewayMessage {\n id: string;\n threadId: string;\n role: string;\n content: unknown;\n type: string;\n createdAt: string;\n}\n\ninterface GatewayOMRecord {\n id: string;\n scope: string;\n threadId: string | null;\n resourceId: string;\n createdAt: string;\n updatedAt: string;\n lastObservedAt: string | null;\n originType: string;\n generationCount: number;\n activeObservations: unknown;\n totalTokensObserved: number;\n observationTokenCount: number;\n pendingMessageTokens: number;\n isReflecting: boolean;\n isObserving: boolean;\n isBufferingObservation: boolean;\n isBufferingReflection: boolean;\n config?: Record;\n bufferedObservationChunks?: unknown[];\n bufferedReflection?: string | null;\n bufferedReflectionTokens?: number | null;\n bufferedReflectionInputTokens?: number | null;\n}\n\nexport class GatewayMemoryClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(baseUrl: string, apiKey: string) {\n // Strip trailing slashes and /v1 suffix so both URL forms resolve correctly\n this.baseUrl = baseUrl.replace(/\\/+$/, '').replace(/\\/v1$/, '') + '/v1/memory';\n this.apiKey = apiKey;\n }\n\n private threadPath(threadId: string): string {\n return `/threads/${encodeURIComponent(threadId)}`;\n }\n\n private async request(path: string, options: RequestInit = {}): Promise {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const res = await fetch(url, {\n ...options,\n signal: options.signal ?? controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...((options.headers as Record) || {}),\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n throw new Error(`Gateway API error ${res.status}: ${body}`);\n }\n\n return res.json() as Promise;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n // ── Threads ──────────────────────────────────────────────────\n\n async listThreads(params: {\n resourceId?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: GatewayThread[]; total: number }> {\n const query = new URLSearchParams();\n if (params.resourceId) query.set('resourceId', params.resourceId);\n if (params.limit != null) query.set('limit', String(params.limit));\n if (params.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request(`/threads${qs ? '?' + qs : ''}`);\n }\n\n async getThread(threadId: string): Promise<{ thread: GatewayThread } | null> {\n try {\n return await this.request(this.threadPath(threadId));\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return null;\n throw e;\n }\n }\n\n async createThread(params: {\n id?: string;\n resourceId: string;\n title?: string;\n metadata?: Record;\n }): Promise<{ thread: GatewayThread }> {\n return this.request('/threads', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async updateThread(\n threadId: string,\n params: { title?: string; metadata?: Record },\n ): Promise<{ thread: GatewayThread } | null> {\n try {\n return await this.request(this.threadPath(threadId), {\n method: 'PATCH',\n body: JSON.stringify(params),\n });\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return null;\n throw e;\n }\n }\n\n async deleteThread(threadId: string): Promise<{ ok: boolean }> {\n try {\n return await this.request(this.threadPath(threadId), { method: 'DELETE' });\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return { ok: false };\n throw e;\n }\n }\n\n // ── Messages ─────────────────────────────────────────────────\n\n async listMessages(\n threadId: string,\n params: { limit?: number; offset?: number; order?: string },\n ): Promise<{ messages: GatewayMessage[]; total: number } | null> {\n const query = new URLSearchParams();\n if (params.limit != null) query.set('limit', String(params.limit));\n if (params.offset != null) query.set('offset', String(params.offset));\n if (params.order) query.set('order', params.order);\n const qs = query.toString();\n try {\n return await this.request(`${this.threadPath(threadId)}/messages${qs ? '?' + qs : ''}`);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return null;\n throw e;\n }\n }\n\n // ── Observational Memory ─────────────────────────────────────\n\n async getObservations(threadId: string, resourceId?: string): Promise<{ observations: unknown }> {\n const query = new URLSearchParams();\n if (resourceId) query.set('resourceId', resourceId);\n const qs = query.toString();\n return this.request(`${this.threadPath(threadId)}/observations${qs ? '?' + qs : ''}`);\n }\n\n async getObservationRecord(threadId: string, resourceId?: string): Promise<{ record: GatewayOMRecord | null }> {\n const query = new URLSearchParams();\n if (resourceId) query.set('resourceId', resourceId);\n const qs = query.toString();\n try {\n return await this.request(`${this.threadPath(threadId)}/observations/record${qs ? '?' + qs : ''}`);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return { record: null };\n throw e;\n }\n }\n\n async getObservationHistory(\n threadId: string,\n params: { resourceId?: string; limit?: number; from?: Date; to?: Date; offset?: number },\n ): Promise<{ records: GatewayOMRecord[] }> {\n const query = new URLSearchParams();\n if (params.resourceId) query.set('resourceId', params.resourceId);\n if (params.limit != null) query.set('limit', String(params.limit));\n if (params.from) query.set('from', params.from.toISOString());\n if (params.to) query.set('to', params.to.toISOString());\n if (params.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n try {\n return await this.request(`${this.threadPath(threadId)}/observations/history${qs ? '?' + qs : ''}`);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes('404')) return { records: [] };\n throw e;\n }\n }\n}\n\n// ── Helpers ──────────────────────────────────────────────────────\n\n/**\n * Convert a gateway thread to the local server thread format.\n */\nexport function toLocalThread(gt: GatewayThread) {\n return {\n id: gt.id,\n resourceId: gt.resourceId,\n title: gt.title ?? '',\n metadata: gt.metadata ?? {},\n createdAt: new Date(gt.createdAt),\n updatedAt: new Date(gt.updatedAt),\n };\n}\n\n/**\n * Convert a gateway message to the local server message format.\n */\nexport function toLocalMessage(gm: GatewayMessage) {\n return {\n id: gm.id,\n threadId: gm.threadId,\n role: gm.role,\n content: gm.content,\n type: gm.type,\n createdAt: new Date(gm.createdAt),\n };\n}\n\n/**\n * Convert a gateway OM record to the local server OM record format.\n */\nexport function toLocalOMRecord(gr: GatewayOMRecord) {\n return {\n id: gr.id,\n scope: gr.scope as 'thread' | 'resource',\n threadId: gr.threadId,\n resourceId: gr.resourceId,\n createdAt: new Date(gr.createdAt),\n updatedAt: new Date(gr.updatedAt),\n lastObservedAt: gr.lastObservedAt ? new Date(gr.lastObservedAt) : undefined,\n originType: gr.originType as 'initial' | 'reflection' | 'observation',\n generationCount: gr.generationCount,\n activeObservations: (gr.activeObservations ?? '') as string,\n totalTokensObserved: gr.totalTokensObserved,\n observationTokenCount: gr.observationTokenCount,\n pendingMessageTokens: gr.pendingMessageTokens,\n isReflecting: gr.isReflecting,\n isObserving: gr.isObserving,\n isBufferingObservation: gr.isBufferingObservation,\n isBufferingReflection: gr.isBufferingReflection,\n config: gr.config ?? {},\n bufferedObservationChunks: gr.bufferedObservationChunks ?? [],\n bufferedReflection: gr.bufferedReflection ?? undefined,\n bufferedReflectionTokens: gr.bufferedReflectionTokens ?? undefined,\n bufferedReflectionInputTokens: gr.bufferedReflectionInputTokens ?? undefined,\n };\n}\n\n// Singleton-ish lazy instance\nlet _gatewayClient: GatewayMemoryClient | null | undefined;\n\n/**\n * Get a GatewayMemoryClient instance, or null if gateway is not configured.\n */\nexport function getGatewayClient(): GatewayMemoryClient | null {\n if (_gatewayClient !== undefined) return _gatewayClient;\n const url = process.env.MASTRA_GATEWAY_URL || 'https://gateway-api.mastra.ai';\n const key = process.env.MASTRA_GATEWAY_API_KEY;\n if (!key) {\n _gatewayClient = null;\n return null;\n }\n _gatewayClient = new GatewayMemoryClient(url, key);\n return _gatewayClient;\n}\n\n/**\n * Check if an agent uses a gateway model (mastra/ prefix).\n * Sync version — can only check agent.model string directly.\n */\n\nexport function isGatewayAgent(agent: any): boolean {\n if (!agent) return false;\n try {\n const agentAny = agent as Record;\n if (typeof agentAny.model === 'string' && agentAny.model.startsWith('mastra/')) {\n return true;\n }\n } catch {\n // Ignore errors during detection\n }\n return false;\n}\n\n/**\n * Async version of isGatewayAgent that can await getLLM().\n * Checks multiple paths to detect if an agent uses a mastra/ gateway model:\n * 1. agent.model as raw string (most reliable for directly configured agents)\n * 2. Resolved LLM's underlying ModelRouterLanguageModel config.routerId\n * 3. Resolved LLM's getModel() to access the router's config\n */\n\nexport async function isGatewayAgentAsync(agent: any): Promise {\n if (!agent) return false;\n try {\n const agentAny = agent as Record;\n\n // Check 1: agent.model is a raw string like 'mastra/openai/gpt-5-mini'\n if (typeof agentAny.model === 'string' && agentAny.model.startsWith('mastra/')) {\n return true;\n }\n\n // Check 2: Resolve the LLM and check the router's config.routerId\n // llm.getModelId() returns stripped ID (e.g., 'gpt-5-mini'), so we need\n // to access the underlying ModelRouterLanguageModel's config.routerId\n if (typeof agent.getLLM === 'function') {\n const llm = await Promise.resolve(agent.getLLM({}));\n if (llm) {\n // Try to access the underlying model's routerId via getModel()\n const llmAny = llm as Record;\n if (typeof llmAny.getModel === 'function') {\n const underlyingModel = (llmAny as { getModel: () => unknown }).getModel();\n const modelAny = underlyingModel as Record;\n // ModelRouterLanguageModel stores routerId in private config\n if (modelAny?.config && typeof modelAny.config === 'object') {\n const routerId = (modelAny.config as Record).routerId;\n if (typeof routerId === 'string' && routerId.startsWith('mastra/')) {\n return true;\n }\n }\n }\n }\n }\n } catch {\n // Detection failed — not a gateway agent\n }\n return false;\n}\n"]}