@assistant-ui/store 0.0.1 → 0.0.3

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 +10 -0
  3. package/dist/AssistantIf.d.ts.map +1 -0
  4. package/dist/AssistantIf.js +13 -0
  5. package/dist/AssistantIf.js.map +1 -0
  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 +11 -14
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +19 -16
  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 -41
  38. package/dist/useAssistantClient.d.ts.map +1 -1
  39. package/dist/useAssistantClient.js +185 -130
  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 +5 -6
  82. package/src/AssistantIf.tsx +17 -0
  83. package/src/Derived.ts +46 -0
  84. package/src/attachDefaultPeers.ts +78 -0
  85. package/src/index.ts +31 -25
  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 +259 -217
  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 -18
  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 -65
  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 -88
  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 -21
  146. package/src/EventContext.ts +0 -184
  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 -129
  154. package/src/utils/splitScopes.ts +0 -38
  155. /package/dist/{types.js.map → types/client.js.map} +0 -0
@@ -1,172 +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 RootScopeResource = 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
- scopeName,
23
- element
37
+ element,
38
+ emit,
39
+ clientRef
24
40
  }) => {
25
- const store = tapResource(asStore(element));
26
- return tapMemo(() => {
27
- const scopeFunction = (() => store.getState().api);
28
- scopeFunction.source = "root";
29
- scopeFunction.query = {};
30
- return [
31
- scopeName,
32
- {
33
- scopeFunction,
34
- subscribe: store.subscribe,
35
- flushSync: store.flushSync
36
- }
37
- ];
38
- }, [scopeName, store]);
41
+ const { methods, state } = withAssistantTapContextProvider(
42
+ { clientRef, emit },
43
+ () => tapClientResource(element)
44
+ );
45
+ return tapMemo(() => ({ methods }), [state]);
39
46
  }
40
47
  );
41
- var RootScopesResource = resource(
42
- ({ scopes, parent }) => {
43
- const events = tapInlineResource(EventManager());
44
- const resultEntries = withStoreContextProvider(
45
- { events, parent },
46
- () => tapResources(
47
- Object.entries(scopes).map(
48
- ([scopeName, element]) => RootScopeResource(
49
- {
50
- scopeName,
51
- element
52
- },
53
- { key: scopeName }
54
- )
55
- )
48
+ var RootClientAccessorResource = resource(
49
+ ({
50
+ element,
51
+ notifications,
52
+ clientRef
53
+ }) => {
54
+ const store = tapInlineResource(
55
+ StoreResource(
56
+ RootClientResource({ element, emit: notifications.emit, clientRef })
56
57
  )
57
58
  );
58
- const on = (selector, callback) => {
59
- const { event } = normalizeEventSelector(selector);
60
- return events.on(event, callback);
61
- };
59
+ tapEffect(() => {
60
+ return store.subscribe(notifications.notifySubscribers);
61
+ }, [store, notifications]);
62
+ return tapMemo(() => {
63
+ const clientFunction = () => store.getState().methods;
64
+ clientFunction.source = "root";
65
+ clientFunction.query = {};
66
+ return clientFunction;
67
+ }, [store]);
68
+ }
69
+ );
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]
94
+ );
62
95
  return tapMemo(() => {
63
- if (resultEntries.length === 0) {
64
- return {
65
- scopes: {},
66
- on
67
- };
68
- }
69
96
  return {
70
- scopes: Object.fromEntries(
71
- resultEntries.map(([scopeName, { scopeFunction }]) => [
72
- scopeName,
73
- scopeFunction
74
- ])
75
- ),
76
- subscribe: (callback) => {
77
- const unsubscribes = resultEntries.map(([, { subscribe }]) => {
78
- return subscribe(() => {
79
- console.log("Callback called for");
80
- callback();
81
- });
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
+ }
82
124
  });
125
+ if (scope !== "*" && clientRef.parent[scope].source === null)
126
+ return localUnsub;
127
+ const parentUnsub = clientRef.parent.on(selector, callback);
83
128
  return () => {
84
- unsubscribes.forEach((unsubscribe) => unsubscribe());
129
+ localUnsub();
130
+ parentUnsub();
85
131
  };
86
- },
87
- flushSync: () => {
88
- resultEntries.forEach(([, { flushSync }]) => {
89
- flushSync();
90
- });
91
- },
92
- on
132
+ }
93
133
  };
94
- }, [...resultEntries, events]);
134
+ }, [results, notifications, clientRef]);
95
135
  }
96
136
  );
97
- var useRootScopes = (rootScopes, parent) => {
98
- 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;
99
144
  };
