@langchain/svelte 0.4.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +37 -443
  2. package/dist/context.cjs +72 -0
  3. package/dist/context.cjs.map +1 -0
  4. package/dist/context.d.cts +72 -0
  5. package/dist/context.d.cts.map +1 -0
  6. package/dist/context.d.ts +72 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +70 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/index.cjs +32 -316
  11. package/dist/index.d.cts +11 -97
  12. package/dist/index.d.ts +11 -97
  13. package/dist/index.js +10 -290
  14. package/dist/selectors.svelte.cjs +214 -0
  15. package/dist/selectors.svelte.cjs.map +1 -0
  16. package/dist/selectors.svelte.d.cts +146 -0
  17. package/dist/selectors.svelte.d.cts.map +1 -0
  18. package/dist/selectors.svelte.d.ts +146 -0
  19. package/dist/selectors.svelte.d.ts.map +1 -0
  20. package/dist/selectors.svelte.js +204 -0
  21. package/dist/selectors.svelte.js.map +1 -0
  22. package/dist/use-audio-player.svelte.cjs +608 -0
  23. package/dist/use-audio-player.svelte.cjs.map +1 -0
  24. package/dist/use-audio-player.svelte.d.cts +70 -0
  25. package/dist/use-audio-player.svelte.d.cts.map +1 -0
  26. package/dist/use-audio-player.svelte.d.ts +70 -0
  27. package/dist/use-audio-player.svelte.d.ts.map +1 -0
  28. package/dist/use-audio-player.svelte.js +608 -0
  29. package/dist/use-audio-player.svelte.js.map +1 -0
  30. package/dist/use-media-url.svelte.cjs +54 -0
  31. package/dist/use-media-url.svelte.cjs.map +1 -0
  32. package/dist/use-media-url.svelte.d.cts +29 -0
  33. package/dist/use-media-url.svelte.d.cts.map +1 -0
  34. package/dist/use-media-url.svelte.d.ts +29 -0
  35. package/dist/use-media-url.svelte.d.ts.map +1 -0
  36. package/dist/use-media-url.svelte.js +54 -0
  37. package/dist/use-media-url.svelte.js.map +1 -0
  38. package/dist/use-projection.svelte.cjs +62 -0
  39. package/dist/use-projection.svelte.cjs.map +1 -0
  40. package/dist/use-projection.svelte.d.cts +65 -0
  41. package/dist/use-projection.svelte.d.cts.map +1 -0
  42. package/dist/use-projection.svelte.d.ts +65 -0
  43. package/dist/use-projection.svelte.d.ts.map +1 -0
  44. package/dist/use-projection.svelte.js +62 -0
  45. package/dist/use-projection.svelte.js.map +1 -0
  46. package/dist/use-stream.svelte.cjs +193 -0
  47. package/dist/use-stream.svelte.cjs.map +1 -0
  48. package/dist/use-stream.svelte.d.cts +116 -0
  49. package/dist/use-stream.svelte.d.cts.map +1 -0
  50. package/dist/use-stream.svelte.d.ts +116 -0
  51. package/dist/use-stream.svelte.d.ts.map +1 -0
  52. package/dist/use-stream.svelte.js +191 -0
  53. package/dist/use-stream.svelte.js.map +1 -0
  54. package/dist/use-video-player.svelte.cjs +233 -0
  55. package/dist/use-video-player.svelte.cjs.map +1 -0
  56. package/dist/use-video-player.svelte.d.cts +66 -0
  57. package/dist/use-video-player.svelte.d.cts.map +1 -0
  58. package/dist/use-video-player.svelte.d.ts +66 -0
  59. package/dist/use-video-player.svelte.d.ts.map +1 -0
  60. package/dist/use-video-player.svelte.js +233 -0
  61. package/dist/use-video-player.svelte.js.map +1 -0
  62. package/package.json +9 -8
  63. package/dist/index.cjs.map +0 -1
  64. package/dist/index.d.cts.map +0 -1
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/stream.custom.cjs +0 -122
  68. package/dist/stream.custom.cjs.map +0 -1
  69. package/dist/stream.custom.js +0 -122
  70. package/dist/stream.custom.js.map +0 -1
  71. package/dist/subagents.cjs +0 -81
  72. package/dist/subagents.cjs.map +0 -1
  73. package/dist/subagents.js +0 -81
  74. package/dist/subagents.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.svelte.cjs","names":["NAMESPACE_SEPARATOR","useProjection","getRegistry","STREAM_CONTROLLER"],"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 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 * 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 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[]> {\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 — most-recent\n * payload emitted by the transformer, scoped to the target namespace.\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 * Prefer {@link useMessages} / {@link useToolCalls} / {@link useValues}\n * for the common cases.\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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"}
@@ -0,0 +1,146 @@
1
+ import { AnyStream, UseStreamReturn } from "./use-stream.svelte.cjs";
2
+ import { ReactiveValue, ValueOrGetter } from "./use-projection.svelte.cjs";
3
+ import { BaseMessage } from "@langchain/core/messages";
4
+ import { AssembledToolCall, AudioMedia, Channel, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
5
+
6
+ //#region src/selectors.svelte.d.ts
7
+ /**
8
+ * Parameterise selectors on `StateType` alone so callers with a full
9
+ * `useStream<S, I, C>()` handle don't have to redeclare
10
+ * `InterruptType` / `ConfigurableType` at every call site.
11
+ */
12
+ type StreamHandle<StateType extends object> = UseStreamReturn<StateType, any, any>;
13
+ /**
14
+ * What a selector composable targets. Callers can pass:
15
+ * - `undefined` / `null` — root namespace (served by the always-on
16
+ * root store; no extra subscription opens);
17
+ * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);
18
+ * - a {@link SubgraphDiscoverySnapshot}
19
+ * (`stream.subgraphs.get(...)`);
20
+ * - an explicit `{ namespace: string[] }`;
21
+ * - a raw `string[]` escape hatch.
22
+ */
23
+ type SelectorTarget = undefined | null | readonly string[] | {
24
+ namespace: readonly string[];
25
+ } | SubagentDiscoverySnapshot | SubgraphDiscoverySnapshot;
26
+ /**
27
+ * Subscribe to a scoped `messages` stream.
28
+ *
29
+ * Contract:
30
+ * - At the root (no `target`, or a static target that resolves to
31
+ * the root namespace) returns a handle whose `.current` delegates
32
+ * to `stream.messages` — the always-on root projection. No extra
33
+ * subscription is opened.
34
+ * - For any non-root namespace, mount triggers a ref-counted
35
+ * `messages` subscription scoped to that namespace. The
36
+ * subscription is released automatically when the owning
37
+ * component teardown fires (and the registry closes the
38
+ * underlying server subscription when the last consumer leaves).
39
+ * - A reactive `target` (getter form) re-binds the subscription on
40
+ * change. A getter that flips between root and scoped is
41
+ * supported: the root case short-circuits to the initial value
42
+ * because dynamic root delegation isn't meaningful — pass a
43
+ * static undefined/null target for root handles.
44
+ *
45
+ * Messages are always `BaseMessage` class instances from
46
+ * `@langchain/core/messages`.
47
+ */
48
+ declare function useMessages(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<BaseMessage[]>;
49
+ /**
50
+ * Subscribe to a scoped `tools` (tool-call) stream. Same target and
51
+ * lifecycle rules as {@link useMessages}; at the root this returns a
52
+ * handle delegating to `stream.toolCalls`.
53
+ */
54
+ declare function useToolCalls(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<AssembledToolCall[]>;
55
+ /**
56
+ * Subscribe to a scoped `values` stream — the most recent state
57
+ * payload for a namespace. At the root returns a handle delegating
58
+ * to `stream.values`.
59
+ *
60
+ * Typing:
61
+ * - **Root** (`useValues(stream)`): returns the `StateType` declared
62
+ * on `useStream<State>()` — non-nullable (the root snapshot
63
+ * always has values, falling back to `initialValues ?? {}`).
64
+ * - **Scoped** (`useValues(stream, target)`): scoped payloads can
65
+ * differ from the root state; callers should annotate the
66
+ * expected shape explicitly (`useValues<SubagentState>(stream,
67
+ * sub)`). Defaults to `unknown` when not annotated.
68
+ */
69
+ declare function useValues<StateType extends object>(stream: StreamHandle<StateType>): ReactiveValue<StateType>;
70
+ declare function useValues<T>(stream: AnyStream): ReactiveValue<InferStateType<T>>;
71
+ declare function useValues<T = unknown>(stream: AnyStream, target: ValueOrGetter<SelectorTarget>, options?: {
72
+ messagesKey?: string;
73
+ }): ReactiveValue<T | undefined>;
74
+ /**
75
+ * Subscribe to a `custom:<name>` stream extension — most-recent
76
+ * payload emitted by the transformer, scoped to the target namespace.
77
+ *
78
+ * `name` accepts either a plain string or a getter so component
79
+ * state can drive the extension name at runtime.
80
+ */
81
+ declare function useExtension<T = unknown>(stream: AnyStream, name: ValueOrGetter<string>, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<T | undefined>;
82
+ /**
83
+ * Raw-events escape hatch. Subscribes to one or more channels at a
84
+ * namespace and returns a bounded buffer of raw protocol events.
85
+ * Prefer {@link useMessages} / {@link useToolCalls} / {@link useValues}
86
+ * for the common cases.
87
+ */
88
+ type UseChannelOptions = ChannelProjectionOptions;
89
+ declare function useChannel(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, target?: ValueOrGetter<SelectorTarget>, options?: UseChannelOptions): ReactiveValue<Event[]>;
90
+ /**
91
+ * Subscribe to a scoped audio-media stream. Each handle is yielded
92
+ * on its first matching `content-block-start`, exposes
93
+ * `.partialBytes` for live access, settles `.blob` / `.objectURL` /
94
+ * `.transcript` on `message-finish`, and surfaces errors via
95
+ * `.error`.
96
+ */
97
+ declare function useAudio(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<AudioMedia[]>;
98
+ /**
99
+ * Subscribe to a scoped image-media stream. Pair with `useMediaURL`
100
+ * for `<img src>`.
101
+ */
102
+ declare function useImages(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<ImageMedia[]>;
103
+ /**
104
+ * Subscribe to a scoped video-media stream. Pair with `useMediaURL`
105
+ * for `<video src>`.
106
+ */
107
+ declare function useVideo(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<VideoMedia[]>;
108
+ /**
109
+ * Subscribe to a scoped file-media stream. Pair with `useMediaURL`
110
+ * for an `<a download href>` target.
111
+ */
112
+ declare function useFiles(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<FileMedia[]>;
113
+ /**
114
+ * Read metadata recorded for a specific message id — today exposes
115
+ * `parentCheckpointId`, the checkpoint the message was first seen
116
+ * on. Designed for fork / edit flows:
117
+ *
118
+ * ```svelte
119
+ * <script lang="ts">
120
+ * const meta = useMessageMetadata(stream, () => selected?.id);
121
+ * </script>
122
+ * Parent: {meta.current?.parentCheckpointId ?? "root"}
123
+ * ```
124
+ *
125
+ * `messageId` accepts a plain string or a getter — the binding
126
+ * re-evaluates whenever the id changes.
127
+ */
128
+ declare function useMessageMetadata(stream: AnyStream, messageId: ValueOrGetter<string | undefined>): ReactiveValue<MessageMetadata | undefined>;
129
+ /**
130
+ * Reactive handle on the server-side submission queue.
131
+ *
132
+ * Populated when `submit()` is invoked with
133
+ * `multitaskStrategy: "enqueue"` while another run is in flight. The
134
+ * returned getters are stable — safe to pass into `{#each}`.
135
+ */
136
+ interface UseSubmissionQueueReturn<StateType extends object = Record<string, unknown>> {
137
+ readonly entries: SubmissionQueueSnapshot<StateType>;
138
+ readonly size: number;
139
+ cancel(id: string): Promise<boolean>;
140
+ clear(): Promise<void>;
141
+ }
142
+ declare function useSubmissionQueue<StateType extends object>(stream: StreamHandle<StateType>): UseSubmissionQueueReturn<StateType>;
143
+ declare function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;
144
+ //#endregion
145
+ export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
146
+ //# sourceMappingURL=selectors.svelte.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.svelte.d.cts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;AAsCoC;;;KAO/B,YAAA,6BAAyC,eAAA,CAC5C,SAAA;;;;;;AAiBF;;;;;KAAY,cAAA;EAIN,SAAA;AAAA,IACF,yBAAA,GACA,yBAAA;;AA6FJ;;;;;;;;;;;;;;;;;;;AA4BA;;iBA5BgB,WAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,WAAA;;;;;;iBAyBD,YAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,iBAAA;;;;;;;;;;;AAkCjB;;;;iBAAgB,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;;;;;;;;iBAiCD,YAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,IAAA,EAAM,aAAA,UACN,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,CAAA;AA5CjB;;;;;;AAAA,KAuEY,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;;;;;;;;iBA+BD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;AA7GjB;;;iBA2HgB,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;;;;;;;;;AA3HjB;;;;;;;iBAoJgB,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"}
@@ -0,0 +1,146 @@
1
+ import { AnyStream, UseStreamReturn } from "./use-stream.svelte.js";
2
+ import { ReactiveValue, ValueOrGetter } from "./use-projection.svelte.js";
3
+ import { AssembledToolCall, AudioMedia, Channel, ChannelProjectionOptions, Event, FileMedia, ImageMedia, InferStateType, MessageMetadata, SubagentDiscoverySnapshot, SubgraphDiscoverySnapshot, SubmissionQueueEntry, SubmissionQueueSnapshot, VideoMedia } from "@langchain/langgraph-sdk/stream";
4
+ import { BaseMessage } from "@langchain/core/messages";
5
+
6
+ //#region src/selectors.svelte.d.ts
7
+ /**
8
+ * Parameterise selectors on `StateType` alone so callers with a full
9
+ * `useStream<S, I, C>()` handle don't have to redeclare
10
+ * `InterruptType` / `ConfigurableType` at every call site.
11
+ */
12
+ type StreamHandle<StateType extends object> = UseStreamReturn<StateType, any, any>;
13
+ /**
14
+ * What a selector composable targets. Callers can pass:
15
+ * - `undefined` / `null` — root namespace (served by the always-on
16
+ * root store; no extra subscription opens);
17
+ * - a {@link SubagentDiscoverySnapshot} (`stream.subagents.get(...)`);
18
+ * - a {@link SubgraphDiscoverySnapshot}
19
+ * (`stream.subgraphs.get(...)`);
20
+ * - an explicit `{ namespace: string[] }`;
21
+ * - a raw `string[]` escape hatch.
22
+ */
23
+ type SelectorTarget = undefined | null | readonly string[] | {
24
+ namespace: readonly string[];
25
+ } | SubagentDiscoverySnapshot | SubgraphDiscoverySnapshot;
26
+ /**
27
+ * Subscribe to a scoped `messages` stream.
28
+ *
29
+ * Contract:
30
+ * - At the root (no `target`, or a static target that resolves to
31
+ * the root namespace) returns a handle whose `.current` delegates
32
+ * to `stream.messages` — the always-on root projection. No extra
33
+ * subscription is opened.
34
+ * - For any non-root namespace, mount triggers a ref-counted
35
+ * `messages` subscription scoped to that namespace. The
36
+ * subscription is released automatically when the owning
37
+ * component teardown fires (and the registry closes the
38
+ * underlying server subscription when the last consumer leaves).
39
+ * - A reactive `target` (getter form) re-binds the subscription on
40
+ * change. A getter that flips between root and scoped is
41
+ * supported: the root case short-circuits to the initial value
42
+ * because dynamic root delegation isn't meaningful — pass a
43
+ * static undefined/null target for root handles.
44
+ *
45
+ * Messages are always `BaseMessage` class instances from
46
+ * `@langchain/core/messages`.
47
+ */
48
+ declare function useMessages(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<BaseMessage[]>;
49
+ /**
50
+ * Subscribe to a scoped `tools` (tool-call) stream. Same target and
51
+ * lifecycle rules as {@link useMessages}; at the root this returns a
52
+ * handle delegating to `stream.toolCalls`.
53
+ */
54
+ declare function useToolCalls(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<AssembledToolCall[]>;
55
+ /**
56
+ * Subscribe to a scoped `values` stream — the most recent state
57
+ * payload for a namespace. At the root returns a handle delegating
58
+ * to `stream.values`.
59
+ *
60
+ * Typing:
61
+ * - **Root** (`useValues(stream)`): returns the `StateType` declared
62
+ * on `useStream<State>()` — non-nullable (the root snapshot
63
+ * always has values, falling back to `initialValues ?? {}`).
64
+ * - **Scoped** (`useValues(stream, target)`): scoped payloads can
65
+ * differ from the root state; callers should annotate the
66
+ * expected shape explicitly (`useValues<SubagentState>(stream,
67
+ * sub)`). Defaults to `unknown` when not annotated.
68
+ */
69
+ declare function useValues<StateType extends object>(stream: StreamHandle<StateType>): ReactiveValue<StateType>;
70
+ declare function useValues<T>(stream: AnyStream): ReactiveValue<InferStateType<T>>;
71
+ declare function useValues<T = unknown>(stream: AnyStream, target: ValueOrGetter<SelectorTarget>, options?: {
72
+ messagesKey?: string;
73
+ }): ReactiveValue<T | undefined>;
74
+ /**
75
+ * Subscribe to a `custom:<name>` stream extension — most-recent
76
+ * payload emitted by the transformer, scoped to the target namespace.
77
+ *
78
+ * `name` accepts either a plain string or a getter so component
79
+ * state can drive the extension name at runtime.
80
+ */
81
+ declare function useExtension<T = unknown>(stream: AnyStream, name: ValueOrGetter<string>, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<T | undefined>;
82
+ /**
83
+ * Raw-events escape hatch. Subscribes to one or more channels at a
84
+ * namespace and returns a bounded buffer of raw protocol events.
85
+ * Prefer {@link useMessages} / {@link useToolCalls} / {@link useValues}
86
+ * for the common cases.
87
+ */
88
+ type UseChannelOptions = ChannelProjectionOptions;
89
+ declare function useChannel(stream: AnyStream, channels: ValueOrGetter<readonly Channel[]>, target?: ValueOrGetter<SelectorTarget>, options?: UseChannelOptions): ReactiveValue<Event[]>;
90
+ /**
91
+ * Subscribe to a scoped audio-media stream. Each handle is yielded
92
+ * on its first matching `content-block-start`, exposes
93
+ * `.partialBytes` for live access, settles `.blob` / `.objectURL` /
94
+ * `.transcript` on `message-finish`, and surfaces errors via
95
+ * `.error`.
96
+ */
97
+ declare function useAudio(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<AudioMedia[]>;
98
+ /**
99
+ * Subscribe to a scoped image-media stream. Pair with `useMediaURL`
100
+ * for `<img src>`.
101
+ */
102
+ declare function useImages(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<ImageMedia[]>;
103
+ /**
104
+ * Subscribe to a scoped video-media stream. Pair with `useMediaURL`
105
+ * for `<video src>`.
106
+ */
107
+ declare function useVideo(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<VideoMedia[]>;
108
+ /**
109
+ * Subscribe to a scoped file-media stream. Pair with `useMediaURL`
110
+ * for an `<a download href>` target.
111
+ */
112
+ declare function useFiles(stream: AnyStream, target?: ValueOrGetter<SelectorTarget>): ReactiveValue<FileMedia[]>;
113
+ /**
114
+ * Read metadata recorded for a specific message id — today exposes
115
+ * `parentCheckpointId`, the checkpoint the message was first seen
116
+ * on. Designed for fork / edit flows:
117
+ *
118
+ * ```svelte
119
+ * <script lang="ts">
120
+ * const meta = useMessageMetadata(stream, () => selected?.id);
121
+ * </script>
122
+ * Parent: {meta.current?.parentCheckpointId ?? "root"}
123
+ * ```
124
+ *
125
+ * `messageId` accepts a plain string or a getter — the binding
126
+ * re-evaluates whenever the id changes.
127
+ */
128
+ declare function useMessageMetadata(stream: AnyStream, messageId: ValueOrGetter<string | undefined>): ReactiveValue<MessageMetadata | undefined>;
129
+ /**
130
+ * Reactive handle on the server-side submission queue.
131
+ *
132
+ * Populated when `submit()` is invoked with
133
+ * `multitaskStrategy: "enqueue"` while another run is in flight. The
134
+ * returned getters are stable — safe to pass into `{#each}`.
135
+ */
136
+ interface UseSubmissionQueueReturn<StateType extends object = Record<string, unknown>> {
137
+ readonly entries: SubmissionQueueSnapshot<StateType>;
138
+ readonly size: number;
139
+ cancel(id: string): Promise<boolean>;
140
+ clear(): Promise<void>;
141
+ }
142
+ declare function useSubmissionQueue<StateType extends object>(stream: StreamHandle<StateType>): UseSubmissionQueueReturn<StateType>;
143
+ declare function useSubmissionQueue(stream: AnyStream): UseSubmissionQueueReturn;
144
+ //#endregion
145
+ export { SelectorTarget, type SubmissionQueueEntry, type SubmissionQueueSnapshot, UseSubmissionQueueReturn, useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
146
+ //# sourceMappingURL=selectors.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.svelte.d.ts","names":[],"sources":["../src/selectors.svelte.ts"],"mappings":";;;;;;;;AAsCoC;;;KAO/B,YAAA,6BAAyC,eAAA,CAC5C,SAAA;;;;;;AAiBF;;;;;KAAY,cAAA;EAIN,SAAA;AAAA,IACF,yBAAA,GACA,yBAAA;;AA6FJ;;;;;;;;;;;;;;;;;;;AA4BA;;iBA5BgB,WAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,WAAA;;;;;;iBAyBD,YAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,iBAAA;;;;;;;;;;;AAkCjB;;;;iBAAgB,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;;;;;;;;iBAiCD,YAAA,aAAA,CACd,MAAA,EAAQ,SAAA,EACR,IAAA,EAAM,aAAA,UACN,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,CAAA;AA5CjB;;;;;;AAAA,KAuEY,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;;;;;;;;iBA+BD,QAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,GAAS,aAAA,CAAc,cAAA,IACtB,aAAA,CAAc,UAAA;;AA7GjB;;;iBA2HgB,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;;;;;;;;;AA3HjB;;;;;;;iBAoJgB,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"}
@@ -0,0 +1,204 @@
1
+ import { STREAM_CONTROLLER, getRegistry } from "./use-stream.svelte.js";
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";
4
+ //#region src/selectors.svelte.ts
5
+ const EMPTY_NAMESPACE = [];
6
+ function resolveNamespace(target) {
7
+ if (target == null) return EMPTY_NAMESPACE;
8
+ if (Array.isArray(target)) return target;
9
+ return target.namespace ?? EMPTY_NAMESPACE;
10
+ }
11
+ function isRoot(namespace) {
12
+ return namespace.length === 0;
13
+ }
14
+ function namespaceKey(namespace) {
15
+ return namespace.join(NAMESPACE_SEPARATOR);
16
+ }
17
+ function isGetter(input) {
18
+ return typeof input === "function";
19
+ }
20
+ /**
21
+ * Internal helper that wires a reactive-or-static target into
22
+ * {@link useProjection}. Encapsulates the bookkeeping every selector
23
+ * otherwise repeats.
24
+ */
25
+ function selectFromTarget(stream, target, initialValue, makeSpec, keyPrefix) {
26
+ if (isGetter(target)) {
27
+ const getTarget = target;
28
+ return useProjection(() => {
29
+ return isRoot(resolveNamespace(getTarget())) ? null : getRegistry(stream);
30
+ }, () => makeSpec(resolveNamespace(getTarget())), () => `${keyPrefix}|${namespaceKey(resolveNamespace(getTarget()))}`, initialValue);
31
+ }
32
+ const ns = resolveNamespace(target);
33
+ const key = `${keyPrefix}|${namespaceKey(ns)}`;
34
+ return useProjection(isRoot(ns) ? null : getRegistry(stream), () => makeSpec(ns), key, initialValue);
35
+ }
36
+ const EMPTY_MESSAGES = [];
37
+ const EMPTY_TOOLCALLS = [];
38
+ const EMPTY_EVENTS = [];
39
+ const EMPTY_AUDIO = [];
40
+ const EMPTY_IMAGES = [];
41
+ const EMPTY_VIDEO = [];
42
+ const EMPTY_FILES = [];
43
+ /**
44
+ * Subscribe to a scoped `messages` stream.
45
+ *
46
+ * Contract:
47
+ * - At the root (no `target`, or a static target that resolves to
48
+ * the root namespace) returns a handle whose `.current` delegates
49
+ * to `stream.messages` — the always-on root projection. No extra
50
+ * subscription is opened.
51
+ * - For any non-root namespace, mount triggers a ref-counted
52
+ * `messages` subscription scoped to that namespace. The
53
+ * subscription is released automatically when the owning
54
+ * component teardown fires (and the registry closes the
55
+ * underlying server subscription when the last consumer leaves).
56
+ * - A reactive `target` (getter form) re-binds the subscription on
57
+ * change. A getter that flips between root and scoped is
58
+ * supported: the root case short-circuits to the initial value
59
+ * because dynamic root delegation isn't meaningful — pass a
60
+ * static undefined/null target for root handles.
61
+ *
62
+ * Messages are always `BaseMessage` class instances from
63
+ * `@langchain/core/messages`.
64
+ */
65
+ function useMessages(stream, target) {
66
+ if (!isGetter(target)) {
67
+ if (isRoot(resolveNamespace(target))) return { get current() {
68
+ return stream.messages;
69
+ } };
70
+ }
71
+ return selectFromTarget(stream, target, EMPTY_MESSAGES, (ns) => messagesProjection(ns), "messages");
72
+ }
73
+ /**
74
+ * Subscribe to a scoped `tools` (tool-call) stream. Same target and
75
+ * lifecycle rules as {@link useMessages}; at the root this returns a
76
+ * handle delegating to `stream.toolCalls`.
77
+ */
78
+ function useToolCalls(stream, target) {
79
+ if (!isGetter(target)) {
80
+ if (isRoot(resolveNamespace(target))) return { get current() {
81
+ return stream.toolCalls;
82
+ } };
83
+ }
84
+ return selectFromTarget(stream, target, EMPTY_TOOLCALLS, (ns) => toolCallsProjection(ns), "toolCalls");
85
+ }
86
+ function useValues(stream, target, options) {
87
+ if (!isGetter(target)) {
88
+ if (isRoot(resolveNamespace(target))) return { get current() {
89
+ return stream.values;
90
+ } };
91
+ }
92
+ const messagesKey = options?.messagesKey ?? "messages";
93
+ return selectFromTarget(stream, target, void 0, (ns) => valuesProjection(ns, messagesKey), `values|${messagesKey}`);
94
+ }
95
+ /**
96
+ * Subscribe to a `custom:<name>` stream extension — most-recent
97
+ * payload emitted by the transformer, scoped to the target namespace.
98
+ *
99
+ * `name` accepts either a plain string or a getter so component
100
+ * state can drive the extension name at runtime.
101
+ */
102
+ function useExtension(stream, name, target) {
103
+ const getName = () => isGetter(name) ? name() : name;
104
+ if (isGetter(target)) {
105
+ const getTarget = target;
106
+ return useProjection(() => getRegistry(stream), () => extensionProjection(getName(), resolveNamespace(getTarget())), () => `extension|${getName()}|${namespaceKey(resolveNamespace(getTarget()))}`, void 0);
107
+ }
108
+ const ns = resolveNamespace(target);
109
+ return useProjection(getRegistry(stream), () => extensionProjection(getName(), ns), () => `extension|${getName()}|${namespaceKey(ns)}`, void 0);
110
+ }
111
+ function useChannel(stream, channels, target, options) {
112
+ const getChannels = () => isGetter(channels) ? channels() : channels;
113
+ const getTarget = () => isGetter(target) ? target() : target;
114
+ const bufferSize = options?.bufferSize ?? "default";
115
+ const replayMode = options?.replay ?? true ? "replay" : "live";
116
+ return useProjection(() => getRegistry(stream), () => channelProjection(getChannels(), resolveNamespace(getTarget()), options), () => {
117
+ return `channel|${bufferSize}|${replayMode}|${[...getChannels()].sort().join(",")}|${namespaceKey(resolveNamespace(getTarget()))}`;
118
+ }, EMPTY_EVENTS);
119
+ }
120
+ /**
121
+ * Subscribe to a scoped audio-media stream. Each handle is yielded
122
+ * on its first matching `content-block-start`, exposes
123
+ * `.partialBytes` for live access, settles `.blob` / `.objectURL` /
124
+ * `.transcript` on `message-finish`, and surfaces errors via
125
+ * `.error`.
126
+ */
127
+ function useAudio(stream, target) {
128
+ return selectFromTarget(stream, target, EMPTY_AUDIO, (ns) => audioProjection(ns), "audio");
129
+ }
130
+ /**
131
+ * Subscribe to a scoped image-media stream. Pair with `useMediaURL`
132
+ * for `<img src>`.
133
+ */
134
+ function useImages(stream, target) {
135
+ return selectFromTarget(stream, target, EMPTY_IMAGES, (ns) => imagesProjection(ns), "images");
136
+ }
137
+ /**
138
+ * Subscribe to a scoped video-media stream. Pair with `useMediaURL`
139
+ * for `<video src>`.
140
+ */
141
+ function useVideo(stream, target) {
142
+ return selectFromTarget(stream, target, EMPTY_VIDEO, (ns) => videoProjection(ns), "video");
143
+ }
144
+ /**
145
+ * Subscribe to a scoped file-media stream. Pair with `useMediaURL`
146
+ * for an `<a download href>` target.
147
+ */
148
+ function useFiles(stream, target) {
149
+ return selectFromTarget(stream, target, EMPTY_FILES, (ns) => filesProjection(ns), "files");
150
+ }
151
+ /**
152
+ * Read metadata recorded for a specific message id — today exposes
153
+ * `parentCheckpointId`, the checkpoint the message was first seen
154
+ * on. Designed for fork / edit flows:
155
+ *
156
+ * ```svelte
157
+ * <script lang="ts">
158
+ * const meta = useMessageMetadata(stream, () => selected?.id);
159
+ * <\/script>
160
+ * Parent: {meta.current?.parentCheckpointId ?? "root"}
161
+ * ```
162
+ *
163
+ * `messageId` accepts a plain string or a getter — the binding
164
+ * re-evaluates whenever the id changes.
165
+ */
166
+ function useMessageMetadata(stream, messageId) {
167
+ const store = stream[STREAM_CONTROLLER].messageMetadataStore;
168
+ let map = $state(store.getSnapshot());
169
+ $effect(() => {
170
+ return store.subscribe(() => {
171
+ map = store.getSnapshot();
172
+ });
173
+ });
174
+ const getId = () => isGetter(messageId) ? messageId() : messageId;
175
+ return { get current() {
176
+ const key = getId();
177
+ if (key == null) return void 0;
178
+ return map.get(key);
179
+ } };
180
+ }
181
+ function useSubmissionQueue(stream) {
182
+ const controller = stream[STREAM_CONTROLLER];
183
+ const store = controller.queueStore;
184
+ let entries = $state(store.getSnapshot());
185
+ $effect(() => {
186
+ return store.subscribe(() => {
187
+ entries = store.getSnapshot();
188
+ });
189
+ });
190
+ return {
191
+ get entries() {
192
+ return entries;
193
+ },
194
+ get size() {
195
+ return entries.length;
196
+ },
197
+ cancel: (id) => controller.cancelQueued(id),
198
+ clear: () => controller.clearQueue()
199
+ };
200
+ }
201
+ //#endregion
202
+ export { useAudio, useChannel, useExtension, useFiles, useImages, useMessageMetadata, useMessages, useSubmissionQueue, useToolCalls, useValues, useVideo };
203
+
204
+ //# sourceMappingURL=selectors.svelte.js.map
@@ -0,0 +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 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 * 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 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[]> {\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 — most-recent\n * payload emitted by the transformer, scoped to the target namespace.\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 * Prefer {@link useMessages} / {@link useToolCalls} / {@link useValues}\n * for the common cases.\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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"}