@langchain/react 0.0.1 → 0.1.0

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 (208) hide show
  1. package/README.md +60 -3
  2. package/dist/index.d.cts +3 -3
  3. package/dist/index.d.cts.map +1 -1
  4. package/dist/index.d.ts +3 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/channels/base.d.cts +1 -1
  7. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/channels/base.d.cts.map +1 -1
  8. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/channels/base.d.ts +1 -1
  9. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/channels/base.d.ts.map +1 -1
  10. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/constants.d.cts +42 -0
  11. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/constants.d.cts.map +1 -0
  12. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/constants.d.ts +42 -0
  13. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/constants.d.ts.map +1 -0
  14. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/index.d.cts +0 -1
  15. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/index.d.ts +0 -1
  16. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.cts +3 -2
  17. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.cts.map +1 -0
  18. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.ts +3 -2
  19. package/dist/node_modules/.pnpm/@langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.ts.map +1 -0
  20. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/plugin.d.cts +2 -2
  21. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/plugin.d.cts.map +1 -1
  22. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/plugin.d.ts +2 -2
  23. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/plugin.d.ts.map +1 -1
  24. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/zod-registry.d.cts +4 -4
  25. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/zod-registry.d.cts.map +1 -1
  26. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/zod-registry.d.ts +4 -4
  27. package/dist/node_modules/.pnpm/{@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7 → @langchain_langgraph@1.2.1_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___z_dc6decfb18baf112a7d3c3203e2e3228}/node_modules/@langchain/langgraph/dist/graph/zod/zod-registry.d.ts.map +1 -1
  28. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/ReactAgent.d.cts +1 -0
  29. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/ReactAgent.d.ts +1 -0
  30. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/index.d.cts +1 -0
  31. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/index.d.ts +1 -0
  32. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/contextEditing.d.cts +1 -0
  33. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/contextEditing.d.ts +1 -0
  34. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/dynamicSystemPrompt.d.cts +1 -0
  35. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/dynamicSystemPrompt.d.ts +1 -0
  36. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/hitl.d.cts +1 -0
  37. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/hitl.d.ts +1 -0
  38. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/llmToolSelector.d.cts +1 -0
  39. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/llmToolSelector.d.ts +1 -0
  40. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelCallLimit.d.cts +1 -0
  41. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelCallLimit.d.ts +1 -0
  42. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelFallback.d.cts +1 -0
  43. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelFallback.d.ts +1 -0
  44. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelRetry.d.cts +1 -0
  45. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/modelRetry.d.ts +1 -0
  46. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/pii.d.cts +1 -0
  47. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/pii.d.ts +1 -0
  48. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/piiRedaction.d.cts +1 -0
  49. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/piiRedaction.d.ts +1 -0
  50. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/provider/anthropic/promptCaching.d.cts +1 -0
  51. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/provider/anthropic/promptCaching.d.ts +1 -0
  52. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/provider/openai/moderation.d.cts +1 -0
  53. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/provider/openai/moderation.d.ts +1 -0
  54. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/summarization.d.cts +1 -0
  55. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/summarization.d.ts +1 -0
  56. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/todoListMiddleware.d.cts +1 -0
  57. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/todoListMiddleware.d.ts +1 -0
  58. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolCallLimit.d.cts +1 -0
  59. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolCallLimit.d.ts +1 -0
  60. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolEmulator.d.cts +1 -0
  61. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolEmulator.d.ts +1 -0
  62. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolRetry.d.cts +1 -0
  63. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/toolRetry.d.ts +1 -0
  64. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/types.d.cts +2 -0
  65. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware/types.d.ts +2 -0
  66. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware.d.cts +1 -0
  67. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/agents/middleware.d.ts +1 -0
  68. package/dist/node_modules/.pnpm/{langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd → langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0}/node_modules/langchain/dist/agents/types.d.cts +0 -1
  69. package/dist/node_modules/.pnpm/{langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd → langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0}/node_modules/langchain/dist/agents/types.d.ts +0 -1
  70. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/index.d.cts +2 -0
  71. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_openai@6.27.0_ws@8.19.0_zod@4.3.6___openai@6.27_afd3ba7574abac8ef5d4f1eb16ab2ab0/node_modules/langchain/dist/index.d.ts +2 -0
  72. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/ZodError.d.cts +1 -1
  73. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/ZodError.d.cts.map +1 -1
  74. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/ZodError.d.ts +1 -1
  75. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/ZodError.d.ts.map +1 -1
  76. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/errorUtil.d.cts +1 -1
  77. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/errorUtil.d.cts.map +1 -1
  78. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/errorUtil.d.ts +1 -1
  79. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/errorUtil.d.ts.map +1 -1
  80. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/parseUtil.d.cts +1 -1
  81. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/parseUtil.d.cts.map +1 -1
  82. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/parseUtil.d.ts +1 -1
  83. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/parseUtil.d.ts.map +1 -1
  84. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/typeAliases.d.cts +1 -1
  85. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/typeAliases.d.cts.map +1 -1
  86. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/typeAliases.d.ts +1 -1
  87. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/typeAliases.d.ts.map +1 -1
  88. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/util.d.cts +1 -1
  89. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/util.d.cts.map +1 -1
  90. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/util.d.ts +1 -1
  91. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/helpers/util.d.ts.map +1 -1
  92. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/standard-schema.d.cts +1 -1
  93. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/standard-schema.d.cts.map +1 -1
  94. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/standard-schema.d.ts +1 -1
  95. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/standard-schema.d.ts.map +1 -1
  96. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/types.d.cts +1 -1
  97. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/types.d.cts.map +1 -1
  98. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/types.d.ts +1 -1
  99. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v3/types.d.ts.map +1 -1
  100. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/checks.d.cts +1 -1
  101. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/checks.d.cts.map +1 -1
  102. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/checks.d.ts +1 -1
  103. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/checks.d.ts.map +1 -1
  104. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/core.d.cts +1 -1
  105. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/core.d.cts.map +1 -1
  106. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/core.d.ts +1 -1
  107. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/core.d.ts.map +1 -1
  108. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/errors.d.cts +1 -1
  109. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/errors.d.cts.map +1 -1
  110. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/errors.d.ts +1 -1
  111. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/errors.d.ts.map +1 -1
  112. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/json-schema.d.cts +1 -1
  113. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/json-schema.d.cts.map +1 -1
  114. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/json-schema.d.ts +1 -1
  115. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/json-schema.d.ts.map +1 -1
  116. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/registries.d.cts +1 -1
  117. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/registries.d.cts.map +1 -1
  118. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/registries.d.ts +1 -1
  119. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/registries.d.ts.map +1 -1
  120. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/schemas.d.cts +1 -1
  121. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/schemas.d.cts.map +1 -1
  122. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/schemas.d.ts +1 -1
  123. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/schemas.d.ts.map +1 -1
  124. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/standard-schema.d.cts +1 -1
  125. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/standard-schema.d.cts.map +1 -1
  126. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/standard-schema.d.ts +1 -1
  127. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/standard-schema.d.ts.map +1 -1
  128. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/to-json-schema.d.cts +1 -1
  129. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/to-json-schema.d.cts.map +1 -1
  130. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/to-json-schema.d.ts +1 -1
  131. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/to-json-schema.d.ts.map +1 -1
  132. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/util.d.cts +1 -1
  133. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/util.d.cts.map +1 -1
  134. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/util.d.ts +1 -1
  135. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/util.d.ts.map +1 -1
  136. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/versions.d.cts +1 -1
  137. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/versions.d.cts.map +1 -1
  138. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/versions.d.ts +1 -1
  139. package/dist/node_modules/.pnpm/{zod@4.3.5 → zod@4.3.6}/node_modules/zod/v4/core/versions.d.ts.map +1 -1
  140. package/dist/react-ui/client.d.cts +7 -3
  141. package/dist/react-ui/client.d.cts.map +1 -1
  142. package/dist/react-ui/client.d.ts +7 -3
  143. package/dist/react-ui/client.d.ts.map +1 -1
  144. package/dist/stream.cjs.map +1 -1
  145. package/dist/stream.custom.cjs +15 -1
  146. package/dist/stream.custom.cjs.map +1 -1
  147. package/dist/stream.custom.d.ts +0 -1
  148. package/dist/stream.custom.js +16 -2
  149. package/dist/stream.custom.js.map +1 -1
  150. package/dist/stream.d.cts +28 -5
  151. package/dist/stream.d.cts.map +1 -1
  152. package/dist/stream.d.ts +28 -5
  153. package/dist/stream.d.ts.map +1 -1
  154. package/dist/stream.js.map +1 -1
  155. package/dist/stream.lgp.cjs +41 -24
  156. package/dist/stream.lgp.cjs.map +1 -1
  157. package/dist/stream.lgp.js +42 -25
  158. package/dist/stream.lgp.js.map +1 -1
  159. package/dist/types.d.cts +3 -3
  160. package/dist/types.d.cts.map +1 -1
  161. package/dist/types.d.ts +3 -3
  162. package/dist/types.d.ts.map +1 -1
  163. package/package.json +23 -22
  164. package/LICENSE +0 -21
  165. package/dist/node_modules/.pnpm/@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.cts.map +0 -1
  166. package/dist/node_modules/.pnpm/@langchain_langgraph@1.1.5_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___z_0d5e45651b6fb9f696195862204d53c7/node_modules/@langchain/langgraph/dist/graph/zod/meta.d.ts.map +0 -1
  167. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/ReactAgent.d.cts +0 -3
  168. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/ReactAgent.d.ts +0 -3
  169. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/index.d.cts +0 -4
  170. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/index.d.ts +0 -4
  171. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/contextEditing.d.cts +0 -3
  172. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/contextEditing.d.ts +0 -3
  173. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/dynamicSystemPrompt.d.cts +0 -1
  174. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/dynamicSystemPrompt.d.ts +0 -1
  175. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/hitl.d.cts +0 -1
  176. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/hitl.d.ts +0 -1
  177. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/llmToolSelector.d.cts +0 -1
  178. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/llmToolSelector.d.ts +0 -1
  179. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelCallLimit.d.cts +0 -1
  180. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelCallLimit.d.ts +0 -1
  181. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelFallback.d.cts +0 -1
  182. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelFallback.d.ts +0 -1
  183. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelRetry.d.cts +0 -1
  184. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/modelRetry.d.ts +0 -1
  185. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/pii.d.cts +0 -1
  186. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/pii.d.ts +0 -1
  187. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/piiRedaction.d.cts +0 -1
  188. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/piiRedaction.d.ts +0 -1
  189. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/provider/anthropic/promptCaching.d.cts +0 -1
  190. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/provider/anthropic/promptCaching.d.ts +0 -1
  191. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/provider/openai/moderation.d.cts +0 -1
  192. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/provider/openai/moderation.d.ts +0 -1
  193. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/summarization.d.cts +0 -2
  194. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/summarization.d.ts +0 -2
  195. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/todoListMiddleware.d.cts +0 -2
  196. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/todoListMiddleware.d.ts +0 -2
  197. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolCallLimit.d.cts +0 -1
  198. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolCallLimit.d.ts +0 -1
  199. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolEmulator.d.cts +0 -1
  200. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolEmulator.d.ts +0 -1
  201. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolRetry.d.cts +0 -1
  202. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/toolRetry.d.ts +0 -1
  203. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/types.d.cts +0 -3
  204. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware/types.d.ts +0 -3
  205. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware.d.cts +0 -2
  206. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/agents/middleware.d.ts +0 -2
  207. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/index.d.cts +0 -23
  208. package/dist/node_modules/.pnpm/langchain@1.2.27_@langchain_core@1.1.28_openai@6.16.0_ws@8.19.0_zod@4.3.5___openai@6.16_37b31122102851880bcc0afaeba68edd/node_modules/langchain/dist/index.d.ts +0 -23
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.cts","names":[],"sources":["../src/stream.tsx"],"mappings":";;;;;;KA8BK,uBAAA,MACH,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;;AAhBmD;;;;KAuBpD,iBAAA,MAAuB,IAAA,CAC1B,CAAA;EAGA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,+BACQ,CAAA;EAEvB,SAAA,EAAW,CAAA;IAAY,SAAA;EAAA,IACnB,uBAAA,CAAwB,EAAA;AAAA,6CAIJ,CAAA;EAExB,YAAA,EAAc,CAAA;IACZ,YAAA,GAAe,OAAA;EAAA,KAEZ,OAAA,EAAS,SAAA,KAAkB,uBAAA,CAAwB,EAAA;AAAA;;;;;;;;AA5BzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqLP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAvBgB,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KAC5C,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;iBAkB3C,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KAC9D,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA"}
1
+ {"version":3,"file":"stream.d.cts","names":[],"sources":["../src/stream.tsx"],"mappings":";;;;;;KAoCK,uBAAA,MACH,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;AAAA,KAEM,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA;;;;;;KAQP,iBAAA,MAAuB,IAAA,CAC1B,CAAA;EAYA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,4BACK,CAAA;EAEpB,MAAA,EAAQ,CAAA;IACN,MAAA,GAAS,MAAA,WAAiB,OAAA;EAAA,KAGtB,MAAA,EACI,kBAAA,CAAmB,OAAA,CAAQ,CAAA,yCAG/B,OAAA,GAAU,CAAA,KACP,GAAA;AAAA,0CAIY,CAAA;EAErB,SAAA,EAAW,CAAA;IAAY,SAAA;EAAA,IACnB,uBAAA,CAAwB,EAAA;AAAA,6CAIJ,CAAA;EAExB,YAAA,EAAc,CAAA;IACZ,YAAA,GAAe,OAAA;EAAA,KAEZ,OAAA,EAAS,SAAA,KAAkB,uBAAA,CAAwB,EAAA;AAAA,0CAInC,CAAA;EAErB,SAAA,EAAW,CAAA;IACT,SAAA,EAAW,GAAA,SAET,uBAAA;EAAA,IAGA,GAAA,SAAY,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAEpD,eAAA,EAAiB,CAAA;IACf,eAAA,EAAiB,uBAAA;EAAA,IAMf,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAExC,WAAA,EAAa,CAAA;IACX,WAAA,GACE,EAAA,aACG,uBAAA;EAAA,KAGD,UAAA,aACG,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAE7C,kBAAA,EAAoB,CAAA;IAClB,kBAAA,GACE,IAAA,aACG,uBAAA;EAAA,KAEF,IAAA,aAAiB,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAE1D,qBAAA,EAAuB,CAAA;IACrB,qBAAA,GACE,EAAA,aACG,uBAAA;EAAA,KAEF,SAAA,aAAsB,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;AAAA;;;;;;;;;;;;AAhGrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyPc,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KAC5C,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;iBAkB3C,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KAC9D,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA"}
package/dist/stream.d.ts CHANGED
@@ -1,19 +1,26 @@
1
1
  import { UseStreamCustomOptions } from "./types.js";
