@assistant-ui/store 0.2.10 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,30 +1,55 @@
1
- # @assistant-ui/store
1
+ # `@assistant-ui/store`
2
2
 
3
- Tap-based state management with React Context integration.
3
+ [![npm version](https://img.shields.io/npm/v/@assistant-ui/store)](https://www.npmjs.com/package/@assistant-ui/store)
4
+ [![GitHub stars](https://img.shields.io/github/stars/assistant-ui/assistant-ui)](https://github.com/assistant-ui/assistant-ui)
4
5
 
5
- ## Quick Start
6
+ Tap-based state container with React Context integration. Bridges `@assistant-ui/tap` resources into React via `useAui`, `useAuiState`, and `<AuiProvider>`.
7
+
8
+ `store` powers the runtime layer of assistant-ui. Most users do not install it directly; reach for `@assistant-ui/react` instead.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install @assistant-ui/store @assistant-ui/tap
14
+ ```
15
+
16
+ ## Usage
6
17
 
7
18
  ```typescript
8
19
  import { resource, tapState } from "@assistant-ui/tap";
9
- import { useAui, useAuiState, AuiProvider, type ClientOutput } from "@assistant-ui/store";
20
+ import {
21
+ useAui,
22
+ useAuiState,
23
+ AuiProvider,
24
+ type ClientOutput,
25
+ } from "@assistant-ui/store";
10
26
 
11
- // 1. Define client type
12
27
  declare module "@assistant-ui/store" {
13
28
  interface ScopeRegistry {
14
- counter: { methods: { getState: () => { count: number }; increment: () => void } };
29
+ counter: {
30
+ methods: {
31
+ getState: () => { count: number };
32
+ increment: () => void;
33
+ };
34
+ };
15
35
  }
16
36
  }
17
37
 
18
- // 2. Create resource
19
38
  const CounterClient = resource((): ClientOutput<"counter"> => {
20
39
  const [state, setState] = tapState({ count: 0 });
21
- return { getState: () => state, increment: () => setState({ count: state.count + 1 }) };
40
+ return {
41
+ getState: () => state,
42
+ increment: () => setState({ count: state.count + 1 }),
43
+ };
22
44
  });
23
45
 
24
- // 3. Use in React
25
46
  function App() {
26
47
  const aui = useAui({ counter: CounterClient() });
27
- return <AuiProvider value={aui}><Counter /></AuiProvider>;
48
+ return (
49
+ <AuiProvider value={aui}>
50
+ <Counter />
51
+ </AuiProvider>
52
+ );
28
53
  }
29
54
 
30
55
  function Counter() {
@@ -34,58 +59,4 @@ function Counter() {
34
59
  }
35
60
  ```
36
61
 
37
- ## Concepts
38
-
39
- **Clients**: Named state containers registered via module augmentation.
40
- ```typescript
41
- declare module "@assistant-ui/store" {
42
- interface ScopeRegistry {
43
- myClient: {
44
- methods: MyMethods; // must include getState(): MyState
45
- meta?: { source: "parent"; query: { id: string } };
46
- events?: { "myClient.updated": { id: string } };
47
- };
48
- }
49
- }
50
- ```
51
-
52
- **Derived Clients**: Access nested clients from parents.
53
- ```typescript
54
- useAui({
55
- item: Derived({ source: "list", query: { index: 0 }, get: (aui) => aui.list().item({ index: 0 }) }),
56
- });
57
- ```
58
-
59
- **Events**:
60
- ```typescript
61
- const emit = tapAssistantEmit();
62
- emit("myClient.updated", { id: "123" });
63
-
64
- useAuiEvent("myClient.updated", (p) => console.log(p.id));
65
- ```
66
-
67
- ## API
68
-
69
- | Hook/Component | Description |
70
- |----------------|-------------|
71
- | `useAui()` | Get client from context |
72
- | `useAui(clients)` | Create/extend client |
73
- | `useAuiState(selector)` | Subscribe to state |
74
- | `useAuiEvent(event, cb)` | Subscribe to events |
75
- | `AuiProvider` | Provide client to tree |
76
- | `AuiIf` | Conditional rendering |
77
-
78
- | Tap Utility | Description |
79
- |-------------|-------------|
80
- | `tapAssistantClientRef()` | Access client ref in resources |
81
- | `tapAssistantEmit()` | Emit events from resources |
82
- | `tapClientResource(element)` | Wrap resource for event scoping (1:1 mappings) |
83
- | `tapClientLookup(map, fn, deps)` | Lookup by `{index}` or `{key}` |
84
- | `tapClientList(config)` | Dynamic list with add/remove |
85
- | `attachTransformScopes(resource, fn)` | Attach scope transform |
86
-
87
- | Type | Description |
88
- |------|-------------|
89
- | `ClientOutput<K>` | Resource return type (methods object) |
90
- | `ScopeRegistry` | Module augmentation interface |
91
- | `AssistantClient` | Full client type |
62
+ 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).
package/dist/AuiIf.d.ts CHANGED
@@ -1,10 +1,41 @@
1
1
  import type { FC, PropsWithChildren } from "react";
2
2
  import type { AssistantState } from "./types/client.js";
3
3
  export declare namespace AuiIf {
4
+ /** Props for `AuiIf`. */
4
5
  type Props = PropsWithChildren<{
6
+ /**
7
+ * Selector that decides whether to render `children`. Children render
8
+ * when this returns `true` and unmount when it returns `false`.
9
+ */
5
10
  condition: AuiIf.Condition;
6
11
  }>;
12
+ /**
13
+ * Selector passed to `AuiIf`. Receives the assistant state and must
14
+ * return a boolean.
15
+ */
7
16
  type Condition = (state: AssistantState) => boolean;
8
17
  }
18
+ /**
19
+ * Conditionally renders children based on a slice of assistant state.
20
+ *
21
+ * A thin wrapper around {@link useAuiState} that renders its children
22
+ * when `condition` returns `true` and unmounts them when it returns
23
+ * `false`. Keeps render logic declarative without mounting unused
24
+ * subtrees.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <AuiIf condition={(s) => s.thread.isRunning}>
29
+ * <CancelButton />
30
+ * </AuiIf>
31
+ * ```
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * <AuiIf condition={(s) => s.thread.messages.length === 0}>
36
+ * <EmptyState />
37
+ * </AuiIf>
38
+ * ```
39
+ */
9
40
  export declare const AuiIf: FC<AuiIf.Props>;
10
41
  //# sourceMappingURL=AuiIf.d.ts.map
@@ -1 +1 @@
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"}
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,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"}
package/dist/AuiIf.js CHANGED
@@ -1,5 +1,27 @@
1
1
  "use client";
2
2
  import { useAuiState } from "./useAuiState.js";
3
+ /**
4
+ * Conditionally renders children based on a slice of assistant state.
5
+ *
6
+ * A thin wrapper around {@link useAuiState} that renders its children
7
+ * when `condition` returns `true` and unmounts them when it returns
8
+ * `false`. Keeps render logic declarative without mounting unused
9
+ * subtrees.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <AuiIf condition={(s) => s.thread.isRunning}>
14
+ * <CancelButton />
15
+ * </AuiIf>
16
+ * ```
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <AuiIf condition={(s) => s.thread.messages.length === 0}>
21
+ * <EmptyState />
22
+ * </AuiIf>
23
+ * ```
24
+ */
3
25
  export const AuiIf = ({ children, condition }) => {
4
26
  const result = useAuiState(condition);
5
27
  return result ? children : null;
package/dist/AuiIf.js.map CHANGED
@@ -1 +1 @@
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"}
1
+ {"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"}
package/dist/Derived.d.ts CHANGED
@@ -27,8 +27,6 @@ export declare namespace Derived {
27
27
  */
28
28
  type Props<K extends ClientNames> = {
29
29
  get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>;
30
- } & (ClientMeta<K> | {
31
- getMeta: (client: AssistantClient) => ClientMeta<K>;
32
- });
30
+ } & ClientMeta<K>;
33
31
  }
34
32
  //# sourceMappingURL=Derived.d.ts.map
@@ -1 +1 @@
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"}
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,UAAU,CAAC,CAAC,CAAC,CAAC;CACnB"}
package/dist/useAui.d.ts CHANGED
@@ -15,8 +15,67 @@ export declare namespace useAui {
15
15
  [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;
16
16
  };
17
17
  }
18
+ /**
19
+ * Returns the current `AssistantClient` from context.
20
+ *
21
+ * Read the client supplied by the nearest {@link AuiProvider} or
22
+ * {@link AssistantRuntimeProvider}, then access a scope on it —
23
+ * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair
24
+ * with {@link useAuiState} to read reactive state and {@link useAuiEvent}
25
+ * to subscribe to events. The returned client also exposes lower-level
26
+ * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer
27
+ * `useAuiEvent` for React event subscriptions.
28
+ *
29
+ * Rendered outside a provider, the returned client's scope accessors
30
+ * throw a descriptive error whenever they are called.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * const aui = useAui();
35
+ *
36
+ * const onSend = () => aui.composer().send();
37
+ * const onCancel = () => aui.thread().cancelRun();
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * // Combine with useAuiState to drive disabled state.
43
+ * const aui = useAui();
44
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
45
+ *
46
+ * return (
47
+ * <button disabled={isRunning} onClick={() => aui.composer().send()}>
48
+ * Send
49
+ * </button>
50
+ * );
51
+ * ```
52
+ */
18
53
  export declare function useAui(): AssistantClient;
54
+ /**
55
+ * Extends the parent `AssistantClient` with additional scopes.
56
+ *
57
+ * Advanced overload used when building primitives or providers — for example,
58
+ * when a custom provider needs to register a `message`, `part`, or other scope
59
+ * onto the client visible to its descendants. Application code rarely reaches
60
+ * for this; use {@link useAui} with no arguments to read the existing client.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * const aui = useAui({
65
+ * message: Derived({
66
+ * source: "thread",
67
+ * query: { index: 0 },
68
+ * get: (aui) => aui.thread().message({ index: 0 }),
69
+ * }),
70
+ * });
71
+ *
72
+ * const role = useAuiState((s) => s.message.role);
73
+ * ```
74
+ */
19
75
  export declare function useAui(clients: useAui.Props): AssistantClient;
76
+ /**
77
+ * Extends an explicit parent `AssistantClient` with additional scopes.
78
+ */
20
79
  export declare function useAui(clients: useAui.Props, config: {
21
80
  parent: null | AssistantClient;
22
81
  }): AssistantClient;
@@ -1 +1 @@
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"}
1
+ {"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"}
package/dist/useAui.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useResource } from "@assistant-ui/tap/react";
3
- import { resource, tapMemo, tapResources, tapEffectEvent, tapEffect, tapRef, tapResource, withKey, tapResourceRoot, } from "@assistant-ui/tap";
3
+ import { resource, tapMemo, tapResources, tapEffect, tapRef, tapResource, withKey, tapResourceRoot, } from "@assistant-ui/tap";
4
4
  import { useAssistantContextValue, DefaultAssistantClient, createRootAssistantClient, } from "./utils/react-assistant-context.js";
5
5
  import { tapSplitClients, } from "./utils/splitClients.js";
6
6
  import { normalizeEventSelector, } from "./types/events.js";
@@ -95,27 +95,24 @@ const RootClientsAccessorsResource = resource(({ clients: inputClients, clientRe
95
95
  };
96
96
  }, [results, notifications, clientRef]);
97
97
  });
98
- const getMeta = (props, clientRef, memo) => {
99
- if ("source" in props && "query" in props)
100
- return props;
101
- if (memo.dep === props)
102
- return memo.meta;
103
- const meta = props.getMeta(clientRef.current);
104
- memo.meta = meta;
105
- memo.dep = props;
106
- return meta;
107
- };
108
98
  const DerivedClientAccessorResource = resource(({ element, clientRef, name, }) => {
109
- const get = tapEffectEvent(() => element.props);
99
+ // Track the latest props on a ref updated in render. The fiber is
100
+ // keyed on the scope's meta by DerivedClientsAccessorsResource, so
101
+ // source/query are stable for this fiber's lifetime and the only
102
+ // value that can change between renders for the same fiber is the
103
+ // identity of the `get` closure. Routing reads through the ref
104
+ // avoids the one-commit lag that the previous `tapEffectEvent`
105
+ // path imposed.
106
+ const propsRef = tapRef(element.props);
107
+ propsRef.current = element.props;
110
108
  return tapMemo(() => {
111
- const clientFunction = () => get().get(clientRef.current);
112
- const metaMemo = {};
109
+ const clientFunction = () => propsRef.current.get(clientRef.current);
113
110
  Object.defineProperties(clientFunction, {
114
111
  source: {
115
- get: () => getMeta(get(), clientRef, metaMemo).source,
112
+ value: propsRef.current.source,
116
113
  },
117
114
  query: {
118
- get: () => getMeta(get(), clientRef, metaMemo).query,
115
+ value: propsRef.current.query,
119
116
  },
120
117
  name: {
121
118
  value: name,
@@ -125,12 +122,33 @@ const DerivedClientAccessorResource = resource(({ element, clientRef, name, }) =
125
122
  return clientFunction;
126
123
  }, [clientRef, name]);
127
124
  });
125
+ const serializeMeta = (name, meta) => {
126
+ // Sort top-level keys so {a, b} and {b, a} hash to the same fiber
127
+ // identity, and guard JSON.stringify against unusual values (BigInt,
128
+ // circular refs) so render never throws here.
129
+ let queryKey;
130
+ try {
131
+ const sorted = {};
132
+ for (const k of Object.keys(meta.query).sort()) {
133
+ sorted[k] = meta.query[k];
134
+ }
135
+ queryKey = JSON.stringify(sorted);
136
+ }
137
+ catch {
138
+ queryKey = String(meta.query);
139
+ }
140
+ return `${name}::${meta.source}::${queryKey}`;
141
+ };
128
142
  const DerivedClientsAccessorsResource = resource(({ clients, clientRef, }) => {
129
- return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => withKey(key, DerivedClientAccessorResource({
130
- element: clients[key],
131
- clientRef,
132
- name: key,
133
- }))), [clients, clientRef]));
143
+ return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => {
144
+ const name = key;
145
+ const element = clients[name];
146
+ return withKey(serializeMeta(name, element.props), DerivedClientAccessorResource({
147
+ element,
148
+ clientRef,
149
+ name,
150
+ }));
151
+ }), [clients, clientRef]));
134
152
  });
