@assistant-ui/store
Advanced tools
+31
-0
| import type { FC, PropsWithChildren } from "react"; | ||
| import type { AssistantState } from "./types/client.js"; | ||
| export declare namespace AuiIf { | ||
| /** Props for `AuiIf`. */ | ||
| type Props = PropsWithChildren<{ | ||
| /** | ||
| * Selector that decides whether to render `children`. Children render | ||
| * when this returns `true` and unmount when it returns `false`. | ||
| */ | ||
| condition: AuiIf.Condition; | ||
| }>; | ||
| /** | ||
| * Selector passed to `AuiIf`. Receives the assistant state and must | ||
| * return a boolean. | ||
| */ | ||
| type Condition = (state: AssistantState) => boolean; | ||
| } | ||
| /** | ||
| * Conditionally renders children based on a slice of assistant state. | ||
| * | ||
| * A thin wrapper around {@link useAuiState} that renders its children | ||
| * when `condition` returns `true` and unmounts them when it returns | ||
| * `false`. Keeps render logic declarative without mounting unused | ||
| * subtrees. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.isRunning}> | ||
| * <CancelButton /> | ||
| * </AuiIf> | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.messages.length === 0}> | ||
| * <EmptyState /> | ||
| * </AuiIf> | ||
| * ``` | ||
| */ | ||
| export declare const AuiIf: FC<AuiIf.Props>; | ||
| //# sourceMappingURL=AuiIf.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"AuiIf.d.ts","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAErD,yBAAiB,KAAK,CAAC;IACrB,KAAY,KAAK,GAAG,iBAAiB,CAAC;QAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IACtE,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAGjC,CAAC"} | ||
| {"version":3,"file":"AuiIf.d.ts","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAErD,yBAAiB,KAAK,CAAC;IACrB,yBAAyB;IACzB,KAAY,KAAK,GAAG,iBAAiB,CAAC;QACpC;;;WAGG;QACH,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;KAC5B,CAAC,CAAC;IAEH;;;OAGG;IACH,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAGjC,CAAC"} |
+22
-0
| "use client"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| /** | ||
| * Conditionally renders children based on a slice of assistant state. | ||
| * | ||
| * A thin wrapper around {@link useAuiState} that renders its children | ||
| * when `condition` returns `true` and unmounts them when it returns | ||
| * `false`. Keeps render logic declarative without mounting unused | ||
| * subtrees. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.isRunning}> | ||
| * <CancelButton /> | ||
| * </AuiIf> | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.messages.length === 0}> | ||
| * <EmptyState /> | ||
| * </AuiIf> | ||
| * ``` | ||
| */ | ||
| export const AuiIf = ({ children, condition }) => { | ||
@@ -4,0 +26,0 @@ const result = useAuiState(condition); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"AuiIf.js","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAQ5C,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC,CAAC;AAEF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC"} | ||
| {"version":3,"file":"AuiIf.js","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAoB5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC,CAAC;AAEF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC"} |
@@ -30,6 +30,4 @@ import { type ResourceElement } from "@assistant-ui/tap"; | ||
| get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>; | ||
| } & (ClientMeta<K> | { | ||
| getMeta: (client: AssistantClient) => ClientMeta<K>; | ||
| }); | ||
| } & ClientMeta<K>; | ||
| } | ||
| //# sourceMappingURL=Derived.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Derived.d.ts","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,UAAU,EACX,0BAAuB;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GACjB,CAAC,SAAS,WAAW,qEAGvB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI,eAAe,CACjE,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC;AAEF,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI;QACzC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CAC/E"} | ||
| {"version":3,"file":"Derived.d.ts","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,UAAU,EACX,0BAAuB;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GACjB,CAAC,SAAS,WAAW,qEAGvB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI,eAAe,CACjE,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC;AAEF,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI;QACzC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;CACnB"} |
+59
-0
@@ -18,4 +18,63 @@ import type { AssistantClient, ClientNames, ClientElement } from "./types/client.js"; | ||
| } | ||
| /** | ||
| * Returns the current `AssistantClient` from context. | ||
| * | ||
| * Read the client supplied by the nearest {@link AuiProvider} or | ||
| * {@link AssistantRuntimeProvider}, then access a scope on it — | ||
| * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair | ||
| * with {@link useAuiState} to read reactive state and {@link useAuiEvent} | ||
| * to subscribe to events. The returned client also exposes lower-level | ||
| * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer | ||
| * `useAuiEvent` for React event subscriptions. | ||
| * | ||
| * Rendered outside a provider, the returned client's scope accessors | ||
| * throw a descriptive error whenever they are called. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const aui = useAui(); | ||
| * | ||
| * const onSend = () => aui.composer().send(); | ||
| * const onCancel = () => aui.thread().cancelRun(); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Combine with useAuiState to drive disabled state. | ||
| * const aui = useAui(); | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * | ||
| * return ( | ||
| * <button disabled={isRunning} onClick={() => aui.composer().send()}> | ||
| * Send | ||
| * </button> | ||
| * ); | ||
| * ``` | ||
| */ | ||
| export declare function useAui(): AssistantClient; | ||
| /** | ||
| * Extends the parent `AssistantClient` with additional scopes. | ||
| * | ||
| * Advanced overload used when building primitives or providers — for example, | ||
| * when a custom provider needs to register a `message`, `part`, or other scope | ||
| * onto the client visible to its descendants. Application code rarely reaches | ||
| * for this; use {@link useAui} with no arguments to read the existing client. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const aui = useAui({ | ||
| * message: Derived({ | ||
| * source: "thread", | ||
| * query: { index: 0 }, | ||
| * get: (aui) => aui.thread().message({ index: 0 }), | ||
| * }), | ||
| * }); | ||
| * | ||
| * const role = useAuiState((s) => s.message.role); | ||
| * ``` | ||
| */ | ||
| export declare function useAui(clients: useAui.Props): AssistantClient; | ||
| /** | ||
| * Extends an explicit parent `AssistantClient` with additional scopes. | ||
| */ | ||
| export declare function useAui(clients: useAui.Props, config: { | ||
@@ -22,0 +81,0 @@ parent: null | AssistantClient; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAui.d.ts","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,eAAe,EAEf,WAAW,EACX,aAAa,EAEd,0BAAuB;AACxB,OAAO,KAAK,EAAW,cAAc,EAAE,qBAAkB;AA2QzD;;GAEG;AACH,eAAO,MAAM,uBAAuB;YAKxB,eAAe;aACd,MAAM,CAAC,KAAK;;YADb,eAAe;aACd,MAAM,CAAC,KAAK;EAwDxB,CAAC;AAEF,yBAAiB,MAAM,CAAC;IACtB,KAAY,KAAK,GAAG;SACjB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;KAC1D,CAAC;CACH;AAED,wBAAgB,MAAM,IAAI,eAAe,CAAC;AAC1C,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;AAC/D,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,CAAC,KAAK,EACrB,MAAM,EAAE;IAAE,MAAM,EAAE,IAAI,GAAG,eAAe,CAAA;CAAE,GACzC,eAAe,CAAC"} | ||
| {"version":3,"file":"useAui.d.ts","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,eAAe,EAEf,WAAW,EACX,aAAa,EAEd,0BAAuB;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAsRhD;;GAEG;AACH,eAAO,MAAM,uBAAuB;YAKxB,eAAe;aACd,MAAM,CAAC,KAAK;;YADb,eAAe;aACd,MAAM,CAAC,KAAK;EAwDxB,CAAC;AAEF,yBAAiB,MAAM,CAAC;IACtB,KAAY,KAAK,GAAG;SACjB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;KAC1D,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,MAAM,IAAI,eAAe,CAAC;AAC1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;AAC/D;;GAEG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,CAAC,KAAK,EACrB,MAAM,EAAE;IAAE,MAAM,EAAE,IAAI,GAAG,eAAe,CAAA;CAAE,GACzC,eAAe,CAAC"} |
+39
-21
| "use client"; | ||
| import { useResource } from "@assistant-ui/tap/react"; | ||
| import { resource, tapMemo, tapResources, tapEffectEvent, tapEffect, tapRef, tapResource, withKey, tapResourceRoot, } from "@assistant-ui/tap"; | ||
| import { resource, tapMemo, tapResources, tapEffect, tapRef, tapResource, withKey, tapResourceRoot, } from "@assistant-ui/tap"; | ||
| import { useAssistantContextValue, DefaultAssistantClient, createRootAssistantClient, } from "./utils/react-assistant-context.js"; | ||
@@ -98,23 +98,20 @@ import { tapSplitClients, } from "./utils/splitClients.js"; | ||
| }); | ||
| const getMeta = (props, clientRef, memo) => { | ||
| if ("source" in props && "query" in props) | ||
| return props; | ||
| if (memo.dep === props) | ||
| return memo.meta; | ||
| const meta = props.getMeta(clientRef.current); | ||
| memo.meta = meta; | ||
| memo.dep = props; | ||
| return meta; | ||
| }; | ||
| const DerivedClientAccessorResource = resource(({ element, clientRef, name, }) => { | ||
| const get = tapEffectEvent(() => element.props); | ||
| // Track the latest props on a ref updated in render. The fiber is | ||
| // keyed on the scope's meta by DerivedClientsAccessorsResource, so | ||
| // source/query are stable for this fiber's lifetime and the only | ||
| // value that can change between renders for the same fiber is the | ||
| // identity of the `get` closure. Routing reads through the ref | ||
| // avoids the one-commit lag that the previous `tapEffectEvent` | ||
| // path imposed. | ||
| const propsRef = tapRef(element.props); | ||
| propsRef.current = element.props; | ||
| return tapMemo(() => { | ||
| const clientFunction = () => get().get(clientRef.current); | ||
| const metaMemo = {}; | ||
| const clientFunction = () => propsRef.current.get(clientRef.current); | ||
| Object.defineProperties(clientFunction, { | ||
| source: { | ||
| get: () => getMeta(get(), clientRef, metaMemo).source, | ||
| value: propsRef.current.source, | ||
| }, | ||
| query: { | ||
| get: () => getMeta(get(), clientRef, metaMemo).query, | ||
| value: propsRef.current.query, | ||
| }, | ||
@@ -129,8 +126,29 @@ name: { | ||
| }); | ||
| const serializeMeta = (name, meta) => { | ||
| // Sort top-level keys so {a, b} and {b, a} hash to the same fiber | ||
| // identity, and guard JSON.stringify against unusual values (BigInt, | ||
| // circular refs) so render never throws here. | ||
| let queryKey; | ||
| try { | ||
| const sorted = {}; | ||
| for (const k of Object.keys(meta.query).sort()) { | ||
| sorted[k] = meta.query[k]; | ||
| } | ||
| queryKey = JSON.stringify(sorted); | ||
| } | ||
| catch { | ||
| queryKey = String(meta.query); | ||
| } | ||
| return `${name}::${meta.source}::${queryKey}`; | ||
| }; | ||
| const DerivedClientsAccessorsResource = resource(({ clients, clientRef, }) => { | ||
| return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => withKey(key, DerivedClientAccessorResource({ | ||
| element: clients[key], | ||
| clientRef, | ||
| name: key, | ||
| }))), [clients, clientRef])); | ||
| return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => { | ||
| const name = key; | ||
| const element = clients[name]; | ||
| return withKey(serializeMeta(name, element.props), DerivedClientAccessorResource({ | ||
| element, | ||
| clientRef, | ||
| name, | ||
| })); | ||
| }), [clients, clientRef])); | ||
| }); | ||
@@ -137,0 +155,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"} |
| import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./types/events.js"; | ||
| /** | ||
| * Subscribes to an assistant event for the lifetime of the component. | ||
| * | ||
| * The subscription is established on mount and re-established whenever the | ||
| * scope or event name changes. The `callback` is wrapped in an effect-event | ||
| * shim, so the latest closure is invoked on each emission — you do not | ||
| * need to memoize it. | ||
| * | ||
| * @param selector - Either a dotted event name like | ||
| * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use | ||
| * `scope: "*"` to subscribe at the root client and receive emissions | ||
| * from any descendant scope, regardless of which one is in React | ||
| * context. | ||
| * @param callback - Invoked with the event payload. The most recent | ||
| * reference is always called. Return values are ignored, async callbacks | ||
| * are not awaited, and the callback cannot be called during render. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to transient model-context changes. | ||
| * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => { | ||
| * analytics.track("model_context_update", { threadId }); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to thread switches. | ||
| * useAuiEvent("threadListItem.switchedTo", () => { | ||
| * resetLocalState(); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Listen from the root client rather than the current React context. | ||
| * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => { | ||
| * analytics.track("model_context_update", payload); | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export declare const useAuiEvent: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void; | ||
| //# sourceMappingURL=useAuiEvent.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiEvent.d.ts","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACvB,0BAAuB;AAGxB,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,kBAAkB,EAC3D,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAUzC,CAAC"} | ||
| {"version":3,"file":"useAuiEvent.d.ts","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACvB,0BAAuB;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,kBAAkB,EAC3D,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAUzC,CAAC"} |
+41
-0
@@ -5,2 +5,43 @@ import { useEffect } from "react"; | ||
| import { normalizeEventSelector } from "./types/events.js"; | ||
| /** | ||
| * Subscribes to an assistant event for the lifetime of the component. | ||
| * | ||
| * The subscription is established on mount and re-established whenever the | ||
| * scope or event name changes. The `callback` is wrapped in an effect-event | ||
| * shim, so the latest closure is invoked on each emission — you do not | ||
| * need to memoize it. | ||
| * | ||
| * @param selector - Either a dotted event name like | ||
| * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use | ||
| * `scope: "*"` to subscribe at the root client and receive emissions | ||
| * from any descendant scope, regardless of which one is in React | ||
| * context. | ||
| * @param callback - Invoked with the event payload. The most recent | ||
| * reference is always called. Return values are ignored, async callbacks | ||
| * are not awaited, and the callback cannot be called during render. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to transient model-context changes. | ||
| * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => { | ||
| * analytics.track("model_context_update", { threadId }); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to thread switches. | ||
| * useAuiEvent("threadListItem.switchedTo", () => { | ||
| * resetLocalState(); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Listen from the root client rather than the current React context. | ||
| * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => { | ||
| * analytics.track("model_context_update", payload); | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export const useAuiEvent = (selector, callback) => { | ||
@@ -7,0 +48,0 @@ const aui = useAui(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiEvent.js","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAMlC,OAAO,EAAE,sBAAsB,EAAE,0BAAuB;AAExD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAwC,EACxC,QAAwC,EACxC,EAAE;IACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,EAC3C,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CACjC,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"useAuiEvent.js","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAMlC,OAAO,EAAE,sBAAsB,EAAE,0BAAuB;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAwC,EACxC,QAAwC,EACxC,EAAE;IACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,EAC3C,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CACjC,CAAC;AACJ,CAAC,CAAC"} |
| import type { AssistantState } from "./types/client.js"; | ||
| /** | ||
| * Hook to access a slice of the assistant state with automatic subscription | ||
| * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| * component whenever that slice changes. | ||
| * | ||
| * @param selector - Function to select a slice of the state | ||
| * @returns The selected state slice | ||
| * The `selector` is called on every store update; its return value is | ||
| * compared by `Object.is`, and the component re-renders only when the | ||
| * selected slice changes. Returning the entire state object is not | ||
| * supported and throws at runtime — select a specific field instead, or | ||
| * compose multiple `useAuiState` calls. Returning a new object or array | ||
| * literal, including spreading `s.thread` into a new object, causes a | ||
| * re-render on every store update; either select primitives or return a | ||
| * memoized reference. | ||
| * | ||
| * @param selector - Pure function that derives a value from the current | ||
| * assistant state. Should be cheap and referentially stable for equal | ||
| * inputs (plain field reads, primitives, or memoized values). | ||
| * @returns The currently selected slice. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const aui = useAui({ | ||
| * foo: RootScope({ ... }), | ||
| * }); | ||
| * ```tsx | ||
| * // Disable a button while a run is in flight. | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * ``` | ||
| * | ||
| * const bar = useAuiState((s) => s.foo.bar); | ||
| * @example | ||
| * ```tsx | ||
| * // Prefer multiple selectors over an inline object literal, which would | ||
| * // create a new reference on every render. | ||
| * const text = useAuiState((s) => s.composer.text); | ||
| * const canSend = useAuiState((s) => s.composer.canSend); | ||
| * ``` | ||
@@ -16,0 +33,0 @@ */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiState.d.ts","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAIrD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KAAG,CAmBvE,CAAC"} | ||
| {"version":3,"file":"useAuiState.d.ts","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KAAG,CAmBvE,CAAC"} |
+25
-8
@@ -5,14 +5,31 @@ import { useSyncExternalStore, useDebugValue } from "react"; | ||
| /** | ||
| * Hook to access a slice of the assistant state with automatic subscription | ||
| * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| * component whenever that slice changes. | ||
| * | ||
| * @param selector - Function to select a slice of the state | ||
| * @returns The selected state slice | ||
| * The `selector` is called on every store update; its return value is | ||
| * compared by `Object.is`, and the component re-renders only when the | ||
| * selected slice changes. Returning the entire state object is not | ||
| * supported and throws at runtime — select a specific field instead, or | ||
| * compose multiple `useAuiState` calls. Returning a new object or array | ||
| * literal, including spreading `s.thread` into a new object, causes a | ||
| * re-render on every store update; either select primitives or return a | ||
| * memoized reference. | ||
| * | ||
| * @param selector - Pure function that derives a value from the current | ||
| * assistant state. Should be cheap and referentially stable for equal | ||
| * inputs (plain field reads, primitives, or memoized values). | ||
| * @returns The currently selected slice. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const aui = useAui({ | ||
| * foo: RootScope({ ... }), | ||
| * }); | ||
| * ```tsx | ||
| * // Disable a button while a run is in flight. | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * ``` | ||
| * | ||
| * const bar = useAuiState((s) => s.foo.bar); | ||
| * @example | ||
| * ```tsx | ||
| * // Prefer multiple selectors over an inline object literal, which would | ||
| * // create a new reference on every render. | ||
| * const text = useAuiState((s) => s.composer.text); | ||
| * const canSend = useAuiState((s) => s.composer.canSend); | ||
| * ``` | ||
@@ -19,0 +36,0 @@ */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiState.js","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,wBAAwB,EAAE,2CAAwC;AAE3E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAsC,EAAK,EAAE;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,YAAY,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,oBAAoB,CAChC,GAAG,CAAC,SAAS,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7B,CAAC;IAEF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"} | ||
| {"version":3,"file":"useAuiState.js","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,wBAAwB,EAAE,2CAAwC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAsC,EAAK,EAAE;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,YAAY,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,oBAAoB,CAChC,GAAG,CAAC,SAAS,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7B,CAAC;IAEF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"} |
@@ -9,15 +9,28 @@ import type React from "react"; | ||
| /** | ||
| * Provider component for AssistantClient | ||
| * Supplies an `AssistantClient` to the React tree. | ||
| * | ||
| * Place near the root of any subtree that uses {@link useAui} or the | ||
| * primitives built on it. Components rendered outside an `AuiProvider` | ||
| * receive a default client whose scope accessors throw on use, so | ||
| * missing-provider mistakes surface at the point of use. | ||
| * | ||
| * When mounting a runtime built with one of the runtime hooks, use | ||
| * {@link AssistantRuntimeProvider} — it installs an `AuiProvider` | ||
| * internally — rather than wiring `AuiProvider` yourself. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * <AuiProvider value={aui}> | ||
| * <YourApp /> | ||
| * </AuiProvider> | ||
| * ```tsx | ||
| * function ScopedAssistant({ children, scopes }) { | ||
| * const aui = useAui(scopes); | ||
| * | ||
| * return <AuiProvider value={aui}>{children}</AuiProvider>; | ||
| * } | ||
| * ``` | ||
| */ | ||
| export declare const AuiProvider: ({ value, children, }: { | ||
| /** Assistant client to expose to descendants. */ | ||
| value: AssistantClient; | ||
| /** Subtree that may read from the client. */ | ||
| children: React.ReactNode; | ||
| }) => React.ReactElement; | ||
| //# sourceMappingURL=react-assistant-context.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"react-assistant-context.d.ts","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAA2B,2BAAwB;AAmDhF,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,EAAE,eAIlC,CAAC;AAMJ,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,QAAO,eAUzC,CAAC;AAOL,eAAO,MAAM,wBAAwB,QAAO,eAE3C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAI,sBAGzB;IACD,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,KAAG,KAAK,CAAC,YAMT,CAAC"} | ||
| {"version":3,"file":"react-assistant-context.d.ts","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAA2B,2BAAwB;AAmDhF,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,EAAE,eAIlC,CAAC;AAMJ,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,QAAO,eAUzC,CAAC;AAOL,eAAO,MAAM,wBAAwB,QAAO,eAE3C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,WAAW,GAAI,sBAGzB;IACD,iDAAiD;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,KAAG,KAAK,CAAC,YAMT,CAAC"} |
@@ -56,9 +56,20 @@ import { jsx as _jsx } from "react/jsx-runtime"; | ||
| /** | ||
| * Provider component for AssistantClient | ||
| * Supplies an `AssistantClient` to the React tree. | ||
| * | ||
| * Place near the root of any subtree that uses {@link useAui} or the | ||
| * primitives built on it. Components rendered outside an `AuiProvider` | ||
| * receive a default client whose scope accessors throw on use, so | ||
| * missing-provider mistakes surface at the point of use. | ||
| * | ||
| * When mounting a runtime built with one of the runtime hooks, use | ||
| * {@link AssistantRuntimeProvider} — it installs an `AuiProvider` | ||
| * internally — rather than wiring `AuiProvider` yourself. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * <AuiProvider value={aui}> | ||
| * <YourApp /> | ||
| * </AuiProvider> | ||
| * ```tsx | ||
| * function ScopedAssistant({ children, scopes }) { | ||
| * const aui = useAui(scopes); | ||
| * | ||
| * return <AuiProvider value={aui}>{children}</AuiProvider>; | ||
| * } | ||
| * ``` | ||
@@ -65,0 +76,0 @@ */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"react-assistant-context.js","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,qCAAkC;AACnC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,8BAA2B;AAE/E,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;AAEvC,MAAM,sBAAsB,GAAG,CAC7B,OAAe,EACiB,EAAE;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAmC,CAAC;IACrC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;IACjB,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,kCACJ,SAAQ,gBAAgB;IAGxB,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,eAAe,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,eAAe,CAAC;QAC1C,IAAI,IAAI,KAAK,8BAA8B;YACzC,OAAO,2CAA2C,CAAC;QACrD,MAAM,aAAa,GAAG,uBAAuB,CAC3C,IAAI,EACJ,wBAAwB,CACzB,CAAC;QACF,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAClD,OAAO,sBAAsB,CAC3B,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IAED,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,OAAO,CACL,IAAI,KAAK,WAAW;YACpB,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,8BAA8B,CACxC,CAAC;IACJ,CAAC;CACF;AACD,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GACjC,IAAI,KAAK,CACP,EAAqB,EACrB,IAAI,kCAAkC,EAAE,CACzC,CAAC;AAEJ,MAAM,2CAA2C,GAAG,2BAA2B,CAC7E,sBAAsB,CACvB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAoB,EAAE,CAC7D,IAAI,KAAK,CAAkB,EAAqB,EAAE;IAChD,GAAG,CAAC,CAAkB,EAAE,IAAqB;QAC3C,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACvE,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAElD,OAAO,sBAAsB,CAC3B,sCAAsC,MAAM,CAAC,IAAI,CAAC,aAAa,CAChE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,gBAAgB,GAAG,aAAa,CAAkB,sBAAsB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAoB,EAAE;IAC5D,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,KAAK,EACL,QAAQ,GAIT,EAAsB,EAAE;IACvB,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACpC,QAAQ,GACiB,CAC7B,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"react-assistant-context.js","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,qCAAkC;AACnC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,8BAA2B;AAE/E,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;AAEvC,MAAM,sBAAsB,GAAG,CAC7B,OAAe,EACiB,EAAE;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAmC,CAAC;IACrC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;IACjB,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,kCACJ,SAAQ,gBAAgB;IAGxB,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,eAAe,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,eAAe,CAAC;QAC1C,IAAI,IAAI,KAAK,8BAA8B;YACzC,OAAO,2CAA2C,CAAC;QACrD,MAAM,aAAa,GAAG,uBAAuB,CAC3C,IAAI,EACJ,wBAAwB,CACzB,CAAC;QACF,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAClD,OAAO,sBAAsB,CAC3B,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IAED,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,OAAO,CACL,IAAI,KAAK,WAAW;YACpB,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,8BAA8B,CACxC,CAAC;IACJ,CAAC;CACF;AACD,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GACjC,IAAI,KAAK,CACP,EAAqB,EACrB,IAAI,kCAAkC,EAAE,CACzC,CAAC;AAEJ,MAAM,2CAA2C,GAAG,2BAA2B,CAC7E,sBAAsB,CACvB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAoB,EAAE,CAC7D,IAAI,KAAK,CAAkB,EAAqB,EAAE;IAChD,GAAG,CAAC,CAAkB,EAAE,IAAqB;QAC3C,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACvE,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAElD,OAAO,sBAAsB,CAC3B,sCAAsC,MAAM,CAAC,IAAI,CAAC,aAAa,CAChE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,gBAAgB,GAAG,aAAa,CAAkB,sBAAsB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAoB,EAAE;IAC5D,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,KAAK,EACL,QAAQ,GAMT,EAAsB,EAAE;IACvB,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACpC,QAAQ,GACiB,CAC7B,CAAC;AACJ,CAAC,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"splitClients.d.ts","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,cAAc,EAAE,sBAAmB;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,2BAAwB;AAEzB,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAkB;AAGxC,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CACjD,CAAC;AAsDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,KAAK,EACrB,YAAY,eAAe;;;CAQ5B,CAAC"} | ||
| {"version":3,"file":"splitClients.d.ts","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,cAAc,EAAE,sBAAmB;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,2BAAwB;AAEzB,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAkB;AAGxC,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CACjD,CAAC;AAwDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,KAAK,EACrB,YAAY,eAAe;;;CAQ5B,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"splitClients.js","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,sBAAmB;AAM1D,OAAO,EAAE,kBAAkB,EAAE,oCAAiC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS5C;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAqB,EAAE,UAA2B;IACtE,oEAAoE;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAG1B,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB;gBAAE,SAAS;YAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9B,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,4DAA4D;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGrD,EAAE,CAAC;QACJ,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB,EAAE,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,GAAG,aAA4C,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,aAA2C,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAmB,MAAS,EAAE,EAAE;IAC3D,wEAAwE;IACxE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAqB,EACrB,UAA2B,EAC3B,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1E,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC9C,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC;KACrD,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"splitClients.js","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,sBAAmB;AAM1D,OAAO,EAAE,kBAAkB,EAAE,oCAAiC;AAE9D,OAAO,EAAE,OAAO,EAAwB,MAAM,mBAAmB,CAAC;AASlE;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAqB,EAAE,UAA2B;IACtE,oEAAoE;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAG1B,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB;gBAAE,SAAS;YAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,kBAAkB,CAClC,aAAa,CAAC,IAA4C,CAC3D,CAAC;YACF,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9B,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,4DAA4D;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGrD,EAAE,CAAC;QACJ,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB,EAAE,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,GAAG,aAA4C,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,aAA2C,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAmB,MAAS,EAAE,EAAE;IAC3D,wEAAwE;IACxE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAqB,EACrB,UAA2B,EAC3B,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1E,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC9C,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC;KACrD,CAAC;AACJ,CAAC,CAAC"} |
+2
-2
| { | ||
| "name": "@assistant-ui/store", | ||
| "version": "0.2.10", | ||
| "version": "0.2.11", | ||
| "description": "Tap-based state management for @assistant-ui", | ||
@@ -50,3 +50,3 @@ "keywords": [ | ||
| "@assistant-ui/tap": "0.5.11", | ||
| "@assistant-ui/x-buildutils": "0.0.7" | ||
| "@assistant-ui/x-buildutils": "0.0.8" | ||
| }, | ||
@@ -53,0 +53,0 @@ "publishConfig": { |
+36
-65
@@ -1,28 +0,53 @@ | ||
| # @assistant-ui/store | ||
| # `@assistant-ui/store` | ||
| Tap-based state management with React Context integration. | ||
| [](https://www.npmjs.com/package/@assistant-ui/store) | ||
| [](https://github.com/assistant-ui/assistant-ui) | ||
| ## Quick Start | ||
| Tap-based state container with React Context integration. Bridges `@assistant-ui/tap` resources into React via `useAui`, `useAuiState`, and `<AuiProvider>`. | ||
| `store` powers the runtime layer of assistant-ui. Most users do not install it directly; reach for `@assistant-ui/react` instead. | ||
| ## Installation | ||
| ```bash | ||
| npm install @assistant-ui/store @assistant-ui/tap | ||
| ``` | ||
| ## Usage | ||
| ```typescript | ||
| import { resource, tapState } from "@assistant-ui/tap"; | ||
| import { useAui, useAuiState, AuiProvider, type ClientOutput } from "@assistant-ui/store"; | ||
| import { | ||
| useAui, | ||
| useAuiState, | ||
| AuiProvider, | ||
| type ClientOutput, | ||
| } from "@assistant-ui/store"; | ||
| // 1. Define client type | ||
| declare module "@assistant-ui/store" { | ||
| interface ScopeRegistry { | ||
| counter: { methods: { getState: () => { count: number }; increment: () => void } }; | ||
| counter: { | ||
| methods: { | ||
| getState: () => { count: number }; | ||
| increment: () => void; | ||
| }; | ||
| }; | ||
| } | ||
| } | ||
| // 2. Create resource | ||
| const CounterClient = resource((): ClientOutput<"counter"> => { | ||
| const [state, setState] = tapState({ count: 0 }); | ||
| return { getState: () => state, increment: () => setState({ count: state.count + 1 }) }; | ||
| return { | ||
| getState: () => state, | ||
| increment: () => setState({ count: state.count + 1 }), | ||
| }; | ||
| }); | ||
| // 3. Use in React | ||
| function App() { | ||
| const aui = useAui({ counter: CounterClient() }); | ||
| return <AuiProvider value={aui}><Counter /></AuiProvider>; | ||
| return ( | ||
| <AuiProvider value={aui}> | ||
| <Counter /> | ||
| </AuiProvider> | ||
| ); | ||
| } | ||
@@ -37,56 +62,2 @@ | ||
| ## Concepts | ||
| **Clients**: Named state containers registered via module augmentation. | ||
| ```typescript | ||
| declare module "@assistant-ui/store" { | ||
| interface ScopeRegistry { | ||
| myClient: { | ||
| methods: MyMethods; // must include getState(): MyState | ||
| meta?: { source: "parent"; query: { id: string } }; | ||
| events?: { "myClient.updated": { id: string } }; | ||
| }; | ||
| } | ||
| } | ||
| ``` | ||
| **Derived Clients**: Access nested clients from parents. | ||
| ```typescript | ||
| useAui({ | ||
| item: Derived({ source: "list", query: { index: 0 }, get: (aui) => aui.list().item({ index: 0 }) }), | ||
| }); | ||
| ``` | ||
| **Events**: | ||
| ```typescript | ||
| const emit = tapAssistantEmit(); | ||
| emit("myClient.updated", { id: "123" }); | ||
| useAuiEvent("myClient.updated", (p) => console.log(p.id)); | ||
| ``` | ||
| ## API | ||
| | Hook/Component | Description | | ||
| |----------------|-------------| | ||
| | `useAui()` | Get client from context | | ||
| | `useAui(clients)` | Create/extend client | | ||
| | `useAuiState(selector)` | Subscribe to state | | ||
| | `useAuiEvent(event, cb)` | Subscribe to events | | ||
| | `AuiProvider` | Provide client to tree | | ||
| | `AuiIf` | Conditional rendering | | ||
| | Tap Utility | Description | | ||
| |-------------|-------------| | ||
| | `tapAssistantClientRef()` | Access client ref in resources | | ||
| | `tapAssistantEmit()` | Emit events from resources | | ||
| | `tapClientResource(element)` | Wrap resource for event scoping (1:1 mappings) | | ||
| | `tapClientLookup(map, fn, deps)` | Lookup by `{index}` or `{key}` | | ||
| | `tapClientList(config)` | Dynamic list with add/remove | | ||
| | `attachTransformScopes(resource, fn)` | Attach scope transform | | ||
| | Type | Description | | ||
| |------|-------------| | ||
| | `ClientOutput<K>` | Resource return type (methods object) | | ||
| | `ScopeRegistry` | Module augmentation interface | | ||
| | `AssistantClient` | Full client type | | ||
| Full API reference (clients, derived clients, events, `tapClientLookup`, `tapClientList`) at [assistant-ui.com/tap/docs/store/quickstart](https://www.assistant-ui.com/tap/docs/store/quickstart). |
+35
-1
@@ -8,6 +8,40 @@ "use client"; | ||
| export namespace AuiIf { | ||
| export type Props = PropsWithChildren<{ condition: AuiIf.Condition }>; | ||
| /** Props for `AuiIf`. */ | ||
| export type Props = PropsWithChildren<{ | ||
| /** | ||
| * Selector that decides whether to render `children`. Children render | ||
| * when this returns `true` and unmount when it returns `false`. | ||
| */ | ||
| condition: AuiIf.Condition; | ||
| }>; | ||
| /** | ||
| * Selector passed to `AuiIf`. Receives the assistant state and must | ||
| * return a boolean. | ||
| */ | ||
| export type Condition = (state: AssistantState) => boolean; | ||
| } | ||
| /** | ||
| * Conditionally renders children based on a slice of assistant state. | ||
| * | ||
| * A thin wrapper around {@link useAuiState} that renders its children | ||
| * when `condition` returns `true` and unmounts them when it returns | ||
| * `false`. Keeps render logic declarative without mounting unused | ||
| * subtrees. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.isRunning}> | ||
| * <CancelButton /> | ||
| * </AuiIf> | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.messages.length === 0}> | ||
| * <EmptyState /> | ||
| * </AuiIf> | ||
| * ``` | ||
| */ | ||
| export const AuiIf: FC<AuiIf.Props> = ({ children, condition }) => { | ||
@@ -14,0 +48,0 @@ const result = useAuiState(condition); |
+1
-1
@@ -45,3 +45,3 @@ import { resource, type ResourceElement } from "@assistant-ui/tap"; | ||
| get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>; | ||
| } & (ClientMeta<K> | { getMeta: (client: AssistantClient) => ClientMeta<K> }); | ||
| } & ClientMeta<K>; | ||
| } |
+101
-32
@@ -8,3 +8,2 @@ "use client"; | ||
| tapResources, | ||
| tapEffectEvent, | ||
| tapEffect, | ||
@@ -23,3 +22,3 @@ tapRef, | ||
| } from "./types/client"; | ||
| import type { Derived, DerivedElement } from "./Derived"; | ||
| import type { DerivedElement } from "./Derived"; | ||
| import { | ||
@@ -214,20 +213,2 @@ useAssistantContextValue, | ||
| type MetaMemo<K extends ClientNames> = { | ||
| meta?: ClientMeta<K>; | ||
| dep?: unknown; | ||
| }; | ||
| const getMeta = <K extends ClientNames>( | ||
| props: Derived.Props<K>, | ||
| clientRef: { parent: AssistantClient; current: AssistantClient | null }, | ||
| memo: MetaMemo<K>, | ||
| ): ClientMeta<K> => { | ||
| if ("source" in props && "query" in props) return props; | ||
| if (memo.dep === props) return memo.meta!; | ||
| const meta = props.getMeta(clientRef.current!); | ||
| memo.meta = meta; | ||
| memo.dep = props; | ||
| return meta; | ||
| }; | ||
| const DerivedClientAccessorResource = resource( | ||
@@ -243,13 +224,20 @@ <K extends ClientNames>({ | ||
| }) => { | ||
| const get = tapEffectEvent(() => element.props); | ||
| // Track the latest props on a ref updated in render. The fiber is | ||
| // keyed on the scope's meta by DerivedClientsAccessorsResource, so | ||
| // source/query are stable for this fiber's lifetime and the only | ||
| // value that can change between renders for the same fiber is the | ||
| // identity of the `get` closure. Routing reads through the ref | ||
| // avoids the one-commit lag that the previous `tapEffectEvent` | ||
| // path imposed. | ||
| const propsRef = tapRef(element.props); | ||
| propsRef.current = element.props; | ||
| return tapMemo(() => { | ||
| const clientFunction = () => get().get(clientRef.current!); | ||
| const metaMemo = {}; | ||
| const clientFunction = () => propsRef.current.get(clientRef.current!); | ||
| Object.defineProperties(clientFunction, { | ||
| source: { | ||
| get: () => getMeta(get(), clientRef, metaMemo).source, | ||
| value: propsRef.current.source, | ||
| }, | ||
| query: { | ||
| get: () => getMeta(get(), clientRef, metaMemo).query, | ||
| value: propsRef.current.query, | ||
| }, | ||
@@ -266,2 +254,22 @@ name: { | ||
| const serializeMeta = <K extends ClientNames>( | ||
| name: K, | ||
| meta: ClientMeta<K>, | ||
| ): string => { | ||
| // Sort top-level keys so {a, b} and {b, a} hash to the same fiber | ||
| // identity, and guard JSON.stringify against unusual values (BigInt, | ||
| // circular refs) so render never throws here. | ||
| let queryKey: string; | ||
| try { | ||
| const sorted: Record<string, unknown> = {}; | ||
| for (const k of Object.keys(meta.query as object).sort()) { | ||
| sorted[k] = (meta.query as Record<string, unknown>)[k]; | ||
| } | ||
| queryKey = JSON.stringify(sorted); | ||
| } catch { | ||
| queryKey = String(meta.query); | ||
| } | ||
| return `${name}::${meta.source}::${queryKey}`; | ||
| }; | ||
| const DerivedClientsAccessorsResource = resource( | ||
@@ -278,12 +286,14 @@ ({ | ||
| () => | ||
| Object.keys(clients).map((key) => | ||
| withKey( | ||
| key, | ||
| Object.keys(clients).map((key) => { | ||
| const name = key as keyof typeof clients; | ||
| const element = clients[name]!; | ||
| return withKey( | ||
| serializeMeta(name, element.props), | ||
| DerivedClientAccessorResource({ | ||
| element: clients[key as keyof typeof clients]!, | ||
| element, | ||
| clientRef, | ||
| name: key as keyof typeof clients, | ||
| name, | ||
| }), | ||
| ), | ||
| ), | ||
| ); | ||
| }), | ||
| [clients, clientRef], | ||
@@ -368,4 +378,63 @@ ), | ||
| /** | ||
| * Returns the current `AssistantClient` from context. | ||
| * | ||
| * Read the client supplied by the nearest {@link AuiProvider} or | ||
| * {@link AssistantRuntimeProvider}, then access a scope on it — | ||
| * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair | ||
| * with {@link useAuiState} to read reactive state and {@link useAuiEvent} | ||
| * to subscribe to events. The returned client also exposes lower-level | ||
| * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer | ||
| * `useAuiEvent` for React event subscriptions. | ||
| * | ||
| * Rendered outside a provider, the returned client's scope accessors | ||
| * throw a descriptive error whenever they are called. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const aui = useAui(); | ||
| * | ||
| * const onSend = () => aui.composer().send(); | ||
| * const onCancel = () => aui.thread().cancelRun(); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Combine with useAuiState to drive disabled state. | ||
| * const aui = useAui(); | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * | ||
| * return ( | ||
| * <button disabled={isRunning} onClick={() => aui.composer().send()}> | ||
| * Send | ||
| * </button> | ||
| * ); | ||
| * ``` | ||
| */ | ||
| export function useAui(): AssistantClient; | ||
| /** | ||
| * Extends the parent `AssistantClient` with additional scopes. | ||
| * | ||
| * Advanced overload used when building primitives or providers — for example, | ||
| * when a custom provider needs to register a `message`, `part`, or other scope | ||
| * onto the client visible to its descendants. Application code rarely reaches | ||
| * for this; use {@link useAui} with no arguments to read the existing client. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const aui = useAui({ | ||
| * message: Derived({ | ||
| * source: "thread", | ||
| * query: { index: 0 }, | ||
| * get: (aui) => aui.thread().message({ index: 0 }), | ||
| * }), | ||
| * }); | ||
| * | ||
| * const role = useAuiState((s) => s.message.role); | ||
| * ``` | ||
| */ | ||
| export function useAui(clients: useAui.Props): AssistantClient; | ||
| /** | ||
| * Extends an explicit parent `AssistantClient` with additional scopes. | ||
| */ | ||
| export function useAui( | ||
@@ -372,0 +441,0 @@ clients: useAui.Props, |
+41
-0
@@ -11,2 +11,43 @@ import { useEffect } from "react"; | ||
| /** | ||
| * Subscribes to an assistant event for the lifetime of the component. | ||
| * | ||
| * The subscription is established on mount and re-established whenever the | ||
| * scope or event name changes. The `callback` is wrapped in an effect-event | ||
| * shim, so the latest closure is invoked on each emission — you do not | ||
| * need to memoize it. | ||
| * | ||
| * @param selector - Either a dotted event name like | ||
| * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use | ||
| * `scope: "*"` to subscribe at the root client and receive emissions | ||
| * from any descendant scope, regardless of which one is in React | ||
| * context. | ||
| * @param callback - Invoked with the event payload. The most recent | ||
| * reference is always called. Return values are ignored, async callbacks | ||
| * are not awaited, and the callback cannot be called during render. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to transient model-context changes. | ||
| * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => { | ||
| * analytics.track("model_context_update", { threadId }); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to thread switches. | ||
| * useAuiEvent("threadListItem.switchedTo", () => { | ||
| * resetLocalState(); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Listen from the root client rather than the current React context. | ||
| * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => { | ||
| * analytics.track("model_context_update", payload); | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export const useAuiEvent = <TEvent extends AssistantEventName>( | ||
@@ -13,0 +54,0 @@ selector: AssistantEventSelector<TEvent>, |
+25
-8
@@ -7,14 +7,31 @@ import { useSyncExternalStore, useDebugValue } from "react"; | ||
| /** | ||
| * Hook to access a slice of the assistant state with automatic subscription | ||
| * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| * component whenever that slice changes. | ||
| * | ||
| * @param selector - Function to select a slice of the state | ||
| * @returns The selected state slice | ||
| * The `selector` is called on every store update; its return value is | ||
| * compared by `Object.is`, and the component re-renders only when the | ||
| * selected slice changes. Returning the entire state object is not | ||
| * supported and throws at runtime — select a specific field instead, or | ||
| * compose multiple `useAuiState` calls. Returning a new object or array | ||
| * literal, including spreading `s.thread` into a new object, causes a | ||
| * re-render on every store update; either select primitives or return a | ||
| * memoized reference. | ||
| * | ||
| * @param selector - Pure function that derives a value from the current | ||
| * assistant state. Should be cheap and referentially stable for equal | ||
| * inputs (plain field reads, primitives, or memoized values). | ||
| * @returns The currently selected slice. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const aui = useAui({ | ||
| * foo: RootScope({ ... }), | ||
| * }); | ||
| * ```tsx | ||
| * // Disable a button while a run is in flight. | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * ``` | ||
| * | ||
| * const bar = useAuiState((s) => s.foo.bar); | ||
| * @example | ||
| * ```tsx | ||
| * // Prefer multiple selectors over an inline object literal, which would | ||
| * // create a new reference on every render. | ||
| * const text = useAuiState((s) => s.composer.text); | ||
| * const canSend = useAuiState((s) => s.composer.canSend); | ||
| * ``` | ||
@@ -21,0 +38,0 @@ */ |
@@ -88,9 +88,20 @@ import type React from "react"; | ||
| /** | ||
| * Provider component for AssistantClient | ||
| * Supplies an `AssistantClient` to the React tree. | ||
| * | ||
| * Place near the root of any subtree that uses {@link useAui} or the | ||
| * primitives built on it. Components rendered outside an `AuiProvider` | ||
| * receive a default client whose scope accessors throw on use, so | ||
| * missing-provider mistakes surface at the point of use. | ||
| * | ||
| * When mounting a runtime built with one of the runtime hooks, use | ||
| * {@link AssistantRuntimeProvider} — it installs an `AuiProvider` | ||
| * internally — rather than wiring `AuiProvider` yourself. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * <AuiProvider value={aui}> | ||
| * <YourApp /> | ||
| * </AuiProvider> | ||
| * ```tsx | ||
| * function ScopedAssistant({ children, scopes }) { | ||
| * const aui = useAui(scopes); | ||
| * | ||
| * return <AuiProvider value={aui}>{children}</AuiProvider>; | ||
| * } | ||
| * ``` | ||
@@ -102,3 +113,5 @@ */ | ||
| }: { | ||
| /** Assistant client to expose to descendants. */ | ||
| value: AssistantClient; | ||
| /** Subtree that may read from the client. */ | ||
| children: React.ReactNode; | ||
@@ -105,0 +118,0 @@ }): React.ReactElement => { |
@@ -9,3 +9,3 @@ import { Derived, type DerivedElement } from "../Derived"; | ||
| import type { useAui } from "../useAui"; | ||
| import { tapMemo } from "@assistant-ui/tap"; | ||
| import { tapMemo, type ResourceElement } from "@assistant-ui/tap"; | ||
@@ -39,3 +39,5 @@ export type RootClients = Partial< | ||
| const transform = getTransformScopes(clientElement.type); | ||
| const transform = getTransformScopes( | ||
| clientElement.type as (props: any) => ResourceElement<any>, | ||
| ); | ||
| if (transform) { | ||
@@ -42,0 +44,0 @@ transform(scopes, baseClient); |
186389
9.39%3705
13.62%63
-31.52%