@langchain/langgraph-sdk 1.9.18 → 1.9.20

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 (77) hide show
  1. package/dist/client/index.cjs +1 -0
  2. package/dist/client/index.cjs.map +1 -1
  3. package/dist/client/index.d.cts +1 -0
  4. package/dist/client/index.d.cts.map +1 -1
  5. package/dist/client/index.d.ts +1 -0
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +1 -0
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/stream/resolve-client-api-url.cjs +20 -0
  10. package/dist/client/stream/resolve-client-api-url.cjs.map +1 -0
  11. package/dist/client/stream/resolve-client-api-url.d.cts +17 -0
  12. package/dist/client/stream/resolve-client-api-url.d.cts.map +1 -0
  13. package/dist/client/stream/resolve-client-api-url.d.ts +17 -0
  14. package/dist/client/stream/resolve-client-api-url.d.ts.map +1 -0
  15. package/dist/client/stream/resolve-client-api-url.js +20 -0
  16. package/dist/client/stream/resolve-client-api-url.js.map +1 -0
  17. package/dist/client/stream/transport/agent-server.cjs +11 -0
  18. package/dist/client/stream/transport/agent-server.cjs.map +1 -1
  19. package/dist/client/stream/transport/agent-server.d.cts +6 -0
  20. package/dist/client/stream/transport/agent-server.d.cts.map +1 -1
  21. package/dist/client/stream/transport/agent-server.d.ts +6 -0
  22. package/dist/client/stream/transport/agent-server.d.ts.map +1 -1
  23. package/dist/client/stream/transport/agent-server.js +11 -0
  24. package/dist/client/stream/transport/agent-server.js.map +1 -1
  25. package/dist/client/stream/transport/http.cjs +29 -4
  26. package/dist/client/stream/transport/http.cjs.map +1 -1
  27. package/dist/client/stream/transport/http.d.cts +21 -1
  28. package/dist/client/stream/transport/http.d.cts.map +1 -1
  29. package/dist/client/stream/transport/http.d.ts +21 -1
  30. package/dist/client/stream/transport/http.d.ts.map +1 -1
  31. package/dist/client/stream/transport/http.js +28 -3
  32. package/dist/client/stream/transport/http.js.map +1 -1
  33. package/dist/client/stream/transport/types.d.cts +2 -0
  34. package/dist/client/stream/transport/types.d.cts.map +1 -1
  35. package/dist/client/stream/transport/types.d.ts +2 -0
  36. package/dist/client/stream/transport/types.d.ts.map +1 -1
  37. package/dist/client/stream/transport.d.cts +10 -4
  38. package/dist/client/stream/transport.d.cts.map +1 -1
  39. package/dist/client/stream/transport.d.ts +10 -4
  40. package/dist/client/stream/transport.d.ts.map +1 -1
  41. package/dist/client.cjs +2 -0
  42. package/dist/client.d.cts +2 -1
  43. package/dist/client.d.ts +2 -1
  44. package/dist/client.js +2 -1
  45. package/dist/stream/controller.cjs +12 -1
  46. package/dist/stream/controller.cjs.map +1 -1
  47. package/dist/stream/controller.d.cts.map +1 -1
  48. package/dist/stream/controller.d.ts.map +1 -1
  49. package/dist/stream/controller.js +12 -1
  50. package/dist/stream/controller.js.map +1 -1
  51. package/dist/ui/branching.d.cts +1 -1
  52. package/dist/ui/branching.d.ts +1 -1
  53. package/dist/ui/orchestrator.d.cts +1 -1
  54. package/dist/ui/orchestrator.d.cts.map +1 -1
  55. package/dist/ui/orchestrator.d.ts +1 -1
  56. package/dist/ui/orchestrator.d.ts.map +1 -1
  57. package/dist/utils/sse.cjs.map +1 -1
  58. package/dist/utils/sse.d.cts.map +1 -1
  59. package/dist/utils/sse.d.ts.map +1 -1
  60. package/dist/utils/sse.js.map +1 -1
  61. package/dist/utils/stream.d.cts +1 -1
  62. package/dist/utils/stream.d.cts.map +1 -1
  63. package/dist/utils/stream.d.ts +1 -1
  64. package/dist/utils/stream.d.ts.map +1 -1
  65. package/package.json +2 -2
  66. package/dist/client/stream/transport/constants.cjs +0 -10
  67. package/dist/client/stream/transport/constants.cjs.map +0 -1
  68. package/dist/client/stream/transport/constants.js +0 -10
  69. package/dist/client/stream/transport/constants.js.map +0 -1
  70. package/dist/client/stream/transport/decoder.cjs +0 -115
  71. package/dist/client/stream/transport/decoder.cjs.map +0 -1
  72. package/dist/client/stream/transport/decoder.js +0 -114
  73. package/dist/client/stream/transport/decoder.js.map +0 -1
  74. package/dist/client/stream/transport/stream.cjs +0 -79
  75. package/dist/client/stream/transport/stream.cjs.map +0 -1
  76. package/dist/client/stream/transport/stream.js +0 -79
  77. package/dist/client/stream/transport/stream.js.map +0 -1
@@ -17,6 +17,7 @@ const require_index$5 = require("./store/index.cjs");
17
17
  const require_index$6 = require("./ui-internal/index.cjs");
18
18
  require("./stream/transport/agent-server.cjs");
19
19
  require("./stream/transport/index.cjs");
20
+ require("./stream/resolve-client-api-url.cjs");
20
21
  //#region src/client/index.ts