135
153
  /**
136
154
  * Resource that creates an extended AssistantClient.
@@ -1 +1 @@
1
- {"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,44 @@
1
1
  import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./types/events.js";
2
+ /**
3
+ * Subscribes to an assistant event for the lifetime of the component.
4
+ *
5
+ * The subscription is established on mount and re-established whenever the
6
+ * scope or event name changes. The `callback` is wrapped in an effect-event
7
+ * shim, so the latest closure is invoked on each emission — you do not
8
+ * need to memoize it.
9
+ *
10
+ * @param selector - Either a dotted event name like
11
+ * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use
12
+ * `scope: "*"` to subscribe at the root client and receive emissions
13
+ * from any descendant scope, regardless of which one is in React
14
+ * context.
15
+ * @param callback - Invoked with the event payload. The most recent
16
+ * reference is always called. Return values are ignored, async callbacks
17
+ * are not awaited, and the callback cannot be called during render.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * // React to transient model-context changes.
22
+ * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => {
23
+ * analytics.track("model_context_update", { threadId });
24
+ * });
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * // React to thread switches.
30
+ * useAuiEvent("threadListItem.switchedTo", () => {
31
+ * resetLocalState();
32
+ * });
33
+ * ```
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * // Listen from the root client rather than the current React context.
38
+ * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => {
39
+ * analytics.track("model_context_update", payload);
40
+ * });
41
+ * ```
42
+ */
2
43
  export declare const useAuiEvent: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void;
