@langchain/angular 0.2.0 → 0.3.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 (32) hide show
  1. package/README.md +17 -15
  2. package/dist/context.cjs +0 -49
  3. package/dist/context.cjs.map +1 -1
  4. package/dist/context.d.cts +1 -46
  5. package/dist/context.d.cts.map +1 -1
  6. package/dist/context.d.ts +1 -46
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +1 -49
  9. package/dist/context.js.map +1 -1
  10. package/dist/index.cjs +118 -401
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +261 -27
  13. package/dist/index.d.cts.map +1 -1
  14. package/dist/index.d.ts +261 -27
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +119 -404
  17. package/dist/index.js.map +1 -1
  18. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_@opentelemetry_api@1.9.0_openai@6.27.0_ws@8.19._0520fb05d9e85da5f9e061dfe28cdbc8/node_modules/langchain/dist/index.d.cts +2 -2
  19. package/dist/node_modules/.pnpm/langchain@1.2.30_@langchain_core@1.1.31_@opentelemetry_api@1.9.0_openai@6.27.0_ws@8.19._0520fb05d9e85da5f9e061dfe28cdbc8/node_modules/langchain/dist/index.d.ts +2 -2
  20. package/dist/stream.custom.cjs +54 -158
  21. package/dist/stream.custom.cjs.map +1 -1
  22. package/dist/stream.custom.d.cts +45 -0
  23. package/dist/stream.custom.d.cts.map +1 -0
  24. package/dist/stream.custom.d.ts +45 -0
  25. package/dist/stream.custom.d.ts.map +1 -0
  26. package/dist/stream.custom.js +55 -160
  27. package/dist/stream.custom.js.map +1 -1
  28. package/dist/subagent-types.d.cts +15 -0
  29. package/dist/subagent-types.d.cts.map +1 -0
  30. package/dist/subagent-types.d.ts +15 -0
  31. package/dist/subagent-types.d.ts.map +1 -0
  32. package/package.json +3 -3
@@ -1,153 +1,50 @@
1
1
  import { computed, effect, signal } from "@angular/core";
2
- import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
3
- import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
2
+ import { CustomStreamOrchestrator, ensureMessageInstances } from "@langchain/langgraph-sdk/ui";
4
3
  //#region src/stream.custom.ts
