🚀. Socket Launch Week Day 2:Introducing Manifest Alerts.Learn more
Sign In

@assistant-ui/store

Package Overview
Dependencies
Maintainers
2
Versions
31
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@assistant-ui/store - npm Package Compare versions

Comparing version
0.2.17
to
0.2.18
+2
-2
dist/useAui.js

@@ -9,3 +9,3 @@ "use client";

import { NotificationManager } from "./utils/NotificationManager.js";
import { withAssistantTapContextProvider } from "./utils/tap-assistant-context.js";
import { useAssistantTapContextProvider } from "./utils/tap-assistant-context.js";
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";

@@ -19,3 +19,3 @@ import { useEffect, useMemo, useRef } from "@assistant-ui/tap/react-shim";

const useRootClientResource = ({ element, emit, clientRef }) => {
const { methods, state } = withAssistantTapContextProvider({
const { methods, state } = useAssistantTapContextProvider({
clientRef,

@@ -22,0 +22,0 @@ emit

@@ -1,1 +0,1 @@

{"version":3,"file":"useAui.js","names":["c","_c","useResource","useResources","useTapHost","useTapRoot","resource","withKey","useMemo","useEffect","useRef","AssistantClient","AssistantClientAccessor","ClientNames","ClientElement","ClientMeta","DerivedElement","useAssistantContextValue","DefaultAssistantClient","createRootAssistantClient","AUI_USE_EFFECTS_SYMBOL","DerivedClients","RootClients","useSplitClients","normalizeEventSelector","AssistantEventName","AssistantEventCallback","AssistantEventSelector","NotificationManager","withAssistantTapContextProvider","useClientResource","getClientIndex","PROXIED_ASSISTANT_STATE_SYMBOL","createProxiedAssistantState","useShallowMemoArray","array","T","useRootClientResource","element","emit","clientRef","K","parent","current","methods","state","WithTapContext","useRootClientAccessorResource","notifications","name","store","RootClient","subscribe","notifySubscribers","clientFunction","getValue","Object","defineProperties","source","value","const","writable","query","Record","configurable","RootClientAccessorResource","useNoOpRootClientsAccessorsResource","$","t0","Symbol","for","t1","clients","undefined","on","NoOpRootClientsAccessorsResource","useRootClientsAccessors","inputClients","t2","t3","t4","keys","map","key","results","t5","useRootClientsAccessorsResource","props","this","selector","TEvent","callback","Error","scope","event","localUnsub","payload","clientStack","scopeClient","index","parentUnsub","RootClientsAccessorsResource","useDerivedClientAccessorResource","propsRef","args","get","DerivedClientAccessorResource","serializeMeta","meta","queryKey","sorted","k","sort","JSON","stringify","String","useDerivedClientsAccessorsResource","useRootFields","rootClients","length","useAssistantClient","useAui","Props","derivedClients","client","rootFields","derivedFields","proto","create","assign","field","useHostedAssistantClient","effects","AssistantClientHost","config"],"sources":["../src/useAui.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useResource,\n useResources,\n useTapHost,\n useTapRoot,\n resource,\n withKey,\n} from \"@assistant-ui/tap\";\nimport { useMemo, useEffect, useRef } from \"react\";\n\nimport type {\n AssistantClient,\n AssistantClientAccessor,\n ClientNames,\n ClientElement,\n ClientMeta,\n} from \"./types/client\";\nimport type { DerivedElement } from \"./Derived\";\nimport {\n useAssistantContextValue,\n DefaultAssistantClient,\n createRootAssistantClient,\n AUI_USE_EFFECTS_SYMBOL,\n} from \"./utils/react-assistant-context\";\nimport {\n type DerivedClients,\n type RootClients,\n useSplitClients,\n} from \"./utils/splitClients\";\nimport {\n normalizeEventSelector,\n type AssistantEventName,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./types/events\";\nimport { NotificationManager } from \"./utils/NotificationManager\";\nimport { withAssistantTapContextProvider } from \"./utils/tap-assistant-context\";\nimport { useClientResource } from \"./useClientResource\";\nimport { getClientIndex } from \"./utils/tap-client-stack-context\";\nimport {\n PROXIED_ASSISTANT_STATE_SYMBOL,\n createProxiedAssistantState,\n} from \"./utils/proxied-assistant-state\";\n\nconst useShallowMemoArray = <T>(array: readonly T[]) => {\n // oxlint-disable-next-line react/exhaustive-deps -- shallow memo over the array itself\n return useMemo(() => array, array);\n};\n\nconst useRootClientResource = <K extends ClientNames>({\n element,\n emit,\n clientRef,\n}: {\n element: ClientElement<K>;\n emit: NotificationManager[\"emit\"];\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const { methods, state } = withAssistantTapContextProvider(\n { clientRef, emit },\n function WithTapContext() {\n return useClientResource(element);\n },\n );\n return useMemo(() => ({ state, methods }), [methods, state]);\n};\n\nconst useRootClientAccessorResource = <K extends ClientNames>({\n element,\n notifications,\n clientRef,\n name,\n}: {\n element: ClientElement<K>;\n notifications: NotificationManager;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n}): AssistantClientAccessor<K> => {\n const store = useTapRoot(function RootClient() {\n return useRootClientResource({\n element,\n emit: notifications.emit,\n clientRef,\n });\n });\n\n useEffect(() => {\n return store.subscribe(notifications.notifySubscribers);\n }, [store, notifications]);\n\n return useMemo(() => {\n const clientFunction = () => store.getValue().methods;\n Object.defineProperties(clientFunction, {\n source: {\n value: \"root\" as const,\n writable: false,\n },\n query: {\n value: {} as Record<string, never>,\n writable: false,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [store, name]);\n};\n\nconst RootClientAccessorResource = resource(useRootClientAccessorResource);\n\nconst useNoOpRootClientsAccessorsResource = () => {\n return useMemo(\n () => ({\n clients: [] as AssistantClientAccessor<ClientNames>[],\n subscribe: undefined,\n on: undefined,\n }),\n [],\n );\n};\n\nconst NoOpRootClientsAccessorsResource = resource(\n useNoOpRootClientsAccessorsResource,\n);\n\nconst useRootClientsAccessors = ({\n clients: inputClients,\n clientRef,\n}: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const notifications = useResource(NotificationManager());\n\n useEffect(\n () => clientRef.parent.subscribe(notifications.notifySubscribers),\n [clientRef, notifications],\n );\n\n const results = useShallowMemoArray(\n useResources(\n Object.keys(inputClients).map((key) =>\n withKey(\n key,\n RootClientAccessorResource({\n element: inputClients[key as keyof typeof inputClients]!,\n notifications,\n clientRef,\n name: key as keyof typeof inputClients,\n }),\n ),\n ),\n ),\n );\n\n return { notifications, results };\n};\n\nconst useRootClientsAccessorsResource = (props: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const { clientRef } = props;\n const { notifications, results } = useRootClientsAccessors(props);\n\n return useMemo(() => {\n return {\n clients: results,\n subscribe: notifications.subscribe,\n on: function <TEvent extends AssistantEventName>(\n this: AssistantClient,\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) {\n if (!this) {\n throw new Error(\n \"const { on } = useAui() is not supported. Use aui.on() instead.\",\n );\n }\n\n const { scope, event } = normalizeEventSelector(selector);\n\n if (scope !== \"*\") {\n const source = this[scope as ClientNames].source;\n if (source === null) {\n throw new Error(\n `Scope \"${scope}\" is not available. Use { scope: \"*\", event: \"${event}\" } to listen globally.`,\n );\n }\n }\n\n const localUnsub = notifications.on(event, (payload, clientStack) => {\n if (scope === \"*\") {\n callback(payload);\n return;\n }\n\n const scopeClient = this[scope as ClientNames]();\n const index = getClientIndex(scopeClient);\n if (scopeClient === clientStack[index]) {\n callback(payload);\n }\n });\n if (\n scope !== \"*\" &&\n clientRef.parent[scope as ClientNames].source === null\n )\n return localUnsub;\n\n const parentUnsub = clientRef.parent.on(selector, callback);\n\n return () => {\n localUnsub();\n parentUnsub();\n };\n },\n };\n }, [results, notifications, clientRef]);\n};\n\nconst RootClientsAccessorsResource = resource(useRootClientsAccessorsResource);\n\nconst useDerivedClientAccessorResource = <K extends ClientNames>({\n element,\n clientRef,\n name,\n}: {\n element: DerivedElement<K>;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n}) => {\n // Track the latest props on a ref updated in render. The fiber is\n // keyed on the scope's meta by DerivedClientsAccessorsResource, so\n // source/query are stable for this fiber's lifetime and the only\n // value that can change between renders for the same fiber is the\n // identity of the `get` closure. Routing reads through the ref so\n // they take effect without a one-commit lag.\n const propsRef = useRef(element.args[0]);\n propsRef.current = element.args[0];\n\n return useMemo(() => {\n const clientFunction = () => propsRef.current.get(clientRef.current!);\n Object.defineProperties(clientFunction, {\n source: {\n value: propsRef.current.source,\n },\n query: {\n value: propsRef.current.query,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [clientRef, name]);\n};\n\nconst DerivedClientAccessorResource = resource(\n useDerivedClientAccessorResource,\n);\n\nconst serializeMeta = <K extends ClientNames>(\n name: K,\n meta: ClientMeta<K>,\n): string => {\n // Sort top-level keys so {a, b} and {b, a} hash to the same fiber\n // identity, and guard JSON.stringify against unusual values (BigInt,\n // circular refs) so render never throws here.\n let queryKey: string;\n try {\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(meta.query as object).sort()) {\n sorted[k] = (meta.query as Record<string, unknown>)[k];\n }\n queryKey = JSON.stringify(sorted);\n } catch {\n queryKey = String(meta.query);\n }\n return `${name}::${meta.source}::${queryKey}`;\n};\n\nconst useDerivedClientsAccessorsResource = ({\n clients,\n clientRef,\n}: {\n clients: DerivedClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n return useShallowMemoArray(\n useResources(\n Object.keys(clients).map((key) => {\n const name = key as keyof typeof clients;\n const element = clients[name]!;\n return withKey(\n serializeMeta(name, element.args[0]),\n DerivedClientAccessorResource({\n element,\n clientRef,\n name,\n }),\n );\n }),\n ),\n );\n};\n\n/**\n * Resource that creates an extended AssistantClient.\n */\nconst useRootFields = ({\n rootClients,\n clientRef,\n}: {\n rootClients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n return useResource(\n Object.keys(rootClients).length > 0\n ? RootClientsAccessorsResource({ clients: rootClients, clientRef })\n : NoOpRootClientsAccessorsResource(),\n );\n};\n\nconst useAssistantClient = ({\n parent,\n clients,\n}: {\n parent: AssistantClient;\n clients: useAui.Props;\n}): AssistantClient => {\n const { rootClients, derivedClients } = useSplitClients(clients, parent);\n\n const clientRef = useRef({\n parent: parent,\n current: null as AssistantClient | null,\n }).current;\n\n useEffect(() => {\n clientRef.current = client;\n });\n\n const rootFields = useRootFields({ rootClients, clientRef });\n\n const derivedFields = useDerivedClientsAccessorsResource({\n clients: derivedClients,\n clientRef,\n });\n\n const client = useMemo(() => {\n // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message\n const proto =\n parent === DefaultAssistantClient ? createRootAssistantClient() : parent;\n\n const client = Object.create(proto) as AssistantClient;\n Object.assign(client, {\n subscribe: rootFields.subscribe ?? parent.subscribe,\n on: rootFields.on ?? parent.on,\n [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client),\n });\n\n for (const field of rootFields.clients) {\n (client as any)[field.name] = field;\n }\n for (const field of derivedFields) {\n (client as any)[field.name] = field;\n }\n\n return client;\n }, [parent, rootFields, derivedFields]);\n\n if (clientRef.current === null) {\n clientRef.current = client;\n }\n\n return client;\n};\n\nconst useHostedAssistantClient = (props: {\n parent: AssistantClient;\n clients: useAui.Props;\n}): AssistantClient => {\n const { value: client, effects } = useTapHost(function AssistantClientHost() {\n return useAssistantClient(props);\n });\n\n (client as Record<symbol, unknown>)[AUI_USE_EFFECTS_SYMBOL] = effects;\n\n return client;\n};\n\nexport namespace useAui {\n export type Props = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n };\n}\n\n/**\n * Returns the current `AssistantClient` from context.\n *\n * Read the client supplied by the nearest {@link AuiProvider} or\n * {@link AssistantRuntimeProvider}, then access a scope on it —\n * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair\n * with {@link useAuiState} to read reactive state and {@link useAuiEvent}\n * to subscribe to events. The returned client also exposes lower-level\n * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer\n * `useAuiEvent` for React event subscriptions.\n *\n * Rendered outside a provider, the returned client's scope accessors\n * throw a descriptive error whenever they are called.\n *\n * @example\n * ```tsx\n * const aui = useAui();\n *\n * const onSend = () => aui.composer().send();\n * const onCancel = () => aui.thread().cancelRun();\n * ```\n *\n * @example\n * ```tsx\n * // Combine with useAuiState to drive disabled state.\n * const aui = useAui();\n * const isRunning = useAuiState((s) => s.thread.isRunning);\n *\n * return (\n * <button disabled={isRunning} onClick={() => aui.composer().send()}>\n * Send\n * </button>\n * );\n * ```\n */\nexport function useAui(): AssistantClient;\n/**\n * Extends the parent `AssistantClient` with additional scopes.\n *\n * Advanced overload used when building primitives or providers — for example,\n * when a custom provider needs to register a `message`, `part`, or other scope\n * onto the client visible to its descendants. Application code rarely reaches\n * for this; use {@link useAui} with no arguments to read the existing client.\n *\n * @example\n * ```tsx\n * const aui = useAui({\n * message: Derived({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (aui) => aui.thread().message({ index: 0 }),\n * }),\n * });\n *\n * const role = useAuiState((s) => s.message.role);\n * ```\n */\nexport function useAui(clients: useAui.Props): AssistantClient;\n/**\n * Extends an explicit parent `AssistantClient` with additional scopes.\n */\nexport function useAui(\n clients: useAui.Props,\n config: { parent: null | AssistantClient },\n): AssistantClient;\n/** @deprecated This API is highly experimental and may be changed in a minor release */\nexport function useAui(\n clients?: useAui.Props,\n { parent }: { parent: null | AssistantClient } = {\n parent: useAssistantContextValue(),\n },\n): AssistantClient {\n if (clients) {\n return useHostedAssistantClient({\n parent: parent ?? DefaultAssistantClient,\n clients,\n });\n }\n if (parent === null)\n throw new Error(\"received null parent, this usage is not allowed\");\n return parent;\n}\n"],"mappings":"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"}
{"version":3,"file":"useAui.js","names":["c","_c","useResource","useResources","useTapHost","useTapRoot","resource","withKey","useMemo","useEffect","useRef","AssistantClient","AssistantClientAccessor","ClientNames","ClientElement","ClientMeta","DerivedElement","useAssistantContextValue","DefaultAssistantClient","createRootAssistantClient","AUI_USE_EFFECTS_SYMBOL","DerivedClients","RootClients","useSplitClients","normalizeEventSelector","AssistantEventName","AssistantEventCallback","AssistantEventSelector","NotificationManager","useAssistantTapContextProvider","useClientResource","getClientIndex","PROXIED_ASSISTANT_STATE_SYMBOL","createProxiedAssistantState","useShallowMemoArray","array","T","useRootClientResource","element","emit","clientRef","K","parent","current","methods","state","WithTapContext","useRootClientAccessorResource","notifications","name","store","RootClient","subscribe","notifySubscribers","clientFunction","getValue","Object","defineProperties","source","value","const","writable","query","Record","configurable","RootClientAccessorResource","useNoOpRootClientsAccessorsResource","$","t0","Symbol","for","t1","clients","undefined","on","NoOpRootClientsAccessorsResource","useRootClientsAccessors","inputClients","t2","t3","t4","keys","map","key","results","t5","useRootClientsAccessorsResource","props","this","selector","TEvent","callback","Error","scope","event","localUnsub","payload","clientStack","scopeClient","index","parentUnsub","RootClientsAccessorsResource","useDerivedClientAccessorResource","propsRef","args","get","DerivedClientAccessorResource","serializeMeta","meta","queryKey","sorted","k","sort","JSON","stringify","String","useDerivedClientsAccessorsResource","useRootFields","rootClients","length","useAssistantClient","useAui","Props","derivedClients","client","rootFields","derivedFields","proto","create","assign","field","useHostedAssistantClient","effects","AssistantClientHost","config"],"sources":["../src/useAui.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useResource,\n useResources,\n useTapHost,\n useTapRoot,\n resource,\n withKey,\n} from \"@assistant-ui/tap\";\nimport { useMemo, useEffect, useRef } from \"react\";\n\nimport type {\n AssistantClient,\n AssistantClientAccessor,\n ClientNames,\n ClientElement,\n ClientMeta,\n} from \"./types/client\";\nimport type { DerivedElement } from \"./Derived\";\nimport {\n useAssistantContextValue,\n DefaultAssistantClient,\n createRootAssistantClient,\n AUI_USE_EFFECTS_SYMBOL,\n} from \"./utils/react-assistant-context\";\nimport {\n type DerivedClients,\n type RootClients,\n useSplitClients,\n} from \"./utils/splitClients\";\nimport {\n normalizeEventSelector,\n type AssistantEventName,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./types/events\";\nimport { NotificationManager } from \"./utils/NotificationManager\";\nimport { useAssistantTapContextProvider } from \"./utils/tap-assistant-context\";\nimport { useClientResource } from \"./useClientResource\";\nimport { getClientIndex } from \"./utils/tap-client-stack-context\";\nimport {\n PROXIED_ASSISTANT_STATE_SYMBOL,\n createProxiedAssistantState,\n} from \"./utils/proxied-assistant-state\";\n\nconst useShallowMemoArray = <T>(array: readonly T[]) => {\n // oxlint-disable-next-line react/exhaustive-deps -- shallow memo over the array itself\n return useMemo(() => array, array);\n};\n\nconst useRootClientResource = <K extends ClientNames>({\n element,\n emit,\n clientRef,\n}: {\n element: ClientElement<K>;\n emit: NotificationManager[\"emit\"];\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const { methods, state } = useAssistantTapContextProvider(\n { clientRef, emit },\n function WithTapContext() {\n return useClientResource(element);\n },\n );\n return useMemo(() => ({ state, methods }), [methods, state]);\n};\n\nconst useRootClientAccessorResource = <K extends ClientNames>({\n element,\n notifications,\n clientRef,\n name,\n}: {\n element: ClientElement<K>;\n notifications: NotificationManager;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n}): AssistantClientAccessor<K> => {\n const store = useTapRoot(function RootClient() {\n return useRootClientResource({\n element,\n emit: notifications.emit,\n clientRef,\n });\n });\n\n useEffect(() => {\n return store.subscribe(notifications.notifySubscribers);\n }, [store, notifications]);\n\n return useMemo(() => {\n const clientFunction = () => store.getValue().methods;\n Object.defineProperties(clientFunction, {\n source: {\n value: \"root\" as const,\n writable: false,\n },\n query: {\n value: {} as Record<string, never>,\n writable: false,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [store, name]);\n};\n\nconst RootClientAccessorResource = resource(useRootClientAccessorResource);\n\nconst useNoOpRootClientsAccessorsResource = () => {\n return useMemo(\n () => ({\n clients: [] as AssistantClientAccessor<ClientNames>[],\n subscribe: undefined,\n on: undefined,\n }),\n [],\n );\n};\n\nconst NoOpRootClientsAccessorsResource = resource(\n useNoOpRootClientsAccessorsResource,\n);\n\nconst useRootClientsAccessors = ({\n clients: inputClients,\n clientRef,\n}: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const notifications = useResource(NotificationManager());\n\n useEffect(\n () => clientRef.parent.subscribe(notifications.notifySubscribers),\n [clientRef, notifications],\n );\n\n const results = useShallowMemoArray(\n useResources(\n Object.keys(inputClients).map((key) =>\n withKey(\n key,\n RootClientAccessorResource({\n element: inputClients[key as keyof typeof inputClients]!,\n notifications,\n clientRef,\n name: key as keyof typeof inputClients,\n }),\n ),\n ),\n ),\n );\n\n return { notifications, results };\n};\n\nconst useRootClientsAccessorsResource = (props: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n const { clientRef } = props;\n const { notifications, results } = useRootClientsAccessors(props);\n\n return useMemo(() => {\n return {\n clients: results,\n subscribe: notifications.subscribe,\n on: function <TEvent extends AssistantEventName>(\n this: AssistantClient,\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) {\n if (!this) {\n throw new Error(\n \"const { on } = useAui() is not supported. Use aui.on() instead.\",\n );\n }\n\n const { scope, event } = normalizeEventSelector(selector);\n\n if (scope !== \"*\") {\n const source = this[scope as ClientNames].source;\n if (source === null) {\n throw new Error(\n `Scope \"${scope}\" is not available. Use { scope: \"*\", event: \"${event}\" } to listen globally.`,\n );\n }\n }\n\n const localUnsub = notifications.on(event, (payload, clientStack) => {\n if (scope === \"*\") {\n callback(payload);\n return;\n }\n\n const scopeClient = this[scope as ClientNames]();\n const index = getClientIndex(scopeClient);\n if (scopeClient === clientStack[index]) {\n callback(payload);\n }\n });\n if (\n scope !== \"*\" &&\n clientRef.parent[scope as ClientNames].source === null\n )\n return localUnsub;\n\n const parentUnsub = clientRef.parent.on(selector, callback);\n\n return () => {\n localUnsub();\n parentUnsub();\n };\n },\n };\n }, [results, notifications, clientRef]);\n};\n\nconst RootClientsAccessorsResource = resource(useRootClientsAccessorsResource);\n\nconst useDerivedClientAccessorResource = <K extends ClientNames>({\n element,\n clientRef,\n name,\n}: {\n element: DerivedElement<K>;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n}) => {\n // Track the latest props on a ref updated in render. The fiber is\n // keyed on the scope's meta by DerivedClientsAccessorsResource, so\n // source/query are stable for this fiber's lifetime and the only\n // value that can change between renders for the same fiber is the\n // identity of the `get` closure. Routing reads through the ref so\n // they take effect without a one-commit lag.\n const propsRef = useRef(element.args[0]);\n propsRef.current = element.args[0];\n\n return useMemo(() => {\n const clientFunction = () => propsRef.current.get(clientRef.current!);\n Object.defineProperties(clientFunction, {\n source: {\n value: propsRef.current.source,\n },\n query: {\n value: propsRef.current.query,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [clientRef, name]);\n};\n\nconst DerivedClientAccessorResource = resource(\n useDerivedClientAccessorResource,\n);\n\nconst serializeMeta = <K extends ClientNames>(\n name: K,\n meta: ClientMeta<K>,\n): string => {\n // Sort top-level keys so {a, b} and {b, a} hash to the same fiber\n // identity, and guard JSON.stringify against unusual values (BigInt,\n // circular refs) so render never throws here.\n let queryKey: string;\n try {\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(meta.query as object).sort()) {\n sorted[k] = (meta.query as Record<string, unknown>)[k];\n }\n queryKey = JSON.stringify(sorted);\n } catch {\n queryKey = String(meta.query);\n }\n return `${name}::${meta.source}::${queryKey}`;\n};\n\nconst useDerivedClientsAccessorsResource = ({\n clients,\n clientRef,\n}: {\n clients: DerivedClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n return useShallowMemoArray(\n useResources(\n Object.keys(clients).map((key) => {\n const name = key as keyof typeof clients;\n const element = clients[name]!;\n return withKey(\n serializeMeta(name, element.args[0]),\n DerivedClientAccessorResource({\n element,\n clientRef,\n name,\n }),\n );\n }),\n ),\n );\n};\n\n/**\n * Resource that creates an extended AssistantClient.\n */\nconst useRootFields = ({\n rootClients,\n clientRef,\n}: {\n rootClients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n}) => {\n return useResource(\n Object.keys(rootClients).length > 0\n ? RootClientsAccessorsResource({ clients: rootClients, clientRef })\n : NoOpRootClientsAccessorsResource(),\n );\n};\n\nconst useAssistantClient = ({\n parent,\n clients,\n}: {\n parent: AssistantClient;\n clients: useAui.Props;\n}): AssistantClient => {\n const { rootClients, derivedClients } = useSplitClients(clients, parent);\n\n const clientRef = useRef({\n parent: parent,\n current: null as AssistantClient | null,\n }).current;\n\n useEffect(() => {\n clientRef.current = client;\n });\n\n const rootFields = useRootFields({ rootClients, clientRef });\n\n const derivedFields = useDerivedClientsAccessorsResource({\n clients: derivedClients,\n clientRef,\n });\n\n const client = useMemo(() => {\n // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message\n const proto =\n parent === DefaultAssistantClient ? createRootAssistantClient() : parent;\n\n const client = Object.create(proto) as AssistantClient;\n Object.assign(client, {\n subscribe: rootFields.subscribe ?? parent.subscribe,\n on: rootFields.on ?? parent.on,\n [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client),\n });\n\n for (const field of rootFields.clients) {\n (client as any)[field.name] = field;\n }\n for (const field of derivedFields) {\n (client as any)[field.name] = field;\n }\n\n return client;\n }, [parent, rootFields, derivedFields]);\n\n if (clientRef.current === null) {\n clientRef.current = client;\n }\n\n return client;\n};\n\nconst useHostedAssistantClient = (props: {\n parent: AssistantClient;\n clients: useAui.Props;\n}): AssistantClient => {\n const { value: client, effects } = useTapHost(function AssistantClientHost() {\n return useAssistantClient(props);\n });\n\n (client as Record<symbol, unknown>)[AUI_USE_EFFECTS_SYMBOL] = effects;\n\n return client;\n};\n\nexport namespace useAui {\n export type Props = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n };\n}\n\n/**\n * Returns the current `AssistantClient` from context.\n *\n * Read the client supplied by the nearest {@link AuiProvider} or\n * {@link AssistantRuntimeProvider}, then access a scope on it —\n * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair\n * with {@link useAuiState} to read reactive state and {@link useAuiEvent}\n * to subscribe to events. The returned client also exposes lower-level\n * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer\n * `useAuiEvent` for React event subscriptions.\n *\n * Rendered outside a provider, the returned client's scope accessors\n * throw a descriptive error whenever they are called.\n *\n * @example\n * ```tsx\n * const aui = useAui();\n *\n * const onSend = () => aui.composer().send();\n * const onCancel = () => aui.thread().cancelRun();\n * ```\n *\n * @example\n * ```tsx\n * // Combine with useAuiState to drive disabled state.\n * const aui = useAui();\n * const isRunning = useAuiState((s) => s.thread.isRunning);\n *\n * return (\n * <button disabled={isRunning} onClick={() => aui.composer().send()}>\n * Send\n * </button>\n * );\n * ```\n */\nexport function useAui(): AssistantClient;\n/**\n * Extends the parent `AssistantClient` with additional scopes.\n *\n * Advanced overload used when building primitives or providers — for example,\n * when a custom provider needs to register a `message`, `part`, or other scope\n * onto the client visible to its descendants. Application code rarely reaches\n * for this; use {@link useAui} with no arguments to read the existing client.\n *\n * @example\n * ```tsx\n * const aui = useAui({\n * message: Derived({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (aui) => aui.thread().message({ index: 0 }),\n * }),\n * });\n *\n * const role = useAuiState((s) => s.message.role);\n * ```\n */\nexport function useAui(clients: useAui.Props): AssistantClient;\n/**\n * Extends an explicit parent `AssistantClient` with additional scopes.\n */\nexport function useAui(\n clients: useAui.Props,\n config: { parent: null | AssistantClient },\n): AssistantClient;\n/** @deprecated This API is highly experimental and may be changed in a minor release */\nexport function useAui(\n clients?: useAui.Props,\n { parent }: { parent: null | AssistantClient } = {\n parent: useAssistantContextValue(),\n },\n): AssistantClient {\n if (clients) {\n return useHostedAssistantClient({\n parent: parent ?? DefaultAssistantClient,\n clients,\n });\n }\n if (parent === null)\n throw new Error(\"received null parent, this usage is not allowed\");\n return parent;\n}\n"],"mappings":"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"}

@@ -1,2 +0,2 @@

import { SYMBOL_CLIENT_INDEX, useClientStack, useWithClientStack } from "./utils/tap-client-stack-context.js";
import { SYMBOL_CLIENT_INDEX, useClientStack, useClientStackProvider } from "./utils/tap-client-stack-context.js";
import { BaseProxyHandler, handleIntrospectionProp } from "./utils/BaseProxyHandler.js";

@@ -76,3 +76,3 @@ import { useEffect, useMemo, useRef } from "@assistant-ui/tap/react-shim";

const methods = useMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]);
const value = useWithClientStack(methods, function WithClientStack() {
const value = useClientStackProvider(methods, function WithClientStack() {
return useResource(element);

@@ -79,0 +79,0 @@ });

@@ -1,1 +0,1 @@

{"version":3,"file":"useClientResource.js","names":["useEffect","useMemo","useRef","resource","useResource","ResourceElement","ClientMethods","useClientStack","useWithClientStack","SYMBOL_CLIENT_INDEX","BaseProxyHandler","handleIntrospectionProp","SYMBOL_GET_OUTPUT","Symbol","ClientInternal","getClientState","client","output","Error","getState","fieldAccessFns","Map","this","args","getOrCreateProxyFn","prop","template","get","String","method","set","ClientProxyHandler","ProxyHandler","boundFns","cachedReceiver","constructor","outputRef","current","index","_","receiver","introspection","value","bound","bind","ownKeys","ArrayLike","Object","keys","has","InferClientState","TMethods","S","useClientResource","element","state","methods","key","valueRef","length","Proxy","WithClientStack","ClientResource"],"sources":["../src/useClientResource.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from \"react\";\nimport { resource, useResource, type ResourceElement } from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport {\n useClientStack,\n useWithClientStack,\n SYMBOL_CLIENT_INDEX,\n} from \"./utils/tap-client-stack-context\";\nimport {\n BaseProxyHandler,\n handleIntrospectionProp,\n} from \"./utils/BaseProxyHandler\";\n\n/**\n * Symbol used internally to get state from ClientProxy.\n * This allows getState() to be optional in the user-facing client.\n */\nconst SYMBOL_GET_OUTPUT = Symbol(\"assistant-ui.store.getValue\");\n\ntype ClientInternal = {\n [SYMBOL_GET_OUTPUT]: ClientMethods;\n};\n\nexport const getClientState = (client: ClientMethods) => {\n const output = (client as unknown as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n \"Client scope contains a non-client resource. \" +\n \"Ensure your Derived get() returns a client created with useClientResource(), not a plain resource.\",\n );\n }\n return (output as any).getState?.();\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: unknown, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: unknown, ...args: unknown[]) {\n if (!this || typeof this !== \"object\") {\n throw new Error(\n `Method \"${String(prop)}\" called without proper context. ` +\n `This may indicate the function was called incorrectly.`,\n );\n }\n\n const output = (this as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n `Method \"${String(prop)}\" called on invalid client proxy. ` +\n `Ensure you are calling this method on a valid client instance.`,\n );\n }\n\n const method = output[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\n if (typeof method !== \"function\")\n throw new Error(`\"${String(prop)}\" is not a function.`);\n return method(...args);\n };\n fieldAccessFns.set(prop, template);\n }\n return template;\n}\n\nclass ClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<object>\n{\n private boundFns:\n | Map<string | symbol, (...args: never) => unknown>\n | undefined;\n private cachedReceiver: unknown;\n\n constructor(\n private readonly outputRef: {\n current: ClientMethods;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol, receiver: unknown) {\n if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;\n if (prop === SYMBOL_CLIENT_INDEX) return this.index;\n const introspection = handleIntrospectionProp(prop, \"ClientProxy\");\n if (introspection !== false) return introspection;\n const value = this.outputRef.current[prop];\n if (typeof value === \"function\") {\n if (this.cachedReceiver !== receiver) {\n this.boundFns = new Map();\n this.cachedReceiver = receiver;\n }\n let bound = this.boundFns!.get(prop);\n if (!bound) {\n bound = getOrCreateProxyFn(prop).bind(receiver);\n this.boundFns!.set(prop, bound);\n }\n return bound;\n }\n return value;\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current);\n }\n\n has(_: unknown, prop: string | symbol) {\n if (prop === SYMBOL_GET_OUTPUT) return true;\n if (prop === SYMBOL_CLIENT_INDEX) return true;\n return prop in this.outputRef.current;\n }\n}\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : undefined;\n\nexport const useClientResource = <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n): {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n} => {\n const valueRef = useRef(null as unknown as TMethods);\n\n const index = useClientStack().length;\n const methods = useMemo(\n () =>\n new Proxy<TMethods>(\n {} as TMethods,\n new ClientProxyHandler(valueRef, index),\n ),\n [index],\n );\n\n const value = useWithClientStack(methods, function WithClientStack() {\n return useResource(element);\n });\n\n if (!valueRef.current) {\n valueRef.current = value;\n }\n\n useEffect(() => {\n valueRef.current = value;\n });\n\n const state = (value as any).getState?.();\n return { methods, state, key: element.key };\n};\n\nexport const ClientResource = resource(useClientResource);\n"],"mappings":"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"}
{"version":3,"file":"useClientResource.js","names":["useEffect","useMemo","useRef","resource","useResource","ResourceElement","ClientMethods","useClientStack","useClientStackProvider","SYMBOL_CLIENT_INDEX","BaseProxyHandler","handleIntrospectionProp","SYMBOL_GET_OUTPUT","Symbol","ClientInternal","getClientState","client","output","Error","getState","fieldAccessFns","Map","this","args","getOrCreateProxyFn","prop","template","get","String","method","set","ClientProxyHandler","ProxyHandler","boundFns","cachedReceiver","constructor","outputRef","current","index","_","receiver","introspection","value","bound","bind","ownKeys","ArrayLike","Object","keys","has","InferClientState","TMethods","S","useClientResource","element","state","methods","key","valueRef","length","Proxy","WithClientStack","ClientResource"],"sources":["../src/useClientResource.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from \"react\";\nimport { resource, useResource, type ResourceElement } from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport {\n useClientStack,\n useClientStackProvider,\n SYMBOL_CLIENT_INDEX,\n} from \"./utils/tap-client-stack-context\";\nimport {\n BaseProxyHandler,\n handleIntrospectionProp,\n} from \"./utils/BaseProxyHandler\";\n\n/**\n * Symbol used internally to get state from ClientProxy.\n * This allows getState() to be optional in the user-facing client.\n */\nconst SYMBOL_GET_OUTPUT = Symbol(\"assistant-ui.store.getValue\");\n\ntype ClientInternal = {\n [SYMBOL_GET_OUTPUT]: ClientMethods;\n};\n\nexport const getClientState = (client: ClientMethods) => {\n const output = (client as unknown as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n \"Client scope contains a non-client resource. \" +\n \"Ensure your Derived get() returns a client created with useClientResource(), not a plain resource.\",\n );\n }\n return (output as any).getState?.();\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: unknown, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: unknown, ...args: unknown[]) {\n if (!this || typeof this !== \"object\") {\n throw new Error(\n `Method \"${String(prop)}\" called without proper context. ` +\n `This may indicate the function was called incorrectly.`,\n );\n }\n\n const output = (this as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n `Method \"${String(prop)}\" called on invalid client proxy. ` +\n `Ensure you are calling this method on a valid client instance.`,\n );\n }\n\n const method = output[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\n if (typeof method !== \"function\")\n throw new Error(`\"${String(prop)}\" is not a function.`);\n return method(...args);\n };\n fieldAccessFns.set(prop, template);\n }\n return template;\n}\n\nclass ClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<object>\n{\n private boundFns:\n | Map<string | symbol, (...args: never) => unknown>\n | undefined;\n private cachedReceiver: unknown;\n\n constructor(\n private readonly outputRef: {\n current: ClientMethods;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol, receiver: unknown) {\n if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;\n if (prop === SYMBOL_CLIENT_INDEX) return this.index;\n const introspection = handleIntrospectionProp(prop, \"ClientProxy\");\n if (introspection !== false) return introspection;\n const value = this.outputRef.current[prop];\n if (typeof value === \"function\") {\n if (this.cachedReceiver !== receiver) {\n this.boundFns = new Map();\n this.cachedReceiver = receiver;\n }\n let bound = this.boundFns!.get(prop);\n if (!bound) {\n bound = getOrCreateProxyFn(prop).bind(receiver);\n this.boundFns!.set(prop, bound);\n }\n return bound;\n }\n return value;\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current);\n }\n\n has(_: unknown, prop: string | symbol) {\n if (prop === SYMBOL_GET_OUTPUT) return true;\n if (prop === SYMBOL_CLIENT_INDEX) return true;\n return prop in this.outputRef.current;\n }\n}\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : undefined;\n\nexport const useClientResource = <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n): {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n} => {\n const valueRef = useRef(null as unknown as TMethods);\n\n const index = useClientStack().length;\n const methods = useMemo(\n () =>\n new Proxy<TMethods>(\n {} as TMethods,\n new ClientProxyHandler(valueRef, index),\n ),\n [index],\n );\n\n const value = useClientStackProvider(methods, function WithClientStack() {\n return useResource(element);\n });\n\n if (!valueRef.current) {\n valueRef.current = value;\n }\n\n useEffect(() => {\n valueRef.current = value;\n });\n\n const state = (value as any).getState?.();\n return { methods, state, key: element.key };\n};\n\nexport const ClientResource = resource(useClientResource);\n"],"mappings":"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"}

@@ -14,3 +14,3 @@ import { AssistantEventName, AssistantEventPayload } from "../types/events.js";

};
declare const withAssistantTapContextProvider: <TResult>(value: AssistantTapContextValue, fn: () => TResult) => TResult;
declare const useAssistantTapContextProvider: <TResult>(value: AssistantTapContextValue, fn: () => TResult) => TResult;
declare const useAssistantClientRef: () => {

@@ -22,3 +22,3 @@ parent: AssistantClient;

//#endregion
export { AssistantTapContextValue, useAssistantClientRef, useAssistantEmit, withAssistantTapContextProvider };
export { AssistantTapContextValue, useAssistantClientRef, useAssistantEmit, useAssistantTapContextProvider };
//# sourceMappingURL=tap-assistant-context.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"tap-assistant-context.d.ts","names":[],"sources":["../../src/utils/tap-assistant-context.ts"],"mappings":";;;;;KAUK,MAAA,mBAAyB,OAAA,CAAQ,kBAAA,QACpC,KAAA,EAAO,MAAA,EACP,OAAA,EAAS,qBAAA,CAAsB,MAAA,GAC/B,WAAA,EAAa,WAAA;AAAA,KAGH,wBAAA;EACV,SAAA;IAAa,MAAA,EAAQ,eAAA;IAAiB,OAAA,EAAS,eAAA;EAAA;EAC/C,IAAA,EAAM,MAAA;AAAA;AAAA,cAMK,+BAAA,YACX,KAAA,EAAO,wBAAA,EACP,EAAA,QAAU,OAAA,KAAO,OAAA;AAAA,cAYN,qBAAA;UArBU,eAAA;WAA0B,eAAe;AAAA;AAAA,cAyBnD,gBAAA,wBAKO,OAAA,CAAQ,kBAAA,QAAwB,KAAA,EACvC,MAAA,EAAM,OAAA,EACJ,qBAAA,CAAsB,MAAA"}
{"version":3,"file":"tap-assistant-context.d.ts","names":[],"sources":["../../src/utils/tap-assistant-context.ts"],"mappings":";;;;;KASK,MAAA,mBAAyB,OAAA,CAAQ,kBAAA,QACpC,KAAA,EAAO,MAAA,EACP,OAAA,EAAS,qBAAA,CAAsB,MAAA,GAC/B,WAAA,EAAa,WAAA;AAAA,KAGH,wBAAA;EACV,SAAA;IAAa,MAAA,EAAQ,eAAA;IAAiB,OAAA,EAAS,eAAA;EAAA;EAC/C,IAAA,EAAM,MAAA;AAAA;AAAA,cAOK,8BAAA,YACX,KAAA,EAAO,wBAAA,EACP,EAAA,QAAU,OAAA,KAAO,OAAA;AAAA,cAYN,qBAAA;UAtBU,eAAA;WAA0B,eAAe;AAAA;AAAA,cA0BnD,gBAAA,wBAKO,OAAA,CAAQ,kBAAA,QAAwB,KAAA,EACvC,MAAA,EAAM,OAAA,EACJ,qBAAA,CAAsB,MAAA"}
import { useClientStack } from "./tap-client-stack-context.js";
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
import { use, useEffectEvent } from "@assistant-ui/tap/react-shim";
import { createResourceContext, withContextProvider } from "@assistant-ui/tap";
import { createContext, use, useEffectEvent } from "@assistant-ui/tap/react-shim";
import { useContextProvider } from "@assistant-ui/tap";
//#region src/utils/tap-assistant-context.ts
const AssistantTapContext = createResourceContext(null);
const withAssistantTapContextProvider = (value, fn) => {
return withContextProvider(AssistantTapContext, value, fn);
const AssistantTapContext = createContext(null);
const useAssistantTapContextProvider = (value, fn) => {
return useContextProvider(AssistantTapContext, value, fn);
};

@@ -34,4 +34,4 @@ const useAssistantTapContext = () => {

//#endregion
export { useAssistantClientRef, useAssistantEmit, withAssistantTapContextProvider };
export { useAssistantClientRef, useAssistantEmit, useAssistantTapContextProvider };
//# sourceMappingURL=tap-assistant-context.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"tap-assistant-context.js","names":["useEffectEvent","use","createResourceContext","withContextProvider","AssistantEventName","AssistantEventPayload","AssistantClient","useClientStack","ClientStack","EmitFn","Exclude","event","TEvent","payload","clientStack","AssistantTapContextValue","clientRef","parent","current","emit","AssistantTapContext","withAssistantTapContextProvider","value","fn","TResult","useAssistantTapContext","ctx","Error","useAssistantClientRef","useAssistantEmit","$","_c","t0"],"sources":["../../src/utils/tap-assistant-context.ts"],"sourcesContent":["import { useEffectEvent, use } from \"react\";\n\nimport { createResourceContext, withContextProvider } from \"@assistant-ui/tap\";\nimport type {\n AssistantEventName,\n AssistantEventPayload,\n} from \"../types/events\";\nimport type { AssistantClient } from \"../types/client\";\nimport { useClientStack, type ClientStack } from \"./tap-client-stack-context\";\n\ntype EmitFn = <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n clientStack: ClientStack,\n) => void;\n\nexport type AssistantTapContextValue = {\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n emit: EmitFn;\n};\n\nconst AssistantTapContext =\n createResourceContext<AssistantTapContextValue | null>(null);\n\nexport const withAssistantTapContextProvider = <TResult>(\n value: AssistantTapContextValue,\n fn: () => TResult,\n) => {\n return withContextProvider(AssistantTapContext, value, fn);\n};\n\nconst useAssistantTapContext = () => {\n const ctx = use(AssistantTapContext);\n if (!ctx) throw new Error(\"AssistantTapContext is not available\");\n\n return ctx;\n};\n\nexport const useAssistantClientRef = () => {\n return useAssistantTapContext().clientRef;\n};\n\nexport const useAssistantEmit = () => {\n const { emit } = useAssistantTapContext();\n const clientStack = useClientStack();\n\n return useEffectEvent(\n <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n ) => {\n emit(event, payload, clientStack);\n },\n );\n};\n"],"mappings":";;;;;AAqBA,MAAMoB,sBACJlB,sBAAuD,IAAI;AAE7D,MAAamB,mCACXC,OACAC,OACG;CACH,OAAOpB,oBAAoBiB,qBAAqBE,OAAOC,EAAE;AAC3D;AAEA,MAAME,+BAA+B;CACnC,MAAMC,MAAMzB,IAAImB,mBAAmB;CACnC,IAAI,CAACM,KAAK,MAAM,IAAIC,MAAM,sCAAsC;CAEhE,OAAOD;AACT;AAEA,MAAaE,8BAAwB;CAAA,OAC5BH,uBAAuB,CAAC,CAAAT;AAAU;AAG3C,MAAaa,yBAAmB;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAC9B,MAAA,EAAAZ,SAAiBM,uBAAuB;CACxC,MAAAX,cAAoBP,eAAe;CAAE,IAAAyB;CAAA,IAAAF,EAAA,OAAAhB,eAAAgB,EAAA,OAAAX,MAAA;EAGnCa,MAAArB,OAAAE,YAAA;GAIEM,KAAKR,OAAOE,SAASC,WAAW;EAAC;EAClCgB,EAAA,KAAAhB;EAAAgB,EAAA,KAAAX;EAAAW,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OANI9B,eACLgC,EAMF;AAAC"}
{"version":3,"file":"tap-assistant-context.js","names":["useEffectEvent","use","createContext","useContextProvider","AssistantEventName","AssistantEventPayload","AssistantClient","useClientStack","ClientStack","EmitFn","Exclude","event","TEvent","payload","clientStack","AssistantTapContextValue","clientRef","parent","current","emit","AssistantTapContext","useAssistantTapContextProvider","value","fn","useAssistantTapContext","ctx","Error","useAssistantClientRef","useAssistantEmit","$","_c","t0"],"sources":["../../src/utils/tap-assistant-context.ts"],"sourcesContent":["import { useEffectEvent, use, createContext } from \"react\";\nimport { useContextProvider } from \"@assistant-ui/tap\";\nimport type {\n AssistantEventName,\n AssistantEventPayload,\n} from \"../types/events\";\nimport type { AssistantClient } from \"../types/client\";\nimport { useClientStack, type ClientStack } from \"./tap-client-stack-context\";\n\ntype EmitFn = <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n clientStack: ClientStack,\n) => void;\n\nexport type AssistantTapContextValue = {\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n emit: EmitFn;\n};\n\nconst AssistantTapContext = createContext<AssistantTapContextValue | null>(\n null,\n);\n\nexport const useAssistantTapContextProvider = <TResult>(\n value: AssistantTapContextValue,\n fn: () => TResult,\n) => {\n return useContextProvider(AssistantTapContext, value, fn);\n};\n\nconst useAssistantTapContext = () => {\n const ctx = use(AssistantTapContext);\n if (!ctx) throw new Error(\"AssistantTapContext is not available\");\n\n return ctx;\n};\n\nexport const useAssistantClientRef = () => {\n return useAssistantTapContext().clientRef;\n};\n\nexport const useAssistantEmit = () => {\n const { emit } = useAssistantTapContext();\n const clientStack = useClientStack();\n\n return useEffectEvent(\n <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n ) => {\n emit(event, payload, clientStack);\n },\n );\n};\n"],"mappings":";;;;;AAoBA,MAAMoB,sBAAsBlB,cAC1B,IACF;AAEA,MAAamB,kCAAiCC,OAAAC,OAAA;CAAA,OAIrCpB,mBAAmBiB,qBAAqBE,OAAOC,EAAE;AAAC;AAG3D,MAAMC,+BAA+B;CACnC,MAAMC,MAAMxB,IAAImB,mBAAmB;CACnC,IAAI,CAACK,KAAK,MAAM,IAAIC,MAAM,sCAAsC;CAEhE,OAAOD;AACT;AAEA,MAAaE,8BAAwB;CAAA,OAC5BH,uBAAuB,CAAC,CAAAR;AAAU;AAG3C,MAAaY,yBAAmB;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAC9B,MAAA,EAAAX,SAAiBK,uBAAuB;CACxC,MAAAV,cAAoBP,eAAe;CAAE,IAAAwB;CAAA,IAAAF,EAAA,OAAAf,eAAAe,EAAA,OAAAV,MAAA;EAGnCY,MAAApB,OAAAE,YAAA;GAIEM,KAAKR,OAAOE,SAASC,WAAW;EAAC;EAClCe,EAAA,KAAAf;EAAAe,EAAA,KAAAV;EAAAU,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OANI7B,eACL+B,EAMF;AAAC"}

@@ -24,5 +24,5 @@ import { ClientMethods } from "../types/client.js";

*/
declare const useWithClientStack: <T>(client: ClientMethods, callback: () => T) => T;
declare const useClientStackProvider: <T>(client: ClientMethods, callback: () => T) => T;
//#endregion
export { ClientStack, SYMBOL_CLIENT_INDEX, getClientIndex, useClientStack, useWithClientStack };
export { ClientStack, SYMBOL_CLIENT_INDEX, getClientIndex, useClientStack, useClientStackProvider };
//# sourceMappingURL=tap-client-stack-context.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"tap-client-stack-context.d.ts","names":[],"sources":["../../src/utils/tap-client-stack-context.ts"],"mappings":";;;;;AAQA;cAAa,mBAAA;;;AAA8D;cAK9D,cAAA,GAAkB,MAAqB,EAAb,aAAa;;;;KASxC,WAAA,YAAuB,aAAa;AAAhD;;;AAAA,cAOa,cAAA,QAAqB,WAEjC;AAT+C;AAOhD;;;AAPgD,cAenC,kBAAA,MACX,MAAA,EAAQ,aAAA,EACR,QAAA,QAAgB,CAAA,KACf,CAAA"}
{"version":3,"file":"tap-client-stack-context.d.ts","names":[],"sources":["../../src/utils/tap-client-stack-context.ts"],"mappings":";;;;;AAQA;cAAa,mBAAA;;;AAA8D;cAK9D,cAAA,GAAkB,MAAqB,EAAb,aAAa;;;;KASxC,WAAA,YAAuB,aAAa;AAAhD;;;AAAA,cAOa,cAAA,QAAqB,WAEjC;AAT+C;AAOhD;;;AAPgD,cAenC,sBAAA,MACX,MAAA,EAAQ,aAAA,EACR,QAAA,QAAgB,CAAA,KACf,CAAA"}
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
import { use } from "@assistant-ui/tap/react-shim";
import { createResourceContext, withContextProvider } from "@assistant-ui/tap";
import { createContext, use } from "@assistant-ui/tap/react-shim";
import { useContextProvider } from "@assistant-ui/tap";
//#region src/utils/tap-client-stack-context.ts

@@ -15,3 +15,3 @@ /**

};
const ClientStackContext = createResourceContext([]);
const ClientStackContext = createContext([]);
/**

@@ -27,4 +27,4 @@ * Get the current client stack inside a tap resource.

*/
const useWithClientStack = (client, callback) => {
const $ = c(6);
const useClientStackProvider = (client, callback) => {
const $ = c(3);
const currentStack = useClientStack();

@@ -38,15 +38,7 @@ let t0;

} else t0 = $[2];
const newStack = t0;
let t1;
if ($[3] !== callback || $[4] !== newStack) {
t1 = withContextProvider(ClientStackContext, newStack, callback);
$[3] = callback;
$[4] = newStack;
$[5] = t1;
} else t1 = $[5];
return t1;
return useContextProvider(ClientStackContext, t0, callback);
};
//#endregion
export { SYMBOL_CLIENT_INDEX, getClientIndex, useClientStack, useWithClientStack };
export { SYMBOL_CLIENT_INDEX, getClientIndex, useClientStack, useClientStackProvider };
//# sourceMappingURL=tap-client-stack-context.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"tap-client-stack-context.js","names":["useMemo","use","createResourceContext","withContextProvider","ClientMethods","SYMBOL_CLIENT_INDEX","Symbol","getClientIndex","client","ClientStack","ClientStackContext","useClientStack","useWithClientStack","callback","$","_c","currentStack","t0","newStack","t1"],"sources":["../../src/utils/tap-client-stack-context.ts"],"sourcesContent":["import { useMemo, use } from \"react\";\n\nimport { createResourceContext, withContextProvider } from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"../types/client\";\n\n/**\n * Symbol used to get the client index from a ClientProxy.\n */\nexport const SYMBOL_CLIENT_INDEX = Symbol(\"assistant-ui.store.clientIndex\");\n\n/**\n * Get the index of a client (its position in the client stack when created).\n */\nexport const getClientIndex = (client: ClientMethods): number => {\n return (client as unknown as { [SYMBOL_CLIENT_INDEX]: number })[\n SYMBOL_CLIENT_INDEX\n ];\n};\n\n/**\n * The client stack - an array of clients representing the current hierarchy.\n */\nexport type ClientStack = readonly ClientMethods[];\n\nconst ClientStackContext = createResourceContext<ClientStack>([]);\n\n/**\n * Get the current client stack inside a tap resource.\n */\nexport const useClientStack = (): ClientStack => {\n return use(ClientStackContext);\n};\n\n/**\n * Execute a callback with a client pushed onto the stack.\n * The stack is duplicated, not mutated.\n */\nexport const useWithClientStack = <T>(\n client: ClientMethods,\n callback: () => T,\n): T => {\n const currentStack = useClientStack();\n const newStack = useMemo(\n () => [...currentStack, client],\n [currentStack, client],\n );\n return withContextProvider(ClientStackContext, newStack, callback);\n};\n"],"mappings":";;;;;;;AAQA,MAAaK,sBAAsBC,OAAO,gCAAgC;;;;AAK1E,MAAaC,kBAAkBC,WAAkC;CAC/D,OAAQA,OACNH;AAEJ;AAOA,MAAMK,qBAAqBR,sBAAmC,CAAA,CAAE;;;;AAKhE,MAAaS,uBAAoC;CAC/C,OAAOV,IAAIS,kBAAkB;AAC/B;;;;;AAMA,MAAaE,sBAAqBJ,QAAAK,aAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAIhC,MAAAC,eAAqBL,eAAe;CAAE,IAAAM;CAAA,IAAAH,EAAA,OAAAN,UAAAM,EAAA,OAAAE,cAAA;EAE9BC,KAAA,CAAA,GAAID,cAAcR,MAAM;EAACM,EAAA,KAAAN;EAAAM,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CADjC,MAAAI,WACQD;CAEN,IAAAE;CAAA,IAAAL,EAAA,OAAAD,YAAAC,EAAA,OAAAI,UAAA;EACKC,KAAAhB,oBAAoBO,oBAAoBQ,UAAUL,QAAQ;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAA3DK;AAA2D"}
{"version":3,"file":"tap-client-stack-context.js","names":["useMemo","use","createContext","useContextProvider","ClientMethods","SYMBOL_CLIENT_INDEX","Symbol","getClientIndex","client","ClientStack","ClientStackContext","useClientStack","useClientStackProvider","callback","$","_c","currentStack","t0","newStack"],"sources":["../../src/utils/tap-client-stack-context.ts"],"sourcesContent":["import { useMemo, use, createContext } from \"react\";\n\nimport { useContextProvider } from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"../types/client\";\n\n/**\n * Symbol used to get the client index from a ClientProxy.\n */\nexport const SYMBOL_CLIENT_INDEX = Symbol(\"assistant-ui.store.clientIndex\");\n\n/**\n * Get the index of a client (its position in the client stack when created).\n */\nexport const getClientIndex = (client: ClientMethods): number => {\n return (client as unknown as { [SYMBOL_CLIENT_INDEX]: number })[\n SYMBOL_CLIENT_INDEX\n ];\n};\n\n/**\n * The client stack - an array of clients representing the current hierarchy.\n */\nexport type ClientStack = readonly ClientMethods[];\n\nconst ClientStackContext = createContext<ClientStack>([]);\n\n/**\n * Get the current client stack inside a tap resource.\n */\nexport const useClientStack = (): ClientStack => {\n return use(ClientStackContext);\n};\n\n/**\n * Execute a callback with a client pushed onto the stack.\n * The stack is duplicated, not mutated.\n */\nexport const useClientStackProvider = <T>(\n client: ClientMethods,\n callback: () => T,\n): T => {\n const currentStack = useClientStack();\n const newStack = useMemo(\n () => [...currentStack, client],\n [currentStack, client],\n );\n return useContextProvider(ClientStackContext, newStack, callback);\n};\n"],"mappings":";;;;;;;AAQA,MAAaK,sBAAsBC,OAAO,gCAAgC;;;;AAK1E,MAAaC,kBAAkBC,WAAkC;CAC/D,OAAQA,OACNH;AAEJ;AAOA,MAAMK,qBAAqBR,cAA2B,CAAA,CAAE;;;;AAKxD,MAAaS,uBAAoC;CAC/C,OAAOV,IAAIS,kBAAkB;AAC/B;;;;;AAMA,MAAaE,0BAAyBJ,QAAAK,aAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAIpC,MAAAC,eAAqBL,eAAe;CAAE,IAAAM;CAAA,IAAAH,EAAA,OAAAN,UAAAM,EAAA,OAAAE,cAAA;EAE9BC,KAAA,CAAA,GAAID,cAAcR,MAAM;EAACM,EAAA,KAAAN;EAAAM,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAE/B,OACKX,mBAAmBO,oBAAoBQ,IAAUL,QAAQ;AAAC"}
{
"name": "@assistant-ui/store",
"version": "0.2.17",
"version": "0.2.18",
"description": "Tap-based state management for @assistant-ui",

@@ -33,3 +33,3 @@ "keywords": [

"peerDependencies": {
"@assistant-ui/tap": "^0.8.0",
"@assistant-ui/tap": "^0.9.0",
"@types/react": "*",

@@ -50,4 +50,4 @@ "react": "^18 || ^19"

"vitest": "^4.1.8",
"@assistant-ui/tap": "0.8.1",
"@assistant-ui/x-buildutils": "0.0.13"
"@assistant-ui/tap": "0.9.1",
"@assistant-ui/x-buildutils": "0.0.14"
},

@@ -54,0 +54,0 @@ "publishConfig": {

@@ -39,3 +39,3 @@ "use client";

import { NotificationManager } from "./utils/NotificationManager";
import { withAssistantTapContextProvider } from "./utils/tap-assistant-context";
import { useAssistantTapContextProvider } from "./utils/tap-assistant-context";
import { useClientResource } from "./useClientResource";

@@ -62,3 +62,3 @@ import { getClientIndex } from "./utils/tap-client-stack-context";

}) => {
const { methods, state } = withAssistantTapContextProvider(
const { methods, state } = useAssistantTapContextProvider(
{ clientRef, emit },

@@ -65,0 +65,0 @@ function WithTapContext() {

@@ -6,3 +6,3 @@ import { useEffect, useMemo, useRef } from "react";

useClientStack,
useWithClientStack,
useClientStackProvider,
SYMBOL_CLIENT_INDEX,

@@ -148,3 +148,3 @@ } from "./utils/tap-client-stack-context";

const value = useWithClientStack(methods, function WithClientStack() {
const value = useClientStackProvider(methods, function WithClientStack() {
return useResource(element);

@@ -151,0 +151,0 @@ });

@@ -1,4 +0,3 @@

import { useEffectEvent, use } from "react";
import { createResourceContext, withContextProvider } from "@assistant-ui/tap";
import { useEffectEvent, use, createContext } from "react";
import { useContextProvider } from "@assistant-ui/tap";
import type {

@@ -22,10 +21,11 @@ AssistantEventName,

const AssistantTapContext =
createResourceContext<AssistantTapContextValue | null>(null);
const AssistantTapContext = createContext<AssistantTapContextValue | null>(
null,
);
export const withAssistantTapContextProvider = <TResult>(
export const useAssistantTapContextProvider = <TResult>(
value: AssistantTapContextValue,
fn: () => TResult,
) => {
return withContextProvider(AssistantTapContext, value, fn);
return useContextProvider(AssistantTapContext, value, fn);
};

@@ -32,0 +32,0 @@

@@ -1,4 +0,4 @@

import { useMemo, use } from "react";
import { useMemo, use, createContext } from "react";
import { createResourceContext, withContextProvider } from "@assistant-ui/tap";
import { useContextProvider } from "@assistant-ui/tap";
import type { ClientMethods } from "../types/client";

@@ -25,3 +25,3 @@

const ClientStackContext = createResourceContext<ClientStack>([]);
const ClientStackContext = createContext<ClientStack>([]);

@@ -39,3 +39,3 @@ /**

*/
export const useWithClientStack = <T>(
export const useClientStackProvider = <T>(
client: ClientMethods,

@@ -49,3 +49,3 @@ callback: () => T,

);
return withContextProvider(ClientStackContext, newStack, callback);
return useContextProvider(ClientStackContext, newStack, callback);
};