3
44
  //# sourceMappingURL=useAuiEvent.d.ts.map
@@ -1 +1 @@
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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,kBAAkB,EAC3D,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAUzC,CAAC"}
@@ -2,6 +2,47 @@ import { useEffect } from "react";
2
2
  import { useEffectEvent } from "use-effect-event";
3
3
  import { useAui } from "./useAui.js";
4
4
  import { normalizeEventSelector } from "./types/events.js";
5
+ /**
6
+ * Subscribes to an assistant event for the lifetime of the component.
7
+ *
8
+ * The subscription is established on mount and re-established whenever the
9
+ * scope or event name changes. The `callback` is wrapped in an effect-event
10
+ * shim, so the latest closure is invoked on each emission — you do not
11
+ * need to memoize it.
12
+ *
13
+ * @param selector - Either a dotted event name like
14
+ * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use
15
+ * `scope: "*"` to subscribe at the root client and receive emissions
16
+ * from any descendant scope, regardless of which one is in React
17
+ * context.
18
+ * @param callback - Invoked with the event payload. The most recent
19
+ * reference is always called. Return values are ignored, async callbacks
20
+ * are not awaited, and the callback cannot be called during render.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * // React to transient model-context changes.
25
+ * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => {
26
+ * analytics.track("model_context_update", { threadId });
27
+ * });
28
+ * ```
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * // React to thread switches.
33
+ * useAuiEvent("threadListItem.switchedTo", () => {
34
+ * resetLocalState();
35
+ * });
36
+ * ```
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * // Listen from the root client rather than the current React context.
41
+ * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => {
42
+ * analytics.track("model_context_update", payload);
43
+ * });
44
+ * ```
45
+ */
5
46
  export const useAuiEvent = (selector, callback) => {
6
47
  const aui = useAui();
7
48
  const callbackRef = useEffectEvent(callback);
@@ -1 +1 @@
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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,17 +1,34 @@
1
1
  import type { AssistantState } from "./types/client.js";
2
2
  /**
3
- * Hook to access a slice of the assistant state with automatic subscription
3
+ * Subscribes to a slice of {@link AssistantState} and re-renders the
4
+ * component whenever that slice changes.
4
5
  *
5
- * @param selector - Function to select a slice of the state
6
- * @returns The selected state slice
6
+ * The `selector` is called on every store update; its return value is
7
+ * compared by `Object.is`, and the component re-renders only when the
8
+ * selected slice changes. Returning the entire state object is not
9
+ * supported and throws at runtime — select a specific field instead, or
10
+ * compose multiple `useAuiState` calls. Returning a new object or array
11
+ * literal, including spreading `s.thread` into a new object, causes a
12
+ * re-render on every store update; either select primitives or return a
13
+ * memoized reference.
14
+ *
15
+ * @param selector - Pure function that derives a value from the current
16
+ * assistant state. Should be cheap and referentially stable for equal
17
+ * inputs (plain field reads, primitives, or memoized values).
18
+ * @returns The currently selected slice.
7
19
  *
8
20
  * @example
9
- * ```typescript
10
- * const aui = useAui({
11
- * foo: RootScope({ ... }),
12
- * });
21
+ * ```tsx
22
+ * // Disable a button while a run is in flight.
23
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
24
+ * ```
13
25
  *
14
- * const bar = useAuiState((s) => s.foo.bar);
26
+ * @example
27
+ * ```tsx
28
+ * // Prefer multiple selectors over an inline object literal, which would
29
+ * // create a new reference on every render.
30
+ * const text = useAuiState((s) => s.composer.text);
31
+ * const canSend = useAuiState((s) => s.composer.canSend);
15
32
  * ```
16
33
  */
17
34
  export declare const useAuiState: <T>(selector: (state: AssistantState) => T) => T;
@@ -1 +1 @@
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"}
1
+ {"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"}
@@ -2,18 +2,35 @@ import { useSyncExternalStore, useDebugValue } from "react";
2
2
  import { useAui } from "./useAui.js";
3
3
  import { getProxiedAssistantState } from "./utils/proxied-assistant-state.js";
4
4
  /**
5
- * Hook to access a slice of the assistant state with automatic subscription
5
+ * Subscribes to a slice of {@link AssistantState} and re-renders the
6
+ * component whenever that slice changes.
6
7
  *
7
- * @param selector - Function to select a slice of the state
8
- * @returns The selected state slice
8
+ * The `selector` is called on every store update; its return value is
9
+ * compared by `Object.is`, and the component re-renders only when the
10
+ * selected slice changes. Returning the entire state object is not
11
+ * supported and throws at runtime — select a specific field instead, or
12
+ * compose multiple `useAuiState` calls. Returning a new object or array
13
+ * literal, including spreading `s.thread` into a new object, causes a
14
+ * re-render on every store update; either select primitives or return a
15
+ * memoized reference.
16
+ *
17
+ * @param selector - Pure function that derives a value from the current
18
+ * assistant state. Should be cheap and referentially stable for equal
19
+ * inputs (plain field reads, primitives, or memoized values).
20
+ * @returns The currently selected slice.
9
21
  *
10
22
  * @example
11
- * ```typescript
12
- * const aui = useAui({
13
- * foo: RootScope({ ... }),
14
- * });
23
+ * ```tsx
24
+ * // Disable a button while a run is in flight.
25
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
26
+ * ```
15
27
  *
16
- * const bar = useAuiState((s) => s.foo.bar);
28
+ * @example
29
+ * ```tsx
30
+ * // Prefer multiple selectors over an inline object literal, which would
31
+ * // create a new reference on every render.
32
+ * const text = useAuiState((s) => s.composer.text);
33
+ * const canSend = useAuiState((s) => s.composer.canSend);
17
34
  * ```
18
35
  */
19
36
  export const useAuiState = (selector) => {
@@ -1 +1 @@
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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -6,17 +6,30 @@ export declare const DefaultAssistantClient: AssistantClient;
6
6
  export declare const createRootAssistantClient: () => AssistantClient;
7
7
  export declare const useAssistantContextValue: () => AssistantClient;
8
8
  /**
9
- * Provider component for AssistantClient
9
+ * Supplies an `AssistantClient` to the React tree.
10
+ *
11
+ * Place near the root of any subtree that uses {@link useAui} or the
12
+ * primitives built on it. Components rendered outside an `AuiProvider`
13
+ * receive a default client whose scope accessors throw on use, so
14
+ * missing-provider mistakes surface at the point of use.
15
+ *
16
+ * When mounting a runtime built with one of the runtime hooks, use
17
+ * {@link AssistantRuntimeProvider} — it installs an `AuiProvider`
18
+ * internally — rather than wiring `AuiProvider` yourself.
10
19
  *
11
20
  * @example
12
- * ```typescript
13
- * <AuiProvider value={aui}>
14
- * <YourApp />
15
- * </AuiProvider>
21
+ * ```tsx
22
+ * function ScopedAssistant({ children, scopes }) {
23
+ * const aui = useAui(scopes);
24
+ *
25
+ * return <AuiProvider value={aui}>{children}</AuiProvider>;
26
+ * }
16
27
  * ```
17
28
  */
18
29
  export declare const AuiProvider: ({ value, children, }: {
30
+ /** Assistant client to expose to descendants. */
19
31
  value: AssistantClient;
32
+ /** Subtree that may read from the client. */
20
33
  children: React.ReactNode;
21
34
  }) => React.ReactElement;
22
35
  //# sourceMappingURL=react-assistant-context.d.ts.map
@@ -1 +1 @@
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"}
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;;;;;;;;;;;;;;;;;;;;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"}
@@ -53,13 +53,24 @@ export const useAssistantContextValue = () => {
53
53
  return useContext(AssistantContext);
54
54
  };
55
55
  /**
56
- * Provider component for AssistantClient
56
+ * Supplies an `AssistantClient` to the React tree.
57
+ *
58
+ * Place near the root of any subtree that uses {@link useAui} or the
59
+ * primitives built on it. Components rendered outside an `AuiProvider`
60
+ * receive a default client whose scope accessors throw on use, so
61
+ * missing-provider mistakes surface at the point of use.
62
+ *
63
+ * When mounting a runtime built with one of the runtime hooks, use
64
+ * {@link AssistantRuntimeProvider} — it installs an `AuiProvider`
65
+ * internally — rather than wiring `AuiProvider` yourself.
57
66
  *
58
67
  * @example
59
- * ```typescript
60
- * <AuiProvider value={aui}>
61
- * <YourApp />
62
- * </AuiProvider>
68
+ * ```tsx
69
+ * function ScopedAssistant({ children, scopes }) {
70
+ * const aui = useAui(scopes);
71
+ *
72
+ * return <AuiProvider value={aui}>{children}</AuiProvider>;
73
+ * }
63
74
  * ```
64
75
  */
65
76
  export const AuiProvider = ({ value, children, }) => {
@@ -1 +1 @@
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"}
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;;;;;;;;;;;;;;;;;;;;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 @@
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"}
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;AAwDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,KAAK,EACrB,YAAY,eAAe;;;CAQ5B,CAAC"}
@@ -1 +1 @@
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"}
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,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/store",
3
- "version": "0.2.10",
3
+ "version": "0.2.11",
4
4
  "description": "Tap-based state management for @assistant-ui",
5
5
  "keywords": [
6
6
  "state-management",
@@ -47,7 +47,7 @@
47
47
  "react": "^19.2.5",
48
48
  "vitest": "^4.1.5",
49
49
  "@assistant-ui/tap": "0.5.11",
50
- "@assistant-ui/x-buildutils": "0.0.7"
50
+ "@assistant-ui/x-buildutils": "0.0.8"
51
51
  },
52
52
  "publishConfig": {
53
53
  "access": "public",
package/src/AuiIf.ts CHANGED
@@ -5,10 +5,44 @@ import { useAuiState } from "./useAuiState";
5
5
  import type { AssistantState } from "./types/client";
6
6
 
7
7
  export namespace AuiIf {
8
- export type Props = PropsWithChildren<{ condition: AuiIf.Condition }>;
8
+ /** Props for `AuiIf`. */
9
+ export type Props = PropsWithChildren<{
10
+ /**
11
+ * Selector that decides whether to render `children`. Children render
12
+ * when this returns `true` and unmount when it returns `false`.
13
+ */
14
+ condition: AuiIf.Condition;
15
+ }>;
16
+
17
+ /**
18
+ * Selector passed to `AuiIf`. Receives the assistant state and must
19
+ * return a boolean.
20
+ */
9
21
  export type Condition = (state: AssistantState) => boolean;
10
22
  }
11
23
 
24
+ /**
25
+ * Conditionally renders children based on a slice of assistant state.
26
+ *
27
+ * A thin wrapper around {@link useAuiState} that renders its children
28
+ * when `condition` returns `true` and unmounts them when it returns
29
+ * `false`. Keeps render logic declarative without mounting unused
30
+ * subtrees.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <AuiIf condition={(s) => s.thread.isRunning}>
35
+ * <CancelButton />
36
+ * </AuiIf>
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <AuiIf condition={(s) => s.thread.messages.length === 0}>
42
+ * <EmptyState />
43
+ * </AuiIf>
44
+ * ```
45
+ */
12
46
  export const AuiIf: FC<AuiIf.Props> = ({ children, condition }) => {
13
47
  const result = useAuiState(condition);
14
48
  return result ? children : null;
package/src/Derived.ts CHANGED
@@ -42,5 +42,5 @@ export namespace Derived {
42
42
  */
43
43
  export type Props<K extends ClientNames> = {
44
44
  get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>;
45
- } & (ClientMeta<K> | { getMeta: (client: AssistantClient) => ClientMeta<K> });
45
+ } & ClientMeta<K>;
46
46
  }
package/src/useAui.ts CHANGED
@@ -5,7 +5,6 @@ import {
5
5
  resource,
6
6
  tapMemo,
7
7
  tapResources,
8
- tapEffectEvent,
9
8
  tapEffect,
10
9
  tapRef,
11
10
  tapResource,
@@ -19,7 +18,7 @@ import type {
19
18
  ClientElement,
20
19
  ClientMeta,
21
20
  } from "./types/client";
22
- import type { Derived, DerivedElement } from "./Derived";
21
+ import type { DerivedElement } from "./Derived";
23
22
  import {
24
23
  useAssistantContextValue,
25
24
  DefaultAssistantClient,
@@ -209,24 +208,6 @@ const RootClientsAccessorsResource = resource(
209
208
  },
210
209
  );
211
210
 
212
- type MetaMemo<K extends ClientNames> = {
213
- meta?: ClientMeta<K>;
214
- dep?: unknown;
215
- };
216
-
217
- const getMeta = <K extends ClientNames>(
218
- props: Derived.Props<K>,
219
- clientRef: { parent: AssistantClient; current: AssistantClient | null },
220
- memo: MetaMemo<K>,
221
- ): ClientMeta<K> => {
222
- if ("source" in props && "query" in props) return props;
223
- if (memo.dep === props) return memo.meta!;
224
- const meta = props.getMeta(clientRef.current!);
225
- memo.meta = meta;
226
- memo.dep = props;
227
- return meta;
228
- };
229
-
230
211
  const DerivedClientAccessorResource = resource(
231
212
  <K extends ClientNames>({
232
213
  element,
@@ -237,17 +218,24 @@ const DerivedClientAccessorResource = resource(
237
218
  clientRef: { parent: AssistantClient; current: AssistantClient | null };
238
219
  name: K;
239
220
  }) => {
240
- const get = tapEffectEvent(() => element.props);
221
+ // Track the latest props on a ref updated in render. The fiber is
222
+ // keyed on the scope's meta by DerivedClientsAccessorsResource, so
223
+ // source/query are stable for this fiber's lifetime and the only
224
+ // value that can change between renders for the same fiber is the
225
+ // identity of the `get` closure. Routing reads through the ref
226
+ // avoids the one-commit lag that the previous `tapEffectEvent`
227
+ // path imposed.
228
+ const propsRef = tapRef(element.props);
229
+ propsRef.current = element.props;
241
230
 
242
231
  return tapMemo(() => {
243
- const clientFunction = () => get().get(clientRef.current!);
244
- const metaMemo = {};
232
+ const clientFunction = () => propsRef.current.get(clientRef.current!);
245
233
  Object.defineProperties(clientFunction, {
246
234
  source: {
247
- get: () => getMeta(get(), clientRef, metaMemo).source,
235
+ value: propsRef.current.source,
248
236
  },
249
237
  query: {
250
- get: () => getMeta(get(), clientRef, metaMemo).query,
238
+ value: propsRef.current.query,
251
239
  },
252
240
  name: {
253
241
  value: name,
@@ -259,6 +247,26 @@ const DerivedClientAccessorResource = resource(
259
247
  },
260
248
  );
261
249
 
250
+ const serializeMeta = <K extends ClientNames>(
251
+ name: K,
252
+ meta: ClientMeta<K>,
253
+ ): string => {
254
+ // Sort top-level keys so {a, b} and {b, a} hash to the same fiber
255
+ // identity, and guard JSON.stringify against unusual values (BigInt,
256
+ // circular refs) so render never throws here.
257
+ let queryKey: string;
258
+ try {
259
+ const sorted: Record<string, unknown> = {};
260
+ for (const k of Object.keys(meta.query as object).sort()) {
261
+ sorted[k] = (meta.query as Record<string, unknown>)[k];
262
+ }
263
+ queryKey = JSON.stringify(sorted);
264
+ } catch {
265
+ queryKey = String(meta.query);
266
+ }
267
+ return `${name}::${meta.source}::${queryKey}`;
268
+ };
269
+
262
270
  const DerivedClientsAccessorsResource = resource(
263
271
  ({
264
272
  clients,
@@ -270,16 +278,18 @@ const DerivedClientsAccessorsResource = resource(
270
278
  return tapShallowMemoArray(
271
279
  tapResources(
272
280
  () =>
273
- Object.keys(clients).map((key) =>
274
- withKey(
275
- key,
281
+ Object.keys(clients).map((key) => {
282
+ const name = key as keyof typeof clients;
283
+ const element = clients[name]!;
284
+ return withKey(
285
+ serializeMeta(name, element.props),
276
286
  DerivedClientAccessorResource({
277
- element: clients[key as keyof typeof clients]!,
287
+ element,
278
288
  clientRef,
279
- name: key as keyof typeof clients,
289
+ name,
280
290
  }),
281
- ),
282
- ),
291
+ );
292
+ }),
283
293
  [clients, clientRef],
284
294
  ),
285
295
  );
@@ -359,8 +369,67 @@ export namespace useAui {
359
369
  };
360
370
  }
361
371
 
372
+ /**
373
+ * Returns the current `AssistantClient` from context.
374
+ *
375
+ * Read the client supplied by the nearest {@link AuiProvider} or
376
+ * {@link AssistantRuntimeProvider}, then access a scope on it —
377
+ * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair
378
+ * with {@link useAuiState} to read reactive state and {@link useAuiEvent}
379
+ * to subscribe to events. The returned client also exposes lower-level
380
+ * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer
381
+ * `useAuiEvent` for React event subscriptions.
382
+ *
383
+ * Rendered outside a provider, the returned client's scope accessors
384
+ * throw a descriptive error whenever they are called.
385
+ *
386
+ * @example
387
+ * ```tsx
388
+ * const aui = useAui();
389
+ *
390
+ * const onSend = () => aui.composer().send();
391
+ * const onCancel = () => aui.thread().cancelRun();
392
+ * ```
393
+ *
394
+ * @example
395
+ * ```tsx
396
+ * // Combine with useAuiState to drive disabled state.
397
+ * const aui = useAui();
398
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
399
+ *
400
+ * return (
401
+ * <button disabled={isRunning} onClick={() => aui.composer().send()}>
402
+ * Send
403
+ * </button>
404
+ * );
405
+ * ```
406
+ */
362
407
  export function useAui(): AssistantClient;
408
+ /**
409
+ * Extends the parent `AssistantClient` with additional scopes.
410
+ *
411
+ * Advanced overload used when building primitives or providers — for example,
412
+ * when a custom provider needs to register a `message`, `part`, or other scope
413
+ * onto the client visible to its descendants. Application code rarely reaches
414
+ * for this; use {@link useAui} with no arguments to read the existing client.
415
+ *
416
+ * @example
417
+ * ```tsx
418
+ * const aui = useAui({
419
+ * message: Derived({
420
+ * source: "thread",
421
+ * query: { index: 0 },
422
+ * get: (aui) => aui.thread().message({ index: 0 }),
423
+ * }),
424
+ * });
425
+ *
426
+ * const role = useAuiState((s) => s.message.role);
427
+ * ```
428
+ */
363
429
  export function useAui(clients: useAui.Props): AssistantClient;
430
+ /**
431
+ * Extends an explicit parent `AssistantClient` with additional scopes.
432
+ */
364
433
  export function useAui(
365
434
  clients: useAui.Props,
366
435
  config: { parent: null | AssistantClient },
@@ -8,6 +8,47 @@ import type {
8
8
  } from "./types/events";
9
9
  import { normalizeEventSelector } from "./types/events";
10
10
 
11
+ /**
12
+ * Subscribes to an assistant event for the lifetime of the component.
13
+ *
14
+ * The subscription is established on mount and re-established whenever the
15
+ * scope or event name changes. The `callback` is wrapped in an effect-event
16
+ * shim, so the latest closure is invoked on each emission — you do not
17
+ * need to memoize it.
18
+ *
19
+ * @param selector - Either a dotted event name like
20
+ * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use
21
+ * `scope: "*"` to subscribe at the root client and receive emissions
22
+ * from any descendant scope, regardless of which one is in React
23
+ * context.
24
+ * @param callback - Invoked with the event payload. The most recent
25
+ * reference is always called. Return values are ignored, async callbacks
26
+ * are not awaited, and the callback cannot be called during render.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * // React to transient model-context changes.
31
+ * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => {
32
+ * analytics.track("model_context_update", { threadId });
33
+ * });
34
+ * ```
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * // React to thread switches.
39
+ * useAuiEvent("threadListItem.switchedTo", () => {
40
+ * resetLocalState();
41
+ * });
42
+ * ```
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * // Listen from the root client rather than the current React context.
47
+ * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => {
48
+ * analytics.track("model_context_update", payload);
49
+ * });
50
+ * ```
51
+ */
11
52
  export const useAuiEvent = <TEvent extends AssistantEventName>(
12
53
  selector: AssistantEventSelector<TEvent>,
13
54
  callback: AssistantEventCallback<TEvent>,
@@ -4,18 +4,35 @@ import { useAui } from "./useAui";
4
4
  import { getProxiedAssistantState } from "./utils/proxied-assistant-state";
5
5
 
6
6
  /**
7
- * Hook to access a slice of the assistant state with automatic subscription
7
+ * Subscribes to a slice of {@link AssistantState} and re-renders the
8
+ * component whenever that slice changes.
8
9
  *
9
- * @param selector - Function to select a slice of the state
10
- * @returns The selected state slice
10
+ * The `selector` is called on every store update; its return value is
11
+ * compared by `Object.is`, and the component re-renders only when the
12
+ * selected slice changes. Returning the entire state object is not
13
+ * supported and throws at runtime — select a specific field instead, or
14
+ * compose multiple `useAuiState` calls. Returning a new object or array
15
+ * literal, including spreading `s.thread` into a new object, causes a
16
+ * re-render on every store update; either select primitives or return a
17
+ * memoized reference.
18
+ *
19
+ * @param selector - Pure function that derives a value from the current
20
+ * assistant state. Should be cheap and referentially stable for equal
21
+ * inputs (plain field reads, primitives, or memoized values).
22
+ * @returns The currently selected slice.
11
23
  *
12
24
  * @example
13
- * ```typescript
14
- * const aui = useAui({
15
- * foo: RootScope({ ... }),
16
- * });
25
+ * ```tsx
26
+ * // Disable a button while a run is in flight.
27
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
28
+ * ```
17
29
  *
18
- * const bar = useAuiState((s) => s.foo.bar);
30
+ * @example
31
+ * ```tsx
32
+ * // Prefer multiple selectors over an inline object literal, which would
33
+ * // create a new reference on every render.
34
+ * const text = useAuiState((s) => s.composer.text);
35
+ * const canSend = useAuiState((s) => s.composer.canSend);
19
36
  * ```
20
37
  */
21
38
  export const useAuiState = <T>(selector: (state: AssistantState) => T): T => {
@@ -85,20 +85,33 @@ export const useAssistantContextValue = (): AssistantClient => {
85
85
  };
86
86
 
87
87
  /**
88
- * Provider component for AssistantClient
88
+ * Supplies an `AssistantClient` to the React tree.
89
+ *
90
+ * Place near the root of any subtree that uses {@link useAui} or the
91
+ * primitives built on it. Components rendered outside an `AuiProvider`
92
+ * receive a default client whose scope accessors throw on use, so
93
+ * missing-provider mistakes surface at the point of use.
94
+ *
95
+ * When mounting a runtime built with one of the runtime hooks, use
96
+ * {@link AssistantRuntimeProvider} — it installs an `AuiProvider`
97
+ * internally — rather than wiring `AuiProvider` yourself.
89
98
  *
90
99
  * @example
91
- * ```typescript
92
- * <AuiProvider value={aui}>
93
- * <YourApp />
94
- * </AuiProvider>
100
+ * ```tsx
101
+ * function ScopedAssistant({ children, scopes }) {
102
+ * const aui = useAui(scopes);
103
+ *
104
+ * return <AuiProvider value={aui}>{children}</AuiProvider>;
105
+ * }
95
106
  * ```
96
107
  */
97
108
  export const AuiProvider = ({
98
109
  value,
99
110
  children,
100
111
  }: {
112
+ /** Assistant client to expose to descendants. */
101
113
  value: AssistantClient;
114
+ /** Subtree that may read from the client. */
102
115
  children: React.ReactNode;
103
116
  }): React.ReactElement => {
104
117
  return (
@@ -6,7 +6,7 @@ import type {
6
6
  } from "../types/client";
7
7
  import { getTransformScopes } from "../attachTransformScopes";
8
8
  import type { useAui } from "../useAui";
9
- import { tapMemo } from "@assistant-ui/tap";
9
+ import { tapMemo, type ResourceElement } from "@assistant-ui/tap";
10
10
 
11
11
  export type RootClients = Partial<
12
12
  Record<ClientNames, ClientElement<ClientNames>>
@@ -35,7 +35,9 @@ function splitClients(clients: useAui.Props, baseClient: AssistantClient) {
35
35
  if (visited.has(clientElement.type)) continue;
36
36
  visited.add(clientElement.type);
37
37
 
38
- const transform = getTransformScopes(clientElement.type);
38
+ const transform = getTransformScopes(
39
+ clientElement.type as (props: any) => ResourceElement<any>,
40
+ );
39
41
  if (transform) {
40
42
  transform(scopes, baseClient);
41
43
  changed = true;