@langchain/vue 0.4.6 → 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 +84 -364
  2. package/dist/context.cjs +2 -2
  3. package/dist/context.cjs.map +1 -1
  4. package/dist/context.d.cts +4 -5
  5. package/dist/context.d.cts.map +1 -1
  6. package/dist/context.d.ts +4 -5
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +1 -1
  9. package/dist/context.js.map +1 -1
  10. package/dist/index.cjs +30 -222
  11. package/dist/index.d.cts +10 -24
  12. package/dist/index.d.ts +10 -24
  13. package/dist/index.js +9 -198
  14. package/dist/selectors.cjs +170 -0
  15. package/dist/selectors.cjs.map +1 -0
  16. package/dist/selectors.d.cts +133 -0
  17. package/dist/selectors.d.cts.map +1 -0
  18. package/dist/selectors.d.ts +133 -0
  19. package/dist/selectors.d.ts.map +1 -0
  20. package/dist/selectors.js +160 -0
  21. package/dist/selectors.js.map +1 -0
  22. package/dist/use-audio-player.cjs +591 -0
  23. package/dist/use-audio-player.cjs.map +1 -0
  24. package/dist/use-audio-player.d.cts +69 -0
  25. package/dist/use-audio-player.d.cts.map +1 -0
  26. package/dist/use-audio-player.d.ts +69 -0
  27. package/dist/use-audio-player.d.ts.map +1 -0
  28. package/dist/use-audio-player.js +591 -0
  29. package/dist/use-audio-player.js.map +1 -0
  30. package/dist/use-media-url.cjs +51 -0
  31. package/dist/use-media-url.cjs.map +1 -0
  32. package/dist/use-media-url.d.cts +29 -0
  33. package/dist/use-media-url.d.cts.map +1 -0
  34. package/dist/use-media-url.d.ts +29 -0
  35. package/dist/use-media-url.d.ts.map +1 -0
  36. package/dist/use-media-url.js +51 -0
  37. package/dist/use-media-url.js.map +1 -0
  38. package/dist/use-projection.cjs +66 -0
  39. package/dist/use-projection.cjs.map +1 -0
  40. package/dist/use-projection.d.cts +39 -0
  41. package/dist/use-projection.d.cts.map +1 -0
  42. package/dist/use-projection.d.ts +39 -0
  43. package/dist/use-projection.d.ts.map +1 -0
  44. package/dist/use-projection.js +66 -0
  45. package/dist/use-projection.js.map +1 -0
  46. package/dist/use-stream.cjs +169 -0
  47. package/dist/use-stream.cjs.map +1 -0
  48. package/dist/use-stream.d.cts +118 -0
  49. package/dist/use-stream.d.cts.map +1 -0
  50. package/dist/use-stream.d.ts +118 -0
  51. package/dist/use-stream.d.ts.map +1 -0
  52. package/dist/use-stream.js +167 -0
  53. package/dist/use-stream.js.map +1 -0
  54. package/dist/use-video-player.cjs +212 -0
  55. package/dist/use-video-player.cjs.map +1 -0
  56. package/dist/use-video-player.d.cts +57 -0
  57. package/dist/use-video-player.d.cts.map +1 -0
  58. package/dist/use-video-player.d.ts +57 -0
  59. package/dist/use-video-player.d.ts.map +1 -0
  60. package/dist/use-video-player.js +212 -0
  61. package/dist/use-video-player.js.map +1 -0
  62. package/package.json +10 -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 -133
  68. package/dist/stream.custom.cjs.map +0 -1
  69. package/dist/stream.custom.js +0 -133
  70. package/dist/stream.custom.js.map +0 -1
  71. package/dist/subagents.cjs +0 -76
  72. package/dist/subagents.cjs.map +0 -1
  73. package/dist/subagents.js +0 -76
  74. package/dist/subagents.js.map +0 -1
