@langgraph-js/pure-graph 1.4.5 → 1.4.7

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 CHANGED
@@ -54,13 +54,26 @@ To integrate Pure Graph into a Next.js project, follow these steps:
54
54
 
55
55
  ```js
56
56
  // app/api/langgraph/[...path]/route.ts
57
- import { GET, POST, DELETE } from '@langgraph-js/pure-graph/dist/adapter/nextjs/router.js';
57
+ import { ensureInitialized } from '@langgraph-js/pure-graph/dist/adapter/nextjs/index.js';
58
58
  import { registerGraph } from '@langgraph-js/pure-graph';
59
59
  import { graph } from '../../../agent/graph-name/graph';
60
-
61
- registerGraph('test', graph);
62
-
63
- export { GET, POST, DELETE };
60
+ const init = async () => {
61
+ registerGraph('test', graph);
62
+ };
63
+ export async function GET(request) {
64
+ const { GET } = await ensureInitialized(init);
65
+ return GET(request);
66
+ }
67
+
68
+ export async function POST(request) {
69
+ const { POST } = await ensureInitialized(init);
70
+ return POST(request);
71
+ }
72
+
73
+ export async function DELETE(request) {
74
+ const { DELETE } = await ensureInitialized(init);
75
+ return DELETE(request);
76
+ }
64
77
  ```
65
78
 
66
79
  2. **Configure Environment Variables**
@@ -1,6 +1,6 @@
1
1
  import { Hono } from 'hono';
2
2
  import { zValidator } from '@hono/zod-validator';
3
- import { c as createEndpoint, s as serialiseAsDict } from '../../createEndpoint-BcVhF-uq.js';
3
+ import { c as createEndpoint, s as serialiseAsDict } from '../../createEndpoint-B0FQz0jr.js';
4
4
  import { A as AssistantsSearchSchema, a as AssistantGraphQuerySchema, T as ThreadIdParamSchema, R as RunStreamPayloadSchema, b as RunListQuerySchema, c as RunIdParamSchema, d as RunCancelQuerySchema, e as ThreadStateUpdate, f as ThreadCreatePayloadSchema, g as ThreadSearchPayloadSchema } from '../../zod-BaCzVUl8.js';
5
5
  import { streamSSE } from 'hono/streaming';
6
6
  import z from 'zod';
