@langchain/langgraph-sdk 1.8.3 → 1.8.5

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 (39) hide show
  1. package/dist/ui/class-messages.d.cts +26 -5
  2. package/dist/ui/class-messages.d.cts.map +1 -1
  3. package/dist/ui/class-messages.d.ts +26 -5
  4. package/dist/ui/class-messages.d.ts.map +1 -1
  5. package/dist/ui/hitl-interrupt-payload.cjs +25 -17
  6. package/dist/ui/hitl-interrupt-payload.cjs.map +1 -1
  7. package/dist/ui/hitl-interrupt-payload.d.cts +3 -2
  8. package/dist/ui/hitl-interrupt-payload.d.cts.map +1 -1
  9. package/dist/ui/hitl-interrupt-payload.d.ts +3 -2
  10. package/dist/ui/hitl-interrupt-payload.d.ts.map +1 -1
  11. package/dist/ui/hitl-interrupt-payload.js +25 -17
  12. package/dist/ui/hitl-interrupt-payload.js.map +1 -1
  13. package/dist/ui/interrupts.cjs +2 -1
  14. package/dist/ui/interrupts.cjs.map +1 -1
  15. package/dist/ui/interrupts.d.cts +2 -1
  16. package/dist/ui/interrupts.d.cts.map +1 -1
  17. package/dist/ui/interrupts.d.ts +2 -1
  18. package/dist/ui/interrupts.d.ts.map +1 -1
  19. package/dist/ui/interrupts.js +2 -1
  20. package/dist/ui/interrupts.js.map +1 -1
  21. package/dist/ui/messages.cjs.map +1 -1
  22. package/dist/ui/messages.d.cts +5 -3
  23. package/dist/ui/messages.d.cts.map +1 -1
  24. package/dist/ui/messages.d.ts +5 -3
  25. package/dist/ui/messages.d.ts.map +1 -1
  26. package/dist/ui/messages.js.map +1 -1
  27. package/dist/ui/stream/index.d.cts +0 -1
  28. package/dist/ui/stream/index.d.cts.map +1 -1
  29. package/dist/ui/stream/index.d.ts +0 -1
  30. package/dist/ui/stream/index.d.ts.map +1 -1
  31. package/dist/ui/subagents.cjs +6 -9
  32. package/dist/ui/subagents.cjs.map +1 -1
  33. package/dist/ui/subagents.d.cts +5 -8
  34. package/dist/ui/subagents.d.cts.map +1 -1
  35. package/dist/ui/subagents.d.ts +5 -8
  36. package/dist/ui/subagents.d.ts.map +1 -1
  37. package/dist/ui/subagents.js +6 -9
  38. package/dist/ui/subagents.js.map +1 -1
  39. package/package.json +5 -5
@@ -1,6 +1,8 @@
1
+ import { ThreadState } from "../schema.cjs";
1
2
  import { DefaultToolCall, ToolCallWithResult } from "../types.messages.cjs";
2
3
  import { AcceptBaseMessages, MessageMetadata, SubagentStreamInterface } from "./types.cjs";
3
- import { HistoryWithBaseMessages } from "./messages.cjs";
4
+ import { QueueInterface } from "./queue.cjs";
5
+ import { HistoryWithBaseMessages, StateWithBaseMessages } from "./messages.cjs";
4
6
  import { AIMessage, BaseMessage, ToolMessage } from "@langchain/core/messages";
5
7
 
6
8
  //#region src/ui/class-messages.d.ts
@@ -22,9 +24,23 @@ type ClassToolCallWithResult<T> = T extends ToolCallWithResult<infer TC, unknown
22
24
  * Framework SDKs use class message instances end-to-end; this type is
23
25
  * the subagent counterpart of {@link WithClassMessages}.
24
26
  */
25
- type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages"> & {
27
+ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages" | "values"> & {
26
28
  messages: BaseMessage[];
29
+ values: StateWithBaseMessages<StateType>;
27
30
  };
31
+ type StreamState<T> = T extends {
32
+ getMessagesMetadata: (message: unknown, index?: number) => MessageMetadata<infer S> | undefined;
33
+ } ? S extends Record<string, unknown> ? S : Record<string, unknown> : T extends {
34
+ history: ThreadState<infer S>[];
35
+ } ? S extends Record<string, unknown> ? S : Record<string, unknown> : T extends {
36
+ values: infer V;
37
+ } ? V extends Record<string, unknown> ? V : Record<string, unknown> : Record<string, unknown>;
38
+ type ClassOptimisticValues<StateType> = StateType extends Record<string, unknown> ? Partial<StateWithBaseMessages<StateType>> | ((prev: StateWithBaseMessages<StateType>) => Partial<StateWithBaseMessages<StateType>>) : never;
39
+ type WithClassSubmitOptions<StateType, Options> = Options extends {
40
+ optimisticValues?: unknown;
41
+ } ? Omit<Options, "optimisticValues"> & {
42
+ optimisticValues?: ClassOptimisticValues<StateType>;
43
+ } : Options;
28
44
  /**
29
45
  * Maps a stream interface to use `@langchain/core` {@link BaseMessage}
30
46
  * class instances instead of plain SDK {@link Message} objects.
@@ -43,15 +59,20 @@ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall
43
59
  * additional `Ref`/`ComputedRef` wrapping on top of the shared helper
44
60
  * types.
45
61
  */
