@langchain/svelte 1.0.21 → 1.0.22
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.
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/selectors.svelte.cjs +47 -0
- package/dist/selectors.svelte.cjs.map +1 -1
- package/dist/selectors.svelte.d.cts +50 -2
- package/dist/selectors.svelte.d.cts.map +1 -1
- package/dist/selectors.svelte.d.ts +50 -2
- package/dist/selectors.svelte.d.ts.map +1 -1
- package/dist/selectors.svelte.js +48 -2
- package/dist/selectors.svelte.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -75,6 +75,7 @@ exports.provideStream = require_context.provideStream;
|
|
|
75
75
|
exports.useAudio = require_selectors_svelte.useAudio;
|
|
76
76
|
exports.useAudioPlayer = require_use_audio_player_svelte.useAudioPlayer;
|
|
77
77
|
exports.useChannel = require_selectors_svelte.useChannel;
|
|
78
|
+
exports.useChannelEffect = require_selectors_svelte.useChannelEffect;
|
|
78
79
|
exports.useExtension = require_selectors_svelte.useExtension;
|
|
79
80
|
exports.useFiles = require_selectors_svelte.useFiles;
|
|
80
81
|
exports.useImages = require_selectors_svelte.useImages;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AgentServerOptions, AnyStream, CustomAdapterOptions, STREAM_CONTROLLER, ThreadStream, UseStreamOptions, UseStreamResult, UseStreamReturn, useStream } from "./use-stream.svelte.cjs";
|
|
2
2
|
import { useProjection } from "./use-projection.svelte.cjs";
|
|
3
|
-
import { SelectorTarget, SubmissionQueueEntry, SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.cjs";
|
|
3
|
+
import { SelectorTarget, SubmissionQueueEntry, SubmissionQueueSnapshot, UseChannelEffectOptions, UseSubmissionQueueReturn, useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.cjs";
|
|
4
4
|
import { useMediaURL } from "./use-media-url.svelte.cjs";
|
|
5
5
|
import { AudioPlayerHandle, PlayerStatus, UseAudioPlayerOptions, useAudioPlayer } from "./use-audio-player.svelte.cjs";
|
|
6
6
|
import { UseVideoPlayerOptions, VideoPlayerHandle, useVideoPlayer } from "./use-video-player.svelte.cjs";
|
|
@@ -8,4 +8,4 @@ import { ProvideStreamCustomProps, ProvideStreamProps, STREAM_CONTEXT_KEY, getSt
|
|
|
8
8
|
import { AnyHeadlessToolImplementation, DefaultToolCall, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, HttpAgentServerAdapter, HttpAgentServerAdapterOptions, OnToolCallback, ToolCallState, ToolCallsFromTools, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload } from "@langchain/langgraph-sdk";
|
|
9
9
|
import { AgentServerAdapter, AnyMediaHandle, AssembledToolCall, AssembledToolCallFromTool as ToolCallFromTool, AudioMedia, Channel, Event, FileMedia, ImageMedia, InferStateType, InferSubagentStates, InferToolCalls, InferToolOutput, MediaAssemblyError, MediaAssemblyErrorKind, MediaBase, MediaBlockType, MessageMetadata, MessageMetadataMap, StreamStopOptions, StreamSubmitOptions, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, ToolCallStatus, VideoMedia, WidenUpdateMessages } from "@langchain/langgraph-sdk/stream";
|
|
10
10
|
import { AcceptBaseMessages, GetToolCallsType, ResolveStreamInterface, ResolveStreamOptions, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions } from "@langchain/langgraph-sdk/ui";
|
|
11
|
-
export { type AcceptBaseMessages, type AgentServerAdapter, type AgentServerOptions, type AnyHeadlessToolImplementation, type AnyMediaHandle, type AnyStream, type AssembledToolCall, type AudioMedia, type AudioPlayerHandle, type Channel, type CustomAdapterOptions, type DefaultToolCall, type Event, type FileMedia, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, HttpAgentServerAdapter, type HttpAgentServerAdapterOptions, type ImageMedia, type InferStateType, type InferSubagentStates, type InferToolCalls, type InferToolOutput, MediaAssemblyError, type MediaAssemblyErrorKind, type MediaBase, type MediaBlockType, type MessageMetadata, type MessageMetadataMap, type OnToolCallback, type PlayerStatus, type ProvideStreamCustomProps, type ProvideStreamProps, type ResolveStreamInterface, type ResolveStreamOptions, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, type SelectorTarget, type StreamStopOptions, type StreamSubmitOptions, type SubagentDiscoverySnapshot, type SubgraphDiscoverySnapshot, type SubmissionQueueEntry, type SubmissionQueueSnapshot, type ThreadStream, type ToolCallFromTool, type ToolCallState, type ToolCallStatus, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseAudioPlayerOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStreamOptions, type UseStreamResult, type UseStreamReturn, type UseSubmissionQueueReturn, type UseVideoPlayerOptions, type VideoMedia, type VideoPlayerHandle, type WidenUpdateMessages, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
|
11
|
+
export { type AcceptBaseMessages, type AgentServerAdapter, type AgentServerOptions, type AnyHeadlessToolImplementation, type AnyMediaHandle, type AnyStream, type AssembledToolCall, type AudioMedia, type AudioPlayerHandle, type Channel, type CustomAdapterOptions, type DefaultToolCall, type Event, type FileMedia, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, HttpAgentServerAdapter, type HttpAgentServerAdapterOptions, type ImageMedia, type InferStateType, type InferSubagentStates, type InferToolCalls, type InferToolOutput, MediaAssemblyError, type MediaAssemblyErrorKind, type MediaBase, type MediaBlockType, type MessageMetadata, type MessageMetadataMap, type OnToolCallback, type PlayerStatus, type ProvideStreamCustomProps, type ProvideStreamProps, type ResolveStreamInterface, type ResolveStreamOptions, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, type SelectorTarget, type StreamStopOptions, type StreamSubmitOptions, type SubagentDiscoverySnapshot, type SubgraphDiscoverySnapshot, type SubmissionQueueEntry, type SubmissionQueueSnapshot, type ThreadStream, type ToolCallFromTool, type ToolCallState, type ToolCallStatus, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseAudioPlayerOptions, type UseChannelEffectOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStreamOptions, type UseStreamResult, type UseStreamReturn, type UseSubmissionQueueReturn, type UseVideoPlayerOptions, type VideoMedia, type VideoPlayerHandle, type WidenUpdateMessages, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AgentServerOptions, AnyStream, CustomAdapterOptions, STREAM_CONTROLLER, ThreadStream, UseStreamOptions, UseStreamResult, UseStreamReturn, useStream } from "./use-stream.svelte.js";
|
|
2
2
|
import { useProjection } from "./use-projection.svelte.js";
|
|
3
|
-
import { SelectorTarget, SubmissionQueueEntry, SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.js";
|
|
3
|
+
import { SelectorTarget, SubmissionQueueEntry, SubmissionQueueSnapshot, UseChannelEffectOptions, UseSubmissionQueueReturn, useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.js";
|
|
4
4
|
import { useMediaURL } from "./use-media-url.svelte.js";
|
|
5
5
|
import { AudioPlayerHandle, PlayerStatus, UseAudioPlayerOptions, useAudioPlayer } from "./use-audio-player.svelte.js";
|
|
6
6
|
import { UseVideoPlayerOptions, VideoPlayerHandle, useVideoPlayer } from "./use-video-player.svelte.js";
|
|
@@ -8,4 +8,4 @@ import { ProvideStreamCustomProps, ProvideStreamProps, STREAM_CONTEXT_KEY, getSt
|
|
|
8
8
|
import { AnyHeadlessToolImplementation, DefaultToolCall, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, HttpAgentServerAdapter, HttpAgentServerAdapterOptions, OnToolCallback, ToolCallState, ToolCallsFromTools, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload } from "@langchain/langgraph-sdk";
|
|
9
9
|
import { AgentServerAdapter, AnyMediaHandle, AssembledToolCall, AssembledToolCallFromTool as ToolCallFromTool, AudioMedia, Channel, Event, FileMedia, ImageMedia, InferStateType, InferSubagentStates, InferToolCalls, InferToolOutput, MediaAssemblyError, MediaAssemblyErrorKind, MediaBase, MediaBlockType, MessageMetadata, MessageMetadataMap, StreamStopOptions, StreamSubmitOptions, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, ToolCallStatus, VideoMedia, WidenUpdateMessages } from "@langchain/langgraph-sdk/stream";
|
|
10
10
|
import { AcceptBaseMessages, GetToolCallsType, ResolveStreamInterface, ResolveStreamOptions, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions } from "@langchain/langgraph-sdk/ui";
|
|
11
|
-
export { type AcceptBaseMessages, type AgentServerAdapter, type AgentServerOptions, type AnyHeadlessToolImplementation, type AnyMediaHandle, type AnyStream, type AssembledToolCall, type AudioMedia, type AudioPlayerHandle, type Channel, type CustomAdapterOptions, type DefaultToolCall, type Event, type FileMedia, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, HttpAgentServerAdapter, type HttpAgentServerAdapterOptions, type ImageMedia, type InferStateType, type InferSubagentStates, type InferToolCalls, type InferToolOutput, MediaAssemblyError, type MediaAssemblyErrorKind, type MediaBase, type MediaBlockType, type MessageMetadata, type MessageMetadataMap, type OnToolCallback, type PlayerStatus, type ProvideStreamCustomProps, type ProvideStreamProps, type ResolveStreamInterface, type ResolveStreamOptions, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, type SelectorTarget, type StreamStopOptions, type StreamSubmitOptions, type SubagentDiscoverySnapshot, type SubgraphDiscoverySnapshot, type SubmissionQueueEntry, type SubmissionQueueSnapshot, type ThreadStream, type ToolCallFromTool, type ToolCallState, type ToolCallStatus, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseAudioPlayerOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStreamOptions, type UseStreamResult, type UseStreamReturn, type UseSubmissionQueueReturn, type UseVideoPlayerOptions, type VideoMedia, type VideoPlayerHandle, type WidenUpdateMessages, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
|
11
|
+
export { type AcceptBaseMessages, type AgentServerAdapter, type AgentServerOptions, type AnyHeadlessToolImplementation, type AnyMediaHandle, type AnyStream, type AssembledToolCall, type AudioMedia, type AudioPlayerHandle, type Channel, type CustomAdapterOptions, type DefaultToolCall, type Event, type FileMedia, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, HttpAgentServerAdapter, type HttpAgentServerAdapterOptions, type ImageMedia, type InferStateType, type InferSubagentStates, type InferToolCalls, type InferToolOutput, MediaAssemblyError, type MediaAssemblyErrorKind, type MediaBase, type MediaBlockType, type MessageMetadata, type MessageMetadataMap, type OnToolCallback, type PlayerStatus, type ProvideStreamCustomProps, type ProvideStreamProps, type ResolveStreamInterface, type ResolveStreamOptions, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, type SelectorTarget, type StreamStopOptions, type StreamSubmitOptions, type SubagentDiscoverySnapshot, type SubgraphDiscoverySnapshot, type SubmissionQueueEntry, type SubmissionQueueSnapshot, type ThreadStream, type ToolCallFromTool, type ToolCallState, type ToolCallStatus, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseAudioPlayerOptions, type UseChannelEffectOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStreamOptions, type UseStreamResult, type UseStreamReturn, type UseSubmissionQueueReturn, type UseVideoPlayerOptions, type VideoMedia, type VideoPlayerHandle, type WidenUpdateMessages, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { STREAM_CONTROLLER, useStream } from "./use-stream.svelte.js";
|
|
2
2
|
import { useProjection } from "./use-projection.svelte.js";
|
|
3
|
-
import { useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.js";
|
|
3
|
+
import { useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo } from "./selectors.svelte.js";
|
|
4
4
|
import { useMediaURL } from "./use-media-url.svelte.js";
|
|
5
5
|
import { useAudioPlayer } from "./use-audio-player.svelte.js";
|
|
6
6
|
import { useVideoPlayer } from "./use-video-player.svelte.js";
|
|
7
7
|
import { STREAM_CONTEXT_KEY, getStream, provideStream } from "./context.js";
|
|
8
8
|
import { HttpAgentServerAdapter, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload } from "@langchain/langgraph-sdk";
|
|
9
9
|
import { MediaAssemblyError } from "@langchain/langgraph-sdk/stream";
|
|
10
|
-
export { HttpAgentServerAdapter, MediaAssemblyError, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
|
10
|
+
export { HttpAgentServerAdapter, MediaAssemblyError, STREAM_CONTEXT_KEY, STREAM_CONTROLLER, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getStream, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, provideStream, useAudio, useAudioPlayer, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMediaURL, useMessageMetadata, useMessages, useProjection, useStream, useSubmissionQueue, useToolCalls, useValues, useVideo, useVideoPlayer };
|
|
@@ -145,6 +145,52 @@ function useChannel(stream, channels, target, options) {
|
|
|
145
145
|
}, EMPTY_EVENTS);
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
148
|
+
* Side-effect counterpart to {@link useChannel}. Instead of returning a
|
|
149
|
+
* reactive buffer, it invokes `onEvent` once per event for as long as
|
|
150
|
+
* the calling scope is alive — the idiomatic place for analytics,
|
|
151
|
+
* logging, and other fire-and-forget side effects.
|
|
152
|
+
*
|
|
153
|
+
* ```svelte
|
|
154
|
+
* <script lang="ts">
|
|
155
|
+
* useChannelEffect(stream, ["lifecycle", "tools"], {
|
|
156
|
+
* replay: false,
|
|
157
|
+
* onEvent(event) {
|
|
158
|
+
* sendAnalytics(event);
|
|
159
|
+
* },
|
|
160
|
+
* onError(error) {
|
|
161
|
+
* logger.error(error);
|
|
162
|
+
* },
|
|
163
|
+
* });
|
|
164
|
+
* <\/script>
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* Reactive `channels` / `target` / `enabled` getters re-bind the
|
|
168
|
+
* subscription when they change. The underlying subscription is shared
|
|
169
|
+
* (ref-counted) with any matching {@link useChannel} consumer. `replay`
|
|
170
|
+
* defaults to `false` (live-only); events buffered before the effect
|
|
171
|
+
* attaches are not re-delivered.
|
|
172
|
+
*
|
|
173
|
+
* Must be called from a reactive context (a `.svelte` component script
|
|
174
|
+
* or inside `$effect.root`).
|
|
175
|
+
*/
|
|
176
|
+
function useChannelEffect(stream, channels, options) {
|
|
177
|
+
useResolveSubagentNamespace(stream, options.target);
|
|
178
|
+
$effect(() => {
|
|
179
|
+
const enabled = isGetter(options.enabled) ? options.enabled() : options.enabled ?? true;
|
|
180
|
+
const resolvedChannels = isGetter(channels) ? channels() : channels;
|
|
181
|
+
const namespace = resolveNamespace(isGetter(options.target) ? options.target() : options.target);
|
|
182
|
+
if (!enabled) return;
|
|
183
|
+
const registry = require_use_stream_svelte.getRegistry(stream);
|
|
184
|
+
if (registry == null) return;
|
|
185
|
+
return (0, _langchain_langgraph_sdk_stream.acquireChannelEffect)(registry, resolvedChannels, namespace, {
|
|
186
|
+
replay: options.replay,
|
|
187
|
+
bufferSize: options.bufferSize,
|
|
188
|
+
onEvent: (event) => options.onEvent(event),
|
|
189
|
+
onError: options.onError ? (error) => options.onError?.(error) : void 0
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
148
194
|
* Subscribe to a scoped audio-media stream. Each handle is yielded
|
|
149
195
|
* on its first matching `content-block-start`, exposes
|
|
150
196
|
* `.partialBytes` for live access, settles `.blob` / `.objectURL` /
|
|
@@ -228,6 +274,7 @@ function useSubmissionQueue(stream) {
|
|
|
228
274
|
//#endregion
|
|
229
275
|
exports.useAudio = useAudio;
|
|
230
276
|
exports.useChannel = useChannel;
|
|
277
|
+
exports.useChannelEffect = useChannelEffect;
|
|
231
278
|
exports.useExtension = useExtension;
|
|
232
279
|
exports.useFiles = useFiles;
|
|
233
280
|
exports.useImages = useImages;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.svelte.cjs","names":["NAMESPACE_SEPARATOR","STREAM_CONTROLLER","useProjection","getRegistry"],"sources":["../src/selectors.svelte.ts"],"sourcesContent":["import type { BaseMessage } from \"@langchain/core/messages\";\nimport {\n NAMESPACE_SEPARATOR,\n audioProjection,\n channelProjection,\n extensionProjection,\n filesProjection,\n imagesProjection,\n messagesProjection,\n toolCallsProjection,\n valuesProjection,\n videoProjection,\n type AssembledToolCall,\n type AudioMedia,\n type Channel,\n type ChannelProjectionOptions,\n type Event,\n type FileMedia,\n type ImageMedia,\n type InferToolCalls,\n type InferStateType,\n type MessageMetadata,\n type MessageMetadataMap,\n type SubagentDiscoverySnapshot,\n type SubgraphDiscoverySnapshot,\n type SubmissionQueueEntry,\n type SubmissionQueueSnapshot,\n type VideoMedia,\n} from \"@langchain/langgraph-sdk/stream\";\nimport {\n getRegistry,\n STREAM_CONTROLLER,\n type AnyStream,\n type UseStreamReturn,\n} from \"./use-stream.svelte.js\";\nimport {\n useProjection,\n type ReactiveValue,\n type ValueOrGetter,\n} from \"./use-projection.svelte.js\";\n\n/**\n * Parameterise selectors on `StateType` alone so callers with a full\n * `useStream<S, I, C>()` handle don't have to redeclare\n * `InterruptType` / `ConfigurableType` at every call site.\n */\ntype StreamHandle<StateType extends object> = UseStreamReturn<\n StateType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\n/**\n * What a selector composable targets. Callers can pass:\n * - `undefined` / `null` — root namespace (served by the always-on\n * root store; no extra subscription opens);\n * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);\n * - a {@link SubgraphDiscoverySnapshot}\n * (`stream.subgraphs.get(...)`);\n * - an explicit `{ namespace: string[] }`;\n * - a raw `string[]` escape hatch.\n */\nexport type SelectorTarget =\n | undefined\n | null\n | readonly string[]\n | { namespace: readonly string[] }\n | SubagentDiscoverySnapshot\n | SubgraphDiscoverySnapshot;\n\nconst EMPTY_NAMESPACE: readonly string[] = [];\n\nfunction resolveNamespace(target: SelectorTarget): readonly string[] {\n if (target == null) return EMPTY_NAMESPACE;\n if (Array.isArray(target)) return target as readonly string[];\n const obj = target as { namespace?: readonly string[] };\n return obj.namespace ?? EMPTY_NAMESPACE;\n}\n\nfunction isRoot(namespace: readonly string[]): boolean {\n return namespace.length === 0;\n}\n\nfunction namespaceKey(namespace: readonly string[]): string {\n return namespace.join(NAMESPACE_SEPARATOR);\n}\n\nfunction isGetter<T>(input: ValueOrGetter<T> | undefined): input is () => T {\n return typeof input === \"function\";\n}\n\n/**\n * If `target` is a subagent snapshot still on its default\n * `tools:<toolCallId>` namespace, return that tool-call id. See the\n * React selectors for the rationale (deep-agent subagents execute under\n * a distinct `tools:<uuid>` namespace resolved lazily from history).\n */\nfunction subagentNeedingNamespace(target: SelectorTarget): string | null {\n if (target == null || Array.isArray(target)) return null;\n const obj = target as { id?: unknown; namespace?: readonly string[] };\n if (typeof obj.id !== \"string\" || !Array.isArray(obj.namespace)) return null;\n if (obj.namespace.length === 1 && obj.namespace[0] === `tools:${obj.id}`) {\n return obj.id;\n }\n return null;\n}\n\n/**\n * Lazily resolve a subagent's execution namespace on first scoped use.\n * Re-evaluates when a reactive `target` changes; the controller\n * de-dupes and skips already-promoted ids.\n */\nfunction useResolveSubagentNamespace(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined\n): void {\n const controller = stream[STREAM_CONTROLLER];\n $effect(() => {\n const resolved = isGetter(target) ? target() : target;\n const id = subagentNeedingNamespace(resolved);\n if (id != null) void controller.resolveSubagentNamespace(id);\n });\n}\n\n/**\n * Internal helper that wires a reactive-or-static target into\n * {@link useProjection}. Encapsulates the bookkeeping every selector\n * otherwise repeats.\n */\nfunction selectFromTarget<T>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined,\n initialValue: T,\n makeSpec: (\n namespace: readonly string[]\n ) => import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<T>,\n keyPrefix: string\n): ReactiveValue<T> {\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T>(\n () => {\n const ns = resolveNamespace(getTarget());\n return isRoot(ns) ? null : getRegistry(stream);\n },\n () => makeSpec(resolveNamespace(getTarget())),\n () => `${keyPrefix}|${namespaceKey(resolveNamespace(getTarget()))}`,\n initialValue\n );\n }\n const ns = resolveNamespace(target);\n // Static root: we deliberately don't short-circuit here because\n // each selector owns the root fallback shape (`stream.messages`\n // vs `stream.values` vs `stream.toolCalls`). Callers use the\n // dedicated wrappers below.\n const key = `${keyPrefix}|${namespaceKey(ns)}`;\n return useProjection<T>(\n isRoot(ns) ? null : getRegistry(stream),\n () => makeSpec(ns),\n key,\n initialValue\n );\n}\n\nconst EMPTY_MESSAGES: BaseMessage[] = [];\nconst EMPTY_TOOLCALLS: AssembledToolCall[] = [];\nconst EMPTY_EVENTS: Event[] = [];\nconst EMPTY_AUDIO: AudioMedia[] = [];\nconst EMPTY_IMAGES: ImageMedia[] = [];\nconst EMPTY_VIDEO: VideoMedia[] = [];\nconst EMPTY_FILES: FileMedia[] = [];\n\n/**\n * Subscribe to a scoped `messages` stream.\n *\n * Contract:\n * - At the root (no `target`, or a static target that resolves to\n * the root namespace) returns a handle whose `.current` delegates\n * to `stream.messages` — the always-on root projection. No extra\n * subscription is opened.\n * - For any non-root namespace, mount triggers a ref-counted\n * `messages` subscription scoped to that namespace. The\n * subscription is released automatically when the owning\n * component teardown fires (and the registry closes the\n * underlying server subscription when the last consumer leaves).\n * - A reactive `target` (getter form) re-binds the subscription on\n * change. A getter that flips between root and scoped is\n * supported: the root case short-circuits to the initial value\n * because dynamic root delegation isn't meaningful — pass a\n * static undefined/null target for root handles.\n *\n * Messages are always `BaseMessage` class instances from\n * `@langchain/core/messages`.\n */\nexport function useMessages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<BaseMessage[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.messages;\n },\n };\n }\n }\n return selectFromTarget<BaseMessage[]>(\n stream,\n target,\n EMPTY_MESSAGES,\n (ns) => messagesProjection(ns),\n \"messages\"\n );\n}\n\n/**\n * Subscribe to a scoped `tools` (tool-call) stream. Same target and\n * lifecycle rules as {@link useMessages}; at the root this returns a\n * handle delegating to `stream.toolCalls`.\n */\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]>;\nexport function useToolCalls<T>(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<InferToolCalls<T>[]>;\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.toolCalls;\n },\n };\n }\n }\n return selectFromTarget<AssembledToolCall[]>(\n stream,\n target,\n EMPTY_TOOLCALLS,\n (ns) => toolCallsProjection(ns),\n \"toolCalls\"\n );\n}\n\n/**\n * Subscribe to a scoped `values` stream — the most recent state\n * payload for a namespace. At the root returns a handle delegating\n * to `stream.values`.\n *\n * Typing:\n * - **Root** (`useValues(stream)`): returns the `StateType` declared\n * on `useStream<State>()` — non-nullable (the root snapshot\n * always has values, falling back to `initialValues ?? {}`).\n * - **Scoped** (`useValues(stream, target)`): scoped payloads can\n * differ from the root state; callers should annotate the\n * expected shape explicitly (`useValues<SubagentState>(stream,\n * sub)`). Defaults to `unknown` when not annotated.\n */\nexport function useValues<StateType extends object>(\n stream: StreamHandle<StateType>\n): ReactiveValue<StateType>;\nexport function useValues<T>(\n stream: AnyStream\n): ReactiveValue<InferStateType<T>>;\nexport function useValues<T = unknown>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<T | undefined>;\nexport function useValues(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<unknown> {\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.values;\n },\n };\n }\n }\n const messagesKey = options?.messagesKey ?? \"messages\";\n return selectFromTarget<unknown>(\n stream,\n target,\n undefined,\n (ns) => valuesProjection<unknown>(ns, messagesKey),\n `values|${messagesKey}`\n );\n}\n\n/**\n * Subscribe to a `custom:<name>` stream extension — the most-recent\n * payload emitted by the transformer, scoped to the target namespace.\n *\n * Returns only the latest value and resumes across serial runs, so it is\n * ideal for \"current state\" panels (progress, score, status). When you\n * need the full history of events rather than just the latest payload,\n * use {@link useChannel} instead.\n *\n * `name` accepts either a plain string or a getter so component\n * state can drive the extension name at runtime.\n */\nexport function useExtension<T = unknown>(\n stream: AnyStream,\n name: ValueOrGetter<string>,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<T | undefined> {\n const getName = () => (isGetter(name) ? (name as () => string)() : name);\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T | undefined>(\n () => getRegistry(stream),\n () => extensionProjection<T>(getName(), resolveNamespace(getTarget())),\n () =>\n `extension|${getName()}|${namespaceKey(resolveNamespace(getTarget()))}`,\n undefined\n );\n }\n const ns = resolveNamespace(target);\n return useProjection<T | undefined>(\n getRegistry(stream),\n () => extensionProjection<T>(getName(), ns),\n () => `extension|${getName()}|${namespaceKey(ns)}`,\n undefined\n );\n}\n\n/**\n * Raw-events escape hatch. Subscribes to one or more channels at a\n * namespace and returns a bounded buffer of raw protocol events.\n *\n * The buffer keeps accumulating across serial runs for the lifetime of\n * the thread, so this is the hook to use for an event log / stream of a\n * custom channel (e.g. `[\"custom:redaction-stats\"]`). When you only need\n * the latest payload of a single `custom:<name>` channel, prefer\n * {@link useExtension}. For the common message/tool/value cases prefer\n * {@link useMessages} / {@link useToolCalls} / {@link useValues}.\n */\nexport type UseChannelOptions = ChannelProjectionOptions;\n\nexport function useChannel(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n target?: ValueOrGetter<SelectorTarget>,\n options?: UseChannelOptions\n): ReactiveValue<Event[]> {\n const getChannels = () =>\n isGetter(channels) ? (channels as () => readonly Channel[])() : channels;\n const getTarget = () => (isGetter(target) ? target() : target);\n const bufferSize = options?.bufferSize ?? \"default\";\n const replayMode = (options?.replay ?? true) ? \"replay\" : \"live\";\n return useProjection<Event[]>(\n () => getRegistry(stream),\n () =>\n channelProjection(\n getChannels(),\n resolveNamespace(getTarget()),\n options\n ) as unknown as import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<\n Event[]\n >,\n () => {\n const sortedChannels = [...getChannels()].sort().join(\",\");\n return `channel|${bufferSize}|${replayMode}|${sortedChannels}|${namespaceKey(resolveNamespace(getTarget()))}`;\n },\n EMPTY_EVENTS\n );\n}\n\n/**\n * Subscribe to a scoped audio-media stream. Each handle is yielded\n * on its first matching `content-block-start`, exposes\n * `.partialBytes` for live access, settles `.blob` / `.objectURL` /\n * `.transcript` on `message-finish`, and surfaces errors via\n * `.error`.\n */\nexport function useAudio(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AudioMedia[]> {\n return selectFromTarget<AudioMedia[]>(\n stream,\n target,\n EMPTY_AUDIO,\n (ns) => audioProjection(ns),\n \"audio\"\n );\n}\n\n/**\n * Subscribe to a scoped image-media stream. Pair with `useMediaURL`\n * for `<img src>`.\n */\nexport function useImages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<ImageMedia[]> {\n return selectFromTarget<ImageMedia[]>(\n stream,\n target,\n EMPTY_IMAGES,\n (ns) => imagesProjection(ns),\n \"images\"\n );\n}\n\n/**\n * Subscribe to a scoped video-media stream. Pair with `useMediaURL`\n * for `<video src>`.\n */\nexport function useVideo(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<VideoMedia[]> {\n return selectFromTarget<VideoMedia[]>(\n stream,\n target,\n EMPTY_VIDEO,\n (ns) => videoProjection(ns),\n \"video\"\n );\n}\n\n/**\n * Subscribe to a scoped file-media stream. Pair with `useMediaURL`\n * for an `<a download href>` target.\n */\nexport function useFiles(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<FileMedia[]> {\n return selectFromTarget<FileMedia[]>(\n stream,\n target,\n EMPTY_FILES,\n (ns) => filesProjection(ns),\n \"files\"\n );\n}\n\n/**\n * Read metadata recorded for a specific message id — today exposes\n * `parentCheckpointId`, the checkpoint the message was first seen\n * on. Designed for fork / edit flows:\n *\n * ```svelte\n * <script lang=\"ts\">\n * const meta = useMessageMetadata(stream, () => selected?.id);\n * </script>\n * Parent: {meta.current?.parentCheckpointId ?? \"root\"}\n * ```\n *\n * `messageId` accepts a plain string or a getter — the binding\n * re-evaluates whenever the id changes.\n */\nexport function useMessageMetadata(\n stream: AnyStream,\n messageId: ValueOrGetter<string | undefined>\n): ReactiveValue<MessageMetadata | undefined> {\n const store = stream[STREAM_CONTROLLER].messageMetadataStore;\n let map = $state<MessageMetadataMap>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n map = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n const getId = () =>\n isGetter(messageId) ? (messageId as () => string | undefined)() : messageId;\n\n return {\n get current(): MessageMetadata | undefined {\n const key = getId();\n if (key == null) return undefined;\n return map.get(key);\n },\n };\n}\n\n/**\n * Reactive handle on the server-side submission queue.\n *\n * Populated when `submit()` is invoked with\n * `multitaskStrategy: \"enqueue\"` while another run is in flight. The\n * returned getters are stable — safe to pass into `{#each}`.\n */\nexport interface UseSubmissionQueueReturn<\n StateType extends object = Record<string, unknown>,\n> {\n readonly entries: SubmissionQueueSnapshot<StateType>;\n readonly size: number;\n cancel(id: string): Promise<boolean>;\n clear(): Promise<void>;\n}\n\nexport function useSubmissionQueue<StateType extends object>(\n stream: StreamHandle<StateType>\n): UseSubmissionQueueReturn<StateType>;\nexport function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;\nexport function useSubmissionQueue(\n stream: AnyStream\n): UseSubmissionQueueReturn {\n const controller = stream[STREAM_CONTROLLER];\n const store = controller.queueStore;\n let entries = $state<SubmissionQueueSnapshot>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n entries = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n return {\n get entries() {\n return entries;\n },\n get size() {\n return entries.length;\n },\n cancel: (id) => controller.cancelQueued(id),\n clear: () => controller.clearQueue(),\n };\n}\n\nexport type { SubmissionQueueEntry, SubmissionQueueSnapshot };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selectors.svelte.cjs","names":["NAMESPACE_SEPARATOR","STREAM_CONTROLLER","useProjection","getRegistry"],"sources":["../src/selectors.svelte.ts"],"sourcesContent":["import type { BaseMessage } from \"@langchain/core/messages\";\nimport {\n NAMESPACE_SEPARATOR,\n acquireChannelEffect,\n audioProjection,\n channelProjection,\n extensionProjection,\n filesProjection,\n imagesProjection,\n messagesProjection,\n toolCallsProjection,\n valuesProjection,\n videoProjection,\n type AssembledToolCall,\n type AudioMedia,\n type Channel,\n type ChannelEffectOptions,\n type ChannelProjectionOptions,\n type Event,\n type FileMedia,\n type ImageMedia,\n type InferToolCalls,\n type InferStateType,\n type MessageMetadata,\n type MessageMetadataMap,\n type SubagentDiscoverySnapshot,\n type SubgraphDiscoverySnapshot,\n type SubmissionQueueEntry,\n type SubmissionQueueSnapshot,\n type VideoMedia,\n} from \"@langchain/langgraph-sdk/stream\";\nimport {\n getRegistry,\n STREAM_CONTROLLER,\n type AnyStream,\n type UseStreamReturn,\n} from \"./use-stream.svelte.js\";\nimport {\n useProjection,\n type ReactiveValue,\n type ValueOrGetter,\n} from \"./use-projection.svelte.js\";\n\n/**\n * Parameterise selectors on `StateType` alone so callers with a full\n * `useStream<S, I, C>()` handle don't have to redeclare\n * `InterruptType` / `ConfigurableType` at every call site.\n */\ntype StreamHandle<StateType extends object> = UseStreamReturn<\n StateType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\n/**\n * What a selector composable targets. Callers can pass:\n * - `undefined` / `null` — root namespace (served by the always-on\n * root store; no extra subscription opens);\n * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);\n * - a {@link SubgraphDiscoverySnapshot}\n * (`stream.subgraphs.get(...)`);\n * - an explicit `{ namespace: string[] }`;\n * - a raw `string[]` escape hatch.\n */\nexport type SelectorTarget =\n | undefined\n | null\n | readonly string[]\n | { namespace: readonly string[] }\n | SubagentDiscoverySnapshot\n | SubgraphDiscoverySnapshot;\n\nconst EMPTY_NAMESPACE: readonly string[] = [];\n\nfunction resolveNamespace(target: SelectorTarget): readonly string[] {\n if (target == null) return EMPTY_NAMESPACE;\n if (Array.isArray(target)) return target as readonly string[];\n const obj = target as { namespace?: readonly string[] };\n return obj.namespace ?? EMPTY_NAMESPACE;\n}\n\nfunction isRoot(namespace: readonly string[]): boolean {\n return namespace.length === 0;\n}\n\nfunction namespaceKey(namespace: readonly string[]): string {\n return namespace.join(NAMESPACE_SEPARATOR);\n}\n\nfunction isGetter<T>(input: ValueOrGetter<T> | undefined): input is () => T {\n return typeof input === \"function\";\n}\n\n/**\n * If `target` is a subagent snapshot still on its default\n * `tools:<toolCallId>` namespace, return that tool-call id. See the\n * React selectors for the rationale (deep-agent subagents execute under\n * a distinct `tools:<uuid>` namespace resolved lazily from history).\n */\nfunction subagentNeedingNamespace(target: SelectorTarget): string | null {\n if (target == null || Array.isArray(target)) return null;\n const obj = target as { id?: unknown; namespace?: readonly string[] };\n if (typeof obj.id !== \"string\" || !Array.isArray(obj.namespace)) return null;\n if (obj.namespace.length === 1 && obj.namespace[0] === `tools:${obj.id}`) {\n return obj.id;\n }\n return null;\n}\n\n/**\n * Lazily resolve a subagent's execution namespace on first scoped use.\n * Re-evaluates when a reactive `target` changes; the controller\n * de-dupes and skips already-promoted ids.\n */\nfunction useResolveSubagentNamespace(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined\n): void {\n const controller = stream[STREAM_CONTROLLER];\n $effect(() => {\n const resolved = isGetter(target) ? target() : target;\n const id = subagentNeedingNamespace(resolved);\n if (id != null) void controller.resolveSubagentNamespace(id);\n });\n}\n\n/**\n * Internal helper that wires a reactive-or-static target into\n * {@link useProjection}. Encapsulates the bookkeeping every selector\n * otherwise repeats.\n */\nfunction selectFromTarget<T>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined,\n initialValue: T,\n makeSpec: (\n namespace: readonly string[]\n ) => import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<T>,\n keyPrefix: string\n): ReactiveValue<T> {\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T>(\n () => {\n const ns = resolveNamespace(getTarget());\n return isRoot(ns) ? null : getRegistry(stream);\n },\n () => makeSpec(resolveNamespace(getTarget())),\n () => `${keyPrefix}|${namespaceKey(resolveNamespace(getTarget()))}`,\n initialValue\n );\n }\n const ns = resolveNamespace(target);\n // Static root: we deliberately don't short-circuit here because\n // each selector owns the root fallback shape (`stream.messages`\n // vs `stream.values` vs `stream.toolCalls`). Callers use the\n // dedicated wrappers below.\n const key = `${keyPrefix}|${namespaceKey(ns)}`;\n return useProjection<T>(\n isRoot(ns) ? null : getRegistry(stream),\n () => makeSpec(ns),\n key,\n initialValue\n );\n}\n\nconst EMPTY_MESSAGES: BaseMessage[] = [];\nconst EMPTY_TOOLCALLS: AssembledToolCall[] = [];\nconst EMPTY_EVENTS: Event[] = [];\nconst EMPTY_AUDIO: AudioMedia[] = [];\nconst EMPTY_IMAGES: ImageMedia[] = [];\nconst EMPTY_VIDEO: VideoMedia[] = [];\nconst EMPTY_FILES: FileMedia[] = [];\n\n/**\n * Subscribe to a scoped `messages` stream.\n *\n * Contract:\n * - At the root (no `target`, or a static target that resolves to\n * the root namespace) returns a handle whose `.current` delegates\n * to `stream.messages` — the always-on root projection. No extra\n * subscription is opened.\n * - For any non-root namespace, mount triggers a ref-counted\n * `messages` subscription scoped to that namespace. The\n * subscription is released automatically when the owning\n * component teardown fires (and the registry closes the\n * underlying server subscription when the last consumer leaves).\n * - A reactive `target` (getter form) re-binds the subscription on\n * change. A getter that flips between root and scoped is\n * supported: the root case short-circuits to the initial value\n * because dynamic root delegation isn't meaningful — pass a\n * static undefined/null target for root handles.\n *\n * Messages are always `BaseMessage` class instances from\n * `@langchain/core/messages`.\n */\nexport function useMessages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<BaseMessage[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.messages;\n },\n };\n }\n }\n return selectFromTarget<BaseMessage[]>(\n stream,\n target,\n EMPTY_MESSAGES,\n (ns) => messagesProjection(ns),\n \"messages\"\n );\n}\n\n/**\n * Subscribe to a scoped `tools` (tool-call) stream. Same target and\n * lifecycle rules as {@link useMessages}; at the root this returns a\n * handle delegating to `stream.toolCalls`.\n */\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]>;\nexport function useToolCalls<T>(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<InferToolCalls<T>[]>;\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.toolCalls;\n },\n };\n }\n }\n return selectFromTarget<AssembledToolCall[]>(\n stream,\n target,\n EMPTY_TOOLCALLS,\n (ns) => toolCallsProjection(ns),\n \"toolCalls\"\n );\n}\n\n/**\n * Subscribe to a scoped `values` stream — the most recent state\n * payload for a namespace. At the root returns a handle delegating\n * to `stream.values`.\n *\n * Typing:\n * - **Root** (`useValues(stream)`): returns the `StateType` declared\n * on `useStream<State>()` — non-nullable (the root snapshot\n * always has values, falling back to `initialValues ?? {}`).\n * - **Scoped** (`useValues(stream, target)`): scoped payloads can\n * differ from the root state; callers should annotate the\n * expected shape explicitly (`useValues<SubagentState>(stream,\n * sub)`). Defaults to `unknown` when not annotated.\n */\nexport function useValues<StateType extends object>(\n stream: StreamHandle<StateType>\n): ReactiveValue<StateType>;\nexport function useValues<T>(\n stream: AnyStream\n): ReactiveValue<InferStateType<T>>;\nexport function useValues<T = unknown>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<T | undefined>;\nexport function useValues(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<unknown> {\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.values;\n },\n };\n }\n }\n const messagesKey = options?.messagesKey ?? \"messages\";\n return selectFromTarget<unknown>(\n stream,\n target,\n undefined,\n (ns) => valuesProjection<unknown>(ns, messagesKey),\n `values|${messagesKey}`\n );\n}\n\n/**\n * Subscribe to a `custom:<name>` stream extension — the most-recent\n * payload emitted by the transformer, scoped to the target namespace.\n *\n * Returns only the latest value and resumes across serial runs, so it is\n * ideal for \"current state\" panels (progress, score, status). When you\n * need the full history of events rather than just the latest payload,\n * use {@link useChannel} instead.\n *\n * `name` accepts either a plain string or a getter so component\n * state can drive the extension name at runtime.\n */\nexport function useExtension<T = unknown>(\n stream: AnyStream,\n name: ValueOrGetter<string>,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<T | undefined> {\n const getName = () => (isGetter(name) ? (name as () => string)() : name);\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T | undefined>(\n () => getRegistry(stream),\n () => extensionProjection<T>(getName(), resolveNamespace(getTarget())),\n () =>\n `extension|${getName()}|${namespaceKey(resolveNamespace(getTarget()))}`,\n undefined\n );\n }\n const ns = resolveNamespace(target);\n return useProjection<T | undefined>(\n getRegistry(stream),\n () => extensionProjection<T>(getName(), ns),\n () => `extension|${getName()}|${namespaceKey(ns)}`,\n undefined\n );\n}\n\n/**\n * Raw-events escape hatch. Subscribes to one or more channels at a\n * namespace and returns a bounded buffer of raw protocol events.\n *\n * The buffer keeps accumulating across serial runs for the lifetime of\n * the thread, so this is the hook to use for an event log / stream of a\n * custom channel (e.g. `[\"custom:redaction-stats\"]`). When you only need\n * the latest payload of a single `custom:<name>` channel, prefer\n * {@link useExtension}. For the common message/tool/value cases prefer\n * {@link useMessages} / {@link useToolCalls} / {@link useValues}.\n */\nexport type UseChannelOptions = ChannelProjectionOptions;\n\nexport function useChannel(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n target?: ValueOrGetter<SelectorTarget>,\n options?: UseChannelOptions\n): ReactiveValue<Event[]> {\n const getChannels = () =>\n isGetter(channels) ? (channels as () => readonly Channel[])() : channels;\n const getTarget = () => (isGetter(target) ? target() : target);\n const bufferSize = options?.bufferSize ?? \"default\";\n const replayMode = (options?.replay ?? true) ? \"replay\" : \"live\";\n return useProjection<Event[]>(\n () => getRegistry(stream),\n () =>\n channelProjection(\n getChannels(),\n resolveNamespace(getTarget()),\n options\n ) as unknown as import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<\n Event[]\n >,\n () => {\n const sortedChannels = [...getChannels()].sort().join(\",\");\n return `channel|${bufferSize}|${replayMode}|${sortedChannels}|${namespaceKey(resolveNamespace(getTarget()))}`;\n },\n EMPTY_EVENTS\n );\n}\n\n/**\n * Options for {@link useChannelEffect}. Extends the projection options\n * (`bufferSize`, `replay`) with the per-event callback, an optional\n * error sink, a reactive `target` scope, and a reactive `enabled` gate.\n */\nexport interface UseChannelEffectOptions extends ChannelEffectOptions {\n /**\n * Scope events to a subagent / subgraph / explicit namespace.\n * Defaults to the root namespace. Accepts a getter so component\n * `$state` can drive the scope.\n */\n target?: ValueOrGetter<SelectorTarget>;\n /**\n * Gate the subscription. When `false`, no subscription is opened and\n * no events are delivered. Defaults to `true`. Accepts a getter.\n */\n enabled?: ValueOrGetter<boolean>;\n}\n\n/**\n * Side-effect counterpart to {@link useChannel}. Instead of returning a\n * reactive buffer, it invokes `onEvent` once per event for as long as\n * the calling scope is alive — the idiomatic place for analytics,\n * logging, and other fire-and-forget side effects.\n *\n * ```svelte\n * <script lang=\"ts\">\n * useChannelEffect(stream, [\"lifecycle\", \"tools\"], {\n * replay: false,\n * onEvent(event) {\n * sendAnalytics(event);\n * },\n * onError(error) {\n * logger.error(error);\n * },\n * });\n * </script>\n * ```\n *\n * Reactive `channels` / `target` / `enabled` getters re-bind the\n * subscription when they change. The underlying subscription is shared\n * (ref-counted) with any matching {@link useChannel} consumer. `replay`\n * defaults to `false` (live-only); events buffered before the effect\n * attaches are not re-delivered.\n *\n * Must be called from a reactive context (a `.svelte` component script\n * or inside `$effect.root`).\n */\nexport function useChannelEffect(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n options: UseChannelEffectOptions\n): void {\n useResolveSubagentNamespace(stream, options.target);\n\n $effect(() => {\n const enabled = isGetter(options.enabled)\n ? options.enabled()\n : (options.enabled ?? true);\n const resolvedChannels = isGetter(channels) ? channels() : channels;\n const target = isGetter(options.target) ? options.target() : options.target;\n const namespace = resolveNamespace(target);\n\n if (!enabled) return;\n const registry = getRegistry(stream);\n if (registry == null) return;\n\n // `onEvent` / `onError` are read lazily inside the wrappers so the\n // effect doesn't re-acquire when a caller passes a fresh closure.\n return acquireChannelEffect(registry, resolvedChannels, namespace, {\n replay: options.replay,\n bufferSize: options.bufferSize,\n onEvent: (event) => options.onEvent(event),\n onError: options.onError\n ? (error) => options.onError?.(error)\n : undefined,\n });\n });\n}\n\n/**\n * Subscribe to a scoped audio-media stream. Each handle is yielded\n * on its first matching `content-block-start`, exposes\n * `.partialBytes` for live access, settles `.blob` / `.objectURL` /\n * `.transcript` on `message-finish`, and surfaces errors via\n * `.error`.\n */\nexport function useAudio(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AudioMedia[]> {\n return selectFromTarget<AudioMedia[]>(\n stream,\n target,\n EMPTY_AUDIO,\n (ns) => audioProjection(ns),\n \"audio\"\n );\n}\n\n/**\n * Subscribe to a scoped image-media stream. Pair with `useMediaURL`\n * for `<img src>`.\n */\nexport function useImages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<ImageMedia[]> {\n return selectFromTarget<ImageMedia[]>(\n stream,\n target,\n EMPTY_IMAGES,\n (ns) => imagesProjection(ns),\n \"images\"\n );\n}\n\n/**\n * Subscribe to a scoped video-media stream. Pair with `useMediaURL`\n * for `<video src>`.\n */\nexport function useVideo(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<VideoMedia[]> {\n return selectFromTarget<VideoMedia[]>(\n stream,\n target,\n EMPTY_VIDEO,\n (ns) => videoProjection(ns),\n \"video\"\n );\n}\n\n/**\n * Subscribe to a scoped file-media stream. Pair with `useMediaURL`\n * for an `<a download href>` target.\n */\nexport function useFiles(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<FileMedia[]> {\n return selectFromTarget<FileMedia[]>(\n stream,\n target,\n EMPTY_FILES,\n (ns) => filesProjection(ns),\n \"files\"\n );\n}\n\n/**\n * Read metadata recorded for a specific message id — today exposes\n * `parentCheckpointId`, the checkpoint the message was first seen\n * on. Designed for fork / edit flows:\n *\n * ```svelte\n * <script lang=\"ts\">\n * const meta = useMessageMetadata(stream, () => selected?.id);\n * </script>\n * Parent: {meta.current?.parentCheckpointId ?? \"root\"}\n * ```\n *\n * `messageId` accepts a plain string or a getter — the binding\n * re-evaluates whenever the id changes.\n */\nexport function useMessageMetadata(\n stream: AnyStream,\n messageId: ValueOrGetter<string | undefined>\n): ReactiveValue<MessageMetadata | undefined> {\n const store = stream[STREAM_CONTROLLER].messageMetadataStore;\n let map = $state<MessageMetadataMap>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n map = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n const getId = () =>\n isGetter(messageId) ? (messageId as () => string | undefined)() : messageId;\n\n return {\n get current(): MessageMetadata | undefined {\n const key = getId();\n if (key == null) return undefined;\n return map.get(key);\n },\n };\n}\n\n/**\n * Reactive handle on the server-side submission queue.\n *\n * Populated when `submit()` is invoked with\n * `multitaskStrategy: \"enqueue\"` while another run is in flight. The\n * returned getters are stable — safe to pass into `{#each}`.\n */\nexport interface UseSubmissionQueueReturn<\n StateType extends object = Record<string, unknown>,\n> {\n readonly entries: SubmissionQueueSnapshot<StateType>;\n readonly size: number;\n cancel(id: string): Promise<boolean>;\n clear(): Promise<void>;\n}\n\nexport function useSubmissionQueue<StateType extends object>(\n stream: StreamHandle<StateType>\n): UseSubmissionQueueReturn<StateType>;\nexport function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;\nexport function useSubmissionQueue(\n stream: AnyStream\n): UseSubmissionQueueReturn {\n const controller = stream[STREAM_CONTROLLER];\n const store = controller.queueStore;\n let entries = $state<SubmissionQueueSnapshot>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n entries = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n return {\n get entries() {\n return entries;\n },\n get size() {\n return entries.length;\n },\n cancel: (id) => controller.cancelQueued(id),\n clear: () => controller.clearQueue(),\n };\n}\n\nexport type { SubmissionQueueEntry, SubmissionQueueSnapshot };\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnyStream, UseStreamReturn } from "./use-stream.svelte.cjs";
|
|
2
2
|
import { ReactiveValue, ValueOrGetter } from "./use-projection.svelte.cjs";
|
|
3
3
|
import { BaseMessage } from "@langchain/core/messages";
|
|
4
|
-
import { AssembledToolCall, AudioMedia, Channel, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, InferToolCalls, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
|
|
4
|
+
import { AssembledToolCall, AudioMedia, Channel, ChannelEffectOptions, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, InferToolCalls, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
|
|
5
5
|
|
|
6
6
|
//#region src/selectors.svelte.d.ts
|
|
7
7
|
/**
|
|
@@ -98,6 +98,54 @@ declare function useExtension<T = unknown>(stream: AnyStream, name: ValueOrGette
|
|
|
98
98
|
*/
|
|
99
99
|
type UseChannelOptions = ChannelProjectionOptions;
|
|
100
100
|
declare function useChannel(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, target?: ValueOrGetter<SelectorTarget>, options?: UseChannelOptions): ReactiveValue<Event[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Options for {@link useChannelEffect}. Extends the projection options
|
|
103
|
+
* (`bufferSize`, `replay`) with the per-event callback, an optional
|
|
104
|
+
* error sink, a reactive `target` scope, and a reactive `enabled` gate.
|
|
105
|
+
*/
|
|
106
|
+
interface UseChannelEffectOptions extends ChannelEffectOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Scope events to a subagent / subgraph / explicit namespace.
|
|
109
|
+
* Defaults to the root namespace. Accepts a getter so component
|
|
110
|
+
* `$state` can drive the scope.
|
|
111
|
+
*/
|
|
112
|
+
target?: ValueOrGetter<SelectorTarget>;
|
|
113
|
+
/**
|
|
114
|
+
* Gate the subscription. When `false`, no subscription is opened and
|
|
115
|
+
* no events are delivered. Defaults to `true`. Accepts a getter.
|
|
116
|
+
*/
|
|
117
|
+
enabled?: ValueOrGetter<boolean>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Side-effect counterpart to {@link useChannel}. Instead of returning a
|
|
121
|
+
* reactive buffer, it invokes `onEvent` once per event for as long as
|
|
122
|
+
* the calling scope is alive — the idiomatic place for analytics,
|
|
123
|
+
* logging, and other fire-and-forget side effects.
|
|
124
|
+
*
|
|
125
|
+
* ```svelte
|
|
126
|
+
* <script lang="ts">
|
|
127
|
+
* useChannelEffect(stream, ["lifecycle", "tools"], {
|
|
128
|
+
* replay: false,
|
|
129
|
+
* onEvent(event) {
|
|
130
|
+
* sendAnalytics(event);
|
|
131
|
+
* },
|
|
132
|
+
* onError(error) {
|
|
133
|
+
* logger.error(error);
|
|
134
|
+
* },
|
|
135
|
+
* });
|
|
136
|
+
* </script>
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* Reactive `channels` / `target` / `enabled` getters re-bind the
|
|
140
|
+
* subscription when they change. The underlying subscription is shared
|
|
141
|
+
* (ref-counted) with any matching {@link useChannel} consumer. `replay`
|
|
142
|
+
* defaults to `false` (live-only); events buffered before the effect
|
|
143
|
+
* attaches are not re-delivered.
|
|
144
|
+
*
|
|
145
|
+
* Must be called from a reactive context (a `.svelte` component script
|
|
146
|
+
* or inside `$effect.root`).
|
|
147
|
+
*/
|
|
148
|
+
declare function useChannelEffect(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, options: UseChannelEffectOptions): void;
|
|
101
149
|
/**
|
|
102
150
|
* Subscribe to a scoped audio-media stream. Each handle is yielded
|
|
103
151
|
* on its first matching `content-block-start`, exposes
|
|
@@ -153,5 +201,5 @@ interface UseSubmissionQueueReturn<StateType extends object = Record<string, unk
|
|
|
153
201
|
declare function useSubmissionQueue<StateType extends object>(stream: StreamHandle<StateType>): UseSubmissionQueueReturn<StateType>;
|
|
154
202
|
declare function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;
|
|
155
203
|
//#endregion
|
|
156
|
-
export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
204
|
+
export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseChannelEffectOptions, UseSubmissionQueueReturn, useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
157
205
|
//# sourceMappingURL=selectors.svelte.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.svelte.d.cts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"selectors.svelte.d.cts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;AAyCoC;;;KAO/B,YAAA,6BAAyC,eAAA,CAC5C,SAAA;;;;;;AAiBF;;;;;KAAY,cAAA;EAIN,SAAA;AAAA,IACF,yBAAA,GACA,yBAAA;;AA8HJ;;;;;;;;;;;;;;;;;;;AA6BA;;iBA7BgB,WAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,WAAA;;;;;;iBA0BD,YAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,iBAAA;AAAA,iBACD,YAAA,GAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,cAAA,CAAe,CAAA;;;;;;;;;;AAHhC;;;;;iBA0CgB,SAAA,0BAAA,CACd,MAAA,EAAQ,YAAA,CAAa,SAAA,IACpB,aAAA,CAAc,SAAA;AAAA,iBACD,SAAA,GAAA,CACd,MAAA,EAAQ,SAAA,GACP,aAAA,CAAc,cAAA,CAAe,CAAA;AAAA,iBAChB,SAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,EAAQ,aAAA,CAAc,cAAA,GACtB,OAAA;EAAY,WAAA;AAAA,IACX,aAAA,CAAc,CAAA;;;;;;;;;;;;;iBAsCD,YAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,IAAA,EAAM,aAAA,UACN,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,CAAA;;;;;;;;;;;;KAgCL,iBAAA,GAAoB,wBAAA;AAAA,iBAEhB,UAAA,CACd,MAAA,EAAQ,SAAA,EACR,QAAA,EAAU,aAAA,UAAuB,OAAA,KACjC,MAAA,GAAS,aAAA,CAAc,cAAA,GACvB,OAAA,GAAU,iBAAA,GACT,aAAA,CAAc,KAAA;;;;AAxFjB;;UAqHiB,uBAAA,SAAgC,oBAAA;EApHvC;;;;;EA0HR,MAAA,GAAS,aAAA,CAAc,cAAA;EA3HC;;;;EAgIxB,OAAA,GAAU,aAAA;AAAA;;;AA7HZ;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;iBAmHgB,gBAAA,CACd,MAAA,EAAQ,SAAA,EACR,QAAA,EAAU,aAAA,UAAuB,OAAA,KACjC,OAAA,EAAS,uBAAA;;;;;;;;iBAoCK,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,SAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,SAAA;;;;;;;;;;;;;;;;iBAyBD,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,SAAA,EAAW,aAAA,uBACV,aAAA,CAAc,eAAA;;;;;;;;UA8BA,wBAAA,4BACY,MAAA;EAAA,SAElB,OAAA,EAAS,uBAAA,CAAwB,SAAA;EAAA,SACjC,IAAA;EACT,MAAA,CAAO,EAAA,WAAa,OAAA;EACpB,KAAA,IAAS,OAAA;AAAA;AAAA,iBAGK,kBAAA,0BAAA,CACd,MAAA,EAAQ,YAAA,CAAa,SAAA,IACpB,wBAAA,CAAyB,SAAA;AAAA,iBACZ,kBAAA,CAAmB,MAAA,EAAQ,SAAA,GAAY,wBAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AnyStream, UseStreamReturn } from "./use-stream.svelte.js";
|
|
2
2
|
import { ReactiveValue, ValueOrGetter } from "./use-projection.svelte.js";
|
|
3
|
-
import { AssembledToolCall, AudioMedia, Channel, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, InferToolCalls, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
|
|
3
|
+
import { AssembledToolCall, AudioMedia, Channel, ChannelEffectOptions, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, InferToolCalls, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
|
|
4
4
|
import { BaseMessage } from "@langchain/core/messages";
|
|
5
5
|
|
|
6
6
|
//#region src/selectors.svelte.d.ts
|
|
@@ -98,6 +98,54 @@ declare function useExtension<T = unknown>(stream: AnyStream, name: ValueOrGette
|
|
|
98
98
|
*/
|
|
99
99
|
type UseChannelOptions = ChannelProjectionOptions;
|
|
100
100
|
declare function useChannel(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, target?: ValueOrGetter<SelectorTarget>, options?: UseChannelOptions): ReactiveValue<Event[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Options for {@link useChannelEffect}. Extends the projection options
|
|
103
|
+
* (`bufferSize`, `replay`) with the per-event callback, an optional
|
|
104
|
+
* error sink, a reactive `target` scope, and a reactive `enabled` gate.
|
|
105
|
+
*/
|
|
106
|
+
interface UseChannelEffectOptions extends ChannelEffectOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Scope events to a subagent / subgraph / explicit namespace.
|
|
109
|
+
* Defaults to the root namespace. Accepts a getter so component
|
|
110
|
+
* `$state` can drive the scope.
|
|
111
|
+
*/
|
|
112
|
+
target?: ValueOrGetter<SelectorTarget>;
|
|
113
|
+
/**
|
|
114
|
+
* Gate the subscription. When `false`, no subscription is opened and
|
|
115
|
+
* no events are delivered. Defaults to `true`. Accepts a getter.
|
|
116
|
+
*/
|
|
117
|
+
enabled?: ValueOrGetter<boolean>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Side-effect counterpart to {@link useChannel}. Instead of returning a
|
|
121
|
+
* reactive buffer, it invokes `onEvent` once per event for as long as
|
|
122
|
+
* the calling scope is alive — the idiomatic place for analytics,
|
|
123
|
+
* logging, and other fire-and-forget side effects.
|
|
124
|
+
*
|
|
125
|
+
* ```svelte
|
|
126
|
+
* <script lang="ts">
|
|
127
|
+
* useChannelEffect(stream, ["lifecycle", "tools"], {
|
|
128
|
+
* replay: false,
|
|
129
|
+
* onEvent(event) {
|
|
130
|
+
* sendAnalytics(event);
|
|
131
|
+
* },
|
|
132
|
+
* onError(error) {
|
|
133
|
+
* logger.error(error);
|
|
134
|
+
* },
|
|
135
|
+
* });
|
|
136
|
+
* </script>
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* Reactive `channels` / `target` / `enabled` getters re-bind the
|
|
140
|
+
* subscription when they change. The underlying subscription is shared
|
|
141
|
+
* (ref-counted) with any matching {@link useChannel} consumer. `replay`
|
|
142
|
+
* defaults to `false` (live-only); events buffered before the effect
|
|
143
|
+
* attaches are not re-delivered.
|
|
144
|
+
*
|
|
145
|
+
* Must be called from a reactive context (a `.svelte` component script
|
|
146
|
+
* or inside `$effect.root`).
|
|
147
|
+
*/
|
|
148
|
+
declare function useChannelEffect(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, options: UseChannelEffectOptions): void;
|
|
101
149
|
/**
|
|
102
150
|
* Subscribe to a scoped audio-media stream. Each handle is yielded
|
|
103
151
|
* on its first matching `content-block-start`, exposes
|
|
@@ -153,5 +201,5 @@ interface UseSubmissionQueueReturn<StateType extends object = Record<string, unk
|
|
|
153
201
|
declare function useSubmissionQueue<StateType extends object>(stream: StreamHandle<StateType>): UseSubmissionQueueReturn<StateType>;
|
|
154
202
|
declare function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;
|
|
155
203
|
//#endregion
|
|
156
|
-
export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
204
|
+
export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseChannelEffectOptions, UseSubmissionQueueReturn, useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
157
205
|
//# sourceMappingURL=selectors.svelte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.svelte.d.ts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"selectors.svelte.d.ts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;AAyCoC;;;KAO/B,YAAA,6BAAyC,eAAA,CAC5C,SAAA;;;;;;AAiBF;;;;;KAAY,cAAA;EAIN,SAAA;AAAA,IACF,yBAAA,GACA,yBAAA;;AA8HJ;;;;;;;;;;;;;;;;;;;AA6BA;;iBA7BgB,WAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,WAAA;;;;;;iBA0BD,YAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,iBAAA;AAAA,iBACD,YAAA,GAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,cAAA,CAAe,CAAA;;;;;;;;;;AAHhC;;;;;iBA0CgB,SAAA,0BAAA,CACd,MAAA,EAAQ,YAAA,CAAa,SAAA,IACpB,aAAA,CAAc,SAAA;AAAA,iBACD,SAAA,GAAA,CACd,MAAA,EAAQ,SAAA,GACP,aAAA,CAAc,cAAA,CAAe,CAAA;AAAA,iBAChB,SAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,EAAQ,aAAA,CAAc,cAAA,GACtB,OAAA;EAAY,WAAA;AAAA,IACX,aAAA,CAAc,CAAA;;;;;;;;;;;;;iBAsCD,YAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,IAAA,EAAM,aAAA,UACN,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,CAAA;;;;;;;;;;;;KAgCL,iBAAA,GAAoB,wBAAA;AAAA,iBAEhB,UAAA,CACd,MAAA,EAAQ,SAAA,EACR,QAAA,EAAU,aAAA,UAAuB,OAAA,KACjC,MAAA,GAAS,aAAA,CAAc,cAAA,GACvB,OAAA,GAAU,iBAAA,GACT,aAAA,CAAc,KAAA;;;;AAxFjB;;UAqHiB,uBAAA,SAAgC,oBAAA;EApHvC;;;;;EA0HR,MAAA,GAAS,aAAA,CAAc,cAAA;EA3HC;;;;EAgIxB,OAAA,GAAU,aAAA;AAAA;;;AA7HZ;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;iBAmHgB,gBAAA,CACd,MAAA,EAAQ,SAAA,EACR,QAAA,EAAU,aAAA,UAAuB,OAAA,KACjC,OAAA,EAAS,uBAAA;;;;;;;;iBAoCK,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,SAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;;;;iBAcD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,SAAA;;;;;;;;;;;;;;;;iBAyBD,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,SAAA,EAAW,aAAA,uBACV,aAAA,CAAc,eAAA;;;;;;;;UA8BA,wBAAA,4BACY,MAAA;EAAA,SAElB,OAAA,EAAS,uBAAA,CAAwB,SAAA;EAAA,SACjC,IAAA;EACT,MAAA,CAAO,EAAA,WAAa,OAAA;EACpB,KAAA,IAAS,OAAA;AAAA;AAAA,iBAGK,kBAAA,0BAAA,CACd,MAAA,EAAQ,YAAA,CAAa,SAAA,IACpB,wBAAA,CAAyB,SAAA;AAAA,iBACZ,kBAAA,CAAmB,MAAA,EAAQ,SAAA,GAAY,wBAAA"}
|
package/dist/selectors.svelte.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { STREAM_CONTROLLER, getRegistry } from "./use-stream.svelte.js";
|
|
2
2
|
import { useProjection } from "./use-projection.svelte.js";
|
|
3
|
-
import { NAMESPACE_SEPARATOR, audioProjection, channelProjection, extensionProjection, filesProjection, imagesProjection, messagesProjection, toolCallsProjection, valuesProjection, videoProjection } from "@langchain/langgraph-sdk/stream";
|
|
3
|
+
import { NAMESPACE_SEPARATOR, acquireChannelEffect, audioProjection, channelProjection, extensionProjection, filesProjection, imagesProjection, messagesProjection, toolCallsProjection, valuesProjection, videoProjection } from "@langchain/langgraph-sdk/stream";
|
|
4
4
|
//#region src/selectors.svelte.ts
|
|
5
5
|
const EMPTY_NAMESPACE = [];
|
|
6
6
|
function resolveNamespace(target) {
|
|
@@ -145,6 +145,52 @@ function useChannel(stream, channels, target, options) {
|
|
|
145
145
|
}, EMPTY_EVENTS);
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
148
|
+
* Side-effect counterpart to {@link useChannel}. Instead of returning a
|
|
149
|
+
* reactive buffer, it invokes `onEvent` once per event for as long as
|
|
150
|
+
* the calling scope is alive — the idiomatic place for analytics,
|
|
151
|
+
* logging, and other fire-and-forget side effects.
|
|
152
|
+
*
|
|
153
|
+
* ```svelte
|
|
154
|
+
* <script lang="ts">
|
|
155
|
+
* useChannelEffect(stream, ["lifecycle", "tools"], {
|
|
156
|
+
* replay: false,
|
|
157
|
+
* onEvent(event) {
|
|
158
|
+
* sendAnalytics(event);
|
|
159
|
+
* },
|
|
160
|
+
* onError(error) {
|
|
161
|
+
* logger.error(error);
|
|
162
|
+
* },
|
|
163
|
+
* });
|
|
164
|
+
* <\/script>
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* Reactive `channels` / `target` / `enabled` getters re-bind the
|
|
168
|
+
* subscription when they change. The underlying subscription is shared
|
|
169
|
+
* (ref-counted) with any matching {@link useChannel} consumer. `replay`
|
|
170
|
+
* defaults to `false` (live-only); events buffered before the effect
|
|
171
|
+
* attaches are not re-delivered.
|
|
172
|
+
*
|
|
173
|
+
* Must be called from a reactive context (a `.svelte` component script
|
|
174
|
+
* or inside `$effect.root`).
|
|
175
|
+
*/
|
|
176
|
+
function useChannelEffect(stream, channels, options) {
|
|
177
|
+
useResolveSubagentNamespace(stream, options.target);
|
|
178
|
+
$effect(() => {
|
|
179
|
+
const enabled = isGetter(options.enabled) ? options.enabled() : options.enabled ?? true;
|
|
180
|
+
const resolvedChannels = isGetter(channels) ? channels() : channels;
|
|
181
|
+
const namespace = resolveNamespace(isGetter(options.target) ? options.target() : options.target);
|
|
182
|
+
if (!enabled) return;
|
|
183
|
+
const registry = getRegistry(stream);
|
|
184
|
+
if (registry == null) return;
|
|
185
|
+
return acquireChannelEffect(registry, resolvedChannels, namespace, {
|
|
186
|
+
replay: options.replay,
|
|
187
|
+
bufferSize: options.bufferSize,
|
|
188
|
+
onEvent: (event) => options.onEvent(event),
|
|
189
|
+
onError: options.onError ? (error) => options.onError?.(error) : void 0
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
148
194
|
* Subscribe to a scoped audio-media stream. Each handle is yielded
|
|
149
195
|
* on its first matching `content-block-start`, exposes
|
|
150
196
|
* `.partialBytes` for live access, settles `.blob` / `.objectURL` /
|
|
@@ -226,6 +272,6 @@ function useSubmissionQueue(stream) {
|
|
|
226
272
|
};
|
|
227
273
|
}
|
|
228
274
|
//#endregion
|
|
229
|
-
export { useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
275
|
+
export { useAudio, useChannel, useChannelEffect, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
|
|
230
276
|
|
|
231
277
|
//# sourceMappingURL=selectors.svelte.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.svelte.js","names":[],"sources":["../src/selectors.svelte.ts"],"sourcesContent":["import type { BaseMessage } from \"@langchain/core/messages\";\nimport {\n NAMESPACE_SEPARATOR,\n audioProjection,\n channelProjection,\n extensionProjection,\n filesProjection,\n imagesProjection,\n messagesProjection,\n toolCallsProjection,\n valuesProjection,\n videoProjection,\n type AssembledToolCall,\n type AudioMedia,\n type Channel,\n type ChannelProjectionOptions,\n type Event,\n type FileMedia,\n type ImageMedia,\n type InferToolCalls,\n type InferStateType,\n type MessageMetadata,\n type MessageMetadataMap,\n type SubagentDiscoverySnapshot,\n type SubgraphDiscoverySnapshot,\n type SubmissionQueueEntry,\n type SubmissionQueueSnapshot,\n type VideoMedia,\n} from \"@langchain/langgraph-sdk/stream\";\nimport {\n getRegistry,\n STREAM_CONTROLLER,\n type AnyStream,\n type UseStreamReturn,\n} from \"./use-stream.svelte.js\";\nimport {\n useProjection,\n type ReactiveValue,\n type ValueOrGetter,\n} from \"./use-projection.svelte.js\";\n\n/**\n * Parameterise selectors on `StateType` alone so callers with a full\n * `useStream<S, I, C>()` handle don't have to redeclare\n * `InterruptType` / `ConfigurableType` at every call site.\n */\ntype StreamHandle<StateType extends object> = UseStreamReturn<\n StateType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\n/**\n * What a selector composable targets. Callers can pass:\n * - `undefined` / `null` — root namespace (served by the always-on\n * root store; no extra subscription opens);\n * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);\n * - a {@link SubgraphDiscoverySnapshot}\n * (`stream.subgraphs.get(...)`);\n * - an explicit `{ namespace: string[] }`;\n * - a raw `string[]` escape hatch.\n */\nexport type SelectorTarget =\n | undefined\n | null\n | readonly string[]\n | { namespace: readonly string[] }\n | SubagentDiscoverySnapshot\n | SubgraphDiscoverySnapshot;\n\nconst EMPTY_NAMESPACE: readonly string[] = [];\n\nfunction resolveNamespace(target: SelectorTarget): readonly string[] {\n if (target == null) return EMPTY_NAMESPACE;\n if (Array.isArray(target)) return target as readonly string[];\n const obj = target as { namespace?: readonly string[] };\n return obj.namespace ?? EMPTY_NAMESPACE;\n}\n\nfunction isRoot(namespace: readonly string[]): boolean {\n return namespace.length === 0;\n}\n\nfunction namespaceKey(namespace: readonly string[]): string {\n return namespace.join(NAMESPACE_SEPARATOR);\n}\n\nfunction isGetter<T>(input: ValueOrGetter<T> | undefined): input is () => T {\n return typeof input === \"function\";\n}\n\n/**\n * If `target` is a subagent snapshot still on its default\n * `tools:<toolCallId>` namespace, return that tool-call id. See the\n * React selectors for the rationale (deep-agent subagents execute under\n * a distinct `tools:<uuid>` namespace resolved lazily from history).\n */\nfunction subagentNeedingNamespace(target: SelectorTarget): string | null {\n if (target == null || Array.isArray(target)) return null;\n const obj = target as { id?: unknown; namespace?: readonly string[] };\n if (typeof obj.id !== \"string\" || !Array.isArray(obj.namespace)) return null;\n if (obj.namespace.length === 1 && obj.namespace[0] === `tools:${obj.id}`) {\n return obj.id;\n }\n return null;\n}\n\n/**\n * Lazily resolve a subagent's execution namespace on first scoped use.\n * Re-evaluates when a reactive `target` changes; the controller\n * de-dupes and skips already-promoted ids.\n */\nfunction useResolveSubagentNamespace(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined\n): void {\n const controller = stream[STREAM_CONTROLLER];\n $effect(() => {\n const resolved = isGetter(target) ? target() : target;\n const id = subagentNeedingNamespace(resolved);\n if (id != null) void controller.resolveSubagentNamespace(id);\n });\n}\n\n/**\n * Internal helper that wires a reactive-or-static target into\n * {@link useProjection}. Encapsulates the bookkeeping every selector\n * otherwise repeats.\n */\nfunction selectFromTarget<T>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined,\n initialValue: T,\n makeSpec: (\n namespace: readonly string[]\n ) => import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<T>,\n keyPrefix: string\n): ReactiveValue<T> {\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T>(\n () => {\n const ns = resolveNamespace(getTarget());\n return isRoot(ns) ? null : getRegistry(stream);\n },\n () => makeSpec(resolveNamespace(getTarget())),\n () => `${keyPrefix}|${namespaceKey(resolveNamespace(getTarget()))}`,\n initialValue\n );\n }\n const ns = resolveNamespace(target);\n // Static root: we deliberately don't short-circuit here because\n // each selector owns the root fallback shape (`stream.messages`\n // vs `stream.values` vs `stream.toolCalls`). Callers use the\n // dedicated wrappers below.\n const key = `${keyPrefix}|${namespaceKey(ns)}`;\n return useProjection<T>(\n isRoot(ns) ? null : getRegistry(stream),\n () => makeSpec(ns),\n key,\n initialValue\n );\n}\n\nconst EMPTY_MESSAGES: BaseMessage[] = [];\nconst EMPTY_TOOLCALLS: AssembledToolCall[] = [];\nconst EMPTY_EVENTS: Event[] = [];\nconst EMPTY_AUDIO: AudioMedia[] = [];\nconst EMPTY_IMAGES: ImageMedia[] = [];\nconst EMPTY_VIDEO: VideoMedia[] = [];\nconst EMPTY_FILES: FileMedia[] = [];\n\n/**\n * Subscribe to a scoped `messages` stream.\n *\n * Contract:\n * - At the root (no `target`, or a static target that resolves to\n * the root namespace) returns a handle whose `.current` delegates\n * to `stream.messages` — the always-on root projection. No extra\n * subscription is opened.\n * - For any non-root namespace, mount triggers a ref-counted\n * `messages` subscription scoped to that namespace. The\n * subscription is released automatically when the owning\n * component teardown fires (and the registry closes the\n * underlying server subscription when the last consumer leaves).\n * - A reactive `target` (getter form) re-binds the subscription on\n * change. A getter that flips between root and scoped is\n * supported: the root case short-circuits to the initial value\n * because dynamic root delegation isn't meaningful — pass a\n * static undefined/null target for root handles.\n *\n * Messages are always `BaseMessage` class instances from\n * `@langchain/core/messages`.\n */\nexport function useMessages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<BaseMessage[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.messages;\n },\n };\n }\n }\n return selectFromTarget<BaseMessage[]>(\n stream,\n target,\n EMPTY_MESSAGES,\n (ns) => messagesProjection(ns),\n \"messages\"\n );\n}\n\n/**\n * Subscribe to a scoped `tools` (tool-call) stream. Same target and\n * lifecycle rules as {@link useMessages}; at the root this returns a\n * handle delegating to `stream.toolCalls`.\n */\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]>;\nexport function useToolCalls<T>(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<InferToolCalls<T>[]>;\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.toolCalls;\n },\n };\n }\n }\n return selectFromTarget<AssembledToolCall[]>(\n stream,\n target,\n EMPTY_TOOLCALLS,\n (ns) => toolCallsProjection(ns),\n \"toolCalls\"\n );\n}\n\n/**\n * Subscribe to a scoped `values` stream — the most recent state\n * payload for a namespace. At the root returns a handle delegating\n * to `stream.values`.\n *\n * Typing:\n * - **Root** (`useValues(stream)`): returns the `StateType` declared\n * on `useStream<State>()` — non-nullable (the root snapshot\n * always has values, falling back to `initialValues ?? {}`).\n * - **Scoped** (`useValues(stream, target)`): scoped payloads can\n * differ from the root state; callers should annotate the\n * expected shape explicitly (`useValues<SubagentState>(stream,\n * sub)`). Defaults to `unknown` when not annotated.\n */\nexport function useValues<StateType extends object>(\n stream: StreamHandle<StateType>\n): ReactiveValue<StateType>;\nexport function useValues<T>(\n stream: AnyStream\n): ReactiveValue<InferStateType<T>>;\nexport function useValues<T = unknown>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<T | undefined>;\nexport function useValues(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<unknown> {\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.values;\n },\n };\n }\n }\n const messagesKey = options?.messagesKey ?? \"messages\";\n return selectFromTarget<unknown>(\n stream,\n target,\n undefined,\n (ns) => valuesProjection<unknown>(ns, messagesKey),\n `values|${messagesKey}`\n );\n}\n\n/**\n * Subscribe to a `custom:<name>` stream extension — the most-recent\n * payload emitted by the transformer, scoped to the target namespace.\n *\n * Returns only the latest value and resumes across serial runs, so it is\n * ideal for \"current state\" panels (progress, score, status). When you\n * need the full history of events rather than just the latest payload,\n * use {@link useChannel} instead.\n *\n * `name` accepts either a plain string or a getter so component\n * state can drive the extension name at runtime.\n */\nexport function useExtension<T = unknown>(\n stream: AnyStream,\n name: ValueOrGetter<string>,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<T | undefined> {\n const getName = () => (isGetter(name) ? (name as () => string)() : name);\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T | undefined>(\n () => getRegistry(stream),\n () => extensionProjection<T>(getName(), resolveNamespace(getTarget())),\n () =>\n `extension|${getName()}|${namespaceKey(resolveNamespace(getTarget()))}`,\n undefined\n );\n }\n const ns = resolveNamespace(target);\n return useProjection<T | undefined>(\n getRegistry(stream),\n () => extensionProjection<T>(getName(), ns),\n () => `extension|${getName()}|${namespaceKey(ns)}`,\n undefined\n );\n}\n\n/**\n * Raw-events escape hatch. Subscribes to one or more channels at a\n * namespace and returns a bounded buffer of raw protocol events.\n *\n * The buffer keeps accumulating across serial runs for the lifetime of\n * the thread, so this is the hook to use for an event log / stream of a\n * custom channel (e.g. `[\"custom:redaction-stats\"]`). When you only need\n * the latest payload of a single `custom:<name>` channel, prefer\n * {@link useExtension}. For the common message/tool/value cases prefer\n * {@link useMessages} / {@link useToolCalls} / {@link useValues}.\n */\nexport type UseChannelOptions = ChannelProjectionOptions;\n\nexport function useChannel(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n target?: ValueOrGetter<SelectorTarget>,\n options?: UseChannelOptions\n): ReactiveValue<Event[]> {\n const getChannels = () =>\n isGetter(channels) ? (channels as () => readonly Channel[])() : channels;\n const getTarget = () => (isGetter(target) ? target() : target);\n const bufferSize = options?.bufferSize ?? \"default\";\n const replayMode = (options?.replay ?? true) ? \"replay\" : \"live\";\n return useProjection<Event[]>(\n () => getRegistry(stream),\n () =>\n channelProjection(\n getChannels(),\n resolveNamespace(getTarget()),\n options\n ) as unknown as import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<\n Event[]\n >,\n () => {\n const sortedChannels = [...getChannels()].sort().join(\",\");\n return `channel|${bufferSize}|${replayMode}|${sortedChannels}|${namespaceKey(resolveNamespace(getTarget()))}`;\n },\n EMPTY_EVENTS\n );\n}\n\n/**\n * Subscribe to a scoped audio-media stream. Each handle is yielded\n * on its first matching `content-block-start`, exposes\n * `.partialBytes` for live access, settles `.blob` / `.objectURL` /\n * `.transcript` on `message-finish`, and surfaces errors via\n * `.error`.\n */\nexport function useAudio(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AudioMedia[]> {\n return selectFromTarget<AudioMedia[]>(\n stream,\n target,\n EMPTY_AUDIO,\n (ns) => audioProjection(ns),\n \"audio\"\n );\n}\n\n/**\n * Subscribe to a scoped image-media stream. Pair with `useMediaURL`\n * for `<img src>`.\n */\nexport function useImages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<ImageMedia[]> {\n return selectFromTarget<ImageMedia[]>(\n stream,\n target,\n EMPTY_IMAGES,\n (ns) => imagesProjection(ns),\n \"images\"\n );\n}\n\n/**\n * Subscribe to a scoped video-media stream. Pair with `useMediaURL`\n * for `<video src>`.\n */\nexport function useVideo(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<VideoMedia[]> {\n return selectFromTarget<VideoMedia[]>(\n stream,\n target,\n EMPTY_VIDEO,\n (ns) => videoProjection(ns),\n \"video\"\n );\n}\n\n/**\n * Subscribe to a scoped file-media stream. Pair with `useMediaURL`\n * for an `<a download href>` target.\n */\nexport function useFiles(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<FileMedia[]> {\n return selectFromTarget<FileMedia[]>(\n stream,\n target,\n EMPTY_FILES,\n (ns) => filesProjection(ns),\n \"files\"\n );\n}\n\n/**\n * Read metadata recorded for a specific message id — today exposes\n * `parentCheckpointId`, the checkpoint the message was first seen\n * on. Designed for fork / edit flows:\n *\n * ```svelte\n * <script lang=\"ts\">\n * const meta = useMessageMetadata(stream, () => selected?.id);\n * </script>\n * Parent: {meta.current?.parentCheckpointId ?? \"root\"}\n * ```\n *\n * `messageId` accepts a plain string or a getter — the binding\n * re-evaluates whenever the id changes.\n */\nexport function useMessageMetadata(\n stream: AnyStream,\n messageId: ValueOrGetter<string | undefined>\n): ReactiveValue<MessageMetadata | undefined> {\n const store = stream[STREAM_CONTROLLER].messageMetadataStore;\n let map = $state<MessageMetadataMap>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n map = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n const getId = () =>\n isGetter(messageId) ? (messageId as () => string | undefined)() : messageId;\n\n return {\n get current(): MessageMetadata | undefined {\n const key = getId();\n if (key == null) return undefined;\n return map.get(key);\n },\n };\n}\n\n/**\n * Reactive handle on the server-side submission queue.\n *\n * Populated when `submit()` is invoked with\n * `multitaskStrategy: \"enqueue\"` while another run is in flight. The\n * returned getters are stable — safe to pass into `{#each}`.\n */\nexport interface UseSubmissionQueueReturn<\n StateType extends object = Record<string, unknown>,\n> {\n readonly entries: SubmissionQueueSnapshot<StateType>;\n readonly size: number;\n cancel(id: string): Promise<boolean>;\n clear(): Promise<void>;\n}\n\nexport function useSubmissionQueue<StateType extends object>(\n stream: StreamHandle<StateType>\n): UseSubmissionQueueReturn<StateType>;\nexport function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;\nexport function useSubmissionQueue(\n stream: AnyStream\n): UseSubmissionQueueReturn {\n const controller = stream[STREAM_CONTROLLER];\n const store = controller.queueStore;\n let entries = $state<SubmissionQueueSnapshot>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n entries = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n return {\n get entries() {\n return entries;\n },\n get size() {\n return entries.length;\n },\n cancel: (id) => controller.cancelQueued(id),\n clear: () => controller.clearQueue(),\n };\n}\n\nexport type { SubmissionQueueEntry, SubmissionQueueSnapshot };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selectors.svelte.js","names":[],"sources":["../src/selectors.svelte.ts"],"sourcesContent":["import type { BaseMessage } from \"@langchain/core/messages\";\nimport {\n NAMESPACE_SEPARATOR,\n acquireChannelEffect,\n audioProjection,\n channelProjection,\n extensionProjection,\n filesProjection,\n imagesProjection,\n messagesProjection,\n toolCallsProjection,\n valuesProjection,\n videoProjection,\n type AssembledToolCall,\n type AudioMedia,\n type Channel,\n type ChannelEffectOptions,\n type ChannelProjectionOptions,\n type Event,\n type FileMedia,\n type ImageMedia,\n type InferToolCalls,\n type InferStateType,\n type MessageMetadata,\n type MessageMetadataMap,\n type SubagentDiscoverySnapshot,\n type SubgraphDiscoverySnapshot,\n type SubmissionQueueEntry,\n type SubmissionQueueSnapshot,\n type VideoMedia,\n} from \"@langchain/langgraph-sdk/stream\";\nimport {\n getRegistry,\n STREAM_CONTROLLER,\n type AnyStream,\n type UseStreamReturn,\n} from \"./use-stream.svelte.js\";\nimport {\n useProjection,\n type ReactiveValue,\n type ValueOrGetter,\n} from \"./use-projection.svelte.js\";\n\n/**\n * Parameterise selectors on `StateType` alone so callers with a full\n * `useStream<S, I, C>()` handle don't have to redeclare\n * `InterruptType` / `ConfigurableType` at every call site.\n */\ntype StreamHandle<StateType extends object> = UseStreamReturn<\n StateType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\n/**\n * What a selector composable targets. Callers can pass:\n * - `undefined` / `null` — root namespace (served by the always-on\n * root store; no extra subscription opens);\n * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);\n * - a {@link SubgraphDiscoverySnapshot}\n * (`stream.subgraphs.get(...)`);\n * - an explicit `{ namespace: string[] }`;\n * - a raw `string[]` escape hatch.\n */\nexport type SelectorTarget =\n | undefined\n | null\n | readonly string[]\n | { namespace: readonly string[] }\n | SubagentDiscoverySnapshot\n | SubgraphDiscoverySnapshot;\n\nconst EMPTY_NAMESPACE: readonly string[] = [];\n\nfunction resolveNamespace(target: SelectorTarget): readonly string[] {\n if (target == null) return EMPTY_NAMESPACE;\n if (Array.isArray(target)) return target as readonly string[];\n const obj = target as { namespace?: readonly string[] };\n return obj.namespace ?? EMPTY_NAMESPACE;\n}\n\nfunction isRoot(namespace: readonly string[]): boolean {\n return namespace.length === 0;\n}\n\nfunction namespaceKey(namespace: readonly string[]): string {\n return namespace.join(NAMESPACE_SEPARATOR);\n}\n\nfunction isGetter<T>(input: ValueOrGetter<T> | undefined): input is () => T {\n return typeof input === \"function\";\n}\n\n/**\n * If `target` is a subagent snapshot still on its default\n * `tools:<toolCallId>` namespace, return that tool-call id. See the\n * React selectors for the rationale (deep-agent subagents execute under\n * a distinct `tools:<uuid>` namespace resolved lazily from history).\n */\nfunction subagentNeedingNamespace(target: SelectorTarget): string | null {\n if (target == null || Array.isArray(target)) return null;\n const obj = target as { id?: unknown; namespace?: readonly string[] };\n if (typeof obj.id !== \"string\" || !Array.isArray(obj.namespace)) return null;\n if (obj.namespace.length === 1 && obj.namespace[0] === `tools:${obj.id}`) {\n return obj.id;\n }\n return null;\n}\n\n/**\n * Lazily resolve a subagent's execution namespace on first scoped use.\n * Re-evaluates when a reactive `target` changes; the controller\n * de-dupes and skips already-promoted ids.\n */\nfunction useResolveSubagentNamespace(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined\n): void {\n const controller = stream[STREAM_CONTROLLER];\n $effect(() => {\n const resolved = isGetter(target) ? target() : target;\n const id = subagentNeedingNamespace(resolved);\n if (id != null) void controller.resolveSubagentNamespace(id);\n });\n}\n\n/**\n * Internal helper that wires a reactive-or-static target into\n * {@link useProjection}. Encapsulates the bookkeeping every selector\n * otherwise repeats.\n */\nfunction selectFromTarget<T>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget> | undefined,\n initialValue: T,\n makeSpec: (\n namespace: readonly string[]\n ) => import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<T>,\n keyPrefix: string\n): ReactiveValue<T> {\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T>(\n () => {\n const ns = resolveNamespace(getTarget());\n return isRoot(ns) ? null : getRegistry(stream);\n },\n () => makeSpec(resolveNamespace(getTarget())),\n () => `${keyPrefix}|${namespaceKey(resolveNamespace(getTarget()))}`,\n initialValue\n );\n }\n const ns = resolveNamespace(target);\n // Static root: we deliberately don't short-circuit here because\n // each selector owns the root fallback shape (`stream.messages`\n // vs `stream.values` vs `stream.toolCalls`). Callers use the\n // dedicated wrappers below.\n const key = `${keyPrefix}|${namespaceKey(ns)}`;\n return useProjection<T>(\n isRoot(ns) ? null : getRegistry(stream),\n () => makeSpec(ns),\n key,\n initialValue\n );\n}\n\nconst EMPTY_MESSAGES: BaseMessage[] = [];\nconst EMPTY_TOOLCALLS: AssembledToolCall[] = [];\nconst EMPTY_EVENTS: Event[] = [];\nconst EMPTY_AUDIO: AudioMedia[] = [];\nconst EMPTY_IMAGES: ImageMedia[] = [];\nconst EMPTY_VIDEO: VideoMedia[] = [];\nconst EMPTY_FILES: FileMedia[] = [];\n\n/**\n * Subscribe to a scoped `messages` stream.\n *\n * Contract:\n * - At the root (no `target`, or a static target that resolves to\n * the root namespace) returns a handle whose `.current` delegates\n * to `stream.messages` — the always-on root projection. No extra\n * subscription is opened.\n * - For any non-root namespace, mount triggers a ref-counted\n * `messages` subscription scoped to that namespace. The\n * subscription is released automatically when the owning\n * component teardown fires (and the registry closes the\n * underlying server subscription when the last consumer leaves).\n * - A reactive `target` (getter form) re-binds the subscription on\n * change. A getter that flips between root and scoped is\n * supported: the root case short-circuits to the initial value\n * because dynamic root delegation isn't meaningful — pass a\n * static undefined/null target for root handles.\n *\n * Messages are always `BaseMessage` class instances from\n * `@langchain/core/messages`.\n */\nexport function useMessages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<BaseMessage[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.messages;\n },\n };\n }\n }\n return selectFromTarget<BaseMessage[]>(\n stream,\n target,\n EMPTY_MESSAGES,\n (ns) => messagesProjection(ns),\n \"messages\"\n );\n}\n\n/**\n * Subscribe to a scoped `tools` (tool-call) stream. Same target and\n * lifecycle rules as {@link useMessages}; at the root this returns a\n * handle delegating to `stream.toolCalls`.\n */\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]>;\nexport function useToolCalls<T>(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<InferToolCalls<T>[]>;\nexport function useToolCalls(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AssembledToolCall[]> {\n useResolveSubagentNamespace(stream, target);\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.toolCalls;\n },\n };\n }\n }\n return selectFromTarget<AssembledToolCall[]>(\n stream,\n target,\n EMPTY_TOOLCALLS,\n (ns) => toolCallsProjection(ns),\n \"toolCalls\"\n );\n}\n\n/**\n * Subscribe to a scoped `values` stream — the most recent state\n * payload for a namespace. At the root returns a handle delegating\n * to `stream.values`.\n *\n * Typing:\n * - **Root** (`useValues(stream)`): returns the `StateType` declared\n * on `useStream<State>()` — non-nullable (the root snapshot\n * always has values, falling back to `initialValues ?? {}`).\n * - **Scoped** (`useValues(stream, target)`): scoped payloads can\n * differ from the root state; callers should annotate the\n * expected shape explicitly (`useValues<SubagentState>(stream,\n * sub)`). Defaults to `unknown` when not annotated.\n */\nexport function useValues<StateType extends object>(\n stream: StreamHandle<StateType>\n): ReactiveValue<StateType>;\nexport function useValues<T>(\n stream: AnyStream\n): ReactiveValue<InferStateType<T>>;\nexport function useValues<T = unknown>(\n stream: AnyStream,\n target: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<T | undefined>;\nexport function useValues(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>,\n options?: { messagesKey?: string }\n): ReactiveValue<unknown> {\n if (!isGetter(target)) {\n const ns = resolveNamespace(target);\n if (isRoot(ns)) {\n return {\n get current() {\n return stream.values;\n },\n };\n }\n }\n const messagesKey = options?.messagesKey ?? \"messages\";\n return selectFromTarget<unknown>(\n stream,\n target,\n undefined,\n (ns) => valuesProjection<unknown>(ns, messagesKey),\n `values|${messagesKey}`\n );\n}\n\n/**\n * Subscribe to a `custom:<name>` stream extension — the most-recent\n * payload emitted by the transformer, scoped to the target namespace.\n *\n * Returns only the latest value and resumes across serial runs, so it is\n * ideal for \"current state\" panels (progress, score, status). When you\n * need the full history of events rather than just the latest payload,\n * use {@link useChannel} instead.\n *\n * `name` accepts either a plain string or a getter so component\n * state can drive the extension name at runtime.\n */\nexport function useExtension<T = unknown>(\n stream: AnyStream,\n name: ValueOrGetter<string>,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<T | undefined> {\n const getName = () => (isGetter(name) ? (name as () => string)() : name);\n if (isGetter(target)) {\n const getTarget = target;\n return useProjection<T | undefined>(\n () => getRegistry(stream),\n () => extensionProjection<T>(getName(), resolveNamespace(getTarget())),\n () =>\n `extension|${getName()}|${namespaceKey(resolveNamespace(getTarget()))}`,\n undefined\n );\n }\n const ns = resolveNamespace(target);\n return useProjection<T | undefined>(\n getRegistry(stream),\n () => extensionProjection<T>(getName(), ns),\n () => `extension|${getName()}|${namespaceKey(ns)}`,\n undefined\n );\n}\n\n/**\n * Raw-events escape hatch. Subscribes to one or more channels at a\n * namespace and returns a bounded buffer of raw protocol events.\n *\n * The buffer keeps accumulating across serial runs for the lifetime of\n * the thread, so this is the hook to use for an event log / stream of a\n * custom channel (e.g. `[\"custom:redaction-stats\"]`). When you only need\n * the latest payload of a single `custom:<name>` channel, prefer\n * {@link useExtension}. For the common message/tool/value cases prefer\n * {@link useMessages} / {@link useToolCalls} / {@link useValues}.\n */\nexport type UseChannelOptions = ChannelProjectionOptions;\n\nexport function useChannel(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n target?: ValueOrGetter<SelectorTarget>,\n options?: UseChannelOptions\n): ReactiveValue<Event[]> {\n const getChannels = () =>\n isGetter(channels) ? (channels as () => readonly Channel[])() : channels;\n const getTarget = () => (isGetter(target) ? target() : target);\n const bufferSize = options?.bufferSize ?? \"default\";\n const replayMode = (options?.replay ?? true) ? \"replay\" : \"live\";\n return useProjection<Event[]>(\n () => getRegistry(stream),\n () =>\n channelProjection(\n getChannels(),\n resolveNamespace(getTarget()),\n options\n ) as unknown as import(\"@langchain/langgraph-sdk/stream\").ProjectionSpec<\n Event[]\n >,\n () => {\n const sortedChannels = [...getChannels()].sort().join(\",\");\n return `channel|${bufferSize}|${replayMode}|${sortedChannels}|${namespaceKey(resolveNamespace(getTarget()))}`;\n },\n EMPTY_EVENTS\n );\n}\n\n/**\n * Options for {@link useChannelEffect}. Extends the projection options\n * (`bufferSize`, `replay`) with the per-event callback, an optional\n * error sink, a reactive `target` scope, and a reactive `enabled` gate.\n */\nexport interface UseChannelEffectOptions extends ChannelEffectOptions {\n /**\n * Scope events to a subagent / subgraph / explicit namespace.\n * Defaults to the root namespace. Accepts a getter so component\n * `$state` can drive the scope.\n */\n target?: ValueOrGetter<SelectorTarget>;\n /**\n * Gate the subscription. When `false`, no subscription is opened and\n * no events are delivered. Defaults to `true`. Accepts a getter.\n */\n enabled?: ValueOrGetter<boolean>;\n}\n\n/**\n * Side-effect counterpart to {@link useChannel}. Instead of returning a\n * reactive buffer, it invokes `onEvent` once per event for as long as\n * the calling scope is alive — the idiomatic place for analytics,\n * logging, and other fire-and-forget side effects.\n *\n * ```svelte\n * <script lang=\"ts\">\n * useChannelEffect(stream, [\"lifecycle\", \"tools\"], {\n * replay: false,\n * onEvent(event) {\n * sendAnalytics(event);\n * },\n * onError(error) {\n * logger.error(error);\n * },\n * });\n * </script>\n * ```\n *\n * Reactive `channels` / `target` / `enabled` getters re-bind the\n * subscription when they change. The underlying subscription is shared\n * (ref-counted) with any matching {@link useChannel} consumer. `replay`\n * defaults to `false` (live-only); events buffered before the effect\n * attaches are not re-delivered.\n *\n * Must be called from a reactive context (a `.svelte` component script\n * or inside `$effect.root`).\n */\nexport function useChannelEffect(\n stream: AnyStream,\n channels: ValueOrGetter<readonly Channel[]>,\n options: UseChannelEffectOptions\n): void {\n useResolveSubagentNamespace(stream, options.target);\n\n $effect(() => {\n const enabled = isGetter(options.enabled)\n ? options.enabled()\n : (options.enabled ?? true);\n const resolvedChannels = isGetter(channels) ? channels() : channels;\n const target = isGetter(options.target) ? options.target() : options.target;\n const namespace = resolveNamespace(target);\n\n if (!enabled) return;\n const registry = getRegistry(stream);\n if (registry == null) return;\n\n // `onEvent` / `onError` are read lazily inside the wrappers so the\n // effect doesn't re-acquire when a caller passes a fresh closure.\n return acquireChannelEffect(registry, resolvedChannels, namespace, {\n replay: options.replay,\n bufferSize: options.bufferSize,\n onEvent: (event) => options.onEvent(event),\n onError: options.onError\n ? (error) => options.onError?.(error)\n : undefined,\n });\n });\n}\n\n/**\n * Subscribe to a scoped audio-media stream. Each handle is yielded\n * on its first matching `content-block-start`, exposes\n * `.partialBytes` for live access, settles `.blob` / `.objectURL` /\n * `.transcript` on `message-finish`, and surfaces errors via\n * `.error`.\n */\nexport function useAudio(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<AudioMedia[]> {\n return selectFromTarget<AudioMedia[]>(\n stream,\n target,\n EMPTY_AUDIO,\n (ns) => audioProjection(ns),\n \"audio\"\n );\n}\n\n/**\n * Subscribe to a scoped image-media stream. Pair with `useMediaURL`\n * for `<img src>`.\n */\nexport function useImages(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<ImageMedia[]> {\n return selectFromTarget<ImageMedia[]>(\n stream,\n target,\n EMPTY_IMAGES,\n (ns) => imagesProjection(ns),\n \"images\"\n );\n}\n\n/**\n * Subscribe to a scoped video-media stream. Pair with `useMediaURL`\n * for `<video src>`.\n */\nexport function useVideo(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<VideoMedia[]> {\n return selectFromTarget<VideoMedia[]>(\n stream,\n target,\n EMPTY_VIDEO,\n (ns) => videoProjection(ns),\n \"video\"\n );\n}\n\n/**\n * Subscribe to a scoped file-media stream. Pair with `useMediaURL`\n * for an `<a download href>` target.\n */\nexport function useFiles(\n stream: AnyStream,\n target?: ValueOrGetter<SelectorTarget>\n): ReactiveValue<FileMedia[]> {\n return selectFromTarget<FileMedia[]>(\n stream,\n target,\n EMPTY_FILES,\n (ns) => filesProjection(ns),\n \"files\"\n );\n}\n\n/**\n * Read metadata recorded for a specific message id — today exposes\n * `parentCheckpointId`, the checkpoint the message was first seen\n * on. Designed for fork / edit flows:\n *\n * ```svelte\n * <script lang=\"ts\">\n * const meta = useMessageMetadata(stream, () => selected?.id);\n * </script>\n * Parent: {meta.current?.parentCheckpointId ?? \"root\"}\n * ```\n *\n * `messageId` accepts a plain string or a getter — the binding\n * re-evaluates whenever the id changes.\n */\nexport function useMessageMetadata(\n stream: AnyStream,\n messageId: ValueOrGetter<string | undefined>\n): ReactiveValue<MessageMetadata | undefined> {\n const store = stream[STREAM_CONTROLLER].messageMetadataStore;\n let map = $state<MessageMetadataMap>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n map = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n const getId = () =>\n isGetter(messageId) ? (messageId as () => string | undefined)() : messageId;\n\n return {\n get current(): MessageMetadata | undefined {\n const key = getId();\n if (key == null) return undefined;\n return map.get(key);\n },\n };\n}\n\n/**\n * Reactive handle on the server-side submission queue.\n *\n * Populated when `submit()` is invoked with\n * `multitaskStrategy: \"enqueue\"` while another run is in flight. The\n * returned getters are stable — safe to pass into `{#each}`.\n */\nexport interface UseSubmissionQueueReturn<\n StateType extends object = Record<string, unknown>,\n> {\n readonly entries: SubmissionQueueSnapshot<StateType>;\n readonly size: number;\n cancel(id: string): Promise<boolean>;\n clear(): Promise<void>;\n}\n\nexport function useSubmissionQueue<StateType extends object>(\n stream: StreamHandle<StateType>\n): UseSubmissionQueueReturn<StateType>;\nexport function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;\nexport function useSubmissionQueue(\n stream: AnyStream\n): UseSubmissionQueueReturn {\n const controller = stream[STREAM_CONTROLLER];\n const store = controller.queueStore;\n let entries = $state<SubmissionQueueSnapshot>(store.getSnapshot());\n\n $effect(() => {\n const unsubscribe = store.subscribe(() => {\n entries = store.getSnapshot();\n });\n return unsubscribe;\n });\n\n return {\n get entries() {\n return entries;\n },\n get size() {\n return entries.length;\n },\n cancel: (id) => controller.cancelQueued(id),\n clear: () => controller.clearQueue(),\n };\n}\n\nexport type { SubmissionQueueEntry, SubmissionQueueSnapshot };\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/svelte",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.22",
|
|
4
4
|
"description": "Svelte integration for LangGraph & LangChain",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"directory": "libs/sdk-svelte"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@langchain/langgraph-sdk": "1.9.
|
|
13
|
+
"@langchain/langgraph-sdk": "1.9.21"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@hono/node-server": "^1.19.13",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"vitest-browser-svelte": "^2.1.1",
|
|
30
30
|
"webdriverio": "^9.25.0",
|
|
31
31
|
"zod": "^4.3.6",
|
|
32
|
-
"@langchain/langgraph": "^1.4.
|
|
32
|
+
"@langchain/langgraph": "^1.4.1",
|
|
33
33
|
"@langchain/langgraph-api": "^1.3.0",
|
|
34
34
|
"@langchain/langgraph-checkpoint": "^1.1.0"
|
|
35
35
|
},
|