100
- var DerivedScopeResource = resource(
145
+ var DerivedClientAccessorResource = resource(
101
146
  ({
102
- scopeName,
103
147
  element,
104
- parentClient
148
+ clientRef
105
149
  }) => {
106
- const get = tapEffectEvent(element.props.get);
107
- const source = element.props.source;
108
- const query = element.props.query;
150
+ const get = tapEffectEvent(() => element.props);
109
151
  return tapMemo(() => {
110
- const scopeFunction = (() => get(parentClient));
111
- scopeFunction.source = source;
112
- scopeFunction.query = query;
113
- return [scopeName, scopeFunction];
114
- }, [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]);
115
164
  }
116
165
  );
117
- var DerivedScopesResource = resource(
166
+ var DerivedClientsAccessorsResource = resource(
118
167
  ({
119
- scopes,
120
- parentClient
168
+ clients,
169
+ clientRef
121
170
  }) => {
122
- const resultEntries = tapResources(
123
- Object.entries(scopes).map(
124
- ([scopeName, element]) => DerivedScopeResource(
125
- {
126
- scopeName,
127
- element,
128
- parentClient
129
- },
130
- { key: scopeName }
131
- )
132
- )
171
+ return tapResources(
172
+ clients,
173
+ (element) => DerivedClientAccessorResource({
174
+ element,
175
+ clientRef
176
+ }),
177
+ [clientRef]
133
178
  );
134
- return tapMemo(() => {
135
- return Object.fromEntries(resultEntries);
136
- }, [...resultEntries]);
137
179
  }
138
180
  );
139
- var useDerivedScopes = (derivedScopes, parentClient) => {
140
- return useResource(
141
- DerivedScopesResource({ scopes: derivedScopes, parentClient })
142
- );
143
- };
144
- 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) {
145
217
  const baseClient = useAssistantContextValue();
146
- const { rootScopes, derivedScopes } = splitScopes(scopes);
147
- const rootFields = useRootScopes(rootScopes, baseClient);
148
- const derivedFields = useDerivedScopes(derivedScopes, baseClient);
149
- return useMemo(() => {
150
- return {
151
- ...baseClient,
152
- ...rootFields.scopes,
153
- ...derivedFields,
154
- subscribe: rootFields.subscribe ?? baseClient.subscribe,
155
- flushSync: rootFields.flushSync ?? baseClient.flushSync,
156
- on: rootFields.on ?? baseClient.on
157
- };
158
- }, [baseClient, rootFields, derivedFields]);
159
- };
160
- function useAssistantClient(scopes) {
161
- if (scopes) {
162
- return useExtendedAssistantClientImpl(scopes);
163
- } else {
164
- return useAssistantContextValue();
218
+ if (clients) {
219
+ return useResource(AssistantClientResource({ baseClient, clients }));
165
220
  }
221
+ return baseClient;
166
222
  }
167
223
  export {
168
- useAssistantClient,
169
- useDerivedScopes,
170
- useRootScopes
224
+ AssistantClientResource,
225
+ useAssistantClient
171
226
  };
172
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 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 }: {\n scopeName: K;\n element: ScopeInput<AssistantScopes[K]>;\n }) => {\n const store = tapResource(asStore(element));\n\n return tapMemo(() => {\n const scopeFunction = (() => store.getState().api) as ScopeField<\n AssistantScopes[K]\n >;\n scopeFunction.source = \"root\";\n scopeFunction.query = {} as AssistantScopes[K][\"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 = withStoreContextProvider({ events, parent }, () =>\n 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 },\n { key: scopeName },\n ),\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 // eslint-disable-next-line react-hooks/rules-of-hooks\n return useExtendedAssistantClientImpl(scopes);\n } else {\n // eslint-disable-next-line react-hooks/rules-of-hooks\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":[]}
@@ -0,0 +1,11 @@
1
+ import type { ClientStack } from "./tap-client-stack-context";
2
+ import type { AssistantEventName, AssistantEventPayload } from "../types/events";
3
+ import { Unsubscribe } from "../types/client";
4
+ export type NotificationManager = {
5
+ on<TEvent extends AssistantEventName>(event: TEvent, callback: (payload: AssistantEventPayload[TEvent], clientStack: ClientStack) => void): Unsubscribe;
6
+ emit<TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent], clientStack: ClientStack): void;
7
+ subscribe(callback: () => void): Unsubscribe;
8
+ notifySubscribers(): void;
9
+ };
10
+ export declare const NotificationManager: import("@assistant-ui/tap").Resource<NotificationManager, undefined>;
11
+ //# sourceMappingURL=NotificationManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationManager.d.ts","sourceRoot":"","sources":["../../src/utils/NotificationManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,MAAM,SAAS,kBAAkB,EAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CACR,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,WAAW,KACrB,IAAI,GACR,WAAW,CAAC;IACf,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAClD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,IAAI,CAAC;IACR,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC7C,iBAAiB,IAAI,IAAI,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,mBAAmB,sEAkF9B,CAAC"}