@@ -1 +1,27 @@
1
- export { GET, POST, DELETE } from "./router";
1
+ /** @ts-ignore */
2
+ import type { NextRequest } from 'next/server';
3
+ declare global {
4
+ var LG_INIT_PROMISE: Promise<{
5
+ GET: (req: NextRequest) => Promise<any>;
6
+ POST: (req: NextRequest) => Promise<any>;
7
+ DELETE: (req: NextRequest) => Promise<any>;
8
+ }> | undefined;
9
+ }
10
+ /**
11
+ * Lazy initialization of LangGraph
12
+ *
13
+ * Background:
14
+ * In Next.js, if you use top-level await to initialize directly in a module,
15
+ * initialization will be performed once for each context.
16
+ * Even if you use globalThis for caching, it is ineffective because globalThis is isolated per context.
17
+ *
18
+ * Solution:
19
+ * 1. Remove top-level await and switch to lazy initialization during request handling.
20
+ * 2. Use a Promise cache to ensure initialization only happens once per context.
21
+ * 3. Concurrent requests will share the same initialization Promise, avoiding redundant initialization.
22
+ */
23
+ export declare function ensureInitialized(attachGraphPromise: () => Promise<void>): Promise<{
24
+ GET: (req: NextRequest) => Promise<any>;
25
+ POST: (req: NextRequest) => Promise<any>;
26
+ DELETE: (req: NextRequest) => Promise<any>;
27
+ }>;
@@ -1,175 +1,17 @@
1
- import { NextResponse } from 'next/server';
2
- import { c as createEndpoint, s as serialiseAsDict } from '../../createEndpoint-BcVhF-uq.js';
3
- import { a as AssistantGraphQuerySchema, b as RunListQuerySchema, A as AssistantsSearchSchema, f as ThreadCreatePayloadSchema, g as ThreadSearchPayloadSchema, e as ThreadStateUpdate, R as RunStreamPayloadSchema, d as RunCancelQuerySchema } from '../../zod-BaCzVUl8.js';
4
-
5
- const client = createEndpoint();
6
-
7
- async function sseResponse(generator) {
8
- const encoder = new TextEncoder();
9
- const stream = new ReadableStream({
10
- async start(controller) {
11
- try {
12
- for await (const { event, data } of generator) {
13
- const line = `event: ${event}
14
- data: ${serialiseAsDict(data, 0)}
15
-
16
- `;
17
- controller.enqueue(encoder.encode(line));
18
- }
19
- } catch (err) {
20
- } finally {
21
- controller.close();
22
- }
23
- }
24
- });
25
- return new Response(stream, {
26
- headers: {
27
- "Content-Type": "text/event-stream; charset=utf-8",
28
- "Cache-Control": "no-cache, no-transform",
29
- Connection: "keep-alive"
30
- }
31
- });
32
- }
33
- async function GET(req) {
34
- const url = new URL(req.url);
35
- const pathname = url.pathname;
36
- if (pathname.match(/\/assistants\/[^/]+\/graph$/)) {
37
- const match = pathname.match(/\/assistants\/([^/]+)\/graph$/);
38
- if (match) {
39
- const assistant_id = match[1];
40
- const xrayParam = url.searchParams.get("xray") ?? void 0;
41
- const queryParams = { xray: xrayParam };
42
- const { xray } = AssistantGraphQuerySchema.parse(queryParams);
43
- const data = await client.assistants.getGraph(assistant_id, {
44
- xray: xray !== void 0 ? xray === "true" : void 0
45
- });
46
- return NextResponse.json(data);
47
- }
48
- }
49
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}$/)) {
50
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})$/);
51
- if (match) {
52
- const thread_id = match[1];
53
- const data = await client.threads.get(thread_id);
54
- return NextResponse.json(data);
55
- }
56
- }
57
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs$/)) {
58
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs$/);
59
- if (match) {
60
- const thread_id = match[1];
61
- const limit = url.searchParams.get("limit") ?? void 0;
62
- const offset = url.searchParams.get("offset") ?? void 0;
63
- const status = url.searchParams.get("status") ?? void 0;
64
- const queryParams = { limit, offset, status };
65
- const {
66
- limit: parsedLimit,
67
- offset: parsedOffset,
68
- status: parsedStatus
69
- } = RunListQuerySchema.parse(queryParams);
70
- const runs = await client.runs.list(thread_id, {
71
- limit: parsedLimit,
72
- offset: parsedOffset,
73
- status: parsedStatus
74
- });
75
- return Response.json(runs);
76
- }
77
- }
78
- return new NextResponse("Not Found", { status: 404 });
79
- }
80
- async function POST(req) {
81
- const url = new URL(req.url);
82
- const pathname = url.pathname;
83
- if (pathname.endsWith("/assistants/search")) {
84
- const body = await req.json();
85
- const payload = AssistantsSearchSchema.parse(body);
86
- const data = await client.assistants.search({
87
- graphId: payload.graph_id,
88
- metadata: payload.metadata,
89
- limit: payload.limit,
90
- offset: payload.offset
91
- });
92
- return NextResponse.json(data, {
93
- headers: { "X-Pagination-Total": String(data.length) }
94
- });
95
- }
96
- if (pathname.endsWith("/threads")) {
97
- const body = await req.json();
98
- const payload = ThreadCreatePayloadSchema.parse(body);
99
- const thread = await client.threads.create({
100
- thread_id: payload.thread_id,
101
- metadata: payload.metadata,
102
- if_exists: payload.if_exists ?? void 0
103
- });
104
- return NextResponse.json(thread);
105
- }
106
- if (pathname.endsWith("/threads/search")) {
107
- const body = await req.json();
108
- const payload = ThreadSearchPayloadSchema.parse(body);
109
- const result = await client.threads.search({
110
- metadata: payload.metadata,
111
- status: payload.status,
112
- limit: payload.limit,
113
- offset: payload.offset,
114
- sortBy: payload.sort_by ?? void 0,
115
- sortOrder: payload.sort_order ?? void 0
116
- });
117
- return NextResponse.json(result, {
118
- headers: { "X-Pagination-Total": String(result.length) }
119
- });
120
- }
121
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/state$/)) {
122
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/state$/);
123
- if (match) {
124
- const thread_id = match[1];
125
- const body = await req.json();
126
- const payload = ThreadStateUpdate.parse(body);
127
- const result = await client.threads.updateState(thread_id, payload);
128
- return NextResponse.json(result);
129
- }
130
- }
131
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs\/stream$/)) {
132
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs\/stream$/);
133
- if (match) {
134
- const thread_id = match[1];
135
- const body = await req.json();
136
- const payload = RunStreamPayloadSchema.parse(body);
137
- const generator = client.runs.stream(thread_id, payload.assistant_id, payload);
138
- return sseResponse(generator);
139
- }
140
- }
141
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}\/runs\/[0-9a-fA-F-]{36}\/cancel$/)) {
142
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})\/runs\/([0-9a-fA-F-]{36})\/cancel$/);
143
- if (match) {
144
- const thread_id = match[1];
145
- const run_id = match[2];
146
- const waitParam = url.searchParams.get("wait") ?? void 0;
147
- const actionParam = url.searchParams.get("action") ?? void 0;
148
- const queryParams = {
149
- wait: waitParam ? waitParam === "true" : false,
150
- action: actionParam ?? "interrupt"
1
+ async function ensureInitialized(attachGraphPromise) {
2
+ if (globalThis.LG_INIT_PROMISE === void 0) {
3
+ globalThis.LG_INIT_PROMISE = (async () => {
4
+ await attachGraphPromise();
5
+ const { GET, POST, DELETE } = await import('../../router-DqflDUWZ.js');
6
+ return {
7
+ GET,
8
+ POST,
9
+ DELETE
151
10
  };
152
- const { wait, action } = RunCancelQuerySchema.parse(queryParams);
153
- const promise = client.runs.cancel(thread_id, run_id, wait, action);
154
- if (wait) await promise;
155
- return new Response(null, { status: wait ? 204 : 202 });
156
- }
157
- }
158
- return new NextResponse("Not Found", { status: 404 });
159
- }
160
- async function DELETE(req) {
161
- const url = new URL(req.url);
162
- const pathname = url.pathname;
163
- if (pathname.match(/\/threads\/[0-9a-fA-F-]{36}$/)) {
164
- const match = pathname.match(/\/threads\/([0-9a-fA-F-]{36})$/);
165
- if (match) {
166
- const thread_id = match[1];
167
- await client.threads.delete(thread_id);
168
- return new NextResponse(null, { status: 204 });
169
- }
11
+ })();
170
12
  }
171
- return new NextResponse("Not Found", { status: 404 });
13
+ return globalThis.LG_INIT_PROMISE;
172
14
  }
173
15
 
174
- export { DELETE, GET, POST };
16
+ export { ensureInitialized };
175
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapter/nextjs/endpoint.ts","../../../src/adapter/nextjs/router.ts"],"sourcesContent":["import { createEndpoint } from '../../createEndpoint.js';\nexport const client = createEndpoint();\n","/** @ts-ignore */\nimport { NextRequest, NextResponse } from 'next/server';\nimport { client } from './endpoint';\nimport {\n AssistantsSearchSchema,\n AssistantGraphQuerySchema,\n RunStreamPayloadSchema,\n RunListQuerySchema,\n RunCancelQuerySchema,\n ThreadCreatePayloadSchema,\n ThreadSearchPayloadSchema,\n ThreadStateUpdate,\n} from '../zod';\nimport { serialiseAsDict } from '../../graph/stream';\n\n// Next.js App Router 的 SSE 响应实现\nasync function sseResponse(generator: AsyncGenerator<{ event: string; data: unknown }>): Promise<Response> {\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const { event, data } of generator) {\n const line = `event: ${event}\\n` + `data: ${serialiseAsDict(data, 0)}\\n\\n`;\n controller.enqueue(encoder.encode(line));\n }\n } catch (err) {\n // ignore\n } finally {\n controller.close();\n }\n },\n });\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n },\n });\n}\n\n// 统一路由处理器\nexport async function GET(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Assistants routes\n if (pathname.match(/\\/assistants\\/[^/]+\\/graph$/)) {\n const match = pathname.match(/\\/assistants\\/([^/]+)\\/graph$/);\n if (match) {\n const assistant_id = match[1];\n const xrayParam = url.searchParams.get('xray') ?? undefined;\n const queryParams = { xray: xrayParam };\n const { xray } = AssistantGraphQuerySchema.parse(queryParams);\n const data = await client.assistants.getGraph(assistant_id, {\n xray: xray !== undefined ? xray === 'true' : undefined,\n });\n return NextResponse.json(data);\n }\n }\n\n // Threads routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})$/);\n if (match) {\n const thread_id = match[1];\n const data = await client.threads.get(thread_id);\n return NextResponse.json(data);\n }\n }\n\n // Runs routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs$/);\n if (match) {\n const thread_id = match[1];\n const limit = url.searchParams.get('limit') ?? undefined;\n const offset = url.searchParams.get('offset') ?? undefined;\n const status = url.searchParams.get('status') ?? undefined;\n const queryParams = { limit, offset, status };\n const {\n limit: parsedLimit,\n offset: parsedOffset,\n status: parsedStatus,\n } = RunListQuerySchema.parse(queryParams);\n const runs = await client.runs.list(thread_id, {\n limit: parsedLimit,\n offset: parsedOffset,\n status: parsedStatus,\n });\n return Response.json(runs);\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n\nexport async function POST(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Assistants routes\n if (pathname.endsWith('/assistants/search')) {\n const body = await req.json();\n const payload = AssistantsSearchSchema.parse(body);\n const data = await client.assistants.search({\n graphId: payload.graph_id,\n metadata: payload.metadata as any,\n limit: payload.limit,\n offset: payload.offset,\n } as any);\n return NextResponse.json(data, {\n headers: { 'X-Pagination-Total': String(data.length) },\n });\n }\n\n // Threads routes\n if (pathname.endsWith('/threads')) {\n const body = await req.json();\n const payload = ThreadCreatePayloadSchema.parse(body);\n const thread = await client.threads.create({\n thread_id: payload.thread_id,\n metadata: payload.metadata as any,\n if_exists: (payload.if_exists as any) ?? undefined,\n });\n return NextResponse.json(thread);\n }\n\n if (pathname.endsWith('/threads/search')) {\n const body = await req.json();\n const payload = ThreadSearchPayloadSchema.parse(body);\n const result = await client.threads.search({\n metadata: payload.metadata as any,\n status: payload.status as any,\n limit: payload.limit,\n offset: payload.offset,\n sortBy: (payload.sort_by as any) ?? undefined,\n sortOrder: (payload.sort_order as any) ?? undefined,\n });\n return NextResponse.json(result, {\n headers: { 'X-Pagination-Total': String(result.length) },\n });\n }\n\n // Threads state update\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/state$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/state$/);\n if (match) {\n const thread_id = match[1];\n const body = await req.json();\n const payload = ThreadStateUpdate.parse(body);\n const result = await client.threads.updateState(thread_id, payload);\n return NextResponse.json(result);\n }\n }\n\n // Runs routes - stream\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs\\/stream$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs\\/stream$/);\n if (match) {\n const thread_id = match[1];\n const body = await req.json();\n const payload = RunStreamPayloadSchema.parse(body);\n const generator = client.runs.stream(thread_id, payload.assistant_id as string, payload as any);\n return sseResponse(generator as any);\n }\n }\n\n // Runs routes - cancel\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}\\/runs\\/[0-9a-fA-F-]{36}\\/cancel$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})\\/runs\\/([0-9a-fA-F-]{36})\\/cancel$/);\n if (match) {\n const thread_id = match[1];\n const run_id = match[2];\n const waitParam = url.searchParams.get('wait') ?? undefined;\n const actionParam = url.searchParams.get('action') ?? undefined;\n const queryParams = {\n wait: waitParam ? waitParam === 'true' : false,\n action: actionParam ?? 'interrupt',\n };\n const { wait, action } = RunCancelQuerySchema.parse(queryParams);\n const promise = client.runs.cancel(thread_id, run_id, wait, action);\n if (wait) await promise;\n return new Response(null, { status: wait ? 204 : 202 });\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n\nexport async function DELETE(req: NextRequest) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n // Threads routes\n if (pathname.match(/\\/threads\\/[0-9a-fA-F-]{36}$/)) {\n const match = pathname.match(/\\/threads\\/([0-9a-fA-F-]{36})$/);\n if (match) {\n const thread_id = match[1];\n await client.threads.delete(thread_id);\n return new NextResponse(null, { status: 204 });\n }\n }\n\n return new NextResponse('Not Found', { status: 404 });\n}\n"],"names":[],"mappings":";;;;AACO,MAAM,SAAS,cAAA,EAAe;;ACerC,eAAe,YAAY,SAAA,EAAgF;AACvG,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,IAC9B,MAAM,MAAM,UAAA,EAAY;AACpB,MAAA,IAAI;AACA,QAAA,WAAA,MAAiB,EAAE,KAAA,EAAO,IAAA,EAAK,IAAK,SAAA,EAAW;AAC3C,UAAA,MAAM,IAAA,GAAO,UAAU,KAAK;AAAA,MAAA,EAAgB,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAC;;AAAA,CAAA;AACpE,UAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QAC3C;AAAA,MACJ,SAAS,GAAA,EAAK;AAAA,MAEd,CAAA,SAAE;AACE,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MACrB;AAAA,IACJ;AAAA,GACH,CAAA;AACD,EAAA,OAAO,IAAI,SAAS,MAAA,EAAQ;AAAA,IACxB,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB,kCAAA;AAAA,MAChB,eAAA,EAAiB,wBAAA;AAAA,MACjB,UAAA,EAAY;AAAA;AAChB,GACH,CAAA;AACL;AAGA,eAAsB,IAAI,GAAA,EAAkB;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,6BAA6B,CAAA,EAAG;AAC/C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,+BAA+B,CAAA;AAC5D,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,MAAA;AAClD,MAAA,MAAM,WAAA,GAAc,EAAE,IAAA,EAAM,SAAA,EAAU;AACtC,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,yBAAA,CAA0B,MAAM,WAAW,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,SAAS,YAAA,EAAc;AAAA,QACxD,IAAA,EAAM,IAAA,KAAS,MAAA,GAAY,IAAA,KAAS,MAAA,GAAS;AAAA,OAChD,CAAA;AACD,MAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACjC;AAAA,EACJ;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,8BAA8B,CAAA,EAAG;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,gCAAgC,CAAA;AAC7D,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC/C,MAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACjC;AAAA,EACJ;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,oCAAoC,CAAA,EAAG;AACtD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,sCAAsC,CAAA;AACnE,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,MAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACjD,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACjD,MAAA,MAAM,WAAA,GAAc,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAC5C,MAAA,MAAM;AAAA,QACF,KAAA,EAAO,WAAA;AAAA,QACP,MAAA,EAAQ,YAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACZ,GAAI,kBAAA,CAAmB,KAAA,CAAM,WAAW,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,EAAW;AAAA,QAC3C,KAAA,EAAO,WAAA;AAAA,QACP,MAAA,EAAQ,YAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACX,CAAA;AACD,MAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC7B;AAAA,EACJ;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AACxD;AAEA,eAAsB,KAAK,GAAA,EAAkB;AACzC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,oBAAoB,CAAA,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,CAAM,IAAI,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO;AAAA,MACxC,SAAS,OAAA,CAAQ,QAAA;AAAA,MACjB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KACZ,CAAA;AACR,IAAA,OAAO,YAAA,CAAa,KAAK,IAAA,EAAM;AAAA,MAC3B,SAAS,EAAE,oBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAE,KACxD,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,KAAA,CAAM,IAAI,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,MACvC,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAA,EAAY,QAAQ,SAAA,IAAqB;AAAA,KAC5C,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,KAAA,CAAM,IAAI,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,MACvC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAA,EAAS,QAAQ,OAAA,IAAmB,MAAA;AAAA,MACpC,SAAA,EAAY,QAAQ,UAAA,IAAsB;AAAA,KAC7C,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAK,MAAA,EAAQ;AAAA,MAC7B,SAAS,EAAE,oBAAA,EAAsB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAE,KAC1D,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,qCAAqC,CAAA,EAAG;AACvD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,uCAAuC,CAAA;AACpE,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,WAAW,OAAO,CAAA;AAClE,MAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IACnC;AAAA,EACJ;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,4CAA4C,CAAA,EAAG;AAC9D,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,8CAA8C,CAAA;AAC3E,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,CAAM,IAAI,CAAA;AACjD,MAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,OAAO,SAAA,EAAW,OAAA,CAAQ,cAAwB,OAAc,CAAA;AAC9F,MAAA,OAAO,YAAY,SAAgB,CAAA;AAAA,IACvC;AAAA,EACJ;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,8DAA8D,CAAA,EAAG;AAChF,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,kEAAkE,CAAA;AAC/F,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,MAAA;AAClD,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACtD,MAAA,MAAM,WAAA,GAAc;AAAA,QAChB,IAAA,EAAM,SAAA,GAAY,SAAA,KAAc,MAAA,GAAS,KAAA;AAAA,QACzC,QAAQ,WAAA,IAAe;AAAA,OAC3B;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,oBAAA,CAAqB,MAAM,WAAW,CAAA;AAC/D,MAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,OAAO,SAAA,EAAW,MAAA,EAAQ,MAAM,MAAM,CAAA;AAClE,MAAA,IAAI,MAAM,MAAM,OAAA;AAChB,MAAA,OAAO,IAAI,SAAS,IAAA,EAAM,EAAE,QAAQ,IAAA,GAAO,GAAA,GAAM,KAAK,CAAA;AAAA,IAC1D;AAAA,EACJ;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AACxD;AAEA,eAAsB,OAAO,GAAA,EAAkB;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,8BAA8B,CAAA,EAAG;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,gCAAgC,CAAA;AAC7D,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA;AACrC,MAAA,OAAO,IAAI,YAAA,CAAa,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACjD;AAAA,EACJ;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AACxD;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapter/nextjs/index.ts"],"sourcesContent":["/** @ts-ignore */\nimport type { NextRequest } from 'next/server';\ndeclare global {\n var LG_INIT_PROMISE:\n | Promise<{\n GET: (req: NextRequest) => Promise<any>;\n POST: (req: NextRequest) => Promise<any>;\n DELETE: (req: NextRequest) => Promise<any>;\n }>\n | undefined;\n}\n/**\n * Lazy initialization of LangGraph\n *\n * Background:\n * In Next.js, if you use top-level await to initialize directly in a module,\n * initialization will be performed once for each context.\n * Even if you use globalThis for caching, it is ineffective because globalThis is isolated per context.\n *\n * Solution:\n * 1. Remove top-level await and switch to lazy initialization during request handling.\n * 2. Use a Promise cache to ensure initialization only happens once per context.\n * 3. Concurrent requests will share the same initialization Promise, avoiding redundant initialization.\n */\nexport async function ensureInitialized(attachGraphPromise: () => Promise<void>) {\n if (globalThis.LG_INIT_PROMISE === undefined) {\n globalThis.LG_INIT_PROMISE = (async () => {\n await attachGraphPromise();\n const { GET, POST, DELETE } = await import('./router');\n return {\n GET,\n POST,\n DELETE,\n };\n })();\n }\n return globalThis.LG_INIT_PROMISE;\n}\n"],"names":[],"mappings":"AAwBA,eAAsB,kBAAkB,kBAAA,EAAyC;AAC7E,EAAA,IAAI,UAAA,CAAW,oBAAoB,MAAA,EAAW;AAC1C,IAAA,UAAA,CAAW,mBAAmB,YAAY;AACtC,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,QAAO,GAAI,MAAM,OAAO,0BAAU,CAAA;AACrD,MAAA,OAAO;AAAA,QACH,GAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA,GAAG;AAAA,EACP;AACA,EAAA,OAAO,UAAA,CAAW,eAAA;AACtB;;;;"}
@@ -942,6 +942,304 @@ class SQLiteThreadsManager {
942
942
  }
943
943
  }
