@assistant-ui/store 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +59 -262
  2. package/dist/AssistantIf.d.ts +4 -6
  3. package/dist/AssistantIf.d.ts.map +1 -1
  4. package/dist/AssistantIf.js +1 -4
  5. package/dist/AssistantIf.js.map +1 -1
  6. package/dist/Derived.d.ts +34 -0
  7. package/dist/Derived.d.ts.map +1 -0
  8. package/dist/Derived.js +11 -0
  9. package/dist/Derived.js.map +1 -0
  10. package/dist/attachDefaultPeers.d.ts +56 -0
  11. package/dist/attachDefaultPeers.d.ts.map +1 -0
  12. package/dist/attachDefaultPeers.js +22 -0
  13. package/dist/attachDefaultPeers.js.map +1 -0
  14. package/dist/index.d.ts +10 -9
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +17 -13
  17. package/dist/index.js.map +1 -1
  18. package/dist/tapClientList.d.ts +24 -0
  19. package/dist/tapClientList.d.ts.map +1 -0
  20. package/dist/tapClientList.js +72 -0
  21. package/dist/tapClientList.js.map +1 -0
  22. package/dist/tapClientLookup.d.ts +11 -0
  23. package/dist/tapClientLookup.d.ts.map +1 -0
  24. package/dist/tapClientLookup.js +42 -0
  25. package/dist/tapClientLookup.js.map +1 -0
  26. package/dist/tapClientResource.d.ts +24 -0
  27. package/dist/tapClientResource.d.ts.map +1 -0
  28. package/dist/tapClientResource.js +100 -0
  29. package/dist/tapClientResource.js.map +1 -0
  30. package/dist/types/client.d.ts +117 -0
  31. package/dist/types/client.d.ts.map +1 -0
  32. package/dist/types/client.js +1 -0
  33. package/dist/types/events.d.ts +33 -0
  34. package/dist/types/events.d.ts.map +1 -0
  35. package/dist/types/events.js +12 -0
  36. package/dist/types/events.js.map +1 -0
  37. package/dist/useAssistantClient.d.ts +13 -46
  38. package/dist/useAssistantClient.d.ts.map +1 -1
  39. package/dist/useAssistantClient.js +177 -137
  40. package/dist/useAssistantClient.js.map +1 -1
  41. package/dist/useAssistantEvent.d.ts +2 -2
  42. package/dist/useAssistantEvent.d.ts.map +1 -1
  43. package/dist/useAssistantEvent.js +3 -6
  44. package/dist/useAssistantEvent.js.map +1 -1
  45. package/dist/useAssistantState.d.ts +2 -2
  46. package/dist/useAssistantState.d.ts.map +1 -1
  47. package/dist/useAssistantState.js +7 -36
  48. package/dist/useAssistantState.js.map +1 -1
  49. package/dist/utils/BaseProxyHandler.d.ts +23 -0
  50. package/dist/utils/BaseProxyHandler.d.ts.map +1 -0
  51. package/dist/utils/BaseProxyHandler.js +41 -0
  52. package/dist/utils/BaseProxyHandler.js.map +1 -0
  53. package/dist/utils/NotificationManager.d.ts +11 -0
  54. package/dist/utils/NotificationManager.d.ts.map +1 -0
  55. package/dist/utils/NotificationManager.js +81 -0
  56. package/dist/utils/NotificationManager.js.map +1 -0
  57. package/dist/utils/StoreResource.d.ts +14 -0
  58. package/dist/utils/StoreResource.d.ts.map +1 -0
  59. package/dist/utils/StoreResource.js +23 -0
  60. package/dist/utils/StoreResource.js.map +1 -0
  61. package/dist/utils/proxied-assistant-state.d.ts +8 -0
  62. package/dist/utils/proxied-assistant-state.d.ts.map +1 -0
  63. package/dist/utils/proxied-assistant-state.js +41 -0
  64. package/dist/utils/proxied-assistant-state.js.map +1 -0
  65. package/dist/{AssistantContext.d.ts → utils/react-assistant-context.d.ts} +6 -6
  66. package/dist/utils/react-assistant-context.d.ts.map +1 -0
  67. package/dist/utils/react-assistant-context.js +73 -0
  68. package/dist/utils/react-assistant-context.js.map +1 -0
  69. package/dist/utils/splitClients.d.ts +28 -0
  70. package/dist/utils/splitClients.d.ts.map +1 -0
  71. package/dist/utils/splitClients.js +37 -0
  72. package/dist/utils/splitClients.js.map +1 -0
  73. package/dist/utils/tap-assistant-context.d.ts +19 -0
  74. package/dist/utils/tap-assistant-context.d.ts.map +1 -0
  75. package/dist/utils/tap-assistant-context.js +37 -0
  76. package/dist/utils/tap-assistant-context.js.map +1 -0
  77. package/dist/utils/tap-client-stack-context.d.ts +23 -0
  78. package/dist/utils/tap-client-stack-context.d.ts.map +1 -0
  79. package/dist/utils/tap-client-stack-context.js +30 -0
  80. package/dist/utils/tap-client-stack-context.js.map +1 -0
  81. package/package.json +3 -3
  82. package/src/AssistantIf.tsx +3 -11
  83. package/src/Derived.ts +46 -0
  84. package/src/attachDefaultPeers.ts +78 -0
  85. package/src/index.ts +19 -22
  86. package/src/tapClientList.ts +105 -0
  87. package/src/tapClientLookup.ts +56 -0
  88. package/src/tapClientResource.ts +152 -0
  89. package/src/types/client.ts +186 -0
  90. package/src/types/events.ts +77 -0
  91. package/src/useAssistantClient.tsx +252 -234
  92. package/src/useAssistantEvent.ts +6 -9
  93. package/src/useAssistantState.tsx +10 -48
  94. package/src/utils/BaseProxyHandler.ts +50 -0
  95. package/src/utils/NotificationManager.ts +110 -0
  96. package/src/utils/StoreResource.ts +36 -0
  97. package/src/utils/proxied-assistant-state.tsx +53 -0
  98. package/src/utils/react-assistant-context.tsx +107 -0
  99. package/src/utils/splitClients.ts +85 -0
  100. package/src/utils/tap-assistant-context.ts +59 -0
  101. package/src/utils/tap-client-stack-context.ts +51 -0
  102. package/dist/AssistantContext.d.ts.map +0 -1
  103. package/dist/AssistantContext.js +0 -45
  104. package/dist/AssistantContext.js.map +0 -1
  105. package/dist/DerivedScope.d.ts +0 -20
  106. package/dist/DerivedScope.d.ts.map +0 -1
  107. package/dist/DerivedScope.js +0 -11
  108. package/dist/DerivedScope.js.map +0 -1
  109. package/dist/EventContext.d.ts +0 -61
  110. package/dist/EventContext.d.ts.map +0 -1
  111. package/dist/EventContext.js +0 -62
  112. package/dist/EventContext.js.map +0 -1
  113. package/dist/ScopeRegistry.d.ts +0 -41
  114. package/dist/ScopeRegistry.d.ts.map +0 -1
  115. package/dist/ScopeRegistry.js +0 -17
  116. package/dist/ScopeRegistry.js.map +0 -1
  117. package/dist/StoreContext.d.ts +0 -9
  118. package/dist/StoreContext.d.ts.map +0 -1
  119. package/dist/StoreContext.js +0 -20
  120. package/dist/StoreContext.js.map +0 -1
  121. package/dist/asStore.d.ts +0 -20
  122. package/dist/asStore.d.ts.map +0 -1
  123. package/dist/asStore.js +0 -23
  124. package/dist/asStore.js.map +0 -1
  125. package/dist/tapApi.d.ts +0 -36
  126. package/dist/tapApi.d.ts.map +0 -1
  127. package/dist/tapApi.js +0 -52
  128. package/dist/tapApi.js.map +0 -1
  129. package/dist/tapLookupResources.d.ts +0 -44
  130. package/dist/tapLookupResources.d.ts.map +0 -1
  131. package/dist/tapLookupResources.js +0 -21
  132. package/dist/tapLookupResources.js.map +0 -1
  133. package/dist/tapStoreList.d.ts +0 -76
  134. package/dist/tapStoreList.d.ts.map +0 -1
  135. package/dist/tapStoreList.js +0 -46
  136. package/dist/tapStoreList.js.map +0 -1
  137. package/dist/types.d.ts +0 -84
  138. package/dist/types.d.ts.map +0 -1
  139. package/dist/types.js +0 -1
  140. package/dist/utils/splitScopes.d.ts +0 -24
  141. package/dist/utils/splitScopes.d.ts.map +0 -1
  142. package/dist/utils/splitScopes.js +0 -18
  143. package/dist/utils/splitScopes.js.map +0 -1
  144. package/src/AssistantContext.tsx +0 -64
  145. package/src/DerivedScope.ts +0 -23
  146. package/src/EventContext.ts +0 -187
  147. package/src/ScopeRegistry.ts +0 -58
  148. package/src/StoreContext.ts +0 -28
  149. package/src/asStore.ts +0 -40
  150. package/src/tapApi.ts +0 -91
  151. package/src/tapLookupResources.ts +0 -62
  152. package/src/tapStoreList.ts +0 -133
  153. package/src/types.ts +0 -119
  154. package/src/utils/splitScopes.ts +0 -38
  155. /package/dist/{types.js.map → types/client.js.map} +0 -0