46
- type WithClassMessages<T> = Omit<T, "messages" | "history" | "getMessagesMetadata" | "toolCalls" | "getToolCalls" | "submit" | "subagents" | "activeSubagents" | "getSubagent" | "getSubagentsByType" | "getSubagentsByMessage"> & {
62
+ type WithClassMessages<T> = Omit<T, "messages" | "values" | "history" | "getMessagesMetadata" | "toolCalls" | "getToolCalls" | "submit" | "queue" | "subagents" | "activeSubagents" | "getSubagent" | "getSubagentsByType" | "getSubagentsByMessage"> & {
47
63
  messages: BaseMessage[];
48
- getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata<Record<string, unknown>> | undefined;
64
+ values: StateWithBaseMessages<StreamState<T>>;
65
+ getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata<StateWithBaseMessages<StreamState<T>>> | undefined;
49
66
  } & ("history" extends keyof T ? {
50
67
  history: HistoryWithBaseMessages<T["history"]>;
51
68
  } : unknown) & ("submit" extends keyof T ? {
52
69
  submit: T extends {
53
70
  submit: (values: infer V, options?: infer O) => infer Ret;
54
- } ? (values: AcceptBaseMessages<Exclude<V, null | undefined>> | null | undefined, options?: O) => Ret : never;
71
+ } ? (values: AcceptBaseMessages<Exclude<V, null | undefined>> | null | undefined, options?: WithClassSubmitOptions<StreamState<T>, O>) => Ret : never;
72
+ } : unknown) & ("queue" extends keyof T ? {
73
+ queue: T extends {
74
+ queue: QueueInterface<infer S, infer O>;
75
+ } ? QueueInterface<StateWithBaseMessages<S>, WithClassSubmitOptions<S, O>> : never;
55
76
  } : unknown) & ("toolCalls" extends keyof T ? {
56
77
  toolCalls: T extends {
57
78
  toolCalls: (infer TC)[];
@@ -1 +1 @@
1
- {"version":3,"file":"class-messages.d.cts","names":[],"sources":["../../src/ui/class-messages.ts"],"mappings":";;;;;;;;AAwBA;;;;;;;;KAAY,uBAAA,MACV,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;;;;;;;;KASM,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA;;;;;AARZ;;;;;;;;;;;;;;KA6BY,iBAAA,MAAuB,IAAA,CACjC,CAAA;EAaA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,6BACM,CAAA;EACrB,OAAA,EAAS,uBAAA,CAAwB,CAAA;AAAA,uCAEf,CAAA;EAElB,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"}
1
+ {"version":3,"file":"class-messages.d.cts","names":[],"sources":["../../src/ui/class-messages.ts"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
+ import { ThreadState } from "../schema.js";
1
2
  import { DefaultToolCall, ToolCallWithResult } from "../types.messages.js";
2
3
  import { AcceptBaseMessages, MessageMetadata, SubagentStreamInterface } from "./types.js";
3
- import { HistoryWithBaseMessages } from "./messages.js";
4
+ import { QueueInterface } from "./queue.js";
5
+ import { HistoryWithBaseMessages, StateWithBaseMessages } from "./messages.js";
4
6
  import { AIMessage, BaseMessage, ToolMessage } from "@langchain/core/messages";
5
7
 
6
8
  //#region src/ui/class-messages.d.ts
@@ -22,9 +24,23 @@ type ClassToolCallWithResult<T> = T extends ToolCallWithResult<infer TC, unknown
22
24
  * Framework SDKs use class message instances end-to-end; this type is
23
25
  * the subagent counterpart of {@link WithClassMessages}.
24
26
  */
25
- type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages"> & {
27
+ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages" | "values"> & {
26
28
  messages: BaseMessage[];
29
+ values: StateWithBaseMessages<StateType>;
27
30
  };
31
+ type StreamState<T> = T extends {
32
+ getMessagesMetadata: (message: unknown, index?: number) => MessageMetadata<infer S> | undefined;
33
+ } ? S extends Record<string, unknown> ? S : Record<string, unknown> : T extends {
34
+ history: ThreadState<infer S>[];
35
+ } ? S extends Record<string, unknown> ? S : Record<string, unknown> : T extends {
36
+ values: infer V;
37
+ } ? V extends Record<string, unknown> ? V : Record<string, unknown> : Record<string, unknown>;
38
+ type ClassOptimisticValues<StateType> = StateType extends Record<string, unknown> ? Partial<StateWithBaseMessages<StateType>> | ((prev: StateWithBaseMessages<StateType>) => Partial<StateWithBaseMessages<StateType>>) : never;
39
+ type WithClassSubmitOptions<StateType, Options> = Options extends {
40
+ optimisticValues?: unknown;
41
+ } ? Omit<Options, "optimisticValues"> & {
42
+ optimisticValues?: ClassOptimisticValues<StateType>;
43
+ } : Options;
28
44
  /**
29
45
  * Maps a stream interface to use `@langchain/core` {@link BaseMessage}
30
46
  * class instances instead of plain SDK {@link Message} objects.
@@ -43,15 +59,20 @@ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall
43
59
  * additional `Ref`/`ComputedRef` wrapping on top of the shared helper
44
60
  * types.
45
61
  */
46
- type WithClassMessages<T> = Omit<T, "messages" | "history" | "getMessagesMetadata" | "toolCalls" | "getToolCalls" | "submit" | "subagents" | "activeSubagents" | "getSubagent" | "getSubagentsByType" | "getSubagentsByMessage"> & {
62
+ type WithClassMessages<T> = Omit<T, "messages" | "values" | "history" | "getMessagesMetadata" | "toolCalls" | "getToolCalls" | "submit" | "queue" | "subagents" | "activeSubagents" | "getSubagent" | "getSubagentsByType" | "getSubagentsByMessage"> & {
47
63
  messages: BaseMessage[];
48
- getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata<Record<string, unknown>> | undefined;
64
+ values: StateWithBaseMessages<StreamState<T>>;
65
+ getMessagesMetadata: (message: BaseMessage, index?: number) => MessageMetadata<StateWithBaseMessages<StreamState<T>>> | undefined;
49
66
  } & ("history" extends keyof T ? {
50
67
  history: HistoryWithBaseMessages<T["history"]>;
51
68
  } : unknown) & ("submit" extends keyof T ? {
52
69
  submit: T extends {
53
70
  submit: (values: infer V, options?: infer O) => infer Ret;
54
- } ? (values: AcceptBaseMessages<Exclude<V, null | undefined>> | null | undefined, options?: O) => Ret : never;
71
+ } ? (values: AcceptBaseMessages<Exclude<V, null | undefined>> | null | undefined, options?: WithClassSubmitOptions<StreamState<T>, O>) => Ret : never;
72
+ } : unknown) & ("queue" extends keyof T ? {
73
+ queue: T extends {
74
+ queue: QueueInterface<infer S, infer O>;
75
+ } ? QueueInterface<StateWithBaseMessages<S>, WithClassSubmitOptions<S, O>> : never;
55
76
  } : unknown) & ("toolCalls" extends keyof T ? {
56
77
  toolCalls: T extends {
57
78
  toolCalls: (infer TC)[];
@@ -1 +1 @@
1
- {"version":3,"file":"class-messages.d.ts","names":[],"sources":["../../src/ui/class-messages.ts"],"mappings":";;;;;;;;AAwBA;;;;;;;;KAAY,uBAAA,MACV,CAAA,SAAU,kBAAA,+BACN,kBAAA,CAAmB,EAAA,EAAI,WAAA,EAAiB,SAAA,IACxC,CAAA;;;;;;;;KASM,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA;;;;;AARZ;;;;;;;;;;;;;;KA6BY,iBAAA,MAAuB,IAAA,CACjC,CAAA;EAaA,QAAA,EAAU,WAAA;EACV,mBAAA,GACE,OAAA,EAAS,WAAA,EACT,KAAA,cACG,eAAA,CAAgB,MAAA;AAAA,6BACM,CAAA;EACrB,OAAA,EAAS,uBAAA,CAAwB,CAAA;AAAA,uCAEf,CAAA;EAElB,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"}
1
+ {"version":3,"file":"class-messages.d.ts","names":[],"sources":["../../src/ui/class-messages.ts"],"mappings":"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"}
@@ -5,42 +5,50 @@
5
5
  * camelCase. Normalize known HITL fields on interrupt payloads at read time.
6
6
  */
7
7
  /**
8
- * Copy a plain object, drop `snake`, and ensure `camel` is set from camel ?? snake.
8
+ * Copy a plain object and expose both casing styles for a field.
9
+ *
10
+ * camelCase is treated as canonical when both keys are present so newer
11
+ * consumers keep the current behavior while legacy snake_case access still
12
+ * resolves to the same value.
9
13
  */
10
- function aliasSnakeToCamel(item, camel, snake) {
14
+ function aliasCasePair(item, camel, snake) {
11
15
  if (item === null || typeof item !== "object" || Array.isArray(item)) return item;
12
16
  const o = item;
13
17
  const merged = o[camel] ?? o[snake];
14
- const next = {};
15
- for (const [k, v] of Object.entries(o)) {
16
- if (k === snake) continue;
17
- next[k] = v;
18
+ const next = { ...o };
19
+ if (merged !== void 0) {
20
+ next[camel] = merged;
21
+ next[snake] = merged;
18
22
  }
19
- if (merged !== void 0) next[camel] = merged;
20
23
  return next;
21
24
  }
22
25
  function mapArrayAlias(raw, camel, snake) {
23
26
  if (!Array.isArray(raw)) return raw;
24
- return raw.map((item) => aliasSnakeToCamel(item, camel, snake));
27
+ return raw.map((item) => aliasCasePair(item, camel, snake));
25
28
  }
26
29
  /**
27
- * If `value` looks like a HITL request object from the Python API, rewrite
28
- * snake_case keys to the camelCase shape used by JS / LangChain.
30
+ * If `value` looks like a HITL request object, expose both the new camelCase
31
+ * keys and the deprecated snake_case aliases so older apps keep working while
32
+ * migrating to the new shape.
29
33
  */
30
34
  function normalizeHitlInterruptPayload(value) {
31
35
  if (value === null || typeof value !== "object") return value;
32
36
  if (Array.isArray(value)) return value.map((v) => normalizeHitlInterruptPayload(v));
33
37
  const obj = value;
34
38
  if (!("action_requests" in obj || "actionRequests" in obj || "review_configs" in obj || "reviewConfigs" in obj)) return value;
35
- const next = {};
36
- for (const [k, v] of Object.entries(obj)) {
37
- if (k === "action_requests" || k === "actionRequests" || k === "review_configs" || k === "reviewConfigs") continue;
38
- next[k] = v;
39
- }
39
+ const next = { ...obj };
40
40
  const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;
41
- if (actionRequestsRaw !== void 0) next.actionRequests = mapArrayAlias(actionRequestsRaw, "name", "action_name");
41
+ if (actionRequestsRaw !== void 0) {
42
+ const actionRequests = mapArrayAlias(actionRequestsRaw, "name", "action_name");
43
+ next.actionRequests = actionRequests;
44
+ next.action_requests = actionRequests;
45
+ }
42
46
  const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;
43
- if (reviewConfigsRaw !== void 0) next.reviewConfigs = mapArrayAlias(reviewConfigsRaw, "allowedDecisions", "allowed_decisions");
47
+ if (reviewConfigsRaw !== void 0) {
48
+ const reviewConfigs = mapArrayAlias(reviewConfigsRaw, "allowedDecisions", "allowed_decisions");
49
+ next.reviewConfigs = reviewConfigs;
50
+ next.review_configs = reviewConfigs;
51
+ }
44
52
  return next;
45
53
  }
46
54
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"hitl-interrupt-payload.cjs","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"sourcesContent":["/**\n * Human-in-the-loop interrupt values from the LangGraph API may use\n * snake_case (Python server) while JS clients and LangChain types expect\n * camelCase. Normalize known HITL fields on interrupt payloads at read time.\n */\n\n/**\n * Copy a plain object, drop `snake`, and ensure `camel` is set from camel ?? snake.\n */\nfunction aliasSnakeToCamel(\n item: unknown,\n camel: string,\n snake: string\n): unknown {\n if (item === null || typeof item !== \"object\" || Array.isArray(item)) {\n return item;\n }\n const o = item as Record<string, unknown>;\n const merged = o[camel] ?? o[snake];\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (k === snake) continue;\n next[k] = v;\n }\n if (merged !== undefined) next[camel] = merged;\n return next;\n}\n\nfunction mapArrayAlias(raw: unknown, camel: string, snake: string): unknown {\n if (!Array.isArray(raw)) return raw;\n return raw.map((item) => aliasSnakeToCamel(item, camel, snake));\n}\n\n/**\n * If `value` looks like a HITL request object from the Python API, rewrite\n * snake_case keys to the camelCase shape used by JS / LangChain.\n */\nexport function normalizeHitlInterruptPayload(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => normalizeHitlInterruptPayload(v));\n }\n const obj = value as Record<string, unknown>;\n const isHitlLike =\n \"action_requests\" in obj ||\n \"actionRequests\" in obj ||\n \"review_configs\" in obj ||\n \"reviewConfigs\" in obj;\n if (!isHitlLike) {\n return value;\n }\n\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (\n k === \"action_requests\" ||\n k === \"actionRequests\" ||\n k === \"review_configs\" ||\n k === \"reviewConfigs\"\n ) {\n continue;\n }\n next[k] = v;\n }\n\n const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;\n if (actionRequestsRaw !== undefined) {\n next.actionRequests = mapArrayAlias(\n actionRequestsRaw,\n \"name\",\n \"action_name\"\n );\n }\n const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;\n if (reviewConfigsRaw !== undefined) {\n next.reviewConfigs = mapArrayAlias(\n reviewConfigsRaw,\n \"allowedDecisions\",\n \"allowed_decisions\"\n );\n }\n return next;\n}\n"],"mappings":";;;;;;;;;AASA,SAAS,kBACP,MACA,OACA,OACS;AACT,KAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,QAAO;CAET,MAAM,IAAI;CACV,MAAM,SAAS,EAAE,UAAU,EAAE;CAC7B,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,EAAE,EAAE;AACtC,MAAI,MAAM,MAAO;AACjB,OAAK,KAAK;;AAEZ,KAAI,WAAW,KAAA,EAAW,MAAK,SAAS;AACxC,QAAO;;AAGT,SAAS,cAAc,KAAc,OAAe,OAAwB;AAC1E,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;AAChC,QAAO,IAAI,KAAK,SAAS,kBAAkB,MAAM,OAAO,MAAM,CAAC;;;;;;AAOjE,SAAgB,8BAA8B,OAAyB;AACrE,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;AAET,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,MAAM,8BAA8B,EAAE,CAAC;CAE3D,MAAM,MAAM;AAMZ,KAAI,EAJF,qBAAqB,OACrB,oBAAoB,OACpB,oBAAoB,OACpB,mBAAmB,KAEnB,QAAO;CAGT,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,EAAE;AACxC,MACE,MAAM,qBACN,MAAM,oBACN,MAAM,oBACN,MAAM,gBAEN;AAEF,OAAK,KAAK;;CAGZ,MAAM,oBAAoB,IAAI,kBAAkB,IAAI;AACpD,KAAI,sBAAsB,KAAA,EACxB,MAAK,iBAAiB,cACpB,mBACA,QACA,cACD;CAEH,MAAM,mBAAmB,IAAI,iBAAiB,IAAI;AAClD,KAAI,qBAAqB,KAAA,EACvB,MAAK,gBAAgB,cACnB,kBACA,oBACA,oBACD;AAEH,QAAO"}
1
+ {"version":3,"file":"hitl-interrupt-payload.cjs","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"sourcesContent":["/**\n * Human-in-the-loop interrupt values from the LangGraph API may use\n * snake_case (Python server) while JS clients and LangChain types expect\n * camelCase. Normalize known HITL fields on interrupt payloads at read time.\n */\n\n/**\n * Copy a plain object and expose both casing styles for a field.\n *\n * camelCase is treated as canonical when both keys are present so newer\n * consumers keep the current behavior while legacy snake_case access still\n * resolves to the same value.\n */\nfunction aliasCasePair(item: unknown, camel: string, snake: string): unknown {\n if (item === null || typeof item !== \"object\" || Array.isArray(item)) {\n return item;\n }\n const o = item as Record<string, unknown>;\n const merged = o[camel] ?? o[snake];\n const next: Record<string, unknown> = { ...o };\n if (merged !== undefined) {\n next[camel] = merged;\n next[snake] = merged;\n }\n return next;\n}\n\nfunction mapArrayAlias(raw: unknown, camel: string, snake: string): unknown {\n if (!Array.isArray(raw)) return raw;\n return raw.map((item) => aliasCasePair(item, camel, snake));\n}\n\n/**\n * If `value` looks like a HITL request object, expose both the new camelCase\n * keys and the deprecated snake_case aliases so older apps keep working while\n * migrating to the new shape.\n */\nexport function normalizeHitlInterruptPayload(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => normalizeHitlInterruptPayload(v));\n }\n const obj = value as Record<string, unknown>;\n const isHitlLike =\n \"action_requests\" in obj ||\n \"actionRequests\" in obj ||\n \"review_configs\" in obj ||\n \"reviewConfigs\" in obj;\n if (!isHitlLike) {\n return value;\n }\n\n const next: Record<string, unknown> = { ...obj };\n\n const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;\n if (actionRequestsRaw !== undefined) {\n const actionRequests = mapArrayAlias(\n actionRequestsRaw,\n \"name\",\n \"action_name\"\n );\n next.actionRequests = actionRequests;\n next.action_requests = actionRequests;\n }\n const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;\n if (reviewConfigsRaw !== undefined) {\n const reviewConfigs = mapArrayAlias(\n reviewConfigsRaw,\n \"allowedDecisions\",\n \"allowed_decisions\"\n );\n next.reviewConfigs = reviewConfigs;\n next.review_configs = reviewConfigs;\n }\n return next;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAS,cAAc,MAAe,OAAe,OAAwB;AAC3E,KAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,QAAO;CAET,MAAM,IAAI;CACV,MAAM,SAAS,EAAE,UAAU,EAAE;CAC7B,MAAM,OAAgC,EAAE,GAAG,GAAG;AAC9C,KAAI,WAAW,KAAA,GAAW;AACxB,OAAK,SAAS;AACd,OAAK,SAAS;;AAEhB,QAAO;;AAGT,SAAS,cAAc,KAAc,OAAe,OAAwB;AAC1E,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;AAChC,QAAO,IAAI,KAAK,SAAS,cAAc,MAAM,OAAO,MAAM,CAAC;;;;;;;AAQ7D,SAAgB,8BAA8B,OAAyB;AACrE,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;AAET,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,MAAM,8BAA8B,EAAE,CAAC;CAE3D,MAAM,MAAM;AAMZ,KAAI,EAJF,qBAAqB,OACrB,oBAAoB,OACpB,oBAAoB,OACpB,mBAAmB,KAEnB,QAAO;CAGT,MAAM,OAAgC,EAAE,GAAG,KAAK;CAEhD,MAAM,oBAAoB,IAAI,kBAAkB,IAAI;AACpD,KAAI,sBAAsB,KAAA,GAAW;EACnC,MAAM,iBAAiB,cACrB,mBACA,QACA,cACD;AACD,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;;CAEzB,MAAM,mBAAmB,IAAI,iBAAiB,IAAI;AAClD,KAAI,qBAAqB,KAAA,GAAW;EAClC,MAAM,gBAAgB,cACpB,kBACA,oBACA,oBACD;AACD,OAAK,gBAAgB;AACrB,OAAK,iBAAiB;;AAExB,QAAO"}
@@ -5,8 +5,9 @@
5
5
  * camelCase. Normalize known HITL fields on interrupt payloads at read time.
6
6
  */
7
7
  /**
8
- * If `value` looks like a HITL request object from the Python API, rewrite
9
- * snake_case keys to the camelCase shape used by JS / LangChain.
8
+ * If `value` looks like a HITL request object, expose both the new camelCase
9
+ * keys and the deprecated snake_case aliases so older apps keep working while
10
+ * migrating to the new shape.
10
11
  */
11
12
  declare function normalizeHitlInterruptPayload(value: unknown): unknown;
12
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"hitl-interrupt-payload.d.cts","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"mappings":";;AAqCA;;;;;;;;iBAAgB,6BAAA,CAA8B,KAAA"}
1
+ {"version":3,"file":"hitl-interrupt-payload.d.cts","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"mappings":";;AAqCA;;;;;;;;;iBAAgB,6BAAA,CAA8B,KAAA"}
@@ -5,8 +5,9 @@
5
5
  * camelCase. Normalize known HITL fields on interrupt payloads at read time.
6
6
  */
7
7
  /**
8
- * If `value` looks like a HITL request object from the Python API, rewrite
9
- * snake_case keys to the camelCase shape used by JS / LangChain.
8
+ * If `value` looks like a HITL request object, expose both the new camelCase
9
+ * keys and the deprecated snake_case aliases so older apps keep working while
10
+ * migrating to the new shape.
10
11
  */
11
12
  declare function normalizeHitlInterruptPayload(value: unknown): unknown;
12
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"hitl-interrupt-payload.d.ts","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"mappings":";;AAqCA;;;;;;;;iBAAgB,6BAAA,CAA8B,KAAA"}
1
+ {"version":3,"file":"hitl-interrupt-payload.d.ts","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"mappings":";;AAqCA;;;;;;;;;iBAAgB,6BAAA,CAA8B,KAAA"}
@@ -5,42 +5,50 @@
5
5
  * camelCase. Normalize known HITL fields on interrupt payloads at read time.
6
6
  */
7
7
  /**
8
- * Copy a plain object, drop `snake`, and ensure `camel` is set from camel ?? snake.
8
+ * Copy a plain object and expose both casing styles for a field.
9
+ *
10
+ * camelCase is treated as canonical when both keys are present so newer
11
+ * consumers keep the current behavior while legacy snake_case access still
12
+ * resolves to the same value.
9
13
  */
10
- function aliasSnakeToCamel(item, camel, snake) {
14
+ function aliasCasePair(item, camel, snake) {
11
15
  if (item === null || typeof item !== "object" || Array.isArray(item)) return item;
12
16
  const o = item;
13
17
  const merged = o[camel] ?? o[snake];
14
- const next = {};
15
- for (const [k, v] of Object.entries(o)) {
16
- if (k === snake) continue;
17
- next[k] = v;
18
+ const next = { ...o };
19
+ if (merged !== void 0) {
20
+ next[camel] = merged;
21
+ next[snake] = merged;
18
22
  }
19
- if (merged !== void 0) next[camel] = merged;
20
23
  return next;
21
24
  }
22
25
  function mapArrayAlias(raw, camel, snake) {
23
26
  if (!Array.isArray(raw)) return raw;
24
- return raw.map((item) => aliasSnakeToCamel(item, camel, snake));
27
+ return raw.map((item) => aliasCasePair(item, camel, snake));
25
28
  }
26
29
  /**
27
- * If `value` looks like a HITL request object from the Python API, rewrite
28
- * snake_case keys to the camelCase shape used by JS / LangChain.
30
+ * If `value` looks like a HITL request object, expose both the new camelCase
31
+ * keys and the deprecated snake_case aliases so older apps keep working while
32
+ * migrating to the new shape.
29
33
  */
30
34
  function normalizeHitlInterruptPayload(value) {
31
35
  if (value === null || typeof value !== "object") return value;
32
36
  if (Array.isArray(value)) return value.map((v) => normalizeHitlInterruptPayload(v));
33
37
  const obj = value;
34
38
  if (!("action_requests" in obj || "actionRequests" in obj || "review_configs" in obj || "reviewConfigs" in obj)) return value;
35
- const next = {};
36
- for (const [k, v] of Object.entries(obj)) {
37
- if (k === "action_requests" || k === "actionRequests" || k === "review_configs" || k === "reviewConfigs") continue;
38
- next[k] = v;
39
- }
39
+ const next = { ...obj };
40
40
  const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;
41
- if (actionRequestsRaw !== void 0) next.actionRequests = mapArrayAlias(actionRequestsRaw, "name", "action_name");
41
+ if (actionRequestsRaw !== void 0) {
42
+ const actionRequests = mapArrayAlias(actionRequestsRaw, "name", "action_name");
43
+ next.actionRequests = actionRequests;
44
+ next.action_requests = actionRequests;
45
+ }
42
46
  const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;
43
- if (reviewConfigsRaw !== void 0) next.reviewConfigs = mapArrayAlias(reviewConfigsRaw, "allowedDecisions", "allowed_decisions");
47
+ if (reviewConfigsRaw !== void 0) {
48
+ const reviewConfigs = mapArrayAlias(reviewConfigsRaw, "allowedDecisions", "allowed_decisions");
49
+ next.reviewConfigs = reviewConfigs;
50
+ next.review_configs = reviewConfigs;
51
+ }
44
52
  return next;
45
53
  }
46
54
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"hitl-interrupt-payload.js","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"sourcesContent":["/**\n * Human-in-the-loop interrupt values from the LangGraph API may use\n * snake_case (Python server) while JS clients and LangChain types expect\n * camelCase. Normalize known HITL fields on interrupt payloads at read time.\n */\n\n/**\n * Copy a plain object, drop `snake`, and ensure `camel` is set from camel ?? snake.\n */\nfunction aliasSnakeToCamel(\n item: unknown,\n camel: string,\n snake: string\n): unknown {\n if (item === null || typeof item !== \"object\" || Array.isArray(item)) {\n return item;\n }\n const o = item as Record<string, unknown>;\n const merged = o[camel] ?? o[snake];\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (k === snake) continue;\n next[k] = v;\n }\n if (merged !== undefined) next[camel] = merged;\n return next;\n}\n\nfunction mapArrayAlias(raw: unknown, camel: string, snake: string): unknown {\n if (!Array.isArray(raw)) return raw;\n return raw.map((item) => aliasSnakeToCamel(item, camel, snake));\n}\n\n/**\n * If `value` looks like a HITL request object from the Python API, rewrite\n * snake_case keys to the camelCase shape used by JS / LangChain.\n */\nexport function normalizeHitlInterruptPayload(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => normalizeHitlInterruptPayload(v));\n }\n const obj = value as Record<string, unknown>;\n const isHitlLike =\n \"action_requests\" in obj ||\n \"actionRequests\" in obj ||\n \"review_configs\" in obj ||\n \"reviewConfigs\" in obj;\n if (!isHitlLike) {\n return value;\n }\n\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (\n k === \"action_requests\" ||\n k === \"actionRequests\" ||\n k === \"review_configs\" ||\n k === \"reviewConfigs\"\n ) {\n continue;\n }\n next[k] = v;\n }\n\n const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;\n if (actionRequestsRaw !== undefined) {\n next.actionRequests = mapArrayAlias(\n actionRequestsRaw,\n \"name\",\n \"action_name\"\n );\n }\n const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;\n if (reviewConfigsRaw !== undefined) {\n next.reviewConfigs = mapArrayAlias(\n reviewConfigsRaw,\n \"allowedDecisions\",\n \"allowed_decisions\"\n );\n }\n return next;\n}\n"],"mappings":";;;;;;;;;AASA,SAAS,kBACP,MACA,OACA,OACS;AACT,KAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,QAAO;CAET,MAAM,IAAI;CACV,MAAM,SAAS,EAAE,UAAU,EAAE;CAC7B,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,EAAE,EAAE;AACtC,MAAI,MAAM,MAAO;AACjB,OAAK,KAAK;;AAEZ,KAAI,WAAW,KAAA,EAAW,MAAK,SAAS;AACxC,QAAO;;AAGT,SAAS,cAAc,KAAc,OAAe,OAAwB;AAC1E,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;AAChC,QAAO,IAAI,KAAK,SAAS,kBAAkB,MAAM,OAAO,MAAM,CAAC;;;;;;AAOjE,SAAgB,8BAA8B,OAAyB;AACrE,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;AAET,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,MAAM,8BAA8B,EAAE,CAAC;CAE3D,MAAM,MAAM;AAMZ,KAAI,EAJF,qBAAqB,OACrB,oBAAoB,OACpB,oBAAoB,OACpB,mBAAmB,KAEnB,QAAO;CAGT,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,EAAE;AACxC,MACE,MAAM,qBACN,MAAM,oBACN,MAAM,oBACN,MAAM,gBAEN;AAEF,OAAK,KAAK;;CAGZ,MAAM,oBAAoB,IAAI,kBAAkB,IAAI;AACpD,KAAI,sBAAsB,KAAA,EACxB,MAAK,iBAAiB,cACpB,mBACA,QACA,cACD;CAEH,MAAM,mBAAmB,IAAI,iBAAiB,IAAI;AAClD,KAAI,qBAAqB,KAAA,EACvB,MAAK,gBAAgB,cACnB,kBACA,oBACA,oBACD;AAEH,QAAO"}
1
+ {"version":3,"file":"hitl-interrupt-payload.js","names":[],"sources":["../../src/ui/hitl-interrupt-payload.ts"],"sourcesContent":["/**\n * Human-in-the-loop interrupt values from the LangGraph API may use\n * snake_case (Python server) while JS clients and LangChain types expect\n * camelCase. Normalize known HITL fields on interrupt payloads at read time.\n */\n\n/**\n * Copy a plain object and expose both casing styles for a field.\n *\n * camelCase is treated as canonical when both keys are present so newer\n * consumers keep the current behavior while legacy snake_case access still\n * resolves to the same value.\n */\nfunction aliasCasePair(item: unknown, camel: string, snake: string): unknown {\n if (item === null || typeof item !== \"object\" || Array.isArray(item)) {\n return item;\n }\n const o = item as Record<string, unknown>;\n const merged = o[camel] ?? o[snake];\n const next: Record<string, unknown> = { ...o };\n if (merged !== undefined) {\n next[camel] = merged;\n next[snake] = merged;\n }\n return next;\n}\n\nfunction mapArrayAlias(raw: unknown, camel: string, snake: string): unknown {\n if (!Array.isArray(raw)) return raw;\n return raw.map((item) => aliasCasePair(item, camel, snake));\n}\n\n/**\n * If `value` looks like a HITL request object, expose both the new camelCase\n * keys and the deprecated snake_case aliases so older apps keep working while\n * migrating to the new shape.\n */\nexport function normalizeHitlInterruptPayload(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => normalizeHitlInterruptPayload(v));\n }\n const obj = value as Record<string, unknown>;\n const isHitlLike =\n \"action_requests\" in obj ||\n \"actionRequests\" in obj ||\n \"review_configs\" in obj ||\n \"reviewConfigs\" in obj;\n if (!isHitlLike) {\n return value;\n }\n\n const next: Record<string, unknown> = { ...obj };\n\n const actionRequestsRaw = obj.actionRequests ?? obj.action_requests;\n if (actionRequestsRaw !== undefined) {\n const actionRequests = mapArrayAlias(\n actionRequestsRaw,\n \"name\",\n \"action_name\"\n );\n next.actionRequests = actionRequests;\n next.action_requests = actionRequests;\n }\n const reviewConfigsRaw = obj.reviewConfigs ?? obj.review_configs;\n if (reviewConfigsRaw !== undefined) {\n const reviewConfigs = mapArrayAlias(\n reviewConfigsRaw,\n \"allowedDecisions\",\n \"allowed_decisions\"\n );\n next.reviewConfigs = reviewConfigs;\n next.review_configs = reviewConfigs;\n }\n return next;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAS,cAAc,MAAe,OAAe,OAAwB;AAC3E,KAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAClE,QAAO;CAET,MAAM,IAAI;CACV,MAAM,SAAS,EAAE,UAAU,EAAE;CAC7B,MAAM,OAAgC,EAAE,GAAG,GAAG;AAC9C,KAAI,WAAW,KAAA,GAAW;AACxB,OAAK,SAAS;AACd,OAAK,SAAS;;AAEhB,QAAO;;AAGT,SAAS,cAAc,KAAc,OAAe,OAAwB;AAC1E,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;AAChC,QAAO,IAAI,KAAK,SAAS,cAAc,MAAM,OAAO,MAAM,CAAC;;;;;;;AAQ7D,SAAgB,8BAA8B,OAAyB;AACrE,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;AAET,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,MAAM,8BAA8B,EAAE,CAAC;CAE3D,MAAM,MAAM;AAMZ,KAAI,EAJF,qBAAqB,OACrB,oBAAoB,OACpB,oBAAoB,OACpB,mBAAmB,KAEnB,QAAO;CAGT,MAAM,OAAgC,EAAE,GAAG,KAAK;CAEhD,MAAM,oBAAoB,IAAI,kBAAkB,IAAI;AACpD,KAAI,sBAAsB,KAAA,GAAW;EACnC,MAAM,iBAAiB,cACrB,mBACA,QACA,cACD;AACD,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;;CAEzB,MAAM,mBAAmB,IAAI,iBAAiB,IAAI;AAClD,KAAI,qBAAqB,KAAA,GAAW;EAClC,MAAM,gBAAgB,cACpB,kBACA,oBACA,oBACD;AACD,OAAK,gBAAgB;AACrB,OAAK,iBAAiB;;AAExB,QAAO"}
@@ -1,7 +1,8 @@
1
1
  const require_hitl_interrupt_payload = require("./hitl-interrupt-payload.cjs");
2
2
  //#region src/ui/interrupts.ts
3
3
  /**
4
- * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.
4
+ * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated
5
+ * snake_case aliases for compatibility during migration.
5
6
  */
6
7
  function normalizeInterruptForClient(interrupt) {
7
8
  if (interrupt.value === void 0) return interrupt;
@@ -1 +1 @@
1
- {"version":3,"file":"interrupts.cjs","names":["normalizeHitlInterruptPayload"],"sources":["../../src/ui/interrupts.ts"],"sourcesContent":["import { normalizeHitlInterruptPayload } from \"./hitl-interrupt-payload.js\";\nimport { Interrupt, ThreadState } from \"../schema.js\";\n\n/**\n * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.\n */\nexport function normalizeInterruptForClient<T = unknown>(\n interrupt: Interrupt<T>\n): Interrupt<T> {\n if (interrupt.value === undefined) {\n return interrupt;\n }\n return {\n ...interrupt,\n value: normalizeHitlInterruptPayload(interrupt.value) as T,\n };\n}\n\n/**\n * Applies {@link normalizeInterruptForClient} to each interrupt.\n */\nexport function normalizeInterruptsList<T = unknown>(\n interrupts: Interrupt<T>[]\n): Interrupt<T>[] {\n return interrupts.map((i) => normalizeInterruptForClient(i));\n}\n\nexport function extractInterrupts<InterruptType = unknown>(\n values: unknown,\n options?: {\n isLoading: boolean;\n threadState: ThreadState | undefined;\n error: unknown;\n }\n): Interrupt<InterruptType> | undefined {\n if (\n typeof values === \"object\" &&\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__ as Interrupt<InterruptType>[];\n if (valueInterrupts.length === 0) return { when: \"breakpoint\" };\n if (valueInterrupts.length === 1) {\n return normalizeInterruptForClient(valueInterrupts[0]);\n }\n\n // TODO: fix the typing of interrupts if multiple interrupts are returned\n const normalized = valueInterrupts.map((i) =>\n normalizeInterruptForClient(i)\n );\n return normalized as unknown as Interrupt<InterruptType> | undefined;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (options?.isLoading) return undefined;\n\n const interrupts = options?.threadState?.tasks?.at(-1)?.interrupts;\n if (interrupts == null || interrupts.length === 0) {\n // check if there's a next task present\n const next = options?.threadState?.next ?? [];\n if (!next.length || options?.error != null) return undefined;\n return { when: \"breakpoint\" };\n }\n\n // Return only the current interrupt\n return normalizeInterruptForClient(\n interrupts.at(-1) as Interrupt<InterruptType>\n );\n}\n"],"mappings":";;;;;AAMA,SAAgB,4BACd,WACc;AACd,KAAI,UAAU,UAAU,KAAA,EACtB,QAAO;AAET,QAAO;EACL,GAAG;EACH,OAAOA,+BAAAA,8BAA8B,UAAU,MAAM;EACtD;;;;;AAMH,SAAgB,wBACd,YACgB;AAChB,QAAO,WAAW,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAG9D,SAAgB,kBACd,QACA,SAKsC;AACtC,KACE,OAAO,WAAW,YAClB,UAAU,QACV,mBAAmB,UACnB,MAAM,QAAQ,OAAO,cAAc,EACnC;EACA,MAAM,kBAAkB,OAAO;AAC/B,MAAI,gBAAgB,WAAW,EAAG,QAAO,EAAE,MAAM,cAAc;AAC/D,MAAI,gBAAgB,WAAW,EAC7B,QAAO,4BAA4B,gBAAgB,GAAG;AAOxD,SAHmB,gBAAgB,KAAK,MACtC,4BAA4B,EAAE,CAC/B;;AAKH,KAAI,SAAS,UAAW,QAAO,KAAA;CAE/B,MAAM,aAAa,SAAS,aAAa,OAAO,GAAG,GAAG,EAAE;AACxD,KAAI,cAAc,QAAQ,WAAW,WAAW,GAAG;AAGjD,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;AAI/B,QAAO,4BACL,WAAW,GAAG,GAAG,CAClB"}
1
+ {"version":3,"file":"interrupts.cjs","names":["normalizeHitlInterruptPayload"],"sources":["../../src/ui/interrupts.ts"],"sourcesContent":["import { normalizeHitlInterruptPayload } from \"./hitl-interrupt-payload.js\";\nimport { Interrupt, ThreadState } from \"../schema.js\";\n\n/**\n * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated\n * snake_case aliases for compatibility during migration.\n */\nexport function normalizeInterruptForClient<T = unknown>(\n interrupt: Interrupt<T>\n): Interrupt<T> {\n if (interrupt.value === undefined) {\n return interrupt;\n }\n return {\n ...interrupt,\n value: normalizeHitlInterruptPayload(interrupt.value) as T,\n };\n}\n\n/**\n * Applies {@link normalizeInterruptForClient} to each interrupt.\n */\nexport function normalizeInterruptsList<T = unknown>(\n interrupts: Interrupt<T>[]\n): Interrupt<T>[] {\n return interrupts.map((i) => normalizeInterruptForClient(i));\n}\n\nexport function extractInterrupts<InterruptType = unknown>(\n values: unknown,\n options?: {\n isLoading: boolean;\n threadState: ThreadState | undefined;\n error: unknown;\n }\n): Interrupt<InterruptType> | undefined {\n if (\n typeof values === \"object\" &&\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__ as Interrupt<InterruptType>[];\n if (valueInterrupts.length === 0) return { when: \"breakpoint\" };\n if (valueInterrupts.length === 1) {\n return normalizeInterruptForClient(valueInterrupts[0]);\n }\n\n // TODO: fix the typing of interrupts if multiple interrupts are returned\n const normalized = valueInterrupts.map((i) =>\n normalizeInterruptForClient(i)\n );\n return normalized as unknown as Interrupt<InterruptType> | undefined;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (options?.isLoading) return undefined;\n\n const interrupts = options?.threadState?.tasks?.at(-1)?.interrupts;\n if (interrupts == null || interrupts.length === 0) {\n // check if there's a next task present\n const next = options?.threadState?.next ?? [];\n if (!next.length || options?.error != null) return undefined;\n return { when: \"breakpoint\" };\n }\n\n // Return only the current interrupt\n return normalizeInterruptForClient(\n interrupts.at(-1) as Interrupt<InterruptType>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,4BACd,WACc;AACd,KAAI,UAAU,UAAU,KAAA,EACtB,QAAO;AAET,QAAO;EACL,GAAG;EACH,OAAOA,+BAAAA,8BAA8B,UAAU,MAAM;EACtD;;;;;AAMH,SAAgB,wBACd,YACgB;AAChB,QAAO,WAAW,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAG9D,SAAgB,kBACd,QACA,SAKsC;AACtC,KACE,OAAO,WAAW,YAClB,UAAU,QACV,mBAAmB,UACnB,MAAM,QAAQ,OAAO,cAAc,EACnC;EACA,MAAM,kBAAkB,OAAO;AAC/B,MAAI,gBAAgB,WAAW,EAAG,QAAO,EAAE,MAAM,cAAc;AAC/D,MAAI,gBAAgB,WAAW,EAC7B,QAAO,4BAA4B,gBAAgB,GAAG;AAOxD,SAHmB,gBAAgB,KAAK,MACtC,4BAA4B,EAAE,CAC/B;;AAKH,KAAI,SAAS,UAAW,QAAO,KAAA;CAE/B,MAAM,aAAa,SAAS,aAAa,OAAO,GAAG,GAAG,EAAE;AACxD,KAAI,cAAc,QAAQ,WAAW,WAAW,GAAG;AAGjD,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;AAI/B,QAAO,4BACL,WAAW,GAAG,GAAG,CAClB"}
@@ -2,7 +2,8 @@ import { Interrupt, ThreadState } from "../schema.cjs";
2
2
 
3
3
  //#region src/ui/interrupts.d.ts
4
4
  /**
5
- * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.
5
+ * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated
6
+ * snake_case aliases for compatibility during migration.
6
7
  */
7
8
  declare function normalizeInterruptForClient<T = unknown>(interrupt: Interrupt<T>): Interrupt<T>;
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"interrupts.d.cts","names":[],"sources":["../../src/ui/interrupts.ts"],"mappings":";;;;;AAMA;iBAAgB,2BAAA,aAAA,CACd,SAAA,EAAW,SAAA,CAAU,CAAA,IACpB,SAAA,CAAU,CAAA;;;;iBAaG,uBAAA,aAAA,CACd,UAAA,EAAY,SAAA,CAAU,CAAA,MACrB,SAAA,CAAU,CAAA;AAAA,iBAIG,iBAAA,yBAAA,CACd,MAAA,WACA,OAAA;EACE,SAAA;EACA,WAAA,EAAa,WAAA;EACb,KAAA;AAAA,IAED,SAAA,CAAU,aAAA"}
1
+ {"version":3,"file":"interrupts.d.cts","names":[],"sources":["../../src/ui/interrupts.ts"],"mappings":";;;;;AAOA;;iBAAgB,2BAAA,aAAA,CACd,SAAA,EAAW,SAAA,CAAU,CAAA,IACpB,SAAA,CAAU,CAAA;;;;iBAaG,uBAAA,aAAA,CACd,UAAA,EAAY,SAAA,CAAU,CAAA,MACrB,SAAA,CAAU,CAAA;AAAA,iBAIG,iBAAA,yBAAA,CACd,MAAA,WACA,OAAA;EACE,SAAA;EACA,WAAA,EAAa,WAAA;EACb,KAAA;AAAA,IAED,SAAA,CAAU,aAAA"}
@@ -2,7 +2,8 @@ import { Interrupt, ThreadState } from "../schema.js";
2
2
 
3
3
  //#region src/ui/interrupts.d.ts
4
4
  /**
5
- * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.
5
+ * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated
6
+ * snake_case aliases for compatibility during migration.
6
7
  */
7
8
  declare function normalizeInterruptForClient<T = unknown>(interrupt: Interrupt<T>): Interrupt<T>;
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"interrupts.d.ts","names":[],"sources":["../../src/ui/interrupts.ts"],"mappings":";;;;;AAMA;iBAAgB,2BAAA,aAAA,CACd,SAAA,EAAW,SAAA,CAAU,CAAA,IACpB,SAAA,CAAU,CAAA;;;;iBAaG,uBAAA,aAAA,CACd,UAAA,EAAY,SAAA,CAAU,CAAA,MACrB,SAAA,CAAU,CAAA;AAAA,iBAIG,iBAAA,yBAAA,CACd,MAAA,WACA,OAAA;EACE,SAAA;EACA,WAAA,EAAa,WAAA;EACb,KAAA;AAAA,IAED,SAAA,CAAU,aAAA"}
1
+ {"version":3,"file":"interrupts.d.ts","names":[],"sources":["../../src/ui/interrupts.ts"],"mappings":";;;;;AAOA;;iBAAgB,2BAAA,aAAA,CACd,SAAA,EAAW,SAAA,CAAU,CAAA,IACpB,SAAA,CAAU,CAAA;;;;iBAaG,uBAAA,aAAA,CACd,UAAA,EAAY,SAAA,CAAU,CAAA,MACrB,SAAA,CAAU,CAAA;AAAA,iBAIG,iBAAA,yBAAA,CACd,MAAA,WACA,OAAA;EACE,SAAA;EACA,WAAA,EAAa,WAAA;EACb,KAAA;AAAA,IAED,SAAA,CAAU,aAAA"}
@@ -1,7 +1,8 @@
1
1
  import { normalizeHitlInterruptPayload } from "./hitl-interrupt-payload.js";
2
2
  //#region src/ui/interrupts.ts
3
3
  /**
4
- * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.
4
+ * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated
5
+ * snake_case aliases for compatibility during migration.
5
6
  */
6
7
  function normalizeInterruptForClient(interrupt) {
7
8
  if (interrupt.value === void 0) return interrupt;
@@ -1 +1 @@
1
- {"version":3,"file":"interrupts.js","names":[],"sources":["../../src/ui/interrupts.ts"],"sourcesContent":["import { normalizeHitlInterruptPayload } from \"./hitl-interrupt-payload.js\";\nimport { Interrupt, ThreadState } from \"../schema.js\";\n\n/**\n * Rewrites Python/API snake_case on interrupt `value` to JS camelCase for HITL.\n */\nexport function normalizeInterruptForClient<T = unknown>(\n interrupt: Interrupt<T>\n): Interrupt<T> {\n if (interrupt.value === undefined) {\n return interrupt;\n }\n return {\n ...interrupt,\n value: normalizeHitlInterruptPayload(interrupt.value) as T,\n };\n}\n\n/**\n * Applies {@link normalizeInterruptForClient} to each interrupt.\n */\nexport function normalizeInterruptsList<T = unknown>(\n interrupts: Interrupt<T>[]\n): Interrupt<T>[] {\n return interrupts.map((i) => normalizeInterruptForClient(i));\n}\n\nexport function extractInterrupts<InterruptType = unknown>(\n values: unknown,\n options?: {\n isLoading: boolean;\n threadState: ThreadState | undefined;\n error: unknown;\n }\n): Interrupt<InterruptType> | undefined {\n if (\n typeof values === \"object\" &&\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__ as Interrupt<InterruptType>[];\n if (valueInterrupts.length === 0) return { when: \"breakpoint\" };\n if (valueInterrupts.length === 1) {\n return normalizeInterruptForClient(valueInterrupts[0]);\n }\n\n // TODO: fix the typing of interrupts if multiple interrupts are returned\n const normalized = valueInterrupts.map((i) =>\n normalizeInterruptForClient(i)\n );\n return normalized as unknown as Interrupt<InterruptType> | undefined;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (options?.isLoading) return undefined;\n\n const interrupts = options?.threadState?.tasks?.at(-1)?.interrupts;\n if (interrupts == null || interrupts.length === 0) {\n // check if there's a next task present\n const next = options?.threadState?.next ?? [];\n if (!next.length || options?.error != null) return undefined;\n return { when: \"breakpoint\" };\n }\n\n // Return only the current interrupt\n return normalizeInterruptForClient(\n interrupts.at(-1) as Interrupt<InterruptType>\n );\n}\n"],"mappings":";;;;;AAMA,SAAgB,4BACd,WACc;AACd,KAAI,UAAU,UAAU,KAAA,EACtB,QAAO;AAET,QAAO;EACL,GAAG;EACH,OAAO,8BAA8B,UAAU,MAAM;EACtD;;;;;AAMH,SAAgB,wBACd,YACgB;AAChB,QAAO,WAAW,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAG9D,SAAgB,kBACd,QACA,SAKsC;AACtC,KACE,OAAO,WAAW,YAClB,UAAU,QACV,mBAAmB,UACnB,MAAM,QAAQ,OAAO,cAAc,EACnC;EACA,MAAM,kBAAkB,OAAO;AAC/B,MAAI,gBAAgB,WAAW,EAAG,QAAO,EAAE,MAAM,cAAc;AAC/D,MAAI,gBAAgB,WAAW,EAC7B,QAAO,4BAA4B,gBAAgB,GAAG;AAOxD,SAHmB,gBAAgB,KAAK,MACtC,4BAA4B,EAAE,CAC/B;;AAKH,KAAI,SAAS,UAAW,QAAO,KAAA;CAE/B,MAAM,aAAa,SAAS,aAAa,OAAO,GAAG,GAAG,EAAE;AACxD,KAAI,cAAc,QAAQ,WAAW,WAAW,GAAG;AAGjD,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;AAI/B,QAAO,4BACL,WAAW,GAAG,GAAG,CAClB"}
1
+ {"version":3,"file":"interrupts.js","names":[],"sources":["../../src/ui/interrupts.ts"],"sourcesContent":["import { normalizeHitlInterruptPayload } from \"./hitl-interrupt-payload.js\";\nimport { Interrupt, ThreadState } from \"../schema.js\";\n\n/**\n * Normalizes HITL interrupt payloads to expose camelCase fields plus deprecated\n * snake_case aliases for compatibility during migration.\n */\nexport function normalizeInterruptForClient<T = unknown>(\n interrupt: Interrupt<T>\n): Interrupt<T> {\n if (interrupt.value === undefined) {\n return interrupt;\n }\n return {\n ...interrupt,\n value: normalizeHitlInterruptPayload(interrupt.value) as T,\n };\n}\n\n/**\n * Applies {@link normalizeInterruptForClient} to each interrupt.\n */\nexport function normalizeInterruptsList<T = unknown>(\n interrupts: Interrupt<T>[]\n): Interrupt<T>[] {\n return interrupts.map((i) => normalizeInterruptForClient(i));\n}\n\nexport function extractInterrupts<InterruptType = unknown>(\n values: unknown,\n options?: {\n isLoading: boolean;\n threadState: ThreadState | undefined;\n error: unknown;\n }\n): Interrupt<InterruptType> | undefined {\n if (\n typeof values === \"object\" &&\n values != null &&\n \"__interrupt__\" in values &&\n Array.isArray(values.__interrupt__)\n ) {\n const valueInterrupts = values.__interrupt__ as Interrupt<InterruptType>[];\n if (valueInterrupts.length === 0) return { when: \"breakpoint\" };\n if (valueInterrupts.length === 1) {\n return normalizeInterruptForClient(valueInterrupts[0]);\n }\n\n // TODO: fix the typing of interrupts if multiple interrupts are returned\n const normalized = valueInterrupts.map((i) =>\n normalizeInterruptForClient(i)\n );\n return normalized as unknown as Interrupt<InterruptType> | undefined;\n }\n\n // If we're deferring to old interrupt detection logic, don't show the interrupt if the stream is loading\n if (options?.isLoading) return undefined;\n\n const interrupts = options?.threadState?.tasks?.at(-1)?.interrupts;\n if (interrupts == null || interrupts.length === 0) {\n // check if there's a next task present\n const next = options?.threadState?.next ?? [];\n if (!next.length || options?.error != null) return undefined;\n return { when: \"breakpoint\" };\n }\n\n // Return only the current interrupt\n return normalizeInterruptForClient(\n interrupts.at(-1) as Interrupt<InterruptType>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,4BACd,WACc;AACd,KAAI,UAAU,UAAU,KAAA,EACtB,QAAO;AAET,QAAO;EACL,GAAG;EACH,OAAO,8BAA8B,UAAU,MAAM;EACtD;;;;;AAMH,SAAgB,wBACd,YACgB;AAChB,QAAO,WAAW,KAAK,MAAM,4BAA4B,EAAE,CAAC;;AAG9D,SAAgB,kBACd,QACA,SAKsC;AACtC,KACE,OAAO,WAAW,YAClB,UAAU,QACV,mBAAmB,UACnB,MAAM,QAAQ,OAAO,cAAc,EACnC;EACA,MAAM,kBAAkB,OAAO;AAC/B,MAAI,gBAAgB,WAAW,EAAG,QAAO,EAAE,MAAM,cAAc;AAC/D,MAAI,gBAAgB,WAAW,EAC7B,QAAO,4BAA4B,gBAAgB,GAAG;AAOxD,SAHmB,gBAAgB,KAAK,MACtC,4BAA4B,EAAE,CAC/B;;AAKH,KAAI,SAAS,UAAW,QAAO,KAAA;CAE/B,MAAM,aAAa,SAAS,aAAa,OAAO,GAAG,GAAG,EAAE;AACxD,KAAI,cAAc,QAAQ,WAAW,WAAW,GAAG;AAGjD,MAAI,EADS,SAAS,aAAa,QAAQ,EAAE,EACnC,UAAU,SAAS,SAAS,KAAM,QAAO,KAAA;AACnD,SAAO,EAAE,MAAM,cAAc;;AAI/B,QAAO,4BACL,WAAW,GAAG,GAAG,CAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.cjs","names":["HumanMessageChunk","AIMessageChunk","SystemMessageChunk","ToolMessageChunk","RemoveMessage"],"sources":["../../src/ui/messages.ts"],"sourcesContent":["import {\n type BaseMessage,\n BaseMessageChunk,\n RemoveMessage,\n convertToChunk,\n coerceMessageLikeToMessage,\n isBaseMessageChunk,\n HumanMessageChunk,\n SystemMessageChunk,\n AIMessageChunk,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\n\nimport type { Message } from \"../types.messages.js\";\nimport type { ThreadState } from \"../schema.js\";\n\n/**\n * Replaces the `messages` property in a state type with `BaseMessage[]`.\n * Used by framework SDKs to reflect that `ensureHistoryMessageInstances`\n * converts plain message objects to class instances at runtime.\n */\nexport type StateWithBaseMessages<S> =\n S extends Record<string, unknown>\n ? \"messages\" extends keyof S\n ? Omit<S, \"messages\"> & { messages: BaseMessage[] }\n : S\n : S;\n\n/**\n * Maps a `ThreadState<StateType>[]` so that the `messages` field inside\n * `values` is typed as `BaseMessage[]` instead of `Message[]`.\n */\nexport type HistoryWithBaseMessages<T> = T extends ThreadState<infer S>[]\n ? ThreadState<StateWithBaseMessages<S>>[]\n : T;\n\nexport function tryConvertToChunk(\n message: BaseMessage | BaseMessageChunk\n): BaseMessageChunk | null {\n try {\n if (isBaseMessageChunk(message)) return message;\n return convertToChunk(message);\n } catch {\n return null;\n }\n}\n\nexport function tryCoerceMessageLikeToMessage(\n message: Omit<Message, \"type\"> & { type: string }\n): BaseMessage | BaseMessageChunk {\n if (message.type === \"human\" || message.type === \"user\") {\n return new HumanMessageChunk(message);\n }\n\n if (message.type === \"ai\" || message.type === \"assistant\") {\n return new AIMessageChunk(message);\n }\n\n if (message.type === \"system\") {\n return new SystemMessageChunk(message);\n }\n\n if (message.type === \"tool\" && \"tool_call_id\" in message) {\n return new ToolMessageChunk({\n ...message,\n tool_call_id: message.tool_call_id as string,\n });\n }\n\n if (message.type === \"remove\" && message.id != null) {\n return new RemoveMessage({ ...message, id: message.id });\n }\n\n return coerceMessageLikeToMessage(message);\n}\n\nexport class MessageTupleManager {\n chunks: Record<\n string,\n {\n chunk?: BaseMessageChunk | BaseMessage;\n metadata?: Record<string, unknown>;\n index?: number;\n }\n > = {};\n\n constructor() {\n this.chunks = {};\n }\n\n add(\n serialized: Message,\n metadata: Record<string, unknown> | undefined\n ): string | null {\n // TODO: this is sometimes sent from the API\n // figure out how to prevent this or move this to LC.js\n if (serialized.type.endsWith(\"MessageChunk\")) {\n // eslint-disable-next-line no-param-reassign\n serialized.type = serialized.type\n .slice(0, -\"MessageChunk\".length)\n .toLowerCase() as Message[\"type\"];\n }\n\n const message = tryCoerceMessageLikeToMessage(serialized);\n const chunk = tryConvertToChunk(message);\n\n const { id } = chunk ?? message;\n if (!id) {\n console.warn(\n \"No message ID found for chunk, ignoring in state\",\n serialized\n );\n return null;\n }\n\n this.chunks[id] ??= {};\n this.chunks[id].metadata = metadata ?? this.chunks[id].metadata;\n if (chunk) {\n const prev = this.chunks[id].chunk;\n this.chunks[id].chunk =\n (isBaseMessageChunk(prev) ? prev : null)?.concat(chunk) ?? chunk;\n } else {\n this.chunks[id].chunk = message;\n }\n\n return id;\n }\n\n clear() {\n this.chunks = {};\n }\n\n get(id: string | null | undefined, defaultIndex?: number) {\n if (id == null) return null;\n if (this.chunks[id] == null) return null;\n if (defaultIndex != null) this.chunks[id].index ??= defaultIndex;\n return this.chunks[id];\n }\n}\n\nexport const toMessageDict = (chunk: BaseMessage): Message => {\n const { type, data } = chunk.toDict();\n return { ...data, type } as Message;\n};\n\n/**\n * Identity converter that keeps @langchain/core class instances.\n * Used by framework SDKs to expose BaseMessage instances instead of plain dicts.\n */\nexport const toMessageClass = (chunk: BaseMessage): BaseMessage => chunk;\n\n/**\n * Ensures all messages in an array are BaseMessage class instances.\n * Messages that are already class instances pass through unchanged.\n * Plain message objects (e.g. from API values/history) are converted\n * via {@link tryCoerceMessageLikeToMessage}.\n */\nexport function ensureMessageInstances(\n messages: (Message | BaseMessage)[]\n): (BaseMessage | BaseMessageChunk)[] {\n return messages.map((msg) => {\n if (typeof (msg as BaseMessage).getType === \"function\") {\n return msg as BaseMessage;\n }\n return tryCoerceMessageLikeToMessage(\n msg as Omit<Message, \"type\"> & { type: string }\n );\n });\n}\n\n/**\n * Converts plain message objects within each history state's values\n * to proper BaseMessage class instances. Returns a new array with\n * shallow-copied states whose messages have been coerced.\n */\nexport function ensureHistoryMessageInstances<\n StateType extends Record<string, unknown>,\n>(\n history: ThreadState<StateType>[],\n messagesKey: string = \"messages\"\n): ThreadState<StateType>[] {\n return history.map((state) => {\n if (state.values == null) return state;\n const messages = state.values[messagesKey];\n if (!Array.isArray(messages)) return state;\n return {\n ...state,\n values: {\n ...state.values,\n [messagesKey]: ensureMessageInstances(messages),\n },\n };\n });\n}\n"],"mappings":";;;AAoCA,SAAgB,kBACd,SACyB;AACzB,KAAI;AACF,OAAA,GAAA,yBAAA,oBAAuB,QAAQ,CAAE,QAAO;AACxC,UAAA,GAAA,yBAAA,gBAAsB,QAAQ;SACxB;AACN,SAAO;;;AAIX,SAAgB,8BACd,SACgC;AAChC,KAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,OAC/C,QAAO,IAAIA,yBAAAA,kBAAkB,QAAQ;AAGvC,KAAI,QAAQ,SAAS,QAAQ,QAAQ,SAAS,YAC5C,QAAO,IAAIC,yBAAAA,eAAe,QAAQ;AAGpC,KAAI,QAAQ,SAAS,SACnB,QAAO,IAAIC,yBAAAA,mBAAmB,QAAQ;AAGxC,KAAI,QAAQ,SAAS,UAAU,kBAAkB,QAC/C,QAAO,IAAIC,yBAAAA,iBAAiB;EAC1B,GAAG;EACH,cAAc,QAAQ;EACvB,CAAC;AAGJ,KAAI,QAAQ,SAAS,YAAY,QAAQ,MAAM,KAC7C,QAAO,IAAIC,yBAAAA,cAAc;EAAE,GAAG;EAAS,IAAI,QAAQ;EAAI,CAAC;AAG1D,SAAA,GAAA,yBAAA,4BAAkC,QAAQ;;AAG5C,IAAa,sBAAb,MAAiC;CAC/B,SAOI,EAAE;CAEN,cAAc;AACZ,OAAK,SAAS,EAAE;;CAGlB,IACE,YACA,UACe;AAGf,MAAI,WAAW,KAAK,SAAS,eAAe,CAE1C,YAAW,OAAO,WAAW,KAC1B,MAAM,GAAG,IAAuB,CAChC,aAAa;EAGlB,MAAM,UAAU,8BAA8B,WAAW;EACzD,MAAM,QAAQ,kBAAkB,QAAQ;EAExC,MAAM,EAAE,OAAO,SAAS;AACxB,MAAI,CAAC,IAAI;AACP,WAAQ,KACN,oDACA,WACD;AACD,UAAO;;AAGT,OAAK,OAAO,QAAQ,EAAE;AACtB,OAAK,OAAO,IAAI,WAAW,YAAY,KAAK,OAAO,IAAI;AACvD,MAAI,OAAO;GACT,MAAM,OAAO,KAAK,OAAO,IAAI;AAC7B,QAAK,OAAO,IAAI,UAAA,GAAA,yBAAA,oBACM,KAAK,GAAG,OAAO,OAAO,OAAO,MAAM,IAAI;QAE7D,MAAK,OAAO,IAAI,QAAQ;AAG1B,SAAO;;CAGT,QAAQ;AACN,OAAK,SAAS,EAAE;;CAGlB,IAAI,IAA+B,cAAuB;AACxD,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,KAAK,OAAO,OAAO,KAAM,QAAO;AACpC,MAAI,gBAAgB,KAAM,MAAK,OAAO,IAAI,UAAU;AACpD,SAAO,KAAK,OAAO;;;AAIvB,MAAa,iBAAiB,UAAgC;CAC5D,MAAM,EAAE,MAAM,SAAS,MAAM,QAAQ;AACrC,QAAO;EAAE,GAAG;EAAM;EAAM;;;;;;AAO1B,MAAa,kBAAkB,UAAoC;;;;;;;AAQnE,SAAgB,uBACd,UACoC;AACpC,QAAO,SAAS,KAAK,QAAQ;AAC3B,MAAI,OAAQ,IAAoB,YAAY,WAC1C,QAAO;AAET,SAAO,8BACL,IACD;GACD;;;;;;;AAQJ,SAAgB,8BAGd,SACA,cAAsB,YACI;AAC1B,QAAO,QAAQ,KAAK,UAAU;AAC5B,MAAI,MAAM,UAAU,KAAM,QAAO;EACjC,MAAM,WAAW,MAAM,OAAO;AAC9B,MAAI,CAAC,MAAM,QAAQ,SAAS,CAAE,QAAO;AACrC,SAAO;GACL,GAAG;GACH,QAAQ;IACN,GAAG,MAAM;KACR,cAAc,uBAAuB,SAAS;IAChD;GACF;GACD"}
1
+ {"version":3,"file":"messages.cjs","names":["HumanMessageChunk","AIMessageChunk","SystemMessageChunk","ToolMessageChunk","RemoveMessage"],"sources":["../../src/ui/messages.ts"],"sourcesContent":["import {\n type BaseMessage,\n BaseMessageChunk,\n RemoveMessage,\n convertToChunk,\n coerceMessageLikeToMessage,\n isBaseMessageChunk,\n HumanMessageChunk,\n SystemMessageChunk,\n AIMessageChunk,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\n\nimport type { Message } from \"../types.messages.js\";\nimport type { ThreadState } from \"../schema.js\";\n\n/**\n * Replaces the `messages` property in a state type with `BaseMessage[]`.\n * Used by framework SDKs to reflect that `ensureHistoryMessageInstances`\n * converts plain message objects to class instances at runtime.\n */\nexport type StateWithBaseMessages<S> = S extends { messages: unknown }\n ? Omit<S, \"messages\"> & { messages: BaseMessage[] }\n : S;\n\n/**\n * Maps a `ThreadState<StateType>[]` so that the `messages` field inside\n * `values` is typed as `BaseMessage[]` instead of `Message[]`.\n */\nexport type HistoryWithBaseMessages<T> = T extends ThreadState<infer S>[]\n ? ThreadState<StateWithBaseMessages<S>>[]\n : T;\n\nexport function tryConvertToChunk(\n message: BaseMessage | BaseMessageChunk\n): BaseMessageChunk | null {\n try {\n if (isBaseMessageChunk(message)) return message;\n return convertToChunk(message);\n } catch {\n return null;\n }\n}\n\nexport function tryCoerceMessageLikeToMessage(\n message: Omit<Message, \"type\"> & { type: string }\n): BaseMessage | BaseMessageChunk {\n if (message.type === \"human\" || message.type === \"user\") {\n return new HumanMessageChunk(message);\n }\n\n if (message.type === \"ai\" || message.type === \"assistant\") {\n return new AIMessageChunk(message);\n }\n\n if (message.type === \"system\") {\n return new SystemMessageChunk(message);\n }\n\n if (message.type === \"tool\" && \"tool_call_id\" in message) {\n return new ToolMessageChunk({\n ...message,\n tool_call_id: message.tool_call_id as string,\n });\n }\n\n if (message.type === \"remove\" && message.id != null) {\n return new RemoveMessage({ ...message, id: message.id });\n }\n\n return coerceMessageLikeToMessage(message);\n}\n\nexport class MessageTupleManager {\n chunks: Record<\n string,\n {\n chunk?: BaseMessageChunk | BaseMessage;\n metadata?: Record<string, unknown>;\n index?: number;\n }\n > = {};\n\n constructor() {\n this.chunks = {};\n }\n\n add(\n serialized: Message,\n metadata: Record<string, unknown> | undefined\n ): string | null {\n // TODO: this is sometimes sent from the API\n // figure out how to prevent this or move this to LC.js\n if (serialized.type.endsWith(\"MessageChunk\")) {\n // eslint-disable-next-line no-param-reassign\n serialized.type = serialized.type\n .slice(0, -\"MessageChunk\".length)\n .toLowerCase() as Message[\"type\"];\n }\n\n const message = tryCoerceMessageLikeToMessage(serialized);\n const chunk = tryConvertToChunk(message);\n\n const { id } = chunk ?? message;\n if (!id) {\n console.warn(\n \"No message ID found for chunk, ignoring in state\",\n serialized\n );\n return null;\n }\n\n this.chunks[id] ??= {};\n this.chunks[id].metadata = metadata ?? this.chunks[id].metadata;\n if (chunk) {\n const prev = this.chunks[id].chunk;\n this.chunks[id].chunk =\n (isBaseMessageChunk(prev) ? prev : null)?.concat(chunk) ?? chunk;\n } else {\n this.chunks[id].chunk = message;\n }\n\n return id;\n }\n\n clear() {\n this.chunks = {};\n }\n\n get(id: string | null | undefined, defaultIndex?: number) {\n if (id == null) return null;\n if (this.chunks[id] == null) return null;\n if (defaultIndex != null) this.chunks[id].index ??= defaultIndex;\n return this.chunks[id];\n }\n}\n\nexport const toMessageDict = (chunk: BaseMessage): Message => {\n const { type, data } = chunk.toDict();\n return { ...data, type } as Message;\n};\n\n/**\n * Identity converter that keeps @langchain/core class instances.\n * Used by framework SDKs to expose BaseMessage instances instead of plain dicts.\n */\nexport const toMessageClass = (chunk: BaseMessage): BaseMessage => chunk;\n\n/**\n * Ensures all messages in an array are BaseMessage class instances.\n * Messages that are already class instances pass through unchanged.\n * Plain message objects (e.g. from API values/history) are converted\n * via {@link tryCoerceMessageLikeToMessage}.\n */\nexport function ensureMessageInstances(\n messages: (Message | BaseMessage)[]\n): (BaseMessage | BaseMessageChunk)[] {\n return messages.map((msg) => {\n if (typeof (msg as BaseMessage).getType === \"function\") {\n return msg as BaseMessage;\n }\n return tryCoerceMessageLikeToMessage(\n msg as Omit<Message, \"type\"> & { type: string }\n );\n });\n}\n\n/**\n * Converts plain message objects within each history state's values\n * to proper BaseMessage class instances. Returns a new array with\n * shallow-copied states whose messages have been coerced.\n */\nexport function ensureHistoryMessageInstances<\n StateType extends Record<string, unknown>,\n>(\n history: ThreadState<StateType>[],\n messagesKey: string = \"messages\"\n): ThreadState<StateType>[] {\n return history.map((state) => {\n if (state.values == null) return state;\n const messages = state.values[messagesKey];\n if (!Array.isArray(messages)) return state;\n return {\n ...state,\n values: {\n ...state.values,\n [messagesKey]: ensureMessageInstances(messages),\n },\n };\n });\n}\n"],"mappings":";;;AAiCA,SAAgB,kBACd,SACyB;AACzB,KAAI;AACF,OAAA,GAAA,yBAAA,oBAAuB,QAAQ,CAAE,QAAO;AACxC,UAAA,GAAA,yBAAA,gBAAsB,QAAQ;SACxB;AACN,SAAO;;;AAIX,SAAgB,8BACd,SACgC;AAChC,KAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,OAC/C,QAAO,IAAIA,yBAAAA,kBAAkB,QAAQ;AAGvC,KAAI,QAAQ,SAAS,QAAQ,QAAQ,SAAS,YAC5C,QAAO,IAAIC,yBAAAA,eAAe,QAAQ;AAGpC,KAAI,QAAQ,SAAS,SACnB,QAAO,IAAIC,yBAAAA,mBAAmB,QAAQ;AAGxC,KAAI,QAAQ,SAAS,UAAU,kBAAkB,QAC/C,QAAO,IAAIC,yBAAAA,iBAAiB;EAC1B,GAAG;EACH,cAAc,QAAQ;EACvB,CAAC;AAGJ,KAAI,QAAQ,SAAS,YAAY,QAAQ,MAAM,KAC7C,QAAO,IAAIC,yBAAAA,cAAc;EAAE,GAAG;EAAS,IAAI,QAAQ;EAAI,CAAC;AAG1D,SAAA,GAAA,yBAAA,4BAAkC,QAAQ;;AAG5C,IAAa,sBAAb,MAAiC;CAC/B,SAOI,EAAE;CAEN,cAAc;AACZ,OAAK,SAAS,EAAE;;CAGlB,IACE,YACA,UACe;AAGf,MAAI,WAAW,KAAK,SAAS,eAAe,CAE1C,YAAW,OAAO,WAAW,KAC1B,MAAM,GAAG,IAAuB,CAChC,aAAa;EAGlB,MAAM,UAAU,8BAA8B,WAAW;EACzD,MAAM,QAAQ,kBAAkB,QAAQ;EAExC,MAAM,EAAE,OAAO,SAAS;AACxB,MAAI,CAAC,IAAI;AACP,WAAQ,KACN,oDACA,WACD;AACD,UAAO;;AAGT,OAAK,OAAO,QAAQ,EAAE;AACtB,OAAK,OAAO,IAAI,WAAW,YAAY,KAAK,OAAO,IAAI;AACvD,MAAI,OAAO;GACT,MAAM,OAAO,KAAK,OAAO,IAAI;AAC7B,QAAK,OAAO,IAAI,UAAA,GAAA,yBAAA,oBACM,KAAK,GAAG,OAAO,OAAO,OAAO,MAAM,IAAI;QAE7D,MAAK,OAAO,IAAI,QAAQ;AAG1B,SAAO;;CAGT,QAAQ;AACN,OAAK,SAAS,EAAE;;CAGlB,IAAI,IAA+B,cAAuB;AACxD,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,KAAK,OAAO,OAAO,KAAM,QAAO;AACpC,MAAI,gBAAgB,KAAM,MAAK,OAAO,IAAI,UAAU;AACpD,SAAO,KAAK,OAAO;;;AAIvB,MAAa,iBAAiB,UAAgC;CAC5D,MAAM,EAAE,MAAM,SAAS,MAAM,QAAQ;AACrC,QAAO;EAAE,GAAG;EAAM;EAAM;;;;;;AAO1B,MAAa,kBAAkB,UAAoC;;;;;;;AAQnE,SAAgB,uBACd,UACoC;AACpC,QAAO,SAAS,KAAK,QAAQ;AAC3B,MAAI,OAAQ,IAAoB,YAAY,WAC1C,QAAO;AAET,SAAO,8BACL,IACD;GACD;;;;;;;AAQJ,SAAgB,8BAGd,SACA,cAAsB,YACI;AAC1B,QAAO,QAAQ,KAAK,UAAU;AAC5B,MAAI,MAAM,UAAU,KAAM,QAAO;EACjC,MAAM,WAAW,MAAM,OAAO;AAC9B,MAAI,CAAC,MAAM,QAAQ,SAAS,CAAE,QAAO;AACrC,SAAO;GACL,GAAG;GACH,QAAQ;IACN,GAAG,MAAM;KACR,cAAc,uBAAuB,SAAS;IAChD;GACF;GACD"}
@@ -9,9 +9,11 @@ import { BaseMessage, BaseMessageChunk } from "@langchain/core/messages";
9
9
  * Used by framework SDKs to reflect that `ensureHistoryMessageInstances`
10
10
  * converts plain message objects to class instances at runtime.
11
11
  */
12
- type StateWithBaseMessages<S> = S extends Record<string, unknown> ? "messages" extends keyof S ? Omit<S, "messages"> & {
12
+ type StateWithBaseMessages<S> = S extends {
13
+ messages: unknown;
14
+ } ? Omit<S, "messages"> & {
13
15
  messages: BaseMessage[];
14
- } : S : S;
16
+ } : S;
15
17
  /**
16
18
  * Maps a `ThreadState<StateType>[]` so that the `messages` field inside
17
19
  * `values` is typed as `BaseMessage[]` instead of `Message[]`.
@@ -52,5 +54,5 @@ declare function ensureMessageInstances(messages: (Message | BaseMessage)[]): (B
52
54
  */
53
55
  declare function ensureHistoryMessageInstances<StateType extends Record<string, unknown>>(history: ThreadState<StateType>[], messagesKey?: string): ThreadState<StateType>[];
54
56
  //#endregion
55
- export { HistoryWithBaseMessages, MessageTupleManager, ensureHistoryMessageInstances, ensureMessageInstances, toMessageClass, toMessageDict };
57
+ export { HistoryWithBaseMessages, MessageTupleManager, StateWithBaseMessages, ensureHistoryMessageInstances, ensureMessageInstances, toMessageClass, toMessageDict };
56
58
  //# sourceMappingURL=messages.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.cts","names":[],"sources":["../../src/ui/messages.ts"],"mappings":";;;;;;;;;AAqBA;;KAAY,qBAAA,MACV,CAAA,SAAU,MAAA,6CACmB,CAAA,GACvB,IAAA,CAAK,CAAA;EAAmB,QAAA,EAAU,WAAA;AAAA,IAClC,CAAA,GACF,CAAA;;;;;KAMM,uBAAA,MAA6B,CAAA,SAAU,WAAA,cAC/C,WAAA,CAAY,qBAAA,CAAsB,CAAA,OAClC,CAAA;AAAA,cA0CS,mBAAA;EACX,MAAA,EAAQ,MAAA;IAGJ,KAAA,GAAQ,gBAAA,GAAmB,WAAA;IAC3B,QAAA,GAAW,MAAA;IACX,KAAA;EAAA;EAIJ,WAAA,CAAA;EAIA,GAAA,CACE,UAAA,EAAY,OAAA,EACZ,QAAA,EAAU,MAAA;EAoCZ,KAAA,CAAA;EAIA,GAAA,CAAI,EAAA,6BAA+B,YAAA;mEAxCjB,yBAAA,CAAA,cAAA;;;;;cAgDP,aAAA,GAAa,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAGzB,yBAAA,CAHyB,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,OAAA;;;;;cASb,cAAA,GAAc,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAA6C,yBAAA,CAA7C,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,WAAA;;;;;;;iBAQX,sBAAA,CACd,QAAA,GAAW,OAAA,GAAU,WAAA,OACnB,WAAA,GAAc,gBAAA;;;;;AAnFlB;iBAmGgB,6BAAA,mBACI,MAAA,kBAAA,CAElB,OAAA,EAAS,WAAA,CAAY,SAAA,KACrB,WAAA,YACC,WAAA,CAAY,SAAA"}
1
+ {"version":3,"file":"messages.d.cts","names":[],"sources":["../../src/ui/messages.ts"],"mappings":";;;;;;;;;AAqBA;;KAAY,qBAAA,MAA2B,CAAA;EAAY,QAAA;AAAA,IAC/C,IAAA,CAAK,CAAA;EAAmB,QAAA,EAAU,WAAA;AAAA,IAClC,CAAA;;;;;KAMQ,uBAAA,MAA6B,CAAA,SAAU,WAAA,cAC/C,WAAA,CAAY,qBAAA,CAAsB,CAAA,OAClC,CAAA;AAAA,cA0CS,mBAAA;EACX,MAAA,EAAQ,MAAA;IAGJ,KAAA,GAAQ,gBAAA,GAAmB,WAAA;IAC3B,QAAA,GAAW,MAAA;IACX,KAAA;EAAA;EAIJ,WAAA,CAAA;EAIA,GAAA,CACE,UAAA,EAAY,OAAA,EACZ,QAAA,EAAU,MAAA;EAoCZ,KAAA,CAAA;EAIA,GAAA,CAAI,EAAA,6BAA+B,YAAA;mEAxCjB,yBAAA,CAAA,cAAA;;;;;cAgDP,aAAA,GAAa,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAGzB,yBAAA,CAHyB,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,OAAA;;;;;cASb,cAAA,GAAc,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAA6C,yBAAA,CAA7C,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,WAAA;;;;;AAzE3B;;iBAiFgB,sBAAA,CACd,QAAA,GAAW,OAAA,GAAU,WAAA,OACnB,WAAA,GAAc,gBAAA;;;;;;iBAgBF,6BAAA,mBACI,MAAA,kBAAA,CAElB,OAAA,EAAS,WAAA,CAAY,SAAA,KACrB,WAAA,YACC,WAAA,CAAY,SAAA"}
@@ -9,9 +9,11 @@ import { BaseMessage, BaseMessageChunk } from "@langchain/core/messages";
9
9
  * Used by framework SDKs to reflect that `ensureHistoryMessageInstances`
10
10
  * converts plain message objects to class instances at runtime.
11
11
  */
12
- type StateWithBaseMessages<S> = S extends Record<string, unknown> ? "messages" extends keyof S ? Omit<S, "messages"> & {
12
+ type StateWithBaseMessages<S> = S extends {
13
+ messages: unknown;
14
+ } ? Omit<S, "messages"> & {
13
15
  messages: BaseMessage[];
14
- } : S : S;
16
+ } : S;
15
17
  /**
16
18
  * Maps a `ThreadState<StateType>[]` so that the `messages` field inside
17
19
  * `values` is typed as `BaseMessage[]` instead of `Message[]`.
@@ -52,5 +54,5 @@ declare function ensureMessageInstances(messages: (Message | BaseMessage)[]): (B
52
54
  */
53
55
  declare function ensureHistoryMessageInstances<StateType extends Record<string, unknown>>(history: ThreadState<StateType>[], messagesKey?: string): ThreadState<StateType>[];
54
56
  //#endregion
55
- export { HistoryWithBaseMessages, MessageTupleManager, ensureHistoryMessageInstances, ensureMessageInstances, toMessageClass, toMessageDict };
57
+ export { HistoryWithBaseMessages, MessageTupleManager, StateWithBaseMessages, ensureHistoryMessageInstances, ensureMessageInstances, toMessageClass, toMessageDict };
56
58
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","names":[],"sources":["../../src/ui/messages.ts"],"mappings":";;;;;;;;;AAqBA;;KAAY,qBAAA,MACV,CAAA,SAAU,MAAA,6CACmB,CAAA,GACvB,IAAA,CAAK,CAAA;EAAmB,QAAA,EAAU,WAAA;AAAA,IAClC,CAAA,GACF,CAAA;;;;;KAMM,uBAAA,MAA6B,CAAA,SAAU,WAAA,cAC/C,WAAA,CAAY,qBAAA,CAAsB,CAAA,OAClC,CAAA;AAAA,cA0CS,mBAAA;EACX,MAAA,EAAQ,MAAA;IAGJ,KAAA,GAAQ,gBAAA,GAAmB,WAAA;IAC3B,QAAA,GAAW,MAAA;IACX,KAAA;EAAA;EAIJ,WAAA,CAAA;EAIA,GAAA,CACE,UAAA,EAAY,OAAA,EACZ,QAAA,EAAU,MAAA;EAoCZ,KAAA,CAAA;EAIA,GAAA,CAAI,EAAA,6BAA+B,YAAA;mEAxCjB,yBAAA,CAAA,cAAA;;;;;cAgDP,aAAA,GAAa,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAGzB,yBAAA,CAHyB,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,OAAA;;;;;cASb,cAAA,GAAc,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAA6C,yBAAA,CAA7C,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,WAAA;;;;;;;iBAQX,sBAAA,CACd,QAAA,GAAW,OAAA,GAAU,WAAA,OACnB,WAAA,GAAc,gBAAA;;;;;AAnFlB;iBAmGgB,6BAAA,mBACI,MAAA,kBAAA,CAElB,OAAA,EAAS,WAAA,CAAY,SAAA,KACrB,WAAA,YACC,WAAA,CAAY,SAAA"}
1
+ {"version":3,"file":"messages.d.ts","names":[],"sources":["../../src/ui/messages.ts"],"mappings":";;;;;;;;;AAqBA;;KAAY,qBAAA,MAA2B,CAAA;EAAY,QAAA;AAAA,IAC/C,IAAA,CAAK,CAAA;EAAmB,QAAA,EAAU,WAAA;AAAA,IAClC,CAAA;;;;;KAMQ,uBAAA,MAA6B,CAAA,SAAU,WAAA,cAC/C,WAAA,CAAY,qBAAA,CAAsB,CAAA,OAClC,CAAA;AAAA,cA0CS,mBAAA;EACX,MAAA,EAAQ,MAAA;IAGJ,KAAA,GAAQ,gBAAA,GAAmB,WAAA;IAC3B,QAAA,GAAW,MAAA;IACX,KAAA;EAAA;EAIJ,WAAA,CAAA;EAIA,GAAA,CACE,UAAA,EAAY,OAAA,EACZ,QAAA,EAAU,MAAA;EAoCZ,KAAA,CAAA;EAIA,GAAA,CAAI,EAAA,6BAA+B,YAAA;mEAxCjB,yBAAA,CAAA,cAAA;;;;;cAgDP,aAAA,GAAa,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAGzB,yBAAA,CAHyB,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,OAAA;;;;;cASb,cAAA,GAAc,KAAA,EAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAA6C,yBAAA,CAA7C,cAAA,GAAA,yBAAA,CAAA,WAAA,MAAA,WAAA,CAAA,yBAAA,CAAA,gBAAA,CAAA,yBAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,WAAA;;;;;AAzE3B;;iBAiFgB,sBAAA,CACd,QAAA,GAAW,OAAA,GAAU,WAAA,OACnB,WAAA,GAAc,gBAAA;;;;;;iBAgBF,6BAAA,mBACI,MAAA,kBAAA,CAElB,OAAA,EAAS,WAAA,CAAY,SAAA,KACrB,WAAA,YACC,WAAA,CAAY,SAAA"}