@langchain/langgraph-sdk 1.9.21 → 1.9.23

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.
Files changed (95) hide show
  1. package/dist/client/base.cjs +4 -1
  2. package/dist/client/base.cjs.map +1 -1
  3. package/dist/client/base.d.cts +2 -0
  4. package/dist/client/base.d.cts.map +1 -1
  5. package/dist/client/base.d.ts +2 -0
  6. package/dist/client/base.d.ts.map +1 -1
  7. package/dist/client/base.js +5 -2
  8. package/dist/client/base.js.map +1 -1
  9. package/dist/client/runs/index.cjs +2 -0
  10. package/dist/client/runs/index.cjs.map +1 -1
  11. package/dist/client/runs/index.d.cts +15 -0
  12. package/dist/client/runs/index.d.cts.map +1 -1
  13. package/dist/client/runs/index.d.ts +15 -0
  14. package/dist/client/runs/index.d.ts.map +1 -1
  15. package/dist/client/runs/index.js +2 -0
  16. package/dist/client/runs/index.js.map +1 -1
  17. package/dist/client/stream/transport/agent-server.cjs +6 -1
  18. package/dist/client/stream/transport/agent-server.cjs.map +1 -1
  19. package/dist/client/stream/transport/agent-server.d.cts +10 -2
  20. package/dist/client/stream/transport/agent-server.d.cts.map +1 -1
  21. package/dist/client/stream/transport/agent-server.d.ts +10 -2
  22. package/dist/client/stream/transport/agent-server.d.ts.map +1 -1
  23. package/dist/client/stream/transport/agent-server.js +6 -1
  24. package/dist/client/stream/transport/agent-server.js.map +1 -1
  25. package/dist/client/stream/transport/http.cjs +33 -12
  26. package/dist/client/stream/transport/http.cjs.map +1 -1
  27. package/dist/client/stream/transport/http.d.cts +18 -7
  28. package/dist/client/stream/transport/http.d.cts.map +1 -1
  29. package/dist/client/stream/transport/http.d.ts +18 -7
  30. package/dist/client/stream/transport/http.d.ts.map +1 -1
  31. package/dist/client/stream/transport/http.js +35 -14
  32. package/dist/client/stream/transport/http.js.map +1 -1
  33. package/dist/client/stream/transport/types.d.cts +41 -5
  34. package/dist/client/stream/transport/types.d.cts.map +1 -1
  35. package/dist/client/stream/transport/types.d.ts +41 -5
  36. package/dist/client/stream/transport/types.d.ts.map +1 -1
  37. package/dist/client/stream/transport/utils.cjs +19 -0
  38. package/dist/client/stream/transport/utils.cjs.map +1 -1
  39. package/dist/client/stream/transport/utils.js +19 -1
  40. package/dist/client/stream/transport/utils.js.map +1 -1
  41. package/dist/client/stream/transport/websocket.cjs +20 -5
  42. package/dist/client/stream/transport/websocket.cjs.map +1 -1
  43. package/dist/client/stream/transport/websocket.d.cts +13 -4
  44. package/dist/client/stream/transport/websocket.d.cts.map +1 -1
  45. package/dist/client/stream/transport/websocket.d.ts +13 -4
  46. package/dist/client/stream/transport/websocket.d.ts.map +1 -1
  47. package/dist/client/stream/transport/websocket.js +21 -6
  48. package/dist/client/stream/transport/websocket.js.map +1 -1
  49. package/dist/client/stream/transport.d.cts +20 -3
  50. package/dist/client/stream/transport.d.cts.map +1 -1
  51. package/dist/client/stream/transport.d.ts +20 -3
  52. package/dist/client/stream/transport.d.ts.map +1 -1
  53. package/dist/client/stream/types.d.cts +14 -0
  54. package/dist/client/stream/types.d.cts.map +1 -1
  55. package/dist/client/stream/types.d.ts +14 -0
  56. package/dist/client/stream/types.d.ts.map +1 -1
  57. package/dist/client/threads/index.cjs +7 -4
  58. package/dist/client/threads/index.cjs.map +1 -1
  59. package/dist/client/threads/index.js +6 -3
  60. package/dist/client/threads/index.js.map +1 -1
  61. package/dist/react-ui/server/server.cjs +2 -2
  62. package/dist/react-ui/server/server.cjs.map +1 -1
  63. package/dist/react-ui/server/server.js +1 -1
  64. package/dist/react-ui/server/server.js.map +1 -1
  65. package/dist/stream/channel-registry.cjs +20 -7
  66. package/dist/stream/channel-registry.cjs.map +1 -1
  67. package/dist/stream/channel-registry.d.cts +4 -3
  68. package/dist/stream/channel-registry.d.cts.map +1 -1
  69. package/dist/stream/channel-registry.d.ts +4 -3
  70. package/dist/stream/channel-registry.d.ts.map +1 -1
  71. package/dist/stream/channel-registry.js +20 -7
  72. package/dist/stream/channel-registry.js.map +1 -1
  73. package/dist/stream/controller.cjs +2 -2
  74. package/dist/stream/controller.cjs.map +1 -1
  75. package/dist/stream/controller.js +1 -1
  76. package/dist/stream/controller.js.map +1 -1
  77. package/dist/stream/submit-coordinator.cjs +3 -3
  78. package/dist/stream/submit-coordinator.cjs.map +1 -1
  79. package/dist/stream/submit-coordinator.js +1 -1
  80. package/dist/stream/submit-coordinator.js.map +1 -1
  81. package/dist/types.d.cts +20 -0
  82. package/dist/types.d.cts.map +1 -1
  83. package/dist/types.d.ts +20 -0
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/utils/index.d.cts +1 -1
  86. package/dist/utils/index.d.ts +1 -1
  87. package/dist/utils/stream.cjs +94 -0
  88. package/dist/utils/stream.cjs.map +1 -1
  89. package/dist/utils/stream.d.cts +15 -1
  90. package/dist/utils/stream.d.cts.map +1 -1
  91. package/dist/utils/stream.d.ts +15 -1
  92. package/dist/utils/stream.d.ts.map +1 -1
  93. package/dist/utils/stream.js +94 -1
  94. package/dist/utils/stream.js.map +1 -1
  95. package/package.json +3 -5
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/client/runs/index.ts"],"sourcesContent":["import {\n CancelAction,\n DefaultValues,\n Run,\n RunSelectField,\n RunStatus,\n ThreadState,\n} from \"../../schema.js\";\nimport type {\n RunsCreatePayload,\n RunsStreamPayload,\n RunsWaitPayload,\n StreamEvent,\n} from \"../../types.js\";\nimport type { StreamMode, TypedAsyncGenerator } from \"../../types.stream.js\";\n\nimport { BaseClient, getRunMetadataFromResponse } from \"../base.js\";\n\nexport class RunsClient<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> extends BaseClient {\n stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: null,\n assistantId: string,\n payload?: Omit<\n RunsStreamPayload<TStreamMode, TSubgraphs>,\n \"multitaskStrategy\" | \"onCompletion\"\n >\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n\n stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: string,\n assistantId: string,\n payload?: RunsStreamPayload<TStreamMode, TSubgraphs>\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n\n /**\n * Create a run and stream the results.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n */\n async *stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: string | null,\n assistantId: string,\n payload?: RunsStreamPayload<TStreamMode, TSubgraphs>\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n > {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n stream_mode: payload?.streamMode,\n stream_subgraphs: payload?.streamSubgraphs,\n stream_resumable: payload?.streamResumable,\n feedback_keys: payload?.feedbackKeys,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n checkpoint: payload?.checkpoint,\n webhook: payload?.webhook,\n multitask_strategy: payload?.multitaskStrategy,\n on_completion: payload?.onCompletion,\n on_disconnect: payload?.onDisconnect,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n };\n\n yield* this.streamWithRetry({\n endpoint:\n threadId == null ? `/runs/stream` : `/threads/${threadId}/runs/stream`,\n method: \"POST\",\n json,\n signal: payload?.signal,\n onInitialResponse: (response) => {\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n },\n }) as TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n }\n\n /**\n * Create a run.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n * @returns The created run.\n */\n async create(\n threadId: string | null,\n assistantId: string,\n payload?: RunsCreatePayload\n ): Promise<Run> {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n stream_mode: payload?.streamMode,\n stream_subgraphs: payload?.streamSubgraphs,\n stream_resumable: payload?.streamResumable,\n feedback_keys: payload?.feedbackKeys,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n webhook: payload?.webhook,\n checkpoint: payload?.checkpoint,\n checkpoint_id: payload?.checkpointId,\n multitask_strategy: payload?.multitaskStrategy,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n on_completion: payload?.onCompletion,\n langsmith_tracer: payload?._langsmithTracer\n ? {\n project_name: payload?._langsmithTracer?.projectName,\n example_id: payload?._langsmithTracer?.exampleId,\n }\n : undefined,\n };\n\n const endpoint = threadId === null ? \"/runs\" : `/threads/${threadId}/runs`;\n const [run, response] = await this.fetch<Run>(endpoint, {\n method: \"POST\",\n json,\n signal: payload?.signal,\n withResponse: true,\n });\n\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n\n return run;\n }\n\n /**\n * Create a batch of stateless background runs.\n *\n * @param payloads An array of payloads for creating runs.\n * @returns An array of created runs.\n */\n async createBatch(\n payloads: (Omit<RunsCreatePayload, \"signal\"> & { assistantId: string })[],\n options?: { signal?: AbortSignal }\n ): Promise<Run[]> {\n const filteredPayloads = payloads\n .map((payload) => ({ ...payload, assistant_id: payload.assistantId }))\n .map((payload) => {\n return Object.fromEntries(\n Object.entries(payload).filter(([_, v]) => v !== undefined)\n );\n });\n\n return this.fetch<Run[]>(\"/runs/batch\", {\n method: \"POST\",\n json: filteredPayloads,\n signal: options?.signal,\n });\n }\n\n async wait(\n threadId: null,\n assistantId: string,\n payload?: Omit<RunsWaitPayload, \"multitaskStrategy\" | \"onCompletion\">\n ): Promise<ThreadState[\"values\"]>;\n\n async wait(\n threadId: string,\n assistantId: string,\n payload?: RunsWaitPayload\n ): Promise<ThreadState[\"values\"]>;\n\n /**\n * Create a run and wait for it to complete.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n * @returns The last values chunk of the thread.\n */\n async wait(\n threadId: string | null,\n assistantId: string,\n payload?: RunsWaitPayload\n ): Promise<ThreadState[\"values\"]> {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n checkpoint: payload?.checkpoint,\n checkpoint_id: payload?.checkpointId,\n webhook: payload?.webhook,\n multitask_strategy: payload?.multitaskStrategy,\n on_completion: payload?.onCompletion,\n on_disconnect: payload?.onDisconnect,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n langsmith_tracer: payload?._langsmithTracer\n ? {\n project_name: payload?._langsmithTracer?.projectName,\n example_id: payload?._langsmithTracer?.exampleId,\n }\n : undefined,\n };\n const endpoint =\n threadId == null ? `/runs/wait` : `/threads/${threadId}/runs/wait`;\n const [run, response] = await this.fetch<ThreadState[\"values\"]>(endpoint, {\n method: \"POST\",\n json,\n timeoutMs: null,\n signal: payload?.signal,\n withResponse: true,\n });\n\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n\n const raiseError =\n payload?.raiseError !== undefined ? payload.raiseError : true;\n if (\n raiseError &&\n \"__error__\" in run &&\n typeof run.__error__ === \"object\" &&\n run.__error__ &&\n \"error\" in run.__error__ &&\n \"message\" in run.__error__\n ) {\n throw new Error(`${run.__error__?.error}: ${run.__error__?.message}`);\n }\n return run;\n }\n\n /**\n * List all runs for a thread.\n *\n * @param threadId The ID of the thread.\n * @param options Filtering and pagination options.\n * @returns List of runs.\n */\n async list(\n threadId: string,\n options?: {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n select?: RunSelectField[];\n signal?: AbortSignal;\n }\n ): Promise<Run[]> {\n return this.fetch<Run[]>(`/threads/${threadId}/runs`, {\n params: {\n limit: options?.limit ?? 10,\n offset: options?.offset ?? 0,\n status: options?.status ?? undefined,\n select: options?.select ?? undefined,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * Get a run by ID.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns The run.\n */\n async get(\n threadId: string,\n runId: string,\n options?: { signal?: AbortSignal }\n ): Promise<Run> {\n return this.fetch<Run>(`/threads/${threadId}/runs/${runId}`, {\n signal: options?.signal,\n });\n }\n\n /**\n * Cancel a run.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @param wait Whether to block when canceling\n * @param action Action to take when cancelling the run. Possible values are `interrupt` or `rollback`. Default is `interrupt`.\n * @returns\n */\n async cancel(\n threadId: string,\n runId: string,\n wait: boolean = false,\n action: CancelAction = \"interrupt\",\n options: { signal?: AbortSignal } = {}\n ): Promise<void> {\n return this.fetch<void>(`/threads/${threadId}/runs/${runId}/cancel`, {\n method: \"POST\",\n params: { wait: wait ? \"1\" : \"0\", action },\n signal: options?.signal,\n });\n }\n\n /**\n * Cancel one or more runs.\n *\n * @param options Options for cancelling runs.\n * @returns\n */\n async cancelMany(options: {\n threadId?: string;\n runIds?: string[];\n status?: \"pending\" | \"running\" | \"all\";\n action?: CancelAction;\n signal?: AbortSignal;\n }): Promise<void> {\n return this.fetch<void>(`/runs/cancel`, {\n method: \"POST\",\n json: {\n thread_id: options.threadId,\n run_ids: options.runIds,\n status: options.status,\n },\n params: { action: options.action },\n signal: options.signal,\n });\n }\n\n /**\n * Block until a run is done.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns\n */\n async join(\n threadId: string,\n runId: string,\n options?: { cancelOnDisconnect?: boolean; signal?: AbortSignal }\n ): Promise<TStateType> {\n return this.fetch<TStateType>(`/threads/${threadId}/runs/${runId}/join`, {\n timeoutMs: null,\n params: { cancel_on_disconnect: options?.cancelOnDisconnect ? \"1\" : \"0\" },\n signal: options?.signal,\n });\n }\n\n /**\n * Stream output from a run in real-time, until the run is done.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @param options Additional options for controlling the stream behavior.\n * @returns An async generator yielding stream parts.\n */\n async *joinStream(\n threadId: string | undefined | null,\n runId: string,\n options?:\n | {\n signal?: AbortSignal;\n cancelOnDisconnect?: boolean;\n lastEventId?: string;\n streamMode?: StreamMode | StreamMode[];\n }\n | AbortSignal\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n const opts =\n typeof options === \"object\" &&\n options != null &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n options instanceof AbortSignal\n ? { signal: options }\n : options;\n\n yield* this.streamWithRetry({\n endpoint:\n threadId != null\n ? `/threads/${threadId}/runs/${runId}/stream`\n : `/runs/${runId}/stream`,\n method: \"GET\",\n signal: opts?.signal,\n headers: opts?.lastEventId\n ? { \"Last-Event-ID\": opts.lastEventId }\n : undefined,\n params: {\n cancel_on_disconnect: opts?.cancelOnDisconnect ? \"1\" : \"0\",\n stream_mode: opts?.streamMode,\n },\n });\n }\n\n /**\n * Delete a run.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns\n */\n async delete(\n threadId: string,\n runId: string,\n options?: { signal?: AbortSignal }\n ): Promise<void> {\n return this.fetch<void>(`/threads/${threadId}/runs/${runId}`, {\n method: \"DELETE\",\n signal: options?.signal,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/client/runs/index.ts"],"sourcesContent":["import {\n CancelAction,\n DefaultValues,\n Run,\n RunSelectField,\n RunStatus,\n ThreadState,\n} from \"../../schema.js\";\nimport type {\n RunsCreatePayload,\n RunsStreamPayload,\n RunsWaitPayload,\n StreamEvent,\n} from \"../../types.js\";\nimport type { StreamMode, TypedAsyncGenerator } from \"../../types.stream.js\";\nimport type { IdleReconnectMode } from \"../../utils/stream.js\";\n\nimport { BaseClient, getRunMetadataFromResponse } from \"../base.js\";\n\nexport class RunsClient<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> extends BaseClient {\n stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: null,\n assistantId: string,\n payload?: Omit<\n RunsStreamPayload<TStreamMode, TSubgraphs>,\n \"multitaskStrategy\" | \"onCompletion\"\n >\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n\n stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: string,\n assistantId: string,\n payload?: RunsStreamPayload<TStreamMode, TSubgraphs>\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n\n /**\n * Create a run and stream the results.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n */\n async *stream<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n >(\n threadId: string | null,\n assistantId: string,\n payload?: RunsStreamPayload<TStreamMode, TSubgraphs>\n ): TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n > {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n stream_mode: payload?.streamMode,\n stream_subgraphs: payload?.streamSubgraphs,\n stream_resumable: payload?.streamResumable,\n feedback_keys: payload?.feedbackKeys,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n checkpoint: payload?.checkpoint,\n webhook: payload?.webhook,\n multitask_strategy: payload?.multitaskStrategy,\n on_completion: payload?.onCompletion,\n on_disconnect: payload?.onDisconnect,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n };\n\n yield* this.streamWithRetry({\n endpoint:\n threadId == null ? `/runs/stream` : `/threads/${threadId}/runs/stream`,\n method: \"POST\",\n json,\n signal: payload?.signal,\n idleReconnect: payload?.streamIdleReconnect,\n onInitialResponse: (response) => {\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n },\n }) as TypedAsyncGenerator<\n TStreamMode,\n TSubgraphs,\n TStateType,\n TUpdateType,\n TCustomEventType\n >;\n }\n\n /**\n * Create a run.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n * @returns The created run.\n */\n async create(\n threadId: string | null,\n assistantId: string,\n payload?: RunsCreatePayload\n ): Promise<Run> {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n stream_mode: payload?.streamMode,\n stream_subgraphs: payload?.streamSubgraphs,\n stream_resumable: payload?.streamResumable,\n feedback_keys: payload?.feedbackKeys,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n webhook: payload?.webhook,\n checkpoint: payload?.checkpoint,\n checkpoint_id: payload?.checkpointId,\n multitask_strategy: payload?.multitaskStrategy,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n on_completion: payload?.onCompletion,\n langsmith_tracer: payload?._langsmithTracer\n ? {\n project_name: payload?._langsmithTracer?.projectName,\n example_id: payload?._langsmithTracer?.exampleId,\n }\n : undefined,\n };\n\n const endpoint = threadId === null ? \"/runs\" : `/threads/${threadId}/runs`;\n const [run, response] = await this.fetch<Run>(endpoint, {\n method: \"POST\",\n json,\n signal: payload?.signal,\n withResponse: true,\n });\n\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n\n return run;\n }\n\n /**\n * Create a batch of stateless background runs.\n *\n * @param payloads An array of payloads for creating runs.\n * @returns An array of created runs.\n */\n async createBatch(\n payloads: (Omit<RunsCreatePayload, \"signal\"> & { assistantId: string })[],\n options?: { signal?: AbortSignal }\n ): Promise<Run[]> {\n const filteredPayloads = payloads\n .map((payload) => ({ ...payload, assistant_id: payload.assistantId }))\n .map((payload) => {\n return Object.fromEntries(\n Object.entries(payload).filter(([_, v]) => v !== undefined)\n );\n });\n\n return this.fetch<Run[]>(\"/runs/batch\", {\n method: \"POST\",\n json: filteredPayloads,\n signal: options?.signal,\n });\n }\n\n async wait(\n threadId: null,\n assistantId: string,\n payload?: Omit<RunsWaitPayload, \"multitaskStrategy\" | \"onCompletion\">\n ): Promise<ThreadState[\"values\"]>;\n\n async wait(\n threadId: string,\n assistantId: string,\n payload?: RunsWaitPayload\n ): Promise<ThreadState[\"values\"]>;\n\n /**\n * Create a run and wait for it to complete.\n *\n * @param threadId The ID of the thread.\n * @param assistantId Assistant ID to use for this run.\n * @param payload Payload for creating a run.\n * @returns The last values chunk of the thread.\n */\n async wait(\n threadId: string | null,\n assistantId: string,\n payload?: RunsWaitPayload\n ): Promise<ThreadState[\"values\"]> {\n const json: Record<string, unknown> = {\n input: payload?.input,\n command: payload?.command,\n config: payload?.config,\n context: payload?.context,\n metadata: payload?.metadata,\n assistant_id: assistantId,\n interrupt_before: payload?.interruptBefore,\n interrupt_after: payload?.interruptAfter,\n checkpoint: payload?.checkpoint,\n checkpoint_id: payload?.checkpointId,\n webhook: payload?.webhook,\n multitask_strategy: payload?.multitaskStrategy,\n on_completion: payload?.onCompletion,\n on_disconnect: payload?.onDisconnect,\n after_seconds: payload?.afterSeconds,\n if_not_exists: payload?.ifNotExists,\n checkpoint_during: payload?.checkpointDuring,\n durability: payload?.durability,\n langsmith_tracer: payload?._langsmithTracer\n ? {\n project_name: payload?._langsmithTracer?.projectName,\n example_id: payload?._langsmithTracer?.exampleId,\n }\n : undefined,\n };\n const endpoint =\n threadId == null ? `/runs/wait` : `/threads/${threadId}/runs/wait`;\n const [run, response] = await this.fetch<ThreadState[\"values\"]>(endpoint, {\n method: \"POST\",\n json,\n timeoutMs: null,\n signal: payload?.signal,\n withResponse: true,\n });\n\n const runMetadata = getRunMetadataFromResponse(response);\n if (runMetadata) payload?.onRunCreated?.(runMetadata);\n\n const raiseError =\n payload?.raiseError !== undefined ? payload.raiseError : true;\n if (\n raiseError &&\n \"__error__\" in run &&\n typeof run.__error__ === \"object\" &&\n run.__error__ &&\n \"error\" in run.__error__ &&\n \"message\" in run.__error__\n ) {\n throw new Error(`${run.__error__?.error}: ${run.__error__?.message}`);\n }\n return run;\n }\n\n /**\n * List all runs for a thread.\n *\n * @param threadId The ID of the thread.\n * @param options Filtering and pagination options.\n * @returns List of runs.\n */\n async list(\n threadId: string,\n options?: {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n select?: RunSelectField[];\n signal?: AbortSignal;\n }\n ): Promise<Run[]> {\n return this.fetch<Run[]>(`/threads/${threadId}/runs`, {\n params: {\n limit: options?.limit ?? 10,\n offset: options?.offset ?? 0,\n status: options?.status ?? undefined,\n select: options?.select ?? undefined,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * Get a run by ID.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns The run.\n */\n async get(\n threadId: string,\n runId: string,\n options?: { signal?: AbortSignal }\n ): Promise<Run> {\n return this.fetch<Run>(`/threads/${threadId}/runs/${runId}`, {\n signal: options?.signal,\n });\n }\n\n /**\n * Cancel a run.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @param wait Whether to block when canceling\n * @param action Action to take when cancelling the run. Possible values are `interrupt` or `rollback`. Default is `interrupt`.\n * @returns\n */\n async cancel(\n threadId: string,\n runId: string,\n wait: boolean = false,\n action: CancelAction = \"interrupt\",\n options: { signal?: AbortSignal } = {}\n ): Promise<void> {\n return this.fetch<void>(`/threads/${threadId}/runs/${runId}/cancel`, {\n method: \"POST\",\n params: { wait: wait ? \"1\" : \"0\", action },\n signal: options?.signal,\n });\n }\n\n /**\n * Cancel one or more runs.\n *\n * @param options Options for cancelling runs.\n * @returns\n */\n async cancelMany(options: {\n threadId?: string;\n runIds?: string[];\n status?: \"pending\" | \"running\" | \"all\";\n action?: CancelAction;\n signal?: AbortSignal;\n }): Promise<void> {\n return this.fetch<void>(`/runs/cancel`, {\n method: \"POST\",\n json: {\n thread_id: options.threadId,\n run_ids: options.runIds,\n status: options.status,\n },\n params: { action: options.action },\n signal: options.signal,\n });\n }\n\n /**\n * Block until a run is done.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns\n */\n async join(\n threadId: string,\n runId: string,\n options?: { cancelOnDisconnect?: boolean; signal?: AbortSignal }\n ): Promise<TStateType> {\n return this.fetch<TStateType>(`/threads/${threadId}/runs/${runId}/join`, {\n timeoutMs: null,\n params: { cancel_on_disconnect: options?.cancelOnDisconnect ? \"1\" : \"0\" },\n signal: options?.signal,\n });\n }\n\n /**\n * Stream output from a run in real-time, until the run is done.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @param options Additional options for controlling the stream behavior.\n * @returns An async generator yielding stream parts.\n */\n async *joinStream(\n threadId: string | undefined | null,\n runId: string,\n options?:\n | {\n signal?: AbortSignal;\n cancelOnDisconnect?: boolean;\n lastEventId?: string;\n streamMode?: StreamMode | StreamMode[];\n /**\n * Idle-reconnect policy.\n *\n * Guards against half-open sockets that hang with no\n * error or close; on idle the read re-joins with the last seen\n * `Last-Event-ID`.\n *\n * - `\"auto\"` (default): arms only once the\n * server's keep-alive heartbeats are observed and sizes the window\n * from their cadence;\n * - a `number`: a fixed idle window in ms;\n * - `0`: disables it.\n */\n streamIdleReconnect?: IdleReconnectMode;\n }\n | AbortSignal\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): AsyncGenerator<{ id?: string; event: StreamEvent; data: any }> {\n const opts =\n typeof options === \"object\" &&\n options != null &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n options instanceof AbortSignal\n ? { signal: options }\n : options;\n\n yield* this.streamWithRetry({\n endpoint:\n threadId != null\n ? `/threads/${threadId}/runs/${runId}/stream`\n : `/runs/${runId}/stream`,\n method: \"GET\",\n signal: opts?.signal,\n idleReconnect: opts?.streamIdleReconnect,\n headers: opts?.lastEventId\n ? { \"Last-Event-ID\": opts.lastEventId }\n : undefined,\n params: {\n cancel_on_disconnect: opts?.cancelOnDisconnect ? \"1\" : \"0\",\n stream_mode: opts?.streamMode,\n },\n });\n }\n\n /**\n * Delete a run.\n *\n * @param threadId The ID of the thread.\n * @param runId The ID of the run.\n * @returns\n */\n async delete(\n threadId: string,\n runId: string,\n options?: { signal?: AbortSignal }\n ): Promise<void> {\n return this.fetch<void>(`/threads/${threadId}/runs/${runId}`, {\n method: \"DELETE\",\n signal: options?.signal,\n });\n }\n}\n"],"mappings":"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"}
@@ -11,7 +11,7 @@ var HttpAgentServerAdapter = class {
11
11
  */
12
12
  getState;
13
13
  constructor(options) {
14
- this.threadId = options.threadId;
14
+ this.threadId = options.threadId ?? "";
15
15
  this.apiUrl = options.apiUrl;
16
16
  this.#delegate = options.webSocketFactory != null ? new require_websocket.ProtocolWebSocketTransportAdapter({
17
17
  apiUrl: options.apiUrl,
@@ -34,6 +34,11 @@ var HttpAgentServerAdapter = class {
34
34
  this.getState = sse.getState.bind(sse);
35
35
  }
36
36
  }
37
+ /** {@inheritDoc TransportAdapter.setThreadId} */
38
+ setThreadId(threadId) {
39
+ this.threadId = threadId;
40
+ this.#delegate.setThreadId?.(threadId);
41
+ }
37
42
  open() {
38
43
  return this.#delegate.open();
39
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.cjs","names":["#delegate","ProtocolWebSocketTransportAdapter","ProtocolSseTransportAdapter"],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"sourcesContent":["/**\n * Stock `AgentServerAdapter` implementation for \"point `useStream` at a\n * single HTTP endpoint that speaks the v2 protocol\" deployments.\n *\n * Internally delegates to the appropriate built-in transport:\n * - `new HttpAgentServerAdapter({ apiUrl, threadId })` → SSE\n * - `new HttpAgentServerAdapter({ apiUrl, threadId, webSocketFactory })`\n * → WebSocket\n *\n * Keeps the user-facing import surface small: callers only ever import\n * `HttpAgentServerAdapter` from `@langchain/langgraph-sdk` instead of\n * knowing the two wire-specific class names. The class is deliberately\n * thin — it forwards every method on {@link AgentServerAdapter} to the\n * delegate it picked at construction time.\n *\n * See `plan-custom-transport.md` §4.3 for motivation.\n */\nimport type {\n AgentServerAdapter,\n EventStreamHandle,\n TransportAdapter,\n} from \"../transport.js\";\nimport type {\n Command,\n CommandResponse,\n ErrorResponse,\n Message,\n SubscribeParams,\n} from \"@langchain/protocol\";\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport { ProtocolSseTransportAdapter } from \"./http.js\";\nimport { ProtocolWebSocketTransportAdapter } from \"./websocket.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolTransportPaths,\n} from \"./types.js\";\n\nexport interface HttpAgentServerAdapterOptions {\n apiUrl: string;\n threadId: string;\n /** Auth / tenant / diagnostic headers applied to every request. */\n defaultHeaders?: Record<string, HeaderValue>;\n /** Per-request hook for last-mile header mutation. */\n onRequest?: ProtocolRequestHook;\n /** Override the default `/threads/:threadId/...` protocol paths. */\n paths?: ProtocolTransportPaths;\n /**\n * Optional `fetch` override, forwarded to the SSE transport. Useful\n * for auth proxies, Next.js route handlers, or tests with injected\n * mocks. Ignored when `webSocketFactory` is also supplied.\n */\n fetch?: typeof fetch;\n /**\n * Retries and concurrency for SSE/command HTTP. When omitted, requests\n * use raw `fetch` with no automatic retries (same as constructing\n * {@link ProtocolSseTransportAdapter} without this option).\n */\n asyncCaller?: AsyncCaller;\n /**\n * Optional WebSocket factory. Supplying it flips the adapter into\n * WebSocket mode — SSE is bypassed entirely.\n */\n webSocketFactory?: (url: string) => WebSocket;\n}\n\nexport class HttpAgentServerAdapter implements AgentServerAdapter {\n readonly threadId: string;\n\n readonly apiUrl: string;\n\n readonly #delegate: TransportAdapter;\n\n /**\n * Thread-state reads are SSE-only. WebSocket delegates omit this so\n * {@link StreamController} falls back to `client.threads.getState()`.\n */\n getState?: AgentServerAdapter[\"getState\"];\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId;\n this.apiUrl = options.apiUrl;\n this.#delegate =\n options.webSocketFactory != null\n ? new ProtocolWebSocketTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n paths: options.paths,\n webSocketFactory: options.webSocketFactory,\n })\n : new ProtocolSseTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n fetch: options.fetch,\n asyncCaller: options.asyncCaller,\n paths: options.paths,\n });\n\n if (options.webSocketFactory == null) {\n const sse = this.#delegate as ProtocolSseTransportAdapter;\n this.getState = sse.getState.bind(sse);\n }\n }\n\n open(): Promise<void> {\n return this.#delegate.open();\n }\n\n send(command: Command): Promise<CommandResponse | ErrorResponse | void> {\n return this.#delegate.send(command);\n }\n\n events(): AsyncIterable<Message> {\n return this.#delegate.events();\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.#delegate.openEventStream == null) {\n throw new Error(\n \"HttpAgentServerAdapter delegate does not support openEventStream (WebSocket path).\"\n );\n }\n return this.#delegate.openEventStream(params);\n }\n\n close(): Promise<void> {\n return this.#delegate.close();\n }\n}\n"],"mappings":";;;AAkEA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA;;;;;CAMA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ;AACxB,OAAK,SAAS,QAAQ;AACtB,QAAA,WACE,QAAQ,oBAAoB,OACxB,IAAIC,kBAAAA,kCAAkC;GACpC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC3B,CAAC,GACF,IAAIC,aAAAA,4BAA4B;GAC9B,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,OAAO,QAAQ;GAChB,CAAC;AAER,MAAI,QAAQ,oBAAoB,MAAM;GACpC,MAAM,MAAM,MAAA;AACZ,QAAK,WAAW,IAAI,SAAS,KAAK,IAAI;;;CAI1C,OAAsB;AACpB,SAAO,MAAA,SAAe,MAAM;;CAG9B,KAAK,SAAmE;AACtE,SAAO,MAAA,SAAe,KAAK,QAAQ;;CAGrC,SAAiC;AAC/B,SAAO,MAAA,SAAe,QAAQ;;CAGhC,gBAAgB,QAA4C;AAC1D,MAAI,MAAA,SAAe,mBAAmB,KACpC,OAAM,IAAI,MACR,qFACD;AAEH,SAAO,MAAA,SAAe,gBAAgB,OAAO;;CAG/C,QAAuB;AACrB,SAAO,MAAA,SAAe,OAAO"}
1
+ {"version":3,"file":"agent-server.cjs","names":["#delegate","ProtocolWebSocketTransportAdapter","ProtocolSseTransportAdapter"],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"sourcesContent":["/**\n * Stock `AgentServerAdapter` implementation for \"point `useStream` at a\n * single HTTP endpoint that speaks the v2 protocol\" deployments.\n *\n * Internally delegates to the appropriate built-in transport:\n * - `new HttpAgentServerAdapter({ apiUrl, threadId })` → SSE\n * - `new HttpAgentServerAdapter({ apiUrl, threadId, webSocketFactory })`\n * → WebSocket\n *\n * Keeps the user-facing import surface small: callers only ever import\n * `HttpAgentServerAdapter` from `@langchain/langgraph-sdk` instead of\n * knowing the two wire-specific class names. The class is deliberately\n * thin — it forwards every method on {@link AgentServerAdapter} to the\n * delegate it picked at construction time.\n *\n * See `plan-custom-transport.md` §4.3 for motivation.\n */\nimport type {\n AgentServerAdapter,\n EventStreamHandle,\n TransportAdapter,\n} from \"../transport.js\";\nimport type {\n Command,\n CommandResponse,\n ErrorResponse,\n Message,\n SubscribeParams,\n} from \"@langchain/protocol\";\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport { ProtocolSseTransportAdapter } from \"./http.js\";\nimport { ProtocolWebSocketTransportAdapter } from \"./websocket.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolTransportPaths,\n} from \"./types.js\";\n\nexport interface HttpAgentServerAdapterOptions {\n apiUrl: string;\n /**\n * Thread this adapter targets. Optional: omit to construct an unbound\n * adapter and let the framework bind it via {@link HttpAgentServerAdapter.setThreadId}\n * (`client.threads.stream` does this) — e.g. lazy thread creation, where\n * the id is only known after the first `submit()`.\n */\n threadId?: string;\n /** Auth / tenant / diagnostic headers applied to every request. */\n defaultHeaders?: Record<string, HeaderValue>;\n /** Per-request hook for last-mile header mutation. */\n onRequest?: ProtocolRequestHook;\n /** Override the default `/threads/:threadId/...` protocol paths. */\n paths?: ProtocolTransportPaths;\n /**\n * Optional `fetch` override, forwarded to the SSE transport. Useful\n * for auth proxies, Next.js route handlers, or tests with injected\n * mocks. Ignored when `webSocketFactory` is also supplied.\n */\n fetch?: typeof fetch;\n /**\n * Retries and concurrency for SSE/command HTTP. When omitted, requests\n * use raw `fetch` with no automatic retries (same as constructing\n * {@link ProtocolSseTransportAdapter} without this option).\n */\n asyncCaller?: AsyncCaller;\n /**\n * Optional WebSocket factory. Supplying it flips the adapter into\n * WebSocket mode — SSE is bypassed entirely.\n */\n webSocketFactory?: (url: string) => WebSocket;\n}\n\nexport class HttpAgentServerAdapter implements AgentServerAdapter {\n threadId: string;\n\n readonly apiUrl: string;\n\n readonly #delegate: TransportAdapter;\n\n /**\n * Thread-state reads are SSE-only. WebSocket delegates omit this so\n * {@link StreamController} falls back to `client.threads.getState()`.\n */\n getState?: AgentServerAdapter[\"getState\"];\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId ?? \"\";\n this.apiUrl = options.apiUrl;\n this.#delegate =\n options.webSocketFactory != null\n ? new ProtocolWebSocketTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n paths: options.paths,\n webSocketFactory: options.webSocketFactory,\n })\n : new ProtocolSseTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n fetch: options.fetch,\n asyncCaller: options.asyncCaller,\n paths: options.paths,\n });\n\n if (options.webSocketFactory == null) {\n const sse = this.#delegate as ProtocolSseTransportAdapter;\n this.getState = sse.getState.bind(sse);\n }\n }\n\n /** {@inheritDoc TransportAdapter.setThreadId} */\n setThreadId(threadId: string): void {\n this.threadId = threadId;\n this.#delegate.setThreadId?.(threadId);\n }\n\n open(): Promise<void> {\n return this.#delegate.open();\n }\n\n send(command: Command): Promise<CommandResponse | ErrorResponse | void> {\n return this.#delegate.send(command);\n }\n\n events(): AsyncIterable<Message> {\n return this.#delegate.events();\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.#delegate.openEventStream == null) {\n throw new Error(\n \"HttpAgentServerAdapter delegate does not support openEventStream (WebSocket path).\"\n );\n }\n return this.#delegate.openEventStream(params);\n }\n\n close(): Promise<void> {\n return this.#delegate.close();\n }\n}\n"],"mappings":";;;AAwEA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA;;;;;CAMA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,SAAS,QAAQ;AACtB,QAAA,WACE,QAAQ,oBAAoB,OACxB,IAAIC,kBAAAA,kCAAkC;GACpC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC3B,CAAC,GACF,IAAIC,aAAAA,4BAA4B;GAC9B,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,OAAO,QAAQ;GAChB,CAAC;AAER,MAAI,QAAQ,oBAAoB,MAAM;GACpC,MAAM,MAAM,MAAA;AACZ,QAAK,WAAW,IAAI,SAAS,KAAK,IAAI;;;;CAK1C,YAAY,UAAwB;AAClC,OAAK,WAAW;AAChB,QAAA,SAAe,cAAc,SAAS;;CAGxC,OAAsB;AACpB,SAAO,MAAA,SAAe,MAAM;;CAG9B,KAAK,SAAmE;AACtE,SAAO,MAAA,SAAe,KAAK,QAAQ;;CAGrC,SAAiC;AAC/B,SAAO,MAAA,SAAe,QAAQ;;CAGhC,gBAAgB,QAA4C;AAC1D,MAAI,MAAA,SAAe,mBAAmB,KACpC,OAAM,IAAI,MACR,qFACD;AAEH,SAAO,MAAA,SAAe,gBAAgB,OAAO;;CAG/C,QAAuB;AACrB,SAAO,MAAA,SAAe,OAAO"}
@@ -6,7 +6,13 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
6
6
  //#region src/client/stream/transport/agent-server.d.ts
7
7
  interface HttpAgentServerAdapterOptions {
8
8
  apiUrl: string;
9
- threadId: string;
9
+ /**
10
+ * Thread this adapter targets. Optional: omit to construct an unbound
11
+ * adapter and let the framework bind it via {@link HttpAgentServerAdapter.setThreadId}
12
+ * (`client.threads.stream` does this) — e.g. lazy thread creation, where
13
+ * the id is only known after the first `submit()`.
14
+ */
15
+ threadId?: string;
10
16
  /** Auth / tenant / diagnostic headers applied to every request. */
11
17
  defaultHeaders?: Record<string, HeaderValue>;
12
18
  /** Per-request hook for last-mile header mutation. */
@@ -33,7 +39,7 @@ interface HttpAgentServerAdapterOptions {
33
39
  }
34
40
  declare class HttpAgentServerAdapter implements AgentServerAdapter {
35
41
  #private;
36
- readonly threadId: string;
42
+ threadId: string;
37
43
  readonly apiUrl: string;
38
44
  /**
39
45
  * Thread-state reads are SSE-only. WebSocket delegates omit this so
@@ -41,6 +47,8 @@ declare class HttpAgentServerAdapter implements AgentServerAdapter {
41
47
  */
42
48
  getState?: AgentServerAdapter["getState"];
43
49
  constructor(options: HttpAgentServerAdapterOptions);
50
+ /** {@inheritDoc TransportAdapter.setThreadId} */
51
+ setThreadId(threadId: string): void;
44
52
  open(): Promise<void>;
45
53
  send(command: Command): Promise<CommandResponse | ErrorResponse | void>;
46
54
  events(): AsyncIterable<Message>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.d.cts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;;UAsCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAIY;EAFZ,cAAA,GAAiB,MAAA,SAAe,WAAA;EAIxB;EAFR,SAAA,GAAY,mBAAA;EAQG;EANf,KAAA,GAAQ,sBAAA;EAYM;;;;;EANd,KAAA,UAAe,KAAA;EAcJ;;;;;EARX,WAAA,GAAc,WAAA;EAsDA;;;;EAjDd,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAAA,SAEA,MAAA;EAHsD;;;;EAW/D,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA6BrB,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAIlD,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAIxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAS1C,KAAA,CAAA,GAAS,OAAA;AAAA"}
1
+ {"version":3,"file":"agent-server.d.cts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;;UAsCiB,6BAAA;EACf,MAAA;EAWA;;;;;;EAJA,QAAA;EAkBc;EAhBd,cAAA,GAAiB,MAAA,SAAe,WAAA;EAqBZ;EAnBpB,SAAA,GAAY,mBAAA;EAmBiC;EAjB7C,KAAA,GAAQ,sBAAA;EAoBG;;;;;EAdX,KAAA,UAAe,KAAA;EAkED;;;;;EA5Dd,WAAA,GAAc,WAAA;EAoEU;;;;EA/DxB,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;EAC7C,QAAA;EAAA,SAES,MAAA;EAQT;;;;EAAA,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA8BT;EAAZ,WAAA,CAAY,QAAA;EAKZ,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAIlD,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAIxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAS1C,KAAA,CAAA,GAAS,OAAA;AAAA"}
@@ -6,7 +6,13 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
6
6
  //#region src/client/stream/transport/agent-server.d.ts
7
7
  interface HttpAgentServerAdapterOptions {
8
8
  apiUrl: string;
9
- threadId: string;
9
+ /**
10
+ * Thread this adapter targets. Optional: omit to construct an unbound
11
+ * adapter and let the framework bind it via {@link HttpAgentServerAdapter.setThreadId}
12
+ * (`client.threads.stream` does this) — e.g. lazy thread creation, where
13
+ * the id is only known after the first `submit()`.
14
+ */
15
+ threadId?: string;
10
16
  /** Auth / tenant / diagnostic headers applied to every request. */
11
17
  defaultHeaders?: Record<string, HeaderValue>;
12
18
  /** Per-request hook for last-mile header mutation. */
@@ -33,7 +39,7 @@ interface HttpAgentServerAdapterOptions {
33
39
  }
34
40
  declare class HttpAgentServerAdapter implements AgentServerAdapter {
35
41
  #private;
36
- readonly threadId: string;
42
+ threadId: string;
37
43
  readonly apiUrl: string;
38
44
  /**
39
45
  * Thread-state reads are SSE-only. WebSocket delegates omit this so
@@ -41,6 +47,8 @@ declare class HttpAgentServerAdapter implements AgentServerAdapter {
41
47
  */
42
48
  getState?: AgentServerAdapter["getState"];
43
49
  constructor(options: HttpAgentServerAdapterOptions);
50
+ /** {@inheritDoc TransportAdapter.setThreadId} */
51
+ setThreadId(threadId: string): void;
44
52
  open(): Promise<void>;
45
53
  send(command: Command): Promise<CommandResponse | ErrorResponse | void>;
46
54
  events(): AsyncIterable<Message>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.d.ts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;;UAsCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAIY;EAFZ,cAAA,GAAiB,MAAA,SAAe,WAAA;EAIxB;EAFR,SAAA,GAAY,mBAAA;EAQG;EANf,KAAA,GAAQ,sBAAA;EAYM;;;;;EANd,KAAA,UAAe,KAAA;EAcJ;;;;;EARX,WAAA,GAAc,WAAA;EAsDA;;;;EAjDd,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAAA,SAEA,MAAA;EAHsD;;;;EAW/D,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA6BrB,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAIlD,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAIxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAS1C,KAAA,CAAA,GAAS,OAAA;AAAA"}
1
+ {"version":3,"file":"agent-server.d.ts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;;UAsCiB,6BAAA;EACf,MAAA;EAWA;;;;;;EAJA,QAAA;EAkBc;EAhBd,cAAA,GAAiB,MAAA,SAAe,WAAA;EAqBZ;EAnBpB,SAAA,GAAY,mBAAA;EAmBiC;EAjB7C,KAAA,GAAQ,sBAAA;EAoBG;;;;;EAdX,KAAA,UAAe,KAAA;EAkED;;;;;EA5Dd,WAAA,GAAc,WAAA;EAoEU;;;;EA/DxB,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;EAC7C,QAAA;EAAA,SAES,MAAA;EAQT;;;;EAAA,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA8BT;EAAZ,WAAA,CAAY,QAAA;EAKZ,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAIlD,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAIxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAS1C,KAAA,CAAA,GAAS,OAAA;AAAA"}
@@ -11,7 +11,7 @@ var HttpAgentServerAdapter = class {
11
11
  */
12
12
  getState;
13
13
  constructor(options) {
14
- this.threadId = options.threadId;
14
+ this.threadId = options.threadId ?? "";
15
15
  this.apiUrl = options.apiUrl;
16
16
  this.#delegate = options.webSocketFactory != null ? new ProtocolWebSocketTransportAdapter({
17
17
  apiUrl: options.apiUrl,
@@ -34,6 +34,11 @@ var HttpAgentServerAdapter = class {
34
34
  this.getState = sse.getState.bind(sse);
35
35
  }
36
36
  }
37
+ /** {@inheritDoc TransportAdapter.setThreadId} */
38
+ setThreadId(threadId) {
39
+ this.threadId = threadId;
40
+ this.#delegate.setThreadId?.(threadId);
41
+ }
37
42
  open() {
38
43
  return this.#delegate.open();
39
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.js","names":["#delegate"],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"sourcesContent":["/**\n * Stock `AgentServerAdapter` implementation for \"point `useStream` at a\n * single HTTP endpoint that speaks the v2 protocol\" deployments.\n *\n * Internally delegates to the appropriate built-in transport:\n * - `new HttpAgentServerAdapter({ apiUrl, threadId })` → SSE\n * - `new HttpAgentServerAdapter({ apiUrl, threadId, webSocketFactory })`\n * → WebSocket\n *\n * Keeps the user-facing import surface small: callers only ever import\n * `HttpAgentServerAdapter` from `@langchain/langgraph-sdk` instead of\n * knowing the two wire-specific class names. The class is deliberately\n * thin — it forwards every method on {@link AgentServerAdapter} to the\n * delegate it picked at construction time.\n *\n * See `plan-custom-transport.md` §4.3 for motivation.\n */\nimport type {\n AgentServerAdapter,\n EventStreamHandle,\n TransportAdapter,\n} from \"../transport.js\";\nimport type {\n Command,\n CommandResponse,\n ErrorResponse,\n Message,\n SubscribeParams,\n} from \"@langchain/protocol\";\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport { ProtocolSseTransportAdapter } from \"./http.js\";\nimport { ProtocolWebSocketTransportAdapter } from \"./websocket.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolTransportPaths,\n} from \"./types.js\";\n\nexport interface HttpAgentServerAdapterOptions {\n apiUrl: string;\n threadId: string;\n /** Auth / tenant / diagnostic headers applied to every request. */\n defaultHeaders?: Record<string, HeaderValue>;\n /** Per-request hook for last-mile header mutation. */\n onRequest?: ProtocolRequestHook;\n /** Override the default `/threads/:threadId/...` protocol paths. */\n paths?: ProtocolTransportPaths;\n /**\n * Optional `fetch` override, forwarded to the SSE transport. Useful\n * for auth proxies, Next.js route handlers, or tests with injected\n * mocks. Ignored when `webSocketFactory` is also supplied.\n */\n fetch?: typeof fetch;\n /**\n * Retries and concurrency for SSE/command HTTP. When omitted, requests\n * use raw `fetch` with no automatic retries (same as constructing\n * {@link ProtocolSseTransportAdapter} without this option).\n */\n asyncCaller?: AsyncCaller;\n /**\n * Optional WebSocket factory. Supplying it flips the adapter into\n * WebSocket mode — SSE is bypassed entirely.\n */\n webSocketFactory?: (url: string) => WebSocket;\n}\n\nexport class HttpAgentServerAdapter implements AgentServerAdapter {\n readonly threadId: string;\n\n readonly apiUrl: string;\n\n readonly #delegate: TransportAdapter;\n\n /**\n * Thread-state reads are SSE-only. WebSocket delegates omit this so\n * {@link StreamController} falls back to `client.threads.getState()`.\n */\n getState?: AgentServerAdapter[\"getState\"];\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId;\n this.apiUrl = options.apiUrl;\n this.#delegate =\n options.webSocketFactory != null\n ? new ProtocolWebSocketTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n paths: options.paths,\n webSocketFactory: options.webSocketFactory,\n })\n : new ProtocolSseTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n fetch: options.fetch,\n asyncCaller: options.asyncCaller,\n paths: options.paths,\n });\n\n if (options.webSocketFactory == null) {\n const sse = this.#delegate as ProtocolSseTransportAdapter;\n this.getState = sse.getState.bind(sse);\n }\n }\n\n open(): Promise<void> {\n return this.#delegate.open();\n }\n\n send(command: Command): Promise<CommandResponse | ErrorResponse | void> {\n return this.#delegate.send(command);\n }\n\n events(): AsyncIterable<Message> {\n return this.#delegate.events();\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.#delegate.openEventStream == null) {\n throw new Error(\n \"HttpAgentServerAdapter delegate does not support openEventStream (WebSocket path).\"\n );\n }\n return this.#delegate.openEventStream(params);\n }\n\n close(): Promise<void> {\n return this.#delegate.close();\n }\n}\n"],"mappings":";;;AAkEA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA;;;;;CAMA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ;AACxB,OAAK,SAAS,QAAQ;AACtB,QAAA,WACE,QAAQ,oBAAoB,OACxB,IAAI,kCAAkC;GACpC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC3B,CAAC,GACF,IAAI,4BAA4B;GAC9B,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,OAAO,QAAQ;GAChB,CAAC;AAER,MAAI,QAAQ,oBAAoB,MAAM;GACpC,MAAM,MAAM,MAAA;AACZ,QAAK,WAAW,IAAI,SAAS,KAAK,IAAI;;;CAI1C,OAAsB;AACpB,SAAO,MAAA,SAAe,MAAM;;CAG9B,KAAK,SAAmE;AACtE,SAAO,MAAA,SAAe,KAAK,QAAQ;;CAGrC,SAAiC;AAC/B,SAAO,MAAA,SAAe,QAAQ;;CAGhC,gBAAgB,QAA4C;AAC1D,MAAI,MAAA,SAAe,mBAAmB,KACpC,OAAM,IAAI,MACR,qFACD;AAEH,SAAO,MAAA,SAAe,gBAAgB,OAAO;;CAG/C,QAAuB;AACrB,SAAO,MAAA,SAAe,OAAO"}
1
+ {"version":3,"file":"agent-server.js","names":["#delegate"],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"sourcesContent":["/**\n * Stock `AgentServerAdapter` implementation for \"point `useStream` at a\n * single HTTP endpoint that speaks the v2 protocol\" deployments.\n *\n * Internally delegates to the appropriate built-in transport:\n * - `new HttpAgentServerAdapter({ apiUrl, threadId })` → SSE\n * - `new HttpAgentServerAdapter({ apiUrl, threadId, webSocketFactory })`\n * → WebSocket\n *\n * Keeps the user-facing import surface small: callers only ever import\n * `HttpAgentServerAdapter` from `@langchain/langgraph-sdk` instead of\n * knowing the two wire-specific class names. The class is deliberately\n * thin — it forwards every method on {@link AgentServerAdapter} to the\n * delegate it picked at construction time.\n *\n * See `plan-custom-transport.md` §4.3 for motivation.\n */\nimport type {\n AgentServerAdapter,\n EventStreamHandle,\n TransportAdapter,\n} from \"../transport.js\";\nimport type {\n Command,\n CommandResponse,\n ErrorResponse,\n Message,\n SubscribeParams,\n} from \"@langchain/protocol\";\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport { ProtocolSseTransportAdapter } from \"./http.js\";\nimport { ProtocolWebSocketTransportAdapter } from \"./websocket.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolTransportPaths,\n} from \"./types.js\";\n\nexport interface HttpAgentServerAdapterOptions {\n apiUrl: string;\n /**\n * Thread this adapter targets. Optional: omit to construct an unbound\n * adapter and let the framework bind it via {@link HttpAgentServerAdapter.setThreadId}\n * (`client.threads.stream` does this) — e.g. lazy thread creation, where\n * the id is only known after the first `submit()`.\n */\n threadId?: string;\n /** Auth / tenant / diagnostic headers applied to every request. */\n defaultHeaders?: Record<string, HeaderValue>;\n /** Per-request hook for last-mile header mutation. */\n onRequest?: ProtocolRequestHook;\n /** Override the default `/threads/:threadId/...` protocol paths. */\n paths?: ProtocolTransportPaths;\n /**\n * Optional `fetch` override, forwarded to the SSE transport. Useful\n * for auth proxies, Next.js route handlers, or tests with injected\n * mocks. Ignored when `webSocketFactory` is also supplied.\n */\n fetch?: typeof fetch;\n /**\n * Retries and concurrency for SSE/command HTTP. When omitted, requests\n * use raw `fetch` with no automatic retries (same as constructing\n * {@link ProtocolSseTransportAdapter} without this option).\n */\n asyncCaller?: AsyncCaller;\n /**\n * Optional WebSocket factory. Supplying it flips the adapter into\n * WebSocket mode — SSE is bypassed entirely.\n */\n webSocketFactory?: (url: string) => WebSocket;\n}\n\nexport class HttpAgentServerAdapter implements AgentServerAdapter {\n threadId: string;\n\n readonly apiUrl: string;\n\n readonly #delegate: TransportAdapter;\n\n /**\n * Thread-state reads are SSE-only. WebSocket delegates omit this so\n * {@link StreamController} falls back to `client.threads.getState()`.\n */\n getState?: AgentServerAdapter[\"getState\"];\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId ?? \"\";\n this.apiUrl = options.apiUrl;\n this.#delegate =\n options.webSocketFactory != null\n ? new ProtocolWebSocketTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n paths: options.paths,\n webSocketFactory: options.webSocketFactory,\n })\n : new ProtocolSseTransportAdapter({\n apiUrl: options.apiUrl,\n threadId: options.threadId,\n defaultHeaders: options.defaultHeaders,\n onRequest: options.onRequest,\n fetch: options.fetch,\n asyncCaller: options.asyncCaller,\n paths: options.paths,\n });\n\n if (options.webSocketFactory == null) {\n const sse = this.#delegate as ProtocolSseTransportAdapter;\n this.getState = sse.getState.bind(sse);\n }\n }\n\n /** {@inheritDoc TransportAdapter.setThreadId} */\n setThreadId(threadId: string): void {\n this.threadId = threadId;\n this.#delegate.setThreadId?.(threadId);\n }\n\n open(): Promise<void> {\n return this.#delegate.open();\n }\n\n send(command: Command): Promise<CommandResponse | ErrorResponse | void> {\n return this.#delegate.send(command);\n }\n\n events(): AsyncIterable<Message> {\n return this.#delegate.events();\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.#delegate.openEventStream == null) {\n throw new Error(\n \"HttpAgentServerAdapter delegate does not support openEventStream (WebSocket path).\"\n );\n }\n return this.#delegate.openEventStream(params);\n }\n\n close(): Promise<void> {\n return this.#delegate.close();\n }\n}\n"],"mappings":";;;AAwEA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA;;;;;CAMA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,SAAS,QAAQ;AACtB,QAAA,WACE,QAAQ,oBAAoB,OACxB,IAAI,kCAAkC;GACpC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC3B,CAAC,GACF,IAAI,4BAA4B;GAC9B,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,OAAO,QAAQ;GAChB,CAAC;AAER,MAAI,QAAQ,oBAAoB,MAAM;GACpC,MAAM,MAAM,MAAA;AACZ,QAAK,WAAW,IAAI,SAAS,KAAK,IAAI;;;;CAK1C,YAAY,UAAwB;AAClC,OAAK,WAAW;AAChB,QAAA,SAAe,cAAc,SAAS;;CAGxC,OAAsB;AACpB,SAAO,MAAA,SAAe,MAAM;;CAG9B,KAAK,SAAmE;AACtE,SAAO,MAAA,SAAe,KAAK,QAAQ;;CAGrC,SAAiC;AAC/B,SAAO,MAAA,SAAe,QAAQ;;CAGhC,gBAAgB,QAA4C;AAC1D,MAAI,MAAA,SAAe,mBAAmB,KACpC,OAAM,IAAI,MACR,qFACD;AAEH,SAAO,MAAA,SAAe,gBAAgB,OAAO;;CAG/C,QAAuB;AACrB,SAAO,MAAA,SAAe,OAAO"}
@@ -6,9 +6,11 @@ const require_websocket = require("./websocket.cjs");
6
6
  //#region src/client/stream/transport/http.ts
7
7
  /**
8
8
  * Transport adapter that speaks the thread-centric protocol over HTTP
9
- * commands plus SSE event streams. Bound to a specific `threadId`
10
- * at construction. Each {@link openEventStream} call opens an independent
11
- * filtered SSE connection via `POST /threads/:thread_id/stream/events`.
9
+ * commands plus SSE event streams. Bound to a `threadId` at construction
10
+ * or later via {@link setThreadId}; request URLs derive from the
11
+ * currently-bound thread. Each {@link openEventStream} call opens an
12
+ * independent filtered SSE connection via
13
+ * `POST /threads/:thread_id/stream/events`.
12
14
  */
13
15
  var ProtocolSseTransportAdapter = class {
14
16
  threadId;
@@ -20,11 +22,10 @@ var ProtocolSseTransportAdapter = class {
20
22
  fetchFactory;
21
23
  asyncCaller;
22
24
  maxReconnectAttempts;
25
+ idleReconnect;
23
26
  onReconnect;
24
27
  reconnectDelayMs;
25
- commandsUrl;
26
- streamUrl;
27
- stateUrl;
28
+ paths;
28
29
  sessionAbortController = new AbortController();
29
30
  eventStreams = /* @__PURE__ */ new Set();
30
31
  closed = false;
@@ -36,12 +37,29 @@ var ProtocolSseTransportAdapter = class {
36
37
  this.fetchFactory = options.fetchFactory;
37
38
  this.asyncCaller = options.asyncCaller;
38
39
  this.maxReconnectAttempts = options.fetch != null ? 0 : options.maxReconnectAttempts ?? 5;
40
+ this.idleReconnect = options.fetch != null ? null : options.idleReconnect ?? "auto";
39
41
  this.onReconnect = options.onReconnect;
40
42
  this.reconnectDelayMs = options.reconnectDelayMs ?? require_websocket.webSocketReconnectDelayMs;
41
- this.threadId = options.threadId;
42
- this.commandsUrl = options.paths?.commands ?? `/threads/${this.threadId}/commands`;
43
- this.streamUrl = options.paths?.stream ?? `/threads/${this.threadId}/stream/events`;
44
- this.stateUrl = options.paths?.state ?? `/threads/${this.threadId}/state`;
43
+ this.threadId = options.threadId ?? "";
44
+ this.paths = options.paths;
45
+ }
46
+ /** {@inheritDoc TransportAdapter.setThreadId} */
47
+ setThreadId(threadId) {
48
+ this.threadId = threadId;
49
+ }
50
+ /**
51
+ * Command/stream/state URLs derive from the currently-bound thread so a
52
+ * single adapter can follow {@link setThreadId} re-binds. A fixed
53
+ * `paths.*` string overrides the default and is used as-is.
54
+ */
55
+ get commandsUrl() {
56
+ return require_utils.resolveProtocolPath(this.paths?.commands, this.threadId, (id) => `/threads/${id}/commands`);
57
+ }
58
+ get streamUrl() {
59
+ return require_utils.resolveProtocolPath(this.paths?.stream, this.threadId, (id) => `/threads/${id}/stream/events`);
60
+ }
61
+ get stateUrl() {
62
+ return require_utils.resolveProtocolPath(this.paths?.state, this.threadId, (id) => `/threads/${id}/state`);
45
63
  }
46
64
  /**
47
65
  * Fetch checkpointed thread state for hydration.
@@ -140,9 +158,12 @@ var ProtocolSseTransportAdapter = class {
140
158
  readySettled = true;
141
159
  resolveReady();
142
160
  }
143
- const stream = (response.body ?? new ReadableStream({ start(controller) {
161
+ const readable = response.body ?? new ReadableStream({ start(controller) {
144
162
  controller.close();
145
- } })).pipeThrough(require_sse.BytesLineDecoder()).pipeThrough(require_sse.SSEDecoder());
163
+ } });
164
+ const enableIdle = this.idleReconnect === "auto" || typeof this.idleReconnect === "number" && this.idleReconnect > 0;
165
+ const lines = readable.pipeThrough(require_sse.BytesLineDecoder());
166
+ const stream = (enableIdle ? lines.pipeThrough(require_stream.idleReconnectStream({ mode: this.idleReconnect })) : lines).pipeThrough(require_sse.SSEDecoder());
146
167
  const iterable = require_stream.IterableReadableStream.fromReadableStream(stream);
147
168
  for await (const event of iterable) {
148
169
  if (ac.signal.aborted || this.closed) break;
@@ -1 +1 @@
1
- {"version":3,"file":"http.cjs","names":["AsyncQueue","webSocketReconnectDelayMs","toAbsoluteUrl","mergeHeaders","toError","isProtocolResponse","BytesLineDecoder","SSEDecoder","IterableReadableStream","isRecord"],"sources":["../../../../src/client/stream/transport/http.ts"],"sourcesContent":["import { AsyncQueue } from \"./queue.js\";\nimport type {\n Message,\n SubscribeParams,\n Command,\n CommandResponse,\n ErrorResponse,\n} from \"@langchain/protocol\";\n\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n} from \"./types.js\";\nimport type { TransportAdapter, EventStreamHandle } from \"../transport.js\";\nimport {\n toAbsoluteUrl,\n isRecord,\n mergeHeaders,\n toError,\n isProtocolResponse,\n} from \"./utils.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../../../utils/sse.js\";\nimport { IterableReadableStream } from \"../../../utils/stream.js\";\nimport { webSocketReconnectDelayMs } from \"./websocket.js\";\n\n/**\n * Transport adapter that speaks the thread-centric protocol over HTTP\n * commands plus SSE event streams. Bound to a specific `threadId`\n * at construction. Each {@link openEventStream} call opens an independent\n * filtered SSE connection via `POST /threads/:thread_id/stream/events`.\n */\nexport class ProtocolSseTransportAdapter implements TransportAdapter {\n readonly threadId: string;\n\n readonly apiUrl: string;\n\n private readonly queue = new AsyncQueue<Message>();\n\n private readonly fetchImpl: typeof fetch;\n\n private readonly defaultHeaders: Record<string, HeaderValue>;\n\n private readonly onRequest?: ProtocolRequestHook;\n\n private readonly fetchFactory?: () => typeof fetch | Promise<typeof fetch>;\n\n private readonly asyncCaller?: AsyncCaller;\n\n private readonly maxReconnectAttempts: number;\n\n private readonly onReconnect?: ProtocolSseTransportOptions[\"onReconnect\"];\n\n private readonly reconnectDelayMs: (attempt: number) => number;\n\n private readonly commandsUrl: string;\n\n private readonly streamUrl: string;\n\n private readonly stateUrl: string;\n\n private readonly sessionAbortController = new AbortController();\n\n private readonly eventStreams = new Set<AbortController>();\n\n private closed = false;\n\n constructor(options: ProtocolSseTransportOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n this.apiUrl = options.apiUrl;\n this.defaultHeaders = options.defaultHeaders ?? {};\n this.onRequest = options.onRequest;\n this.fetchFactory = options.fetchFactory;\n this.asyncCaller = options.asyncCaller;\n // Custom fetch (tests/mocks) must not auto-reconnect — same policy as skipping AsyncCaller.\n this.maxReconnectAttempts =\n options.fetch != null ? 0 : (options.maxReconnectAttempts ?? 5);\n this.onReconnect = options.onReconnect;\n this.reconnectDelayMs =\n options.reconnectDelayMs ?? webSocketReconnectDelayMs;\n this.threadId = options.threadId;\n this.commandsUrl =\n options.paths?.commands ?? `/threads/${this.threadId}/commands`;\n this.streamUrl =\n options.paths?.stream ?? `/threads/${this.threadId}/stream/events`;\n this.stateUrl = options.paths?.state ?? `/threads/${this.threadId}/state`;\n }\n\n /**\n * Fetch checkpointed thread state for hydration.\n *\n * Uses `GET`, matching `client.threads.getState()` and both LangGraph\n * Platform and Agent Protocol custom backends (`POST` is reserved for\n * `updateState`).\n */\n async getState<StateType = unknown>(): Promise<{\n values: StateType;\n next?: unknown;\n tasks?: unknown;\n metadata?: unknown;\n checkpoint?: { checkpoint_id?: string } | null;\n parent_checkpoint?: { checkpoint_id?: string } | null;\n } | null> {\n const url = toAbsoluteUrl(this.apiUrl, this.stateUrl);\n let requestInit: RequestInit = {\n method: \"GET\",\n headers: mergeHeaders(this.defaultHeaders, {}),\n };\n\n if (this.onRequest) {\n requestInit = await this.onRequest(url, requestInit);\n }\n\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (response.status === 404) return null;\n if (!response.ok) {\n const error = toError(\n new Error(\n `Thread state request failed: ${response.status} ${response.statusText}`\n )\n ) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n return (await response.json()) as {\n values: StateType;\n next?: unknown;\n tasks?: unknown;\n metadata?: unknown;\n checkpoint?: { checkpoint_id?: string } | null;\n parent_checkpoint?: { checkpoint_id?: string } | null;\n };\n }\n\n private async resolveFetch(): Promise<typeof fetch> {\n if (this.fetchFactory) {\n return await this.fetchFactory();\n }\n return this.fetchImpl;\n }\n\n /**\n * HTTP/SSE transports have no handshake — connections are made\n * per-command and per-subscription.\n */\n async open(): Promise<void> {\n // no-op\n }\n\n async send(\n command: Command\n ): Promise<CommandResponse | ErrorResponse | void> {\n const response = await this.request(this.commandsUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(command),\n signal: this.sessionAbortController.signal,\n });\n\n if (response.status === 202 || response.status === 204) {\n return undefined;\n }\n\n const payload = (await response.json()) as unknown;\n if (!isProtocolResponse(payload)) {\n throw new Error(\"Protocol command did not return a valid response.\");\n }\n return payload;\n }\n\n /**\n * WebSocket-style single event stream.\n * For the SSE transport this returns a dummy iterable; real event\n * delivery happens via {@link openEventStream}.\n */\n events(): AsyncIterable<Message> {\n const queue = this.queue;\n return {\n [Symbol.asyncIterator]: () => ({\n next: async () => await queue.shift(),\n return: async () => {\n queue.close();\n return { done: true, value: undefined };\n },\n }),\n };\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.closed) {\n throw new Error(\"Protocol transport is closed.\");\n }\n\n const ac = new AbortController();\n this.eventStreams.add(ac);\n const streamQueue = new AsyncQueue<Message>();\n const streamUrl = this.streamUrl;\n\n let resolveReady!: () => void;\n let rejectReady!: (err: unknown) => void;\n const ready = new Promise<void>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n\n let resumeAfterSeq =\n typeof (params as SubscribeParams & { since?: unknown }).since ===\n \"number\"\n ? (params as SubscribeParams & { since: number }).since\n : undefined;\n\n let readySettled = false;\n\n const startStream = async () => {\n let attempt = 0;\n\n while (!ac.signal.aborted && !this.closed) {\n try {\n const response = await this.request(\n streamUrl,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n },\n body: JSON.stringify({\n channels: params.channels,\n ...(params.namespaces ? { namespaces: params.namespaces } : {}),\n ...(params.depth != null ? { depth: params.depth } : {}),\n ...(resumeAfterSeq != null ? { since: resumeAfterSeq } : {}),\n }),\n signal: ac.signal,\n },\n { stream: true }\n );\n\n if (!readySettled) {\n readySettled = true;\n resolveReady();\n }\n\n const readable =\n response.body ??\n new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n\n const stream = readable\n .pipeThrough(BytesLineDecoder())\n .pipeThrough(SSEDecoder());\n const iterable = IterableReadableStream.fromReadableStream(stream);\n\n for await (const event of iterable) {\n if (ac.signal.aborted || this.closed) {\n break;\n }\n if (isRecord(event.data)) {\n const msg = event.data as Message & {\n seq?: number;\n method?: string;\n };\n if (typeof msg.seq === \"number\") {\n resumeAfterSeq = msg.seq;\n }\n streamQueue.push(msg);\n }\n }\n streamQueue.close();\n return;\n } catch (error) {\n if (ac.signal.aborted || this.closed) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close();\n return;\n }\n if (this.maxReconnectAttempts <= 0) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close(toError(error));\n return;\n }\n attempt += 1;\n if (attempt > this.maxReconnectAttempts) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close(toError(error));\n return;\n }\n this.onReconnect?.({ attempt, cause: error });\n const delay = this.reconnectDelayMs(attempt);\n if (delay > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delay);\n });\n }\n }\n }\n };\n\n void startStream();\n\n const cleanup = () => {\n this.eventStreams.delete(ac);\n ac.abort();\n streamQueue.close();\n };\n\n return {\n events: {\n [Symbol.asyncIterator]: () => ({\n next: async () => await streamQueue.shift(),\n return: async () => {\n cleanup();\n return { done: true, value: undefined };\n },\n }),\n },\n ready,\n close: cleanup,\n };\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.sessionAbortController.abort();\n for (const ac of this.eventStreams) ac.abort();\n this.eventStreams.clear();\n this.queue.close();\n }\n\n private async request(\n path: string,\n init: RequestInit,\n options?: { stream?: boolean }\n ): Promise<Response> {\n const url = toAbsoluteUrl(this.apiUrl, path);\n let requestInit: RequestInit = {\n ...init,\n headers: mergeHeaders(this.defaultHeaders, init.headers),\n };\n\n if (this.onRequest) {\n requestInit = await this.onRequest(url, requestInit);\n }\n\n // Long-lived SSE event streams must not run through AsyncCaller: its\n // p-queue/p-retry semantics are designed for discrete request/response\n // calls, and wrapping a streaming response stalls the call (and can\n // leak retries). Stream resilience is handled separately by the\n // reconnect loop in `openEventStream`.\n const useAsyncCaller = this.asyncCaller != null && !options?.stream;\n\n const execute = async (): Promise<Response> => {\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (!response.ok) {\n // Reject with the Response so AsyncCaller maps it to HTTPError and\n // applies STATUS_NO_RETRY / retry policy consistently with REST.\n if (useAsyncCaller) {\n throw response;\n }\n let detail = \"\";\n try {\n const body = await response.text();\n const parsed = JSON.parse(body);\n if (typeof parsed === \"object\" && parsed != null) {\n detail =\n ((parsed as Record<string, unknown>).message as string) ??\n ((parsed as Record<string, unknown>).error as string) ??\n \"\";\n }\n if (!detail) detail = body;\n } catch {\n // body unreadable or not JSON — fall through\n }\n const message = detail\n ? `Protocol request failed: ${response.status} ${response.statusText} — ${detail}`\n : `Protocol request failed: ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n return response;\n };\n\n try {\n return useAsyncCaller\n ? await this.asyncCaller!.call(execute)\n : await execute();\n } catch (error) {\n throw toError(error);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.cjs","names":["AsyncQueue","webSocketReconnectDelayMs","resolveProtocolPath","toAbsoluteUrl","mergeHeaders","toError","isProtocolResponse","BytesLineDecoder","idleReconnectStream","SSEDecoder","IterableReadableStream","isRecord"],"sources":["../../../../src/client/stream/transport/http.ts"],"sourcesContent":["import { AsyncQueue } from \"./queue.js\";\nimport type {\n Message,\n SubscribeParams,\n Command,\n CommandResponse,\n ErrorResponse,\n} from \"@langchain/protocol\";\n\nimport type { AsyncCaller } from \"../../../utils/async_caller.js\";\nimport type {\n HeaderValue,\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n ProtocolTransportPaths,\n} from \"./types.js\";\nimport type { TransportAdapter, EventStreamHandle } from \"../transport.js\";\nimport {\n toAbsoluteUrl,\n isRecord,\n mergeHeaders,\n toError,\n isProtocolResponse,\n resolveProtocolPath,\n} from \"./utils.js\";\nimport { BytesLineDecoder, SSEDecoder } from \"../../../utils/sse.js\";\nimport {\n IterableReadableStream,\n idleReconnectStream,\n type IdleReconnectMode,\n} from \"../../../utils/stream.js\";\nimport { webSocketReconnectDelayMs } from \"./websocket.js\";\n\n/**\n * Transport adapter that speaks the thread-centric protocol over HTTP\n * commands plus SSE event streams. Bound to a `threadId` at construction\n * or later via {@link setThreadId}; request URLs derive from the\n * currently-bound thread. Each {@link openEventStream} call opens an\n * independent filtered SSE connection via\n * `POST /threads/:thread_id/stream/events`.\n */\nexport class ProtocolSseTransportAdapter implements TransportAdapter {\n threadId: string;\n\n readonly apiUrl: string;\n\n private readonly queue = new AsyncQueue<Message>();\n\n private readonly fetchImpl: typeof fetch;\n\n private readonly defaultHeaders: Record<string, HeaderValue>;\n\n private readonly onRequest?: ProtocolRequestHook;\n\n private readonly fetchFactory?: () => typeof fetch | Promise<typeof fetch>;\n\n private readonly asyncCaller?: AsyncCaller;\n\n private readonly maxReconnectAttempts: number;\n\n private readonly idleReconnect: IdleReconnectMode | null;\n\n private readonly onReconnect?: ProtocolSseTransportOptions[\"onReconnect\"];\n\n private readonly reconnectDelayMs: (attempt: number) => number;\n\n private readonly paths?: ProtocolTransportPaths;\n\n private readonly sessionAbortController = new AbortController();\n\n private readonly eventStreams = new Set<AbortController>();\n\n private closed = false;\n\n constructor(options: ProtocolSseTransportOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n this.apiUrl = options.apiUrl;\n this.defaultHeaders = options.defaultHeaders ?? {};\n this.onRequest = options.onRequest;\n this.fetchFactory = options.fetchFactory;\n this.asyncCaller = options.asyncCaller;\n // Custom fetch (tests/mocks) must not auto-reconnect — same policy as skipping AsyncCaller.\n this.maxReconnectAttempts =\n options.fetch != null ? 0 : (options.maxReconnectAttempts ?? 5);\n // Custom fetch (tests/mocks) also disables the idle watchdog, matching the\n // no-auto-reconnect policy above — a tripped watchdog would have nothing to\n // reconnect to and would surface spurious errors in those harnesses.\n // Otherwise default to heartbeat-adaptive `\"auto\"`, which stays dormant\n // unless the server actually emits keep-alive heartbeats.\n this.idleReconnect =\n options.fetch != null ? null : (options.idleReconnect ?? \"auto\");\n this.onReconnect = options.onReconnect;\n this.reconnectDelayMs =\n options.reconnectDelayMs ?? webSocketReconnectDelayMs;\n this.threadId = options.threadId ?? \"\";\n this.paths = options.paths;\n }\n\n /** {@inheritDoc TransportAdapter.setThreadId} */\n setThreadId(threadId: string): void {\n this.threadId = threadId;\n }\n\n /**\n * Command/stream/state URLs derive from the currently-bound thread so a\n * single adapter can follow {@link setThreadId} re-binds. A fixed\n * `paths.*` string overrides the default and is used as-is.\n */\n private get commandsUrl(): string {\n return resolveProtocolPath(\n this.paths?.commands,\n this.threadId,\n (id) => `/threads/${id}/commands`\n );\n }\n\n private get streamUrl(): string {\n return resolveProtocolPath(\n this.paths?.stream,\n this.threadId,\n (id) => `/threads/${id}/stream/events`\n );\n }\n\n private get stateUrl(): string {\n return resolveProtocolPath(\n this.paths?.state,\n this.threadId,\n (id) => `/threads/${id}/state`\n );\n }\n\n /**\n * Fetch checkpointed thread state for hydration.\n *\n * Uses `GET`, matching `client.threads.getState()` and both LangGraph\n * Platform and Agent Protocol custom backends (`POST` is reserved for\n * `updateState`).\n */\n async getState<StateType = unknown>(): Promise<{\n values: StateType;\n next?: unknown;\n tasks?: unknown;\n metadata?: unknown;\n checkpoint?: { checkpoint_id?: string } | null;\n parent_checkpoint?: { checkpoint_id?: string } | null;\n } | null> {\n const url = toAbsoluteUrl(this.apiUrl, this.stateUrl);\n let requestInit: RequestInit = {\n method: \"GET\",\n headers: mergeHeaders(this.defaultHeaders, {}),\n };\n\n if (this.onRequest) {\n requestInit = await this.onRequest(url, requestInit);\n }\n\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (response.status === 404) return null;\n if (!response.ok) {\n const error = toError(\n new Error(\n `Thread state request failed: ${response.status} ${response.statusText}`\n )\n ) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n return (await response.json()) as {\n values: StateType;\n next?: unknown;\n tasks?: unknown;\n metadata?: unknown;\n checkpoint?: { checkpoint_id?: string } | null;\n parent_checkpoint?: { checkpoint_id?: string } | null;\n };\n }\n\n private async resolveFetch(): Promise<typeof fetch> {\n if (this.fetchFactory) {\n return await this.fetchFactory();\n }\n return this.fetchImpl;\n }\n\n /**\n * HTTP/SSE transports have no handshake — connections are made\n * per-command and per-subscription.\n */\n async open(): Promise<void> {\n // no-op\n }\n\n async send(\n command: Command\n ): Promise<CommandResponse | ErrorResponse | void> {\n const response = await this.request(this.commandsUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(command),\n signal: this.sessionAbortController.signal,\n });\n\n if (response.status === 202 || response.status === 204) {\n return undefined;\n }\n\n const payload = (await response.json()) as unknown;\n if (!isProtocolResponse(payload)) {\n throw new Error(\"Protocol command did not return a valid response.\");\n }\n return payload;\n }\n\n /**\n * WebSocket-style single event stream.\n * For the SSE transport this returns a dummy iterable; real event\n * delivery happens via {@link openEventStream}.\n */\n events(): AsyncIterable<Message> {\n const queue = this.queue;\n return {\n [Symbol.asyncIterator]: () => ({\n next: async () => await queue.shift(),\n return: async () => {\n queue.close();\n return { done: true, value: undefined };\n },\n }),\n };\n }\n\n openEventStream(params: SubscribeParams): EventStreamHandle {\n if (this.closed) {\n throw new Error(\"Protocol transport is closed.\");\n }\n\n const ac = new AbortController();\n this.eventStreams.add(ac);\n const streamQueue = new AsyncQueue<Message>();\n const streamUrl = this.streamUrl;\n\n let resolveReady!: () => void;\n let rejectReady!: (err: unknown) => void;\n const ready = new Promise<void>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n\n let resumeAfterSeq =\n typeof (params as SubscribeParams & { since?: unknown }).since ===\n \"number\"\n ? (params as SubscribeParams & { since: number }).since\n : undefined;\n\n let readySettled = false;\n\n const startStream = async () => {\n let attempt = 0;\n\n while (!ac.signal.aborted && !this.closed) {\n try {\n const response = await this.request(\n streamUrl,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n },\n body: JSON.stringify({\n channels: params.channels,\n ...(params.namespaces ? { namespaces: params.namespaces } : {}),\n ...(params.depth != null ? { depth: params.depth } : {}),\n ...(resumeAfterSeq != null ? { since: resumeAfterSeq } : {}),\n }),\n signal: ac.signal,\n },\n { stream: true }\n );\n\n if (!readySettled) {\n readySettled = true;\n resolveReady();\n }\n\n const readable =\n response.body ??\n new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n\n // Idle watchdog on the line stream (between byte-line and SSE\n // decoding) so it can reset on any line and recognise `:` keep-alive\n // heartbeats to drive `\"auto\"` mode. On idle it errors the stream,\n // which the catch below treats like any other disconnect and\n // reconnects with `since` from the last seen sequence.\n const enableIdle =\n this.idleReconnect === \"auto\" ||\n (typeof this.idleReconnect === \"number\" && this.idleReconnect > 0);\n const lines = readable.pipeThrough(BytesLineDecoder());\n const watched = enableIdle\n ? lines.pipeThrough(\n idleReconnectStream({ mode: this.idleReconnect! })\n )\n : lines;\n const stream = watched.pipeThrough(SSEDecoder());\n const iterable = IterableReadableStream.fromReadableStream(stream);\n\n for await (const event of iterable) {\n if (ac.signal.aborted || this.closed) {\n break;\n }\n if (isRecord(event.data)) {\n const msg = event.data as Message & {\n seq?: number;\n method?: string;\n };\n if (typeof msg.seq === \"number\") {\n resumeAfterSeq = msg.seq;\n }\n streamQueue.push(msg);\n }\n }\n streamQueue.close();\n return;\n } catch (error) {\n if (ac.signal.aborted || this.closed) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close();\n return;\n }\n if (this.maxReconnectAttempts <= 0) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close(toError(error));\n return;\n }\n attempt += 1;\n if (attempt > this.maxReconnectAttempts) {\n if (!readySettled) {\n rejectReady(error);\n }\n streamQueue.close(toError(error));\n return;\n }\n this.onReconnect?.({ attempt, cause: error });\n const delay = this.reconnectDelayMs(attempt);\n if (delay > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delay);\n });\n }\n }\n }\n };\n\n void startStream();\n\n const cleanup = () => {\n this.eventStreams.delete(ac);\n ac.abort();\n streamQueue.close();\n };\n\n return {\n events: {\n [Symbol.asyncIterator]: () => ({\n next: async () => await streamQueue.shift(),\n return: async () => {\n cleanup();\n return { done: true, value: undefined };\n },\n }),\n },\n ready,\n close: cleanup,\n };\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.sessionAbortController.abort();\n for (const ac of this.eventStreams) ac.abort();\n this.eventStreams.clear();\n this.queue.close();\n }\n\n private async request(\n path: string,\n init: RequestInit,\n options?: { stream?: boolean }\n ): Promise<Response> {\n const url = toAbsoluteUrl(this.apiUrl, path);\n let requestInit: RequestInit = {\n ...init,\n headers: mergeHeaders(this.defaultHeaders, init.headers),\n };\n\n if (this.onRequest) {\n requestInit = await this.onRequest(url, requestInit);\n }\n\n // Long-lived SSE event streams must not run through AsyncCaller: its\n // p-queue/p-retry semantics are designed for discrete request/response\n // calls, and wrapping a streaming response stalls the call (and can\n // leak retries). Stream resilience is handled separately by the\n // reconnect loop in `openEventStream`.\n const useAsyncCaller = this.asyncCaller != null && !options?.stream;\n\n const execute = async (): Promise<Response> => {\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (!response.ok) {\n // Reject with the Response so AsyncCaller maps it to HTTPError and\n // applies STATUS_NO_RETRY / retry policy consistently with REST.\n if (useAsyncCaller) {\n throw response;\n }\n let detail = \"\";\n try {\n const body = await response.text();\n const parsed = JSON.parse(body);\n if (typeof parsed === \"object\" && parsed != null) {\n detail =\n ((parsed as Record<string, unknown>).message as string) ??\n ((parsed as Record<string, unknown>).error as string) ??\n \"\";\n }\n if (!detail) detail = body;\n } catch {\n // body unreadable or not JSON — fall through\n }\n const message = detail\n ? `Protocol request failed: ${response.status} ${response.statusText} — ${detail}`\n : `Protocol request failed: ${response.status} ${response.statusText}`;\n throw new Error(message);\n }\n return response;\n };\n\n try {\n return useAsyncCaller\n ? await this.asyncCaller!.call(execute)\n : await execute();\n } catch (error) {\n throw toError(error);\n }\n }\n}\n"],"mappings":"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"}
@@ -5,12 +5,14 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
5
5
  //#region src/client/stream/transport/http.d.ts
6
6
  /**
7
7
  * Transport adapter that speaks the thread-centric protocol over HTTP
8
- * commands plus SSE event streams. Bound to a specific `threadId`
9
- * at construction. Each {@link openEventStream} call opens an independent
10
- * filtered SSE connection via `POST /threads/:thread_id/stream/events`.
8
+ * commands plus SSE event streams. Bound to a `threadId` at construction
9
+ * or later via {@link setThreadId}; request URLs derive from the
10
+ * currently-bound thread. Each {@link openEventStream} call opens an
11
+ * independent filtered SSE connection via
12
+ * `POST /threads/:thread_id/stream/events`.
11
13
  */
12
14
  declare class ProtocolSseTransportAdapter implements TransportAdapter {
13
- readonly threadId: string;
15
+ threadId: string;
14
16
  readonly apiUrl: string;
15
17
  private readonly queue;
16
18
  private readonly fetchImpl;
@@ -19,15 +21,24 @@ declare class ProtocolSseTransportAdapter implements TransportAdapter {
19
21
  private readonly fetchFactory?;
20
22
  private readonly asyncCaller?;
21
23
  private readonly maxReconnectAttempts;
24
+ private readonly idleReconnect;
22
25
  private readonly onReconnect?;
23
26
  private readonly reconnectDelayMs;
24
- private readonly commandsUrl;
25
- private readonly streamUrl;
26
- private readonly stateUrl;
27
+ private readonly paths?;
27
28
  private readonly sessionAbortController;
28
29
  private readonly eventStreams;
29
30
  private closed;
30
31
  constructor(options: ProtocolSseTransportOptions);
32
+ /** {@inheritDoc TransportAdapter.setThreadId} */
33
+ setThreadId(threadId: string): void;
34
+ /**
35
+ * Command/stream/state URLs derive from the currently-bound thread so a
36
+ * single adapter can follow {@link setThreadId} re-binds. A fixed
37
+ * `paths.*` string overrides the default and is used as-is.
38
+ */
39
+ private get commandsUrl();
40
+ private get streamUrl();
41
+ private get stateUrl();
31
42
  /**
32
43
  * Fetch checkpointed thread state for hydration.
33
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.cts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AAiCA;;;;cAAa,2BAAA,YAAuC,gBAAA;EAAA,SACzC,QAAA;EAAA,SAEA,MAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,oBAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,gBAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,QAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EA5BJ;;;;;;;EAwDX,QAAA,qBAAA,CAAA,GAAiC,OAAA;IACrC,MAAA,EAAQ,SAAA;IACR,IAAA;IACA,KAAA;IACA,QAAA;IACA,UAAA;MAAe,aAAA;IAAA;IACf,iBAAA;MAAsB,aAAA;IAAA;EAAA;EAAA,QAmCV,YAAA;EAxCZ;;;;EAmDI,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EArDZ;;;;;EA6EjB,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EA6IpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
1
+ {"version":3,"file":"http.d.cts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AAyCA;;;;;;cAAa,2BAAA,YAAuC,gBAAA;EAClD,QAAA;EAAA,SAES,MAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,oBAAA;EAAA,iBAEA,aAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,gBAAA;EAAA,iBAEA,KAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EAxBJ;EAiDjB,WAAA,CAAY,QAAA;EA7CK;;;;;EAAA,YAsDL,WAAA,CAAA;EAAA,YAQA,SAAA,CAAA;EAAA,YAQA,QAAA,CAAA;EAtDK;;;;;;;EAqEX,QAAA,qBAAA,CAAA,GAAiC,OAAA;IACrC,MAAA,EAAQ,SAAA;IACR,IAAA;IACA,KAAA;IACA,QAAA;IACA,UAAA;MAAe,aAAA;IAAA;IACf,iBAAA;MAAsB,aAAA;IAAA;EAAA;EAAA,QAmCV,YAAA;EAnCZ;;;;EA8CI,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EADlB;;;;;EAyBX,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAyJpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
@@ -5,12 +5,14 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
5
5
  //#region src/client/stream/transport/http.d.ts
6
6
  /**
7
7
  * Transport adapter that speaks the thread-centric protocol over HTTP
8
- * commands plus SSE event streams. Bound to a specific `threadId`
9
- * at construction. Each {@link openEventStream} call opens an independent
10
- * filtered SSE connection via `POST /threads/:thread_id/stream/events`.
8
+ * commands plus SSE event streams. Bound to a `threadId` at construction
9
+ * or later via {@link setThreadId}; request URLs derive from the
10
+ * currently-bound thread. Each {@link openEventStream} call opens an
11
+ * independent filtered SSE connection via
12
+ * `POST /threads/:thread_id/stream/events`.
11
13
  */
12
14
  declare class ProtocolSseTransportAdapter implements TransportAdapter {
13
- readonly threadId: string;
15
+ threadId: string;
14
16
  readonly apiUrl: string;
15
17
  private readonly queue;
16
18
  private readonly fetchImpl;
@@ -19,15 +21,24 @@ declare class ProtocolSseTransportAdapter implements TransportAdapter {
19
21
  private readonly fetchFactory?;
20
22
  private readonly asyncCaller?;
21
23
  private readonly maxReconnectAttempts;
24
+ private readonly idleReconnect;
22
25
  private readonly onReconnect?;
23
26
  private readonly reconnectDelayMs;
24
- private readonly commandsUrl;
25
- private readonly streamUrl;
26
- private readonly stateUrl;
27
+ private readonly paths?;
27
28
  private readonly sessionAbortController;
28
29
  private readonly eventStreams;
29
30
  private closed;
30
31
  constructor(options: ProtocolSseTransportOptions);
32
+ /** {@inheritDoc TransportAdapter.setThreadId} */
33
+ setThreadId(threadId: string): void;
34
+ /**
35
+ * Command/stream/state URLs derive from the currently-bound thread so a
36
+ * single adapter can follow {@link setThreadId} re-binds. A fixed
37
+ * `paths.*` string overrides the default and is used as-is.
38
+ */
39
+ private get commandsUrl();
40
+ private get streamUrl();
41
+ private get stateUrl();
31
42
  /**
32
43
  * Fetch checkpointed thread state for hydration.
33
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AAiCA;;;;cAAa,2BAAA,YAAuC,gBAAA;EAAA,SACzC,QAAA;EAAA,SAEA,MAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,oBAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,gBAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,QAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EA5BJ;;;;;;;EAwDX,QAAA,qBAAA,CAAA,GAAiC,OAAA;IACrC,MAAA,EAAQ,SAAA;IACR,IAAA;IACA,KAAA;IACA,QAAA;IACA,UAAA;MAAe,aAAA;IAAA;IACf,iBAAA;MAAsB,aAAA;IAAA;EAAA;EAAA,QAmCV,YAAA;EAxCZ;;;;EAmDI,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EArDZ;;;;;EA6EjB,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EA6IpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
1
+ {"version":3,"file":"http.d.ts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AAyCA;;;;;;cAAa,2BAAA,YAAuC,gBAAA;EAClD,QAAA;EAAA,SAES,MAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,oBAAA;EAAA,iBAEA,aAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,gBAAA;EAAA,iBAEA,KAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EAxBJ;EAiDjB,WAAA,CAAY,QAAA;EA7CK;;;;;EAAA,YAsDL,WAAA,CAAA;EAAA,YAQA,SAAA,CAAA;EAAA,YAQA,QAAA,CAAA;EAtDK;;;;;;;EAqEX,QAAA,qBAAA,CAAA,GAAiC,OAAA;IACrC,MAAA,EAAQ,SAAA;IACR,IAAA;IACA,KAAA;IACA,QAAA;IACA,UAAA;MAAe,aAAA;IAAA;IACf,iBAAA;MAAsB,aAAA;IAAA;EAAA;EAAA,QAmCV,YAAA;EAnCZ;;;;EA8CI,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EADlB;;;;;EAyBX,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAyJpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}