@assistant-ui/store 0.0.2 → 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 +4 -6
- package/dist/AssistantIf.d.ts.map +1 -1
- package/dist/AssistantIf.js +1 -4
- package/dist/AssistantIf.js.map +1 -1
- 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 +10 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -13
- 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 -46
- package/dist/useAssistantClient.d.ts.map +1 -1
- package/dist/useAssistantClient.js +177 -137
- 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 +3 -3
- package/src/AssistantIf.tsx +3 -11
- package/src/Derived.ts +46 -0
- package/src/attachDefaultPeers.ts +78 -0
- package/src/index.ts +19 -22
- 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 +252 -234
- 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 -20
- 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 -61
- 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 -84
- 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 -23
- package/src/EventContext.ts +0 -187
- 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 -119
- package/src/utils/splitScopes.ts +0 -38
- /package/dist/{types.js.map → types/client.js.map} +0 -0
|
@@ -1,187 +1,227 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
// src/useAssistantClient.tsx
|
|
2
|
-
import { useMemo } from "react";
|
|
3
4
|
import { useResource } from "@assistant-ui/tap/react";
|
|
4
5
|
import {
|
|
5
6
|
resource,
|
|
6
7
|
tapMemo,
|
|
7
|
-
tapResource,
|
|
8
8
|
tapResources,
|
|
9
9
|
tapEffectEvent,
|
|
10
|
-
tapInlineResource
|
|
10
|
+
tapInlineResource,
|
|
11
|
+
tapEffect,
|
|
12
|
+
tapRef,
|
|
13
|
+
tapResource
|
|
11
14
|
} from "@assistant-ui/tap";
|
|
12
|
-
import {
|
|
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
37
|
element,
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
emit,
|
|
39
|
+
clientRef
|
|
25
40
|
}) => {
|
|
26
|
-
|
|
27
|
-
{
|
|
28
|
-
() =>
|
|
41
|
+
const { methods, state } = withAssistantTapContextProvider(
|
|
42
|
+
{ clientRef, emit },
|
|
43
|
+
() => tapClientResource(element)
|
|
29
44
|
);
|
|
45
|
+
return tapMemo(() => ({ methods }), [state]);
|
|
30
46
|
}
|
|
31
47
|
);
|
|
32
|
-
var
|
|
48
|
+
var RootClientAccessorResource = resource(
|
|
33
49
|
({
|
|
34
|
-
scopeName,
|
|
35
50
|
element,
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
notifications,
|
|
52
|
+
clientRef
|
|
38
53
|
}) => {
|
|
39
|
-
const store =
|
|
40
|
-
|
|
54
|
+
const store = tapInlineResource(
|
|
55
|
+
StoreResource(
|
|
56
|
+
RootClientResource({ element, emit: notifications.emit, clientRef })
|
|
57
|
+
)
|
|
41
58
|
);
|
|
59
|
+
tapEffect(() => {
|
|
60
|
+
return store.subscribe(notifications.notifySubscribers);
|
|
61
|
+
}, [store, notifications]);
|
|
42
62
|
return tapMemo(() => {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
scopeFunction,
|
|
50
|
-
subscribe: store.subscribe,
|
|
51
|
-
flushSync: store.flushSync
|
|
52
|
-
}
|
|
53
|
-
];
|
|
54
|
-
}, [scopeName, store]);
|
|
63
|
+
const clientFunction = () => store.getState().methods;
|
|
64
|
+
clientFunction.source = "root";
|
|
65
|
+
clientFunction.query = {};
|
|
66
|
+
return clientFunction;
|
|
67
|
+
}, [store]);
|
|
55
68
|
}
|
|
56
69
|
);
|
|
57
|
-
var
|
|
58
|
-
(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
var NoOpRootClientsAccessorsResource = resource(() => {
|
|
71
|
+
return tapMemo(
|
|
72
|
+
() => ({ clients: {}, subscribe: void 0, on: void 0 }),
|
|
73
|
+
[]
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
var RootClientsAccessorsResource = resource(
|
|
77
|
+
({
|
|
78
|
+
clients: inputClients,
|
|
79
|
+
clientRef
|
|
80
|
+
}) => {
|
|
81
|
+
const notifications = tapInlineResource(NotificationManager());
|
|
82
|
+
tapEffect(
|
|
83
|
+
() => clientRef.parent.subscribe(notifications.notifySubscribers),
|
|
84
|
+
[clientRef, notifications]
|
|
85
|
+
);
|
|
86
|
+
const results = tapResources(
|
|
87
|
+
inputClients,
|
|
88
|
+
(element) => RootClientAccessorResource({
|
|
89
|
+
element,
|
|
90
|
+
notifications,
|
|
91
|
+
clientRef
|
|
92
|
+
}),
|
|
93
|
+
[notifications, clientRef]
|
|
72
94
|
);
|
|
73
|
-
const on = (selector, callback) => {
|
|
74
|
-
const { event } = normalizeEventSelector(selector);
|
|
75
|
-
return events.on(event, callback);
|
|
76
|
-
};
|
|
77
95
|
return tapMemo(() => {
|
|
78
|
-
if (resultEntries.length === 0) {
|
|
79
|
-
return {
|
|
80
|
-
scopes: {},
|
|
81
|
-
on
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
96
|
return {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
clients: results,
|
|
98
|
+
subscribe: notifications.subscribe,
|
|
99
|
+
on: function(selector, callback) {
|
|
100
|
+
if (!this) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
"const { on } = useAssistantClient() is not supported. Use aui.on() instead."
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
const { scope, event } = normalizeEventSelector(selector);
|
|
106
|
+
if (scope !== "*") {
|
|
107
|
+
const source = this[scope].source;
|
|
108
|
+
if (source === null) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
`Scope "${scope}" is not available. Use { scope: "*", event: "${event}" } to listen globally.`
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const localUnsub = notifications.on(event, (payload, clientStack) => {
|
|
115
|
+
if (scope === "*") {
|
|
116
|
+
callback(payload);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const scopeClient = this[scope]();
|
|
120
|
+
const index = getClientIndex(scopeClient);
|
|
121
|
+
if (scopeClient === clientStack[index]) {
|
|
122
|
+
callback(payload);
|
|
123
|
+
}
|
|
97
124
|
});
|
|
125
|
+
if (scope !== "*" && clientRef.parent[scope].source === null)
|
|
126
|
+
return localUnsub;
|
|
127
|
+
const parentUnsub = clientRef.parent.on(selector, callback);
|
|
98
128
|
return () => {
|
|
99
|
-
|
|
129
|
+
localUnsub();
|
|
130
|
+
parentUnsub();
|
|
100
131
|
};
|
|
101
|
-
}
|
|
102
|
-
flushSync: () => {
|
|
103
|
-
resultEntries.forEach(([, { flushSync }]) => {
|
|
104
|
-
flushSync();
|
|
105
|
-
});
|
|
106
|
-
},
|
|
107
|
-
on
|
|
132
|
+
}
|
|
108
133
|
};
|
|
109
|
-
}, [
|
|
134
|
+
}, [results, notifications, clientRef]);
|
|
110
135
|
}
|
|
111
136
|
);
|
|
112
|
-
var
|
|
113
|
-
|
|
137
|
+
var getMeta = (props, clientRef, memo) => {
|
|
138
|
+
if ("source" in props && "query" in props) return props;
|
|
139
|
+
if (memo.dep === props) return memo.meta;
|
|
140
|
+
const meta = props.getMeta(clientRef.current);
|
|
141
|
+
memo.meta = meta;
|
|
142
|
+
memo.dep = props;
|
|
143
|
+
return meta;
|
|
114
144
|
};
|
|
115
|
-
var
|
|
145
|
+
var DerivedClientAccessorResource = resource(
|
|
116
146
|
({
|
|
117
|
-
scopeName,
|
|
118
147
|
element,
|
|
119
|
-
|
|
148
|
+
clientRef
|
|
120
149
|
}) => {
|
|
121
|
-
const get = tapEffectEvent(element.props
|
|
122
|
-
const source = element.props.source;
|
|
123
|
-
const query = element.props.query;
|
|
150
|
+
const get = tapEffectEvent(() => element.props);
|
|
124
151
|
return tapMemo(() => {
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
152
|
+
const clientFunction = () => get().get(clientRef.current);
|
|
153
|
+
const metaMemo = {};
|
|
154
|
+
Object.defineProperties(clientFunction, {
|
|
155
|
+
source: {
|
|
156
|
+
get: () => getMeta(get(), clientRef, metaMemo).source
|
|
157
|
+
},
|
|
158
|
+
query: {
|
|
159
|
+
get: () => getMeta(get(), clientRef, metaMemo).query
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return clientFunction;
|
|
163
|
+
}, [clientRef]);
|
|
130
164
|
}
|
|
131
165
|
);
|
|
132
|
-
var
|
|
166
|
+
var DerivedClientsAccessorsResource = resource(
|
|
133
167
|
({
|
|
134
|
-
|
|
135
|
-
|
|
168
|
+
clients,
|
|
169
|
+
clientRef
|
|
136
170
|
}) => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
},
|
|
145
|
-
{ key: scopeName }
|
|
146
|
-
)
|
|
147
|
-
)
|
|
171
|
+
return tapResources(
|
|
172
|
+
clients,
|
|
173
|
+
(element) => DerivedClientAccessorResource({
|
|
174
|
+
element,
|
|
175
|
+
clientRef
|
|
176
|
+
}),
|
|
177
|
+
[clientRef]
|
|
148
178
|
);
|
|
149
|
-
return tapMemo(() => {
|
|
150
|
-
return Object.fromEntries(resultEntries);
|
|
151
|
-
}, [...resultEntries]);
|
|
152
179
|
}
|
|
153
180
|
);
|
|
154
|
-
var
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
181
|
+
var AssistantClientResource = resource(
|
|
182
|
+
({
|
|
183
|
+
baseClient,
|
|
184
|
+
clients
|
|
185
|
+
}) => {
|
|
186
|
+
const { rootClients, derivedClients } = splitClients(clients, baseClient);
|
|
187
|
+
const clientRef = tapRef({
|
|
188
|
+
parent: baseClient,
|
|
189
|
+
current: null
|
|
190
|
+
}).current;
|
|
191
|
+
const rootFields = tapResource(
|
|
192
|
+
Object.keys(rootClients).length > 0 ? RootClientsAccessorsResource({ clients: rootClients, clientRef }) : NoOpRootClientsAccessorsResource()
|
|
193
|
+
);
|
|
194
|
+
const derivedFields = tapInlineResource(
|
|
195
|
+
DerivedClientsAccessorsResource({ clients: derivedClients, clientRef })
|
|
196
|
+
);
|
|
197
|
+
const client = tapMemo(() => {
|
|
198
|
+
const proto = baseClient === DefaultAssistantClient ? createRootAssistantClient() : baseClient;
|
|
199
|
+
const client2 = Object.create(proto);
|
|
200
|
+
Object.assign(client2, rootFields.clients, derivedFields, {
|
|
201
|
+
subscribe: rootFields.subscribe ?? baseClient.subscribe,
|
|
202
|
+
on: rootFields.on ?? baseClient.on,
|
|
203
|
+
[PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client2)
|
|
204
|
+
});
|
|
205
|
+
return client2;
|
|
206
|
+
}, [baseClient, rootFields, derivedFields]);
|
|
207
|
+
if (clientRef.current === null) {
|
|
208
|
+
clientRef.current = client;
|
|
209
|
+
}
|
|
210
|
+
tapEffect(() => {
|
|
211
|
+
clientRef.current = client;
|
|
212
|
+
});
|
|
213
|
+
return client;
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
function useAssistantClient(clients) {
|
|
160
217
|
const baseClient = useAssistantContextValue();
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const derivedFields = useDerivedScopes(derivedScopes, baseClient);
|
|
164
|
-
return useMemo(() => {
|
|
165
|
-
return {
|
|
166
|
-
...baseClient,
|
|
167
|
-
...rootFields.scopes,
|
|
168
|
-
...derivedFields,
|
|
169
|
-
subscribe: rootFields.subscribe ?? baseClient.subscribe,
|
|
170
|
-
flushSync: rootFields.flushSync ?? baseClient.flushSync,
|
|
171
|
-
on: rootFields.on ?? baseClient.on
|
|
172
|
-
};
|
|
173
|
-
}, [baseClient, rootFields, derivedFields]);
|
|
174
|
-
};
|
|
175
|
-
function useAssistantClient(scopes) {
|
|
176
|
-
if (scopes) {
|
|
177
|
-
return useExtendedAssistantClientImpl(scopes);
|
|
178
|
-
} else {
|
|
179
|
-
return useAssistantContextValue();
|
|
218
|
+
if (clients) {
|
|
219
|
+
return useResource(AssistantClientResource({ baseClient, clients }));
|
|
180
220
|
}
|
|
221
|
+
return baseClient;
|
|
181
222
|
}
|
|
182
223
|
export {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
useRootScopes
|
|
224
|
+
AssistantClientResource,
|
|
225
|
+
useAssistantClient
|
|
186
226
|
};
|
|
187
227
|
//# sourceMappingURL=useAssistantClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useAssistantClient.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport {\n resource,\n tapMemo,\n tapResource,\n tapResources,\n tapEffectEvent,\n tapInlineResource,\n ResourceElement,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n AssistantScopes,\n ScopesInput,\n ScopeField,\n ScopeInput,\n DerivedScopeProps,\n} from \"./types\";\nimport { asStore } from \"./asStore\";\nimport { useAssistantContextValue } from \"./AssistantContext\";\nimport { splitScopes } from \"./utils/splitScopes\";\nimport {\n EventManager,\n normalizeEventSelector,\n type AssistantEvent,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./EventContext\";\nimport { withStoreContextProvider } from \"./StoreContext\";\n\n/**\n * Resource that renders a store with the store context provider.\n * This ensures the context is re-established on every re-render.\n */\nconst RootScopeStoreResource = resource(\n <K extends keyof AssistantScopes>({\n element,\n events,\n parent,\n }: {\n element: ScopeInput<AssistantScopes[K]>;\n events: EventManager;\n parent: AssistantClient;\n }) => {\n return withStoreContextProvider({ events, parent }, () =>\n tapInlineResource(element),\n );\n },\n);\n\n/**\n * Resource for a single root scope\n * Returns a tuple of [scopeName, {scopeFunction, subscribe, flushSync}]\n */\nconst RootScopeResource = resource(\n <K extends keyof AssistantScopes>({\n scopeName,\n element,\n events,\n parent,\n }: {\n scopeName: K;\n element: ScopeInput<AssistantScopes[K]>;\n events: EventManager;\n parent: AssistantClient;\n }) => {\n const store = tapResource(\n asStore(RootScopeStoreResource({ element, events, parent })),\n );\n\n return tapMemo(() => {\n const scopeFunction = (() => store.getState().api) as ScopeField<\n AssistantScopes[K]\n >;\n scopeFunction.source = \"root\";\n scopeFunction.query = {};\n\n return [\n scopeName,\n {\n scopeFunction,\n subscribe: store.subscribe,\n flushSync: store.flushSync,\n },\n ] as const;\n }, [scopeName, store]);\n },\n);\n\n/**\n * Resource for all root scopes\n * Mounts each root scope and returns an object mapping scope names to their stores\n */\nconst RootScopesResource = resource(\n ({ scopes, parent }: { scopes: ScopesInput; parent: AssistantClient }) => {\n const events = tapInlineResource(EventManager());\n\n const resultEntries = tapResources(\n Object.entries(scopes).map(([scopeName, element]) =>\n RootScopeResource(\n {\n scopeName: scopeName as keyof AssistantScopes,\n element: element as ScopeInput<\n AssistantScopes[keyof AssistantScopes]\n >,\n events,\n parent,\n },\n { key: scopeName },\n ),\n ),\n );\n\n const on = <TEvent extends AssistantEvent>(\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) => {\n const { event } = normalizeEventSelector(selector);\n return events.on(event, callback);\n };\n\n return tapMemo(() => {\n if (resultEntries.length === 0) {\n return {\n scopes: {},\n on,\n };\n }\n\n return {\n scopes: Object.fromEntries(\n resultEntries.map(([scopeName, { scopeFunction }]) => [\n scopeName,\n scopeFunction,\n ]),\n ) as {\n [K in keyof typeof scopes]: ScopeField<AssistantScopes[K]>;\n },\n subscribe: (callback: () => void) => {\n const unsubscribes = resultEntries.map(([, { subscribe }]) => {\n return subscribe(() => {\n console.log(\"Callback called for\");\n callback();\n });\n });\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe());\n };\n },\n flushSync: () => {\n resultEntries.forEach(([, { flushSync }]) => {\n flushSync();\n });\n },\n on,\n };\n }, [...resultEntries, events]);\n },\n);\n\n/**\n * Hook to mount and access root scopes\n */\nexport const useRootScopes = (\n rootScopes: ScopesInput,\n parent: AssistantClient,\n) => {\n return useResource(RootScopesResource({ scopes: rootScopes, parent }));\n};\n\n/**\n * Resource for a single derived scope\n * Returns a tuple of [scopeName, scopeFunction] where scopeFunction has source and query\n */\nconst DerivedScopeResource = resource(\n <K extends keyof AssistantScopes>({\n scopeName,\n element,\n parentClient,\n }: {\n scopeName: K;\n element: ResourceElement<\n AssistantScopes[K],\n DerivedScopeProps<AssistantScopes[K]>\n >;\n parentClient: AssistantClient;\n }) => {\n const get = tapEffectEvent(element.props.get);\n const source = element.props.source;\n const query = element.props.query;\n return tapMemo(() => {\n const scopeFunction = (() => get(parentClient)) as ScopeField<\n AssistantScopes[K]\n >;\n scopeFunction.source = source;\n scopeFunction.query = query;\n\n return [scopeName, scopeFunction] as const;\n }, [scopeName, get, source, JSON.stringify(query), parentClient]);\n },\n);\n\n/**\n * Resource for all derived scopes\n * Builds stable scope functions with source and query metadata\n */\nconst DerivedScopesResource = resource(\n ({\n scopes,\n parentClient,\n }: {\n scopes: ScopesInput;\n parentClient: AssistantClient;\n }) => {\n const resultEntries = tapResources(\n Object.entries(scopes).map(([scopeName, element]) =>\n DerivedScopeResource(\n {\n scopeName: scopeName as keyof AssistantScopes,\n element: element as ScopeInput<\n AssistantScopes[keyof AssistantScopes]\n >,\n parentClient,\n },\n { key: scopeName },\n ),\n ),\n );\n\n return tapMemo(() => {\n return Object.fromEntries(resultEntries) as {\n [K in keyof typeof scopes]: ScopeField<AssistantScopes[K]>;\n };\n }, [...resultEntries]);\n },\n);\n\n/**\n * Hook to mount and access derived scopes\n */\nexport const useDerivedScopes = (\n derivedScopes: ScopesInput,\n parentClient: AssistantClient,\n) => {\n return useResource(\n DerivedScopesResource({ scopes: derivedScopes, parentClient }),\n );\n};\n\nconst useExtendedAssistantClientImpl = (\n scopes: ScopesInput,\n): AssistantClient => {\n const baseClient = useAssistantContextValue();\n const { rootScopes, derivedScopes } = splitScopes(scopes);\n\n // Mount the scopes to keep them alive\n const rootFields = useRootScopes(rootScopes, baseClient);\n const derivedFields = useDerivedScopes(derivedScopes, baseClient);\n\n return useMemo(() => {\n // Merge base client with extended client\n // If baseClient is the default proxy, spreading it will be a no-op\n return {\n ...baseClient,\n ...rootFields.scopes,\n ...derivedFields,\n subscribe: rootFields.subscribe ?? baseClient.subscribe,\n flushSync: rootFields.flushSync ?? baseClient.flushSync,\n on: rootFields.on ?? baseClient.on,\n } as AssistantClient;\n }, [baseClient, rootFields, derivedFields]);\n};\n\n/**\n * Hook to access or extend the AssistantClient\n *\n * @example Without config - returns the client from context:\n * ```typescript\n * const client = useAssistantClient();\n * const fooState = client.foo.getState();\n * ```\n *\n * @example With config - creates a new client with additional scopes:\n * ```typescript\n * const client = useAssistantClient({\n * message: DerivedScope({\n * source: \"thread\",\n * query: { type: \"index\", index: 0 },\n * get: () => messageApi,\n * }),\n * });\n * ```\n */\nexport function useAssistantClient(): AssistantClient;\nexport function useAssistantClient(scopes: ScopesInput): AssistantClient;\nexport function useAssistantClient(scopes?: ScopesInput): AssistantClient {\n if (scopes) {\n return useExtendedAssistantClientImpl(scopes);\n } else {\n return useAssistantContextValue();\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/useAssistantClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport {\n resource,\n tapMemo,\n tapResources,\n tapEffectEvent,\n tapInlineResource,\n tapEffect,\n tapRef,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n AssistantClientAccessor,\n ClientNames,\n ClientElement,\n ClientMeta,\n} from \"./types/client\";\nimport { Derived, DerivedElement } from \"./Derived\";\nimport { StoreResource } from \"./utils/StoreResource\";\nimport {\n useAssistantContextValue,\n DefaultAssistantClient,\n createRootAssistantClient,\n} from \"./utils/react-assistant-context\";\nimport {\n DerivedClients,\n RootClients,\n splitClients,\n} from \"./utils/splitClients\";\nimport {\n normalizeEventSelector,\n type AssistantEventName,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./types/events\";\nimport { NotificationManager } from \"./utils/NotificationManager\";\nimport { withAssistantTapContextProvider } from \"./utils/tap-assistant-context\";\nimport { tapClientResource } from \"./tapClientResource\";\nimport { getClientIndex } from \"./utils/tap-client-stack-context\";\nimport {\n PROXIED_ASSISTANT_STATE_SYMBOL,\n createProxiedAssistantState,\n} from \"./utils/proxied-assistant-state\";\n\nconst RootClientResource = resource(\n <K extends ClientNames>({\n element,\n emit,\n clientRef,\n }: {\n element: ClientElement<K>;\n emit: NotificationManager[\"emit\"];\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const { methods, state } = withAssistantTapContextProvider(\n { clientRef, emit },\n () => tapClientResource(element),\n );\n return tapMemo(() => ({ methods }), [state]);\n },\n);\n\nconst RootClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n notifications,\n clientRef,\n }: {\n element: ClientElement<K>;\n notifications: NotificationManager;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }): AssistantClientAccessor<K> => {\n const store = tapInlineResource(\n StoreResource(\n RootClientResource({ element, emit: notifications.emit, clientRef }),\n ),\n );\n\n tapEffect(() => {\n return store.subscribe(notifications.notifySubscribers);\n }, [store, notifications]);\n\n return tapMemo(() => {\n const clientFunction = () => store.getState().methods;\n clientFunction.source = \"root\" as const;\n clientFunction.query = {};\n return clientFunction;\n }, [store]);\n },\n);\n\nconst NoOpRootClientsAccessorsResource = resource(() => {\n return tapMemo(\n () => ({ clients: {}, subscribe: undefined, on: undefined }),\n [],\n );\n});\n\nconst RootClientsAccessorsResource = resource(\n ({\n clients: inputClients,\n clientRef,\n }: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const notifications = tapInlineResource(NotificationManager());\n\n tapEffect(\n () => clientRef.parent.subscribe(notifications.notifySubscribers),\n [clientRef, notifications],\n );\n\n const results = tapResources(\n inputClients,\n (element) =>\n RootClientAccessorResource({\n element: element!,\n notifications,\n clientRef,\n }),\n [notifications, clientRef],\n );\n\n return tapMemo(() => {\n return {\n clients: results,\n subscribe: notifications.subscribe,\n on: function <TEvent extends AssistantEventName>(\n this: AssistantClient,\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) {\n if (!this) {\n throw new Error(\n \"const { on } = useAssistantClient() is not supported. Use aui.on() instead.\",\n );\n }\n\n const { scope, event } = normalizeEventSelector(selector);\n\n if (scope !== \"*\") {\n const source = this[scope as ClientNames].source;\n if (source === null) {\n throw new Error(\n `Scope \"${scope}\" is not available. Use { scope: \"*\", event: \"${event}\" } to listen globally.`,\n );\n }\n }\n\n const localUnsub = notifications.on(event, (payload, clientStack) => {\n if (scope === \"*\") {\n callback(payload);\n return;\n }\n\n const scopeClient = this[scope as ClientNames]();\n const index = getClientIndex(scopeClient);\n if (scopeClient === clientStack[index]) {\n callback(payload);\n }\n });\n if (\n scope !== \"*\" &&\n clientRef.parent[scope as ClientNames].source === null\n )\n return localUnsub;\n\n const parentUnsub = clientRef.parent.on(selector, callback);\n\n return () => {\n localUnsub();\n parentUnsub();\n };\n },\n };\n }, [results, notifications, clientRef]);\n },\n);\n\ntype MetaMemo<K extends ClientNames> = {\n meta?: ClientMeta<K>;\n dep?: unknown;\n};\n\nconst getMeta = <K extends ClientNames>(\n props: Derived.Props<K>,\n clientRef: { parent: AssistantClient; current: AssistantClient | null },\n memo: MetaMemo<K>,\n): ClientMeta<K> => {\n if (\"source\" in props && \"query\" in props) return props;\n if (memo.dep === props) return memo.meta!;\n const meta = props.getMeta(clientRef.current!);\n memo.meta = meta;\n memo.dep = props;\n return meta;\n};\n\nconst DerivedClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n clientRef,\n }: {\n element: DerivedElement<K>;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const get = tapEffectEvent(() => element.props);\n\n return tapMemo(() => {\n const clientFunction = () => get().get(clientRef.current!);\n const metaMemo = {};\n Object.defineProperties(clientFunction, {\n source: {\n get: () => getMeta(get(), clientRef, metaMemo).source,\n },\n query: {\n get: () => getMeta(get(), clientRef, metaMemo).query,\n },\n });\n return clientFunction;\n }, [clientRef]);\n },\n);\n\nconst DerivedClientsAccessorsResource = resource(\n ({\n clients,\n clientRef,\n }: {\n clients: DerivedClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n return tapResources(\n clients,\n (element) =>\n DerivedClientAccessorResource({\n element: element!,\n clientRef,\n }),\n [clientRef],\n );\n },\n);\n\n/**\n * Resource that creates an extended AssistantClient.\n */\nexport const AssistantClientResource = resource(\n ({\n baseClient,\n clients,\n }: {\n baseClient: AssistantClient;\n clients: useAssistantClient.Props;\n }): AssistantClient => {\n const { rootClients, derivedClients } = splitClients(clients, baseClient);\n\n const clientRef = tapRef({\n parent: baseClient,\n current: null as AssistantClient | null,\n }).current;\n\n const rootFields = tapResource(\n Object.keys(rootClients).length > 0\n ? RootClientsAccessorsResource({ clients: rootClients, clientRef })\n : NoOpRootClientsAccessorsResource(),\n );\n\n const derivedFields = tapInlineResource(\n DerivedClientsAccessorsResource({ clients: derivedClients, clientRef }),\n );\n\n const client = tapMemo(() => {\n // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message\n const proto =\n baseClient === DefaultAssistantClient\n ? createRootAssistantClient()\n : baseClient;\n const client = Object.create(proto) as AssistantClient;\n Object.assign(client, rootFields.clients, derivedFields, {\n subscribe: rootFields.subscribe ?? baseClient.subscribe,\n on: rootFields.on ?? baseClient.on,\n [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client),\n });\n return client;\n }, [baseClient, rootFields, derivedFields]);\n\n if (clientRef.current === null) {\n clientRef.current = client;\n }\n\n tapEffect(() => {\n clientRef.current = client;\n });\n\n return client;\n },\n);\n\nexport namespace useAssistantClient {\n export type Props = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n };\n}\n\nexport function useAssistantClient(): AssistantClient;\nexport function useAssistantClient(\n clients: useAssistantClient.Props,\n): AssistantClient;\nexport function useAssistantClient(\n clients?: useAssistantClient.Props,\n): AssistantClient {\n const baseClient = useAssistantContextValue();\n if (clients) {\n return useResource(AssistantClientResource({ baseClient, clients }));\n }\n return baseClient;\n}\n"],"mappings":";;;AAEA,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAGE;AAAA,OACK;AACP;AAAA,EACE;AAAA,OAIK;AACP,SAAS,2BAA2B;AACpC,SAAS,uCAAuC;AAChD,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,IAAM,qBAAqB;AAAA,EACzB,CAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,UAAM,EAAE,SAAS,MAAM,IAAI;AAAA,MACzB,EAAE,WAAW,KAAK;AAAA,MAClB,MAAM,kBAAkB,OAAO;AAAA,IACjC;AACA,WAAO,QAAQ,OAAO,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC;AAAA,EAC7C;AACF;AAEA,IAAM,6BAA6B;AAAA,EACjC,CAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIkC;AAChC,UAAM,QAAQ;AAAA,MACZ;AAAA,QACE,mBAAmB,EAAE,SAAS,MAAM,cAAc,MAAM,UAAU,CAAC;AAAA,MACrE;AAAA,IACF;AAEA,cAAU,MAAM;AACd,aAAO,MAAM,UAAU,cAAc,iBAAiB;AAAA,IACxD,GAAG,CAAC,OAAO,aAAa,CAAC;AAEzB,WAAO,QAAQ,MAAM;AACnB,YAAM,iBAAiB,MAAM,MAAM,SAAS,EAAE;AAC9C,qBAAe,SAAS;AACxB,qBAAe,QAAQ,CAAC;AACxB,aAAO;AAAA,IACT,GAAG,CAAC,KAAK,CAAC;AAAA,EACZ;AACF;AAEA,IAAM,mCAAmC,SAAS,MAAM;AACtD,SAAO;AAAA,IACL,OAAO,EAAE,SAAS,CAAC,GAAG,WAAW,QAAW,IAAI,OAAU;AAAA,IAC1D,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAM,+BAA+B;AAAA,EACnC,CAAC;AAAA,IACC,SAAS;AAAA,IACT;AAAA,EACF,MAGM;AACJ,UAAM,gBAAgB,kBAAkB,oBAAoB,CAAC;AAE7D;AAAA,MACE,MAAM,UAAU,OAAO,UAAU,cAAc,iBAAiB;AAAA,MAChE,CAAC,WAAW,aAAa;AAAA,IAC3B;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA,CAAC,YACC,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACH,CAAC,eAAe,SAAS;AAAA,IAC3B;AAEA,WAAO,QAAQ,MAAM;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,cAAc;AAAA,QACzB,IAAI,SAEF,UACA,UACA;AACA,cAAI,CAAC,MAAM;AACT,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AAExD,cAAI,UAAU,KAAK;AACjB,kBAAM,SAAS,KAAK,KAAoB,EAAE;AAC1C,gBAAI,WAAW,MAAM;AACnB,oBAAM,IAAI;AAAA,gBACR,UAAU,KAAK,iDAAiD,KAAK;AAAA,cACvE;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,aAAa,cAAc,GAAG,OAAO,CAAC,SAAS,gBAAgB;AACnE,gBAAI,UAAU,KAAK;AACjB,uBAAS,OAAO;AAChB;AAAA,YACF;AAEA,kBAAM,cAAc,KAAK,KAAoB,EAAE;AAC/C,kBAAM,QAAQ,eAAe,WAAW;AACxC,gBAAI,gBAAgB,YAAY,KAAK,GAAG;AACtC,uBAAS,OAAO;AAAA,YAClB;AAAA,UACF,CAAC;AACD,cACE,UAAU,OACV,UAAU,OAAO,KAAoB,EAAE,WAAW;AAElD,mBAAO;AAET,gBAAM,cAAc,UAAU,OAAO,GAAG,UAAU,QAAQ;AAE1D,iBAAO,MAAM;AACX,uBAAW;AACX,wBAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,CAAC,SAAS,eAAe,SAAS,CAAC;AAAA,EACxC;AACF;AAOA,IAAM,UAAU,CACd,OACA,WACA,SACkB;AAClB,MAAI,YAAY,SAAS,WAAW,MAAO,QAAO;AAClD,MAAI,KAAK,QAAQ,MAAO,QAAO,KAAK;AACpC,QAAM,OAAO,MAAM,QAAQ,UAAU,OAAQ;AAC7C,OAAK,OAAO;AACZ,OAAK,MAAM;AACX,SAAO;AACT;AAEA,IAAM,gCAAgC;AAAA,EACpC,CAAwB;AAAA,IACtB;AAAA,IACA;AAAA,EACF,MAGM;AACJ,UAAM,MAAM,eAAe,MAAM,QAAQ,KAAK;AAE9C,WAAO,QAAQ,MAAM;AACnB,YAAM,iBAAiB,MAAM,IAAI,EAAE,IAAI,UAAU,OAAQ;AACzD,YAAM,WAAW,CAAC;AAClB,aAAO,iBAAiB,gBAAgB;AAAA,QACtC,QAAQ;AAAA,UACN,KAAK,MAAM,QAAQ,IAAI,GAAG,WAAW,QAAQ,EAAE;AAAA,QACjD;AAAA,QACA,OAAO;AAAA,UACL,KAAK,MAAM,QAAQ,IAAI,GAAG,WAAW,QAAQ,EAAE;AAAA,QACjD;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,GAAG,CAAC,SAAS,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,kCAAkC;AAAA,EACtC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,EACF,MAGM;AACJ,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YACC,8BAA8B;AAAA,QAC5B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACH,CAAC,SAAS;AAAA,IACZ;AAAA,EACF;AACF;AAKO,IAAM,0BAA0B;AAAA,EACrC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,EACF,MAGuB;AACrB,UAAM,EAAE,aAAa,eAAe,IAAI,aAAa,SAAS,UAAU;AAExE,UAAM,YAAY,OAAO;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC,EAAE;AAEH,UAAM,aAAa;AAAA,MACjB,OAAO,KAAK,WAAW,EAAE,SAAS,IAC9B,6BAA6B,EAAE,SAAS,aAAa,UAAU,CAAC,IAChE,iCAAiC;AAAA,IACvC;AAEA,UAAM,gBAAgB;AAAA,MACpB,gCAAgC,EAAE,SAAS,gBAAgB,UAAU,CAAC;AAAA,IACxE;AAEA,UAAM,SAAS,QAAQ,MAAM;AAE3B,YAAM,QACJ,eAAe,yBACX,0BAA0B,IAC1B;AACN,YAAMA,UAAS,OAAO,OAAO,KAAK;AAClC,aAAO,OAAOA,SAAQ,WAAW,SAAS,eAAe;AAAA,QACvD,WAAW,WAAW,aAAa,WAAW;AAAA,QAC9C,IAAI,WAAW,MAAM,WAAW;AAAA,QAChC,CAAC,8BAA8B,GAAG,4BAA4BA,OAAM;AAAA,MACtE,CAAC;AACD,aAAOA;AAAA,IACT,GAAG,CAAC,YAAY,YAAY,aAAa,CAAC;AAE1C,QAAI,UAAU,YAAY,MAAM;AAC9B,gBAAU,UAAU;AAAA,IACtB;AAEA,cAAU,MAAM;AACd,gBAAU,UAAU;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAYO,SAAS,mBACd,SACiB;AACjB,QAAM,aAAa,yBAAyB;AAC5C,MAAI,SAAS;AACX,WAAO,YAAY,wBAAwB,EAAE,YAAY,QAAQ,CAAC,CAAC;AAAA,EACrE;AACA,SAAO;AACT;","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":[]}
|