5
- function createCustomTransportThreadState(values, threadId) {
6
- return {
7
- values,
8
- next: [],
9
- tasks: [],
10
- metadata: void 0,
11
- created_at: null,
12
- checkpoint: {
13
- thread_id: threadId,
14
- checkpoint_id: null,
15
- checkpoint_ns: "",
16
- checkpoint_map: null
17
- },
18
- parent_checkpoint: null
19
- };
20
- }
21
- function useStreamCustom(options) {
22
- const messageManager = new MessageTupleManager();
23
- const stream = new StreamManager(messageManager, {
24
- throttle: options.throttle ?? false,
25
- subagentToolNames: options.subagentToolNames,
26
- filterSubagentMessages: options.filterSubagentMessages,
27
- toMessage: toMessageClass
28
- });
29
- const streamValues = signal(stream.values);
30
- const streamError = signal(stream.error);
31
- const isLoading = signal(stream.isLoading);
4
+ function injectStreamCustom(options) {
5
+ const orchestrator = new CustomStreamOrchestrator(options);
6
+ const version = signal(0);
32
7
  const subagentVersion = signal(0);
33
8
  effect((onCleanup) => {
34
- const unsubscribe = stream.subscribe(() => {
35
- streamValues.set(stream.values);
36
- streamError.set(stream.error);
37
- isLoading.set(stream.isLoading);
9
+ const unsubscribe = orchestrator.subscribe(() => {
10
+ version.update((v) => v + 1);
38
11
  subagentVersion.update((v) => v + 1);
39
12
  });
40
13
  onCleanup(() => unsubscribe());
41
14
  });
42
- let threadId = options.threadId ?? null;
43
- const branch = signal("");
44
- const getMessages = (value) => {
45
- const messagesKey = options.messagesKey ?? "messages";
46
- return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
47
- };
48
- const setMessages = (current, messages) => {
49
- const messagesKey = options.messagesKey ?? "messages";
50
- return {
51
- ...current,
52
- [messagesKey]: messages
53
- };
54
- };
55
- const historyValues = options.initialValues ?? {};
56
- const historyMessages = getMessages(historyValues);
57
- const shouldReconstructSubagents = options.filterSubagentMessages && !stream.isLoading && historyMessages.length > 0;
58
15
  effect(() => {
59
- const loading = isLoading();
60
- const hvMessages = getMessages(historyValues);
61
- if (options.filterSubagentMessages && !loading && hvMessages.length > 0) stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });
16
+ version();
17
+ const loading = orchestrator.isLoading;
18
+ const hvMessages = orchestrator.messages;
19
+ if (options.filterSubagentMessages && !loading && hvMessages.length > 0) orchestrator.reconstructSubagentsIfNeeded();
62
20
  });
63
- if (shouldReconstructSubagents) stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });
64
- function switchThread(newThreadId) {
65
- if (newThreadId !== threadId) {
66
- threadId = newThreadId;
67
- stream.clear();
68
- }
69
- }
70
- function stop() {
71
- return stream.stop(historyValues, { onStop: options.onStop });
72
- }
73
- async function submitDirect(values, submitOptions) {
74
- const currentThreadId = options.threadId ?? null;
75
- if (currentThreadId !== threadId) {
76
- threadId = currentThreadId;
77
- stream.clear();
78
- }
79
- let usableThreadId = threadId ?? submitOptions?.threadId;
80
- stream.setStreamValues(() => {
81
- if (submitOptions?.optimisticValues != null) return {
82
- ...historyValues,
83
- ...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
84
- };
85
- return { ...historyValues };
86
- });
87
- await stream.start(async (signal) => {
88
- if (!usableThreadId) {
89
- usableThreadId = crypto.randomUUID();
90
- threadId = usableThreadId;
91
- options.onThreadId?.(usableThreadId);
92
- }
93
- if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
94
- return options.transport.stream({
95
- input: values,
96
- context: submitOptions?.context,
97
- command: submitOptions?.command,
98
- streamSubgraphs: submitOptions?.streamSubgraphs,
99
- signal,
100
- config: {
101
- ...submitOptions?.config,
102
- configurable: {
103
- thread_id: usableThreadId,
104
- ...submitOptions?.config?.configurable
105
- }
106
- }
107
- });
108
- }, {
109
- getMessages,
110
- setMessages,
111
- initialValues: {},
112
- callbacks: options,
113
- onSuccess: () => {
114
- if (!usableThreadId) return void 0;
115
- const finalValues = stream.values ?? historyValues;
116
- options.onFinish?.(createCustomTransportThreadState(finalValues, usableThreadId), void 0);
117
- },
118
- onError(error) {
119
- options.onError?.(error, void 0);
120
- submitOptions?.onError?.(error, void 0);
121
- }
122
- });
123
- }
124
- async function submit(values, submitOptions) {
125
- await submitDirect(values, submitOptions);
126
- }
127
- const values = computed(() => streamValues() ?? {});
128
- function setBranch(value) {
129
- branch.set(value);
130
- }
131
- function getMessagesMetadata(message, index) {
132
- const streamMetadata = messageManager.get(message.id)?.metadata;
133
- if (streamMetadata != null) return {
134
- messageId: message.id ?? String(index),
135
- firstSeenState: void 0,
136
- branch: void 0,
137
- branchOptions: void 0,
138
- streamMetadata
139
- };
140
- }
21
+ const values = computed(() => {
22
+ version();
23
+ return orchestrator.values;
24
+ });
25
+ const branch = signal("");
141
26
  return {
142
27
  values,
143
- error: streamError,
144
- isLoading,
145
- stop,
146
- submit,
147
- switchThread,
28
+ error: computed(() => {
29
+ version();
30
+ return orchestrator.error;
31
+ }),
32
+ isLoading: signal(false),
33
+ stop: () => orchestrator.stop(),
34
+ async submit(values, submitOptions) {
35
+ await orchestrator.submit(values, submitOptions);
36
+ },
37
+ switchThread(newThreadId) {
38
+ orchestrator.switchThread(newThreadId);
39
+ },
148
40
  branch,
149
- setBranch,
150
- getMessagesMetadata,
41
+ setBranch(value) {
42
+ branch.set(value);
43
+ orchestrator.setBranch(value);
44
+ },
45
+ getMessagesMetadata(message, index) {
46
+ return orchestrator.getMessagesMetadata(message, index);
47
+ },
151
48
  queue: {
152
49
  entries: signal([]),
153
50
  size: signal(0),
@@ -157,52 +54,50 @@ function useStreamCustom(options) {
157
54
  async clear() {}
158
55
  },
159
56
  interrupts: computed(() => {
160
- const vals = streamValues();
161
- if (vals != null && "__interrupt__" in vals && Array.isArray(vals.__interrupt__)) {
162
- const valueInterrupts = vals.__interrupt__;
163
- if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
164
- return valueInterrupts;
165
- }
166
- return [];
57
+ version();
58
+ return orchestrator.interrupts;
167
59
  }),
168
60
  interrupt: computed(() => {
169
- return extractInterrupts(streamValues());
61
+ version();
62
+ return orchestrator.interrupt;
170
63
  }),
171
64
  messages: computed(() => {
172
- const vals = streamValues();
173
- if (!vals) return [];
174
- return ensureMessageInstances(getMessages(vals));
65
+ version();
66
+ return ensureMessageInstances(orchestrator.messages);
175
67
  }),
176
68
  toolCalls: computed(() => {
177
- const vals = streamValues();
178
- if (!vals) return [];
179
- return getToolCallsWithResults(getMessages(vals));
69
+ version();
70
+ return orchestrator.toolCalls;
180
71
  }),
181
72
  getToolCalls(message) {
182
- const vals = streamValues();
183
- if (!vals) return [];
184
- return getToolCallsWithResults(getMessages(vals)).filter((tc) => tc.aiMessage.id === message.id);
73
+ return orchestrator.getToolCalls(message);
185
74
  },
186
75
  get subagents() {
187
76
  subagentVersion();
188
- return stream.getSubagents();
77
+ return orchestrator.subagents;
189
78
  },
190
79
  get activeSubagents() {
191
80
  subagentVersion();
192
- return stream.getActiveSubagents();
81
+ return orchestrator.activeSubagents;
193
82
  },
194
83
  getSubagent(toolCallId) {
195
- return stream.getSubagent(toolCallId);
84
+ return orchestrator.getSubagent(toolCallId);
196
85
  },
197
86
  getSubagentsByType(type) {
198
- return stream.getSubagentsByType(type);
87
+ return orchestrator.getSubagentsByType(type);
199
88
  },
200
89
  getSubagentsByMessage(messageId) {
201
- return stream.getSubagentsByMessage(messageId);
90
+ return orchestrator.getSubagentsByMessage(messageId);
202
91
  }
203
92
  };
204
93
  }