@@ -1,187 +1,227 @@
1
+ "use client";
2
+
1
3
  // src/useAssistantClient.tsx
2
- import { useMemo } from "react";
3
4
  import { useResource } from "@assistant-ui/tap/react";
4
5
  import {
5
6
  resource,
6
7
  tapMemo,
7
- tapResource,
8
8
  tapResources,
9
9
  tapEffectEvent,
10
- tapInlineResource
10
+ tapInlineResource,
11
+ tapEffect,
12
+ tapRef,
13
+ tapResource
11
14
  } from "@assistant-ui/tap";
12
- import { asStore } from "./asStore.js";
13
- import { useAssistantContextValue } from "./AssistantContext.js";
14
- import { splitScopes } from "./utils/splitScopes.js";
15
+ import { StoreResource } from "./utils/StoreResource.js";
16
+ import {
17
+ useAssistantContextValue,
18
+ DefaultAssistantClient,
19
+ createRootAssistantClient
20
+ } from "./utils/react-assistant-context.js";
21
+ import {
22
+ splitClients
23
+ } from "./utils/splitClients.js";
15
24
  import {
16
- EventManager,
17
25
  normalizeEventSelector
18
- } from "./EventContext.js";
19
- import { withStoreContextProvider } from "./StoreContext.js";
20
- var RootScopeStoreResource = resource(
26
+ } from "./types/events.js";
27
+ import { NotificationManager } from "./utils/NotificationManager.js";
28
+ import { withAssistantTapContextProvider } from "./utils/tap-assistant-context.js";
29
+ import { tapClientResource } from "./tapClientResource.js";
30
+ import { getClientIndex } from "./utils/tap-client-stack-context.js";
31
+ import {
32
+ PROXIED_ASSISTANT_STATE_SYMBOL,
33
+ createProxiedAssistantState
34
+ } from "./utils/proxied-assistant-state.js";
35
+ var RootClientResource = resource(
21
36
  ({
22
37
  element,
23
- events,
24
- parent
38
+ emit,
39
+ clientRef
25
40
  }) => {
26
- return withStoreContextProvider(
27
- { events, parent },
28
- () => tapInlineResource(element)
41
+ const { methods, state } = withAssistantTapContextProvider(
42
+ { clientRef, emit },
43
+ () => tapClientResource(element)
29
44
  );
45
+ return tapMemo(() => ({ methods }), [state]);
30
46
  }
31
47
  );
32
- var RootScopeResource = resource(
48
+ var RootClientAccessorResource = resource(
33
49
  ({
34
- scopeName,
35
50
  element,
36
- events,
37
- parent
51
+ notifications,
52
+ clientRef
38
53
  }) => {
39
- const store = tapResource(
40
- asStore(RootScopeStoreResource({ element, events, parent }))
54
+ const store = tapInlineResource(
55
+ StoreResource(
56
+ RootClientResource({ element, emit: notifications.emit, clientRef })
57
+ )
41
58
  );
59
+ tapEffect(() => {
60
+ return store.subscribe(notifications.notifySubscribers);
61
+ }, [store, notifications]);
42
62
  return tapMemo(() => {
43
- const scopeFunction = (() => store.getState().api);
44
- scopeFunction.source = "root";
45
- scopeFunction.query = {};
46
- return [
47
- scopeName,
48
- {
49
- scopeFunction,
50
- subscribe: store.subscribe,
51
- flushSync: store.flushSync
52
- }
53
- ];
54
- }, [scopeName, store]);
63
+ const clientFunction = () => store.getState().methods;
64
+ clientFunction.source = "root";
65
+ clientFunction.query = {};
66
+ return clientFunction;
67
+ }, [store]);
55
68
  }
56
69
  );
57
- var RootScopesResource = resource(
58
- ({ scopes, parent }) => {
59
- const events = tapInlineResource(EventManager());
60
- const resultEntries = tapResources(
61
- Object.entries(scopes).map(
62
- ([scopeName, element]) => RootScopeResource(
63
- {
64
- scopeName,
65
- element,
66
- events,
67
- parent
68
- },
69
- { key: scopeName }
70
- )
71
- )
70
+ var NoOpRootClientsAccessorsResource = resource(() => {
71
+ return tapMemo(
72
+ () => ({ clients: {}, subscribe: void 0, on: void 0 }),
73
+ []
74
+ );
75
+ });
76
+ var RootClientsAccessorsResource = resource(
77
+ ({
78
+ clients: inputClients,
79
+ clientRef
80
+ }) => {
81
+ const notifications = tapInlineResource(NotificationManager());
82
+ tapEffect(
83
+ () => clientRef.parent.subscribe(notifications.notifySubscribers),
84
+ [clientRef, notifications]
85
+ );
86
+ const results = tapResources(
87
+ inputClients,
88
+ (element) => RootClientAccessorResource({
89
+ element,
90
+ notifications,
91
+ clientRef
92
+ }),
93
+ [notifications, clientRef]
72
94
  );
73
- const on = (selector, callback) => {
74
- const { event } = normalizeEventSelector(selector);
75
- return events.on(event, callback);
76
- };
77
95
  return tapMemo(() => {
78
- if (resultEntries.length === 0) {
79
- return {
80
- scopes: {},
81
- on
82
- };
83
- }
84
96
  return {
85
- scopes: Object.fromEntries(
86
- resultEntries.map(([scopeName, { scopeFunction }]) => [
87
- scopeName,
88
- scopeFunction
89
- ])
90
- ),
91
- subscribe: (callback) => {
92
- const unsubscribes = resultEntries.map(([, { subscribe }]) => {
93
- return subscribe(() => {
94
- console.log("Callback called for");
95
- callback();
96
- });
97
+ clients: results,
98
+ subscribe: notifications.subscribe,
99
+ on: function(selector, callback) {
100
+ if (!this) {
101
+ throw new Error(
102
+ "const { on } = useAssistantClient() is not supported. Use aui.on() instead."
103
+ );
104
+ }
105
+ const { scope, event } = normalizeEventSelector(selector);
106
+ if (scope !== "*") {
107
+ const source = this[scope].source;
108
+ if (source === null) {
109
+ throw new Error(
110
+ `Scope "${scope}" is not available. Use { scope: "*", event: "${event}" } to listen globally.`
111
+ );
112
+ }
113
+ }
114
+ const localUnsub = notifications.on(event, (payload, clientStack) => {
115
+ if (scope === "*") {
116
+ callback(payload);
117
+ return;
118
+ }
119
+ const scopeClient = this[scope]();
120
+ const index = getClientIndex(scopeClient);
121
+ if (scopeClient === clientStack[index]) {
122
+ callback(payload);
123
+ }
97
124
  });
125
+ if (scope !== "*" && clientRef.parent[scope].source === null)
126
+ return localUnsub;
127
+ const parentUnsub = clientRef.parent.on(selector, callback);
98
128
  return () => {
99
- unsubscribes.forEach((unsubscribe) => unsubscribe());
129
+ localUnsub();
130
+ parentUnsub();
100
131
  };
101
- },
102
- flushSync: () => {
103
- resultEntries.forEach(([, { flushSync }]) => {
104
- flushSync();
105
- });
106
- },
107
- on
132
+ }
108
133
  };
109
- }, [...resultEntries, events]);
134
+ }, [results, notifications, clientRef]);
110
135
  }
111
136
  );
112
- var useRootScopes = (rootScopes, parent) => {
113
- return useResource(RootScopesResource({ scopes: rootScopes, parent }));
137
+ var getMeta = (props, clientRef, memo) => {
138
+ if ("source" in props && "query" in props) return props;
139
+ if (memo.dep === props) return memo.meta;
140
+ const meta = props.getMeta(clientRef.current);
141
+ memo.meta = meta;
142
+ memo.dep = props;
143
+ return meta;
114
144
  };
115
- var DerivedScopeResource = resource(
145
+ var DerivedClientAccessorResource = resource(
116
146
  ({
117
- scopeName,
118
147
  element,
119
- parentClient
148
+ clientRef
120
149
  }) => {
121
- const get = tapEffectEvent(element.props.get);
122
- const source = element.props.source;
123
- const query = element.props.query;
150
+ const get = tapEffectEvent(() => element.props);
124
151
  return tapMemo(() => {
125
- const scopeFunction = (() => get(parentClient));
126
- scopeFunction.source = source;
127
- scopeFunction.query = query;
128
- return [scopeName, scopeFunction];
129
- }, [scopeName, get, source, JSON.stringify(query), parentClient]);
152
+ const clientFunction = () => get().get(clientRef.current);
153
+ const metaMemo = {};
154
+ Object.defineProperties(clientFunction, {
155
+ source: {
156
+ get: () => getMeta(get(), clientRef, metaMemo).source
157
+ },
158
+ query: {
159
+ get: () => getMeta(get(), clientRef, metaMemo).query
160
+ }
161
+ });
162
+ return clientFunction;
163
+ }, [clientRef]);
130
164
  }
131
165
  );
132
- var DerivedScopesResource = resource(
166
+ var DerivedClientsAccessorsResource = resource(
133
167
  ({
134
- scopes,
135
- parentClient
168
+ clients,
169
+ clientRef
136
170
  }) => {
137
- const resultEntries = tapResources(
138
- Object.entries(scopes).map(
139
- ([scopeName, element]) => DerivedScopeResource(
140
- {
141
- scopeName,
142
- element,
143
- parentClient
144
- },
145
- { key: scopeName }
146
- )
147
- )
171
+ return tapResources(
172
+ clients,
173
+ (element) => DerivedClientAccessorResource({
174
+ element,
175
+ clientRef
176
+ }),
177
+ [clientRef]
148
178
  );
149
- return tapMemo(() => {
150
- return Object.fromEntries(resultEntries);
151
- }, [...resultEntries]);
152
179
  }
153
180
  );
154
- var useDerivedScopes = (derivedScopes, parentClient) => {
155
- return useResource(
156
- DerivedScopesResource({ scopes: derivedScopes, parentClient })
157
- );
158
- };
159
- var useExtendedAssistantClientImpl = (scopes) => {
181
+ var AssistantClientResource = resource(
182
+ ({
183
+ baseClient,
184
+ clients
185
+ }) => {
186
+ const { rootClients, derivedClients } = splitClients(clients, baseClient);
187
+ const clientRef = tapRef({
188
+ parent: baseClient,
189
+ current: null
190
+ }).current;
191
+ const rootFields = tapResource(
192
+ Object.keys(rootClients).length > 0 ? RootClientsAccessorsResource({ clients: rootClients, clientRef }) : NoOpRootClientsAccessorsResource()
193
+ );
194
+ const derivedFields = tapInlineResource(
195
+ DerivedClientsAccessorsResource({ clients: derivedClients, clientRef })
196
+ );
197
+ const client = tapMemo(() => {
198
+ const proto = baseClient === DefaultAssistantClient ? createRootAssistantClient() : baseClient;
199
+ const client2 = Object.create(proto);
200
+ Object.assign(client2, rootFields.clients, derivedFields, {
201
+ subscribe: rootFields.subscribe ?? baseClient.subscribe,
202
+ on: rootFields.on ?? baseClient.on,
203
+ [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client2)
204
+ });
205
+ return client2;
206
+ }, [baseClient, rootFields, derivedFields]);
207
+ if (clientRef.current === null) {
208
+ clientRef.current = client;
209
+ }
210
+ tapEffect(() => {
211
+ clientRef.current = client;
212
+ });
213
+ return client;
214
+ }
215
+ );
216
+ function useAssistantClient(clients) {
160
217
  const baseClient = useAssistantContextValue();
161
- const { rootScopes, derivedScopes } = splitScopes(scopes);
162
- const rootFields = useRootScopes(rootScopes, baseClient);
163
- const derivedFields = useDerivedScopes(derivedScopes, baseClient);
164
- return useMemo(() => {
165
- return {
166
- ...baseClient,
167
- ...rootFields.scopes,
168
- ...derivedFields,
169
- subscribe: rootFields.subscribe ?? baseClient.subscribe,
170
- flushSync: rootFields.flushSync ?? baseClient.flushSync,
171
- on: rootFields.on ?? baseClient.on
172
- };
173
- }, [baseClient, rootFields, derivedFields]);
174
- };
175
- function useAssistantClient(scopes) {
176
- if (scopes) {
177
- return useExtendedAssistantClientImpl(scopes);
178
- } else {
179
- return useAssistantContextValue();
218
+ if (clients) {
219
+ return useResource(AssistantClientResource({ baseClient, clients }));
180
220
  }
221
+ return baseClient;
181
222
  }
182
223
  export {
183
- useAssistantClient,
184
- useDerivedScopes,
185
- useRootScopes
224
+ AssistantClientResource,
225
+ useAssistantClient
186
226
  };
187
227
  //# sourceMappingURL=useAssistantClient.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useAssistantClient.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport {\n resource,\n tapMemo,\n tapResource,\n tapResources,\n tapEffectEvent,\n tapInlineResource,\n ResourceElement,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n AssistantScopes,\n ScopesInput,\n ScopeField,\n ScopeInput,\n DerivedScopeProps,\n} from \"./types\";\nimport { asStore } from \"./asStore\";\nimport { useAssistantContextValue } from \"./AssistantContext\";\nimport { splitScopes } from \"./utils/splitScopes\";\nimport {\n EventManager,\n normalizeEventSelector,\n type AssistantEvent,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./EventContext\";\nimport { withStoreContextProvider } from \"./StoreContext\";\n\n/**\n * Resource that renders a store with the store context provider.\n * This ensures the context is re-established on every re-render.\n */\nconst RootScopeStoreResource = resource(\n <K extends keyof AssistantScopes>({\n element,\n events,\n parent,\n }: {\n element: ScopeInput<AssistantScopes[K]>;\n events: EventManager;\n parent: AssistantClient;\n }) => {\n return withStoreContextProvider({ events, parent }, () =>\n tapInlineResource(element),\n );\n },\n);\n\n/**\n * Resource for a single root scope\n * Returns a tuple of [scopeName, {scopeFunction, subscribe, flushSync}]\n */\nconst RootScopeResource = resource(\n <K extends keyof AssistantScopes>({\n scopeName,\n element,\n events,\n parent,\n }: {\n scopeName: K;\n element: ScopeInput<AssistantScopes[K]>;\n events: EventManager;\n parent: AssistantClient;\n }) => {\n const store = tapResource(\n asStore(RootScopeStoreResource({ element, events, parent })),\n );\n\n return tapMemo(() => {\n const scopeFunction = (() => store.getState().api) as ScopeField<\n AssistantScopes[K]\n >;\n scopeFunction.source = \"root\";\n scopeFunction.query = {};\n\n return [\n scopeName,\n {\n scopeFunction,\n subscribe: store.subscribe,\n flushSync: store.flushSync,\n },\n ] as const;\n }, [scopeName, store]);\n },\n);\n\n/**\n * Resource for all root scopes\n * Mounts each root scope and returns an object mapping scope names to their stores\n */\nconst RootScopesResource = resource(\n ({ scopes, parent }: { scopes: ScopesInput; parent: AssistantClient }) => {\n const events = tapInlineResource(EventManager());\n\n const resultEntries = tapResources(\n Object.entries(scopes).map(([scopeName, element]) =>\n RootScopeResource(\n {\n scopeName: scopeName as keyof AssistantScopes,\n element: element as ScopeInput<\n AssistantScopes[keyof AssistantScopes]\n >,\n events,\n parent,\n },\n { key: scopeName },\n ),\n ),\n );\n\n const on = <TEvent extends AssistantEvent>(\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) => {\n const { event } = normalizeEventSelector(selector);\n return events.on(event, callback);\n };\n\n return tapMemo(() => {\n if (resultEntries.length === 0) {\n return {\n scopes: {},\n on,\n };\n }\n\n return {\n scopes: Object.fromEntries(\n resultEntries.map(([scopeName, { scopeFunction }]) => [\n scopeName,\n scopeFunction,\n ]),\n ) as {\n [K in keyof typeof scopes]: ScopeField<AssistantScopes[K]>;\n },\n subscribe: (callback: () => void) => {\n const unsubscribes = resultEntries.map(([, { subscribe }]) => {\n return subscribe(() => {\n console.log(\"Callback called for\");\n callback();\n });\n });\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe());\n };\n },\n flushSync: () => {\n resultEntries.forEach(([, { flushSync }]) => {\n flushSync();\n });\n },\n on,\n };\n }, [...resultEntries, events]);\n },\n);\n\n/**\n * Hook to mount and access root scopes\n */\nexport const useRootScopes = (\n rootScopes: ScopesInput,\n parent: AssistantClient,\n) => {\n return useResource(RootScopesResource({ scopes: rootScopes, parent }));\n};\n\n/**\n * Resource for a single derived scope\n * Returns a tuple of [scopeName, scopeFunction] where scopeFunction has source and query\n */\nconst DerivedScopeResource = resource(\n <K extends keyof AssistantScopes>({\n scopeName,\n element,\n parentClient,\n }: {\n scopeName: K;\n element: ResourceElement<\n AssistantScopes[K],\n DerivedScopeProps<AssistantScopes[K]>\n >;\n parentClient: AssistantClient;\n }) => {\n const get = tapEffectEvent(element.props.get);\n const source = element.props.source;\n const query = element.props.query;\n return tapMemo(() => {\n const scopeFunction = (() => get(parentClient)) as ScopeField<\n AssistantScopes[K]\n >;\n scopeFunction.source = source;\n scopeFunction.query = query;\n\n return [scopeName, scopeFunction] as const;\n }, [scopeName, get, source, JSON.stringify(query), parentClient]);\n },\n);\n\n/**\n * Resource for all derived scopes\n * Builds stable scope functions with source and query metadata\n */\nconst DerivedScopesResource = resource(\n ({\n scopes,\n parentClient,\n }: {\n scopes: ScopesInput;\n parentClient: AssistantClient;\n }) => {\n const resultEntries = tapResources(\n Object.entries(scopes).map(([scopeName, element]) =>\n DerivedScopeResource(\n {\n scopeName: scopeName as keyof AssistantScopes,\n element: element as ScopeInput<\n AssistantScopes[keyof AssistantScopes]\n >,\n parentClient,\n },\n { key: scopeName },\n ),\n ),\n );\n\n return tapMemo(() => {\n return Object.fromEntries(resultEntries) as {\n [K in keyof typeof scopes]: ScopeField<AssistantScopes[K]>;\n };\n }, [...resultEntries]);\n },\n);\n\n/**\n * Hook to mount and access derived scopes\n */\nexport const useDerivedScopes = (\n derivedScopes: ScopesInput,\n parentClient: AssistantClient,\n) => {\n return useResource(\n DerivedScopesResource({ scopes: derivedScopes, parentClient }),\n );\n};\n\nconst useExtendedAssistantClientImpl = (\n scopes: ScopesInput,\n): AssistantClient => {\n const baseClient = useAssistantContextValue();\n const { rootScopes, derivedScopes } = splitScopes(scopes);\n\n // Mount the scopes to keep them alive\n const rootFields = useRootScopes(rootScopes, baseClient);\n const derivedFields = useDerivedScopes(derivedScopes, baseClient);\n\n return useMemo(() => {\n // Merge base client with extended client\n // If baseClient is the default proxy, spreading it will be a no-op\n return {\n ...baseClient,\n ...rootFields.scopes,\n ...derivedFields,\n subscribe: rootFields.subscribe ?? baseClient.subscribe,\n flushSync: rootFields.flushSync ?? baseClient.flushSync,\n on: rootFields.on ?? baseClient.on,\n } as AssistantClient;\n }, [baseClient, rootFields, derivedFields]);\n};\n\n/**\n * Hook to access or extend the AssistantClient\n *\n * @example Without config - returns the client from context:\n * ```typescript\n * const client = useAssistantClient();\n * const fooState = client.foo.getState();\n * ```\n *\n * @example With config - creates a new client with additional scopes:\n * ```typescript\n * const client = useAssistantClient({\n * message: DerivedScope({\n * source: \"thread\",\n * query: { type: \"index\", index: 0 },\n * get: () => messageApi,\n * }),\n * });\n * ```\n */\nexport function useAssistantClient(): AssistantClient;\nexport function useAssistantClient(scopes: ScopesInput): AssistantClient;\nexport function useAssistantClient(scopes?: ScopesInput): AssistantClient {\n if (scopes) {\n return useExtendedAssistantClientImpl(scopes);\n } else {\n return useAssistantContextValue();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/useAssistantClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport {\n resource,\n tapMemo,\n tapResources,\n tapEffectEvent,\n tapInlineResource,\n tapEffect,\n tapRef,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n AssistantClientAccessor,\n ClientNames,\n ClientElement,\n ClientMeta,\n} from \"./types/client\";\nimport { Derived, DerivedElement } from \"./Derived\";\nimport { StoreResource } from \"./utils/StoreResource\";\nimport {\n useAssistantContextValue,\n DefaultAssistantClient,\n createRootAssistantClient,\n} from \"./utils/react-assistant-context\";\nimport {\n DerivedClients,\n RootClients,\n splitClients,\n} from \"./utils/splitClients\";\nimport {\n normalizeEventSelector,\n type AssistantEventName,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./types/events\";\nimport { NotificationManager } from \"./utils/NotificationManager\";\nimport { withAssistantTapContextProvider } from \"./utils/tap-assistant-context\";\nimport { tapClientResource } from \"./tapClientResource\";\nimport { getClientIndex } from \"./utils/tap-client-stack-context\";\nimport {\n PROXIED_ASSISTANT_STATE_SYMBOL,\n createProxiedAssistantState,\n} from \"./utils/proxied-assistant-state\";\n\nconst RootClientResource = resource(\n <K extends ClientNames>({\n element,\n emit,\n clientRef,\n }: {\n element: ClientElement<K>;\n emit: NotificationManager[\"emit\"];\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const { methods, state } = withAssistantTapContextProvider(\n { clientRef, emit },\n () => tapClientResource(element),\n );\n return tapMemo(() => ({ methods }), [state]);\n },\n);\n\nconst RootClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n notifications,\n clientRef,\n }: {\n element: ClientElement<K>;\n notifications: NotificationManager;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }): AssistantClientAccessor<K> => {\n const store = tapInlineResource(\n StoreResource(\n RootClientResource({ element, emit: notifications.emit, clientRef }),\n ),\n );\n\n tapEffect(() => {\n return store.subscribe(notifications.notifySubscribers);\n }, [store, notifications]);\n\n return tapMemo(() => {\n const clientFunction = () => store.getState().methods;\n clientFunction.source = \"root\" as const;\n clientFunction.query = {};\n return clientFunction;\n }, [store]);\n },\n);\n\nconst NoOpRootClientsAccessorsResource = resource(() => {\n return tapMemo(\n () => ({ clients: {}, subscribe: undefined, on: undefined }),\n [],\n );\n});\n\nconst RootClientsAccessorsResource = resource(\n ({\n clients: inputClients,\n clientRef,\n }: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const notifications = tapInlineResource(NotificationManager());\n\n tapEffect(\n () => clientRef.parent.subscribe(notifications.notifySubscribers),\n [clientRef, notifications],\n );\n\n const results = tapResources(\n inputClients,\n (element) =>\n RootClientAccessorResource({\n element: element!,\n notifications,\n clientRef,\n }),\n [notifications, clientRef],\n );\n\n return tapMemo(() => {\n return {\n clients: results,\n subscribe: notifications.subscribe,\n on: function <TEvent extends AssistantEventName>(\n this: AssistantClient,\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) {\n if (!this) {\n throw new Error(\n \"const { on } = useAssistantClient() is not supported. Use aui.on() instead.\",\n );\n }\n\n const { scope, event } = normalizeEventSelector(selector);\n\n if (scope !== \"*\") {\n const source = this[scope as ClientNames].source;\n if (source === null) {\n throw new Error(\n `Scope \"${scope}\" is not available. Use { scope: \"*\", event: \"${event}\" } to listen globally.`,\n );\n }\n }\n\n const localUnsub = notifications.on(event, (payload, clientStack) => {\n if (scope === \"*\") {\n callback(payload);\n return;\n }\n\n const scopeClient = this[scope as ClientNames]();\n const index = getClientIndex(scopeClient);\n if (scopeClient === clientStack[index]) {\n callback(payload);\n }\n });\n if (\n scope !== \"*\" &&\n clientRef.parent[scope as ClientNames].source === null\n )\n return localUnsub;\n\n const parentUnsub = clientRef.parent.on(selector, callback);\n\n return () => {\n localUnsub();\n parentUnsub();\n };\n },\n };\n }, [results, notifications, clientRef]);\n },\n);\n\ntype MetaMemo<K extends ClientNames> = {\n meta?: ClientMeta<K>;\n dep?: unknown;\n};\n\nconst getMeta = <K extends ClientNames>(\n props: Derived.Props<K>,\n clientRef: { parent: AssistantClient; current: AssistantClient | null },\n memo: MetaMemo<K>,\n): ClientMeta<K> => {\n if (\"source\" in props && \"query\" in props) return props;\n if (memo.dep === props) return memo.meta!;\n const meta = props.getMeta(clientRef.current!);\n memo.meta = meta;\n memo.dep = props;\n return meta;\n};\n\nconst DerivedClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n clientRef,\n }: {\n element: DerivedElement<K>;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const get = tapEffectEvent(() => element.props);\n\n return tapMemo(() => {\n const clientFunction = () => get().get(clientRef.current!);\n const metaMemo = {};\n Object.defineProperties(clientFunction, {\n source: {\n get: () => getMeta(get(), clientRef, metaMemo).source,\n },\n query: {\n get: () => getMeta(get(), clientRef, metaMemo).query,\n },\n });\n return clientFunction;\n }, [clientRef]);\n },\n);\n\nconst DerivedClientsAccessorsResource = resource(\n ({\n clients,\n clientRef,\n }: {\n clients: DerivedClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n return tapResources(\n clients,\n (element) =>\n DerivedClientAccessorResource({\n element: element!,\n clientRef,\n }),\n [clientRef],\n );\n },\n);\n\n/**\n * Resource that creates an extended AssistantClient.\n */\nexport const AssistantClientResource = resource(\n ({\n baseClient,\n clients,\n }: {\n baseClient: AssistantClient;\n clients: useAssistantClient.Props;\n }): AssistantClient => {\n const { rootClients, derivedClients } = splitClients(clients, baseClient);\n\n const clientRef = tapRef({\n parent: baseClient,\n current: null as AssistantClient | null,\n }).current;\n\n const rootFields = tapResource(\n Object.keys(rootClients).length > 0\n ? RootClientsAccessorsResource({ clients: rootClients, clientRef })\n : NoOpRootClientsAccessorsResource(),\n );\n\n const derivedFields = tapInlineResource(\n DerivedClientsAccessorsResource({ clients: derivedClients, clientRef }),\n );\n\n const client = tapMemo(() => {\n // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message\n const proto =\n baseClient === DefaultAssistantClient\n ? createRootAssistantClient()\n : baseClient;\n const client = Object.create(proto) as AssistantClient;\n Object.assign(client, rootFields.clients, derivedFields, {\n subscribe: rootFields.subscribe ?? baseClient.subscribe,\n on: rootFields.on ?? baseClient.on,\n [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client),\n });\n return client;\n }, [baseClient, rootFields, derivedFields]);\n\n if (clientRef.current === null) {\n clientRef.current = client;\n }\n\n tapEffect(() => {\n clientRef.current = client;\n });\n\n return client;\n },\n);\n\nexport namespace useAssistantClient {\n export type Props = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n };\n}\n\nexport function useAssistantClient(): AssistantClient;\nexport function useAssistantClient(\n clients: useAssistantClient.Props,\n): AssistantClient;\nexport function useAssistantClient(\n clients?: useAssistantClient.Props,\n): AssistantClient {\n const baseClient = useAssistantContextValue();\n if (clients) {\n return useResource(AssistantClientResource({ baseClient, clients }));\n }\n return baseClient;\n}\n"],"mappings":"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","names":["client"]}
@@ -1,3 +1,3 @@
1
- import type { AssistantEvent, AssistantEventCallback, AssistantEventSelector } from "./EventContext";
2
- export declare const useAssistantEvent: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void;
1
+ import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./types/events";
2
+ export declare const useAssistantEvent: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void;
3
3
  //# sourceMappingURL=useAssistantEvent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantEvent.d.ts","sourceRoot":"","sources":["../src/useAssistantEvent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,iBAAiB,GAAI,MAAM,SAAS,cAAc,EAC7D,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAUzC,CAAC"}
1
+ {"version":3,"file":"useAssistantEvent.d.ts","sourceRoot":"","sources":["../src/useAssistantEvent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,iBAAiB,GAAI,MAAM,SAAS,kBAAkB,EACjE,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAOzC,CAAC"}
@@ -1,15 +1,12 @@
1
1
  // src/useAssistantEvent.ts
2
2
  import { useEffect, useEffectEvent } from "react";
3
3
  import { useAssistantClient } from "./useAssistantClient.js";
4
- import { normalizeEventSelector } from "./EventContext.js";
4
+ import { normalizeEventSelector } from "./types/events.js";
5
5
  var useAssistantEvent = (selector, callback) => {
6
- const client = useAssistantClient();
6
+ const aui = useAssistantClient();
7
7
  const callbackRef = useEffectEvent(callback);
8
8
  const { scope, event } = normalizeEventSelector(selector);
9
- useEffect(
10
- () => client.on({ scope, event }, callbackRef),
11
- [client, scope, event]
12
- );
9
+ useEffect(() => aui.on({ scope, event }, callbackRef), [aui, scope, event]);
13
10
  };
14
11
  export {
15
12
  useAssistantEvent
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useAssistantEvent.ts"],"sourcesContent":["import { useEffect, useEffectEvent } from \"react\";\nimport { useAssistantClient } from \"./useAssistantClient\";\nimport type {\n AssistantEvent,\n AssistantEventCallback,\n AssistantEventSelector,\n} from \"./EventContext\";\nimport { normalizeEventSelector } from \"./EventContext\";\n\nexport const useAssistantEvent = <TEvent extends AssistantEvent>(\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n) => {\n const client = useAssistantClient();\n const callbackRef = useEffectEvent(callback);\n\n const { scope, event } = normalizeEventSelector(selector);\n useEffect(\n () => client.on({ scope, event }, callbackRef),\n [client, scope, event],\n );\n};\n"],"mappings":";AAAA,SAAS,WAAW,sBAAsB;AAC1C,SAAS,0BAA0B;AAMnC,SAAS,8BAA8B;AAEhC,IAAM,oBAAoB,CAC/B,UACA,aACG;AACH,QAAM,SAAS,mBAAmB;AAClC,QAAM,cAAc,eAAe,QAAQ;AAE3C,QAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AACxD;AAAA,IACE,MAAM,OAAO,GAAG,EAAE,OAAO,MAAM,GAAG,WAAW;AAAA,IAC7C,CAAC,QAAQ,OAAO,KAAK;AAAA,EACvB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/useAssistantEvent.ts"],"sourcesContent":["import { useEffect, useEffectEvent } from \"react\";\nimport { useAssistantClient } from \"./useAssistantClient\";\nimport type {\n AssistantEventName,\n AssistantEventCallback,\n AssistantEventSelector,\n} from \"./types/events\";\nimport { normalizeEventSelector } from \"./types/events\";\n\nexport const useAssistantEvent = <TEvent extends AssistantEventName>(\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n) => {\n const aui = useAssistantClient();\n const callbackRef = useEffectEvent(callback);\n\n const { scope, event } = normalizeEventSelector(selector);\n useEffect(() => aui.on({ scope, event }, callbackRef), [aui, scope, event]);\n};\n"],"mappings":";AAAA,SAAS,WAAW,sBAAsB;AAC1C,SAAS,0BAA0B;AAMnC,SAAS,8BAA8B;AAEhC,IAAM,oBAAoB,CAC/B,UACA,aACG;AACH,QAAM,MAAM,mBAAmB;AAC/B,QAAM,cAAc,eAAe,QAAQ;AAE3C,QAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AACxD,YAAU,MAAM,IAAI,GAAG,EAAE,OAAO,MAAM,GAAG,WAAW,GAAG,CAAC,KAAK,OAAO,KAAK,CAAC;AAC5E;","names":[]}
@@ -1,4 +1,4 @@
1
- import type { AssistantState } from "./types";
1
+ import type { AssistantState } from "./types/client";
2
2
  /**
3
3
  * Hook to access a slice of the assistant state with automatic subscription
4
4
  *
@@ -7,7 +7,7 @@ import type { AssistantState } from "./types";
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
- * const client = useAssistantClient({
10
+ * const aui = useAssistantClient({
11
11
  * foo: RootScope({ ... }),
12
12
  * });
13
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantState.d.ts","sourceRoot":"","sources":["../src/useAssistantState.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,SAAS,CAAC;AAsC/D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KACrC,CAuBF,CAAC"}
1
+ {"version":3,"file":"useAssistantState.d.ts","sourceRoot":"","sources":["../src/useAssistantState.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KACrC,CAmBF,CAAC"}
@@ -1,50 +1,21 @@
1
1
  // src/useAssistantState.tsx
2
- import { useMemo, useSyncExternalStore, useDebugValue } from "react";
2
+ import { useSyncExternalStore, useDebugValue } from "react";
3
3
  import { useAssistantClient } from "./useAssistantClient.js";
4
- var ProxiedAssistantState = class _ProxiedAssistantState {
5
- #client;
6
- constructor(client) {
7
- this.#client = client;
8
- }
9
- #getScope(key) {
10
- const scopeField = this.#client[key];
11
- if (!scopeField) {
12
- throw new Error(`Scope "${String(key)}" not found in client`);
13
- }
14
- const api = scopeField();
15
- const state = api.getState();
16
- return state;
17
- }
18
- // Create a Proxy to dynamically handle property access
19
- static create(client) {
20
- const instance = new _ProxiedAssistantState(client);
21
- return new Proxy(instance, {
22
- get(target, prop) {
23
- if (typeof prop === "string" && prop in client) {
24
- return target.#getScope(prop);
25
- }
26
- return void 0;
27
- }
28
- });
29
- }
30
- };
4
+ import { getProxiedAssistantState } from "./utils/proxied-assistant-state.js";
31
5
  var useAssistantState = (selector) => {
32
- const client = useAssistantClient();
33
- const proxiedState = useMemo(
34
- () => ProxiedAssistantState.create(client),
35
- [client]
36
- );
6
+ const aui = useAssistantClient();
7
+ const proxiedState = getProxiedAssistantState(aui);
37
8
  const slice = useSyncExternalStore(
38
- client.subscribe,
9
+ aui.subscribe,
39
10
  () => selector(proxiedState),
40
11
  () => selector(proxiedState)
41
12
  );
42
- useDebugValue(slice);
43
- if (slice instanceof ProxiedAssistantState) {
13
+ if (slice === proxiedState) {
44
14
  throw new Error(
45
15
  "You tried to return the entire AssistantState. This is not supported due to technical limitations."
46
16
  );
47
17
  }
18
+ useDebugValue(slice);
48
19
  return slice;
49
20
  };
50
21
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useAssistantState.tsx"],"sourcesContent":["import { useMemo, useSyncExternalStore, useDebugValue } from \"react\";\nimport type { AssistantClient, AssistantState } from \"./types\";\nimport { useAssistantClient } from \"./useAssistantClient\";\n\n/**\n * Proxied state that lazily accesses scope states\n */\nclass ProxiedAssistantState {\n #client: AssistantClient;\n\n constructor(client: AssistantClient) {\n this.#client = client;\n }\n\n #getScope<K extends keyof AssistantState>(key: K): AssistantState[K] {\n const scopeField = this.#client[key];\n if (!scopeField) {\n throw new Error(`Scope \"${String(key)}\" not found in client`);\n }\n\n const api = scopeField();\n const state = api.getState();\n return state as AssistantState[K];\n }\n\n // Create a Proxy to dynamically handle property access\n static create(client: AssistantClient): AssistantState {\n const instance = new ProxiedAssistantState(client);\n return new Proxy(instance, {\n get(target, prop) {\n if (typeof prop === \"string\" && prop in client) {\n return target.#getScope(prop as keyof AssistantState);\n }\n return undefined;\n },\n }) as unknown as AssistantState;\n }\n}\n\n/**\n * Hook to access a slice of the assistant state with automatic subscription\n *\n * @param selector - Function to select a slice of the state\n * @returns The selected state slice\n *\n * @example\n * ```typescript\n * const client = useAssistantClient({\n * foo: RootScope({ ... }),\n * });\n *\n * const bar = useAssistantState((state) => state.foo.bar);\n * ```\n */\nexport const useAssistantState = <T,>(\n selector: (state: AssistantState) => T,\n): T => {\n const client = useAssistantClient();\n\n const proxiedState = useMemo(\n () => ProxiedAssistantState.create(client),\n [client],\n );\n\n const slice = useSyncExternalStore(\n client.subscribe,\n () => selector(proxiedState),\n () => selector(proxiedState),\n );\n\n useDebugValue(slice);\n\n if (slice instanceof ProxiedAssistantState) {\n throw new Error(\n \"You tried to return the entire AssistantState. This is not supported due to technical limitations.\",\n );\n }\n\n return slice;\n};\n"],"mappings":";AAAA,SAAS,SAAS,sBAAsB,qBAAqB;AAE7D,SAAS,0BAA0B;AAKnC,IAAM,wBAAN,MAAM,uBAAsB;AAAA,EAC1B;AAAA,EAEA,YAAY,QAAyB;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAA0C,KAA2B;AACnE,UAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,UAAU,OAAO,GAAG,CAAC,uBAAuB;AAAA,IAC9D;AAEA,UAAM,MAAM,WAAW;AACvB,UAAM,QAAQ,IAAI,SAAS;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,OAAO,QAAyC;AACrD,UAAM,WAAW,IAAI,uBAAsB,MAAM;AACjD,WAAO,IAAI,MAAM,UAAU;AAAA,MACzB,IAAI,QAAQ,MAAM;AAChB,YAAI,OAAO,SAAS,YAAY,QAAQ,QAAQ;AAC9C,iBAAO,OAAO,UAAU,IAA4B;AAAA,QACtD;AACA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAiBO,IAAM,oBAAoB,CAC/B,aACM;AACN,QAAM,SAAS,mBAAmB;AAElC,QAAM,eAAe;AAAA,IACnB,MAAM,sBAAsB,OAAO,MAAM;AAAA,IACzC,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP,MAAM,SAAS,YAAY;AAAA,IAC3B,MAAM,SAAS,YAAY;AAAA,EAC7B;AAEA,gBAAc,KAAK;AAEnB,MAAI,iBAAiB,uBAAuB;AAC1C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/useAssistantState.tsx"],"sourcesContent":["import { useSyncExternalStore, useDebugValue } from \"react\";\nimport type { AssistantState } from \"./types/client\";\nimport { useAssistantClient } from \"./useAssistantClient\";\nimport { getProxiedAssistantState } from \"./utils/proxied-assistant-state\";\n\n/**\n * Hook to access a slice of the assistant state with automatic subscription\n *\n * @param selector - Function to select a slice of the state\n * @returns The selected state slice\n *\n * @example\n * ```typescript\n * const aui = useAssistantClient({\n * foo: RootScope({ ... }),\n * });\n *\n * const bar = useAssistantState((state) => state.foo.bar);\n * ```\n */\nexport const useAssistantState = <T,>(\n selector: (state: AssistantState) => T,\n): T => {\n const aui = useAssistantClient();\n const proxiedState = getProxiedAssistantState(aui);\n\n const slice = useSyncExternalStore(\n aui.subscribe,\n () => selector(proxiedState),\n () => selector(proxiedState),\n );\n\n if (slice === proxiedState) {\n throw new Error(\n \"You tried to return the entire AssistantState. This is not supported due to technical limitations.\",\n );\n }\n\n useDebugValue(slice);\n\n return slice;\n};\n"],"mappings":";AAAA,SAAS,sBAAsB,qBAAqB;AAEpD,SAAS,0BAA0B;AACnC,SAAS,gCAAgC;AAiBlC,IAAM,oBAAoB,CAC/B,aACM;AACN,QAAM,MAAM,mBAAmB;AAC/B,QAAM,eAAe,yBAAyB,GAAG;AAEjD,QAAM,QAAQ;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM,SAAS,YAAY;AAAA,IAC3B,MAAM,SAAS,YAAY;AAAA,EAC7B;AAEA,MAAI,UAAU,cAAc;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,KAAK;AAEnB,SAAO;AACT;","names":[]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Handles common proxy introspection properties.
3
+ * Returns the appropriate value for toStringTag, toJSON, and props that should return undefined.
4
+ * Returns `false` if the prop should be handled by the subclass.
5
+ */
6
+ export declare const handleIntrospectionProp: (prop: string | symbol, name: string) => unknown | false;
7
+ export declare abstract class BaseProxyHandler implements ProxyHandler<object> {
8
+ abstract get(_: unknown, prop: string | symbol): unknown;
9
+ abstract ownKeys(): ArrayLike<string | symbol>;
10
+ abstract has(_: unknown, prop: string | symbol): boolean;
11
+ getOwnPropertyDescriptor(_: unknown, prop: string | symbol): {
12
+ value: {} | null;
13
+ writable: boolean;
14
+ enumerable: boolean;
15
+ configurable: boolean;
16
+ } | undefined;
17
+ set(): boolean;
18
+ setPrototypeOf(): boolean;
19
+ defineProperty(): boolean;
20
+ deleteProperty(): boolean;
21
+ preventExtensions(): boolean;
22
+ }
23
+ //# sourceMappingURL=BaseProxyHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseProxyHandler.d.ts","sourceRoot":"","sources":["../../src/utils/BaseProxyHandler.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,MAAM,GAAG,MAAM,EACrB,MAAM,MAAM,KACX,OAAO,GAAG,KAMZ,CAAC;AAEF,8BAAsB,gBAAiB,YAAW,YAAY,CAAC,MAAM,CAAC;IACpE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IACxD,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAExD,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;;;;;;IAW1D,GAAG;IAGH,cAAc;IAGd,cAAc;IAGd,cAAc;IAGd,iBAAiB,IAAI,OAAO;CAG7B"}
@@ -0,0 +1,41 @@
1
+ // src/utils/BaseProxyHandler.ts
2
+ var INTROSPECTION_PROPS = /* @__PURE__ */ new Set(["$$typeof", "nodeType", "then"]);
3
+ var handleIntrospectionProp = (prop, name) => {
4
+ if (prop === Symbol.toStringTag) return name;
5
+ if (typeof prop === "symbol") return void 0;
6
+ if (prop === "toJSON") return () => name;
7
+ if (INTROSPECTION_PROPS.has(prop)) return void 0;
8
+ return false;
9
+ };
10
+ var BaseProxyHandler = class {
11
+ getOwnPropertyDescriptor(_, prop) {
12
+ const value = this.get(_, prop);
13
+ if (value === void 0) return void 0;
14
+ return {
15
+ value,
16
+ writable: false,
17
+ enumerable: true,
18
+ configurable: false
19
+ };
20
+ }
21
+ set() {
22
+ return false;
23
+ }
24
+ setPrototypeOf() {
25
+ return false;
26
+ }
27
+ defineProperty() {
28
+ return false;
29
+ }
30
+ deleteProperty() {
31
+ return false;
32
+ }
33
+ preventExtensions() {
34
+ return false;
35
+ }
36
+ };
37
+ export {
38
+ BaseProxyHandler,
39
+ handleIntrospectionProp
40
+ };
41
+ //# sourceMappingURL=BaseProxyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/BaseProxyHandler.ts"],"sourcesContent":["const INTROSPECTION_PROPS = new Set([\"$$typeof\", \"nodeType\", \"then\"]);\n\n/**\n * Handles common proxy introspection properties.\n * Returns the appropriate value for toStringTag, toJSON, and props that should return undefined.\n * Returns `false` if the prop should be handled by the subclass.\n */\nexport const handleIntrospectionProp = (\n prop: string | symbol,\n name: string,\n): unknown | false => {\n if (prop === Symbol.toStringTag) return name;\n if (typeof prop === \"symbol\") return undefined;\n if (prop === \"toJSON\") return () => name;\n if (INTROSPECTION_PROPS.has(prop)) return undefined;\n return false;\n};\n\nexport abstract class BaseProxyHandler implements ProxyHandler<object> {\n abstract get(_: unknown, prop: string | symbol): unknown;\n abstract ownKeys(): ArrayLike<string | symbol>;\n abstract has(_: unknown, prop: string | symbol): boolean;\n\n getOwnPropertyDescriptor(_: unknown, prop: string | symbol) {\n const value = this.get(_, prop);\n if (value === undefined) return undefined;\n return {\n value,\n writable: false,\n enumerable: true,\n configurable: false,\n };\n }\n\n set() {\n return false;\n }\n setPrototypeOf() {\n return false;\n }\n defineProperty() {\n return false;\n }\n deleteProperty() {\n return false;\n }\n preventExtensions(): boolean {\n return false;\n }\n}\n"],"mappings":";AAAA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,YAAY,YAAY,MAAM,CAAC;AAO7D,IAAM,0BAA0B,CACrC,MACA,SACoB;AACpB,MAAI,SAAS,OAAO,YAAa,QAAO;AACxC,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,SAAS,SAAU,QAAO,MAAM;AACpC,MAAI,oBAAoB,IAAI,IAAI,EAAG,QAAO;AAC1C,SAAO;AACT;AAEO,IAAe,mBAAf,MAAgE;AAAA,EAKrE,yBAAyB,GAAY,MAAuB;AAC1D,UAAM,QAAQ,KAAK,IAAI,GAAG,IAAI;AAC9B,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,oBAA6B;AAC3B,WAAO;AAAA,EACT;AACF;","names":[]}