944
944
 
945
+ class PostgresThreadsManager {
946
+ pool;
947
+ isSetup = false;
948
+ constructor(checkpointer) {
949
+ this.pool = checkpointer.pool;
950
+ }
951
+ async setup() {
952
+ if (this.isSetup) {
953
+ return;
954
+ }
955
+ await this.pool.query(`
956
+ CREATE TABLE IF NOT EXISTS threads (
957
+ thread_id TEXT PRIMARY KEY,
958
+ created_at TIMESTAMP NOT NULL,
959
+ updated_at TIMESTAMP NOT NULL,
960
+ metadata JSONB NOT NULL DEFAULT '{}',
961
+ status TEXT NOT NULL DEFAULT 'idle',
962
+ "values" JSONB,
963
+ interrupts JSONB NOT NULL DEFAULT '{}'
964
+ )
965
+ `);
966
+ await this.pool.query(`
967
+ CREATE TABLE IF NOT EXISTS runs (
968
+ run_id TEXT PRIMARY KEY,
969
+ thread_id TEXT NOT NULL,
970
+ assistant_id TEXT NOT NULL,
971
+ created_at TIMESTAMP NOT NULL,
972
+ updated_at TIMESTAMP NOT NULL,
973
+ status TEXT NOT NULL DEFAULT 'pending',
974
+ metadata JSONB NOT NULL DEFAULT '{}',
975
+ multitask_strategy TEXT NOT NULL DEFAULT 'reject',
976
+ FOREIGN KEY (thread_id) REFERENCES threads(thread_id) ON DELETE CASCADE
977
+ )
978
+ `);
979
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_threads_status ON threads(status)`);
980
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_threads_created_at ON threads(created_at)`);
981
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_threads_updated_at ON threads(updated_at)`);
982
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`);
983
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`);
984
+ this.isSetup = true;
985
+ }
986
+ async create(payload) {
987
+ const threadId = payload?.threadId || crypto.randomUUID();
988
+ if (payload?.ifExists === "raise") {
989
+ const result = await this.pool.query("SELECT thread_id FROM threads WHERE thread_id = $1", [threadId]);
990
+ if (result.rows.length > 0) {
991
+ throw new Error(`Thread with ID ${threadId} already exists.`);
992
+ }
993
+ }
994
+ const now = /* @__PURE__ */ new Date();
995
+ const metadata = payload?.metadata || {};
996
+ const interrupts = {};
997
+ const thread = {
998
+ thread_id: threadId,
999
+ created_at: now.toISOString(),
1000
+ updated_at: now.toISOString(),
1001
+ metadata,
1002
+ status: "idle",
1003
+ values: null,
1004
+ interrupts
1005
+ };
1006
+ await this.pool.query(
1007
+ `
1008
+ INSERT INTO threads (thread_id, created_at, updated_at, metadata, status, "values", interrupts)
1009
+ VALUES ($1, $2, $3, $4, $5, $6, $7)
1010
+ `,
1011
+ [threadId, now, now, JSON.stringify(metadata), "idle", null, JSON.stringify(interrupts)]
1012
+ );
1013
+ return thread;
1014
+ }
1015
+ async search(query) {
1016
+ let sql = "SELECT * FROM threads";
1017
+ const whereConditions = [];
1018
+ const params = [];
1019
+ let paramIndex = 1;
1020
+ if (query?.status) {
1021
+ whereConditions.push(`status = $${paramIndex++}`);
1022
+ params.push(query.status);
1023
+ }
1024
+ if (query?.metadata) {
1025
+ for (const [key, value] of Object.entries(query.metadata)) {
1026
+ whereConditions.push(`metadata->$${paramIndex} = $${paramIndex + 1}`);
1027
+ params.push(key, JSON.stringify(value));
1028
+ paramIndex += 2;
1029
+ }
1030
+ }
1031
+ if (whereConditions.length > 0) {
1032
+ sql += " WHERE " + whereConditions.join(" AND ");
1033
+ }
1034
+ if (query?.sortBy) {
1035
+ sql += ` ORDER BY ${query.sortBy}`;
1036
+ if (query.sortOrder === "desc") {
1037
+ sql += " DESC";
1038
+ } else {
1039
+ sql += " ASC";
1040
+ }
1041
+ }
1042
+ if (query?.limit) {
1043
+ sql += ` LIMIT $${paramIndex++}`;
1044
+ params.push(query.limit);
1045
+ if (query?.offset) {
1046
+ sql += ` OFFSET $${paramIndex++}`;
1047
+ params.push(query.offset);
1048
+ }
1049
+ }
1050
+ const result = await this.pool.query(sql, params);
1051
+ return result.rows.map((row) => ({
1052
+ thread_id: row.thread_id,
1053
+ created_at: new Date(row.created_at).toISOString(),
1054
+ updated_at: new Date(row.updated_at).toISOString(),
1055
+ metadata: row.metadata,
1056
+ status: row.status,
1057
+ values: row.values || null,
1058
+ interrupts: row.interrupts
1059
+ }));
1060
+ }
1061
+ async get(threadId) {
1062
+ const result = await this.pool.query("SELECT * FROM threads WHERE thread_id = $1", [threadId]);
1063
+ if (result.rows.length === 0) {
1064
+ throw new Error(`Thread with ID ${threadId} not found.`);
1065
+ }
1066
+ const row = result.rows[0];
1067
+ return {
1068
+ thread_id: row.thread_id,
1069
+ created_at: new Date(row.created_at).toISOString(),
1070
+ updated_at: new Date(row.updated_at).toISOString(),
1071
+ metadata: row.metadata,
1072
+ status: row.status,
1073
+ values: row.values || null,
1074
+ interrupts: row.interrupts
1075
+ };
1076
+ }
1077
+ async set(threadId, thread) {
1078
+ const existingThread = await this.pool.query("SELECT thread_id FROM threads WHERE thread_id = $1", [threadId]);
1079
+ if (existingThread.rows.length === 0) {
1080
+ throw new Error(`Thread with ID ${threadId} not found.`);
1081
+ }
1082
+ const updateFields = [];
1083
+ const values = [];
1084
+ let paramIndex = 1;
1085
+ if (thread.metadata !== void 0) {
1086
+ updateFields.push(`metadata = $${paramIndex++}`);
1087
+ values.push(JSON.stringify(thread.metadata));
1088
+ }
1089
+ if (thread.status !== void 0) {
1090
+ updateFields.push(`status = $${paramIndex++}`);
1091
+ values.push(thread.status);
1092
+ }
1093
+ if (thread.values !== void 0) {
1094
+ updateFields.push(`"values" = $${paramIndex++}`);
1095
+ values.push(thread.values ? JSON.stringify(thread.values) : null);
1096
+ }
1097
+ if (thread.interrupts !== void 0) {
1098
+ updateFields.push(`interrupts = $${paramIndex++}`);
1099
+ values.push(JSON.stringify(thread.interrupts));
1100
+ }
1101
+ updateFields.push(`updated_at = $${paramIndex++}`);
1102
+ values.push(/* @__PURE__ */ new Date());
1103
+ if (updateFields.length > 0) {
1104
+ values.push(threadId);
1105
+ await this.pool.query(
1106
+ `
1107
+ UPDATE threads
1108
+ SET ${updateFields.join(", ")}
1109
+ WHERE thread_id = $${paramIndex}
1110
+ `,
1111
+ values
1112
+ );
1113
+ }
1114
+ }
1115
+ async updateState(threadId, thread) {
1116
+ const result = await this.pool.query("SELECT * FROM threads WHERE thread_id = $1", [threadId]);
1117
+ if (result.rows.length === 0) {
1118
+ throw new Error(`Thread with ID ${threadId} not found.`);
1119
+ }
1120
+ const row = result.rows[0];
1121
+ const targetThread = {
1122
+ thread_id: row.thread_id,
1123
+ created_at: new Date(row.created_at).toISOString(),
1124
+ updated_at: new Date(row.updated_at).toISOString(),
1125
+ metadata: row.metadata,
1126
+ status: row.status,
1127
+ values: row.values || null,
1128
+ interrupts: row.interrupts
1129
+ };
1130
+ if (targetThread.status === "busy") {
1131
+ throw new Error(`Thread with ID ${threadId} is busy, can't update state.`);
1132
+ }
1133
+ if (!targetThread.metadata?.graph_id) {
1134
+ throw new Error(`Thread with ID ${threadId} has no graph_id.`);
1135
+ }
1136
+ const graphId = targetThread.metadata?.graph_id;
1137
+ const config = {
1138
+ configurable: {
1139
+ thread_id: threadId,
1140
+ graph_id: graphId
1141
+ }
1142
+ };
1143
+ const graph = await getGraph(graphId, config);
1144
+ const nextConfig = await graph.updateState(config, thread.values);
1145
+ const graphState = await graph.getState(config);
1146
+ await this.set(threadId, { values: JSON.parse(serialiseAsDict(graphState.values)) });
1147
+ return nextConfig;
1148
+ }
1149
+ async delete(threadId) {
1150
+ const result = await this.pool.query("DELETE FROM threads WHERE thread_id = $1", [threadId]);
1151
+ if (result.rowCount === 0) {
1152
+ throw new Error(`Thread with ID ${threadId} not found.`);
1153
+ }
1154
+ }
1155
+ async createRun(threadId, assistantId, payload) {
1156
+ const runId = crypto.randomUUID();
1157
+ const now = /* @__PURE__ */ new Date();
1158
+ const metadata = payload?.metadata ?? {};
1159
+ const run = {
1160
+ run_id: runId,
1161
+ thread_id: threadId,
1162
+ assistant_id: assistantId,
1163
+ created_at: now.toISOString(),
1164
+ updated_at: now.toISOString(),
1165
+ status: "pending",
1166
+ metadata,
1167
+ multitask_strategy: "reject"
1168
+ };
1169
+ await this.pool.query(
1170
+ `
1171
+ INSERT INTO runs (run_id, thread_id, assistant_id, created_at, updated_at, status, metadata, multitask_strategy)
1172
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
1173
+ `,
1174
+ [runId, threadId, assistantId, now, now, "pending", JSON.stringify(metadata), "reject"]
1175
+ );
1176
+ return run;
1177
+ }
1178
+ async listRuns(threadId, options) {
1179
+ let sql = "SELECT * FROM runs WHERE thread_id = $1";
1180
+ const params = [threadId];
1181
+ let paramIndex = 2;
1182
+ if (options?.status) {
1183
+ sql += ` AND status = $${paramIndex++}`;
1184
+ params.push(options.status);
1185
+ }
1186
+ sql += " ORDER BY created_at DESC";
1187
+ if (options?.limit) {
1188
+ sql += ` LIMIT $${paramIndex++}`;
1189
+ params.push(options.limit);
1190
+ if (options?.offset) {
1191
+ sql += ` OFFSET $${paramIndex++}`;
1192
+ params.push(options.offset);
1193
+ }
1194
+ }
1195
+ const result = await this.pool.query(sql, params);
1196
+ return result.rows.map((row) => ({
1197
+ run_id: row.run_id,
1198
+ thread_id: row.thread_id,
1199
+ assistant_id: row.assistant_id,
1200
+ created_at: new Date(row.created_at).toISOString(),
1201
+ updated_at: new Date(row.updated_at).toISOString(),
1202
+ status: row.status,
1203
+ metadata: row.metadata,
1204
+ multitask_strategy: row.multitask_strategy
1205
+ }));
1206
+ }
1207
+ async updateRun(runId, run) {
1208
+ const existingRun = await this.pool.query("SELECT run_id FROM runs WHERE run_id = $1", [runId]);
1209
+ if (existingRun.rows.length === 0) {
1210
+ throw new Error(`Run with ID ${runId} not found.`);
1211
+ }
1212
+ const updateFields = [];
1213
+ const values = [];
1214
+ let paramIndex = 1;
1215
+ if (run.status !== void 0) {
1216
+ updateFields.push(`status = $${paramIndex++}`);
1217
+ values.push(run.status);
1218
+ }
1219
+ if (run.metadata !== void 0) {
1220
+ updateFields.push(`metadata = $${paramIndex++}`);
1221
+ values.push(JSON.stringify(run.metadata));
1222
+ }
1223
+ if (run.multitask_strategy !== void 0) {
1224
+ updateFields.push(`multitask_strategy = $${paramIndex++}`);
1225
+ values.push(run.multitask_strategy);
1226
+ }
1227
+ updateFields.push(`updated_at = $${paramIndex++}`);
1228
+ values.push(/* @__PURE__ */ new Date());
1229
+ if (updateFields.length > 0) {
1230
+ values.push(runId);
1231
+ await this.pool.query(
1232
+ `
1233
+ UPDATE runs
1234
+ SET ${updateFields.join(", ")}
1235
+ WHERE run_id = $${paramIndex}
1236
+ `,
1237
+ values
1238
+ );
1239
+ }
1240
+ }
1241
+ }
1242
+
945
1243
  const createCheckPointer = async () => {
946
1244
  if (process.env.REDIS_URL && process.env.CHECKPOINT_TYPE === "redis" || process.env.CHECKPOINT_TYPE === "shallow/redis") {
947
1245
  if (process.env.CHECKPOINT_TYPE === "redis") {
@@ -976,7 +1274,7 @@ const createMessageQueue = async () => {
976
1274
  let q;
977
1275
  if (process.env.REDIS_URL) {
978
1276
  console.debug("LG | Using redis as stream queue");
979
- const { RedisStreamQueue } = await import('./queue-pSZu1PVS.js');
1277
+ const { RedisStreamQueue } = await import('./queue-Cao_-0hm.js');
980
1278
  q = RedisStreamQueue;
981
1279
  } else {
982
1280
  q = MemoryStreamQueue;
@@ -985,7 +1283,6 @@ const createMessageQueue = async () => {
985
1283
  };
986
1284
  const createThreadManager = async (config) => {
987
1285
  if (process.env.DATABASE_URL && config.checkpointer) {
988
- const { PostgresThreadsManager } = await import('./threads-amMaxKul.js');
989
1286
  const threadsManager = new PostgresThreadsManager(config.checkpointer);
990
1287
  if (process.env.DATABASE_INIT === "true") {
991
1288
  await threadsManager.setup();
@@ -1249,5 +1546,5 @@ const createEndpoint = () => {
1249
1546
  };
1250
1547
  };
1251
1548
 
1252
- export { AssistantEndpoint as A, BaseStreamQueue as B, CancelEventMessage as C, LangGraphGlobal as L, createEndpoint as c, getGraph as g, registerGraph as r, serialiseAsDict as s };
1253
- //# sourceMappingURL=createEndpoint-BcVhF-uq.js.map
1549
+ export { AssistantEndpoint as A, BaseStreamQueue as B, CancelEventMessage as C, LangGraphGlobal as L, createEndpoint as c, registerGraph as r, serialiseAsDict as s };
1550
+ //# sourceMappingURL=createEndpoint-B0FQz0jr.js.map