@assistant-ui/react 0.11.4 → 0.11.6
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/dist/client/AssistantClient.d.ts +2 -2
- package/dist/client/AssistantClient.d.ts.map +1 -1
- package/dist/client/AssistantClient.js +1 -2
- package/dist/client/AssistantClient.js.map +1 -1
- package/dist/client/ToolUIClient.d.ts +3 -2
- package/dist/client/ToolUIClient.d.ts.map +1 -1
- package/dist/client/ToolUIClient.js +1 -5
- package/dist/client/ToolUIClient.js.map +1 -1
- package/dist/client/types/ThreadList.d.ts +1 -1
- package/dist/client/types/ThreadList.d.ts.map +1 -1
- package/dist/context/providers/AttachmentProvider.js +3 -3
- package/dist/context/providers/AttachmentProvider.js.map +1 -1
- package/dist/context/providers/MessageProvider.d.ts.map +1 -1
- package/dist/context/providers/MessageProvider.js +2 -2
- package/dist/context/providers/MessageProvider.js.map +1 -1
- package/dist/context/providers/PartProvider.js +2 -2
- package/dist/context/providers/PartProvider.js.map +1 -1
- package/dist/context/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/context/providers/TextMessagePartProvider.js +6 -7
- package/dist/context/providers/TextMessagePartProvider.js.map +1 -1
- package/dist/context/providers/ThreadListItemProvider.d.ts.map +1 -1
- package/dist/context/providers/ThreadListItemProvider.js +5 -4
- package/dist/context/providers/ThreadListItemProvider.js.map +1 -1
- package/dist/context/react/AssistantApiContext.d.ts +3 -3
- package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
- package/dist/context/react/AssistantApiContext.js +4 -3
- package/dist/context/react/AssistantApiContext.js.map +1 -1
- package/dist/context/react/hooks/useAssistantEvent.d.ts +2 -2
- package/dist/context/react/hooks/useAssistantEvent.d.ts.map +1 -1
- package/dist/context/react/hooks/useAssistantEvent.js.map +1 -1
- package/dist/context/react/index.d.ts +1 -0
- package/dist/context/react/index.d.ts.map +1 -1
- package/dist/context/react/index.js +2 -0
- package/dist/context/react/index.js.map +1 -1
- package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -5
- package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
- package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts +2 -4
- package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/AttachmentRuntimeClient.js +10 -10
- package/dist/legacy-runtime/client/AttachmentRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +3 -2
- package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/ComposerRuntimeClient.js +1 -5
- package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +6 -7
- package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/EventManagerRuntimeClient.js +11 -3
- package/dist/legacy-runtime/client/EventManagerRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/MessagePartRuntimeClient.js +10 -10
- package/dist/legacy-runtime/client/MessagePartRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts +3 -3
- package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/MessageRuntimeClient.js +31 -31
- package/dist/legacy-runtime/client/MessageRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts +2 -2
- package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js +17 -17
- package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +3 -2
- package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/ThreadListRuntimeClient.js +2 -6
- package/dist/legacy-runtime/client/ThreadListRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts +3 -2
- package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts.map +1 -1
- package/dist/legacy-runtime/client/ThreadRuntimeClient.js +1 -5
- package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js +0 -1
- package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js.map +1 -1
- package/dist/types/EventTypes.d.ts +15 -7
- package/dist/types/EventTypes.d.ts.map +1 -1
- package/dist/types/EventTypes.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/tap-store/tap-api.d.ts +9 -1
- package/dist/utils/tap-store/tap-api.d.ts.map +1 -1
- package/dist/utils/tap-store/tap-api.js +12 -2
- package/dist/utils/tap-store/tap-api.js.map +1 -1
- package/package.json +1 -1
- package/src/client/AssistantClient.ts +7 -13
- package/src/client/ToolUIClient.ts +1 -6
- package/src/client/types/ThreadList.ts +1 -1
- package/src/context/providers/AttachmentProvider.tsx +3 -3
- package/src/context/providers/MessageProvider.tsx +3 -8
- package/src/context/providers/PartProvider.tsx +2 -2
- package/src/context/providers/TextMessagePartProvider.tsx +5 -7
- package/src/context/providers/ThreadListItemProvider.tsx +9 -16
- package/src/context/react/AssistantApiContext.tsx +11 -5
- package/src/context/react/hooks/useAssistantEvent.ts +4 -3
- package/src/context/react/index.ts +2 -0
- package/src/legacy-runtime/AssistantRuntimeProvider.tsx +1 -15
- package/src/legacy-runtime/client/AttachmentRuntimeClient.ts +10 -11
- package/src/legacy-runtime/client/ComposerRuntimeClient.ts +1 -6
- package/src/legacy-runtime/client/EventManagerRuntimeClient.ts +41 -18
- package/src/legacy-runtime/client/MessagePartRuntimeClient.ts +13 -14
- package/src/legacy-runtime/client/MessageRuntimeClient.ts +35 -36
- package/src/legacy-runtime/client/ThreadListItemRuntimeClient.ts +17 -18
- package/src/legacy-runtime/client/ThreadListRuntimeClient.ts +2 -7
- package/src/legacy-runtime/client/ThreadRuntimeClient.ts +1 -6
- package/src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx +0 -1
- package/src/types/EventTypes.ts +23 -12
- package/src/types/index.ts +3 -1
- package/src/utils/tap-store/tap-api.ts +19 -2
@@ -1,12 +1,10 @@
|
|
1
1
|
"use client";
|
2
2
|
|
3
3
|
import { FC, memo, PropsWithChildren } from "react";
|
4
|
-
import {
|
4
|
+
import { AssistantProvider } from "../context/react/AssistantApiContext";
|
5
5
|
import { AssistantRuntime } from "./runtime/AssistantRuntime";
|
6
6
|
import { AssistantRuntimeCore } from "./runtime-cores/core/AssistantRuntimeCore";
|
7
7
|
import { useAssistantClient } from "../client/AssistantClient";
|
8
|
-
|
9
|
-
import { ThreadViewportProvider } from "../context/providers/ThreadViewportProvider";
|
10
8
|
import { ThreadListClient } from "./client/ThreadListRuntimeClient";
|
11
9
|
|
12
10
|
export namespace AssistantProvider {
|
@@ -46,15 +44,3 @@ export const AssistantRuntimeProviderImpl: FC<AssistantProvider.Props> = ({
|
|
46
44
|
};
|
47
45
|
|
48
46
|
export const AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
49
|
-
|
50
|
-
const AssistantProvider: FC<
|
51
|
-
PropsWithChildren<{ api: ReturnType<typeof useAssistantClient> }>
|
52
|
-
> = ({ children, api }) => {
|
53
|
-
return (
|
54
|
-
<AssistantApiProvider api={api}>
|
55
|
-
{/* TODO temporarily allow accessing viewport state from outside the viewport */}
|
56
|
-
{/* TODO figure out if this behavior should be deprecated, since it is quite hacky */}
|
57
|
-
<ThreadViewportProvider>{children}</ThreadViewportProvider>
|
58
|
-
</AssistantApiProvider>
|
59
|
-
);
|
60
|
-
};
|
@@ -7,16 +7,15 @@ import { tapSubscribable } from "../util-hooks/tapSubscribable";
|
|
7
7
|
export const AttachmentRuntimeClient = resource(
|
8
8
|
({ runtime }: { runtime: AttachmentRuntime }) => {
|
9
9
|
const state = tapSubscribable(runtime);
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
};
|
10
|
+
return tapApi<AttachmentClientApi>(
|
11
|
+
{
|
12
|
+
getState: () => state,
|
13
|
+
remove: runtime.remove,
|
14
|
+
__internal_getRuntime: () => runtime,
|
15
|
+
},
|
16
|
+
{
|
17
|
+
key: state.id,
|
18
|
+
},
|
19
|
+
);
|
21
20
|
},
|
22
21
|
);
|
@@ -98,7 +98,7 @@ export const ComposerClient = resource(
|
|
98
98
|
};
|
99
99
|
}, [runtimeState, attachments.state]);
|
100
100
|
|
101
|
-
|
101
|
+
return tapApi<ComposerClientApi>({
|
102
102
|
getState: () => state,
|
103
103
|
|
104
104
|
setText: runtime.setText,
|
@@ -126,10 +126,5 @@ export const ComposerClient = resource(
|
|
126
126
|
|
127
127
|
__internal_getRuntime: () => runtime,
|
128
128
|
});
|
129
|
-
|
130
|
-
return {
|
131
|
-
state,
|
132
|
-
api,
|
133
|
-
};
|
134
129
|
},
|
135
130
|
);
|
@@ -1,30 +1,41 @@
|
|
1
1
|
import { resource, tapMemo } from "@assistant-ui/tap";
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
import { Unsubscribe } from "../../types/Unsubscribe";
|
3
|
+
import {
|
4
|
+
AssistantEventMap,
|
5
|
+
AssistantEvent,
|
6
|
+
AssistantEventCallback,
|
7
|
+
} from "../../types/EventTypes";
|
7
8
|
|
8
9
|
export type EventManager = {
|
9
|
-
on<TEvent extends
|
10
|
+
on<TEvent extends AssistantEvent>(
|
10
11
|
event: TEvent,
|
11
|
-
callback:
|
12
|
+
callback: AssistantEventCallback<TEvent>,
|
12
13
|
): Unsubscribe;
|
13
|
-
emit<TEvent extends
|
14
|
+
emit<TEvent extends Exclude<AssistantEvent, "*">>(
|
14
15
|
event: TEvent,
|
15
|
-
payload:
|
16
|
+
payload: AssistantEventMap[TEvent],
|
17
|
+
): void;
|
18
|
+
};
|
19
|
+
|
20
|
+
type ListenerMap = Omit<
|
21
|
+
Map<AssistantEvent, Set<AssistantEventCallback<AssistantEvent>>>,
|
22
|
+
"get" | "set"
|
23
|
+
> & {
|
24
|
+
get<TEvent extends AssistantEvent>(
|
25
|
+
event: TEvent,
|
26
|
+
): Set<AssistantEventCallback<TEvent>> | undefined;
|
27
|
+
set<TEvent extends AssistantEvent>(
|
28
|
+
event: TEvent,
|
29
|
+
value: Set<AssistantEventCallback<TEvent>>,
|
16
30
|
): void;
|
17
31
|
};
|
18
32
|
|
19
33
|
export const EventManager = resource(() => {
|
20
34
|
const events = tapMemo(() => {
|
21
|
-
const listeners = new Map
|
35
|
+
const listeners: ListenerMap = new Map();
|
22
36
|
|
23
37
|
return {
|
24
|
-
on:
|
25
|
-
event: TEvent,
|
26
|
-
callback: EventCallback<TEvent>,
|
27
|
-
): Unsubscribe => {
|
38
|
+
on: (event, callback) => {
|
28
39
|
if (!listeners.has(event)) {
|
29
40
|
listeners.set(event, new Set());
|
30
41
|
}
|
@@ -40,14 +51,26 @@ export const EventManager = resource(() => {
|
|
40
51
|
};
|
41
52
|
},
|
42
53
|
|
43
|
-
emit: (event
|
54
|
+
emit: (event, payload) => {
|
44
55
|
const eventListeners = listeners.get(event);
|
45
|
-
|
56
|
+
const wildcardListeners = listeners.get("*");
|
57
|
+
|
58
|
+
if (!eventListeners && !wildcardListeners) return;
|
46
59
|
|
47
60
|
// make sure state updates flush
|
48
61
|
queueMicrotask(() => {
|
49
|
-
|
50
|
-
|
62
|
+
// Emit to specific event listeners
|
63
|
+
if (eventListeners) {
|
64
|
+
for (const callback of eventListeners) {
|
65
|
+
callback(payload);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
// Emit to wildcard listeners
|
70
|
+
if (wildcardListeners) {
|
71
|
+
for (const callback of wildcardListeners) {
|
72
|
+
callback({ event, payload });
|
73
|
+
}
|
51
74
|
}
|
52
75
|
});
|
53
76
|
},
|
@@ -7,21 +7,20 @@ export const MessagePartClient = resource(
|
|
7
7
|
({ runtime }: { runtime: MessagePartRuntime }) => {
|
8
8
|
const runtimeState = tapSubscribable(runtime);
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
return tapApi<MessagePartClientApi>(
|
11
|
+
{
|
12
|
+
getState: () => runtimeState,
|
12
13
|
|
13
|
-
|
14
|
+
addToolResult: (result) => runtime.addToolResult(result),
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
api,
|
25
|
-
};
|
16
|
+
__internal_getRuntime: () => runtime,
|
17
|
+
},
|
18
|
+
{
|
19
|
+
key:
|
20
|
+
runtimeState.type === "tool-call"
|
21
|
+
? "toolCallId-" + runtimeState.toolCallId
|
22
|
+
: undefined,
|
23
|
+
},
|
24
|
+
);
|
26
25
|
},
|
27
26
|
);
|
@@ -99,44 +99,43 @@ export const MessageClient = resource(
|
|
99
99
|
isHoveringState,
|
100
100
|
]);
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
attachment: (selector) => {
|
123
|
-
if ("id" in selector) {
|
124
|
-
return attachments.api({ key: selector.id });
|
125
|
-
} else {
|
126
|
-
return attachments.api(selector);
|
127
|
-
}
|
128
|
-
},
|
102
|
+
return tapApi<MessageClientApi>(
|
103
|
+
{
|
104
|
+
getState: () => state,
|
105
|
+
|
106
|
+
composer: composer.api,
|
107
|
+
|
108
|
+
reload: (config) => runtime.reload(config),
|
109
|
+
speak: () => runtime.speak(),
|
110
|
+
stopSpeaking: () => runtime.stopSpeaking(),
|
111
|
+
submitFeedback: (feedback) => runtime.submitFeedback(feedback),
|
112
|
+
switchToBranch: (options) => runtime.switchToBranch(options),
|
113
|
+
getCopyText: () => runtime.unstable_getCopyText(),
|
114
|
+
|
115
|
+
part: (selector) => {
|
116
|
+
if ("index" in selector) {
|
117
|
+
return parts.api({ index: selector.index });
|
118
|
+
} else {
|
119
|
+
return parts.api({ key: "toolCallId-" + selector.toolCallId });
|
120
|
+
}
|
121
|
+
},
|
129
122
|
|
130
|
-
|
131
|
-
|
123
|
+
attachment: (selector) => {
|
124
|
+
if ("id" in selector) {
|
125
|
+
return attachments.api({ key: selector.id });
|
126
|
+
} else {
|
127
|
+
return attachments.api(selector);
|
128
|
+
}
|
129
|
+
},
|
132
130
|
|
133
|
-
|
134
|
-
|
131
|
+
setIsCopied,
|
132
|
+
setIsHovering,
|
135
133
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
134
|
+
__internal_getRuntime: () => runtime,
|
135
|
+
},
|
136
|
+
{
|
137
|
+
key: runtimeState.id,
|
138
|
+
},
|
139
|
+
);
|
141
140
|
},
|
142
141
|
);
|
@@ -38,23 +38,22 @@ export const ThreadListItemClient = resource(
|
|
38
38
|
};
|
39
39
|
}, [runtime, events]);
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
};
|
41
|
+
return tapApi<ThreadListItemClientApi>(
|
42
|
+
{
|
43
|
+
getState: () => runtimeState,
|
44
|
+
switchTo: runtime.switchTo,
|
45
|
+
rename: runtime.rename,
|
46
|
+
archive: runtime.archive,
|
47
|
+
unarchive: runtime.unarchive,
|
48
|
+
delete: runtime.delete,
|
49
|
+
generateTitle: runtime.generateTitle,
|
50
|
+
initialize: runtime.initialize,
|
51
|
+
detach: runtime.detach,
|
52
|
+
__internal_getRuntime: () => runtime,
|
53
|
+
},
|
54
|
+
{
|
55
|
+
key: runtimeState.id,
|
56
|
+
},
|
57
|
+
);
|
59
58
|
},
|
60
59
|
);
|
@@ -43,7 +43,7 @@ export const ThreadListClient = resource(
|
|
43
43
|
const state = tapMemo<ThreadListClientState>(() => {
|
44
44
|
return {
|
45
45
|
mainThreadId: runtimeState.mainThreadId,
|
46
|
-
newThreadId: runtimeState.newThread,
|
46
|
+
newThreadId: runtimeState.newThread ?? null,
|
47
47
|
isLoading: runtimeState.isLoading,
|
48
48
|
threadIds: runtimeState.threads,
|
49
49
|
archivedThreadIds: runtimeState.archivedThreads,
|
@@ -53,7 +53,7 @@ export const ThreadListClient = resource(
|
|
53
53
|
};
|
54
54
|
}, [runtimeState, threadItems.state, main.state]);
|
55
55
|
|
56
|
-
|
56
|
+
return tapApi<ThreadListClientApi>({
|
57
57
|
getState: () => state,
|
58
58
|
|
59
59
|
thread: () => main.api,
|
@@ -81,10 +81,5 @@ export const ThreadListClient = resource(
|
|
81
81
|
runtime.switchToNewThread();
|
82
82
|
},
|
83
83
|
});
|
84
|
-
|
85
|
-
return {
|
86
|
-
state,
|
87
|
-
api,
|
88
|
-
};
|
89
84
|
},
|
90
85
|
);
|
@@ -111,7 +111,7 @@ export const ThreadClient = resource(
|
|
111
111
|
};
|
112
112
|
}, [runtimeState, messages, composer.state]);
|
113
113
|
|
114
|
-
|
114
|
+
return tapApi<ThreadClientApi>({
|
115
115
|
getState: () => state,
|
116
116
|
|
117
117
|
composer: composer.api,
|
@@ -136,10 +136,5 @@ export const ThreadClient = resource(
|
|
136
136
|
|
137
137
|
__internal_getRuntime: () => runtime,
|
138
138
|
});
|
139
|
-
|
140
|
-
return {
|
141
|
-
state,
|
142
|
-
api,
|
143
|
-
};
|
144
139
|
},
|
145
140
|
);
|
package/src/types/EventTypes.ts
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
export type EventSource<
|
2
|
-
T extends
|
3
|
-
> = T extends `${infer Source}.${string}` ? Source : never;
|
1
|
+
export type EventSource<T extends AssistantEvent = AssistantEvent> =
|
2
|
+
T extends `${infer Source}.${string}` ? Source : never;
|
4
3
|
|
5
4
|
type ScopeConfig = {
|
6
5
|
composer: "thread" | "message";
|
@@ -8,28 +7,28 @@ type ScopeConfig = {
|
|
8
7
|
"thread-list-item": never;
|
9
8
|
};
|
10
9
|
|
11
|
-
export type SourceByScope<
|
12
|
-
TScope extends AssistantEventScope<keyof AssistantEvents>,
|
13
|
-
> =
|
10
|
+
export type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> =
|
14
11
|
| (TScope extends "*" ? EventSource : never)
|
15
12
|
| (TScope extends keyof ScopeConfig ? TScope : never)
|
16
13
|
| {
|
17
14
|
[K in keyof ScopeConfig]: TScope extends ScopeConfig[K] ? K : never;
|
18
15
|
}[keyof ScopeConfig];
|
19
16
|
|
20
|
-
export type AssistantEventScope<TEvent extends
|
17
|
+
export type AssistantEventScope<TEvent extends AssistantEvent> =
|
21
18
|
| "*"
|
22
19
|
| EventSource<TEvent>
|
23
20
|
| ScopeConfig[EventSource<TEvent>];
|
24
21
|
|
25
|
-
export type AssistantEventSelector<TEvent extends
|
22
|
+
export type AssistantEventSelector<TEvent extends AssistantEvent> =
|
26
23
|
| TEvent
|
27
24
|
| {
|
28
25
|
scope: AssistantEventScope<TEvent>;
|
29
26
|
event: TEvent;
|
30
27
|
};
|
31
28
|
|
32
|
-
export type
|
29
|
+
export type AssistantEvent = keyof AssistantEventMap;
|
30
|
+
|
31
|
+
export type AssistantEventMap = {
|
33
32
|
// Thread events (from ThreadRuntimeEventType)
|
34
33
|
"thread.run-start": {
|
35
34
|
threadId: string;
|
@@ -61,9 +60,17 @@ export type AssistantEvents = {
|
|
61
60
|
"thread-list-item.switched-away": {
|
62
61
|
threadId: string;
|
63
62
|
};
|
63
|
+
|
64
|
+
// Catch-all
|
65
|
+
"*": {
|
66
|
+
[K in Exclude<keyof AssistantEventMap, "*">]: {
|
67
|
+
event: K;
|
68
|
+
payload: AssistantEventMap[K];
|
69
|
+
};
|
70
|
+
}[Exclude<keyof AssistantEventMap, "*">];
|
64
71
|
};
|
65
72
|
|
66
|
-
export const normalizeEventSelector = <TEvent extends
|
73
|
+
export const normalizeEventSelector = <TEvent extends AssistantEvent>(
|
67
74
|
selector: AssistantEventSelector<TEvent>,
|
68
75
|
) => {
|
69
76
|
if (typeof selector === "string") {
|
@@ -81,8 +88,8 @@ export const normalizeEventSelector = <TEvent extends keyof AssistantEvents>(
|
|
81
88
|
};
|
82
89
|
|
83
90
|
export const checkEventScope = <
|
84
|
-
TEvent extends
|
85
|
-
TExpectedScope extends AssistantEventScope<
|
91
|
+
TEvent extends AssistantEvent,
|
92
|
+
TExpectedScope extends AssistantEventScope<AssistantEvent>,
|
86
93
|
>(
|
87
94
|
expectedScope: TExpectedScope,
|
88
95
|
scope: AssistantEventScope<TEvent>,
|
@@ -90,3 +97,7 @@ export const checkEventScope = <
|
|
90
97
|
): _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`> => {
|
91
98
|
return scope === expectedScope;
|
92
99
|
};
|
100
|
+
|
101
|
+
export type AssistantEventCallback<TEvent extends AssistantEvent> = (
|
102
|
+
payload: AssistantEventMap[TEvent],
|
103
|
+
) => void;
|
package/src/types/index.ts
CHANGED
@@ -34,15 +34,32 @@ class ReadonlyApiHandler<TApi extends ApiObject> implements ProxyHandler<TApi> {
|
|
34
34
|
}
|
35
35
|
}
|
36
36
|
|
37
|
-
export const tapApi = <TApi extends ApiObject
|
37
|
+
export const tapApi = <TApi extends ApiObject & { getState: () => any }>(
|
38
|
+
api: TApi,
|
39
|
+
options?: {
|
40
|
+
key?: string | undefined;
|
41
|
+
},
|
42
|
+
) => {
|
38
43
|
const ref = tapRef(() => api);
|
39
44
|
tapEffect(() => {
|
40
45
|
ref.current = api;
|
41
46
|
});
|
42
47
|
|
43
|
-
|
48
|
+
const apiProxy = tapMemo(
|
44
49
|
() =>
|
45
50
|
new Proxy<TApi>({} as TApi, new ReadonlyApiHandler(() => ref.current)),
|
46
51
|
[],
|
47
52
|
);
|
53
|
+
|
54
|
+
const key = options?.key;
|
55
|
+
const state = api.getState();
|
56
|
+
|
57
|
+
return tapMemo(
|
58
|
+
() => ({
|
59
|
+
key,
|
60
|
+
state,
|
61
|
+
api: apiProxy,
|
62
|
+
}),
|
63
|
+
[state, key],
|
64
|
+
);
|
48
65
|
};
|