@@ -0,0 +1,212 @@
1
+ let vue = require("vue");
2
+ //#region src/use-video-player.ts
3
+ /**
4
+ * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.
5
+ *
6
+ * Vue idioms:
7
+ * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a
8
+ * getter. Pair with `<video ref="video" />` in the template, then
9
+ * pass the template ref straight in.
10
+ * - The composable never injects DOM nor overrides layout.
11
+ * - On scope disposal (or when `media` changes) the composable calls
12
+ * `media.revoke()` to free the object URL.
13
+ *
14
+ * @param videoRef - Reactive reference to the `<video>` element.
15
+ * @param media - Video handle from {@link useVideo}.
16
+ * @param options - Auto-play toggle.
17
+ */
18
+ function useVideoPlayer(videoRef, media, options) {
19
+ const autoPlay = options?.autoPlay ?? false;
20
+ const status = (0, vue.ref)("idle");
21
+ const error = (0, vue.ref)(void 0);
22
+ const currentTime = (0, vue.ref)(0);
23
+ const duration = (0, vue.ref)(void 0);
24
+ let shouldPlay = false;
25
+ let pendingResolve = null;
26
+ let pendingReject = null;
27
+ const resolvePending = () => {
28
+ const r = pendingResolve;
29
+ pendingResolve = null;
30
+ pendingReject = null;
31
+ r?.();
32
+ };
33
+ const rejectPending = (err) => {
34
+ const r = pendingReject;
35
+ pendingResolve = null;
36
+ pendingReject = null;
37
+ r?.(err);
38
+ };
39
+ (0, vue.watch)(() => status.value, (s) => {
40
+ if (s === "finished" || s === "paused" || s === "idle") resolvePending();
41
+ else if (s === "error") rejectPending(error.value ?? /* @__PURE__ */ new Error("playback error"));
42
+ });
43
+ const getVideo = () => (0, vue.toValue)(videoRef) ?? null;
44
+ const play = () => {
45
+ if ((0, vue.toValue)(media) == null) return;
46
+ if (status.value === "error") return;
47
+ shouldPlay = true;
48
+ const video = getVideo();
49
+ if (video == null) {
50
+ status.value = "buffering";
51
+ return;
52
+ }
53
+ video.play().catch((err) => {
54
+ error.value = err;
55
+ status.value = "error";
56
+ });
57
+ };
58
+ const pause = () => {
59
+ shouldPlay = false;
60
+ getVideo()?.pause();
61
+ if (status.value === "playing" || status.value === "buffering") status.value = "paused";
62
+ };
63
+ const stop = () => {
64
+ shouldPlay = false;
65
+ const video = getVideo();
66
+ if (video != null) {
67
+ video.pause();
68
+ video.currentTime = 0;
69
+ }
70
+ currentTime.value = 0;
71
+ status.value = (0, vue.toValue)(media) == null ? "idle" : "paused";
72
+ };
73
+ const reset = () => {
74
+ stop();
75
+ error.value = void 0;
76
+ duration.value = void 0;
77
+ status.value = "idle";
78
+ };
79
+ const toggle = () => {
80
+ if (status.value === "playing") pause();
81
+ else play();
82
+ };
83
+ const playToEnd = () => {
84
+ pendingResolve?.();
85
+ pendingResolve = null;
86
+ pendingReject = null;
87
+ return new Promise((resolve, reject) => {
88
+ pendingResolve = resolve;
89
+ pendingReject = reject;
90
+ play();
91
+ });
92
+ };
93
+ const seek = (seconds) => {
94
+ const video = getVideo();
95
+ if (video == null) return;
96
+ video.currentTime = seconds;
97
+ currentTime.value = seconds;
98
+ };
99
+ let detach = null;
100
+ const bind = (m, video) => {
101
+ error.value = void 0;
102
+ status.value = "buffering";
103
+ currentTime.value = 0;
104
+ duration.value = void 0;
105
+ let cancelled = false;
106
+ m.objectURL.then((resolved) => {
107
+ if (cancelled) return;
108
+ if (video == null) return;
109
+ video.src = resolved;
110
+ if (shouldPlay || autoPlay) video.play().catch((err) => {
111
+ error.value = err;
112
+ status.value = "error";
113
+ });
114
+ else status.value = "paused";
115
+ }, () => {
116
+ if (!cancelled) {
117
+ error.value = /* @__PURE__ */ new Error("media failed to materialise");
118
+ status.value = "error";
119
+ }
120
+ });
121
+ if (video == null) return () => {
122
+ cancelled = true;
123
+ try {
124
+ m.revoke();
125
+ } catch {}
126
+ };
127
+ const onPlay = () => {
128
+ if (status.value !== "error") status.value = "playing";
129
+ };
130
+ const onPause = () => {
131
+ if (video.ended) return;
132
+ if (status.value === "playing") status.value = "paused";
133
+ };
134
+ const onEnded = () => {
135
+ status.value = "finished";
136
+ };
137
+ const onTimeUpdate = () => {
138
+ currentTime.value = video.currentTime;
139
+ };
140
+ const onLoadedMetadata = () => {
141
+ if (Number.isFinite(video.duration)) duration.value = video.duration;
142
+ };
143
+ const onError = () => {
144
+ error.value = /* @__PURE__ */ new Error("HTMLVideoElement error");
145
+ status.value = "error";
146
+ };
147
+ video.addEventListener("play", onPlay);
148
+ video.addEventListener("pause", onPause);
149
+ video.addEventListener("ended", onEnded);
150
+ video.addEventListener("timeupdate", onTimeUpdate);
151
+ video.addEventListener("loadedmetadata", onLoadedMetadata);
152
+ video.addEventListener("error", onError);
153
+ return () => {
154
+ cancelled = true;
155
+ video.removeEventListener("play", onPlay);
156
+ video.removeEventListener("pause", onPause);
157
+ video.removeEventListener("ended", onEnded);
158
+ video.removeEventListener("timeupdate", onTimeUpdate);
159
+ video.removeEventListener("loadedmetadata", onLoadedMetadata);
160
+ video.removeEventListener("error", onError);
161
+ try {
162
+ video.pause();
163
+ video.removeAttribute("src");
164
+ video.load();
165
+ } catch {}
166
+ try {
167
+ m.revoke();
168
+ } catch {}
169
+ };
170
+ };
171
+ (0, vue.watch)(() => [(0, vue.toValue)(media), (0, vue.toValue)(videoRef)], ([m, video]) => {
172
+ detach?.();
173
+ detach = null;
174
+ if (m == null) {
175
+ status.value = "idle";
176
+ error.value = void 0;
177
+ currentTime.value = 0;
178
+ duration.value = void 0;
179
+ return;
180
+ }
181
+ if (m.error != null) {
182
+ error.value = new Error(m.error.message);
183
+ status.value = "error";
184
+ return;
185
+ }
186
+ detach = bind(m, video ?? null);
187
+ }, {
188
+ immediate: true,
189
+ flush: "post"
190
+ });
191
+ (0, vue.onScopeDispose)(() => {
192
+ detach?.();
193
+ detach = null;
194
+ });
195
+ return {
196
+ status,
197
+ play,
198
+ pause,
199
+ stop,
200
+ toggle,
201
+ reset,
202
+ playToEnd,
203
+ currentTime,
204
+ duration,
205
+ seek,
206
+ error
207
+ };
208
+ }
209
+ //#endregion
210
+ exports.useVideoPlayer = useVideoPlayer;
211
+
212
+ //# sourceMappingURL=use-video-player.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-video-player.cjs","names":[],"sources":["../src/use-video-player.ts"],"sourcesContent":["import {\n ref,\n watch,\n onScopeDispose,\n toValue,\n type MaybeRefOrGetter,\n type Ref,\n} from \"vue\";\nimport type { VideoMedia } from \"@langchain/langgraph-sdk/stream\";\nimport type { PlayerStatus } from \"./use-audio-player.js\";\n\n/** Options for {@link useVideoPlayer}. */\nexport interface UseVideoPlayerOptions {\n /**\n * Start playback as soon as the blob URL resolves. Subject to\n * browser autoplay policies — pair with `<video muted>` to bypass\n * the user-gesture requirement.\n */\n autoPlay?: boolean;\n}\n\n/**\n * Controls + live state returned by {@link useVideoPlayer}. Mirrors\n * {@link AudioPlayerHandle} on the shared subset so callers only ever\n * learn one shape.\n */\nexport interface VideoPlayerHandle {\n readonly status: Readonly<Ref<PlayerStatus>>;\n play(): void;\n pause(): void;\n stop(): void;\n toggle(): void;\n reset(): void;\n /**\n * Resolve on the next terminal transition (`finished` / `paused` /\n * `idle`). Reject on transitions to `\"error\"`. Triggers `play()`\n * when called.\n */\n playToEnd(): Promise<void>;\n\n readonly currentTime: Readonly<Ref<number>>;\n /** Total duration (seconds) once the element has parsed the blob. */\n readonly duration: Readonly<Ref<number | undefined>>;\n seek(seconds: number): void;\n\n readonly error: Readonly<Ref<Error | undefined>>;\n}\n\n/**\n * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.\n *\n * Vue idioms:\n * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a\n * getter. Pair with `<video ref=\"video\" />` in the template, then\n * pass the template ref straight in.\n * - The composable never injects DOM nor overrides layout.\n * - On scope disposal (or when `media` changes) the composable calls\n * `media.revoke()` to free the object URL.\n *\n * @param videoRef - Reactive reference to the `<video>` element.\n * @param media - Video handle from {@link useVideo}.\n * @param options - Auto-play toggle.\n */\nexport function useVideoPlayer(\n videoRef: MaybeRefOrGetter<HTMLVideoElement | null | undefined>,\n media: MaybeRefOrGetter<VideoMedia | undefined>,\n options?: UseVideoPlayerOptions\n): VideoPlayerHandle {\n const autoPlay = options?.autoPlay ?? false;\n\n const status = ref<PlayerStatus>(\"idle\");\n const error = ref<Error | undefined>(undefined);\n const currentTime = ref(0);\n const duration = ref<number | undefined>(undefined);\n\n let shouldPlay = false;\n let pendingResolve: (() => void) | null = null;\n let pendingReject: ((err: Error) => void) | null = null;\n\n const resolvePending = () => {\n const r = pendingResolve;\n pendingResolve = null;\n pendingReject = null;\n r?.();\n };\n const rejectPending = (err: Error) => {\n const r = pendingReject;\n pendingResolve = null;\n pendingReject = null;\n r?.(err);\n };\n\n watch(\n () => status.value,\n (s) => {\n if (s === \"finished\" || s === \"paused\" || s === \"idle\") {\n resolvePending();\n } else if (s === \"error\") {\n rejectPending(error.value ?? new Error(\"playback error\"));\n }\n }\n );\n\n const getVideo = () => toValue(videoRef) ?? null;\n\n const play = () => {\n const m = toValue(media);\n if (m == null) return;\n if (status.value === \"error\") return;\n shouldPlay = true;\n const video = getVideo();\n if (video == null) {\n status.value = \"buffering\";\n return;\n }\n video.play().catch((err) => {\n error.value = err as Error;\n status.value = \"error\";\n });\n };\n\n const pause = () => {\n shouldPlay = false;\n getVideo()?.pause();\n if (status.value === \"playing\" || status.value === \"buffering\") {\n status.value = \"paused\";\n }\n };\n\n const stop = () => {\n shouldPlay = false;\n const video = getVideo();\n if (video != null) {\n video.pause();\n video.currentTime = 0;\n }\n currentTime.value = 0;\n status.value = toValue(media) == null ? \"idle\" : \"paused\";\n };\n\n const reset = () => {\n stop();\n error.value = undefined;\n duration.value = undefined;\n status.value = \"idle\";\n };\n\n const toggle = () => {\n if (status.value === \"playing\") pause();\n else play();\n };\n\n const playToEnd = (): Promise<void> => {\n pendingResolve?.();\n pendingResolve = null;\n pendingReject = null;\n return new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n play();\n });\n };\n\n const seek = (seconds: number) => {\n const video = getVideo();\n if (video == null) return;\n video.currentTime = seconds;\n currentTime.value = seconds;\n };\n\n // Teardown callbacks registered when we bind a media instance.\n let detach: (() => void) | null = null;\n\n const bind = (m: VideoMedia, video: HTMLVideoElement | null) => {\n error.value = undefined;\n status.value = \"buffering\";\n currentTime.value = 0;\n duration.value = undefined;\n\n let cancelled = false;\n\n m.objectURL.then(\n (resolved) => {\n if (cancelled) return;\n if (video == null) return;\n video.src = resolved;\n\n if (shouldPlay || autoPlay) {\n video.play().catch((err) => {\n error.value = err as Error;\n status.value = \"error\";\n });\n } else {\n status.value = \"paused\";\n }\n },\n () => {\n if (!cancelled) {\n error.value = new Error(\"media failed to materialise\");\n status.value = \"error\";\n }\n }\n );\n\n if (video == null) {\n return () => {\n cancelled = true;\n try {\n m.revoke();\n } catch {\n // best-effort\n }\n };\n }\n\n const onPlay = () => {\n if (status.value !== \"error\") status.value = \"playing\";\n };\n const onPause = () => {\n if (video.ended) return;\n if (status.value === \"playing\") status.value = \"paused\";\n };\n const onEnded = () => {\n status.value = \"finished\";\n };\n const onTimeUpdate = () => {\n currentTime.value = video.currentTime;\n };\n const onLoadedMetadata = () => {\n if (Number.isFinite(video.duration)) duration.value = video.duration;\n };\n const onError = () => {\n error.value = new Error(\"HTMLVideoElement error\");\n status.value = \"error\";\n };\n\n video.addEventListener(\"play\", onPlay);\n video.addEventListener(\"pause\", onPause);\n video.addEventListener(\"ended\", onEnded);\n video.addEventListener(\"timeupdate\", onTimeUpdate);\n video.addEventListener(\"loadedmetadata\", onLoadedMetadata);\n video.addEventListener(\"error\", onError);\n\n return () => {\n cancelled = true;\n video.removeEventListener(\"play\", onPlay);\n video.removeEventListener(\"pause\", onPause);\n video.removeEventListener(\"ended\", onEnded);\n video.removeEventListener(\"timeupdate\", onTimeUpdate);\n video.removeEventListener(\"loadedmetadata\", onLoadedMetadata);\n video.removeEventListener(\"error\", onError);\n try {\n video.pause();\n video.removeAttribute(\"src\");\n video.load();\n } catch {\n // best-effort\n }\n try {\n m.revoke();\n } catch {\n // best-effort\n }\n };\n };\n\n // Surface a media-level error immediately and (re)bind on change.\n watch(\n () => [toValue(media), toValue(videoRef)] as const,\n ([m, video]) => {\n detach?.();\n detach = null;\n\n if (m == null) {\n status.value = \"idle\";\n error.value = undefined;\n currentTime.value = 0;\n duration.value = undefined;\n return;\n }\n\n if (m.error != null) {\n error.value = new Error(m.error.message);\n status.value = \"error\";\n return;\n }\n\n detach = bind(m, video ?? null);\n },\n { immediate: true, flush: \"post\" }\n );\n\n onScopeDispose(() => {\n detach?.();\n detach = null;\n });\n\n return {\n status,\n play,\n pause,\n stop,\n toggle,\n reset,\n playToEnd,\n currentTime,\n duration,\n seek,\n error,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { PlayerStatus } from "./use-audio-player.cjs";
2
+ import { MaybeRefOrGetter, Ref } from "vue";
3
+ import { VideoMedia } from "@langchain/langgraph-sdk/stream";
4
+
5
+ //#region src/use-video-player.d.ts
6
+ /** Options for {@link useVideoPlayer}. */
7
+ interface UseVideoPlayerOptions {
8
+ /**
9
+ * Start playback as soon as the blob URL resolves. Subject to
10
+ * browser autoplay policies — pair with `<video muted>` to bypass
11
+ * the user-gesture requirement.
12
+ */
13
+ autoPlay?: boolean;
14
+ }
15
+ /**
16
+ * Controls + live state returned by {@link useVideoPlayer}. Mirrors
17
+ * {@link AudioPlayerHandle} on the shared subset so callers only ever
18
+ * learn one shape.
19
+ */
20
+ interface VideoPlayerHandle {
21
+ readonly status: Readonly<Ref<PlayerStatus>>;
22
+ play(): void;
23
+ pause(): void;
24
+ stop(): void;
25
+ toggle(): void;
26
+ reset(): void;
27
+ /**
28
+ * Resolve on the next terminal transition (`finished` / `paused` /
29
+ * `idle`). Reject on transitions to `"error"`. Triggers `play()`
30
+ * when called.
31
+ */
32
+ playToEnd(): Promise<void>;
33
+ readonly currentTime: Readonly<Ref<number>>;
34
+ /** Total duration (seconds) once the element has parsed the blob. */
35
+ readonly duration: Readonly<Ref<number | undefined>>;
36
+ seek(seconds: number): void;
37
+ readonly error: Readonly<Ref<Error | undefined>>;
38
+ }
39
+ /**
40
+ * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.
41
+ *
42
+ * Vue idioms:
43
+ * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a
44
+ * getter. Pair with `<video ref="video" />` in the template, then
45
+ * pass the template ref straight in.
46
+ * - The composable never injects DOM nor overrides layout.
47
+ * - On scope disposal (or when `media` changes) the composable calls
48
+ * `media.revoke()` to free the object URL.
49
+ *
50
+ * @param videoRef - Reactive reference to the `<video>` element.
51
+ * @param media - Video handle from {@link useVideo}.
52
+ * @param options - Auto-play toggle.
53
+ */
54
+ declare function useVideoPlayer(videoRef: MaybeRefOrGetter<HTMLVideoElement | null | undefined>, media: MaybeRefOrGetter<VideoMedia | undefined>, options?: UseVideoPlayerOptions): VideoPlayerHandle;
55
+ //#endregion
56
+ export { UseVideoPlayerOptions, VideoPlayerHandle, useVideoPlayer };
57
+ //# sourceMappingURL=use-video-player.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-video-player.d.cts","names":[],"sources":["../src/use-video-player.ts"],"mappings":";;;;;;UAYiB,qBAAA;EAAA;;;;;EAMf,QAAA;AAAA;;;;;;UAQe,iBAAA;EAAA,SACN,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,YAAA;EAC9B,IAAA;EACA,KAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA;EAawB;;;;;EAPxB,SAAA,IAAa,OAAA;EAAA,SAEJ,WAAA,EAAa,QAAA,CAAS,GAAA;EAX/B;EAAA,SAaS,QAAA,EAAU,QAAA,CAAS,GAAA;EAC5B,IAAA,CAAK,OAAA;EAAA,SAEI,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAA;AAAA;;;;;;;;;;;;;;;;iBAkBf,cAAA,CACd,QAAA,EAAU,gBAAA,CAAiB,gBAAA,sBAC3B,KAAA,EAAO,gBAAA,CAAiB,UAAA,eACxB,OAAA,GAAU,qBAAA,GACT,iBAAA"}
@@ -0,0 +1,57 @@
1
+ import { PlayerStatus } from "./use-audio-player.js";
2
+ import { MaybeRefOrGetter, Ref } from "vue";
3
+ import { VideoMedia } from "@langchain/langgraph-sdk/stream";
4
+
5
+ //#region src/use-video-player.d.ts
6
+ /** Options for {@link useVideoPlayer}. */
7
+ interface UseVideoPlayerOptions {
8
+ /**
9
+ * Start playback as soon as the blob URL resolves. Subject to
10
+ * browser autoplay policies — pair with `<video muted>` to bypass
11
+ * the user-gesture requirement.
12
+ */
13
+ autoPlay?: boolean;
14
+ }
15
+ /**
16
+ * Controls + live state returned by {@link useVideoPlayer}. Mirrors
17
+ * {@link AudioPlayerHandle} on the shared subset so callers only ever
18
+ * learn one shape.
19
+ */
20
+ interface VideoPlayerHandle {
21
+ readonly status: Readonly<Ref<PlayerStatus>>;
22
+ play(): void;
23
+ pause(): void;
24
+ stop(): void;
25
+ toggle(): void;
26
+ reset(): void;
27
+ /**
28
+ * Resolve on the next terminal transition (`finished` / `paused` /
29
+ * `idle`). Reject on transitions to `"error"`. Triggers `play()`
30
+ * when called.
31
+ */
32
+ playToEnd(): Promise<void>;
33
+ readonly currentTime: Readonly<Ref<number>>;
34
+ /** Total duration (seconds) once the element has parsed the blob. */
35
+ readonly duration: Readonly<Ref<number | undefined>>;
36
+ seek(seconds: number): void;
37
+ readonly error: Readonly<Ref<Error | undefined>>;
38
+ }
39
+ /**
40
+ * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.
41
+ *
42
+ * Vue idioms:
43
+ * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a
44
+ * getter. Pair with `<video ref="video" />` in the template, then
45
+ * pass the template ref straight in.
46
+ * - The composable never injects DOM nor overrides layout.
47
+ * - On scope disposal (or when `media` changes) the composable calls
48
+ * `media.revoke()` to free the object URL.
49
+ *
50
+ * @param videoRef - Reactive reference to the `<video>` element.
51
+ * @param media - Video handle from {@link useVideo}.
52
+ * @param options - Auto-play toggle.
53
+ */
54
+ declare function useVideoPlayer(videoRef: MaybeRefOrGetter<HTMLVideoElement | null | undefined>, media: MaybeRefOrGetter<VideoMedia | undefined>, options?: UseVideoPlayerOptions): VideoPlayerHandle;
55
+ //#endregion
56
+ export { UseVideoPlayerOptions, VideoPlayerHandle, useVideoPlayer };
57
+ //# sourceMappingURL=use-video-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-video-player.d.ts","names":[],"sources":["../src/use-video-player.ts"],"mappings":";;;;;;UAYiB,qBAAA;EAAA;;;;;EAMf,QAAA;AAAA;;;;;;UAQe,iBAAA;EAAA,SACN,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,YAAA;EAC9B,IAAA;EACA,KAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA;EAawB;;;;;EAPxB,SAAA,IAAa,OAAA;EAAA,SAEJ,WAAA,EAAa,QAAA,CAAS,GAAA;EAX/B;EAAA,SAaS,QAAA,EAAU,QAAA,CAAS,GAAA;EAC5B,IAAA,CAAK,OAAA;EAAA,SAEI,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAA;AAAA;;;;;;;;;;;;;;;;iBAkBf,cAAA,CACd,QAAA,EAAU,gBAAA,CAAiB,gBAAA,sBAC3B,KAAA,EAAO,gBAAA,CAAiB,UAAA,eACxB,OAAA,GAAU,qBAAA,GACT,iBAAA"}
@@ -0,0 +1,212 @@
1
+ import { onScopeDispose, ref, toValue, watch } from "vue";
2
+ //#region src/use-video-player.ts
3
+ /**
4
+ * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.
5
+ *
6
+ * Vue idioms:
7
+ * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a
8
+ * getter. Pair with `<video ref="video" />` in the template, then
9
+ * pass the template ref straight in.
10
+ * - The composable never injects DOM nor overrides layout.
11
+ * - On scope disposal (or when `media` changes) the composable calls
12
+ * `media.revoke()` to free the object URL.
13
+ *
14
+ * @param videoRef - Reactive reference to the `<video>` element.
15
+ * @param media - Video handle from {@link useVideo}.
16
+ * @param options - Auto-play toggle.
17
+ */
18
+ function useVideoPlayer(videoRef, media, options) {
19
+ const autoPlay = options?.autoPlay ?? false;
20
+ const status = ref("idle");
21
+ const error = ref(void 0);
22
+ const currentTime = ref(0);
23
+ const duration = ref(void 0);
24
+ let shouldPlay = false;
25
+ let pendingResolve = null;
26
+ let pendingReject = null;
27
+ const resolvePending = () => {
28
+ const r = pendingResolve;
29
+ pendingResolve = null;
30
+ pendingReject = null;
31
+ r?.();
32
+ };
33
+ const rejectPending = (err) => {
34
+ const r = pendingReject;
35
+ pendingResolve = null;
36
+ pendingReject = null;
37
+ r?.(err);
38
+ };
39
+ watch(() => status.value, (s) => {
40
+ if (s === "finished" || s === "paused" || s === "idle") resolvePending();
41
+ else if (s === "error") rejectPending(error.value ?? /* @__PURE__ */ new Error("playback error"));
42
+ });
43
+ const getVideo = () => toValue(videoRef) ?? null;
44
+ const play = () => {
45
+ if (toValue(media) == null) return;
46
+ if (status.value === "error") return;
47
+ shouldPlay = true;
48
+ const video = getVideo();
49
+ if (video == null) {
50
+ status.value = "buffering";
51
+ return;
52
+ }
53
+ video.play().catch((err) => {
54
+ error.value = err;
55
+ status.value = "error";
56
+ });
57
+ };
58
+ const pause = () => {
59
+ shouldPlay = false;
60
+ getVideo()?.pause();
61
+ if (status.value === "playing" || status.value === "buffering") status.value = "paused";
62
+ };
63
+ const stop = () => {
64
+ shouldPlay = false;
65
+ const video = getVideo();
66
+ if (video != null) {
67
+ video.pause();
68
+ video.currentTime = 0;
69
+ }
70
+ currentTime.value = 0;
71
+ status.value = toValue(media) == null ? "idle" : "paused";
72
+ };
73
+ const reset = () => {
74
+ stop();
75
+ error.value = void 0;
76
+ duration.value = void 0;
77
+ status.value = "idle";
78
+ };
79
+ const toggle = () => {
80
+ if (status.value === "playing") pause();
81
+ else play();
82
+ };
83
+ const playToEnd = () => {
84
+ pendingResolve?.();
85
+ pendingResolve = null;
86
+ pendingReject = null;
87
+ return new Promise((resolve, reject) => {
88
+ pendingResolve = resolve;
89
+ pendingReject = reject;
90
+ play();
91
+ });
92
+ };
93
+ const seek = (seconds) => {
94
+ const video = getVideo();
95
+ if (video == null) return;
96
+ video.currentTime = seconds;
97
+ currentTime.value = seconds;
98
+ };
99
+ let detach = null;
100
+ const bind = (m, video) => {
101
+ error.value = void 0;
102
+ status.value = "buffering";
103
+ currentTime.value = 0;
104
+ duration.value = void 0;
105
+ let cancelled = false;
106
+ m.objectURL.then((resolved) => {
107
+ if (cancelled) return;
108
+ if (video == null) return;
109
+ video.src = resolved;
110
+ if (shouldPlay || autoPlay) video.play().catch((err) => {
111
+ error.value = err;
112
+ status.value = "error";
113
+ });
114
+ else status.value = "paused";
115
+ }, () => {
116
+ if (!cancelled) {
117
+ error.value = /* @__PURE__ */ new Error("media failed to materialise");
118
+ status.value = "error";
119
+ }
120
+ });
121
+ if (video == null) return () => {
122
+ cancelled = true;
123
+ try {
124
+ m.revoke();
125
+ } catch {}
126
+ };
127
+ const onPlay = () => {
128
+ if (status.value !== "error") status.value = "playing";
129
+ };
130
+ const onPause = () => {
131
+ if (video.ended) return;
132
+ if (status.value === "playing") status.value = "paused";
133
+ };
134
+ const onEnded = () => {
135
+ status.value = "finished";
136
+ };
137
+ const onTimeUpdate = () => {
138
+ currentTime.value = video.currentTime;
139
+ };
140
+ const onLoadedMetadata = () => {
141
+ if (Number.isFinite(video.duration)) duration.value = video.duration;
142
+ };
143
+ const onError = () => {
144
+ error.value = /* @__PURE__ */ new Error("HTMLVideoElement error");
145
+ status.value = "error";
146
+ };
147
+ video.addEventListener("play", onPlay);
148
+ video.addEventListener("pause", onPause);
149
+ video.addEventListener("ended", onEnded);
150
+ video.addEventListener("timeupdate", onTimeUpdate);
151
+ video.addEventListener("loadedmetadata", onLoadedMetadata);
152
+ video.addEventListener("error", onError);
153
+ return () => {
154
+ cancelled = true;
155
+ video.removeEventListener("play", onPlay);
156
+ video.removeEventListener("pause", onPause);
157
+ video.removeEventListener("ended", onEnded);
158
+ video.removeEventListener("timeupdate", onTimeUpdate);
159
+ video.removeEventListener("loadedmetadata", onLoadedMetadata);
160
+ video.removeEventListener("error", onError);
161
+ try {
162
+ video.pause();
163
+ video.removeAttribute("src");
164
+ video.load();
165
+ } catch {}
166
+ try {
167
+ m.revoke();
168
+ } catch {}
169
+ };
170
+ };
171
+ watch(() => [toValue(media), toValue(videoRef)], ([m, video]) => {
172
+ detach?.();
173
+ detach = null;
174
+ if (m == null) {
175
+ status.value = "idle";
176
+ error.value = void 0;
177
+ currentTime.value = 0;
178
+ duration.value = void 0;
179
+ return;
180
+ }
181
+ if (m.error != null) {
182
+ error.value = new Error(m.error.message);
183
+ status.value = "error";
184
+ return;
185
+ }
186
+ detach = bind(m, video ?? null);
187
+ }, {
188
+ immediate: true,
189
+ flush: "post"
190
+ });
191
+ onScopeDispose(() => {
192
+ detach?.();
193
+ detach = null;
194
+ });
195
+ return {
196
+ status,
197
+ play,
198
+ pause,
199
+ stop,
200
+ toggle,
201
+ reset,
202
+ playToEnd,
203
+ currentTime,
204
+ duration,
205
+ seek,
206
+ error
207
+ };
208
+ }
209
+ //#endregion
210
+ export { useVideoPlayer };
211
+
212
+ //# sourceMappingURL=use-video-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-video-player.js","names":[],"sources":["../src/use-video-player.ts"],"sourcesContent":["import {\n ref,\n watch,\n onScopeDispose,\n toValue,\n type MaybeRefOrGetter,\n type Ref,\n} from \"vue\";\nimport type { VideoMedia } from \"@langchain/langgraph-sdk/stream\";\nimport type { PlayerStatus } from \"./use-audio-player.js\";\n\n/** Options for {@link useVideoPlayer}. */\nexport interface UseVideoPlayerOptions {\n /**\n * Start playback as soon as the blob URL resolves. Subject to\n * browser autoplay policies — pair with `<video muted>` to bypass\n * the user-gesture requirement.\n */\n autoPlay?: boolean;\n}\n\n/**\n * Controls + live state returned by {@link useVideoPlayer}. Mirrors\n * {@link AudioPlayerHandle} on the shared subset so callers only ever\n * learn one shape.\n */\nexport interface VideoPlayerHandle {\n readonly status: Readonly<Ref<PlayerStatus>>;\n play(): void;\n pause(): void;\n stop(): void;\n toggle(): void;\n reset(): void;\n /**\n * Resolve on the next terminal transition (`finished` / `paused` /\n * `idle`). Reject on transitions to `\"error\"`. Triggers `play()`\n * when called.\n */\n playToEnd(): Promise<void>;\n\n readonly currentTime: Readonly<Ref<number>>;\n /** Total duration (seconds) once the element has parsed the blob. */\n readonly duration: Readonly<Ref<number | undefined>>;\n seek(seconds: number): void;\n\n readonly error: Readonly<Ref<Error | undefined>>;\n}\n\n/**\n * Bind a {@link VideoMedia} handle to a caller-owned `<video>` element.\n *\n * Vue idioms:\n * - `videoRef` accepts a raw `HTMLVideoElement`, a `Ref<...>`, or a\n * getter. Pair with `<video ref=\"video\" />` in the template, then\n * pass the template ref straight in.\n * - The composable never injects DOM nor overrides layout.\n * - On scope disposal (or when `media` changes) the composable calls\n * `media.revoke()` to free the object URL.\n *\n * @param videoRef - Reactive reference to the `<video>` element.\n * @param media - Video handle from {@link useVideo}.\n * @param options - Auto-play toggle.\n */\nexport function useVideoPlayer(\n videoRef: MaybeRefOrGetter<HTMLVideoElement | null | undefined>,\n media: MaybeRefOrGetter<VideoMedia | undefined>,\n options?: UseVideoPlayerOptions\n): VideoPlayerHandle {\n const autoPlay = options?.autoPlay ?? false;\n\n const status = ref<PlayerStatus>(\"idle\");\n const error = ref<Error | undefined>(undefined);\n const currentTime = ref(0);\n const duration = ref<number | undefined>(undefined);\n\n let shouldPlay = false;\n let pendingResolve: (() => void) | null = null;\n let pendingReject: ((err: Error) => void) | null = null;\n\n const resolvePending = () => {\n const r = pendingResolve;\n pendingResolve = null;\n pendingReject = null;\n r?.();\n };\n const rejectPending = (err: Error) => {\n const r = pendingReject;\n pendingResolve = null;\n pendingReject = null;\n r?.(err);\n };\n\n watch(\n () => status.value,\n (s) => {\n if (s === \"finished\" || s === \"paused\" || s === \"idle\") {\n resolvePending();\n } else if (s === \"error\") {\n rejectPending(error.value ?? new Error(\"playback error\"));\n }\n }\n );\n\n const getVideo = () => toValue(videoRef) ?? null;\n\n const play = () => {\n const m = toValue(media);\n if (m == null) return;\n if (status.value === \"error\") return;\n shouldPlay = true;\n const video = getVideo();\n if (video == null) {\n status.value = \"buffering\";\n return;\n }\n video.play().catch((err) => {\n error.value = err as Error;\n status.value = \"error\";\n });\n };\n\n const pause = () => {\n shouldPlay = false;\n getVideo()?.pause();\n if (status.value === \"playing\" || status.value === \"buffering\") {\n status.value = \"paused\";\n }\n };\n\n const stop = () => {\n shouldPlay = false;\n const video = getVideo();\n if (video != null) {\n video.pause();\n video.currentTime = 0;\n }\n currentTime.value = 0;\n status.value = toValue(media) == null ? \"idle\" : \"paused\";\n };\n\n const reset = () => {\n stop();\n error.value = undefined;\n duration.value = undefined;\n status.value = \"idle\";\n };\n\n const toggle = () => {\n if (status.value === \"playing\") pause();\n else play();\n };\n\n const playToEnd = (): Promise<void> => {\n pendingResolve?.();\n pendingResolve = null;\n pendingReject = null;\n return new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n play();\n });\n };\n\n const seek = (seconds: number) => {\n const video = getVideo();\n if (video == null) return;\n video.currentTime = seconds;\n currentTime.value = seconds;\n };\n\n // Teardown callbacks registered when we bind a media instance.\n let detach: (() => void) | null = null;\n\n const bind = (m: VideoMedia, video: HTMLVideoElement | null) => {\n error.value = undefined;\n status.value = \"buffering\";\n currentTime.value = 0;\n duration.value = undefined;\n\n let cancelled = false;\n\n m.objectURL.then(\n (resolved) => {\n if (cancelled) return;\n if (video == null) return;\n video.src = resolved;\n\n if (shouldPlay || autoPlay) {\n video.play().catch((err) => {\n error.value = err as Error;\n status.value = \"error\";\n });\n } else {\n status.value = \"paused\";\n }\n },\n () => {\n if (!cancelled) {\n error.value = new Error(\"media failed to materialise\");\n status.value = \"error\";\n }\n }\n );\n\n if (video == null) {\n return () => {\n cancelled = true;\n try {\n m.revoke();\n } catch {\n // best-effort\n }\n };\n }\n\n const onPlay = () => {\n if (status.value !== \"error\") status.value = \"playing\";\n };\n const onPause = () => {\n if (video.ended) return;\n if (status.value === \"playing\") status.value = \"paused\";\n };\n const onEnded = () => {\n status.value = \"finished\";\n };\n const onTimeUpdate = () => {\n currentTime.value = video.currentTime;\n };\n const onLoadedMetadata = () => {\n if (Number.isFinite(video.duration)) duration.value = video.duration;\n };\n const onError = () => {\n error.value = new Error(\"HTMLVideoElement error\");\n status.value = \"error\";\n };\n\n video.addEventListener(\"play\", onPlay);\n video.addEventListener(\"pause\", onPause);\n video.addEventListener(\"ended\", onEnded);\n video.addEventListener(\"timeupdate\", onTimeUpdate);\n video.addEventListener(\"loadedmetadata\", onLoadedMetadata);\n video.addEventListener(\"error\", onError);\n\n return () => {\n cancelled = true;\n video.removeEventListener(\"play\", onPlay);\n video.removeEventListener(\"pause\", onPause);\n video.removeEventListener(\"ended\", onEnded);\n video.removeEventListener(\"timeupdate\", onTimeUpdate);\n video.removeEventListener(\"loadedmetadata\", onLoadedMetadata);\n video.removeEventListener(\"error\", onError);\n try {\n video.pause();\n video.removeAttribute(\"src\");\n video.load();\n } catch {\n // best-effort\n }\n try {\n m.revoke();\n } catch {\n // best-effort\n }\n };\n };\n\n // Surface a media-level error immediately and (re)bind on change.\n watch(\n () => [toValue(media), toValue(videoRef)] as const,\n ([m, video]) => {\n detach?.();\n detach = null;\n\n if (m == null) {\n status.value = \"idle\";\n error.value = undefined;\n currentTime.value = 0;\n duration.value = undefined;\n return;\n }\n\n if (m.error != null) {\n error.value = new Error(m.error.message);\n status.value = \"error\";\n return;\n }\n\n detach = bind(m, video ?? null);\n },\n { immediate: true, flush: \"post\" }\n );\n\n onScopeDispose(() => {\n detach?.();\n detach = null;\n });\n\n return {\n status,\n play,\n pause,\n stop,\n toggle,\n reset,\n playToEnd,\n currentTime,\n duration,\n seek,\n error,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/vue",
3
- "version": "0.4.6",
3
+ "version": "1.0.0",
4
4
  "description": "Vue integration for LangGraph & LangChain",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -10,11 +10,13 @@
