@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.
Files changed (106) hide show
  1. package/dist/client/AssistantClient.d.ts +2 -2
  2. package/dist/client/AssistantClient.d.ts.map +1 -1
  3. package/dist/client/AssistantClient.js +1 -2
  4. package/dist/client/AssistantClient.js.map +1 -1
  5. package/dist/client/ToolUIClient.d.ts +3 -2
  6. package/dist/client/ToolUIClient.d.ts.map +1 -1
  7. package/dist/client/ToolUIClient.js +1 -5
  8. package/dist/client/ToolUIClient.js.map +1 -1
  9. package/dist/client/types/ThreadList.d.ts +1 -1
  10. package/dist/client/types/ThreadList.d.ts.map +1 -1
  11. package/dist/context/providers/AttachmentProvider.js +3 -3
  12. package/dist/context/providers/AttachmentProvider.js.map +1 -1
  13. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  14. package/dist/context/providers/MessageProvider.js +2 -2
  15. package/dist/context/providers/MessageProvider.js.map +1 -1
  16. package/dist/context/providers/PartProvider.js +2 -2
  17. package/dist/context/providers/PartProvider.js.map +1 -1
  18. package/dist/context/providers/TextMessagePartProvider.d.ts.map +1 -1
  19. package/dist/context/providers/TextMessagePartProvider.js +6 -7
  20. package/dist/context/providers/TextMessagePartProvider.js.map +1 -1
  21. package/dist/context/providers/ThreadListItemProvider.d.ts.map +1 -1
  22. package/dist/context/providers/ThreadListItemProvider.js +5 -4
  23. package/dist/context/providers/ThreadListItemProvider.js.map +1 -1
  24. package/dist/context/react/AssistantApiContext.d.ts +3 -3
  25. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  26. package/dist/context/react/AssistantApiContext.js +4 -3
  27. package/dist/context/react/AssistantApiContext.js.map +1 -1
  28. package/dist/context/react/hooks/useAssistantEvent.d.ts +2 -2
  29. package/dist/context/react/hooks/useAssistantEvent.d.ts.map +1 -1
  30. package/dist/context/react/hooks/useAssistantEvent.js.map +1 -1
  31. package/dist/context/react/index.d.ts +1 -0
  32. package/dist/context/react/index.d.ts.map +1 -1
  33. package/dist/context/react/index.js +2 -0
  34. package/dist/context/react/index.js.map +1 -1
  35. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  36. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -5
  37. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  38. package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts +2 -4
  39. package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts.map +1 -1
  40. package/dist/legacy-runtime/client/AttachmentRuntimeClient.js +10 -10
  41. package/dist/legacy-runtime/client/AttachmentRuntimeClient.js.map +1 -1
  42. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +3 -2
  43. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
  44. package/dist/legacy-runtime/client/ComposerRuntimeClient.js +1 -5
  45. package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
  46. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +6 -7
  47. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts.map +1 -1
  48. package/dist/legacy-runtime/client/EventManagerRuntimeClient.js +11 -3
  49. package/dist/legacy-runtime/client/EventManagerRuntimeClient.js.map +1 -1
  50. package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts +1 -1
  51. package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts.map +1 -1
  52. package/dist/legacy-runtime/client/MessagePartRuntimeClient.js +10 -10
  53. package/dist/legacy-runtime/client/MessagePartRuntimeClient.js.map +1 -1
  54. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts +3 -3
  55. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts.map +1 -1
  56. package/dist/legacy-runtime/client/MessageRuntimeClient.js +31 -31
  57. package/dist/legacy-runtime/client/MessageRuntimeClient.js.map +1 -1
  58. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts +2 -2
  59. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts.map +1 -1
  60. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js +17 -17
  61. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.js.map +1 -1
  62. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +3 -2
  63. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts.map +1 -1
  64. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js +2 -6
  65. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js.map +1 -1
  66. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts +3 -2
  67. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts.map +1 -1
  68. package/dist/legacy-runtime/client/ThreadRuntimeClient.js +1 -5
  69. package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
  70. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
  71. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js +0 -1
  72. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js.map +1 -1
  73. package/dist/types/EventTypes.d.ts +15 -7
  74. package/dist/types/EventTypes.d.ts.map +1 -1
  75. package/dist/types/EventTypes.js.map +1 -1
  76. package/dist/types/index.d.ts +1 -1
  77. package/dist/types/index.d.ts.map +1 -1
  78. package/dist/utils/tap-store/tap-api.d.ts +9 -1
  79. package/dist/utils/tap-store/tap-api.d.ts.map +1 -1
  80. package/dist/utils/tap-store/tap-api.js +12 -2
  81. package/dist/utils/tap-store/tap-api.js.map +1 -1
  82. package/package.json +1 -1
  83. package/src/client/AssistantClient.ts +7 -13
  84. package/src/client/ToolUIClient.ts +1 -6
  85. package/src/client/types/ThreadList.ts +1 -1
  86. package/src/context/providers/AttachmentProvider.tsx +3 -3
  87. package/src/context/providers/MessageProvider.tsx +3 -8
  88. package/src/context/providers/PartProvider.tsx +2 -2
  89. package/src/context/providers/TextMessagePartProvider.tsx +5 -7
  90. package/src/context/providers/ThreadListItemProvider.tsx +9 -16
  91. package/src/context/react/AssistantApiContext.tsx +11 -5
  92. package/src/context/react/hooks/useAssistantEvent.ts +4 -3
  93. package/src/context/react/index.ts +2 -0
  94. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +1 -15
  95. package/src/legacy-runtime/client/AttachmentRuntimeClient.ts +10 -11
  96. package/src/legacy-runtime/client/ComposerRuntimeClient.ts +1 -6
  97. package/src/legacy-runtime/client/EventManagerRuntimeClient.ts +41 -18
  98. package/src/legacy-runtime/client/MessagePartRuntimeClient.ts +13 -14
  99. package/src/legacy-runtime/client/MessageRuntimeClient.ts +35 -36
  100. package/src/legacy-runtime/client/ThreadListItemRuntimeClient.ts +17 -18
  101. package/src/legacy-runtime/client/ThreadListRuntimeClient.ts +2 -7
  102. package/src/legacy-runtime/client/ThreadRuntimeClient.ts +1 -6
  103. package/src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.tsx +0 -1
  104. package/src/types/EventTypes.ts +23 -12
  105. package/src/types/index.ts +3 -1
  106. package/src/utils/tap-store/tap-api.ts +19 -2