94
+ /**
95
+ * @deprecated Use `injectStreamCustom` instead. `useStreamCustom` will be
96
+ * removed in a future major version. `injectStreamCustom` follows Angular's
97
+ * `inject*` naming convention for injection-based patterns.
98
+ */
99
+ const useStreamCustom = injectStreamCustom;
205
100
  //#endregion
206
- export { useStreamCustom };
101
+ export { injectStreamCustom, useStreamCustom };
207
102
 
208
103
  //# sourceMappingURL=stream.custom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { signal, computed, effect } from \"@angular/core\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type {\n BagTemplate,\n Message,\n Interrupt,\n ThreadState,\n} from \"@langchain/langgraph-sdk\";\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<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 messageManager = new MessageTupleManager();\n const stream = new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n toMessage: toMessageClass,\n });\n\n const streamValues = signal<StateType | null>(stream.values);\n const streamError = signal<unknown>(stream.error);\n const isLoading = signal(stream.isLoading);\n\n const subagentVersion = signal(0);\n\n effect((onCleanup) => {\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n onCleanup(() => unsubscribe());\n });\n\n let threadId: string | null = options.threadId ?? null;\n\n const branch = signal<string>(\"\");\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\n };\n\n const setMessages = (current: StateType, messages: Message[]): StateType => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n const historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n effect(() => {\n const loading = isLoading();\n const hvMessages = getMessages(historyValues);\n const should =\n options.filterSubagentMessages && !loading && hvMessages.length > 0;\n if (should) {\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId ?? submitOptions?.threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined,\n );\n\n return undefined;\n },\n onError(error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = computed(() => streamValues() ?? ({} as StateType));\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message<ToolCallType>,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n if (streamMetadata != null) {\n return {\n messageId: message.id ?? String(index),\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n return undefined;\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: signal([]),\n size: signal(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupts: computed((): Interrupt<InterruptType>[] => {\n const vals = streamValues();\n if (\n vals != null &&\n \"__interrupt__\" in vals &&\n Array.isArray(vals.__interrupt__)\n ) {\n const valueInterrupts = vals.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n }),\n\n interrupt: computed((): Interrupt<InterruptType> | undefined => {\n return extractInterrupts<InterruptType>(streamValues());\n }),\n\n messages: computed(() => {\n const vals = streamValues();\n if (!vals) return [];\n return ensureMessageInstances(getMessages(vals));\n }),\n\n toolCalls: computed(() => {\n const vals = streamValues();\n if (!vals) return [];\n const msgs = getMessages(vals);\n return getToolCallsWithResults<ToolCallType>(msgs);\n }),\n\n getToolCalls(message: Message<ToolCallType>) {\n const vals = streamValues();\n if (!vals) return [];\n const msgs = getMessages(vals);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion();\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion();\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n return stream.getSubagentsByMessage(messageId);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { signal, computed, effect } from \"@angular/core\";\nimport {\n CustomStreamOrchestrator,\n ensureMessageInstances,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type GetUpdateType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function injectStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\n\n const orchestrator = new CustomStreamOrchestrator<StateType, Bag>(options);\n\n const version = signal(0);\n const subagentVersion = signal(0);\n\n effect((onCleanup) => {\n const unsubscribe = orchestrator.subscribe(() => {\n version.update((v) => v + 1);\n subagentVersion.update((v) => v + 1);\n });\n onCleanup(() => unsubscribe());\n });\n\n effect(() => {\n void version();\n const loading = orchestrator.isLoading;\n const hvMessages = orchestrator.messages;\n if (options.filterSubagentMessages && !loading && hvMessages.length > 0) {\n orchestrator.reconstructSubagentsIfNeeded();\n }\n });\n\n const values = computed(() => {\n void version();\n return orchestrator.values;\n });\n\n const branch = signal<string>(\"\");\n\n return {\n values,\n error: computed(() => {\n void version();\n return orchestrator.error;\n }),\n isLoading: signal(false),\n\n stop: () => orchestrator.stop(),\n\n async submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await orchestrator.submit(values, submitOptions);\n },\n\n switchThread(newThreadId: string | null) {\n orchestrator.switchThread(newThreadId);\n },\n\n branch,\n setBranch(value: string) {\n branch.set(value);\n orchestrator.setBranch(value);\n },\n\n getMessagesMetadata(\n message: Message<ToolCallType>,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n return orchestrator.getMessagesMetadata(message, index);\n },\n\n queue: {\n entries: signal([]),\n size: signal(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupts: computed((): Interrupt<InterruptType>[] => {\n void version();\n return orchestrator.interrupts as Interrupt<InterruptType>[];\n }),\n\n interrupt: computed((): Interrupt<InterruptType> | undefined => {\n void version();\n return orchestrator.interrupt as Interrupt<InterruptType> | undefined;\n }),\n\n messages: computed(() => {\n void version();\n return ensureMessageInstances(orchestrator.messages);\n }),\n\n toolCalls: computed(() => {\n void version();\n return orchestrator.toolCalls;\n }),\n\n getToolCalls(message: Message<ToolCallType>) {\n return orchestrator.getToolCalls(message);\n },\n\n get subagents() {\n void subagentVersion();\n return orchestrator.subagents;\n },\n\n get activeSubagents() {\n void subagentVersion();\n return orchestrator.activeSubagents;\n },\n\n getSubagent(toolCallId: string) {\n return orchestrator.getSubagent(toolCallId);\n },\n getSubagentsByType(type: string) {\n return orchestrator.getSubagentsByType(type);\n },\n getSubagentsByMessage(messageId: string) {\n return orchestrator.getSubagentsByMessage(messageId);\n },\n };\n}\n\n/**\n * @deprecated Use `injectStreamCustom` instead. `useStreamCustom` will be\n * removed in a future major version. `injectStreamCustom` follows Angular's\n * `inject*` naming convention for injection-based patterns.\n */\nexport const useStreamCustom = injectStreamCustom;\n"],"mappings":";;;AAcA,SAAgB,mBAGd,SAAiD;CAMjD,MAAM,eAAe,IAAI,yBAAyC,QAAQ;CAE1E,MAAM,UAAU,OAAO,EAAE;CACzB,MAAM,kBAAkB,OAAO,EAAE;AAEjC,SAAQ,cAAc;EACpB,MAAM,cAAc,aAAa,gBAAgB;AAC/C,WAAQ,QAAQ,MAAM,IAAI,EAAE;AAC5B,mBAAgB,QAAQ,MAAM,IAAI,EAAE;IACpC;AACF,kBAAgB,aAAa,CAAC;GAC9B;AAEF,cAAa;AACN,WAAS;EACd,MAAM,UAAU,aAAa;EAC7B,MAAM,aAAa,aAAa;AAChC,MAAI,QAAQ,0BAA0B,CAAC,WAAW,WAAW,SAAS,EACpE,cAAa,8BAA8B;GAE7C;CAEF,MAAM,SAAS,eAAe;AACvB,WAAS;AACd,SAAO,aAAa;GACpB;CAEF,MAAM,SAAS,OAAe,GAAG;AAEjC,QAAO;EACL;EACA,OAAO,eAAe;AACf,YAAS;AACd,UAAO,aAAa;IACpB;EACF,WAAW,OAAO,MAAM;EAExB,YAAY,aAAa,MAAM;EAE/B,MAAM,OACJ,QACA,eACA;AACA,SAAM,aAAa,OAAO,QAAQ,cAAc;;EAGlD,aAAa,aAA4B;AACvC,gBAAa,aAAa,YAAY;;EAGxC;EACA,UAAU,OAAe;AACvB,UAAO,IAAI,MAAM;AACjB,gBAAa,UAAU,MAAM;;EAG/B,oBACE,SACA,OACwC;AACxC,UAAO,aAAa,oBAAoB,SAAS,MAAM;;EAGzD,OAAO;GACL,SAAS,OAAO,EAAE,CAAC;GACnB,MAAM,OAAO,EAAE;GACf,MAAM,SAAS;AACb,WAAO;;GAET,MAAM,QAAQ;GACf;EAED,YAAY,eAA2C;AAChD,YAAS;AACd,UAAO,aAAa;IACpB;EAEF,WAAW,eAAqD;AACzD,YAAS;AACd,UAAO,aAAa;IACpB;EAEF,UAAU,eAAe;AAClB,YAAS;AACd,UAAO,uBAAuB,aAAa,SAAS;IACpD;EAEF,WAAW,eAAe;AACnB,YAAS;AACd,UAAO,aAAa;IACpB;EAEF,aAAa,SAAgC;AAC3C,UAAO,aAAa,aAAa,QAAQ;;EAG3C,IAAI,YAAY;AACT,oBAAiB;AACtB,UAAO,aAAa;;EAGtB,IAAI,kBAAkB;AACf,oBAAiB;AACtB,UAAO,aAAa;;EAGtB,YAAY,YAAoB;AAC9B,UAAO,aAAa,YAAY,WAAW;;EAE7C,mBAAmB,MAAc;AAC/B,UAAO,aAAa,mBAAmB,KAAK;;EAE9C,sBAAsB,WAAmB;AACvC,UAAO,aAAa,sBAAsB,UAAU;;EAEvD;;;;;;;AAQH,MAAa,kBAAkB"}