10
10
  "directory": "libs/sdk-vue"
11
11
  },
12
12
  "dependencies": {
13
- "@langchain/langgraph-sdk": "^1.8.10"
13
+ "@langchain/langgraph-sdk": "1.9.0"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@hono/node-server": "^1.19.13",
17
- "@langchain/core": "^1.1.40",
17
+ "@hono/node-ws": "^1.3.0",
18
+ "@langchain/core": "^1.1.44",
19
+ "@langchain/protocol": "^0.0.15",
18
20
  "@types/node": "^25.4.0",
19
21
  "@vitejs/plugin-vue": "^6.0.5",
20
22
  "@vitejs/plugin-vue-jsx": "^5.1.5",
@@ -22,19 +24,19 @@
22
24
  "@vitest/browser-webdriverio": "^4.0.18",
23
25
  "deepagents": "^1.8.3",
24
26
  "hono": "^4.12.14",
25
- "langchain": "^1.3.0",
27
+ "langchain": "^1.3.5",
26
28
  "typescript": "^5.9.3",
27
29
  "vitest": "^4.0.18",
28
30
  "vitest-browser-vue": "^2.1.0",
29
31
  "vue": "^3.5.31",
30
32
  "webdriverio": "^9.25.0",
31
33
  "zod": "^4.3.6",
32
- "@langchain/langgraph": "1.2.9",
33
- "@langchain/langgraph-api": "1.1.17",
34
- "@langchain/langgraph-checkpoint": "1.0.1"
34
+ "@langchain/langgraph": "1.3.0",
35
+ "@langchain/langgraph-api": "1.2.0",
36
+ "@langchain/langgraph-checkpoint": "1.0.2"
35
37
  },
36
38
  "peerDependencies": {
37
- "@langchain/core": "^1.1.27",
39
+ "@langchain/core": "^1.1.44",
38
40
  "vue": "^3.0.0"
39
41
  },
40
42
  "main": "./dist/index.js",