@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.
- package/README.md +59 -262
- package/dist/AssistantIf.d.ts +10 -0
- package/dist/AssistantIf.d.ts.map +1 -0
- package/dist/AssistantIf.js +13 -0
- package/dist/AssistantIf.js.map +1 -0
- package/dist/Derived.d.ts +34 -0
- package/dist/Derived.d.ts.map +1 -0
- package/dist/Derived.js +11 -0
- package/dist/Derived.js.map +1 -0
- package/dist/attachDefaultPeers.d.ts +56 -0
- package/dist/attachDefaultPeers.d.ts.map +1 -0
- package/dist/attachDefaultPeers.js +22 -0
- package/dist/attachDefaultPeers.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/tapClientList.d.ts +24 -0
- package/dist/tapClientList.d.ts.map +1 -0
- package/dist/tapClientList.js +72 -0
- package/dist/tapClientList.js.map +1 -0
- package/dist/tapClientLookup.d.ts +11 -0
- package/dist/tapClientLookup.d.ts.map +1 -0
- package/dist/tapClientLookup.js +42 -0
- package/dist/tapClientLookup.js.map +1 -0
- package/dist/tapClientResource.d.ts +24 -0
- package/dist/tapClientResource.d.ts.map +1 -0
- package/dist/tapClientResource.js +100 -0
- package/dist/tapClientResource.js.map +1 -0
- package/dist/types/client.d.ts +117 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +1 -0
- package/dist/types/events.d.ts +33 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +12 -0
- package/dist/types/events.js.map +1 -0
- package/dist/useAssistantClient.d.ts +13 -41
- package/dist/useAssistantClient.d.ts.map +1 -1
- package/dist/useAssistantClient.js +185 -130
- package/dist/useAssistantClient.js.map +1 -1
- package/dist/useAssistantEvent.d.ts +2 -2
- package/dist/useAssistantEvent.d.ts.map +1 -1
- package/dist/useAssistantEvent.js +3 -6
- package/dist/useAssistantEvent.js.map +1 -1
- package/dist/useAssistantState.d.ts +2 -2
- package/dist/useAssistantState.d.ts.map +1 -1
- package/dist/useAssistantState.js +7 -36
- package/dist/useAssistantState.js.map +1 -1
- package/dist/utils/BaseProxyHandler.d.ts +23 -0
- package/dist/utils/BaseProxyHandler.d.ts.map +1 -0
- package/dist/utils/BaseProxyHandler.js +41 -0
- package/dist/utils/BaseProxyHandler.js.map +1 -0
- package/dist/utils/NotificationManager.d.ts +11 -0
- package/dist/utils/NotificationManager.d.ts.map +1 -0
- package/dist/utils/NotificationManager.js +81 -0
- package/dist/utils/NotificationManager.js.map +1 -0
- package/dist/utils/StoreResource.d.ts +14 -0
- package/dist/utils/StoreResource.d.ts.map +1 -0
- package/dist/utils/StoreResource.js +23 -0
- package/dist/utils/StoreResource.js.map +1 -0
- package/dist/utils/proxied-assistant-state.d.ts +8 -0
- package/dist/utils/proxied-assistant-state.d.ts.map +1 -0
- package/dist/utils/proxied-assistant-state.js +41 -0
- package/dist/utils/proxied-assistant-state.js.map +1 -0
- package/dist/{AssistantContext.d.ts → utils/react-assistant-context.d.ts} +6 -6
- package/dist/utils/react-assistant-context.d.ts.map +1 -0
- package/dist/utils/react-assistant-context.js +73 -0
- package/dist/utils/react-assistant-context.js.map +1 -0
- package/dist/utils/splitClients.d.ts +28 -0
- package/dist/utils/splitClients.d.ts.map +1 -0
- package/dist/utils/splitClients.js +37 -0
- package/dist/utils/splitClients.js.map +1 -0
- package/dist/utils/tap-assistant-context.d.ts +19 -0
- package/dist/utils/tap-assistant-context.d.ts.map +1 -0
- package/dist/utils/tap-assistant-context.js +37 -0
- package/dist/utils/tap-assistant-context.js.map +1 -0
- package/dist/utils/tap-client-stack-context.d.ts +23 -0
- package/dist/utils/tap-client-stack-context.d.ts.map +1 -0
- package/dist/utils/tap-client-stack-context.js +30 -0
- package/dist/utils/tap-client-stack-context.js.map +1 -0
- package/package.json +5 -6
- package/src/AssistantIf.tsx +17 -0
- package/src/Derived.ts +46 -0
- package/src/attachDefaultPeers.ts +78 -0
- package/src/index.ts +31 -25
- package/src/tapClientList.ts +105 -0
- package/src/tapClientLookup.ts +56 -0
- package/src/tapClientResource.ts +152 -0
- package/src/types/client.ts +186 -0
- package/src/types/events.ts +77 -0
- package/src/useAssistantClient.tsx +259 -217
- package/src/useAssistantEvent.ts +6 -9
- package/src/useAssistantState.tsx +10 -48
- package/src/utils/BaseProxyHandler.ts +50 -0
- package/src/utils/NotificationManager.ts +110 -0
- package/src/utils/StoreResource.ts +36 -0
- package/src/utils/proxied-assistant-state.tsx +53 -0
- package/src/utils/react-assistant-context.tsx +107 -0
- package/src/utils/splitClients.ts +85 -0
- package/src/utils/tap-assistant-context.ts +59 -0
- package/src/utils/tap-client-stack-context.ts +51 -0
- package/dist/AssistantContext.d.ts.map +0 -1
- package/dist/AssistantContext.js +0 -45
- package/dist/AssistantContext.js.map +0 -1
- package/dist/DerivedScope.d.ts +0 -18
- package/dist/DerivedScope.d.ts.map +0 -1
- package/dist/DerivedScope.js +0 -11
- package/dist/DerivedScope.js.map +0 -1
- package/dist/EventContext.d.ts +0 -65
- package/dist/EventContext.d.ts.map +0 -1
- package/dist/EventContext.js +0 -62
- package/dist/EventContext.js.map +0 -1
- package/dist/ScopeRegistry.d.ts +0 -41
- package/dist/ScopeRegistry.d.ts.map +0 -1
- package/dist/ScopeRegistry.js +0 -17
- package/dist/ScopeRegistry.js.map +0 -1
- package/dist/StoreContext.d.ts +0 -9
- package/dist/StoreContext.d.ts.map +0 -1
- package/dist/StoreContext.js +0 -20
- package/dist/StoreContext.js.map +0 -1
- package/dist/asStore.d.ts +0 -20
- package/dist/asStore.d.ts.map +0 -1
- package/dist/asStore.js +0 -23
- package/dist/asStore.js.map +0 -1
- package/dist/tapApi.d.ts +0 -36
- package/dist/tapApi.d.ts.map +0 -1
- package/dist/tapApi.js +0 -52
- package/dist/tapApi.js.map +0 -1
- package/dist/tapLookupResources.d.ts +0 -44
- package/dist/tapLookupResources.d.ts.map +0 -1
- package/dist/tapLookupResources.js +0 -21
- package/dist/tapLookupResources.js.map +0 -1
- package/dist/tapStoreList.d.ts +0 -76
- package/dist/tapStoreList.d.ts.map +0 -1
- package/dist/tapStoreList.js +0 -46
- package/dist/tapStoreList.js.map +0 -1
- package/dist/types.d.ts +0 -88
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/utils/splitScopes.d.ts +0 -24
- package/dist/utils/splitScopes.d.ts.map +0 -1
- package/dist/utils/splitScopes.js +0 -18
- package/dist/utils/splitScopes.js.map +0 -1
- package/src/AssistantContext.tsx +0 -64
- package/src/DerivedScope.ts +0 -21
- package/src/EventContext.ts +0 -184
- package/src/ScopeRegistry.ts +0 -58
- package/src/StoreContext.ts +0 -28
- package/src/asStore.ts +0 -40
- package/src/tapApi.ts +0 -91
- package/src/tapLookupResources.ts +0 -62
- package/src/tapStoreList.ts +0 -133
- package/src/types.ts +0 -129
- package/src/utils/splitScopes.ts +0 -38
- /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 {
|
|
13
|
-
import {
|
|
14
|
-
|
|
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 "./
|
|
19
|
-
import {
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
37
|
+
element,
|
|
38
|
+
emit,
|
|
39
|
+
clientRef
|
|
24
40
|
}) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
42
|
-
({
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
129
|
+
localUnsub();
|
|
130
|
+
parentUnsub();
|
|
85
131
|
};
|
|
86
|
-
}
|
|
87
|
-
flushSync: () => {
|
|
88
|
-
resultEntries.forEach(([, { flushSync }]) => {
|
|
89
|
-
flushSync();
|
|
90
|
-
});
|
|
91
|
-
},
|
|
92
|
-
on
|
|
132
|
+
}
|
|
93
133
|
};
|
|
94
|
-
}, [
|
|
134
|
+
}, [results, notifications, clientRef]);
|
|
95
135
|
}
|
|
96
136
|
);
|
|
97
|
-
var
|
|
98
|
-
|
|
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
|
|
145
|
+
var DerivedClientAccessorResource = resource(
|
|
101
146
|
({
|
|
102
|
-
scopeName,
|
|
103
147
|
element,
|
|
104
|
-
|
|
148
|
+
clientRef
|
|
105
149
|
}) => {
|
|
106
|
-
const get = tapEffectEvent(element.props
|
|
107
|
-
const source = element.props.source;
|
|
108
|
-
const query = element.props.query;
|
|
150
|
+
const get = tapEffectEvent(() => element.props);
|
|
109
151
|
return tapMemo(() => {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
166
|
+
var DerivedClientsAccessorsResource = resource(
|
|
118
167
|
({
|
|
119
|
-
|
|
120
|
-
|
|
168
|
+
clients,
|
|
169
|
+
clientRef
|
|
121
170
|
}) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
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
|
-
|
|
147
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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":";AAAA,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AASP,SAAS,eAAe;AACxB,SAAS,gCAAgC;AACzC,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,SAAS,gCAAgC;AAMzC,IAAM,oBAAoB;AAAA,EACxB,CAAkC;AAAA,IAChC;AAAA,IACA;AAAA,EACF,MAGM;AACJ,UAAM,QAAQ,YAAY,QAAQ,OAAO,CAAC;AAE1C,WAAO,QAAQ,MAAM;AACnB,YAAM,iBAAiB,MAAM,MAAM,SAAS,EAAE;AAG9C,oBAAc,SAAS;AACvB,oBAAc,QAAQ,CAAC;AAEvB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAAA,EACvB;AACF;AAMA,IAAM,qBAAqB;AAAA,EACzB,CAAC,EAAE,QAAQ,OAAO,MAAwD;AACxE,UAAM,SAAS,kBAAkB,aAAa,CAAC;AAE/C,UAAM,gBAAgB;AAAA,MAAyB,EAAE,QAAQ,OAAO;AAAA,MAAG,MACjE;AAAA,QACE,OAAO,QAAQ,MAAM,EAAE;AAAA,UAAI,CAAC,CAAC,WAAW,OAAO,MAC7C;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YAGF;AAAA,YACA,EAAE,KAAK,UAAU;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,CACT,UACA,aACG;AACH,YAAM,EAAE,MAAM,IAAI,uBAAuB,QAAQ;AACjD,aAAO,OAAO,GAAG,OAAO,QAAQ;AAAA,IAClC;AAEA,WAAO,QAAQ,MAAM;AACnB,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,UACL,QAAQ,CAAC;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,UACb,cAAc,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM;AAAA,YACpD;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QAGA,WAAW,CAAC,aAAyB;AACnC,gBAAM,eAAe,cAAc,IAAI,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM;AAC5D,mBAAO,UAAU,MAAM;AACrB,sBAAQ,IAAI,qBAAqB;AACjC,uBAAS;AAAA,YACX,CAAC;AAAA,UACH,CAAC;AACD,iBAAO,MAAM;AACX,yBAAa,QAAQ,CAAC,gBAAgB,YAAY,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,QACA,WAAW,MAAM;AACf,wBAAc,QAAQ,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM;AAC3C,sBAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,QACA;AAAA,MACF;AAAA,IACF,GAAG,CAAC,GAAG,eAAe,MAAM,CAAC;AAAA,EAC/B;AACF;AAKO,IAAM,gBAAgB,CAC3B,YACA,WACG;AACH,SAAO,YAAY,mBAAmB,EAAE,QAAQ,YAAY,OAAO,CAAC,CAAC;AACvE;AAMA,IAAM,uBAAuB;AAAA,EAC3B,CAAkC;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAOM;AACJ,UAAM,MAAM,eAAe,QAAQ,MAAM,GAAG;AAC5C,UAAM,SAAS,QAAQ,MAAM;AAC7B,UAAM,QAAQ,QAAQ,MAAM;AAC5B,WAAO,QAAQ,MAAM;AACnB,YAAM,iBAAiB,MAAM,IAAI,YAAY;AAG7C,oBAAc,SAAS;AACvB,oBAAc,QAAQ;AAEtB,aAAO,CAAC,WAAW,aAAa;AAAA,IAClC,GAAG,CAAC,WAAW,KAAK,QAAQ,KAAK,UAAU,KAAK,GAAG,YAAY,CAAC;AAAA,EAClE;AACF;AAMA,IAAM,wBAAwB;AAAA,EAC5B,CAAC;AAAA,IACC;AAAA,IACA;AAAA,EACF,MAGM;AACJ,UAAM,gBAAgB;AAAA,MACpB,OAAO,QAAQ,MAAM,EAAE;AAAA,QAAI,CAAC,CAAC,WAAW,OAAO,MAC7C;AAAA,UACE;AAAA,YACE;AAAA,YACA;AAAA,YAGA;AAAA,UACF;AAAA,UACA,EAAE,KAAK,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM;AACnB,aAAO,OAAO,YAAY,aAAa;AAAA,IAGzC,GAAG,CAAC,GAAG,aAAa,CAAC;AAAA,EACvB;AACF;AAKO,IAAM,mBAAmB,CAC9B,eACA,iBACG;AACH,SAAO;AAAA,IACL,sBAAsB,EAAE,QAAQ,eAAe,aAAa,CAAC;AAAA,EAC/D;AACF;AAEA,IAAM,iCAAiC,CACrC,WACoB;AACpB,QAAM,aAAa,yBAAyB;AAC5C,QAAM,EAAE,YAAY,cAAc,IAAI,YAAY,MAAM;AAGxD,QAAM,aAAa,cAAc,YAAY,UAAU;AACvD,QAAM,gBAAgB,iBAAiB,eAAe,UAAU;AAEhE,SAAO,QAAQ,MAAM;AAGnB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,WAAW;AAAA,MACd,GAAG;AAAA,MACH,WAAW,WAAW,aAAa,WAAW;AAAA,MAC9C,WAAW,WAAW,aAAa,WAAW;AAAA,MAC9C,IAAI,WAAW,MAAM,WAAW;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,YAAY,YAAY,aAAa,CAAC;AAC5C;AAwBO,SAAS,mBAAmB,QAAuC;AACxE,MAAI,QAAQ;AAEV,WAAO,+BAA+B,MAAM;AAAA,EAC9C,OAAO;AAEL,WAAO,yBAAyB;AAAA,EAClC;AACF;","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 {
|
|
2
|
-
export declare const useAssistantEvent: <TEvent extends
|
|
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,
|
|
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 "./
|
|
4
|
+
import { normalizeEventSelector } from "./types/events.js";
|
|
5
5
|
var useAssistantEvent = (selector, callback) => {
|
|
6
|
-
const
|
|
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
|
|
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
|
|
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,
|
|
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 {
|
|
2
|
+
import { useSyncExternalStore, useDebugValue } from "react";
|
|
3
3
|
import { useAssistantClient } from "./useAssistantClient.js";
|
|
4
|
-
|
|
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
|
|
33
|
-
const proxiedState =
|
|
34
|
-
() => ProxiedAssistantState.create(client),
|
|
35
|
-
[client]
|
|
36
|
-
);
|
|
6
|
+
const aui = useAssistantClient();
|
|
7
|
+
const proxiedState = getProxiedAssistantState(aui);
|
|
37
8
|
const slice = useSyncExternalStore(
|
|
38
|
-
|
|
9
|
+
aui.subscribe,
|
|
39
10
|
() => selector(proxiedState),
|
|
40
11
|
() => selector(proxiedState)
|
|
41
12
|
);
|
|
42
|
-
|
|
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 {
|
|
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"}
|