2
- import { InferBag, InferStateType, MessageMetadata, ResolveStreamInterface, ResolveStreamOptions } from "@langchain/langgraph-sdk/ui";
2
+ import { AcceptBaseMessages, InferBag, InferStateType, MessageMetadata, ResolveStreamInterface, ResolveStreamOptions, SubagentStreamInterface } from "@langchain/langgraph-sdk/ui";
3
3
  import { AIMessage, BaseMessage, ToolMessage } from "@langchain/core/messages";
4
- import { BagTemplate, ToolCallWithResult } from "@langchain/langgraph-sdk";
4
+ import { BagTemplate, DefaultToolCall, ToolCallWithResult } from "@langchain/langgraph-sdk";
5
5
 
6
6
  //#region src/stream.d.ts
7
7
  type ClassToolCallWithResult<T> = T extends ToolCallWithResult<infer TC, unknown, unknown> ? ToolCallWithResult<TC, ToolMessage, AIMessage> : T;
8
+ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages"> & {
9
+ messages: BaseMessage[];
10
+ };
8
11
  /**
9
12
  * Maps a stream interface to use @langchain/core BaseMessage class instances
10
13
  * instead of plain Message objects for the `messages` property, and remaps
11
14
  * tool call types to use @langchain/core message classes.
12
15
  */
