@langchain/svelte 0.1.3 → 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.
@@ -1,172 +1,107 @@
1
- import { derived, get, writable } from "svelte/store";
1
+ import { derived, fromStore, writable } from "svelte/store";
2
2
  import { onDestroy } from "svelte";
3
- import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
4
- import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
3
+ import { CustomStreamOrchestrator } from "@langchain/langgraph-sdk/ui";
5
4
  //#region src/stream.custom.ts
6
5
  function useStreamCustom(options) {
7
- const messageManager = new MessageTupleManager();
8
- const stream = new StreamManager(messageManager, {
9
- throttle: options.throttle ?? false,
10
- subagentToolNames: options.subagentToolNames,
11
- filterSubagentMessages: options.filterSubagentMessages,
12
- toMessage: toMessageClass
13
- });
14
- let threadId = options.threadId ?? null;
6
+ const orchestrator = new CustomStreamOrchestrator(options);
7
+ const version = writable(0);
15
8
  const branch = writable("");
16
- const streamValues = writable(stream.values);
17
- const streamError = writable(stream.error);
18
- const isLoading = writable(stream.isLoading);
19
- const subagentVersion = writable(0);
20
- const unsubscribe = stream.subscribe(() => {
21
- streamValues.set(stream.values);
22
- streamError.set(stream.error);
23
- isLoading.set(stream.isLoading);
24
- subagentVersion.update((v) => v + 1);
9
+ const unsubscribe = orchestrator.subscribe(() => {
10
+ version.update((v) => v + 1);
25
11
  });
26
12
  onDestroy(() => {
27
13
  unsubscribe();
14
+ orchestrator.dispose();
28
15
  });
29
- const getMessages = (value) => {
30
- const messagesKey = options.messagesKey ?? "messages";
31
- return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
32
- };
33
- const setMessages = (current, messages) => {
34
- const messagesKey = options.messagesKey ?? "messages";
35
- return {
36
- ...current,
37
- [messagesKey]: messages
38
- };
39
- };
40
- const historyValues = options.initialValues ?? {};
41
- const historyMessages = getMessages(historyValues);
42
- if (options.filterSubagentMessages && !stream.isLoading && historyMessages.length > 0) stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });
43
- function switchThread(newThreadId) {
44
- if (newThreadId !== threadId) {
45
- threadId = newThreadId;
46
- stream.clear();
47
- }
48
- }
49
- function stop() {
50
- return stream.stop(historyValues, { onStop: options.onStop });
51
- }
52
- async function submitDirect(values, submitOptions) {
53
- const currentThreadId = options.threadId ?? null;
54
- if (currentThreadId !== threadId) {
55
- threadId = currentThreadId;
56
- stream.clear();
57
- }
58
- let usableThreadId = threadId ?? submitOptions?.threadId;
59
- stream.setStreamValues(() => {
60
- if (submitOptions?.optimisticValues != null) return {
61
- ...historyValues,
62
- ...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
63
- };
64
- return { ...historyValues };
65
- });
66
- await stream.start(async (signal) => {
67
- if (!usableThreadId) {
68
- usableThreadId = crypto.randomUUID();
69
- threadId = usableThreadId;
70
- options.onThreadId?.(usableThreadId);
71
- }
72
- if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
73
- return options.transport.stream({
74
- input: values,
75
- context: submitOptions?.context,
76
- command: submitOptions?.command,
77
- signal,
78
- config: {
79
- ...submitOptions?.config,
80
- configurable: {
81
- thread_id: usableThreadId,
82
- ...submitOptions?.config?.configurable
83
- }
84
- }
85
- });
86
- }, {
87
- getMessages,
88
- setMessages,
89
- initialValues: {},
90
- callbacks: options,
91
- onSuccess: () => void 0,
92
- onError(error) {
93
- options.onError?.(error, void 0);
94
- submitOptions?.onError?.(error, void 0);
95
- }
96
- });
97
- }
98
- async function submit(values, submitOptions) {
99
- await submitDirect(values, submitOptions);
100
- }
101
- const values = derived([streamValues], ([$streamValues]) => $streamValues ?? {});
102
- const messages = derived([streamValues], ([$streamValues]) => {
103
- if (!$streamValues) return [];
104
- return ensureMessageInstances(getMessages($streamValues));
105
- });
106
- const toolCalls = derived([streamValues], ([$streamValues]) => {
107
- if (!$streamValues) return [];
108
- return getToolCallsWithResults(getMessages($streamValues));
109
- });
110
- const interrupt = derived([streamValues], ([$streamValues]) => extractInterrupts($streamValues));
111
- const interrupts = derived([streamValues], ([$streamValues]) => {
112
- if ($streamValues != null && "__interrupt__" in $streamValues && Array.isArray($streamValues.__interrupt__)) {
113
- const valueInterrupts = $streamValues.__interrupt__;
114
- if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
115
- return valueInterrupts;
116
- }
117
- return [];
118
- });
119
- function getToolCalls(message) {
120
- const $streamValues = get(streamValues);
121
- if (!$streamValues) return [];
122
- return getToolCallsWithResults(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
123
- }
124
- function setBranch(value) {
125
- branch.set(value);
126
- }
127
- function getMessagesMetadata(message, index) {
128
- const streamMetadata = messageManager.get(message.id)?.metadata;
129
- if (streamMetadata != null) return {
130
- messageId: message.id ?? String(index),
131
- firstSeenState: void 0,
132
- branch: void 0,
133
- branchOptions: void 0,
134
- streamMetadata
135
- };
136
- }
16
+ const valuesStore = derived(version, () => orchestrator.values);
17
+ const messagesStore = derived(version, () => orchestrator.messages);
18
+ const toolCallsStore = derived(version, () => orchestrator.toolCalls);
19
+ const interruptStore = derived(version, () => orchestrator.interrupt);
20
+ const interruptsStore = derived(version, () => orchestrator.interrupts);
21
+ const subagentsStore = derived(version, () => orchestrator.subagents);
22
+ const activeSubagentsStore = derived(version, () => orchestrator.activeSubagents);
23
+ const emptyEntries = writable([]);
24
+ const emptySize = writable(0);
25
+ const valuesRef = fromStore(valuesStore);
26
+ const errorRef = fromStore(derived(version, () => orchestrator.error));
27
+ const isLoadingRef = fromStore(derived(version, () => orchestrator.isLoading));
28
+ const branchRef = fromStore(branch);
29
+ const messagesRef = fromStore(messagesStore);
30
+ const toolCallsRef = fromStore(toolCallsStore);
31
+ const interruptRef = fromStore(interruptStore);
32
+ const interruptsRef = fromStore(interruptsStore);
33
+ const subagentsRef = fromStore(subagentsStore);
34
+ const activeSubagentsRef = fromStore(activeSubagentsStore);
35
+ const emptyEntriesRef = fromStore(emptyEntries);
36
+ const emptySizeRef = fromStore(emptySize);
137
37
  return {
138
- values,
139
- error: streamError,
140
- isLoading,
141
- stop,
142
- submit,
143
- switchThread,
144
- branch,
145
- setBranch,
146
- getMessagesMetadata,
38
+ get values() {
39
+ return valuesRef.current;
40
+ },
41
+ get error() {
42
+ return errorRef.current;
43
+ },
44
+ get isLoading() {
45
+ return isLoadingRef.current;
46
+ },
47
+ stop: () => orchestrator.stop(),
48
+ async submit(values, submitOptions) {
49
+ await orchestrator.submit(values, submitOptions);
50
+ },
51
+ switchThread(newThreadId) {
52
+ orchestrator.switchThread(newThreadId);
53
+ },
54
+ get branch() {
55
+ return branchRef.current;
56
+ },
57
+ setBranch(value) {
58
+ branch.set(value);
59
+ orchestrator.setBranch(value);
60
+ },
61
+ getMessagesMetadata(message, index) {
62
+ return orchestrator.getMessagesMetadata(message, index);
63
+ },
147
64
  queue: {
148
- entries: writable([]),
149
- size: writable(0),
65
+ get entries() {
66
+ return emptyEntriesRef.current;
67
+ },
68
+ get size() {
69
+ return emptySizeRef.current;
70
+ },
150
71
  async cancel() {
151
72
  return false;
152
73
  },
153
74
  async clear() {}
154
75
  },
155
- interrupt,
156
- interrupts,
157
- messages,
158
- toolCalls,
159
- getToolCalls,
160
- subagents: derived(subagentVersion, () => stream.getSubagents()),
161
- activeSubagents: derived(subagentVersion, () => stream.getActiveSubagents()),
76
+ get interrupt() {
77
+ return interruptRef.current;
78
+ },
79
+ get interrupts() {
80
+ return interruptsRef.current;
81
+ },
82
+ get messages() {
83
+ return messagesRef.current;
84
+ },
85
+ get toolCalls() {
86
+ return toolCallsRef.current;
87
+ },
88
+ getToolCalls(message) {
89
+ return orchestrator.getToolCalls(message);
90
+ },
91
+ get subagents() {
92
+ return subagentsRef.current;
93
+ },
94
+ get activeSubagents() {
95
+ return activeSubagentsRef.current;
96
+ },
162
97
  getSubagent(toolCallId) {
163
- return stream.getSubagent(toolCallId);
98
+ return orchestrator.getSubagent(toolCallId);
164
99
  },
165
100
  getSubagentsByType(type) {
166
- return stream.getSubagentsByType(type);
101
+ return orchestrator.getSubagentsByType(type);
167
102
  },
168
103
  getSubagentsByMessage(messageId) {
169
- return stream.getSubagentsByMessage(messageId);
104
+ return orchestrator.getSubagentsByMessage(messageId);
170
105
  }
171
106
  };
172
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\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 { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\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 let threadId: string | null = options.threadId ?? null;\n\n const branch = writable<string>(\"\");\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const subagentVersion = writable(0);\n\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 onDestroy(() => {\n unsubscribe();\n });\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 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 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: () => undefined,\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 = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message,\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: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\n\n subagents: derived(subagentVersion, () => stream.getSubagents()),\n\n activeSubagents: derived(subagentVersion, () =>\n stream.getActiveSubagents(),\n ),\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\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 { writable, derived, fromStore } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n CustomStreamOrchestrator,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type GetUpdateType,\n type GetInterruptType,\n type GetConfigurableType,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\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 InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n const orchestrator = new CustomStreamOrchestrator<StateType, Bag>(options);\n\n const version = writable(0);\n const branch = writable<string>(\"\");\n\n const unsubscribe = orchestrator.subscribe(() => {\n version.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n orchestrator.dispose();\n });\n\n const valuesStore = derived(version, () => orchestrator.values);\n\n const messagesStore = derived(version, () => orchestrator.messages);\n\n const toolCallsStore = derived(version, () => orchestrator.toolCalls);\n\n const interruptStore = derived(\n version,\n () => orchestrator.interrupt as Interrupt<InterruptType> | undefined,\n );\n\n const interruptsStore = derived(\n version,\n () => orchestrator.interrupts as Interrupt<InterruptType>[],\n );\n\n const subagentsStore = derived(version, () => orchestrator.subagents);\n const activeSubagentsStore = derived(\n version,\n () => orchestrator.activeSubagents,\n );\n\n const emptyEntries = writable<never[]>([]);\n const emptySize = writable(0);\n\n const valuesRef = fromStore(valuesStore);\n const errorRef = fromStore(derived(version, () => orchestrator.error));\n const isLoadingRef = fromStore(\n derived(version, () => orchestrator.isLoading),\n );\n const branchRef = fromStore(branch);\n const messagesRef = fromStore(messagesStore);\n const toolCallsRef = fromStore(toolCallsStore);\n const interruptRef = fromStore(interruptStore);\n const interruptsRef = fromStore(interruptsStore);\n const subagentsRef = fromStore(subagentsStore);\n const activeSubagentsRef = fromStore(activeSubagentsStore);\n const emptyEntriesRef = fromStore(emptyEntries);\n const emptySizeRef = fromStore(emptySize);\n\n return {\n get values() {\n return valuesRef.current;\n },\n get error() {\n return errorRef.current;\n },\n get isLoading() {\n return isLoadingRef.current;\n },\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 get branch() {\n return branchRef.current;\n },\n setBranch(value: string) {\n branch.set(value);\n orchestrator.setBranch(value);\n },\n\n getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n return orchestrator.getMessagesMetadata(message, index);\n },\n\n queue: {\n get entries() {\n return emptyEntriesRef.current;\n },\n get size() {\n return emptySizeRef.current;\n },\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupt() {\n return interruptRef.current;\n },\n get interrupts() {\n return interruptsRef.current;\n },\n\n get messages() {\n return messagesRef.current;\n },\n get toolCalls() {\n return toolCallsRef.current;\n },\n getToolCalls(message: Message) {\n return orchestrator.getToolCalls(message);\n },\n\n get subagents() {\n return subagentsRef.current;\n },\n get activeSubagents() {\n return activeSubagentsRef.current;\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"],"mappings":";;;;AAaA,SAAgB,gBAGd,SAAiD;CAIjD,MAAM,eAAe,IAAI,yBAAyC,QAAQ;CAE1E,MAAM,UAAU,SAAS,EAAE;CAC3B,MAAM,SAAS,SAAiB,GAAG;CAEnC,MAAM,cAAc,aAAa,gBAAgB;AAC/C,UAAQ,QAAQ,MAAM,IAAI,EAAE;GAC5B;AAEF,iBAAgB;AACd,eAAa;AACb,eAAa,SAAS;GACtB;CAEF,MAAM,cAAc,QAAQ,eAAe,aAAa,OAAO;CAE/D,MAAM,gBAAgB,QAAQ,eAAe,aAAa,SAAS;CAEnE,MAAM,iBAAiB,QAAQ,eAAe,aAAa,UAAU;CAErE,MAAM,iBAAiB,QACrB,eACM,aAAa,UACpB;CAED,MAAM,kBAAkB,QACtB,eACM,aAAa,WACpB;CAED,MAAM,iBAAiB,QAAQ,eAAe,aAAa,UAAU;CACrE,MAAM,uBAAuB,QAC3B,eACM,aAAa,gBACpB;CAED,MAAM,eAAe,SAAkB,EAAE,CAAC;CAC1C,MAAM,YAAY,SAAS,EAAE;CAE7B,MAAM,YAAY,UAAU,YAAY;CACxC,MAAM,WAAW,UAAU,QAAQ,eAAe,aAAa,MAAM,CAAC;CACtE,MAAM,eAAe,UACnB,QAAQ,eAAe,aAAa,UAAU,CAC/C;CACD,MAAM,YAAY,UAAU,OAAO;CACnC,MAAM,cAAc,UAAU,cAAc;CAC5C,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,gBAAgB,UAAU,gBAAgB;CAChD,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,qBAAqB,UAAU,qBAAqB;CAC1D,MAAM,kBAAkB,UAAU,aAAa;CAC/C,MAAM,eAAe,UAAU,UAAU;AAEzC,QAAO;EACL,IAAI,SAAS;AACX,UAAO,UAAU;;EAEnB,IAAI,QAAQ;AACV,UAAO,SAAS;;EAElB,IAAI,YAAY;AACd,UAAO,aAAa;;EAGtB,YAAY,aAAa,MAAM;EAE/B,MAAM,OACJ,QACA,eACA;AACA,SAAM,aAAa,OAAO,QAAQ,cAAc;;EAGlD,aAAa,aAA4B;AACvC,gBAAa,aAAa,YAAY;;EAGxC,IAAI,SAAS;AACX,UAAO,UAAU;;EAEnB,UAAU,OAAe;AACvB,UAAO,IAAI,MAAM;AACjB,gBAAa,UAAU,MAAM;;EAG/B,oBACE,SACA,OACwC;AACxC,UAAO,aAAa,oBAAoB,SAAS,MAAM;;EAGzD,OAAO;GACL,IAAI,UAAU;AACZ,WAAO,gBAAgB;;GAEzB,IAAI,OAAO;AACT,WAAO,aAAa;;GAEtB,MAAM,SAAS;AACb,WAAO;;GAET,MAAM,QAAQ;GACf;EAED,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,IAAI,aAAa;AACf,UAAO,cAAc;;EAGvB,IAAI,WAAW;AACb,UAAO,YAAY;;EAErB,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,aAAa,SAAkB;AAC7B,UAAO,aAAa,aAAa,QAAQ;;EAG3C,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,IAAI,kBAAkB;AACpB,UAAO,mBAAmB;;EAE5B,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/svelte",
3
- "version": "0.1.3",
3
+ "version": "0.3.0",
4
4
  "description": "Svelte integration for LangGraph & LangChain",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -10,20 +10,18 @@
10
10
  "directory": "libs/sdk-svelte"
11
11
  },
12
12
  "dependencies": {
13
- "@langchain/langgraph-sdk": "^1.7.1"
13
+ "@langchain/langgraph-sdk": "^1.8.0"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@hono/node-server": "^1.19.11",
17
17
  "@langchain/core": "^1.1.31",
18
- "@langchain/scripts": "^0.1.4",
19
18
  "@sveltejs/vite-plugin-svelte": "^6.2.4",
20
- "@tsconfig/recommended": "^1.0.13",
21
19
  "@types/node": "^25.4.0",
22
20
  "@typescript-eslint/eslint-plugin": "^6.12.0",
23
21
  "@typescript-eslint/parser": "^6.12.0",
24
22
  "@vitest/browser": "^4.0.18",
25
23
  "@vitest/browser-webdriverio": "^4.0.18",
26
- "deepagents": "^1.8.1",
24
+ "deepagents": "^1.8.3",
27
25
  "eslint": "^8.33.0",
28
26
  "eslint-config-airbnb-base": "^15.0.0",
29
27
  "eslint-config-prettier": "^8.6.0",
@@ -39,13 +37,13 @@
39
37
  "vitest-browser-svelte": "^2.0.2",
40
38
  "webdriverio": "^9.25.0",
41
39
  "zod": "^4.3.6",
42
- "@langchain/langgraph": "^1.2.2",
43
- "@langchain/langgraph-api": "^1.1.15",
44
- "@langchain/langgraph-checkpoint": "^1.0.0"
40
+ "@langchain/langgraph": "^1.2.5",
41
+ "@langchain/langgraph-api": "^1.1.16",
42
+ "@langchain/langgraph-checkpoint": "^1.0.1"
45
43
  },
46
44
  "peerDependencies": {
47
45
  "@langchain/core": "^1.1.27",
48
- "svelte": "^4.0.0 || ^5.0.0"
46
+ "svelte": "^5.0.0"
49
47
  },
50
48
  "main": "./dist/index.js",
51
49
  "types": "./dist/index.d.ts",