ai 3.3.6 → 3.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +13 -4
- package/dist/index.d.ts +13 -4
- package/dist/index.js +24 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
- package/rsc/dist/index.d.ts +186 -183
- package/rsc/dist/rsc-server.d.mts +185 -183
- package/rsc/dist/rsc-server.mjs +789 -786
- package/rsc/dist/rsc-server.mjs.map +1 -1
- package/rsc/dist/rsc-shared.d.mts +24 -22
- package/rsc/dist/rsc-shared.mjs +46 -60
- package/rsc/dist/rsc-shared.mjs.map +1 -1
@@ -1,27 +1,5 @@
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
2
2
|
|
3
|
-
type ServerWrappedAction<T = unknown> = (aiState: T, ...args: unknown[]) => Promise<[Promise<T>, unknown]>;
|
4
|
-
type ServerWrappedActions<T = unknown> = Record<string, ServerWrappedAction<T>>;
|
5
|
-
type InternalAIProviderProps<AIState = any, UIState = any> = {
|
6
|
-
children: React.ReactNode;
|
7
|
-
initialUIState: UIState;
|
8
|
-
initialAIState: AIState;
|
9
|
-
initialAIStatePatch: undefined | Promise<AIState>;
|
10
|
-
wrappedActions: ServerWrappedActions<AIState>;
|
11
|
-
wrappedSyncUIState?: ServerWrappedAction<AIState>;
|
12
|
-
};
|
13
|
-
type AIProviderProps<AIState = any, UIState = any, Actions = any> = {
|
14
|
-
children: React.ReactNode;
|
15
|
-
initialAIState?: AIState;
|
16
|
-
initialUIState?: UIState;
|
17
|
-
/** $ActionTypes is only added for type inference and is never used at runtime **/
|
18
|
-
$ActionTypes?: Actions;
|
19
|
-
};
|
20
|
-
type AIProvider<AIState = any, UIState = any, Actions = any> = (props: AIProviderProps<AIState, UIState, Actions>) => Promise<React.ReactElement>;
|
21
|
-
type InferAIState<T, Fallback> = T extends AIProvider<infer AIState, any, any> ? AIState : Fallback;
|
22
|
-
type InferUIState<T, Fallback> = T extends AIProvider<any, infer UIState, any> ? UIState : Fallback;
|
23
|
-
type InferActions<T, Fallback> = T extends AIProvider<any, any, infer Actions> ? Actions : Fallback;
|
24
|
-
type ValueOrUpdater<T> = T | ((current: T) => T);
|
25
3
|
declare const __internal_curr: unique symbol;
|
26
4
|
declare const __internal_error: unique symbol;
|
27
5
|
/**
|
@@ -64,6 +42,7 @@ type StreamableValue<T = any, E = any> = {
|
|
64
42
|
* This logs out 1, 2, 3 on console.
|
65
43
|
*/
|
66
44
|
declare function readStreamableValue<T = unknown>(streamableValue: StreamableValue<T>): AsyncIterable<T | undefined>;
|
45
|
+
|
67
46
|
/**
|
68
47
|
* `useStreamableValue` is a React hook that takes a streamable value created via the `createStreamableValue().value` API,
|
69
48
|
* and returns the current value, error, and pending state.
|
@@ -83,6 +62,29 @@ declare function readStreamableValue<T = unknown>(streamableValue: StreamableVal
|
|
83
62
|
*/
|
84
63
|
declare function useStreamableValue<T = unknown, Error = unknown>(streamableValue?: StreamableValue<T>): [data: T | undefined, error: Error | undefined, pending: boolean];
|
85
64
|
|
65
|
+
type ServerWrappedAction<T = unknown> = (aiState: T, ...args: unknown[]) => Promise<[Promise<T>, unknown]>;
|
66
|
+
type ServerWrappedActions<T = unknown> = Record<string, ServerWrappedAction<T>>;
|
67
|
+
type InternalAIProviderProps<AIState = any, UIState = any> = {
|
68
|
+
children: React.ReactNode;
|
69
|
+
initialUIState: UIState;
|
70
|
+
initialAIState: AIState;
|
71
|
+
initialAIStatePatch: undefined | Promise<AIState>;
|
72
|
+
wrappedActions: ServerWrappedActions<AIState>;
|
73
|
+
wrappedSyncUIState?: ServerWrappedAction<AIState>;
|
74
|
+
};
|
75
|
+
type AIProviderProps<AIState = any, UIState = any, Actions = any> = {
|
76
|
+
children: React.ReactNode;
|
77
|
+
initialAIState?: AIState;
|
78
|
+
initialUIState?: UIState;
|
79
|
+
/** $ActionTypes is only added for type inference and is never used at runtime **/
|
80
|
+
$ActionTypes?: Actions;
|
81
|
+
};
|
82
|
+
type AIProvider<AIState = any, UIState = any, Actions = any> = (props: AIProviderProps<AIState, UIState, Actions>) => Promise<React.ReactElement>;
|
83
|
+
type InferAIState<T, Fallback> = T extends AIProvider<infer AIState, any, any> ? AIState : Fallback;
|
84
|
+
type InferUIState<T, Fallback> = T extends AIProvider<any, infer UIState, any> ? UIState : Fallback;
|
85
|
+
type InferActions<T, Fallback> = T extends AIProvider<any, any, infer Actions> ? Actions : Fallback;
|
86
|
+
type ValueOrUpdater<T> = T | ((current: T) => T);
|
87
|
+
|
86
88
|
declare function InternalAIProvider({ children, initialUIState, initialAIState, initialAIStatePatch, wrappedActions, wrappedSyncUIState, }: InternalAIProviderProps): react_jsx_runtime.JSX.Element;
|
87
89
|
declare function useUIState<AI extends AIProvider = any>(): [InferUIState<AI, any>, (v: InferUIState<AI, any> | ((v_: InferUIState<AI, any>) => InferUIState<AI, any>)) => void];
|
88
90
|
declare function useAIState<AI extends AIProvider = any>(): [
|
package/rsc/dist/rsc-shared.mjs
CHANGED
@@ -1,106 +1,92 @@
|
|
1
1
|
"use client";
|
2
2
|
|
3
|
-
// rsc/
|
4
|
-
import { startTransition, useLayoutEffect, useState } from "react";
|
5
|
-
|
6
|
-
// rsc/constants.ts
|
3
|
+
// rsc/streamable-value/streamable-value.ts
|
7
4
|
var STREAMABLE_VALUE_TYPE = Symbol.for("ui.streamable.value");
|
8
|
-
var DEV_DEFAULT_STREAMABLE_WARNING_TIME = 15 * 1e3;
|
9
5
|
|
10
|
-
// rsc/
|
11
|
-
function hasReadableValueSignature(value) {
|
12
|
-
return !!(value && typeof value === "object" && "type" in value && value.type === STREAMABLE_VALUE_TYPE);
|
13
|
-
}
|
14
|
-
function assertStreamableValue(value) {
|
15
|
-
if (!hasReadableValueSignature(value)) {
|
16
|
-
throw new Error(
|
17
|
-
"Invalid value: this hook only accepts values created via `createStreamableValue`."
|
18
|
-
);
|
19
|
-
}
|
20
|
-
}
|
6
|
+
// rsc/streamable-value/is-streamable-value.ts
|
21
7
|
function isStreamableValue(value) {
|
22
|
-
|
23
|
-
|
8
|
+
return value != null && typeof value === "object" && "type" in value && value.type === STREAMABLE_VALUE_TYPE;
|
9
|
+
}
|
10
|
+
|
11
|
+
// rsc/streamable-value/read-streamable-value.tsx
|
12
|
+
function readStreamableValue(streamableValue) {
|
13
|
+
if (!isStreamableValue(streamableValue)) {
|
24
14
|
throw new Error(
|
25
15
|
"Invalid value: this hook only accepts values created via `createStreamableValue`."
|
26
16
|
);
|
27
17
|
}
|
28
|
-
return hasSignature;
|
29
|
-
}
|
30
|
-
function readStreamableValue(streamableValue) {
|
31
|
-
assertStreamableValue(streamableValue);
|
32
18
|
return {
|
33
19
|
[Symbol.asyncIterator]() {
|
34
20
|
let row = streamableValue;
|
35
|
-
let
|
36
|
-
let
|
37
|
-
let
|
21
|
+
let value = row.curr;
|
22
|
+
let isDone = false;
|
23
|
+
let isFirstIteration = true;
|
38
24
|
return {
|
39
25
|
async next() {
|
40
|
-
if (
|
41
|
-
return { value
|
26
|
+
if (isDone)
|
27
|
+
return { value, done: true };
|
42
28
|
row = await row;
|
43
|
-
if (
|
29
|
+
if (row.error !== void 0) {
|
44
30
|
throw row.error;
|
45
31
|
}
|
46
32
|
if ("curr" in row || row.diff) {
|
47
33
|
if (row.diff) {
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
curr = curr + row.diff[1];
|
56
|
-
}
|
57
|
-
break;
|
34
|
+
if (row.diff[0] === 0) {
|
35
|
+
if (typeof value !== "string") {
|
36
|
+
throw new Error(
|
37
|
+
"Invalid patch: can only append to string types. This is a bug in the AI SDK."
|
38
|
+
);
|
39
|
+
}
|
40
|
+
value = value + row.diff[1];
|
58
41
|
}
|
59
42
|
} else {
|
60
|
-
|
43
|
+
value = row.curr;
|
61
44
|
}
|
62
45
|
if (!row.next) {
|
63
|
-
|
64
|
-
return {
|
65
|
-
value: curr,
|
66
|
-
done: false
|
67
|
-
};
|
46
|
+
isDone = true;
|
47
|
+
return { value, done: false };
|
68
48
|
}
|
69
49
|
}
|
70
|
-
if (
|
71
|
-
return {
|
72
|
-
value: curr,
|
73
|
-
done: true
|
74
|
-
};
|
50
|
+
if (row.next === void 0) {
|
51
|
+
return { value, done: true };
|
75
52
|
}
|
76
53
|
row = row.next;
|
77
|
-
if (
|
78
|
-
|
79
|
-
if (
|
54
|
+
if (isFirstIteration) {
|
55
|
+
isFirstIteration = false;
|
56
|
+
if (value === void 0) {
|
80
57
|
return this.next();
|
81
58
|
}
|
82
59
|
}
|
83
|
-
return {
|
84
|
-
value: curr,
|
85
|
-
done: false
|
86
|
-
};
|
60
|
+
return { value, done: false };
|
87
61
|
}
|
88
62
|
};
|
89
63
|
}
|
90
64
|
};
|
91
65
|
}
|
66
|
+
|
67
|
+
// rsc/streamable-value/use-streamable-value.tsx
|
68
|
+
import { startTransition, useLayoutEffect, useState } from "react";
|
69
|
+
function checkStreamableValue(value) {
|
70
|
+
const hasSignature = isStreamableValue(value);
|
71
|
+
if (!hasSignature && value !== void 0) {
|
72
|
+
throw new Error(
|
73
|
+
"Invalid value: this hook only accepts values created via `createStreamableValue`."
|
74
|
+
);
|
75
|
+
}
|
76
|
+
return hasSignature;
|
77
|
+
}
|
92
78
|
function useStreamableValue(streamableValue) {
|
93
79
|
const [curr, setCurr] = useState(
|
94
|
-
|
80
|
+
checkStreamableValue(streamableValue) ? streamableValue.curr : void 0
|
95
81
|
);
|
96
82
|
const [error, setError] = useState(
|
97
|
-
|
83
|
+
checkStreamableValue(streamableValue) ? streamableValue.error : void 0
|
98
84
|
);
|
99
85
|
const [pending, setPending] = useState(
|
100
|
-
|
86
|
+
checkStreamableValue(streamableValue) ? !!streamableValue.next : false
|
101
87
|
);
|
102
88
|
useLayoutEffect(() => {
|
103
|
-
if (!
|
89
|
+
if (!checkStreamableValue(streamableValue))
|
104
90
|
return;
|
105
91
|
let cancelled = false;
|
106
92
|
const iterator = readStreamableValue(streamableValue);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../shared-client/streamable.tsx","../constants.ts","../shared-client/context.tsx","../../util/is-function.ts"],"sourcesContent":["import { startTransition, useLayoutEffect, useState } from 'react';\nimport { STREAMABLE_VALUE_TYPE } from '../constants';\nimport type { StreamableValue } from '../types';\n\nfunction hasReadableValueSignature(value: unknown): value is StreamableValue {\n return !!(\n value &&\n typeof value === 'object' &&\n 'type' in value &&\n value.type === STREAMABLE_VALUE_TYPE\n );\n}\n\nfunction assertStreamableValue(\n value: unknown,\n): asserts value is StreamableValue {\n if (!hasReadableValueSignature(value)) {\n throw new Error(\n 'Invalid value: this hook only accepts values created via `createStreamableValue`.',\n );\n }\n}\n\nfunction isStreamableValue(value: unknown): value is StreamableValue {\n const hasSignature = hasReadableValueSignature(value);\n\n if (!hasSignature && typeof value !== 'undefined') {\n throw new Error(\n 'Invalid value: this hook only accepts values created via `createStreamableValue`.',\n );\n }\n\n return hasSignature;\n}\n\n/**\n * `readStreamableValue` takes a streamable value created via the `createStreamableValue().value` API,\n * and returns an async iterator.\n *\n * ```js\n * // Inside your AI action:\n *\n * async function action() {\n * 'use server'\n * const streamable = createStreamableValue();\n *\n * streamable.update(1);\n * streamable.update(2);\n * streamable.done(3);\n * // ...\n * return streamable.value;\n * }\n * ```\n *\n * And to read the value:\n *\n * ```js\n * const streamableValue = await action()\n * for await (const v of readStreamableValue(streamableValue)) {\n * console.log(v)\n * }\n * ```\n *\n * This logs out 1, 2, 3 on console.\n */\nexport function readStreamableValue<T = unknown>(\n streamableValue: StreamableValue<T>,\n): AsyncIterable<T | undefined> {\n assertStreamableValue(streamableValue);\n\n return {\n [Symbol.asyncIterator]() {\n let row: StreamableValue<T> | Promise<StreamableValue<T>> =\n streamableValue;\n let curr = row.curr;\n let done = false;\n let initial = true;\n\n return {\n async next() {\n if (done) return { value: curr, done: true };\n\n row = await row;\n\n if (typeof row.error !== 'undefined') {\n throw row.error;\n }\n if ('curr' in row || row.diff) {\n if (row.diff) {\n switch (row.diff[0]) {\n case 0:\n if (typeof curr !== 'string') {\n throw new Error(\n 'Invalid patch: can only append to string types. This is a bug in the AI SDK.',\n );\n } else {\n (curr as string) = curr + row.diff[1];\n }\n break;\n }\n } else {\n curr = row.curr;\n }\n\n // The last emitted { done: true } won't be used as the value\n // by the for await...of syntax.\n if (!row.next) {\n done = true;\n return {\n value: curr,\n done: false,\n };\n }\n }\n\n if (!row.next) {\n return {\n value: curr,\n done: true,\n };\n }\n\n row = row.next;\n if (initial) {\n initial = false;\n if (typeof curr === 'undefined') {\n // This is the initial chunk and there isn't an initial value yet.\n // Let's skip this one.\n return this.next();\n }\n }\n\n return {\n value: curr,\n done: false,\n };\n },\n };\n },\n };\n}\n\n/**\n * `useStreamableValue` is a React hook that takes a streamable value created via the `createStreamableValue().value` API,\n * and returns the current value, error, and pending state.\n *\n * This is useful for consuming streamable values received from a component's props. For example:\n *\n * ```js\n * function MyComponent({ streamableValue }) {\n * const [data, error, pending] = useStreamableValue(streamableValue);\n *\n * if (pending) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return <div>Data: {data}</div>;\n * }\n * ```\n */\nexport function useStreamableValue<T = unknown, Error = unknown>(\n streamableValue?: StreamableValue<T>,\n): [data: T | undefined, error: Error | undefined, pending: boolean] {\n const [curr, setCurr] = useState<T | undefined>(\n isStreamableValue(streamableValue) ? streamableValue.curr : undefined,\n );\n const [error, setError] = useState<Error | undefined>(\n isStreamableValue(streamableValue) ? streamableValue.error : undefined,\n );\n const [pending, setPending] = useState<boolean>(\n isStreamableValue(streamableValue) ? !!streamableValue.next : false,\n );\n\n useLayoutEffect(() => {\n if (!isStreamableValue(streamableValue)) return;\n\n let cancelled = false;\n\n const iterator = readStreamableValue(streamableValue);\n if (streamableValue.next) {\n startTransition(() => {\n if (cancelled) return;\n setPending(true);\n });\n }\n\n (async () => {\n try {\n for await (const value of iterator) {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setCurr(value);\n });\n }\n } catch (e) {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setError(e as Error);\n });\n } finally {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setPending(false);\n });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [streamableValue]);\n\n return [curr, error, pending];\n}\n","export const STREAMABLE_VALUE_TYPE = Symbol.for('ui.streamable.value');\nexport const DEV_DEFAULT_STREAMABLE_WARNING_TIME = 15 * 1000;\n","/* eslint-disable react-hooks/exhaustive-deps */\n'use client';\n\nimport * as React from 'react';\n\nimport * as jsondiffpatch from 'jsondiffpatch';\nimport { isFunction } from '../../util/is-function';\nimport type {\n AIProvider,\n InferActions,\n InferAIState,\n InferUIState,\n InternalAIProviderProps,\n ValueOrUpdater,\n} from '../types';\n\nconst InternalUIStateProvider = React.createContext<null | any>(null);\nconst InternalAIStateProvider = React.createContext<undefined | any>(undefined);\nconst InternalActionProvider = React.createContext<null | any>(null);\nconst InternalSyncUIStateProvider = React.createContext<null | any>(null);\n\nexport function InternalAIProvider({\n children,\n initialUIState,\n initialAIState,\n initialAIStatePatch,\n wrappedActions,\n wrappedSyncUIState,\n}: InternalAIProviderProps) {\n if (!('use' in React)) {\n throw new Error('Unsupported React version.');\n }\n\n const uiState = React.useState(initialUIState);\n const setUIState = uiState[1];\n\n const resolvedInitialAIStatePatch = initialAIStatePatch\n ? (React as any).use(initialAIStatePatch)\n : undefined;\n initialAIState = React.useMemo(() => {\n if (resolvedInitialAIStatePatch) {\n return jsondiffpatch.patch(\n jsondiffpatch.clone(initialAIState),\n resolvedInitialAIStatePatch,\n );\n }\n return initialAIState;\n }, [initialAIState, resolvedInitialAIStatePatch]);\n\n const aiState = React.useState(initialAIState);\n const setAIState = aiState[1];\n const aiStateRef = React.useRef(aiState[0]);\n\n React.useEffect(() => {\n aiStateRef.current = aiState[0];\n }, [aiState[0]]);\n\n const clientWrappedActions = React.useMemo(\n () =>\n Object.fromEntries(\n Object.entries(wrappedActions).map(([key, action]) => [\n key,\n async (...args: any) => {\n const aiStateSnapshot = aiStateRef.current;\n const [aiStateDelta, result] = await action(\n aiStateSnapshot,\n ...args,\n );\n (async () => {\n const delta = await aiStateDelta;\n if (delta !== undefined) {\n aiState[1](\n jsondiffpatch.patch(\n jsondiffpatch.clone(aiStateSnapshot),\n delta,\n ),\n );\n }\n })();\n return result;\n },\n ]),\n ),\n [wrappedActions],\n );\n\n const clientWrappedSyncUIStateAction = React.useMemo(() => {\n if (!wrappedSyncUIState) {\n return () => {};\n }\n\n return async () => {\n const aiStateSnapshot = aiStateRef.current;\n const [aiStateDelta, uiState] = await wrappedSyncUIState!(\n aiStateSnapshot,\n );\n\n if (uiState !== undefined) {\n setUIState(uiState);\n }\n\n const delta = await aiStateDelta;\n if (delta !== undefined) {\n const patchedAiState = jsondiffpatch.patch(\n jsondiffpatch.clone(aiStateSnapshot),\n delta,\n );\n setAIState(patchedAiState);\n }\n };\n }, [wrappedSyncUIState]);\n\n return (\n <InternalAIStateProvider.Provider value={aiState}>\n <InternalUIStateProvider.Provider value={uiState}>\n <InternalActionProvider.Provider value={clientWrappedActions}>\n <InternalSyncUIStateProvider.Provider\n value={clientWrappedSyncUIStateAction}\n >\n {children}\n </InternalSyncUIStateProvider.Provider>\n </InternalActionProvider.Provider>\n </InternalUIStateProvider.Provider>\n </InternalAIStateProvider.Provider>\n );\n}\n\nexport function useUIState<AI extends AIProvider = any>() {\n type T = InferUIState<AI, any>;\n\n const state = React.useContext<\n [T, (v: T | ((v_: T) => T)) => void] | null | undefined\n >(InternalUIStateProvider);\n if (state === null) {\n throw new Error('`useUIState` must be used inside an <AI> provider.');\n }\n if (!Array.isArray(state)) {\n throw new Error('Invalid state');\n }\n if (state[0] === undefined) {\n throw new Error(\n '`initialUIState` must be provided to `createAI` or `<AI>`',\n );\n }\n return state;\n}\n\n// TODO: How do we avoid causing a re-render when the AI state changes but you\n// are only listening to a specific key? We need useSES perhaps?\nfunction useAIState<AI extends AIProvider = any>(): [\n InferAIState<AI, any>,\n (newState: ValueOrUpdater<InferAIState<AI, any>>) => void,\n];\nfunction useAIState<AI extends AIProvider = any>(\n key: keyof InferAIState<AI, any>,\n): [\n InferAIState<AI, any>[typeof key],\n (newState: ValueOrUpdater<InferAIState<AI, any>[typeof key]>) => void,\n];\nfunction useAIState<AI extends AIProvider = any>(\n ...args: [] | [keyof InferAIState<AI, any>]\n) {\n type T = InferAIState<AI, any>;\n\n const state = React.useContext<\n [T, (newState: ValueOrUpdater<T>) => void] | null | undefined\n >(InternalAIStateProvider);\n if (state === null) {\n throw new Error('`useAIState` must be used inside an <AI> provider.');\n }\n if (!Array.isArray(state)) {\n throw new Error('Invalid state');\n }\n if (state[0] === undefined) {\n throw new Error(\n '`initialAIState` must be provided to `createAI` or `<AI>`',\n );\n }\n if (args.length >= 1 && typeof state[0] !== 'object') {\n throw new Error(\n 'When using `useAIState` with a key, the AI state must be an object.',\n );\n }\n\n const key = args[0];\n const setter = React.useCallback(\n typeof key === 'undefined'\n ? state[1]\n : (newState: ValueOrUpdater<T>) => {\n if (isFunction(newState)) {\n return state[1](s => {\n return { ...s, [key]: newState(s[key]) };\n });\n } else {\n return state[1]({ ...state[0], [key]: newState });\n }\n },\n [key],\n );\n\n if (args.length === 0) {\n return state;\n } else {\n return [state[0][args[0]], setter];\n }\n}\n\nexport function useActions<AI extends AIProvider = any>() {\n type T = InferActions<AI, any>;\n\n const actions = React.useContext<T>(InternalActionProvider);\n return actions;\n}\n\nexport function useSyncUIState() {\n const syncUIState = React.useContext<() => Promise<void>>(\n InternalSyncUIStateProvider,\n );\n\n if (syncUIState === null) {\n throw new Error('`useSyncUIState` must be used inside an <AI> provider.');\n }\n\n return syncUIState;\n}\n\nexport { useAIState };\n","/**\n * Checks if the given value is a function.\n *\n * @param {unknown} value - The value to check.\n * @returns {boolean} True if the value is a function, false otherwise.\n */\nexport const isFunction = (value: unknown): value is Function =>\n typeof value === 'function';\n"],"mappings":"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","names":["uiState"]}
|
1
|
+
{"version":3,"sources":["../streamable-value/streamable-value.ts","../streamable-value/is-streamable-value.ts","../streamable-value/read-streamable-value.tsx","../streamable-value/use-streamable-value.tsx","../shared-client/context.tsx","../../util/is-function.ts"],"sourcesContent":["export const STREAMABLE_VALUE_TYPE = Symbol.for('ui.streamable.value');\n\nexport type StreamablePatch = undefined | [0, string]; // Append string.\n\ndeclare const __internal_curr: unique symbol;\ndeclare const __internal_error: unique symbol;\n\n/**\n * StreamableValue is a value that can be streamed over the network via AI Actions.\n * To read the streamed values, use the `readStreamableValue` or `useStreamableValue` APIs.\n */\nexport type StreamableValue<T = any, E = any> = {\n /**\n * @internal Use `readStreamableValue` to read the values.\n */\n type?: typeof STREAMABLE_VALUE_TYPE;\n /**\n * @internal Use `readStreamableValue` to read the values.\n */\n curr?: T;\n /**\n * @internal Use `readStreamableValue` to read the values.\n */\n error?: E;\n /**\n * @internal Use `readStreamableValue` to read the values.\n */\n diff?: StreamablePatch;\n /**\n * @internal Use `readStreamableValue` to read the values.\n */\n next?: Promise<StreamableValue<T, E>>;\n\n // branded types to maintain type signature after internal properties are stripped.\n [__internal_curr]?: T;\n [__internal_error]?: E;\n};\n","import { STREAMABLE_VALUE_TYPE, StreamableValue } from './streamable-value';\n\nexport function isStreamableValue(value: unknown): value is StreamableValue {\n return (\n value != null &&\n typeof value === 'object' &&\n 'type' in value &&\n value.type === STREAMABLE_VALUE_TYPE\n );\n}\n","import { isStreamableValue } from './is-streamable-value';\nimport { StreamableValue } from './streamable-value';\n\n/**\n * `readStreamableValue` takes a streamable value created via the `createStreamableValue().value` API,\n * and returns an async iterator.\n *\n * ```js\n * // Inside your AI action:\n *\n * async function action() {\n * 'use server'\n * const streamable = createStreamableValue();\n *\n * streamable.update(1);\n * streamable.update(2);\n * streamable.done(3);\n * // ...\n * return streamable.value;\n * }\n * ```\n *\n * And to read the value:\n *\n * ```js\n * const streamableValue = await action()\n * for await (const v of readStreamableValue(streamableValue)) {\n * console.log(v)\n * }\n * ```\n *\n * This logs out 1, 2, 3 on console.\n */\nexport function readStreamableValue<T = unknown>(\n streamableValue: StreamableValue<T>,\n): AsyncIterable<T | undefined> {\n if (!isStreamableValue(streamableValue)) {\n throw new Error(\n 'Invalid value: this hook only accepts values created via `createStreamableValue`.',\n );\n }\n\n return {\n [Symbol.asyncIterator]() {\n let row: StreamableValue<T> | Promise<StreamableValue<T>> =\n streamableValue;\n let value = row.curr; // the current value\n let isDone = false;\n let isFirstIteration = true;\n\n return {\n async next() {\n // the iteration is done already, return the last value:\n if (isDone) return { value, done: true };\n\n // resolve the promise at the beginning of each iteration:\n row = await row;\n\n // throw error if any:\n if (row.error !== undefined) {\n throw row.error;\n }\n\n // if there is a value or a patch, use it:\n if ('curr' in row || row.diff) {\n if (row.diff) {\n // streamable patch (text only):\n if (row.diff[0] === 0) {\n if (typeof value !== 'string') {\n throw new Error(\n 'Invalid patch: can only append to string types. This is a bug in the AI SDK.',\n );\n }\n\n // casting required to remove T & string limitation\n (value as string) = value + row.diff[1];\n }\n } else {\n // replace the value (full new value)\n value = row.curr;\n }\n\n // The last emitted { done: true } won't be used as the value\n // by the for await...of syntax.\n if (!row.next) {\n isDone = true;\n return { value, done: false };\n }\n }\n\n // there are no further rows to iterate over:\n if (row.next === undefined) {\n return { value, done: true };\n }\n\n row = row.next;\n\n if (isFirstIteration) {\n isFirstIteration = false; // TODO should this be set for every return?\n\n if (value === undefined) {\n // This is the initial chunk and there isn't an initial value yet.\n // Let's skip this one.\n return this.next();\n }\n }\n\n return { value, done: false };\n },\n };\n },\n };\n}\n","import { startTransition, useLayoutEffect, useState } from 'react';\nimport { readStreamableValue } from './read-streamable-value';\nimport { StreamableValue } from './streamable-value';\nimport { isStreamableValue } from './is-streamable-value';\n\nfunction checkStreamableValue(value: unknown): value is StreamableValue {\n const hasSignature = isStreamableValue(value);\n\n if (!hasSignature && value !== undefined) {\n throw new Error(\n 'Invalid value: this hook only accepts values created via `createStreamableValue`.',\n );\n }\n\n return hasSignature;\n}\n\n/**\n * `useStreamableValue` is a React hook that takes a streamable value created via the `createStreamableValue().value` API,\n * and returns the current value, error, and pending state.\n *\n * This is useful for consuming streamable values received from a component's props. For example:\n *\n * ```js\n * function MyComponent({ streamableValue }) {\n * const [data, error, pending] = useStreamableValue(streamableValue);\n *\n * if (pending) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return <div>Data: {data}</div>;\n * }\n * ```\n */\nexport function useStreamableValue<T = unknown, Error = unknown>(\n streamableValue?: StreamableValue<T>,\n): [data: T | undefined, error: Error | undefined, pending: boolean] {\n const [curr, setCurr] = useState<T | undefined>(\n checkStreamableValue(streamableValue) ? streamableValue.curr : undefined,\n );\n const [error, setError] = useState<Error | undefined>(\n checkStreamableValue(streamableValue) ? streamableValue.error : undefined,\n );\n const [pending, setPending] = useState<boolean>(\n checkStreamableValue(streamableValue) ? !!streamableValue.next : false,\n );\n\n useLayoutEffect(() => {\n if (!checkStreamableValue(streamableValue)) return;\n\n let cancelled = false;\n\n const iterator = readStreamableValue(streamableValue);\n if (streamableValue.next) {\n startTransition(() => {\n if (cancelled) return;\n setPending(true);\n });\n }\n\n (async () => {\n try {\n for await (const value of iterator) {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setCurr(value);\n });\n }\n } catch (e) {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setError(e as Error);\n });\n } finally {\n if (cancelled) return;\n startTransition(() => {\n if (cancelled) return;\n setPending(false);\n });\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [streamableValue]);\n\n return [curr, error, pending];\n}\n","/* eslint-disable react-hooks/exhaustive-deps */\n'use client';\n\nimport * as React from 'react';\n\nimport * as jsondiffpatch from 'jsondiffpatch';\nimport { isFunction } from '../../util/is-function';\nimport type {\n AIProvider,\n InferActions,\n InferAIState,\n InferUIState,\n InternalAIProviderProps,\n ValueOrUpdater,\n} from '../types';\n\nconst InternalUIStateProvider = React.createContext<null | any>(null);\nconst InternalAIStateProvider = React.createContext<undefined | any>(undefined);\nconst InternalActionProvider = React.createContext<null | any>(null);\nconst InternalSyncUIStateProvider = React.createContext<null | any>(null);\n\nexport function InternalAIProvider({\n children,\n initialUIState,\n initialAIState,\n initialAIStatePatch,\n wrappedActions,\n wrappedSyncUIState,\n}: InternalAIProviderProps) {\n if (!('use' in React)) {\n throw new Error('Unsupported React version.');\n }\n\n const uiState = React.useState(initialUIState);\n const setUIState = uiState[1];\n\n const resolvedInitialAIStatePatch = initialAIStatePatch\n ? (React as any).use(initialAIStatePatch)\n : undefined;\n initialAIState = React.useMemo(() => {\n if (resolvedInitialAIStatePatch) {\n return jsondiffpatch.patch(\n jsondiffpatch.clone(initialAIState),\n resolvedInitialAIStatePatch,\n );\n }\n return initialAIState;\n }, [initialAIState, resolvedInitialAIStatePatch]);\n\n const aiState = React.useState(initialAIState);\n const setAIState = aiState[1];\n const aiStateRef = React.useRef(aiState[0]);\n\n React.useEffect(() => {\n aiStateRef.current = aiState[0];\n }, [aiState[0]]);\n\n const clientWrappedActions = React.useMemo(\n () =>\n Object.fromEntries(\n Object.entries(wrappedActions).map(([key, action]) => [\n key,\n async (...args: any) => {\n const aiStateSnapshot = aiStateRef.current;\n const [aiStateDelta, result] = await action(\n aiStateSnapshot,\n ...args,\n );\n (async () => {\n const delta = await aiStateDelta;\n if (delta !== undefined) {\n aiState[1](\n jsondiffpatch.patch(\n jsondiffpatch.clone(aiStateSnapshot),\n delta,\n ),\n );\n }\n })();\n return result;\n },\n ]),\n ),\n [wrappedActions],\n );\n\n const clientWrappedSyncUIStateAction = React.useMemo(() => {\n if (!wrappedSyncUIState) {\n return () => {};\n }\n\n return async () => {\n const aiStateSnapshot = aiStateRef.current;\n const [aiStateDelta, uiState] = await wrappedSyncUIState!(\n aiStateSnapshot,\n );\n\n if (uiState !== undefined) {\n setUIState(uiState);\n }\n\n const delta = await aiStateDelta;\n if (delta !== undefined) {\n const patchedAiState = jsondiffpatch.patch(\n jsondiffpatch.clone(aiStateSnapshot),\n delta,\n );\n setAIState(patchedAiState);\n }\n };\n }, [wrappedSyncUIState]);\n\n return (\n <InternalAIStateProvider.Provider value={aiState}>\n <InternalUIStateProvider.Provider value={uiState}>\n <InternalActionProvider.Provider value={clientWrappedActions}>\n <InternalSyncUIStateProvider.Provider\n value={clientWrappedSyncUIStateAction}\n >\n {children}\n </InternalSyncUIStateProvider.Provider>\n </InternalActionProvider.Provider>\n </InternalUIStateProvider.Provider>\n </InternalAIStateProvider.Provider>\n );\n}\n\nexport function useUIState<AI extends AIProvider = any>() {\n type T = InferUIState<AI, any>;\n\n const state = React.useContext<\n [T, (v: T | ((v_: T) => T)) => void] | null | undefined\n >(InternalUIStateProvider);\n if (state === null) {\n throw new Error('`useUIState` must be used inside an <AI> provider.');\n }\n if (!Array.isArray(state)) {\n throw new Error('Invalid state');\n }\n if (state[0] === undefined) {\n throw new Error(\n '`initialUIState` must be provided to `createAI` or `<AI>`',\n );\n }\n return state;\n}\n\n// TODO: How do we avoid causing a re-render when the AI state changes but you\n// are only listening to a specific key? We need useSES perhaps?\nfunction useAIState<AI extends AIProvider = any>(): [\n InferAIState<AI, any>,\n (newState: ValueOrUpdater<InferAIState<AI, any>>) => void,\n];\nfunction useAIState<AI extends AIProvider = any>(\n key: keyof InferAIState<AI, any>,\n): [\n InferAIState<AI, any>[typeof key],\n (newState: ValueOrUpdater<InferAIState<AI, any>[typeof key]>) => void,\n];\nfunction useAIState<AI extends AIProvider = any>(\n ...args: [] | [keyof InferAIState<AI, any>]\n) {\n type T = InferAIState<AI, any>;\n\n const state = React.useContext<\n [T, (newState: ValueOrUpdater<T>) => void] | null | undefined\n >(InternalAIStateProvider);\n if (state === null) {\n throw new Error('`useAIState` must be used inside an <AI> provider.');\n }\n if (!Array.isArray(state)) {\n throw new Error('Invalid state');\n }\n if (state[0] === undefined) {\n throw new Error(\n '`initialAIState` must be provided to `createAI` or `<AI>`',\n );\n }\n if (args.length >= 1 && typeof state[0] !== 'object') {\n throw new Error(\n 'When using `useAIState` with a key, the AI state must be an object.',\n );\n }\n\n const key = args[0];\n const setter = React.useCallback(\n typeof key === 'undefined'\n ? state[1]\n : (newState: ValueOrUpdater<T>) => {\n if (isFunction(newState)) {\n return state[1](s => {\n return { ...s, [key]: newState(s[key]) };\n });\n } else {\n return state[1]({ ...state[0], [key]: newState });\n }\n },\n [key],\n );\n\n if (args.length === 0) {\n return state;\n } else {\n return [state[0][args[0]], setter];\n }\n}\n\nexport function useActions<AI extends AIProvider = any>() {\n type T = InferActions<AI, any>;\n\n const actions = React.useContext<T>(InternalActionProvider);\n return actions;\n}\n\nexport function useSyncUIState() {\n const syncUIState = React.useContext<() => Promise<void>>(\n InternalSyncUIStateProvider,\n );\n\n if (syncUIState === null) {\n throw new Error('`useSyncUIState` must be used inside an <AI> provider.');\n }\n\n return syncUIState;\n}\n\nexport { useAIState };\n","/**\n * Checks if the given value is a function.\n *\n * @param {unknown} value - The value to check.\n * @returns {boolean} True if the value is a function, false otherwise.\n */\nexport const isFunction = (value: unknown): value is Function =>\n typeof value === 'function';\n"],"mappings":";;;AAAO,IAAM,wBAAwB,OAAO,IAAI,qBAAqB;;;ACE9D,SAAS,kBAAkB,OAA0C;AAC1E,SACE,SAAS,QACT,OAAO,UAAU,YACjB,UAAU,SACV,MAAM,SAAS;AAEnB;;;ACwBO,SAAS,oBACd,iBAC8B;AAC9B,MAAI,CAAC,kBAAkB,eAAe,GAAG;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,IAAI;AACvB,UAAI,MACF;AACF,UAAI,QAAQ,IAAI;AAChB,UAAI,SAAS;AACb,UAAI,mBAAmB;AAEvB,aAAO;AAAA,QACL,MAAM,OAAO;AAEX,cAAI;AAAQ,mBAAO,EAAE,OAAO,MAAM,KAAK;AAGvC,gBAAM,MAAM;AAGZ,cAAI,IAAI,UAAU,QAAW;AAC3B,kBAAM,IAAI;AAAA,UACZ;AAGA,cAAI,UAAU,OAAO,IAAI,MAAM;AAC7B,gBAAI,IAAI,MAAM;AAEZ,kBAAI,IAAI,KAAK,CAAC,MAAM,GAAG;AACrB,oBAAI,OAAO,UAAU,UAAU;AAC7B,wBAAM,IAAI;AAAA,oBACR;AAAA,kBACF;AAAA,gBACF;AAGA,gBAAC,QAAmB,QAAQ,IAAI,KAAK,CAAC;AAAA,cACxC;AAAA,YACF,OAAO;AAEL,sBAAQ,IAAI;AAAA,YACd;AAIA,gBAAI,CAAC,IAAI,MAAM;AACb,uBAAS;AACT,qBAAO,EAAE,OAAO,MAAM,MAAM;AAAA,YAC9B;AAAA,UACF;AAGA,cAAI,IAAI,SAAS,QAAW;AAC1B,mBAAO,EAAE,OAAO,MAAM,KAAK;AAAA,UAC7B;AAEA,gBAAM,IAAI;AAEV,cAAI,kBAAkB;AACpB,+BAAmB;AAEnB,gBAAI,UAAU,QAAW;AAGvB,qBAAO,KAAK,KAAK;AAAA,YACnB;AAAA,UACF;AAEA,iBAAO,EAAE,OAAO,MAAM,MAAM;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChHA,SAAS,iBAAiB,iBAAiB,gBAAgB;AAK3D,SAAS,qBAAqB,OAA0C;AACtE,QAAM,eAAe,kBAAkB,KAAK;AAE5C,MAAI,CAAC,gBAAgB,UAAU,QAAW;AACxC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAmBO,SAAS,mBACd,iBACmE;AACnE,QAAM,CAAC,MAAM,OAAO,IAAI;AAAA,IACtB,qBAAqB,eAAe,IAAI,gBAAgB,OAAO;AAAA,EACjE;AACA,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxB,qBAAqB,eAAe,IAAI,gBAAgB,QAAQ;AAAA,EAClE;AACA,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAC5B,qBAAqB,eAAe,IAAI,CAAC,CAAC,gBAAgB,OAAO;AAAA,EACnE;AAEA,kBAAgB,MAAM;AACpB,QAAI,CAAC,qBAAqB,eAAe;AAAG;AAE5C,QAAI,YAAY;AAEhB,UAAM,WAAW,oBAAoB,eAAe;AACpD,QAAI,gBAAgB,MAAM;AACxB,sBAAgB,MAAM;AACpB,YAAI;AAAW;AACf,mBAAW,IAAI;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,KAAC,YAAY;AACX,UAAI;AACF,yBAAiB,SAAS,UAAU;AAClC,cAAI;AAAW;AACf,0BAAgB,MAAM;AACpB,gBAAI;AAAW;AACf,oBAAQ,KAAK;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF,SAAS,GAAG;AACV,YAAI;AAAW;AACf,wBAAgB,MAAM;AACpB,cAAI;AAAW;AACf,mBAAS,CAAU;AAAA,QACrB,CAAC;AAAA,MACH,UAAE;AACA,YAAI;AAAW;AACf,wBAAgB,MAAM;AACpB,cAAI;AAAW;AACf,qBAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,SAAO,CAAC,MAAM,OAAO,OAAO;AAC9B;;;ACvFA,YAAY,WAAW;AAEvB,YAAY,mBAAmB;;;ACCxB,IAAM,aAAa,CAAC,UACzB,OAAO,UAAU;;;AD6GT;AApGV,IAAM,0BAAgC,oBAA0B,IAAI;AACpE,IAAM,0BAAgC,oBAA+B,MAAS;AAC9E,IAAM,yBAA+B,oBAA0B,IAAI;AACnE,IAAM,8BAAoC,oBAA0B,IAAI;AAEjE,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,MAAI,EAAE,SAAS,QAAQ;AACrB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,UAAgB,eAAS,cAAc;AAC7C,QAAM,aAAa,QAAQ,CAAC;AAE5B,QAAM,8BAA8B,sBACjB,UAAI,mBAAmB,IACtC;AACJ,mBAAuB,cAAQ,MAAM;AACnC,QAAI,6BAA6B;AAC/B,aAAqB;AAAA,QACL,oBAAM,cAAc;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,2BAA2B,CAAC;AAEhD,QAAM,UAAgB,eAAS,cAAc;AAC7C,QAAM,aAAa,QAAQ,CAAC;AAC5B,QAAM,aAAmB,aAAO,QAAQ,CAAC,CAAC;AAE1C,EAAM,gBAAU,MAAM;AACpB,eAAW,UAAU,QAAQ,CAAC;AAAA,EAChC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEf,QAAM,uBAA6B;AAAA,IACjC,MACE,OAAO;AAAA,MACL,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM;AAAA,QACpD;AAAA,QACA,UAAU,SAAc;AACtB,gBAAM,kBAAkB,WAAW;AACnC,gBAAM,CAAC,cAAc,MAAM,IAAI,MAAM;AAAA,YACnC;AAAA,YACA,GAAG;AAAA,UACL;AACA,WAAC,YAAY;AACX,kBAAM,QAAQ,MAAM;AACpB,gBAAI,UAAU,QAAW;AACvB,sBAAQ,CAAC;AAAA,gBACO;AAAA,kBACE,oBAAM,eAAe;AAAA,kBACnC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,GAAG;AACH,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,iCAAuC,cAAQ,MAAM;AACzD,QAAI,CAAC,oBAAoB;AACvB,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAEA,WAAO,YAAY;AACjB,YAAM,kBAAkB,WAAW;AACnC,YAAM,CAAC,cAAcA,QAAO,IAAI,MAAM;AAAA,QACpC;AAAA,MACF;AAEA,UAAIA,aAAY,QAAW;AACzB,mBAAWA,QAAO;AAAA,MACpB;AAEA,YAAM,QAAQ,MAAM;AACpB,UAAI,UAAU,QAAW;AACvB,cAAM,iBAA+B;AAAA,UACrB,oBAAM,eAAe;AAAA,UACnC;AAAA,QACF;AACA,mBAAW,cAAc;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,kBAAkB,CAAC;AAEvB,SACE,oBAAC,wBAAwB,UAAxB,EAAiC,OAAO,SACvC,8BAAC,wBAAwB,UAAxB,EAAiC,OAAO,SACvC,8BAAC,uBAAuB,UAAvB,EAAgC,OAAO,sBACtC;AAAA,IAAC,4BAA4B;AAAA,IAA5B;AAAA,MACC,OAAO;AAAA,MAEN;AAAA;AAAA,EACH,GACF,GACF,GACF;AAEJ;AAEO,SAAS,aAA0C;AAGxD,QAAM,QAAc,iBAElB,uBAAuB;AACzB,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AACA,MAAI,MAAM,CAAC,MAAM,QAAW;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAcA,SAAS,cACJ,MACH;AAGA,QAAM,QAAc,iBAElB,uBAAuB;AACzB,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AACA,MAAI,MAAM,CAAC,MAAM,QAAW;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,UAAU;AACpD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,CAAC;AAClB,QAAM,SAAe;AAAA,IACnB,OAAO,QAAQ,cACX,MAAM,CAAC,IACP,CAAC,aAAgC;AAC/B,UAAI,WAAW,QAAQ,GAAG;AACxB,eAAO,MAAM,CAAC,EAAE,OAAK;AACnB,iBAAO,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE;AAAA,QACzC,CAAC;AAAA,MACH,OAAO;AACL,eAAO,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACJ,CAAC,GAAG;AAAA,EACN;AAEA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT,OAAO;AACL,WAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,EACnC;AACF;AAEO,SAAS,aAA0C;AAGxD,QAAM,UAAgB,iBAAc,sBAAsB;AAC1D,SAAO;AACT;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAoB;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,SAAO;AACT;","names":["uiState"]}
|