@@ -54,3 +54,5 @@ export {
54
54
  useThreadListItemRuntime,
55
55
  useThreadListItem,
56
56
  } from "../../legacy-runtime/hooks/ThreadListItemContext";
57
+
58
+ export { AssistantProvider } from "./AssistantApiContext";
@@ -1,12 +1,10 @@
1
1
  "use client";
2
2
 
3
3
  import { FC, memo, PropsWithChildren } from "react";
4
- import { AssistantApiProvider } from "../context/react/AssistantApiContext";
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
- const api = tapApi<AttachmentClientApi>({
11
- getState: () => state,
12
- remove: runtime.remove,
13
- __internal_getRuntime: () => runtime,
14
- });
15
-
16
- return {
17
- state: state,
18
- api,
19
- key: state.id,
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
- const api = tapApi<ComposerClientApi>({
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 { AssistantEvents, Unsubscribe } from "../../types";
3
-
4
- type EventCallback<TEvent extends keyof AssistantEvents> = (
5
- payload: AssistantEvents[TEvent],
6
- ) => void;
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 keyof AssistantEvents>(
10
+ on<TEvent extends AssistantEvent>(
10
11
  event: TEvent,
11
- callback: EventCallback<TEvent>,
12
+ callback: AssistantEventCallback<TEvent>,
12
13
  ): Unsubscribe;
13
- emit<TEvent extends keyof AssistantEvents>(
14
+ emit<TEvent extends Exclude<AssistantEvent, "*">>(
14
15
  event: TEvent,
15
- payload: AssistantEvents[TEvent],
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<string, Set<EventCallback<any>>>();
35
+ const listeners: ListenerMap = new Map();
22
36
 
23
37
  return {
24
- on: <TEvent extends keyof AssistantEvents>(
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: keyof AssistantEvents, payload: any) => {
54
+ emit: (event, payload) => {
44
55
  const eventListeners = listeners.get(event);
45
- if (!eventListeners) return;
56
+ const wildcardListeners = listeners.get("*");
57
+
58
+ if (!eventListeners && !wildcardListeners) return;
46
59
 
47
60
  // make sure state updates flush
48
61
  queueMicrotask(() => {
49
- for (const callback of eventListeners) {
50
- callback(payload);
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
- const api = tapApi<MessagePartClientApi>({
11
- getState: () => runtimeState,
10
+ return tapApi<MessagePartClientApi>(
11
+ {
12
+ getState: () => runtimeState,
12
13
 
13
- addToolResult: (result) => runtime.addToolResult(result),
14
+ addToolResult: (result) => runtime.addToolResult(result),
14
15
 
15
- __internal_getRuntime: () => runtime,
16
- });
17
-
18
- return {
19
- key:
20
- runtimeState.type === "tool-call"
21
- ? "toolCallId-" + runtimeState.toolCallId
22
- : undefined,
23
- state: runtimeState,
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
- const api = tapApi<MessageClientApi>({
103
- getState: () => state,
104
-
105
- composer: composer.api,
106
-
107
- reload: (config) => runtime.reload(config),
108
- speak: () => runtime.speak(),
109
- stopSpeaking: () => runtime.stopSpeaking(),
110
- submitFeedback: (feedback) => runtime.submitFeedback(feedback),
111
- switchToBranch: (options) => runtime.switchToBranch(options),
112
- getCopyText: () => runtime.unstable_getCopyText(),
113
-
114
- part: (selector) => {
115
- if ("index" in selector) {
116
- return parts.api({ index: selector.index });
117
- } else {
118
- return parts.api({ key: "toolCallId-" + selector.toolCallId });
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
- setIsCopied,
131
- setIsHovering,
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
- __internal_getRuntime: () => runtime,
134
- });
131
+ setIsCopied,
132
+ setIsHovering,
135
133
 
136
- return {
137
- key: runtimeState.id,
138
- state,
139
- api,
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
- const api = tapApi<ThreadListItemClientApi>({
42
- getState: () => runtimeState,
43
- switchTo: runtime.switchTo,
44
- rename: runtime.rename,
45
- archive: runtime.archive,
46
- unarchive: runtime.unarchive,
47
- delete: runtime.delete,
48
- generateTitle: runtime.generateTitle,
49
- initialize: runtime.initialize,
50
- detach: runtime.detach,
51
- __internal_getRuntime: () => runtime,
52
- });
53
-
54
- return {
55
- state: runtimeState,
56
- api,
57
- key: runtimeState.id,
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
- const api = tapApi<ThreadListClientApi>({
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
- const api = tapApi<ThreadClientApi>({
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
  );
@@ -173,7 +173,6 @@ export abstract class BaseComposerRuntimeCore
173
173
  ];
174
174
  else {
175
175
  this._attachments = [...this._attachments, a];
176
- this._notifyEventSubscribers("attachment-add");
177
176
  }
178
177
 
179
178
  this._notifySubscribers();
@@ -1,6 +1,5 @@
1
- export type EventSource<
2
- T extends keyof AssistantEvents = keyof AssistantEvents,
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 keyof AssistantEvents> =
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 keyof AssistantEvents> =
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 AssistantEvents = {
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 keyof AssistantEvents>(
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 keyof AssistantEvents,
85
- TExpectedScope extends AssistantEventScope<keyof AssistantEvents>,
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;
@@ -54,5 +54,7 @@ export type { Unsubscribe } from "./Unsubscribe";
54
54
  export type {
55
55
  AssistantEventScope,
56
56
  AssistantEventSelector,
57
- AssistantEvents,
57
+ AssistantEvent,
58
+ AssistantEventMap,
59
+ AssistantEventCallback,
58
60
  } from "./EventTypes";
@@ -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>(api: TApi) => {
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
- return tapMemo(
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
  };