@@ -0,0 +1,15 @@
1
+ import { DefaultToolCall } from "@langchain/langgraph-sdk";
2
+ import { BaseMessage } from "@langchain/core/messages";
3
+ import { SubagentStreamInterface } from "@langchain/langgraph-sdk/ui";
4
+
5
+ //#region src/subagent-types.d.ts
6
+ /**
7
+ * Subagent stream view with {@link BaseMessage} arrays (Angular SDK uses class
8
+ * messages end-to-end).
9
+ */
10
+ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages"> & {
11
+ messages: BaseMessage[];
12
+ };
13
+ //#endregion
14
+ export { ClassSubagentStreamInterface };
15
+ //# sourceMappingURL=subagent-types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-types.d.cts","names":[],"sources":["../src/subagent-types.ts"],"mappings":";;;;;;;AAQA;;KAAY,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA"}
@@ -0,0 +1,15 @@
1
+ import { SubagentStreamInterface } from "@langchain/langgraph-sdk/ui";
2
+ import { DefaultToolCall } from "@langchain/langgraph-sdk";
3
+ import { BaseMessage } from "@langchain/core/messages";
4
+
5
+ //#region src/subagent-types.d.ts
6
+ /**
7
+ * Subagent stream view with {@link BaseMessage} arrays (Angular SDK uses class
8
+ * messages end-to-end).
9
+ */
10
+ type ClassSubagentStreamInterface<StateType = Record<string, unknown>, ToolCall = DefaultToolCall, SubagentName extends string = string> = Omit<SubagentStreamInterface<StateType, ToolCall, SubagentName>, "messages"> & {
11
+ messages: BaseMessage[];
12
+ };
13
+ //#endregion
14
+ export { ClassSubagentStreamInterface };
15
+ //# sourceMappingURL=subagent-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-types.d.ts","names":[],"sources":["../src/subagent-types.ts"],"mappings":";;;;;;;AAQA;;KAAY,4BAAA,aACE,MAAA,8BACD,eAAA,0CAET,IAAA,CACF,uBAAA,CAAwB,SAAA,EAAW,QAAA,EAAU,YAAA;EAG7C,QAAA,EAAU,WAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/angular",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Angular integration for LangGraph & LangChain",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -10,7 +10,7 @@
10
10
  "directory": "libs/sdk-angular"
11
11
  },
12
12
  "dependencies": {
13
- "@langchain/langgraph-sdk": "^1.7.5"
13
+ "@langchain/langgraph-sdk": "^1.8.0"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@analogjs/vite-plugin-angular": "^2.3.1",
@@ -45,7 +45,7 @@
45
45
  "vitest-browser-angular": "^0.3.0",
46
46
  "webdriverio": "^9.25.0",
47
47
  "zod": "^4.3.6",
48
- "@langchain/langgraph": "^1.2.4",
48
+ "@langchain/langgraph": "^1.2.5",
49
49
  "@langchain/langgraph-api": "^1.1.16",
50
50
  "@langchain/langgraph-checkpoint": "^1.0.1"
51
51
  },