13
- type WithClassMessages<T> = Omit<T, "messages" | "getMessagesMetadata" | "toolCalls" | "getToolCalls"> & {
16
+ type WithClassMessages<T> = Omit<T, "messages" | "getMessagesMetadata" | "toolCalls" | "getToolCalls" | "submit" | "subagents" | "activeSubagents" | "getSubagent" | "getSubagentsByType" | "getSubagentsByMessage"> & {
14
17
  messages: BaseMessage[];
15
18
  getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata<Record<string, unknown>> | undefined;
16
- } & ("toolCalls" extends keyof T ? {
19
+ } & ("submit" extends keyof T ? {
20
+ submit: T extends {
21
+ submit: (values: infer V, options?: infer O) => infer Ret;
22
+ } ? (values: AcceptBaseMessages<Exclude<V, null | undefined>> | null | undefined, options?: O) => Ret : never;
23
+ } : unknown) & ("toolCalls" extends keyof T ? {
17
24
  toolCalls: T extends {
18
25
  toolCalls: (infer TC)[];
19
26
  } ? ClassToolCallWithResult<TC>[] : never;
@@ -21,6 +28,22 @@ type WithClassMessages<T> = Omit<T, "messages" | "getMessagesMetadata" | "toolCa
21
28
  getToolCalls: T extends {
22
29
  getToolCalls: (message: infer _M) => (infer TC)[];
23
30
  } ? (message: AIMessage) => ClassToolCallWithResult<TC>[] : never;
31
+ } : unknown) & ("subagents" extends keyof T ? {
32
+ subagents: T extends {
33
+ subagents: Map<string, SubagentStreamInterface<infer S, infer TC, infer N>>;
34
+ } ? Map<string, ClassSubagentStreamInterface<S, TC, N>> : never;
35
+ activeSubagents: T extends {
36
+ activeSubagents: SubagentStreamInterface<infer S, infer TC, infer N>[];
37
+ } ? ClassSubagentStreamInterface<S, TC, N>[] : never;
38
+ getSubagent: T extends {
39
+ getSubagent: (id: string) => SubagentStreamInterface<infer S, infer TC, infer N> | undefined;
40
+ } ? (toolCallId: string) => ClassSubagentStreamInterface<S, TC, N> | undefined : never;
41
+ getSubagentsByType: T extends {
42
+ getSubagentsByType: (type: string) => SubagentStreamInterface<infer S, infer TC, infer N>[];
43
+ } ? (type: string) => ClassSubagentStreamInterface<S, TC, N>[] : never;
44
+ getSubagentsByMessage: T extends {
45
+ getSubagentsByMessage: (id: string) => SubagentStreamInterface<infer S, infer TC, infer N>[];
46
+ } ? (messageId: string) => ClassSubagentStreamInterface<S, TC, N>[] : never;
24
47
  } : unknown);
25
48
  /**
26
49
  * A React hook that provides seamless integration with LangGraph streaming capabilities.
@@ -189,5 +212,5 @@ declare function useStream<T = Record<string, unknown>, Bag extends BagTemplate
189
212
  */
190
213
  declare function useStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(options: UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;
191
214
  //#endregion
192
- export { useStream };
215
+ export { ClassSubagentStreamInterface, useStream };
193
216
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","names":[],"sources":["../src/stream.tsx"],"mappings":";;;;;;KA8BK,uBAAA,MACH,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;;AAhBmD;;;;KAuBpD,iBAAA,MAAuB,IAAA,CAC1B,CAAA;EAGA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,+BACQ,CAAA;EAEvB,SAAA,EAAW,CAAA;IAAY,SAAA;EAAA,IACnB,uBAAA,CAAwB,EAAA;AAAA,6CAIJ,CAAA;EAExB,YAAA,EAAc,CAAA;IACZ,YAAA,GAAe,OAAA;EAAA,KAEZ,OAAA,EAAS,SAAA,KAAkB,uBAAA,CAAwB,EAAA;AAAA;;;;;;;;AA5BzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqLP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAvBgB,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KAC5C,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;iBAkB3C,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KAC9D,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA"}
1
+ {"version":3,"file":"stream.d.ts","names":[],"sources":["../src/stream.tsx"],"mappings":";;;;;;KAoCK,uBAAA,MACH,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;AAAA,KAEM,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA;;;;;;KAQP,iBAAA,MAAuB,IAAA,CAC1B,CAAA;EAYA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,4BACK,CAAA;EAEpB,MAAA,EAAQ,CAAA;IACN,MAAA,GAAS,MAAA,WAAiB,OAAA;EAAA,KAGtB,MAAA,EACI,kBAAA,CAAmB,OAAA,CAAQ,CAAA,yCAG/B,OAAA,GAAU,CAAA,KACP,GAAA;AAAA,0CAIY,CAAA;EAErB,SAAA,EAAW,CAAA;IAAY,SAAA;EAAA,IACnB,uBAAA,CAAwB,EAAA;AAAA,6CAIJ,CAAA;EAExB,YAAA,EAAc,CAAA;IACZ,YAAA,GAAe,OAAA;EAAA,KAEZ,OAAA,EAAS,SAAA,KAAkB,uBAAA,CAAwB,EAAA;AAAA,0CAInC,CAAA;EAErB,SAAA,EAAW,CAAA;IACT,SAAA,EAAW,GAAA,SAET,uBAAA;EAAA,IAGA,GAAA,SAAY,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAEpD,eAAA,EAAiB,CAAA;IACf,eAAA,EAAiB,uBAAA;EAAA,IAMf,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAExC,WAAA,EAAa,CAAA;IACX,WAAA,GACE,EAAA,aACG,uBAAA;EAAA,KAGD,UAAA,aACG,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAE7C,kBAAA,EAAoB,CAAA;IAClB,kBAAA,GACE,IAAA,aACG,uBAAA;EAAA,KAEF,IAAA,aAAiB,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;EAE1D,qBAAA,EAAuB,CAAA;IACrB,qBAAA,GACE,EAAA,aACG,uBAAA;EAAA,KAEF,SAAA,aAAsB,4BAAA,CAA6B,CAAA,EAAG,EAAA,EAAI,CAAA;AAAA;;;;;;;;;;;;AAhGrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyPc,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KAC5C,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;iBAkB3C,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EAAS,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KAC9D,iBAAA,CAAkB,sBAAA,CAAuB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","names":[],"sources":["../src/stream.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type {\n BaseMessage,\n ToolMessage as CoreToolMessage,\n AIMessage as CoreAIMessage,\n} from \"@langchain/core/messages\";\nimport type { BagTemplate, ToolCallWithResult } from \"@langchain/langgraph-sdk\";\nimport type {\n UseStreamOptions,\n ResolveStreamInterface,\n ResolveStreamOptions,\n InferBag,\n InferStateType,\n MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { useStreamLGP } from \"./stream.lgp.js\";\nimport { useStreamCustom } from \"./stream.custom.js\";\nimport type { UseStreamCustomOptions } from \"./types.js\";\n\nfunction isCustomOptions<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options:\n | UseStreamOptions<StateType, Bag>\n | UseStreamCustomOptions<StateType, Bag>,\n): options is UseStreamCustomOptions<StateType, Bag> {\n return \"transport\" in options;\n}\n\ntype ClassToolCallWithResult<T> =\n T extends ToolCallWithResult<infer TC, unknown, unknown>\n ? ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\n/**\n * Maps a stream interface to use @langchain/core BaseMessage class instances\n * instead of plain Message objects for the `messages` property, and remaps\n * tool call types to use @langchain/core message classes.\n */\ntype WithClassMessages<T> = Omit<\n T,\n \"messages\" | \"getMessagesMetadata\" | \"toolCalls\" | \"getToolCalls\"\n> & {\n messages: BaseMessage[];\n getMessagesMetadata: (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined;\n} & (\"toolCalls\" extends keyof T\n ? {\n toolCalls: T extends { toolCalls: (infer TC)[] }\n ? ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown) &\n (\"getToolCalls\" extends keyof T\n ? {\n getToolCalls: T extends {\n getToolCalls: (message: infer _M) => (infer TC)[];\n }\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown);\n\n/**\n * A React hook that provides seamless integration with LangGraph streaming capabilities.\n *\n * The `useStream` hook handles all the complexities of streaming, state management, and branching logic,\n * letting you focus on building great chat experiences. It provides automatic state management for\n * messages, interrupts, loading states, subagent streams, and errors.\n *\n * ## Usage with ReactAgent (recommended for createAgent users)\n *\n * When using `createAgent` from `@langchain/langgraph`, you can pass `typeof agent` as the\n * type parameter to automatically infer tool call types:\n *\n * @example\n * ```typescript\n * // In your agent file (e.g., agent.ts)\n * import { createAgent, tool } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const getWeather = tool(\n * async ({ location }) => `Weather in ${location}`,\n * { name: \"get_weather\", schema: z.object({ location: z.string() }) }\n * );\n *\n * export const agent = createAgent({\n * model: \"openai:gpt-4o\",\n * tools: [getWeather],\n * });\n *\n * // In your React component\n * import { agent } from \"./agent\";\n *\n * function Chat() {\n * // Tool calls are automatically typed from the agent's tools!\n * const stream = useStream<typeof agent>({\n * assistantId: \"agent\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.toolCalls[0].call.name is typed as \"get_weather\"\n * // stream.toolCalls[0].call.args is typed as { location: string }\n * }\n * ```\n *\n * ## Usage with StateGraph (for custom LangGraph applications)\n *\n * When building custom graphs with `StateGraph`, embed your tool call types directly\n * in your state's messages property using `Message<MyToolCalls>`:\n *\n * @example\n * ```typescript\n * import { Message } from \"@langchain/langgraph-sdk\";\n *\n * // Define your tool call types as a discriminated union\n * type MyToolCalls =\n * | { name: \"search\"; args: { query: string }; id?: string }\n * | { name: \"calculate\"; args: { expression: string }; id?: string };\n *\n * // Embed tool call types in your state's messages\n * interface MyGraphState {\n * messages: Message<MyToolCalls>[];\n * context?: string;\n * }\n *\n * function Chat() {\n * const stream = useStream<MyGraphState>({\n * assistantId: \"my-graph\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.values is typed as MyGraphState\n * // stream.toolCalls[0].call.name is typed as \"search\" | \"calculate\"\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With additional type configuration (interrupts, configurable)\n * interface MyGraphState {\n * messages: Message<MyToolCalls>[];\n * }\n *\n * function Chat() {\n * const stream = useStream<MyGraphState, {\n * InterruptType: { question: string };\n * ConfigurableType: { userId: string };\n * }>({\n * assistantId: \"my-graph\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.interrupt is typed as { question: string } | undefined\n * }\n * ```\n *\n * ## Usage with Deep Agents (subagent streaming, experimental)\n *\n * For agents that spawn subagents (nested graphs), use `filterSubagentMessages`\n * to keep the main message stream clean while tracking subagent activity separately:\n *\n * @example\n * ```typescript\n * import { useStream, SubagentStream } from \"@langchain/langgraph-sdk/react\";\n * import type { agent } from \"./agent\";\n *\n * function DeepAgentChat() {\n * const stream = useStream<typeof agent>({\n * assistantId: \"deepagent\",\n * apiUrl: \"http://localhost:2024\",\n * // Filter subagent messages from main stream\n * filterSubagentMessages: true,\n * });\n *\n * const handleSubmit = (content: string) => {\n * stream.submit(\n * { messages: [{ content, type: \"human\" }] },\n * { streamSubgraphs: true } // Enable subgraph streaming\n * );\n * };\n *\n * // Access subagent streams via stream.subagents (Map<string, SubagentStream>)\n * const subagentList = [...stream.subagents.values()];\n *\n * return (\n * <div>\n * {stream.messages.map((msg) => <Message key={msg.id} message={msg} />)}\n *\n * {subagentList.map((subagent) => (\n * <SubagentCard\n * key={subagent.id}\n * status={subagent.status} // \"pending\" | \"running\" | \"complete\" | \"error\"\n * messages={subagent.messages}\n * toolCalls={subagent.toolCalls}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @template T Either a ReactAgent type (with `~agentTypes`) or a state type (`Record<string, unknown>`)\n * @template Bag Type configuration bag containing:\n * - `ConfigurableType`: Type for the `config.configurable` property\n * - `InterruptType`: Type for interrupt values\n * - `CustomEventType`: Type for custom events\n * - `UpdateType`: Type for the submit function updates\n *\n * @see {@link https://docs.langchain.com/langgraph-platform/use-stream-react | LangGraph React Integration Guide}\n */\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: ResolveStreamOptions<T, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n/**\n * A React hook that provides seamless integration with LangGraph streaming capabilities.\n *\n * The `useStream` hook handles all the complexities of streaming, state management, and branching logic,\n * letting you focus on building great chat experiences. It provides automatic state management for\n * messages, interrupts, loading states, and errors.\n *\n * @template T Either a ReactAgent type (with `~agentTypes`) or a state type (`Record<string, unknown>`)\n * @template Bag Type configuration bag containing:\n * - `ConfigurableType`: Type for the `config.configurable` property\n * - `InterruptType`: Type for interrupt values\n * - `CustomEventType`: Type for custom events\n * - `UpdateType`: Type for the submit function updates\n *\n * @see {@link https://docs.langchain.com/langgraph-platform/use-stream-react | LangGraph React Integration Guide}\n */\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useStream(options: any): any {\n // Store this in useState to make sure we're not changing the implementation in re-renders\n const [isCustom] = useState(isCustomOptions(options));\n\n if (isCustom) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStreamCustom(options);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStreamLGP(options);\n}\n"],"mappings":";;;;;AAmBA,SAAS,gBAIP,SAGmD;AACnD,QAAO,eAAe;;AA0NxB,SAAgB,UAAU,SAAmB;CAE3C,MAAM,CAAC,YAAY,SAAS,gBAAgB,QAAQ,CAAC;AAErD,KAAI,SAEF,QAAO,gBAAgB,QAAQ;AAIjC,QAAO,aAAa,QAAQ"}
1
+ {"version":3,"file":"stream.js","names":[],"sources":["../src/stream.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type {\n BaseMessage,\n ToolMessage as CoreToolMessage,\n AIMessage as CoreAIMessage,\n} from \"@langchain/core/messages\";\nimport type {\n BagTemplate,\n ToolCallWithResult,\n DefaultToolCall,\n} from \"@langchain/langgraph-sdk\";\nimport type {\n UseStreamOptions,\n AcceptBaseMessages,\n ResolveStreamInterface,\n ResolveStreamOptions,\n InferBag,\n InferStateType,\n MessageMetadata,\n SubagentStreamInterface,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { useStreamLGP } from \"./stream.lgp.js\";\nimport { useStreamCustom } from \"./stream.custom.js\";\nimport type { UseStreamCustomOptions } from \"./types.js\";\n\nfunction isCustomOptions<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options:\n | UseStreamOptions<StateType, Bag>\n | UseStreamCustomOptions<StateType, Bag>,\n): options is UseStreamCustomOptions<StateType, Bag> {\n return \"transport\" in options;\n}\n\ntype ClassToolCallWithResult<T> =\n T extends ToolCallWithResult<infer TC, unknown, unknown>\n ? ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\nexport type ClassSubagentStreamInterface<\n StateType = Record<string, unknown>,\n ToolCall = DefaultToolCall,\n SubagentName extends string = string,\n> = Omit<\n SubagentStreamInterface<StateType, ToolCall, SubagentName>,\n \"messages\"\n> & {\n messages: BaseMessage[];\n};\n\n/**\n * Maps a stream interface to use @langchain/core BaseMessage class instances\n * instead of plain Message objects for the `messages` property, and remaps\n * tool call types to use @langchain/core message classes.\n */\ntype WithClassMessages<T> = Omit<\n T,\n | \"messages\"\n | \"getMessagesMetadata\"\n | \"toolCalls\"\n | \"getToolCalls\"\n | \"submit\"\n | \"subagents\"\n | \"activeSubagents\"\n | \"getSubagent\"\n | \"getSubagentsByType\"\n | \"getSubagentsByMessage\"\n> & {\n messages: BaseMessage[];\n getMessagesMetadata: (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined;\n} & (\"submit\" extends keyof T\n ? {\n submit: T extends {\n submit: (values: infer V, options?: infer O) => infer Ret;\n }\n ? (\n values:\n | AcceptBaseMessages<Exclude<V, null | undefined>>\n | null\n | undefined,\n options?: O,\n ) => Ret\n : never;\n }\n : unknown) &\n (\"toolCalls\" extends keyof T\n ? {\n toolCalls: T extends { toolCalls: (infer TC)[] }\n ? ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown) &\n (\"getToolCalls\" extends keyof T\n ? {\n getToolCalls: T extends {\n getToolCalls: (message: infer _M) => (infer TC)[];\n }\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown) &\n (\"subagents\" extends keyof T\n ? {\n subagents: T extends {\n subagents: Map<\n string,\n SubagentStreamInterface<infer S, infer TC, infer N>\n >;\n }\n ? Map<string, ClassSubagentStreamInterface<S, TC, N>>\n : never;\n activeSubagents: T extends {\n activeSubagents: SubagentStreamInterface<\n infer S,\n infer TC,\n infer N\n >[];\n }\n ? ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n getSubagent: T extends {\n getSubagent: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N> | undefined;\n }\n ? (\n toolCallId: string,\n ) => ClassSubagentStreamInterface<S, TC, N> | undefined\n : never;\n getSubagentsByType: T extends {\n getSubagentsByType: (\n type: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (type: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n getSubagentsByMessage: T extends {\n getSubagentsByMessage: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (messageId: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n }\n : unknown);\n\n/**\n * A React hook that provides seamless integration with LangGraph streaming capabilities.\n *\n * The `useStream` hook handles all the complexities of streaming, state management, and branching logic,\n * letting you focus on building great chat experiences. It provides automatic state management for\n * messages, interrupts, loading states, subagent streams, and errors.\n *\n * ## Usage with ReactAgent (recommended for createAgent users)\n *\n * When using `createAgent` from `@langchain/langgraph`, you can pass `typeof agent` as the\n * type parameter to automatically infer tool call types:\n *\n * @example\n * ```typescript\n * // In your agent file (e.g., agent.ts)\n * import { createAgent, tool } from \"langchain\";\n * import { z } from \"zod\";\n *\n * const getWeather = tool(\n * async ({ location }) => `Weather in ${location}`,\n * { name: \"get_weather\", schema: z.object({ location: z.string() }) }\n * );\n *\n * export const agent = createAgent({\n * model: \"openai:gpt-4o\",\n * tools: [getWeather],\n * });\n *\n * // In your React component\n * import { agent } from \"./agent\";\n *\n * function Chat() {\n * // Tool calls are automatically typed from the agent's tools!\n * const stream = useStream<typeof agent>({\n * assistantId: \"agent\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.toolCalls[0].call.name is typed as \"get_weather\"\n * // stream.toolCalls[0].call.args is typed as { location: string }\n * }\n * ```\n *\n * ## Usage with StateGraph (for custom LangGraph applications)\n *\n * When building custom graphs with `StateGraph`, embed your tool call types directly\n * in your state's messages property using `Message<MyToolCalls>`:\n *\n * @example\n * ```typescript\n * import { Message } from \"@langchain/langgraph-sdk\";\n *\n * // Define your tool call types as a discriminated union\n * type MyToolCalls =\n * | { name: \"search\"; args: { query: string }; id?: string }\n * | { name: \"calculate\"; args: { expression: string }; id?: string };\n *\n * // Embed tool call types in your state's messages\n * interface MyGraphState {\n * messages: Message<MyToolCalls>[];\n * context?: string;\n * }\n *\n * function Chat() {\n * const stream = useStream<MyGraphState>({\n * assistantId: \"my-graph\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.values is typed as MyGraphState\n * // stream.toolCalls[0].call.name is typed as \"search\" | \"calculate\"\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With additional type configuration (interrupts, configurable)\n * interface MyGraphState {\n * messages: Message<MyToolCalls>[];\n * }\n *\n * function Chat() {\n * const stream = useStream<MyGraphState, {\n * InterruptType: { question: string };\n * ConfigurableType: { userId: string };\n * }>({\n * assistantId: \"my-graph\",\n * apiUrl: \"http://localhost:2024\",\n * });\n *\n * // stream.interrupt is typed as { question: string } | undefined\n * }\n * ```\n *\n * ## Usage with Deep Agents (subagent streaming, experimental)\n *\n * For agents that spawn subagents (nested graphs), use `filterSubagentMessages`\n * to keep the main message stream clean while tracking subagent activity separately:\n *\n * @example\n * ```typescript\n * import { useStream, SubagentStream } from \"@langchain/langgraph-sdk/react\";\n * import type { agent } from \"./agent\";\n *\n * function DeepAgentChat() {\n * const stream = useStream<typeof agent>({\n * assistantId: \"deepagent\",\n * apiUrl: \"http://localhost:2024\",\n * // Filter subagent messages from main stream\n * filterSubagentMessages: true,\n * });\n *\n * const handleSubmit = (content: string) => {\n * stream.submit(\n * { messages: [{ content, type: \"human\" }] },\n * { streamSubgraphs: true } // Enable subgraph streaming\n * );\n * };\n *\n * // Access subagent streams via stream.subagents (Map<string, SubagentStream>)\n * const subagentList = [...stream.subagents.values()];\n *\n * return (\n * <div>\n * {stream.messages.map((msg) => <Message key={msg.id} message={msg} />)}\n *\n * {subagentList.map((subagent) => (\n * <SubagentCard\n * key={subagent.id}\n * status={subagent.status} // \"pending\" | \"running\" | \"complete\" | \"error\"\n * messages={subagent.messages}\n * toolCalls={subagent.toolCalls}\n * />\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @template T Either a ReactAgent type (with `~agentTypes`) or a state type (`Record<string, unknown>`)\n * @template Bag Type configuration bag containing:\n * - `ConfigurableType`: Type for the `config.configurable` property\n * - `InterruptType`: Type for interrupt values\n * - `CustomEventType`: Type for custom events\n * - `UpdateType`: Type for the submit function updates\n *\n * @see {@link https://docs.langchain.com/langgraph-platform/use-stream-react | LangGraph React Integration Guide}\n */\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: ResolveStreamOptions<T, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n/**\n * A React hook that provides seamless integration with LangGraph streaming capabilities.\n *\n * The `useStream` hook handles all the complexities of streaming, state management, and branching logic,\n * letting you focus on building great chat experiences. It provides automatic state management for\n * messages, interrupts, loading states, and errors.\n *\n * @template T Either a ReactAgent type (with `~agentTypes`) or a state type (`Record<string, unknown>`)\n * @template Bag Type configuration bag containing:\n * - `ConfigurableType`: Type for the `config.configurable` property\n * - `InterruptType`: Type for interrupt values\n * - `CustomEventType`: Type for custom events\n * - `UpdateType`: Type for the submit function updates\n *\n * @see {@link https://docs.langchain.com/langgraph-platform/use-stream-react | LangGraph React Integration Guide}\n */\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useStream(options: any): any {\n // Store this in useState to make sure we're not changing the implementation in re-renders\n const [isCustom] = useState(isCustomOptions(options));\n\n if (isCustom) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStreamCustom(options);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useStreamLGP(options);\n}\n"],"mappings":";;;;;AAyBA,SAAS,gBAIP,SAGmD;AACnD,QAAO,eAAe;;AAySxB,SAAgB,UAAU,SAAmB;CAE3C,MAAM,CAAC,YAAY,SAAS,gBAAgB,QAAQ,CAAC;AAErD,KAAI,SAEF,QAAO,gBAAgB,QAAQ;AAIjC,QAAO,aAAa,QAAQ"}
@@ -175,6 +175,7 @@ function useStreamLGP(options) {
175
175
  const [threadId, onThreadId] = require_thread.useControllableThreadId(options);
176
176
  const threadIdRef = (0, react.useRef)(threadId);
177
177
  const threadIdStreamingRef = (0, react.useRef)(null);
178
+ const threadIdPromiseRef = (0, react.useRef)(null);
178
179
  (0, react.useEffect)(() => {
179
180
  if (threadIdRef.current !== threadId) {
180
181
  threadIdRef.current = threadId;
@@ -299,11 +300,13 @@ function useStreamLGP(options) {
299
300
  return { ...prev };
300
301
  });
301
302
  if (!usableThreadId) {
302
- usableThreadId = (await client.threads.create({
303
+ const threadPromise = client.threads.create({
303
304
  threadId: submitOptions?.threadId,
304
305
  metadata: submitOptions?.metadata,
305
306
  signal
306
- })).thread_id;
307
+ });
308
+ threadIdPromiseRef.current = threadPromise.then((t) => t.thread_id);
309
+ usableThreadId = (await threadPromise).thread_id;
307
310
  threadIdRef.current = usableThreadId;
308
311
  threadIdStreamingRef.current = usableThreadId;
309
312
  onThreadId(usableThreadId);
@@ -371,6 +374,7 @@ function useStreamLGP(options) {
371
374
  },
372
375
  onError(error) {
373
376
  options.onError?.(error, callbackMeta);
377
+ submitOptions?.onError?.(error, callbackMeta);
374
378
  },
375
379
  onFinish() {
376
380
  threadIdStreamingRef.current = null;
@@ -380,6 +384,7 @@ function useStreamLGP(options) {
380
384
  const submitDirectRef = (0, react.useRef)(submitDirect);
381
385
  submitDirectRef.current = submitDirect;
382
386
  const submittingRef = (0, react.useRef)(false);
387
+ const drainQueueRef = (0, react.useRef)(() => {});
383
388
  const submit = async (values, submitOptions) => {
384
389
  if (stream.isLoading || submittingRef.current) {
385
390
  if (submitOptions?.multitaskStrategy === "interrupt" || submitOptions?.multitaskStrategy === "rollback") {
@@ -391,27 +396,33 @@ function useStreamLGP(options) {
391
396
  }
392
397
  return;
393
398
  }
394
- const usableThreadId = threadIdRef.current ?? threadId;
399
+ let usableThreadId = threadIdRef.current ?? threadId;
400
+ if (!usableThreadId && threadIdPromiseRef.current) usableThreadId = await threadIdPromiseRef.current;
395
401
  if (usableThreadId) {
396
- const run = await client.runs.create(usableThreadId, options.assistantId, {
397
- input: values,
398
- config: submitOptions?.config,
399
- context: submitOptions?.context,
400
- command: submitOptions?.command,
401
- interruptBefore: submitOptions?.interruptBefore,
402
- interruptAfter: submitOptions?.interruptAfter,
403
- metadata: submitOptions?.metadata,
404
- multitaskStrategy: "enqueue",
405
- streamResumable: true,
406
- streamSubgraphs: submitOptions?.streamSubgraphs,
407
- durability: submitOptions?.durability
408
- });
409
- pendingRuns.add({
410
- id: run.run_id,
411
- values,
412
- options: submitOptions,
413
- createdAt: new Date(run.created_at)
414
- });
402
+ try {
403
+ const run = await client.runs.create(usableThreadId, options.assistantId, {
404
+ input: values,
405
+ config: submitOptions?.config,
406
+ context: submitOptions?.context,
407
+ command: submitOptions?.command,
408
+ interruptBefore: submitOptions?.interruptBefore,
409
+ interruptAfter: submitOptions?.interruptAfter,
410
+ metadata: submitOptions?.metadata,
411
+ multitaskStrategy: "enqueue",
412
+ streamResumable: true,
413
+ streamSubgraphs: submitOptions?.streamSubgraphs,
414
+ durability: submitOptions?.durability
415
+ });
416
+ pendingRuns.add({
417
+ id: run.run_id,
418
+ values,
419
+ options: submitOptions,
420
+ createdAt: new Date(run.created_at)
421
+ });
422
+ } catch (error) {
423
+ options.onError?.(error, void 0);
424
+ submitOptions?.onError?.(error, void 0);
425
+ }
415
426
  return;
416
427
  }
417
428
  }
@@ -420,6 +431,7 @@ function useStreamLGP(options) {
420
431
  await submitDirect(values, submitOptions);
421
432
  } finally {
422
433
  submittingRef.current = false;
434
+ drainQueueRef.current();
423
435
  }
424
436
  };
425
437
  const joinStream = async (runId, lastEventId, joinOptions) => {
@@ -464,16 +476,21 @@ function useStreamLGP(options) {
464
476
  };
465
477
  const joinStreamRef = (0, react.useRef)(joinStream);
466
478
  joinStreamRef.current = joinStream;
467
- (0, react.useEffect)(() => {
479
+ const drainQueue = () => {
468
480
  if (!stream.isLoading && !submittingRef.current && pendingRuns.size > 0) {
469
481
  const next = pendingRuns.shift();
470
482
  if (next) {
471
483
  submittingRef.current = true;
472
484
  joinStreamRef.current(next.id).finally(() => {
473
485
  submittingRef.current = false;
486
+ drainQueue();
474
487
  });
475
488
  }
476
489
  }
490
+ };
491
+ drainQueueRef.current = drainQueue;
492
+ (0, react.useEffect)(() => {
493
+ drainQueueRef.current();
477
494
  }, [stream.isLoading, pendingRuns.size]);
478
495
  const reconnectKey = (0, react.useMemo)(() => {
479
496
  if (!runMetadataStorage || stream.isLoading) return void 0;
@@ -553,7 +570,7 @@ function useStreamLGP(options) {
553
570
  },
554
571
  get messages() {
555
572
  trackStreamMode("messages-tuple", "values");
556
- return getMessages(values);
573
+ return (0, _langchain_langgraph_sdk_ui.ensureMessageInstances)(getMessages(values));
557
574
  },
558
575
  get toolCalls() {
559
576
  trackStreamMode("messages-tuple", "values");
@@ -1 +1 @@
1
- {"version":3,"file":"stream.lgp.cjs","names":["Client","MessageTupleManager","StreamManager","toMessageClass","PendingRunsTracker","useControllableThreadId","StreamError"],"sources":["../src/stream.lgp.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport {\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type {\n Message,\n ThreadState,\n Interrupt,\n StreamMode,\n StreamEvent,\n BagTemplate,\n ToolProgress,\n ToolsStreamEvent,\n} from \"@langchain/langgraph-sdk\";\nimport { Client, getClientConfigHash } from \"@langchain/langgraph-sdk/client\";\nimport {\n filterStream,\n unique,\n StreamError,\n getBranchContext,\n getMessagesMetadataMap,\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n PendingRunsTracker,\n type EventStreamEvent,\n type AnyStreamOptions,\n type UseStreamOptions,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type RunCallbackMeta,\n type MessageMetadata,\n type UseStreamThread,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport type { UseStream, SubmitOptions } from \"./types.js\";\n\nfunction getFetchHistoryKey(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n) {\n return [getClientConfigHash(client), threadId, limit].join(\":\");\n}\n\nfunction fetchHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string,\n options?: { limit?: boolean | number },\n) {\n if (options?.limit === false) {\n return client.threads.getState<StateType>(threadId).then((state) => {\n if (state.checkpoint == null) return [];\n return [state];\n });\n }\n\n const limit = typeof options?.limit === \"number\" ? options.limit : 10;\n return client.threads.getHistory<StateType>(threadId, { limit });\n}\n\nfunction useThreadHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n options: {\n passthrough: boolean;\n submittingRef: RefObject<string | null>;\n onError?: (error: unknown, run?: RunCallbackMeta) => void;\n },\n): UseStreamThread<StateType> {\n const key = getFetchHistoryKey(client, threadId, limit);\n const [state, setState] = useState<{\n key: string | undefined;\n data: ThreadState<StateType>[] | undefined;\n error: unknown | undefined;\n isLoading: boolean;\n }>(() => ({\n key: undefined,\n data: undefined,\n error: undefined,\n isLoading: threadId != null,\n }));\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const onErrorRef = useRef(options?.onError);\n onErrorRef.current = options?.onError;\n\n const fetcher = useCallback(\n (\n threadId: string | undefined | null,\n limit: boolean | number,\n ): Promise<ThreadState<StateType>[]> => {\n // If only passthrough is enabled, don't fetch history\n if (options.passthrough) return Promise.resolve([]);\n\n const client = clientRef.current;\n const key = getFetchHistoryKey(client, threadId, limit);\n\n if (threadId != null) {\n setState((state) => {\n if (state.key === key) return { ...state, isLoading: true };\n return { key, data: undefined, error: undefined, isLoading: true };\n });\n return fetchHistory<StateType>(client, threadId, { limit }).then(\n (data) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data, error: undefined, isLoading: false };\n });\n return data;\n },\n (error) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data: state.data, error, isLoading: false };\n });\n onErrorRef.current?.(error);\n return Promise.reject(error);\n },\n );\n }\n\n setState({ key, data: undefined, error: undefined, isLoading: false });\n return Promise.resolve([]);\n },\n [options.passthrough],\n );\n\n useEffect(() => {\n // Skip if a stream is already in progress, no need to fetch history\n if (\n options.submittingRef.current != null &&\n options.submittingRef.current === threadId\n ) {\n return;\n }\n\n void fetcher(threadId, limit);\n // The `threadId` and `limit` arguments are already present in `key`\n // Thus we don't need to include them in the dependency array\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetcher, key]);\n\n return {\n data: state.data,\n error: state.error,\n isLoading: state.isLoading,\n mutate: (mutateId?: string) => fetcher(mutateId ?? threadId, limit),\n };\n}\n\nfunction useTrackStreamMode() {\n const trackStreamModeRef = useRef<Exclude<StreamMode, \"messages\">[]>([]);\n\n const trackStreamMode = useCallback(\n (...mode: Exclude<StreamMode, \"messages\">[]) => {\n const ref = trackStreamModeRef.current;\n for (const m of mode) {\n if (!ref.includes(m)) ref.push(m);\n }\n },\n [],\n );\n\n return [trackStreamModeRef, trackStreamMode] as [\n typeof trackStreamModeRef,\n typeof trackStreamMode,\n ];\n}\n\nfunction useCallbackStreamMode<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: UseStreamOptions<StateType, Bag>) {\n const hasUpdateListener = options.onUpdateEvent != null;\n const hasCustomListener = options.onCustomEvent != null;\n const hasLangChainListener = options.onLangChainEvent != null;\n const hasDebugListener = options.onDebugEvent != null;\n const hasCheckpointListener = options.onCheckpointEvent != null;\n const hasTaskListener = options.onTaskEvent != null;\n\n return useMemo(() => {\n const modes: Exclude<StreamMode, \"messages\">[] = [];\n if (hasUpdateListener) modes.push(\"updates\");\n if (hasCustomListener) modes.push(\"custom\");\n if (hasLangChainListener) modes.push(\"events\");\n if (hasDebugListener) modes.push(\"debug\");\n if (hasCheckpointListener) modes.push(\"checkpoints\");\n if (hasTaskListener) modes.push(\"tasks\");\n return modes;\n }, [\n hasUpdateListener,\n hasCustomListener,\n hasLangChainListener,\n hasDebugListener,\n hasCheckpointListener,\n hasTaskListener,\n ]);\n}\n\nexport function useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>): UseStream<StateType, Bag> {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\n\n const reconnectOnMountRef = useRef(options.reconnectOnMount);\n const runMetadataStorage = useMemo(() => {\n if (typeof window === \"undefined\") return null;\n const storage = reconnectOnMountRef.current;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\n }, []);\n\n const client = useMemo(\n () =>\n options.client ??\n new Client({\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n callerOptions: options.callerOptions,\n defaultHeaders: options.defaultHeaders,\n }),\n [\n options.client,\n options.apiKey,\n options.apiUrl,\n options.callerOptions,\n options.defaultHeaders,\n ],\n );\n\n const [messageManager] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n toMessage: options.toMessage ?? toMessageClass,\n }),\n );\n\n const [pendingRuns] = useState(\n () =>\n new PendingRunsTracker<\n StateType,\n SubmitOptions<StateType, ConfigurableType>\n >(),\n );\n\n useSyncExternalStore(\n pendingRuns.subscribe,\n pendingRuns.getSnapshot,\n pendingRuns.getSnapshot,\n );\n\n const [trackStreamModeRef, trackStreamMode] = useTrackStreamMode();\n const callbackStreamMode = useCallbackStreamMode(options);\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];\n };\n\n const setMessages = (current: StateType, messages: Message[]): StateType => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot,\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n\n const threadIdRef = useRef<string | null>(threadId);\n const threadIdStreamingRef = useRef<string | null>(null);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const switchThread = useCallback(\n (newThreadId: string | null) => {\n if (newThreadId !== threadIdRef.current) {\n const prevThreadId = threadIdRef.current;\n threadIdRef.current = newThreadId;\n stream.clear();\n\n const removed = pendingRuns.removeAll();\n if (prevThreadId && removed.length > 0) {\n void Promise.all(\n removed.map((e) => client.runs.cancel(prevThreadId, e.id)),\n );\n }\n\n onThreadId(newThreadId);\n }\n },\n [stream, pendingRuns, onThreadId, client],\n );\n\n const historyLimit =\n typeof options.fetchStateHistory === \"object\" &&\n options.fetchStateHistory != null\n ? (options.fetchStateHistory.limit ?? false)\n : (options.fetchStateHistory ?? false);\n\n const builtInHistory = useThreadHistory<StateType>(\n client,\n threadId,\n historyLimit,\n {\n passthrough: options.thread != null,\n submittingRef: threadIdStreamingRef,\n onError: options.onError,\n },\n );\n const history = options.thread ?? builtInHistory;\n\n const [branch, setBranch] = useState<string>(\"\");\n const branchContext = getBranchContext(branch, history.data ?? undefined);\n\n const [toolProgressMap, setToolProgressMap] = useState<\n Map<string, ToolProgress>\n >(new Map());\n\n const handleToolEvent = useCallback((data: ToolsStreamEvent[\"data\"]) => {\n setToolProgressMap((prev) => {\n const next = new Map(prev);\n const key = data.toolCallId ?? data.name;\n const existing = next.get(key);\n\n switch (data.event) {\n case \"on_tool_start\": {\n next.set(key, {\n toolCallId: data.toolCallId,\n name: data.name,\n state: \"starting\",\n input: data.input,\n });\n break;\n }\n case \"on_tool_event\": {\n if (existing) {\n next.set(key, { ...existing, state: \"running\", data: data.data });\n }\n break;\n }\n case \"on_tool_end\": {\n if (existing) {\n next.set(key, {\n ...existing,\n state: \"completed\",\n result: data.output,\n });\n }\n break;\n }\n case \"on_tool_error\": {\n if (existing) {\n next.set(key, { ...existing, state: \"error\", error: data.error });\n }\n break;\n }\n default: {\n throw new Error(\n `Unexpected tool event: ${(data as { event: string }).event}`,\n );\n }\n }\n\n return next;\n });\n }, []);\n\n const historyValues =\n branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType);\n\n // Reconstruct subagents from history when:\n // 1. History is loaded (not loading, has data)\n // 2. No active stream is running\n // 3. Subagent filtering is enabled (otherwise subagents aren't tracked)\n // This ensures subagent visualization persists after page refresh or stream completion\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n !history.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const historyError = (() => {\n const error = branchContext.threadHead?.tasks?.at(-1)?.error;\n if (error == null) return undefined;\n try {\n const parsed = JSON.parse(error) as unknown;\n if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);\n return parsed;\n } catch {\n // do nothing\n }\n return error;\n })();\n\n const messageMetadata = getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history.data,\n getMessages,\n branchContext,\n });\n\n const stop = () =>\n stream.stop(historyValues, {\n onStop: (args) => {\n if (runMetadataStorage && threadId) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId}`);\n if (runId) void client.runs.cancel(threadId, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId}`);\n }\n\n options.onStop?.(args);\n },\n });\n\n // --- TRANSPORT ---\n const submitDirect = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) => {\n setToolProgressMap(new Map());\n\n // Unbranch things\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n setBranch(\n checkpointId != null\n ? (branchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\",\n );\n\n // When `fetchStateHistory` is requested, thus we assume that branching\n // is enabled. We then need to include the implicit branch.\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch =\n // We're expecting the whole thread state in onFinish\n options.onFinish != null ||\n // We're fetching history, thus we need the latest checkpoint\n // to ensure we're not accidentally submitting to a wrong branch\n includeImplicitBranch;\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId = threadId;\n\n const shouldAbortPrevious =\n (submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\") &&\n stream.isLoading;\n\n await stream.start(\n async (signal: AbortSignal) => {\n stream.setStreamValues((values) => {\n const prev = { ...historyValues, ...values };\n if (submitOptions?.optimisticValues != null) {\n return {\n ...prev,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(prev)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...prev };\n });\n\n if (!usableThreadId) {\n const thread = await client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n signal,\n });\n\n usableThreadId = thread.thread_id;\n\n // Pre-emptively update the thread ID before\n // stream cancellation is kicked off and thread\n // is being refetched\n threadIdRef.current = usableThreadId;\n threadIdStreamingRef.current = usableThreadId;\n\n onThreadId(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n threadIdStreamingRef.current = usableThreadId;\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n ...trackStreamModeRef.current,\n ...callbackStreamMode,\n ]);\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? branchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n // Avoid specifying a checkpoint if user explicitly set it to null\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\n const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\n\n return client.runs.stream(usableThreadId, options.assistantId, {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: submitOptions?.multitaskStrategy,\n onCompletion: submitOptions?.onCompletion,\n onDisconnect:\n submitOptions?.onDisconnect ??\n (streamResumable ? \"continue\" : \"cancel\"),\n\n signal,\n\n checkpoint,\n streamMode,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n streamResumable,\n durability: submitOptions?.durability,\n onRunCreated(params) {\n callbackMeta = {\n run_id: params.run_id,\n thread_id: params.thread_id ?? usableThreadId!,\n };\n\n if (runMetadataStorage) {\n rejoinKey = `lg:stream:${usableThreadId}`;\n runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);\n }\n\n options.onCreated?.(callbackMeta);\n },\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch) {\n const newHistory = await history.mutate(usableThreadId!);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n // We now have the latest update from /history\n // Thus we can clear the local stream state\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n }\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n { abortPrevious: shouldAbortPrevious },\n );\n };\n\n const submitDirectRef = useRef(submitDirect);\n submitDirectRef.current = submitDirect;\n\n const submittingRef = useRef(false);\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) => {\n if (stream.isLoading || submittingRef.current) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submittingRef.current = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submittingRef.current = false;\n }\n return;\n }\n\n const usableThreadId = threadIdRef.current ?? threadId;\n if (usableThreadId) {\n const run = await client.runs.create(\n usableThreadId,\n options.assistantId,\n {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: \"enqueue\",\n streamResumable: true,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n durability: submitOptions?.durability,\n },\n );\n\n pendingRuns.add({\n id: run.run_id,\n values: values as Partial<StateType> | null | undefined,\n options: submitOptions,\n createdAt: new Date(run.created_at),\n });\n return;\n }\n }\n\n submittingRef.current = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submittingRef.current = false;\n }\n };\n\n const joinStream = async (\n runId: string,\n lastEventId?: string,\n joinOptions?: {\n streamMode?: StreamMode | StreamMode[];\n filter?: (event: {\n id?: string;\n event: StreamEvent;\n data: unknown;\n }) => boolean;\n },\n ) => {\n setToolProgressMap(new Map());\n\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n if (!threadId) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n threadIdStreamingRef.current = threadId;\n const stream = client.runs.joinStream(threadId, runId, {\n signal,\n lastEventId,\n streamMode: joinOptions?.streamMode,\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n\n return joinOptions?.filter != null\n ? filterStream(stream, joinOptions.filter)\n : stream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId}`);\n const newHistory = await history.mutate(threadId);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n );\n };\n\n const joinStreamRef = useRef<typeof joinStream>(joinStream);\n joinStreamRef.current = joinStream;\n\n // Drain pending server-side runs when the stream finishes\n useEffect(() => {\n if (!stream.isLoading && !submittingRef.current && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submittingRef.current = true;\n void joinStreamRef.current(next.id).finally(() => {\n submittingRef.current = false;\n });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [stream.isLoading, pendingRuns.size]);\n\n const reconnectKey = useMemo(() => {\n if (!runMetadataStorage || stream.isLoading) return undefined;\n if (typeof window === \"undefined\") return undefined;\n const runId = runMetadataStorage?.getItem(`lg:stream:${threadId}`);\n if (!runId) return undefined;\n return { runId, threadId };\n }, [runMetadataStorage, stream.isLoading, threadId]);\n\n const shouldReconnect = !!runMetadataStorage;\n const reconnectRef = useRef({ threadId, shouldReconnect });\n\n useEffect(() => {\n // reset shouldReconnect when switching threads\n if (reconnectRef.current.threadId !== threadId) {\n reconnectRef.current = { threadId, shouldReconnect };\n }\n }, [threadId, shouldReconnect]);\n\n useEffect(() => {\n if (reconnectKey && reconnectRef.current.shouldReconnect) {\n reconnectRef.current.shouldReconnect = false;\n void joinStreamRef.current?.(reconnectKey.runId);\n }\n }, [reconnectKey]);\n\n const error = stream.error ?? historyError ?? history.error;\n const values = stream.values ?? historyValues;\n\n return {\n get values() {\n trackStreamMode(\"values\");\n return values;\n },\n\n client,\n assistantId: options.assistantId,\n\n error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n switchThread,\n\n joinStream,\n\n branch,\n setBranch,\n\n get history() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n\n return branchContext.flatHistory;\n },\n\n isThreadLoading: history.isLoading && history.data == null,\n\n get experimental_branchTree() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n\n return branchContext.branchTree;\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (stream.isLoading) return [];\n\n // Collect interrupts from ALL tasks (not just the last one)\n const allTasks = branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n if (allInterrupts.length > 0) {\n return allInterrupts as Interrupt<InterruptType>[];\n }\n\n // check if there's a next task present (breakpoint-style interrupt)\n const next = branchContext.threadHead?.next ?? [];\n if (!next.length || error != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n\n get interrupt() {\n return extractInterrupts<InterruptType>(values, {\n error,\n isLoading: stream.isLoading,\n threadState: branchContext.threadHead,\n });\n },\n\n get messages(): BaseMessage[] {\n trackStreamMode(\"messages-tuple\", \"values\");\n return getMessages(values) as unknown as BaseMessage[];\n },\n\n get toolCalls() {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n get toolProgress(): ToolProgress[] {\n trackStreamMode(\"tools\");\n return Array.from(toolProgressMap.values());\n },\n\n getToolCalls(message) {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n getMessagesMetadata(\n message: BaseMessage,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n trackStreamMode(\"values\");\n\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata?.find(\n (m) => m.messageId === (message.id ?? index),\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n },\n\n get subagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByMessage(messageId);\n },\n\n queue: {\n get entries() {\n return pendingRuns.entries;\n },\n get size() {\n return pendingRuns.size;\n },\n async cancel(id: string) {\n const usableThreadId = threadIdRef.current ?? threadId;\n const removed = pendingRuns.remove(id);\n if (removed && usableThreadId) {\n await client.runs.cancel(usableThreadId, id);\n }\n return removed;\n },\n async clear() {\n const usableThreadId = threadIdRef.current ?? threadId;\n const removed = pendingRuns.removeAll();\n if (usableThreadId && removed.length > 0) {\n await Promise.all(\n removed.map((e) => client.runs.cancel(usableThreadId!, e.id)),\n );\n }\n },\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.lgp.cjs","names":["Client","MessageTupleManager","StreamManager","toMessageClass","PendingRunsTracker","useControllableThreadId","StreamError"],"sources":["../src/stream.lgp.tsx"],"sourcesContent":["/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */\n\n\"use client\";\n\nimport {\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type {\n Message,\n ThreadState,\n Interrupt,\n StreamMode,\n StreamEvent,\n BagTemplate,\n ToolProgress,\n ToolsStreamEvent,\n} from \"@langchain/langgraph-sdk\";\nimport { Client, getClientConfigHash } from \"@langchain/langgraph-sdk/client\";\nimport {\n filterStream,\n unique,\n StreamError,\n getBranchContext,\n getMessagesMetadataMap,\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n PendingRunsTracker,\n type EventStreamEvent,\n type AnyStreamOptions,\n type UseStreamOptions,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type RunCallbackMeta,\n type MessageMetadata,\n type UseStreamThread,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport { useControllableThreadId } from \"./thread.js\";\nimport type { UseStream, SubmitOptions } from \"./types.js\";\n\nfunction getFetchHistoryKey(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n) {\n return [getClientConfigHash(client), threadId, limit].join(\":\");\n}\n\nfunction fetchHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string,\n options?: { limit?: boolean | number },\n) {\n if (options?.limit === false) {\n return client.threads.getState<StateType>(threadId).then((state) => {\n if (state.checkpoint == null) return [];\n return [state];\n });\n }\n\n const limit = typeof options?.limit === \"number\" ? options.limit : 10;\n return client.threads.getHistory<StateType>(threadId, { limit });\n}\n\nfunction useThreadHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string | undefined | null,\n limit: boolean | number,\n options: {\n passthrough: boolean;\n submittingRef: RefObject<string | null>;\n onError?: (error: unknown, run?: RunCallbackMeta) => void;\n },\n): UseStreamThread<StateType> {\n const key = getFetchHistoryKey(client, threadId, limit);\n const [state, setState] = useState<{\n key: string | undefined;\n data: ThreadState<StateType>[] | undefined;\n error: unknown | undefined;\n isLoading: boolean;\n }>(() => ({\n key: undefined,\n data: undefined,\n error: undefined,\n isLoading: threadId != null,\n }));\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const onErrorRef = useRef(options?.onError);\n onErrorRef.current = options?.onError;\n\n const fetcher = useCallback(\n (\n threadId: string | undefined | null,\n limit: boolean | number,\n ): Promise<ThreadState<StateType>[]> => {\n // If only passthrough is enabled, don't fetch history\n if (options.passthrough) return Promise.resolve([]);\n\n const client = clientRef.current;\n const key = getFetchHistoryKey(client, threadId, limit);\n\n if (threadId != null) {\n setState((state) => {\n if (state.key === key) return { ...state, isLoading: true };\n return { key, data: undefined, error: undefined, isLoading: true };\n });\n return fetchHistory<StateType>(client, threadId, { limit }).then(\n (data) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data, error: undefined, isLoading: false };\n });\n return data;\n },\n (error) => {\n setState((state) => {\n if (state.key !== key) return state;\n return { key, data: state.data, error, isLoading: false };\n });\n onErrorRef.current?.(error);\n return Promise.reject(error);\n },\n );\n }\n\n setState({ key, data: undefined, error: undefined, isLoading: false });\n return Promise.resolve([]);\n },\n [options.passthrough],\n );\n\n useEffect(() => {\n // Skip if a stream is already in progress, no need to fetch history\n if (\n options.submittingRef.current != null &&\n options.submittingRef.current === threadId\n ) {\n return;\n }\n\n void fetcher(threadId, limit);\n // The `threadId` and `limit` arguments are already present in `key`\n // Thus we don't need to include them in the dependency array\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetcher, key]);\n\n return {\n data: state.data,\n error: state.error,\n isLoading: state.isLoading,\n mutate: (mutateId?: string) => fetcher(mutateId ?? threadId, limit),\n };\n}\n\nfunction useTrackStreamMode() {\n const trackStreamModeRef = useRef<Exclude<StreamMode, \"messages\">[]>([]);\n\n const trackStreamMode = useCallback(\n (...mode: Exclude<StreamMode, \"messages\">[]) => {\n const ref = trackStreamModeRef.current;\n for (const m of mode) {\n if (!ref.includes(m)) ref.push(m);\n }\n },\n [],\n );\n\n return [trackStreamModeRef, trackStreamMode] as [\n typeof trackStreamModeRef,\n typeof trackStreamMode,\n ];\n}\n\nfunction useCallbackStreamMode<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: UseStreamOptions<StateType, Bag>) {\n const hasUpdateListener = options.onUpdateEvent != null;\n const hasCustomListener = options.onCustomEvent != null;\n const hasLangChainListener = options.onLangChainEvent != null;\n const hasDebugListener = options.onDebugEvent != null;\n const hasCheckpointListener = options.onCheckpointEvent != null;\n const hasTaskListener = options.onTaskEvent != null;\n\n return useMemo(() => {\n const modes: Exclude<StreamMode, \"messages\">[] = [];\n if (hasUpdateListener) modes.push(\"updates\");\n if (hasCustomListener) modes.push(\"custom\");\n if (hasLangChainListener) modes.push(\"events\");\n if (hasDebugListener) modes.push(\"debug\");\n if (hasCheckpointListener) modes.push(\"checkpoints\");\n if (hasTaskListener) modes.push(\"tasks\");\n return modes;\n }, [\n hasUpdateListener,\n hasCustomListener,\n hasLangChainListener,\n hasDebugListener,\n hasCheckpointListener,\n hasTaskListener,\n ]);\n}\n\nexport function useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>): UseStream<StateType, Bag> {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\n\n const reconnectOnMountRef = useRef(options.reconnectOnMount);\n const runMetadataStorage = useMemo(() => {\n if (typeof window === \"undefined\") return null;\n const storage = reconnectOnMountRef.current;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\n }, []);\n\n const client = useMemo(\n () =>\n options.client ??\n new Client({\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n callerOptions: options.callerOptions,\n defaultHeaders: options.defaultHeaders,\n }),\n [\n options.client,\n options.apiKey,\n options.apiUrl,\n options.callerOptions,\n options.defaultHeaders,\n ],\n );\n\n const [messageManager] = useState(() => new MessageTupleManager());\n const [stream] = useState(\n () =>\n new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n toMessage: options.toMessage ?? toMessageClass,\n }),\n );\n\n const [pendingRuns] = useState(\n () =>\n new PendingRunsTracker<\n StateType,\n SubmitOptions<StateType, ConfigurableType>\n >(),\n );\n\n useSyncExternalStore(\n pendingRuns.subscribe,\n pendingRuns.getSnapshot,\n pendingRuns.getSnapshot,\n );\n\n const [trackStreamModeRef, trackStreamMode] = useTrackStreamMode();\n const callbackStreamMode = useCallbackStreamMode(options);\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];\n };\n\n const setMessages = (current: StateType, messages: Message[]): StateType => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n useSyncExternalStore(\n stream.subscribe,\n stream.getSnapshot,\n stream.getSnapshot,\n );\n\n const [threadId, onThreadId] = useControllableThreadId(options);\n\n const threadIdRef = useRef<string | null>(threadId);\n const threadIdStreamingRef = useRef<string | null>(null);\n const threadIdPromiseRef = useRef<Promise<string> | null>(null);\n\n // Cancel the stream if thread ID has changed\n useEffect(() => {\n if (threadIdRef.current !== threadId) {\n threadIdRef.current = threadId;\n stream.clear();\n }\n }, [threadId, stream]);\n\n const switchThread = useCallback(\n (newThreadId: string | null) => {\n if (newThreadId !== threadIdRef.current) {\n const prevThreadId = threadIdRef.current;\n threadIdRef.current = newThreadId;\n stream.clear();\n\n const removed = pendingRuns.removeAll();\n if (prevThreadId && removed.length > 0) {\n void Promise.all(\n removed.map((e) => client.runs.cancel(prevThreadId, e.id)),\n );\n }\n\n onThreadId(newThreadId);\n }\n },\n [stream, pendingRuns, onThreadId, client],\n );\n\n const historyLimit =\n typeof options.fetchStateHistory === \"object\" &&\n options.fetchStateHistory != null\n ? (options.fetchStateHistory.limit ?? false)\n : (options.fetchStateHistory ?? false);\n\n const builtInHistory = useThreadHistory<StateType>(\n client,\n threadId,\n historyLimit,\n {\n passthrough: options.thread != null,\n submittingRef: threadIdStreamingRef,\n onError: options.onError,\n },\n );\n const history = options.thread ?? builtInHistory;\n\n const [branch, setBranch] = useState<string>(\"\");\n const branchContext = getBranchContext(branch, history.data ?? undefined);\n\n const [toolProgressMap, setToolProgressMap] = useState<\n Map<string, ToolProgress>\n >(new Map());\n\n const handleToolEvent = useCallback((data: ToolsStreamEvent[\"data\"]) => {\n setToolProgressMap((prev) => {\n const next = new Map(prev);\n const key = data.toolCallId ?? data.name;\n const existing = next.get(key);\n\n switch (data.event) {\n case \"on_tool_start\": {\n next.set(key, {\n toolCallId: data.toolCallId,\n name: data.name,\n state: \"starting\",\n input: data.input,\n });\n break;\n }\n case \"on_tool_event\": {\n if (existing) {\n next.set(key, { ...existing, state: \"running\", data: data.data });\n }\n break;\n }\n case \"on_tool_end\": {\n if (existing) {\n next.set(key, {\n ...existing,\n state: \"completed\",\n result: data.output,\n });\n }\n break;\n }\n case \"on_tool_error\": {\n if (existing) {\n next.set(key, { ...existing, state: \"error\", error: data.error });\n }\n break;\n }\n default: {\n throw new Error(\n `Unexpected tool event: ${(data as { event: string }).event}`,\n );\n }\n }\n\n return next;\n });\n }, []);\n\n const historyValues =\n branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType);\n\n // Reconstruct subagents from history when:\n // 1. History is loaded (not loading, has data)\n // 2. No active stream is running\n // 3. Subagent filtering is enabled (otherwise subagents aren't tracked)\n // This ensures subagent visualization persists after page refresh or stream completion\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n !history.isLoading &&\n historyMessages.length > 0;\n\n useEffect(() => {\n if (shouldReconstructSubagents) {\n // skipIfPopulated: true ensures we don't overwrite subagents from active streaming\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n // We intentionally only run this when shouldReconstructSubagents changes\n // to avoid unnecessary reconstructions during streaming\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldReconstructSubagents, historyMessages.length]);\n\n const historyError = (() => {\n const error = branchContext.threadHead?.tasks?.at(-1)?.error;\n if (error == null) return undefined;\n try {\n const parsed = JSON.parse(error) as unknown;\n if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);\n return parsed;\n } catch {\n // do nothing\n }\n return error;\n })();\n\n const messageMetadata = getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history.data,\n getMessages,\n branchContext,\n });\n\n const stop = () =>\n stream.stop(historyValues, {\n onStop: (args) => {\n if (runMetadataStorage && threadId) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId}`);\n if (runId) void client.runs.cancel(threadId, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId}`);\n }\n\n options.onStop?.(args);\n },\n });\n\n // --- TRANSPORT ---\n const submitDirect = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) => {\n setToolProgressMap(new Map());\n\n // Unbranch things\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n setBranch(\n checkpointId != null\n ? (branchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\",\n );\n\n // When `fetchStateHistory` is requested, thus we assume that branching\n // is enabled. We then need to include the implicit branch.\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch =\n // We're expecting the whole thread state in onFinish\n options.onFinish != null ||\n // We're fetching history, thus we need the latest checkpoint\n // to ensure we're not accidentally submitting to a wrong branch\n includeImplicitBranch;\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId = threadId;\n\n const shouldAbortPrevious =\n (submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\") &&\n stream.isLoading;\n\n await stream.start(\n async (signal: AbortSignal) => {\n stream.setStreamValues((values) => {\n const prev = { ...historyValues, ...values };\n if (submitOptions?.optimisticValues != null) {\n return {\n ...prev,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(prev)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...prev };\n });\n\n if (!usableThreadId) {\n const threadPromise = client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n signal,\n });\n\n threadIdPromiseRef.current = threadPromise.then((t) => t.thread_id);\n\n const thread = await threadPromise;\n\n usableThreadId = thread.thread_id;\n\n // Pre-emptively update the thread ID before\n // stream cancellation is kicked off and thread\n // is being refetched\n threadIdRef.current = usableThreadId;\n threadIdStreamingRef.current = usableThreadId;\n\n onThreadId(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n threadIdStreamingRef.current = usableThreadId;\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n ...trackStreamModeRef.current,\n ...callbackStreamMode,\n ]);\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? branchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n // Avoid specifying a checkpoint if user explicitly set it to null\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\n const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\n\n return client.runs.stream(usableThreadId, options.assistantId, {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: submitOptions?.multitaskStrategy,\n onCompletion: submitOptions?.onCompletion,\n onDisconnect:\n submitOptions?.onDisconnect ??\n (streamResumable ? \"continue\" : \"cancel\"),\n\n signal,\n\n checkpoint,\n streamMode,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n streamResumable,\n durability: submitOptions?.durability,\n onRunCreated(params) {\n callbackMeta = {\n run_id: params.run_id,\n thread_id: params.thread_id ?? usableThreadId!,\n };\n\n if (runMetadataStorage) {\n rejoinKey = `lg:stream:${usableThreadId}`;\n runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);\n }\n\n options.onCreated?.(callbackMeta);\n },\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch) {\n const newHistory = await history.mutate(usableThreadId!);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n // We now have the latest update from /history\n // Thus we can clear the local stream state\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n }\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n submitOptions?.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n { abortPrevious: shouldAbortPrevious },\n );\n };\n\n const submitDirectRef = useRef(submitDirect);\n submitDirectRef.current = submitDirect;\n\n const submittingRef = useRef(false);\n const drainQueueRef = useRef<() => void>(() => {});\n\n const submit = async (\n values: UpdateType | null | undefined,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) => {\n if (stream.isLoading || submittingRef.current) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submittingRef.current = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submittingRef.current = false;\n }\n return;\n }\n\n let usableThreadId = threadIdRef.current ?? threadId;\n if (!usableThreadId && threadIdPromiseRef.current) {\n usableThreadId = await threadIdPromiseRef.current;\n }\n if (usableThreadId) {\n try {\n const run = await client.runs.create(\n usableThreadId,\n options.assistantId,\n {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: \"enqueue\",\n streamResumable: true,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n durability: submitOptions?.durability,\n },\n );\n\n pendingRuns.add({\n id: run.run_id,\n values: values as Partial<StateType> | null | undefined,\n options: submitOptions,\n createdAt: new Date(run.created_at),\n });\n } catch (error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n }\n return;\n }\n }\n\n submittingRef.current = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submittingRef.current = false;\n drainQueueRef.current();\n }\n };\n\n const joinStream = async (\n runId: string,\n lastEventId?: string,\n joinOptions?: {\n streamMode?: StreamMode | StreamMode[];\n filter?: (event: {\n id?: string;\n event: StreamEvent;\n data: unknown;\n }) => boolean;\n },\n ) => {\n setToolProgressMap(new Map());\n\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n if (!threadId) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n threadIdStreamingRef.current = threadId;\n const stream = client.runs.joinStream(threadId, runId, {\n signal,\n lastEventId,\n streamMode: joinOptions?.streamMode,\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n\n return joinOptions?.filter != null\n ? filterStream(stream, joinOptions.filter)\n : stream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues,\n callbacks: {\n ...options,\n onToolEvent: (data, opts) => {\n handleToolEvent(data);\n options.onToolEvent?.(data, opts);\n },\n },\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId}`);\n const newHistory = await history.mutate(threadId);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish() {\n threadIdStreamingRef.current = null;\n },\n },\n );\n };\n\n const joinStreamRef = useRef<typeof joinStream>(joinStream);\n joinStreamRef.current = joinStream;\n\n const drainQueue = () => {\n if (!stream.isLoading && !submittingRef.current && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submittingRef.current = true;\n void joinStreamRef.current(next.id).finally(() => {\n submittingRef.current = false;\n drainQueue();\n });\n }\n }\n };\n\n drainQueueRef.current = drainQueue;\n\n // Drain pending server-side runs when the stream finishes\n useEffect(() => {\n drainQueueRef.current();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [stream.isLoading, pendingRuns.size]);\n\n const reconnectKey = useMemo(() => {\n if (!runMetadataStorage || stream.isLoading) return undefined;\n if (typeof window === \"undefined\") return undefined;\n const runId = runMetadataStorage?.getItem(`lg:stream:${threadId}`);\n if (!runId) return undefined;\n return { runId, threadId };\n }, [runMetadataStorage, stream.isLoading, threadId]);\n\n const shouldReconnect = !!runMetadataStorage;\n const reconnectRef = useRef({ threadId, shouldReconnect });\n\n useEffect(() => {\n // reset shouldReconnect when switching threads\n if (reconnectRef.current.threadId !== threadId) {\n reconnectRef.current = { threadId, shouldReconnect };\n }\n }, [threadId, shouldReconnect]);\n\n useEffect(() => {\n if (reconnectKey && reconnectRef.current.shouldReconnect) {\n reconnectRef.current.shouldReconnect = false;\n void joinStreamRef.current?.(reconnectKey.runId);\n }\n }, [reconnectKey]);\n\n const error = stream.error ?? historyError ?? history.error;\n const values = stream.values ?? historyValues;\n\n return {\n get values() {\n trackStreamMode(\"values\");\n return values;\n },\n\n client,\n assistantId: options.assistantId,\n\n error,\n isLoading: stream.isLoading,\n\n stop,\n submit,\n switchThread,\n\n joinStream,\n\n branch,\n setBranch,\n\n get history() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n\n return branchContext.flatHistory;\n },\n\n isThreadLoading: history.isLoading && history.data == null,\n\n get experimental_branchTree() {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n\n return branchContext.branchTree;\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (stream.isLoading) return [];\n\n // Collect interrupts from ALL tasks (not just the last one)\n const allTasks = branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n if (allInterrupts.length > 0) {\n return allInterrupts as Interrupt<InterruptType>[];\n }\n\n // check if there's a next task present (breakpoint-style interrupt)\n const next = branchContext.threadHead?.next ?? [];\n if (!next.length || error != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n\n get interrupt() {\n return extractInterrupts<InterruptType>(values, {\n error,\n isLoading: stream.isLoading,\n threadState: branchContext.threadHead,\n });\n },\n\n get messages(): BaseMessage[] {\n trackStreamMode(\"messages-tuple\", \"values\");\n return ensureMessageInstances(getMessages(values)) as BaseMessage[];\n },\n\n get toolCalls() {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n return getToolCallsWithResults<ToolCallType>(msgs);\n },\n\n get toolProgress(): ToolProgress[] {\n trackStreamMode(\"tools\");\n return Array.from(toolProgressMap.values());\n },\n\n getToolCalls(message) {\n trackStreamMode(\"messages-tuple\", \"values\");\n const msgs = getMessages(values) as Message<ToolCallType>[];\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n getMessagesMetadata(\n message: BaseMessage,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n trackStreamMode(\"values\");\n\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata?.find(\n (m) => m.messageId === (message.id ?? index),\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n },\n\n get subagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n trackStreamMode(\"updates\", \"messages-tuple\");\n return stream.getSubagentsByMessage(messageId);\n },\n\n queue: {\n get entries() {\n return pendingRuns.entries;\n },\n get size() {\n return pendingRuns.size;\n },\n async cancel(id: string) {\n const usableThreadId = threadIdRef.current ?? threadId;\n const removed = pendingRuns.remove(id);\n if (removed && usableThreadId) {\n await client.runs.cancel(usableThreadId, id);\n }\n return removed;\n },\n async clear() {\n const usableThreadId = threadIdRef.current ?? threadId;\n const removed = pendingRuns.removeAll();\n if (usableThreadId && removed.length > 0) {\n await Promise.all(\n removed.map((e) => client.runs.cancel(usableThreadId!, e.id)),\n );\n }\n },\n },\n };\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  import { useControllableThreadId } from "./thread.js";
4
4
  import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
5
5
  import { Client, getClientConfigHash } from "@langchain/langgraph-sdk/client";
6
- import { MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, extractInterrupts, filterStream, getBranchContext, getMessagesMetadataMap, toMessageClass, unique } from "@langchain/langgraph-sdk/ui";
6
+ import { MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, ensureMessageInstances, extractInterrupts, filterStream, getBranchContext, getMessagesMetadataMap, toMessageClass, unique } from "@langchain/langgraph-sdk/ui";
7
7
  import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
8
8
 
9
9
  //#region src/stream.lgp.tsx
@@ -174,6 +174,7 @@ function useStreamLGP(options) {
174
174
  const [threadId, onThreadId] = useControllableThreadId(options);
175
175
  const threadIdRef = useRef(threadId);
176
176
  const threadIdStreamingRef = useRef(null);
177
+ const threadIdPromiseRef = useRef(null);
177
178
  useEffect(() => {
178
179
  if (threadIdRef.current !== threadId) {
179
180
  threadIdRef.current = threadId;
@@ -298,11 +299,13 @@ function useStreamLGP(options) {
298
299
  return { ...prev };
299
300
  });
300
301
  if (!usableThreadId) {
301
- usableThreadId = (await client.threads.create({
302
+ const threadPromise = client.threads.create({
302
303
  threadId: submitOptions?.threadId,
303
304
  metadata: submitOptions?.metadata,
304
305
  signal
305
- })).thread_id;
306
+ });
307
+ threadIdPromiseRef.current = threadPromise.then((t) => t.thread_id);
308
+ usableThreadId = (await threadPromise).thread_id;
306
309
  threadIdRef.current = usableThreadId;
307
310
  threadIdStreamingRef.current = usableThreadId;
308
311
  onThreadId(usableThreadId);
@@ -370,6 +373,7 @@ function useStreamLGP(options) {
370
373
  },
371
374
  onError(error) {
372
375
  options.onError?.(error, callbackMeta);
376
+ submitOptions?.onError?.(error, callbackMeta);
373
377
  },
374
378
  onFinish() {
375
379
  threadIdStreamingRef.current = null;
@@ -379,6 +383,7 @@ function useStreamLGP(options) {
379
383
  const submitDirectRef = useRef(submitDirect);
380
384
  submitDirectRef.current = submitDirect;
381
385
  const submittingRef = useRef(false);
386
+ const drainQueueRef = useRef(() => {});
382
387
  const submit = async (values, submitOptions) => {
383
388
  if (stream.isLoading || submittingRef.current) {
384
389
  if (submitOptions?.multitaskStrategy === "interrupt" || submitOptions?.multitaskStrategy === "rollback") {
@@ -390,27 +395,33 @@ function useStreamLGP(options) {
390
395
  }
391
396
  return;
392
397
  }
393
- const usableThreadId = threadIdRef.current ?? threadId;
398
+ let usableThreadId = threadIdRef.current ?? threadId;
399
+ if (!usableThreadId && threadIdPromiseRef.current) usableThreadId = await threadIdPromiseRef.current;
394
400
  if (usableThreadId) {
395
- const run = await client.runs.create(usableThreadId, options.assistantId, {
396
- input: values,
397
- config: submitOptions?.config,
398
- context: submitOptions?.context,
399
- command: submitOptions?.command,
400
- interruptBefore: submitOptions?.interruptBefore,
401
- interruptAfter: submitOptions?.interruptAfter,
402
- metadata: submitOptions?.metadata,
403
- multitaskStrategy: "enqueue",
404
- streamResumable: true,
405
- streamSubgraphs: submitOptions?.streamSubgraphs,
406
- durability: submitOptions?.durability
407
- });
408
- pendingRuns.add({
409
- id: run.run_id,
410
- values,
411
- options: submitOptions,
412
- createdAt: new Date(run.created_at)
413
- });
401
+ try {
402
+ const run = await client.runs.create(usableThreadId, options.assistantId, {
403
+ input: values,
404
+ config: submitOptions?.config,
405
+ context: submitOptions?.context,
406
+ command: submitOptions?.command,
407
+ interruptBefore: submitOptions?.interruptBefore,
408
+ interruptAfter: submitOptions?.interruptAfter,
409
+ metadata: submitOptions?.metadata,
410
+ multitaskStrategy: "enqueue",
411
+ streamResumable: true,
412
+ streamSubgraphs: submitOptions?.streamSubgraphs,
413
+ durability: submitOptions?.durability
414
+ });
415
+ pendingRuns.add({
416
+ id: run.run_id,
417
+ values,
418
+ options: submitOptions,
419
+ createdAt: new Date(run.created_at)
420
+ });
421
+ } catch (error) {
422
+ options.onError?.(error, void 0);
423
+ submitOptions?.onError?.(error, void 0);
424
+ }
414
425
  return;
415
426
  }
416
427
  }
@@ -419,6 +430,7 @@ function useStreamLGP(options) {
419
430
  await submitDirect(values, submitOptions);
420
431
  } finally {
421
432
  submittingRef.current = false;
433
+ drainQueueRef.current();
422
434
  }
423
435
  };
424
436
  const joinStream = async (runId, lastEventId, joinOptions) => {
@@ -463,16 +475,21 @@ function useStreamLGP(options) {
463
475
  };
464
476
  const joinStreamRef = useRef(joinStream);
465
477
  joinStreamRef.current = joinStream;
466
- useEffect(() => {
478
+ const drainQueue = () => {
467
479
  if (!stream.isLoading && !submittingRef.current && pendingRuns.size > 0) {
468
480
  const next = pendingRuns.shift();
469
481
  if (next) {
470
482
  submittingRef.current = true;
471
483
  joinStreamRef.current(next.id).finally(() => {
472
484
  submittingRef.current = false;
485
+ drainQueue();
473
486
  });
474
487
  }
475
488
  }
489
+ };
490
+ drainQueueRef.current = drainQueue;
491
+ useEffect(() => {
492
+ drainQueueRef.current();
476
493
  }, [stream.isLoading, pendingRuns.size]);
477
494
  const reconnectKey = useMemo(() => {
478
495
  if (!runMetadataStorage || stream.isLoading) return void 0;
@@ -552,7 +569,7 @@ function useStreamLGP(options) {
552
569
  },
553
570
  get messages() {
554
571
  trackStreamMode("messages-tuple", "values");
555
- return getMessages(values);
572
+ return ensureMessageInstances(getMessages(values));
556
573
  },
557
574
  get toolCalls() {
558
575
  trackStreamMode("messages-tuple", "values");