21
22
  var Client = class {
22
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["AssistantsClient","ThreadsClient","RunsClient","CronsClient","StoreClient","UiClient"],"sources":["../../src/client/index.ts"],"sourcesContent":["import { DefaultValues } from \"../schema.js\";\nimport { type ClientConfig } from \"./base.js\";\nimport { AssistantsClient } from \"./assistants/index.js\";\nimport { ThreadsClient } from \"./threads/index.js\";\nimport { RunsClient } from \"./runs/index.js\";\nimport { CronsClient } from \"./crons/index.js\";\nimport { StoreClient } from \"./store/index.js\";\nimport { UiClient } from \"./ui-internal/index.js\";\n\nexport class Client<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> {\n /**\n * The client for interacting with assistants.\n */\n public assistants: AssistantsClient;\n\n /**\n * The client for interacting with threads.\n */\n public threads: ThreadsClient<TStateType, TUpdateType>;\n\n /**\n * The client for interacting with runs.\n */\n public runs: RunsClient<TStateType, TUpdateType, TCustomEventType>;\n\n /**\n * The client for interacting with cron runs.\n */\n public crons: CronsClient;\n\n /**\n * The client for interacting with the KV store.\n */\n public store: StoreClient;\n\n /**\n * The client for interacting with the UI.\n * @internal Used by LoadExternalComponent and the API might change in the future.\n */\n public \"~ui\": UiClient;\n\n /**\n * @internal Used to obtain a stable key representing the client.\n */\n private \"~configHash\": string | undefined;\n\n constructor(config?: ClientConfig) {\n this[\"~configHash\"] = (() =>\n JSON.stringify({\n apiUrl: config?.apiUrl,\n apiKey: config?.apiKey,\n timeoutMs: config?.timeoutMs,\n defaultHeaders: config?.defaultHeaders,\n streamProtocol: config?.streamProtocol,\n\n maxConcurrency: config?.callerOptions?.maxConcurrency,\n maxRetries: config?.callerOptions?.maxRetries,\n\n callbacks: {\n onFailedResponseHook:\n config?.callerOptions?.onFailedResponseHook != null,\n onRequest: config?.onRequest != null,\n fetch: config?.callerOptions?.fetch != null,\n },\n }))();\n\n this.assistants = new AssistantsClient(config);\n this.threads = new ThreadsClient(config);\n this.runs = new RunsClient(config);\n this.crons = new CronsClient(config);\n this.store = new StoreClient(config);\n this[\"~ui\"] = new UiClient(config);\n }\n}\n\n/**\n * @internal Used to obtain a stable key representing the client.\n */\nexport function getClientConfigHash(client: Client): string | undefined {\n return client[\"~configHash\"];\n}\n\nexport { BaseClient } from \"./base.js\";\nexport { getApiKey } from \"./base.js\";\nexport type { ClientConfig, RequestHook, HeaderValue } from \"./base.js\";\nexport { AssistantsClient } from \"./assistants/index.js\";\nexport { ThreadsClient } from \"./threads/index.js\";\nexport { RunsClient } from \"./runs/index.js\";\nexport { CronsClient } from \"./crons/index.js\";\nexport { StoreClient } from \"./store/index.js\";\n\nexport {\n ProtocolError,\n ThreadStream,\n SubscriptionHandle,\n StreamingMessage,\n StreamingMessageAssembler,\n MessageAssembler,\n MediaAssembler,\n MediaAssemblyError,\n ToolCallAssembler,\n SubgraphDiscoveryHandle,\n SubgraphHandle,\n SubagentHandle,\n SubagentDiscoveryHandle,\n inferChannel,\n matchesSubscription,\n} from \"./stream/index.js\";\n\nexport type {\n TransportAdapter,\n AgentServerAdapter,\n AssembledMessage,\n MessageAssemblyUpdate,\n AssembledToolCall,\n ToolCallStatus,\n Subscribable,\n InterruptPayload,\n SubscribeOptions,\n EventMethodByChannel,\n EventForChannel,\n EventForChannels,\n ThreadStreamOptions,\n ThreadStreamTransport,\n ThreadStreamTransportKind,\n SessionOrderingState,\n EventSubscription,\n MessageSubscription,\n InputModule,\n StateModule,\n ThreadModules,\n ThreadExtension,\n ThreadExtensions,\n UnwrapExtension,\n AnyMediaHandle,\n AudioMedia,\n FileMedia,\n ImageMedia,\n MediaAssemblerCallbacks,\n MediaAssemblerOptions,\n MediaAssemblyErrorKind,\n MediaBase,\n MediaBlockType,\n VideoMedia,\n} from \"./stream/index.js\";\n\nexport {\n ProtocolSseTransportAdapter,\n ProtocolWebSocketTransportAdapter,\n HttpAgentServerAdapter,\n} from \"./stream/transport/index.js\";\n\nexport type { HttpAgentServerAdapterOptions } from \"./stream/transport/index.js\";\n\nexport type {\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n ProtocolWebSocketTransportOptions,\n ProtocolTransportPaths,\n ProtocolHeaderValue,\n} from \"./stream/transport/index.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AASA,IAAa,SAAb,MAIE;;;;CAIA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;;CAMA;;;;CAKA;CAEA,YAAY,QAAuB;AACjC,OAAK,iBACH,KAAK,UAAU;GACb,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,gBAAgB,QAAQ;GACxB,gBAAgB,QAAQ;GAExB,gBAAgB,QAAQ,eAAe;GACvC,YAAY,QAAQ,eAAe;GAEnC,WAAW;IACT,sBACE,QAAQ,eAAe,wBAAwB;IACjD,WAAW,QAAQ,aAAa;IAChC,OAAO,QAAQ,eAAe,SAAS;IACxC;GACF,CAAC;AAEJ,OAAK,aAAa,IAAIA,cAAAA,iBAAiB,OAAO;AAC9C,OAAK,UAAU,IAAIC,gBAAAA,cAAc,OAAO;AACxC,OAAK,OAAO,IAAIC,gBAAAA,WAAW,OAAO;AAClC,OAAK,QAAQ,IAAIC,gBAAAA,YAAY,OAAO;AACpC,OAAK,QAAQ,IAAIC,gBAAAA,YAAY,OAAO;AACpC,OAAK,SAAS,IAAIC,gBAAAA,SAAS,OAAO;;;;;;AAOtC,SAAgB,oBAAoB,QAAoC;AACtE,QAAO,OAAO"}
1
+ {"version":3,"file":"index.cjs","names":["AssistantsClient","ThreadsClient","RunsClient","CronsClient","StoreClient","UiClient"],"sources":["../../src/client/index.ts"],"sourcesContent":["import { DefaultValues } from \"../schema.js\";\nimport { type ClientConfig } from \"./base.js\";\nimport { AssistantsClient } from \"./assistants/index.js\";\nimport { ThreadsClient } from \"./threads/index.js\";\nimport { RunsClient } from \"./runs/index.js\";\nimport { CronsClient } from \"./crons/index.js\";\nimport { StoreClient } from \"./store/index.js\";\nimport { UiClient } from \"./ui-internal/index.js\";\n\nexport class Client<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> {\n /**\n * The client for interacting with assistants.\n */\n public assistants: AssistantsClient;\n\n /**\n * The client for interacting with threads.\n */\n public threads: ThreadsClient<TStateType, TUpdateType>;\n\n /**\n * The client for interacting with runs.\n */\n public runs: RunsClient<TStateType, TUpdateType, TCustomEventType>;\n\n /**\n * The client for interacting with cron runs.\n */\n public crons: CronsClient;\n\n /**\n * The client for interacting with the KV store.\n */\n public store: StoreClient;\n\n /**\n * The client for interacting with the UI.\n * @internal Used by LoadExternalComponent and the API might change in the future.\n */\n public \"~ui\": UiClient;\n\n /**\n * @internal Used to obtain a stable key representing the client.\n */\n private \"~configHash\": string | undefined;\n\n constructor(config?: ClientConfig) {\n this[\"~configHash\"] = (() =>\n JSON.stringify({\n apiUrl: config?.apiUrl,\n apiKey: config?.apiKey,\n timeoutMs: config?.timeoutMs,\n defaultHeaders: config?.defaultHeaders,\n streamProtocol: config?.streamProtocol,\n\n maxConcurrency: config?.callerOptions?.maxConcurrency,\n maxRetries: config?.callerOptions?.maxRetries,\n\n callbacks: {\n onFailedResponseHook:\n config?.callerOptions?.onFailedResponseHook != null,\n onRequest: config?.onRequest != null,\n fetch: config?.callerOptions?.fetch != null,\n },\n }))();\n\n this.assistants = new AssistantsClient(config);\n this.threads = new ThreadsClient(config);\n this.runs = new RunsClient(config);\n this.crons = new CronsClient(config);\n this.store = new StoreClient(config);\n this[\"~ui\"] = new UiClient(config);\n }\n}\n\n/**\n * @internal Used to obtain a stable key representing the client.\n */\nexport function getClientConfigHash(client: Client): string | undefined {\n return client[\"~configHash\"];\n}\n\nexport { BaseClient } from \"./base.js\";\nexport { getApiKey } from \"./base.js\";\nexport type { ClientConfig, RequestHook, HeaderValue } from \"./base.js\";\nexport { AssistantsClient } from \"./assistants/index.js\";\nexport { ThreadsClient } from \"./threads/index.js\";\nexport { RunsClient } from \"./runs/index.js\";\nexport { CronsClient } from \"./crons/index.js\";\nexport { StoreClient } from \"./store/index.js\";\n\nexport {\n ProtocolError,\n ThreadStream,\n SubscriptionHandle,\n StreamingMessage,\n StreamingMessageAssembler,\n MessageAssembler,\n MediaAssembler,\n MediaAssemblyError,\n ToolCallAssembler,\n SubgraphDiscoveryHandle,\n SubgraphHandle,\n SubagentHandle,\n SubagentDiscoveryHandle,\n inferChannel,\n matchesSubscription,\n} from \"./stream/index.js\";\n\nexport type {\n TransportAdapter,\n AgentServerAdapter,\n AssembledMessage,\n MessageAssemblyUpdate,\n AssembledToolCall,\n ToolCallStatus,\n Subscribable,\n InterruptPayload,\n SubscribeOptions,\n EventMethodByChannel,\n EventForChannel,\n EventForChannels,\n ThreadStreamOptions,\n ThreadStreamTransport,\n ThreadStreamTransportKind,\n SessionOrderingState,\n EventSubscription,\n MessageSubscription,\n InputModule,\n StateModule,\n ThreadModules,\n ThreadExtension,\n ThreadExtensions,\n UnwrapExtension,\n AnyMediaHandle,\n AudioMedia,\n FileMedia,\n ImageMedia,\n MediaAssemblerCallbacks,\n MediaAssemblerOptions,\n MediaAssemblyErrorKind,\n MediaBase,\n MediaBlockType,\n VideoMedia,\n} from \"./stream/index.js\";\n\nexport {\n ProtocolSseTransportAdapter,\n ProtocolWebSocketTransportAdapter,\n HttpAgentServerAdapter,\n} from \"./stream/transport/index.js\";\n\nexport type { HttpAgentServerAdapterOptions } from \"./stream/transport/index.js\";\nexport { resolveClientApiUrl } from \"./stream/resolve-client-api-url.js\";\n\nexport type {\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n ProtocolWebSocketTransportOptions,\n ProtocolTransportPaths,\n ProtocolHeaderValue,\n} from \"./stream/transport/index.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AASA,IAAa,SAAb,MAIE;;;;CAIA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;;CAMA;;;;CAKA;CAEA,YAAY,QAAuB;AACjC,OAAK,iBACH,KAAK,UAAU;GACb,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,gBAAgB,QAAQ;GACxB,gBAAgB,QAAQ;GAExB,gBAAgB,QAAQ,eAAe;GACvC,YAAY,QAAQ,eAAe;GAEnC,WAAW;IACT,sBACE,QAAQ,eAAe,wBAAwB;IACjD,WAAW,QAAQ,aAAa;IAChC,OAAO,QAAQ,eAAe,SAAS;IACxC;GACF,CAAC;AAEJ,OAAK,aAAa,IAAIA,cAAAA,iBAAiB,OAAO;AAC9C,OAAK,UAAU,IAAIC,gBAAAA,cAAc,OAAO;AACxC,OAAK,OAAO,IAAIC,gBAAAA,WAAW,OAAO;AAClC,OAAK,QAAQ,IAAIC,gBAAAA,YAAY,OAAO;AACpC,OAAK,QAAQ,IAAIC,gBAAAA,YAAY,OAAO;AACpC,OAAK,SAAS,IAAIC,gBAAAA,SAAS,OAAO;;;;;;AAOtC,SAAgB,oBAAoB,QAAoC;AACtE,QAAO,OAAO"}
@@ -20,6 +20,7 @@ import { HeaderValue as HeaderValue$1, ProtocolRequestHook, ProtocolSseTransport
20
20
  import { ProtocolSseTransportAdapter } from "./stream/transport/http.cjs";
21
21
  import { ProtocolWebSocketTransportAdapter } from "./stream/transport/websocket.cjs";
22
22
  import { HttpAgentServerAdapter, HttpAgentServerAdapterOptions } from "./stream/transport/agent-server.cjs";
23
+ import { resolveClientApiUrl } from "./stream/resolve-client-api-url.cjs";
23
24
 
24
25
  //#region src/client/index.d.ts
25
26
  declare class Client<TStateType = DefaultValues, TUpdateType = TStateType, TCustomEventType = unknown> {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/client/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;cASa,MAAA,cACE,aAAA,gBACC,UAAA;;;;EAMP,UAAA,EAAY,gBAAA;;;;EAKZ,OAAA,EAAS,aAAA,CAAc,UAAA,EAAY,WAAA;;;;EAKnC,IAAA,EAAM,UAAA,CAAW,UAAA,EAAY,WAAA,EAAa,gBAAA;;;;EAK1C,KAAA,EAAO,WAAA;EAvBG;;;EA4BV,KAAA,EAAO,WAAA;EApBK;;;;EAAA,OA0BL,QAAA;EAhBsB;;;EAAA;EAuBpC,WAAA,CAAY,MAAA,GAAS,YAAA;AAAA;;;;iBAgCP,mBAAA,CAAoB,MAAA,EAAQ,MAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/client/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;cASa,MAAA,cACE,aAAA,gBACC,UAAA;;;;EAMP,UAAA,EAAY,gBAAA;;;;EAKZ,OAAA,EAAS,aAAA,CAAc,UAAA,EAAY,WAAA;;;;EAKnC,IAAA,EAAM,UAAA,CAAW,UAAA,EAAY,WAAA,EAAa,gBAAA;;;;EAK1C,KAAA,EAAO,WAAA;EAvBH;;;EA4BJ,KAAA,EAAO,WAAA;EA1BA;;;;EAAA,OAgCA,QAAA;EAhBU;;;EAAA;EAuBxB,WAAA,CAAY,MAAA,GAAS,YAAA;AAAA;;;;iBAgCP,mBAAA,CAAoB,MAAA,EAAQ,MAAA"}
@@ -20,6 +20,7 @@ import { HeaderValue as HeaderValue$1, ProtocolRequestHook, ProtocolSseTransport
20
20
  import { ProtocolSseTransportAdapter } from "./stream/transport/http.js";
21
21
  import { ProtocolWebSocketTransportAdapter } from "./stream/transport/websocket.js";
22
22
  import { HttpAgentServerAdapter, HttpAgentServerAdapterOptions } from "./stream/transport/agent-server.js";
23
+ import { resolveClientApiUrl } from "./stream/resolve-client-api-url.js";
23
24
 
24
25
  //#region src/client/index.d.ts
25
26
  declare class Client<TStateType = DefaultValues, TUpdateType = TStateType, TCustomEventType = unknown> {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/client/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;cASa,MAAA,cACE,aAAA,gBACC,UAAA;;;;EAMP,UAAA,EAAY,gBAAA;;;;EAKZ,OAAA,EAAS,aAAA,CAAc,UAAA,EAAY,WAAA;;;;EAKnC,IAAA,EAAM,UAAA,CAAW,UAAA,EAAY,WAAA,EAAa,gBAAA;;;;EAK1C,KAAA,EAAO,WAAA;EAvBG;;;EA4BV,KAAA,EAAO,WAAA;EApBK;;;;EAAA,OA0BL,QAAA;EAhBsB;;;EAAA;EAuBpC,WAAA,CAAY,MAAA,GAAS,YAAA;AAAA;;;;iBAgCP,mBAAA,CAAoB,MAAA,EAAQ,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/client/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;cASa,MAAA,cACE,aAAA,gBACC,UAAA;;;;EAMP,UAAA,EAAY,gBAAA;;;;EAKZ,OAAA,EAAS,aAAA,CAAc,UAAA,EAAY,WAAA;;;;EAKnC,IAAA,EAAM,UAAA,CAAW,UAAA,EAAY,WAAA,EAAa,gBAAA;;;;EAK1C,KAAA,EAAO,WAAA;EAvBH;;;EA4BJ,KAAA,EAAO,WAAA;EA1BA;;;;EAAA,OAgCA,QAAA;EAhBU;;;EAAA;EAuBxB,WAAA,CAAY,MAAA,GAAS,YAAA;AAAA;;;;iBAgCP,mBAAA,CAAoB,MAAA,EAAQ,MAAA"}
@@ -17,6 +17,7 @@ import { StoreClient } from "./store/index.js";
17
17
  import { UiClient } from "./ui-internal/index.js";
18
18
  import "./stream/transport/agent-server.js";
19
19
  import "./stream/transport/index.js";
20
+ import "./stream/resolve-client-api-url.js";
20
21
  //#region src/client/index.ts
21
22
  var Client = class {
22
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/client/index.ts"],"sourcesContent":["import { DefaultValues } from \"../schema.js\";\nimport { type ClientConfig } from \"./base.js\";\nimport { AssistantsClient } from \"./assistants/index.js\";\nimport { ThreadsClient } from \"./threads/index.js\";\nimport { RunsClient } from \"./runs/index.js\";\nimport { CronsClient } from \"./crons/index.js\";\nimport { StoreClient } from \"./store/index.js\";\nimport { UiClient } from \"./ui-internal/index.js\";\n\nexport class Client<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> {\n /**\n * The client for interacting with assistants.\n */\n public assistants: AssistantsClient;\n\n /**\n * The client for interacting with threads.\n */\n public threads: ThreadsClient<TStateType, TUpdateType>;\n\n /**\n * The client for interacting with runs.\n */\n public runs: RunsClient<TStateType, TUpdateType, TCustomEventType>;\n\n /**\n * The client for interacting with cron runs.\n */\n public crons: CronsClient;\n\n /**\n * The client for interacting with the KV store.\n */\n public store: StoreClient;\n\n /**\n * The client for interacting with the UI.\n * @internal Used by LoadExternalComponent and the API might change in the future.\n */\n public \"~ui\": UiClient;\n\n /**\n * @internal Used to obtain a stable key representing the client.\n */\n private \"~configHash\": string | undefined;\n\n constructor(config?: ClientConfig) {\n this[\"~configHash\"] = (() =>\n JSON.stringify({\n apiUrl: config?.apiUrl,\n apiKey: config?.apiKey,\n timeoutMs: config?.timeoutMs,\n defaultHeaders: config?.defaultHeaders,\n streamProtocol: config?.streamProtocol,\n\n maxConcurrency: config?.callerOptions?.maxConcurrency,\n maxRetries: config?.callerOptions?.maxRetries,\n\n callbacks: {\n onFailedResponseHook:\n config?.callerOptions?.onFailedResponseHook != null,\n onRequest: config?.onRequest != null,\n fetch: config?.callerOptions?.fetch != null,\n },\n }))();\n\n this.assistants = new AssistantsClient(config);\n this.threads = new ThreadsClient(config);\n this.runs = new RunsClient(config);\n this.crons = new CronsClient(config);\n this.store = new StoreClient(config);\n this[\"~ui\"] = new UiClient(config);\n }\n}\n\n/**\n * @internal Used to obtain a stable key representing the client.\n */\nexport function getClientConfigHash(client: Client): string | undefined {\n return client[\"~configHash\"];\n}\n\nexport { BaseClient } from \"./base.js\";\nexport { getApiKey } from \"./base.js\";\nexport type { ClientConfig, RequestHook, HeaderValue } from \"./base.js\";\nexport { AssistantsClient } from \"./assistants/index.js\";\nexport { ThreadsClient } from \"./threads/index.js\";\nexport { RunsClient } from \"./runs/index.js\";\nexport { CronsClient } from \"./crons/index.js\";\nexport { StoreClient } from \"./store/index.js\";\n\nexport {\n ProtocolError,\n ThreadStream,\n SubscriptionHandle,\n StreamingMessage,\n StreamingMessageAssembler,\n MessageAssembler,\n MediaAssembler,\n MediaAssemblyError,\n ToolCallAssembler,\n SubgraphDiscoveryHandle,\n SubgraphHandle,\n SubagentHandle,\n SubagentDiscoveryHandle,\n inferChannel,\n matchesSubscription,\n} from \"./stream/index.js\";\n\nexport type {\n TransportAdapter,\n AgentServerAdapter,\n AssembledMessage,\n MessageAssemblyUpdate,\n AssembledToolCall,\n ToolCallStatus,\n Subscribable,\n InterruptPayload,\n SubscribeOptions,\n EventMethodByChannel,\n EventForChannel,\n EventForChannels,\n ThreadStreamOptions,\n ThreadStreamTransport,\n ThreadStreamTransportKind,\n SessionOrderingState,\n EventSubscription,\n MessageSubscription,\n InputModule,\n StateModule,\n ThreadModules,\n ThreadExtension,\n ThreadExtensions,\n UnwrapExtension,\n AnyMediaHandle,\n AudioMedia,\n FileMedia,\n ImageMedia,\n MediaAssemblerCallbacks,\n MediaAssemblerOptions,\n MediaAssemblyErrorKind,\n MediaBase,\n MediaBlockType,\n VideoMedia,\n} from \"./stream/index.js\";\n\nexport {\n ProtocolSseTransportAdapter,\n ProtocolWebSocketTransportAdapter,\n HttpAgentServerAdapter,\n} from \"./stream/transport/index.js\";\n\nexport type { HttpAgentServerAdapterOptions } from \"./stream/transport/index.js\";\n\nexport type {\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n ProtocolWebSocketTransportOptions,\n ProtocolTransportPaths,\n ProtocolHeaderValue,\n} from \"./stream/transport/index.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AASA,IAAa,SAAb,MAIE;;;;CAIA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;;CAMA;;;;CAKA;CAEA,YAAY,QAAuB;AACjC,OAAK,iBACH,KAAK,UAAU;GACb,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,gBAAgB,QAAQ;GACxB,gBAAgB,QAAQ;GAExB,gBAAgB,QAAQ,eAAe;GACvC,YAAY,QAAQ,eAAe;GAEnC,WAAW;IACT,sBACE,QAAQ,eAAe,wBAAwB;IACjD,WAAW,QAAQ,aAAa;IAChC,OAAO,QAAQ,eAAe,SAAS;IACxC;GACF,CAAC;AAEJ,OAAK,aAAa,IAAI,iBAAiB,OAAO;AAC9C,OAAK,UAAU,IAAI,cAAc,OAAO;AACxC,OAAK,OAAO,IAAI,WAAW,OAAO;AAClC,OAAK,QAAQ,IAAI,YAAY,OAAO;AACpC,OAAK,QAAQ,IAAI,YAAY,OAAO;AACpC,OAAK,SAAS,IAAI,SAAS,OAAO;;;;;;AAOtC,SAAgB,oBAAoB,QAAoC;AACtE,QAAO,OAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/client/index.ts"],"sourcesContent":["import { DefaultValues } from \"../schema.js\";\nimport { type ClientConfig } from \"./base.js\";\nimport { AssistantsClient } from \"./assistants/index.js\";\nimport { ThreadsClient } from \"./threads/index.js\";\nimport { RunsClient } from \"./runs/index.js\";\nimport { CronsClient } from \"./crons/index.js\";\nimport { StoreClient } from \"./store/index.js\";\nimport { UiClient } from \"./ui-internal/index.js\";\n\nexport class Client<\n TStateType = DefaultValues,\n TUpdateType = TStateType,\n TCustomEventType = unknown,\n> {\n /**\n * The client for interacting with assistants.\n */\n public assistants: AssistantsClient;\n\n /**\n * The client for interacting with threads.\n */\n public threads: ThreadsClient<TStateType, TUpdateType>;\n\n /**\n * The client for interacting with runs.\n */\n public runs: RunsClient<TStateType, TUpdateType, TCustomEventType>;\n\n /**\n * The client for interacting with cron runs.\n */\n public crons: CronsClient;\n\n /**\n * The client for interacting with the KV store.\n */\n public store: StoreClient;\n\n /**\n * The client for interacting with the UI.\n * @internal Used by LoadExternalComponent and the API might change in the future.\n */\n public \"~ui\": UiClient;\n\n /**\n * @internal Used to obtain a stable key representing the client.\n */\n private \"~configHash\": string | undefined;\n\n constructor(config?: ClientConfig) {\n this[\"~configHash\"] = (() =>\n JSON.stringify({\n apiUrl: config?.apiUrl,\n apiKey: config?.apiKey,\n timeoutMs: config?.timeoutMs,\n defaultHeaders: config?.defaultHeaders,\n streamProtocol: config?.streamProtocol,\n\n maxConcurrency: config?.callerOptions?.maxConcurrency,\n maxRetries: config?.callerOptions?.maxRetries,\n\n callbacks: {\n onFailedResponseHook:\n config?.callerOptions?.onFailedResponseHook != null,\n onRequest: config?.onRequest != null,\n fetch: config?.callerOptions?.fetch != null,\n },\n }))();\n\n this.assistants = new AssistantsClient(config);\n this.threads = new ThreadsClient(config);\n this.runs = new RunsClient(config);\n this.crons = new CronsClient(config);\n this.store = new StoreClient(config);\n this[\"~ui\"] = new UiClient(config);\n }\n}\n\n/**\n * @internal Used to obtain a stable key representing the client.\n */\nexport function getClientConfigHash(client: Client): string | undefined {\n return client[\"~configHash\"];\n}\n\nexport { BaseClient } from \"./base.js\";\nexport { getApiKey } from \"./base.js\";\nexport type { ClientConfig, RequestHook, HeaderValue } from \"./base.js\";\nexport { AssistantsClient } from \"./assistants/index.js\";\nexport { ThreadsClient } from \"./threads/index.js\";\nexport { RunsClient } from \"./runs/index.js\";\nexport { CronsClient } from \"./crons/index.js\";\nexport { StoreClient } from \"./store/index.js\";\n\nexport {\n ProtocolError,\n ThreadStream,\n SubscriptionHandle,\n StreamingMessage,\n StreamingMessageAssembler,\n MessageAssembler,\n MediaAssembler,\n MediaAssemblyError,\n ToolCallAssembler,\n SubgraphDiscoveryHandle,\n SubgraphHandle,\n SubagentHandle,\n SubagentDiscoveryHandle,\n inferChannel,\n matchesSubscription,\n} from \"./stream/index.js\";\n\nexport type {\n TransportAdapter,\n AgentServerAdapter,\n AssembledMessage,\n MessageAssemblyUpdate,\n AssembledToolCall,\n ToolCallStatus,\n Subscribable,\n InterruptPayload,\n SubscribeOptions,\n EventMethodByChannel,\n EventForChannel,\n EventForChannels,\n ThreadStreamOptions,\n ThreadStreamTransport,\n ThreadStreamTransportKind,\n SessionOrderingState,\n EventSubscription,\n MessageSubscription,\n InputModule,\n StateModule,\n ThreadModules,\n ThreadExtension,\n ThreadExtensions,\n UnwrapExtension,\n AnyMediaHandle,\n AudioMedia,\n FileMedia,\n ImageMedia,\n MediaAssemblerCallbacks,\n MediaAssemblerOptions,\n MediaAssemblyErrorKind,\n MediaBase,\n MediaBlockType,\n VideoMedia,\n} from \"./stream/index.js\";\n\nexport {\n ProtocolSseTransportAdapter,\n ProtocolWebSocketTransportAdapter,\n HttpAgentServerAdapter,\n} from \"./stream/transport/index.js\";\n\nexport type { HttpAgentServerAdapterOptions } from \"./stream/transport/index.js\";\nexport { resolveClientApiUrl } from \"./stream/resolve-client-api-url.js\";\n\nexport type {\n ProtocolRequestHook,\n ProtocolSseTransportOptions,\n ProtocolWebSocketTransportOptions,\n ProtocolTransportPaths,\n ProtocolHeaderValue,\n} from \"./stream/transport/index.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AASA,IAAa,SAAb,MAIE;;;;CAIA;;;;CAKA;;;;CAKA;;;;CAKA;;;;CAKA;;;;;CAMA;;;;CAKA;CAEA,YAAY,QAAuB;AACjC,OAAK,iBACH,KAAK,UAAU;GACb,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACnB,gBAAgB,QAAQ;GACxB,gBAAgB,QAAQ;GAExB,gBAAgB,QAAQ,eAAe;GACvC,YAAY,QAAQ,eAAe;GAEnC,WAAW;IACT,sBACE,QAAQ,eAAe,wBAAwB;IACjD,WAAW,QAAQ,aAAa;IAChC,OAAO,QAAQ,eAAe,SAAS;IACxC;GACF,CAAC;AAEJ,OAAK,aAAa,IAAI,iBAAiB,OAAO;AAC9C,OAAK,UAAU,IAAI,cAAc,OAAO;AACxC,OAAK,OAAO,IAAI,WAAW,OAAO;AAClC,OAAK,QAAQ,IAAI,YAAY,OAAO;AACpC,OAAK,QAAQ,IAAI,YAAY,OAAO;AACpC,OAAK,SAAS,IAAI,SAAS,OAAO;;;;;;AAOtC,SAAgB,oBAAoB,QAAoC;AACtE,QAAO,OAAO"}
@@ -0,0 +1,20 @@
1
+ //#region src/client/stream/resolve-client-api-url.ts
2
+ /**
3
+ * Resolve the LangGraph SDK `Client` base URL for hydration and history
4
+ * reads when the caller uses a custom {@link AgentServerAdapter}.
5
+ *
6
+ * Explicit `apiUrl` wins; otherwise inherit from adapters that expose
7
+ * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).
8
+ */
9
+ function resolveClientApiUrl(options) {
10
+ if (options.apiUrl != null) return options.apiUrl;
11
+ const { transport } = options;
12
+ if (transport != null && typeof transport === "object") {
13
+ const candidate = transport.apiUrl;
14
+ if (typeof candidate === "string") return candidate;
15
+ }
16
+ }
17
+ //#endregion
18
+ exports.resolveClientApiUrl = resolveClientApiUrl;
19
+
20
+ //# sourceMappingURL=resolve-client-api-url.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client-api-url.cjs","names":[],"sources":["../../../src/client/stream/resolve-client-api-url.ts"],"sourcesContent":["import type { AgentServerAdapter } from \"./transport.js\";\n\n/**\n * Resolve the LangGraph SDK `Client` base URL for hydration and history\n * reads when the caller uses a custom {@link AgentServerAdapter}.\n *\n * Explicit `apiUrl` wins; otherwise inherit from adapters that expose\n * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).\n */\nexport function resolveClientApiUrl(options: {\n apiUrl?: string;\n transport?: \"sse\" | \"websocket\" | AgentServerAdapter;\n}): string | undefined {\n if (options.apiUrl != null) return options.apiUrl;\n\n const { transport } = options;\n if (transport != null && typeof transport === \"object\") {\n const candidate = (transport as { apiUrl?: unknown }).apiUrl;\n if (typeof candidate === \"string\") return candidate;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,oBAAoB,SAGb;AACrB,KAAI,QAAQ,UAAU,KAAM,QAAO,QAAQ;CAE3C,MAAM,EAAE,cAAc;AACtB,KAAI,aAAa,QAAQ,OAAO,cAAc,UAAU;EACtD,MAAM,YAAa,UAAmC;AACtD,MAAI,OAAO,cAAc,SAAU,QAAO"}
@@ -0,0 +1,17 @@
1
+ import { AgentServerAdapter } from "./transport.cjs";
2
+
3
+ //#region src/client/stream/resolve-client-api-url.d.ts
4
+ /**
5
+ * Resolve the LangGraph SDK `Client` base URL for hydration and history
6
+ * reads when the caller uses a custom {@link AgentServerAdapter}.
7
+ *
8
+ * Explicit `apiUrl` wins; otherwise inherit from adapters that expose
9
+ * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).
10
+ */
11
+ declare function resolveClientApiUrl(options: {
12
+ apiUrl?: string;
13
+ transport?: "sse" | "websocket" | AgentServerAdapter;
14
+ }): string | undefined;
15
+ //#endregion
16
+ export { resolveClientApiUrl };
17
+ //# sourceMappingURL=resolve-client-api-url.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client-api-url.d.cts","names":[],"sources":["../../../src/client/stream/resolve-client-api-url.ts"],"mappings":";;;;;AASA;;;;;iBAAgB,mBAAA,CAAoB,OAAA;EAClC,MAAA;EACA,SAAA,yBAAkC,kBAAA;AAAA"}
@@ -0,0 +1,17 @@
1
+ import { AgentServerAdapter } from "./transport.js";
2
+
3
+ //#region src/client/stream/resolve-client-api-url.d.ts
4
+ /**
5
+ * Resolve the LangGraph SDK `Client` base URL for hydration and history
6
+ * reads when the caller uses a custom {@link AgentServerAdapter}.
7
+ *
8
+ * Explicit `apiUrl` wins; otherwise inherit from adapters that expose
9
+ * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).
10
+ */
11
+ declare function resolveClientApiUrl(options: {
12
+ apiUrl?: string;
13
+ transport?: "sse" | "websocket" | AgentServerAdapter;
14
+ }): string | undefined;
15
+ //#endregion
16
+ export { resolveClientApiUrl };
17
+ //# sourceMappingURL=resolve-client-api-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client-api-url.d.ts","names":[],"sources":["../../../src/client/stream/resolve-client-api-url.ts"],"mappings":";;;;;AASA;;;;;iBAAgB,mBAAA,CAAoB,OAAA;EAClC,MAAA;EACA,SAAA,yBAAkC,kBAAA;AAAA"}
@@ -0,0 +1,20 @@
1
+ //#region src/client/stream/resolve-client-api-url.ts
2
+ /**
3
+ * Resolve the LangGraph SDK `Client` base URL for hydration and history
4
+ * reads when the caller uses a custom {@link AgentServerAdapter}.
5
+ *
6
+ * Explicit `apiUrl` wins; otherwise inherit from adapters that expose
7
+ * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).
8
+ */
9
+ function resolveClientApiUrl(options) {
10
+ if (options.apiUrl != null) return options.apiUrl;
11
+ const { transport } = options;
12
+ if (transport != null && typeof transport === "object") {
13
+ const candidate = transport.apiUrl;
14
+ if (typeof candidate === "string") return candidate;
15
+ }
16
+ }
17
+ //#endregion
18
+ export { resolveClientApiUrl };
19
+
20
+ //# sourceMappingURL=resolve-client-api-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-client-api-url.js","names":[],"sources":["../../../src/client/stream/resolve-client-api-url.ts"],"sourcesContent":["import type { AgentServerAdapter } from \"./transport.js\";\n\n/**\n * Resolve the LangGraph SDK `Client` base URL for hydration and history\n * reads when the caller uses a custom {@link AgentServerAdapter}.\n *\n * Explicit `apiUrl` wins; otherwise inherit from adapters that expose\n * `apiUrl` (e.g. {@link HttpAgentServerAdapter}).\n */\nexport function resolveClientApiUrl(options: {\n apiUrl?: string;\n transport?: \"sse\" | \"websocket\" | AgentServerAdapter;\n}): string | undefined {\n if (options.apiUrl != null) return options.apiUrl;\n\n const { transport } = options;\n if (transport != null && typeof transport === \"object\") {\n const candidate = (transport as { apiUrl?: unknown }).apiUrl;\n if (typeof candidate === \"string\") return candidate;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,oBAAoB,SAGb;AACrB,KAAI,QAAQ,UAAU,KAAM,QAAO,QAAQ;CAE3C,MAAM,EAAE,cAAc;AACtB,KAAI,aAAa,QAAQ,OAAO,cAAc,UAAU;EACtD,MAAM,YAAa,UAAmC;AACtD,MAAI,OAAO,cAAc,SAAU,QAAO"}
@@ -3,9 +3,16 @@ const require_websocket = require("./websocket.cjs");
3
3
  //#region src/client/stream/transport/agent-server.ts
4
4
  var HttpAgentServerAdapter = class {
5
5
  threadId;
6
+ apiUrl;
6
7
  #delegate;
8
+ /**
9
+ * Thread-state reads are SSE-only. WebSocket delegates omit this so
10
+ * {@link StreamController} falls back to `client.threads.getState()`.
11
+ */
12
+ getState;
7
13
  constructor(options) {
8
14
  this.threadId = options.threadId;
15
+ this.apiUrl = options.apiUrl;
9
16
  this.#delegate = options.webSocketFactory != null ? new require_websocket.ProtocolWebSocketTransportAdapter({
10
17
  apiUrl: options.apiUrl,
11
18
  threadId: options.threadId,
@@ -21,6 +28,10 @@ var HttpAgentServerAdapter = class {
21
28
  fetch: options.fetch,
22
29
  paths: options.paths
23
30
  });
31
+ if (options.webSocketFactory == null) {
32
+ const sse = this.#delegate;
33
+ this.getState = sse.getState.bind(sse);
34
+ }
24
35
  }
25
36
  open() {
26
37
  return this.#delegate.open();
@@ -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 { 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 * 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 #delegate: TransportAdapter;\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId;\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 paths: options.paths,\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":";;;AA2DA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ;AACxB,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,OAAO,QAAQ;GAChB,CAAC;;CAGV,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 { 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 * 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 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":";;;AA2DA,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,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"}
@@ -27,6 +27,12 @@ interface HttpAgentServerAdapterOptions {
27
27
  declare class HttpAgentServerAdapter implements AgentServerAdapter {
28
28
  #private;
29
29
  readonly threadId: string;
30
+ readonly apiUrl: string;
31
+ /**
32
+ * Thread-state reads are SSE-only. WebSocket delegates omit this so
33
+ * {@link StreamController} falls back to `client.threads.getState()`.
34
+ */
35
+ getState?: AgentServerAdapter["getState"];
30
36
  constructor(options: HttpAgentServerAdapterOptions);
31
37
  open(): Promise<void>;
32
38
  send(command: Command): Promise<CommandResponse | ErrorResponse | void>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.d.cts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;UAqCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAMA;EAJA,cAAA,GAAiB,MAAA,SAAe,WAAA;EAUhC;EARA,SAAA,GAAY,mBAAA;EAaZ;EAXA,KAAA,GAAQ,sBAAA;EAW4B;;;AAGtC;;EARE,KAAA,UAAe,KAAA;EAaM;;;;EARrB,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAIT,WAAA,CAAY,OAAA,EAAS,6BAAA;EAsBrB,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":";;;;;UAqCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAMA;EAJA,cAAA,GAAiB,MAAA,SAAe,WAAA;EAUhC;EARA,SAAA,GAAY,mBAAA;EAaZ;EAXA,KAAA,GAAQ,sBAAA;EAW4B;;;AAGtC;;EARE,KAAA,UAAe,KAAA;EAmBJ;;;;EAdX,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAAA,SAEA,MAAA;EAkDiC;;;;EA1C1C,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA4BrB,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"}
@@ -27,6 +27,12 @@ interface HttpAgentServerAdapterOptions {
27
27
  declare class HttpAgentServerAdapter implements AgentServerAdapter {
28
28
  #private;
29
29
  readonly threadId: string;
30
+ readonly apiUrl: string;
31
+ /**
32
+ * Thread-state reads are SSE-only. WebSocket delegates omit this so
33
+ * {@link StreamController} falls back to `client.threads.getState()`.
34
+ */
35
+ getState?: AgentServerAdapter["getState"];
30
36
  constructor(options: HttpAgentServerAdapterOptions);
31
37
  open(): Promise<void>;
32
38
  send(command: Command): Promise<CommandResponse | ErrorResponse | void>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server.d.ts","names":[],"sources":["../../../../src/client/stream/transport/agent-server.ts"],"mappings":";;;;;UAqCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAMA;EAJA,cAAA,GAAiB,MAAA,SAAe,WAAA;EAUhC;EARA,SAAA,GAAY,mBAAA;EAaZ;EAXA,KAAA,GAAQ,sBAAA;EAW4B;;;AAGtC;;EARE,KAAA,UAAe,KAAA;EAaM;;;;EARrB,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAIT,WAAA,CAAY,OAAA,EAAS,6BAAA;EAsBrB,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":";;;;;UAqCiB,6BAAA;EACf,MAAA;EACA,QAAA;EAMA;EAJA,cAAA,GAAiB,MAAA,SAAe,WAAA;EAUhC;EARA,SAAA,GAAY,mBAAA;EAaZ;EAXA,KAAA,GAAQ,sBAAA;EAW4B;;;AAGtC;;EARE,KAAA,UAAe,KAAA;EAmBJ;;;;EAdX,gBAAA,IAAoB,GAAA,aAAgB,SAAA;AAAA;AAAA,cAGzB,sBAAA,YAAkC,kBAAA;EAAA;WACpC,QAAA;EAAA,SAEA,MAAA;EAkDiC;;;;EA1C1C,QAAA,GAAW,kBAAA;EAEX,WAAA,CAAY,OAAA,EAAS,6BAAA;EA4BrB,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"}
@@ -3,9 +3,16 @@ import { ProtocolWebSocketTransportAdapter } from "./websocket.js";
3
3
  //#region src/client/stream/transport/agent-server.ts
4
4
  var HttpAgentServerAdapter = class {
5
5
  threadId;
6
+ apiUrl;
6
7
  #delegate;
8
+ /**
9
+ * Thread-state reads are SSE-only. WebSocket delegates omit this so
10
+ * {@link StreamController} falls back to `client.threads.getState()`.
11
+ */
12
+ getState;
7
13
  constructor(options) {
8
14
  this.threadId = options.threadId;
15
+ this.apiUrl = options.apiUrl;
9
16
  this.#delegate = options.webSocketFactory != null ? new ProtocolWebSocketTransportAdapter({
10
17
  apiUrl: options.apiUrl,
11
18
  threadId: options.threadId,
@@ -21,6 +28,10 @@ var HttpAgentServerAdapter = class {
21
28
  fetch: options.fetch,
22
29
  paths: options.paths
23
30
  });
31
+ if (options.webSocketFactory == null) {
32
+ const sse = this.#delegate;
33
+ this.getState = sse.getState.bind(sse);
34
+ }
24
35
  }
25
36
  open() {
26
37
  return this.#delegate.open();
@@ -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 { 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 * 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 #delegate: TransportAdapter;\n\n constructor(options: HttpAgentServerAdapterOptions) {\n this.threadId = options.threadId;\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 paths: options.paths,\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":";;;AA2DA,IAAa,yBAAb,MAAkE;CAChE;CAEA;CAEA,YAAY,SAAwC;AAClD,OAAK,WAAW,QAAQ;AACxB,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,OAAO,QAAQ;GAChB,CAAC;;CAGV,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 { 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 * 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 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":";;;AA2DA,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,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,7 +1,7 @@
1
+ const require_sse = require("../../../utils/sse.cjs");
2
+ const require_stream = require("../../../utils/stream.cjs");
1
3
  const require_queue = require("./queue.cjs");
2
4
  const require_utils = require("./utils.cjs");
3
- const require_decoder = require("./decoder.cjs");
4
- const require_stream = require("./stream.cjs");
5
5
  //#region src/client/stream/transport/http.ts
6
6
  /**
7
7
  * Transport adapter that speaks the thread-centric protocol over HTTP
@@ -11,14 +11,15 @@ const require_stream = require("./stream.cjs");
11
11
  */
12
12
  var ProtocolSseTransportAdapter = class {
13
13
  threadId;
14
+ apiUrl;
14
15
  queue = new require_queue.AsyncQueue();
15
16
  fetchImpl;
16
- apiUrl;
17
17
  defaultHeaders;
18
18
  onRequest;
19
19
  fetchFactory;
20
20
  commandsUrl;
21
21
  streamUrl;
22
+ stateUrl;
22
23
  sessionAbortController = new AbortController();
23
24
  eventStreams = /* @__PURE__ */ new Set();
24
25
  closed = false;
@@ -31,6 +32,30 @@ var ProtocolSseTransportAdapter = class {
31
32
  this.threadId = options.threadId;
32
33
  this.commandsUrl = options.paths?.commands ?? `/threads/${this.threadId}/commands`;
33
34
  this.streamUrl = options.paths?.stream ?? `/threads/${this.threadId}/stream/events`;
35
+ this.stateUrl = options.paths?.state ?? `/threads/${this.threadId}/state`;
36
+ }
37
+ /**
38
+ * Fetch checkpointed thread state for hydration.
39
+ *
40
+ * Uses `GET`, matching `client.threads.getState()` and both LangGraph
41
+ * Platform and Agent Protocol custom backends (`POST` is reserved for
42
+ * `updateState`).
43
+ */
44
+ async getState() {
45
+ const url = require_utils.toAbsoluteUrl(this.apiUrl, this.stateUrl);
46
+ let requestInit = {
47
+ method: "GET",
48
+ headers: require_utils.mergeHeaders(this.defaultHeaders, {})
49
+ };
50
+ if (this.onRequest) requestInit = await this.onRequest(url, requestInit);
51
+ const response = await (await this.resolveFetch())(url.toString(), requestInit);
52
+ if (response.status === 404) return null;
53
+ if (!response.ok) {
54
+ const error = require_utils.toError(/* @__PURE__ */ new Error(`Thread state request failed: ${response.status} ${response.statusText}`));
55
+ error.status = response.status;
56
+ throw error;
57
+ }
58
+ return await response.json();
34
59
  }
35
60
  async resolveFetch() {
36
61
  if (this.fetchFactory) return await this.fetchFactory();
@@ -103,7 +128,7 @@ var ProtocolSseTransportAdapter = class {
103
128
  resolveReady();
104
129
  const stream = (response.body ?? new ReadableStream({ start(controller) {
105
130
  controller.close();
106
- } })).pipeThrough(require_decoder.BytesLineDecoder()).pipeThrough(require_decoder.SSEDecoder());
131
+ } })).pipeThrough(require_sse.BytesLineDecoder()).pipeThrough(require_sse.SSEDecoder());
107
132
  const iterable = require_stream.IterableReadableStream.fromReadableStream(stream);
108
133
  for await (const event of iterable) {
109
134
  if (ac.signal.aborted || this.closed) break;
@@ -1 +1 @@
1
- {"version":3,"file":"http.cjs","names":["AsyncQueue","isProtocolResponse","BytesLineDecoder","SSEDecoder","IterableReadableStream","isRecord","toAbsoluteUrl","mergeHeaders","toError"],"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 {\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 \"./decoder.js\";\nimport { IterableReadableStream } from \"./stream.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 private readonly queue = new AsyncQueue<Message>();\n\n private readonly fetchImpl: typeof fetch;\n\n private readonly apiUrl: string;\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 commandsUrl: string;\n\n private readonly streamUrl: 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.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 }\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 const since = (params as SubscribeParams & { since?: unknown }).since;\n\n const startStream = async () => {\n try {\n const response = await this.request(streamUrl, {\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 ...(typeof since === \"number\" ? { since } : {}),\n }),\n signal: ac.signal,\n });\n\n resolveReady();\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 streamQueue.push(msg);\n }\n }\n streamQueue.close();\n } catch (error) {\n rejectReady(error);\n if (ac.signal.aborted || this.closed) {\n streamQueue.close();\n return;\n }\n streamQueue.close(error);\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(path: string, init: RequestInit): 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 try {\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (!response.ok) {\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 } catch (error) {\n throw toError(error);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.cjs","names":["AsyncQueue","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 {\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\";\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 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.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 const since = (params as SubscribeParams & { since?: unknown }).since;\n\n const startStream = async () => {\n try {\n const response = await this.request(streamUrl, {\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 ...(typeof since === \"number\" ? { since } : {}),\n }),\n signal: ac.signal,\n });\n\n resolveReady();\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 streamQueue.push(msg);\n }\n }\n streamQueue.close();\n } catch (error) {\n rejectReady(error);\n if (ac.signal.aborted || this.closed) {\n streamQueue.close();\n return;\n }\n streamQueue.close(error);\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(path: string, init: RequestInit): 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 try {\n const fetchImpl = await this.resolveFetch();\n const response = await fetchImpl(url.toString(), requestInit);\n if (!response.ok) {\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 } catch (error) {\n throw toError(error);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AA+BA,IAAa,8BAAb,MAAqE;CACnE;CAEA;CAEA,QAAyB,IAAIA,cAAAA,YAAqB;CAElD;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,yBAA0C,IAAI,iBAAiB;CAE/D,+BAAgC,IAAI,KAAsB;CAE1D,SAAiB;CAEjB,YAAY,SAAsC;AAChD,OAAK,YAAY,QAAQ,SAAS;AAClC,OAAK,SAAS,QAAQ;AACtB,OAAK,iBAAiB,QAAQ,kBAAkB,EAAE;AAClD,OAAK,YAAY,QAAQ;AACzB,OAAK,eAAe,QAAQ;AAC5B,OAAK,WAAW,QAAQ;AACxB,OAAK,cACH,QAAQ,OAAO,YAAY,YAAY,KAAK,SAAS;AACvD,OAAK,YACH,QAAQ,OAAO,UAAU,YAAY,KAAK,SAAS;AACrD,OAAK,WAAW,QAAQ,OAAO,SAAS,YAAY,KAAK,SAAS;;;;;;;;;CAUpE,MAAM,WAOI;EACR,MAAM,MAAMC,cAAAA,cAAc,KAAK,QAAQ,KAAK,SAAS;EACrD,IAAI,cAA2B;GAC7B,QAAQ;GACR,SAASC,cAAAA,aAAa,KAAK,gBAAgB,EAAE,CAAC;GAC/C;AAED,MAAI,KAAK,UACP,eAAc,MAAM,KAAK,UAAU,KAAK,YAAY;EAItD,MAAM,WAAW,OADC,MAAM,KAAK,cAAc,EACV,IAAI,UAAU,EAAE,YAAY;AAC7D,MAAI,SAAS,WAAW,IAAK,QAAO;AACpC,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,QAAQC,cAAAA,wBACZ,IAAI,MACF,gCAAgC,SAAS,OAAO,GAAG,SAAS,aAC7D,CACF;AACD,SAAM,SAAS,SAAS;AACxB,SAAM;;AAGR,SAAQ,MAAM,SAAS,MAAM;;CAU/B,MAAc,eAAsC;AAClD,MAAI,KAAK,aACP,QAAO,MAAM,KAAK,cAAc;AAElC,SAAO,KAAK;;;;;;CAOd,MAAM,OAAsB;CAI5B,MAAM,KACJ,SACiD;EACjD,MAAM,WAAW,MAAM,KAAK,QAAQ,KAAK,aAAa;GACpD,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,QAAQ;GAC7B,QAAQ,KAAK,uBAAuB;GACrC,CAAC;AAEF,MAAI,SAAS,WAAW,OAAO,SAAS,WAAW,IACjD;EAGF,MAAM,UAAW,MAAM,SAAS,MAAM;AACtC,MAAI,CAACC,cAAAA,mBAAmB,QAAQ,CAC9B,OAAM,IAAI,MAAM,oDAAoD;AAEtE,SAAO;;;;;;;CAQT,SAAiC;EAC/B,MAAM,QAAQ,KAAK;AACnB,SAAO,GACJ,OAAO,uBAAuB;GAC7B,MAAM,YAAY,MAAM,MAAM,OAAO;GACrC,QAAQ,YAAY;AAClB,UAAM,OAAO;AACb,WAAO;KAAE,MAAM;KAAM,OAAO,KAAA;KAAW;;GAE1C,GACF;;CAGH,gBAAgB,QAA4C;AAC1D,MAAI,KAAK,OACP,OAAM,IAAI,MAAM,gCAAgC;EAGlD,MAAM,KAAK,IAAI,iBAAiB;AAChC,OAAK,aAAa,IAAI,GAAG;EACzB,MAAM,cAAc,IAAIJ,cAAAA,YAAqB;EAC7C,MAAM,YAAY,KAAK;EAEvB,IAAI;EACJ,IAAI;EACJ,MAAM,QAAQ,IAAI,SAAe,SAAS,WAAW;AACnD,kBAAe;AACf,iBAAc;IACd;EAEF,MAAM,QAAS,OAAiD;EAEhE,MAAM,cAAc,YAAY;AAC9B,OAAI;IACF,MAAM,WAAW,MAAM,KAAK,QAAQ,WAAW;KAC7C,QAAQ;KACR,SAAS;MACP,gBAAgB;MAChB,QAAQ;MACT;KACD,MAAM,KAAK,UAAU;MACnB,UAAU,OAAO;MACjB,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,YAAY,GAAG,EAAE;MAC9D,GAAI,OAAO,SAAS,OAAO,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;MACvD,GAAI,OAAO,UAAU,WAAW,EAAE,OAAO,GAAG,EAAE;MAC/C,CAAC;KACF,QAAQ,GAAG;KACZ,CAAC;AAEF,kBAAc;IAUd,MAAM,UAPJ,SAAS,QACT,IAAI,eAA2B,EAC7B,MAAM,YAAY;AAChB,gBAAW,OAAO;OAErB,CAAC,EAGD,YAAYK,YAAAA,kBAAkB,CAAC,CAC/B,YAAYC,YAAAA,YAAY,CAAC;IAC5B,MAAM,WAAWC,eAAAA,uBAAuB,mBAAmB,OAAO;AAElE,eAAW,MAAM,SAAS,UAAU;AAClC,SAAI,GAAG,OAAO,WAAW,KAAK,OAC5B;AAEF,SAAIC,cAAAA,SAAS,MAAM,KAAK,EAAE;MACxB,MAAM,MAAM,MAAM;AAIlB,kBAAY,KAAK,IAAI;;;AAGzB,gBAAY,OAAO;YACZ,OAAO;AACd,gBAAY,MAAM;AAClB,QAAI,GAAG,OAAO,WAAW,KAAK,QAAQ;AACpC,iBAAY,OAAO;AACnB;;AAEF,gBAAY,MAAM,MAAM;;;AAIvB,eAAa;EAElB,MAAM,gBAAgB;AACpB,QAAK,aAAa,OAAO,GAAG;AAC5B,MAAG,OAAO;AACV,eAAY,OAAO;;AAGrB,SAAO;GACL,QAAQ,GACL,OAAO,uBAAuB;IAC7B,MAAM,YAAY,MAAM,YAAY,OAAO;IAC3C,QAAQ,YAAY;AAClB,cAAS;AACT,YAAO;MAAE,MAAM;MAAM,OAAO,KAAA;MAAW;;IAE1C,GACF;GACD;GACA,OAAO;GACR;;CAGH,MAAM,QAAuB;AAC3B,MAAI,KAAK,OACP;AAEF,OAAK,SAAS;AACd,OAAK,uBAAuB,OAAO;AACnC,OAAK,MAAM,MAAM,KAAK,aAAc,IAAG,OAAO;AAC9C,OAAK,aAAa,OAAO;AACzB,OAAK,MAAM,OAAO;;CAGpB,MAAc,QAAQ,MAAc,MAAsC;EACxE,MAAM,MAAMP,cAAAA,cAAc,KAAK,QAAQ,KAAK;EAC5C,IAAI,cAA2B;GAC7B,GAAG;GACH,SAASC,cAAAA,aAAa,KAAK,gBAAgB,KAAK,QAAQ;GACzD;AAED,MAAI,KAAK,UACP,eAAc,MAAM,KAAK,UAAU,KAAK,YAAY;AAGtD,MAAI;GAEF,MAAM,WAAW,OADC,MAAM,KAAK,cAAc,EACV,IAAI,UAAU,EAAE,YAAY;AAC7D,OAAI,CAAC,SAAS,IAAI;IAChB,IAAI,SAAS;AACb,QAAI;KACF,MAAM,OAAO,MAAM,SAAS,MAAM;KAClC,MAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAI,OAAO,WAAW,YAAY,UAAU,KAC1C,UACI,OAAmC,WACnC,OAAmC,SACrC;AAEJ,SAAI,CAAC,OAAQ,UAAS;YAChB;IAGR,MAAM,UAAU,SACZ,4BAA4B,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WACxE,4BAA4B,SAAS,OAAO,GAAG,SAAS;AAC5D,UAAM,IAAI,MAAM,QAAQ;;AAE1B,UAAO;WACA,OAAO;AACd,SAAMC,cAAAA,QAAQ,MAAM"}
@@ -11,18 +11,38 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
11
11
  */
12
12
  declare class ProtocolSseTransportAdapter implements TransportAdapter {
13
13
  readonly threadId: string;
14
+ readonly apiUrl: string;
14
15
  private readonly queue;
15
16
  private readonly fetchImpl;
16
- private readonly apiUrl;
17
17
  private readonly defaultHeaders;
18
18
  private readonly onRequest?;
19
19
  private readonly fetchFactory?;
20
20
  private readonly commandsUrl;
21
21
  private readonly streamUrl;
22
+ private readonly stateUrl;
22
23
  private readonly sessionAbortController;
23
24
  private readonly eventStreams;
24
25
  private closed;
25
26
  constructor(options: ProtocolSseTransportOptions);
27
+ /**
28
+ * Fetch checkpointed thread state for hydration.
29
+ *
30
+ * Uses `GET`, matching `client.threads.getState()` and both LangGraph
31
+ * Platform and Agent Protocol custom backends (`POST` is reserved for
32
+ * `updateState`).
33
+ */
34
+ getState<StateType = unknown>(): Promise<{
35
+ values: StateType;
36
+ next?: unknown;
37
+ tasks?: unknown;
38
+ metadata?: unknown;
39
+ checkpoint?: {
40
+ checkpoint_id?: string;
41
+ } | null;
42
+ parent_checkpoint?: {
43
+ checkpoint_id?: string;
44
+ } | null;
45
+ } | null>;
26
46
  private resolveFetch;
27
47
  /**
28
48
  * HTTP/SSE transports have no handshake — connections are made
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.cts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AA+BA;;;;cAAa,2BAAA,YAAuC,gBAAA;EAAA,SACzC,QAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,MAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EAAA,QAaP,YAAA;EAnCG;;;;EA8CX,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAxCZ;;;;;EAgEjB,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAiGpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
1
+ {"version":3,"file":"http.d.cts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AA+BA;;;;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,SAAA;EAAA,iBAEA,QAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EA3B6B;;;;;;;EAgD5C,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;EAiGpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
@@ -11,18 +11,38 @@ import { Command, CommandResponse, ErrorResponse, Message, SubscribeParams } fro
11
11
  */
12
12
  declare class ProtocolSseTransportAdapter implements TransportAdapter {
13
13
  readonly threadId: string;
14
+ readonly apiUrl: string;
14
15
  private readonly queue;
15
16
  private readonly fetchImpl;
16
- private readonly apiUrl;
17
17
  private readonly defaultHeaders;
18
18
  private readonly onRequest?;
19
19
  private readonly fetchFactory?;
20
20
  private readonly commandsUrl;
21
21
  private readonly streamUrl;
22
+ private readonly stateUrl;
22
23
  private readonly sessionAbortController;
23
24
  private readonly eventStreams;
24
25
  private closed;
25
26
  constructor(options: ProtocolSseTransportOptions);
27
+ /**
28
+ * Fetch checkpointed thread state for hydration.
29
+ *
30
+ * Uses `GET`, matching `client.threads.getState()` and both LangGraph
31
+ * Platform and Agent Protocol custom backends (`POST` is reserved for
32
+ * `updateState`).
33
+ */
34
+ getState<StateType = unknown>(): Promise<{
35
+ values: StateType;
36
+ next?: unknown;
37
+ tasks?: unknown;
38
+ metadata?: unknown;
39
+ checkpoint?: {
40
+ checkpoint_id?: string;
41
+ } | null;
42
+ parent_checkpoint?: {
43
+ checkpoint_id?: string;
44
+ } | null;
45
+ } | null>;
26
46
  private resolveFetch;
27
47
  /**
28
48
  * HTTP/SSE transports have no handshake — connections are made
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AA+BA;;;;cAAa,2BAAA,YAAuC,gBAAA;EAAA,SACzC,QAAA;EAAA,iBAEQ,KAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,MAAA;EAAA,iBAEA,cAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,YAAA;EAAA,iBAEA,WAAA;EAAA,iBAEA,SAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EAAA,QAaP,YAAA;EAnCG;;;;EA8CX,IAAA,CAAA,GAAQ,OAAA;EAIR,IAAA,CACJ,OAAA,EAAS,OAAA,GACR,OAAA,CAAQ,eAAA,GAAkB,aAAA;EAxCZ;;;;;EAgEjB,MAAA,CAAA,GAAU,aAAA,CAAc,OAAA;EAaxB,eAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,iBAAA;EAiGpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}
1
+ {"version":3,"file":"http.d.ts","names":[],"sources":["../../../../src/client/stream/transport/http.ts"],"mappings":";;;;;;;AA+BA;;;;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,SAAA;EAAA,iBAEA,QAAA;EAAA,iBAEA,sBAAA;EAAA,iBAEA,YAAA;EAAA,QAET,MAAA;EAER,WAAA,CAAY,OAAA,EAAS,2BAAA;EA3B6B;;;;;;;EAgD5C,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;EAiGpC,KAAA,CAAA,GAAS,OAAA;EAAA,QAWD,OAAA;AAAA"}