@assistant-ui/react 0.11.35 → 0.11.37

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 (221) hide show
  1. package/dist/client/AssistantClient.d.ts +13 -57
  2. package/dist/client/AssistantClient.d.ts.map +1 -1
  3. package/dist/client/AssistantClient.js +49 -26
  4. package/dist/client/AssistantClient.js.map +1 -1
  5. package/dist/client/ModelContext.d.ts +8 -0
  6. package/dist/client/ModelContext.d.ts.map +1 -0
  7. package/dist/client/ModelContext.js +21 -0
  8. package/dist/client/ModelContext.js.map +1 -0
  9. package/dist/client/ModelContextClient.d.ts +7 -0
  10. package/dist/client/ModelContextClient.d.ts.map +1 -0
  11. package/dist/client/ModelContextClient.js +18 -0
  12. package/dist/client/ModelContextClient.js.map +1 -0
  13. package/dist/client/ToolUIClient.d.ts.map +1 -1
  14. package/dist/client/ToolUIClient.js +45 -3
  15. package/dist/client/ToolUIClient.js.map +1 -1
  16. package/dist/client/ToolUIContext.d.ts +4 -0
  17. package/dist/client/ToolUIContext.d.ts.map +1 -0
  18. package/dist/client/ToolUIContext.js +20 -0
  19. package/dist/client/ToolUIContext.js.map +1 -0
  20. package/dist/client/Tools.d.ts +10 -0
  21. package/dist/client/Tools.d.ts.map +1 -0
  22. package/dist/client/Tools.js +55 -0
  23. package/dist/client/Tools.js.map +1 -0
  24. package/dist/client/types/ModelContext.d.ts +12 -0
  25. package/dist/client/types/ModelContext.d.ts.map +1 -0
  26. package/dist/client/types/ModelContext.js +1 -0
  27. package/dist/client/types/ModelContext.js.map +1 -0
  28. package/dist/client/types/ThreadList.d.ts.map +1 -1
  29. package/dist/client/types/ToolUI.d.ts +12 -1
  30. package/dist/client/types/ToolUI.d.ts.map +1 -1
  31. package/dist/client/types/Tools.d.ts +9 -0
  32. package/dist/client/types/Tools.d.ts.map +1 -0
  33. package/dist/client/types/Tools.js +1 -0
  34. package/dist/client/types/Tools.js.map +1 -0
  35. package/dist/context/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  36. package/dist/context/providers/AttachmentByIndexProvider.js +20 -24
  37. package/dist/context/providers/AttachmentByIndexProvider.js.map +1 -1
  38. package/dist/context/providers/MessageByIndexProvider.d.ts.map +1 -1
  39. package/dist/context/providers/MessageByIndexProvider.js +27 -29
  40. package/dist/context/providers/MessageByIndexProvider.js.map +1 -1
  41. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  42. package/dist/context/providers/MessageProvider.js +11 -13
  43. package/dist/context/providers/MessageProvider.js.map +1 -1
  44. package/dist/context/providers/PartByIndexProvider.d.ts.map +1 -1
  45. package/dist/context/providers/PartByIndexProvider.js +11 -13
  46. package/dist/context/providers/PartByIndexProvider.js.map +1 -1
  47. package/dist/context/providers/TextMessagePartProvider.d.ts.map +1 -1
  48. package/dist/context/providers/TextMessagePartProvider.js +11 -13
  49. package/dist/context/providers/TextMessagePartProvider.js.map +1 -1
  50. package/dist/context/providers/ThreadListItemProvider.d.ts.map +1 -1
  51. package/dist/context/providers/ThreadListItemProvider.js +41 -45
  52. package/dist/context/providers/ThreadListItemProvider.js.map +1 -1
  53. package/dist/context/react/AssistantApiContext.d.ts +33 -4
  54. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  55. package/dist/context/react/AssistantApiContext.js +35 -17
  56. package/dist/context/react/AssistantApiContext.js.map +1 -1
  57. package/dist/context/react/index.d.ts +1 -1
  58. package/dist/context/react/index.d.ts.map +1 -1
  59. package/dist/context/react/index.js +5 -1
  60. package/dist/context/react/index.js.map +1 -1
  61. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  62. package/dist/legacy-runtime/AssistantRuntimeProvider.js +7 -9
  63. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  64. package/dist/legacy-runtime/RuntimeAdapter.d.ts +7 -0
  65. package/dist/legacy-runtime/RuntimeAdapter.d.ts.map +1 -0
  66. package/dist/legacy-runtime/RuntimeAdapter.js +20 -0
  67. package/dist/legacy-runtime/RuntimeAdapter.js.map +1 -0
  68. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +2 -0
  69. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts.map +1 -1
  70. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js +6 -2
  71. package/dist/legacy-runtime/client/ThreadListRuntimeClient.js.map +1 -1
  72. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +14 -1
  73. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
  74. package/dist/legacy-runtime/hooks/AssistantContext.js +1 -1
  75. package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
  76. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +6 -0
  77. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
  78. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
  79. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +41 -2
  80. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
  81. package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
  82. package/dist/legacy-runtime/hooks/MessageContext.d.ts +36 -2
  83. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
  84. package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
  85. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +6 -0
  86. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
  87. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
  88. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +26 -1
  89. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  90. package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
  91. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +6 -0
  92. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
  93. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
  94. package/dist/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.d.ts +1 -0
  95. package/dist/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.d.ts.map +1 -1
  96. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.d.ts +1 -0
  97. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.d.ts.map +1 -1
  98. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.js +3 -0
  99. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.js.map +1 -1
  100. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.d.ts +4 -1
  101. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.js +2 -2
  103. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.js.map +1 -1
  104. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +1 -1
  105. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.js +7 -1
  106. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.js.map +1 -1
  107. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.d.ts +2 -12
  108. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.d.ts.map +1 -1
  109. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.js +45 -15
  110. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.js.map +1 -1
  111. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.d.ts +2 -0
  112. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.d.ts.map +1 -1
  113. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.js +4 -2
  114. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.js.map +1 -1
  115. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.d.ts +4 -1
  116. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.d.ts.map +1 -1
  117. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.js +2 -2
  118. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.js.map +1 -1
  119. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +1 -1
  120. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js.map +1 -1
  121. package/dist/model-context/index.d.ts +2 -0
  122. package/dist/model-context/index.d.ts.map +1 -1
  123. package/dist/model-context/index.js +6 -0
  124. package/dist/model-context/index.js.map +1 -1
  125. package/dist/model-context/makeAssistantVisible.js +1 -1
  126. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  127. package/dist/model-context/toolbox.d.ts +28 -0
  128. package/dist/model-context/toolbox.d.ts.map +1 -0
  129. package/dist/model-context/toolbox.js +15 -0
  130. package/dist/model-context/toolbox.js.map +1 -0
  131. package/dist/model-context/useAssistantInstructions.js +1 -1
  132. package/dist/model-context/useAssistantInstructions.js.map +1 -1
  133. package/dist/model-context/useAssistantTool.js +1 -1
  134. package/dist/model-context/useAssistantTool.js.map +1 -1
  135. package/dist/primitives/index.d.ts +1 -0
  136. package/dist/primitives/index.d.ts.map +1 -1
  137. package/dist/primitives/index.js +2 -0
  138. package/dist/primitives/index.js.map +1 -1
  139. package/dist/primitives/message/MessageParts.d.ts +31 -1
  140. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  141. package/dist/primitives/message/MessageParts.js +68 -25
  142. package/dist/primitives/message/MessageParts.js.map +1 -1
  143. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  144. package/dist/primitives/message/MessagePartsGrouped.js +2 -2
  145. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  146. package/dist/primitives/reasoning/index.d.ts +2 -0
  147. package/dist/primitives/reasoning/index.d.ts.map +1 -0
  148. package/dist/primitives/reasoning/index.js +6 -0
  149. package/dist/primitives/reasoning/index.js.map +1 -0
  150. package/dist/primitives/reasoning/useScrollLock.d.ts +29 -0
  151. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -0
  152. package/dist/primitives/reasoning/useScrollLock.js +50 -0
  153. package/dist/primitives/reasoning/useScrollLock.js.map +1 -0
  154. package/dist/tests/setup.js +7 -7
  155. package/dist/tests/setup.js.map +1 -1
  156. package/dist/types/MessagePartComponentTypes.d.ts +6 -1
  157. package/dist/types/MessagePartComponentTypes.d.ts.map +1 -1
  158. package/dist/types/index.d.ts +1 -1
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/utils/tap-store/derived-scopes.d.ts +81 -0
  161. package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -0
  162. package/dist/utils/tap-store/derived-scopes.js +67 -0
  163. package/dist/utils/tap-store/derived-scopes.js.map +1 -0
  164. package/dist/utils/tap-store/index.d.ts +1 -0
  165. package/dist/utils/tap-store/index.d.ts.map +1 -1
  166. package/dist/utils/tap-store/index.js +4 -0
  167. package/dist/utils/tap-store/index.js.map +1 -1
  168. package/dist/utils/tap-store/tap-api.js +1 -1
  169. package/dist/utils/tap-store/tap-api.js.map +1 -1
  170. package/package.json +9 -9
  171. package/src/client/AssistantClient.ts +64 -38
  172. package/src/client/ModelContext.ts +28 -0
  173. package/src/client/ModelContextClient.ts +16 -0
  174. package/src/client/ToolUIClient.ts +50 -3
  175. package/src/client/ToolUIContext.ts +22 -0
  176. package/src/client/Tools.ts +68 -0
  177. package/src/client/types/ModelContext.ts +15 -0
  178. package/src/client/types/ThreadList.ts +4 -0
  179. package/src/client/types/ToolUI.ts +10 -1
  180. package/src/client/types/Tools.ts +11 -0
  181. package/src/context/providers/AttachmentByIndexProvider.tsx +21 -25
  182. package/src/context/providers/MessageByIndexProvider.tsx +31 -33
  183. package/src/context/providers/MessageProvider.tsx +12 -14
  184. package/src/context/providers/PartByIndexProvider.tsx +12 -14
  185. package/src/context/providers/TextMessagePartProvider.tsx +12 -14
  186. package/src/context/providers/ThreadListItemProvider.tsx +42 -46
  187. package/src/context/react/AssistantApiContext.tsx +69 -29
  188. package/src/context/react/index.ts +5 -1
  189. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +7 -9
  190. package/src/legacy-runtime/RuntimeAdapter.ts +19 -0
  191. package/src/legacy-runtime/client/ThreadListRuntimeClient.ts +10 -1
  192. package/src/legacy-runtime/hooks/AssistantContext.ts +16 -2
  193. package/src/legacy-runtime/hooks/AttachmentContext.ts +6 -0
  194. package/src/legacy-runtime/hooks/ComposerContext.ts +41 -2
  195. package/src/legacy-runtime/hooks/MessageContext.ts +37 -2
  196. package/src/legacy-runtime/hooks/MessagePartContext.ts +6 -0
  197. package/src/legacy-runtime/hooks/ThreadContext.ts +27 -1
  198. package/src/legacy-runtime/hooks/ThreadListItemContext.ts +6 -0
  199. package/src/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.tsx +1 -0
  200. package/src/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.tsx +4 -0
  201. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.tsx +4 -2
  202. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.tsx +7 -1
  203. package/src/legacy-runtime/runtime-cores/external-store/auto-status.tsx +49 -16
  204. package/src/legacy-runtime/runtime-cores/external-store/external-message-converter.tsx +4 -0
  205. package/src/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.tsx +4 -2
  206. package/src/legacy-runtime/runtime-cores/utils/MessageRepository.tsx +1 -1
  207. package/src/model-context/index.ts +9 -0
  208. package/src/model-context/makeAssistantVisible.tsx +1 -1
  209. package/src/model-context/toolbox.tsx +37 -0
  210. package/src/model-context/useAssistantInstructions.tsx +1 -1
  211. package/src/model-context/useAssistantTool.tsx +1 -1
  212. package/src/primitives/index.ts +1 -0
  213. package/src/primitives/message/MessageParts.tsx +114 -32
  214. package/src/primitives/message/MessagePartsGrouped.tsx +3 -2
  215. package/src/primitives/reasoning/index.ts +1 -0
  216. package/src/primitives/reasoning/useScrollLock.tsx +86 -0
  217. package/src/types/MessagePartComponentTypes.tsx +7 -1
  218. package/src/types/index.ts +2 -0
  219. package/src/utils/tap-store/derived-scopes.ts +185 -0
  220. package/src/utils/tap-store/index.ts +9 -0
  221. package/src/utils/tap-store/tap-api.ts +1 -1
@@ -0,0 +1,68 @@
1
+ import { resource, tapState, tapEffect } from "@assistant-ui/tap";
2
+ import { tapApi } from "../utils/tap-store";
3
+ import { tapModelContext } from "./ModelContext";
4
+ import { tapToolUI } from "./ToolUIContext";
5
+ import { ToolsState, ToolsApi } from "./types/Tools";
6
+ import type { Tool } from "assistant-stream";
7
+ import {
8
+ type Toolkit,
9
+ FallbackSymbol,
10
+ LayoutSymbol,
11
+ } from "../model-context/toolbox";
12
+
13
+ export const Tools = resource(({ toolkit }: { toolkit?: Toolkit }) => {
14
+ const [state] = tapState<ToolsState>(() => ({}));
15
+
16
+ const modelContext = tapModelContext();
17
+ const toolUI = tapToolUI();
18
+
19
+ tapEffect(() => {
20
+ if (!toolkit) return;
21
+ const unsubscribes: (() => void)[] = [];
22
+
23
+ // Register fallback UI
24
+ const fallback = toolkit[FallbackSymbol];
25
+ if (fallback?.render) {
26
+ unsubscribes.push(toolUI.setFallbackToolUI(fallback.render));
27
+ }
28
+
29
+ // Register layout
30
+ const layout = toolkit[LayoutSymbol];
31
+ if (layout?.render) {
32
+ unsubscribes.push(toolUI.setToolUILayout(layout.render));
33
+ }
34
+
35
+ // Register tool UIs (exclude symbols)
36
+ for (const [toolName, tool] of Object.entries(toolkit)) {
37
+ if (tool.render) {
38
+ unsubscribes.push(toolUI.setToolUI(toolName, tool.render));
39
+ }
40
+ }
41
+
42
+ // Register tools with model context (exclude symbols)
43
+ const toolsWithoutRender = Object.entries(toolkit).reduce(
44
+ (acc, [name, tool]) => {
45
+ const { render, ...rest } = tool;
46
+ acc[name] = rest;
47
+ return acc;
48
+ },
49
+ {} as Record<string, Tool<any, any>>,
50
+ );
51
+
52
+ const modelContextProvider = {
53
+ getModelContext: () => ({
54
+ tools: toolsWithoutRender,
55
+ }),
56
+ };
57
+
58
+ unsubscribes.push(modelContext.register(modelContextProvider));
59
+
60
+ return () => {
61
+ unsubscribes.forEach((fn) => fn());
62
+ };
63
+ }, [toolkit, modelContext, toolUI]);
64
+
65
+ return tapApi<ToolsApi>({
66
+ getState: () => state,
67
+ });
68
+ });
@@ -0,0 +1,15 @@
1
+ import type { Unsubscribe } from "@assistant-ui/tap";
2
+ import type { ModelContextProvider } from "../../model-context/ModelContextTypes";
3
+
4
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
5
+ export type ModelContextState = {};
6
+
7
+ export type ModelContextApi = ModelContextProvider & {
8
+ getState(): ModelContextState;
9
+ register: (provider: ModelContextProvider) => Unsubscribe;
10
+ };
11
+
12
+ export type ModelContextMeta = {
13
+ source: "root";
14
+ query: Record<string, never>;
15
+ };
@@ -3,6 +3,7 @@ import {
3
3
  ThreadListItemClientApi,
4
4
  } from "./ThreadListItem";
5
5
  import { ThreadClientApi, ThreadClientState } from "./Thread";
6
+ import type { AssistantRuntime } from "../../legacy-runtime/runtime/AssistantRuntime";
6
7
 
7
8
  export type ThreadListClientState = {
8
9
  readonly mainThreadId: string;
@@ -29,4 +30,7 @@ export type ThreadListClientApi = {
29
30
  ): ThreadListItemClientApi;
30
31
 
31
32
  thread(selector: "main"): ThreadClientApi;
33
+
34
+ /** @internal */
35
+ __internal_getAssistantRuntime?(): AssistantRuntime;
32
36
  };
@@ -1,7 +1,12 @@
1
1
  import { Unsubscribe } from "@assistant-ui/tap";
2
+ import type { ComponentType, ReactNode } from "react";
2
3
  import { ToolCallMessagePartComponent } from "../../types";
3
4
 
4
- export type ToolUIState = Record<string, ToolCallMessagePartComponent[]>;
5
+ export type ToolUIState = {
6
+ tools: Record<string, ToolCallMessagePartComponent[]>;
7
+ fallback: ToolCallMessagePartComponent[];
8
+ layout: ComponentType<{ children: ReactNode }>[];
9
+ };
5
10
 
6
11
  export type ToolUIApi = {
7
12
  getState(): ToolUIState;
@@ -10,6 +15,10 @@ export type ToolUIApi = {
10
15
  toolName: string,
11
16
  render: ToolCallMessagePartComponent,
12
17
  ): Unsubscribe;
18
+
19
+ setFallbackToolUI(render: ToolCallMessagePartComponent): Unsubscribe;
20
+
21
+ setToolUILayout(render: ComponentType<{ children: ReactNode }>): Unsubscribe;
13
22
  };
14
23
 
15
24
  export type ToolUIMeta = {
@@ -0,0 +1,11 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
2
+ export type ToolsState = {};
3
+
4
+ export type ToolsApi = {
5
+ getState(): ToolsState;
6
+ };
7
+
8
+ export type ToolsMeta = {
9
+ source: "root";
10
+ query: Record<string, never>;
11
+ };
@@ -1,31 +1,29 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
 
5
5
  import {
6
- AssistantApi,
7
6
  AssistantProvider,
8
7
  useAssistantApi,
9
- createAssistantApiField,
8
+ useExtendedAssistantApi,
10
9
  } from "../react/AssistantApiContext";
10
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
11
11
 
12
12
  export const MessageAttachmentByIndexProvider: FC<
13
13
  PropsWithChildren<{
14
14
  index: number;
15
15
  }>
16
16
  > = ({ index, children }) => {
17
- const api = useAssistantApi();
18
- const api2 = useMemo(() => {
19
- return {
20
- attachment: createAssistantApiField({
21
- source: "message",
22
- query: { type: "index", index },
23
- get: () => api.message().attachment({ index }),
24
- }),
25
- } satisfies Partial<AssistantApi>;
26
- }, [api, index]);
17
+ const baseApi = useAssistantApi();
18
+ const api = useExtendedAssistantApi({
19
+ attachment: DerivedScope({
20
+ source: "message",
21
+ query: { type: "index", index },
22
+ get: () => baseApi.message().attachment({ index }),
23
+ }),
24
+ });
27
25
 
28
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
26
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
29
27
  };
30
28
 
31
29
  export const ComposerAttachmentByIndexProvider: FC<
@@ -33,16 +31,14 @@ export const ComposerAttachmentByIndexProvider: FC<
33
31
  index: number;
34
32
  }>
35
33
  > = ({ index, children }) => {
36
- const api = useAssistantApi();
37
- const api2 = useMemo(() => {
38
- return {
39
- attachment: createAssistantApiField({
40
- source: "composer",
41
- query: { type: "index", index },
42
- get: () => api.composer().attachment({ index }),
43
- }),
44
- } satisfies Partial<AssistantApi>;
45
- }, [api, index]);
34
+ const baseApi = useAssistantApi();
35
+ const api = useExtendedAssistantApi({
36
+ attachment: DerivedScope({
37
+ source: "composer",
38
+ query: { type: "index", index },
39
+ get: () => baseApi.composer().attachment({ index }),
40
+ }),
41
+ });
46
42
 
47
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
43
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
48
44
  };
@@ -1,52 +1,50 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
  import {
5
- AssistantApi,
6
5
  AssistantProvider,
7
6
  useAssistantApi,
8
- createAssistantApiField,
7
+ useExtendedAssistantApi,
9
8
  } from "../react/AssistantApiContext";
10
9
  import {
11
10
  checkEventScope,
12
11
  normalizeEventSelector,
13
12
  } from "../../types/EventTypes";
13
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
14
14
 
15
15
  export const MessageByIndexProvider: FC<
16
16
  PropsWithChildren<{
17
17
  index: number;
18
18
  }>
19
19
  > = ({ index, children }) => {
20
- const api = useAssistantApi();
21
- const api2 = useMemo(() => {
22
- const getMessage = () => api.thread().message({ index });
23
- return {
24
- message: createAssistantApiField({
25
- source: "thread",
26
- query: { type: "index", index },
27
- get: () => getMessage(),
28
- }),
29
- composer: createAssistantApiField({
30
- source: "message",
31
- query: {},
32
- get: () => getMessage().composer,
33
- }),
34
- on(selector, callback) {
35
- const { event, scope } = normalizeEventSelector(selector);
36
- if (
37
- !checkEventScope("composer", scope, event) &&
38
- !checkEventScope("message", scope, event)
39
- )
40
- return api.on(selector, callback);
20
+ const baseApi = useAssistantApi();
21
+ const api = useExtendedAssistantApi({
22
+ message: DerivedScope({
23
+ source: "thread",
24
+ query: { type: "index", index },
25
+ get: () => baseApi.thread().message({ index }),
26
+ }),
27
+ composer: DerivedScope({
28
+ source: "message",
29
+ query: {},
30
+ get: () => baseApi.thread().message({ index }).composer,
31
+ }),
32
+ on(selector, callback) {
33
+ const getMessage = () => baseApi.thread().message({ index });
34
+ const { event, scope } = normalizeEventSelector(selector);
35
+ if (
36
+ !checkEventScope("composer", scope, event) &&
37
+ !checkEventScope("message", scope, event)
38
+ )
39
+ return baseApi.on(selector, callback);
41
40
 
42
- return api.on({ scope: "thread", event }, (e) => {
43
- if (e.messageId === getMessage().getState().id) {
44
- callback(e);
45
- }
46
- });
47
- },
48
- } satisfies Partial<AssistantApi>;
49
- }, [api, index]);
41
+ return baseApi.on({ scope: "thread", event }, (e) => {
42
+ if (e.messageId === getMessage().getState().id) {
43
+ callback(e);
44
+ }
45
+ });
46
+ },
47
+ });
50
48
 
51
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
49
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
52
50
  };
@@ -1,10 +1,9 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
  import {
5
5
  AssistantProvider,
6
- AssistantApi,
7
- createAssistantApiField,
6
+ useExtendedAssistantApi,
8
7
  } from "../react/AssistantApiContext";
9
8
  import { useResource } from "@assistant-ui/tap/react";
10
9
  import { asStore } from "../../utils/tap-store";
@@ -12,22 +11,21 @@ import {
12
11
  ThreadMessageClientProps,
13
12
  ThreadMessageClient,
14
13
  } from "../../client/ThreadMessageClient";
14
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
15
15
 
16
16
  export const MessageProvider: FC<
17
17
  PropsWithChildren<ThreadMessageClientProps>
18
18
  > = ({ children, ...props }) => {
19
19
  const store = useResource(asStore(ThreadMessageClient(props)));
20
- const api = useMemo(() => {
21
- return {
22
- message: createAssistantApiField({
23
- source: "root",
24
- query: {},
25
- get: () => store.getState().api,
26
- }),
27
- subscribe: store.subscribe,
28
- flushSync: store.flushSync,
29
- } satisfies Partial<AssistantApi>;
30
- }, [store]);
20
+ const api = useExtendedAssistantApi({
21
+ message: DerivedScope({
22
+ source: "root",
23
+ query: {},
24
+ get: () => store.getState().api,
25
+ }),
26
+ subscribe: store.subscribe,
27
+ flushSync: store.flushSync,
28
+ });
31
29
 
32
30
  return <AssistantProvider api={api}>{children}</AssistantProvider>;
33
31
  };
@@ -1,28 +1,26 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
  import {
5
- AssistantApi,
6
5
  AssistantProvider,
7
6
  useAssistantApi,
8
- createAssistantApiField,
7
+ useExtendedAssistantApi,
9
8
  } from "../react/AssistantApiContext";
9
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
10
10
 
11
11
  export const PartByIndexProvider: FC<
12
12
  PropsWithChildren<{
13
13
  index: number;
14
14
  }>
15
15
  > = ({ index, children }) => {
16
- const api = useAssistantApi();
17
- const api2 = useMemo(() => {
18
- return {
19
- part: createAssistantApiField({
20
- source: "message",
21
- query: { type: "index", index },
22
- get: () => api.message().part({ index }),
23
- }),
24
- } satisfies Partial<AssistantApi>;
25
- }, [api, index]);
16
+ const baseApi = useAssistantApi();
17
+ const api = useExtendedAssistantApi({
18
+ part: DerivedScope({
19
+ source: "message",
20
+ query: { type: "index", index },
21
+ get: () => baseApi.message().part({ index }),
22
+ }),
23
+ });
26
24
 
27
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
25
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
28
26
  };
@@ -1,10 +1,9 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
  import {
5
5
  AssistantProvider,
6
- AssistantApi,
7
- createAssistantApiField,
6
+ useExtendedAssistantApi,
8
7
  } from "../react/AssistantApiContext";
9
8
  import {
10
9
  MessagePartClientApi,
@@ -13,6 +12,7 @@ import {
13
12
  import { resource, tapMemo } from "@assistant-ui/tap";
14
13
  import { useResource } from "@assistant-ui/tap/react";
15
14
  import { asStore, tapApi } from "../../utils/tap-store";
15
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
16
16
 
17
17
  const TextMessagePartClient = resource(
18
18
  ({ text, isRunning }: { text: string; isRunning: boolean }) => {
@@ -46,17 +46,15 @@ export const TextMessagePartProvider: FC<
46
46
  const store = useResource(
47
47
  asStore(TextMessagePartClient({ text, isRunning })),
48
48
  );
49
- const api = useMemo(() => {
50
- return {
51
- part: createAssistantApiField({
52
- source: "root",
53
- query: {},
54
- get: () => store.getState().api,
55
- }),
56
- subscribe: store.subscribe,
57
- flushSync: store.flushSync,
58
- } satisfies Partial<AssistantApi>;
59
- }, [store]);
49
+ const api = useExtendedAssistantApi({
50
+ part: DerivedScope({
51
+ source: "root",
52
+ query: {},
53
+ get: () => store.getState().api,
54
+ }),
55
+ subscribe: store.subscribe,
56
+ flushSync: store.flushSync,
57
+ });
60
58
 
61
59
  return <AssistantProvider api={api}>{children}</AssistantProvider>;
62
60
  };
@@ -1,16 +1,16 @@
1
1
  "use client";
2
2
 
3
- import { useMemo, type FC, type PropsWithChildren } from "react";
3
+ import { type FC, type PropsWithChildren } from "react";
4
4
  import {
5
- AssistantApi,
6
5
  AssistantProvider,
7
6
  useAssistantApi,
8
- createAssistantApiField,
7
+ useExtendedAssistantApi,
9
8
  } from "../react/AssistantApiContext";
10
9
  import {
11
10
  checkEventScope,
12
11
  normalizeEventSelector,
13
12
  } from "../../types/EventTypes";
13
+ import { DerivedScope } from "../../utils/tap-store/derived-scopes";
14
14
 
15
15
  export const ThreadListItemByIndexProvider: FC<
16
16
  PropsWithChildren<{
@@ -18,31 +18,29 @@ export const ThreadListItemByIndexProvider: FC<
18
18
  archived: boolean;
19
19
  }>
20
20
  > = ({ index, archived, children }) => {
21
- const api = useAssistantApi();
21
+ const baseApi = useAssistantApi();
22
22
 
23
- const api2 = useMemo(() => {
24
- const getItem = () => api.threads().item({ index, archived });
25
- return {
26
- threadListItem: createAssistantApiField({
27
- source: "threads",
28
- query: { type: "index", index, archived },
29
- get: () => getItem(),
30
- }),
31
- on(selector, callback) {
32
- const { event, scope } = normalizeEventSelector(selector);
33
- if (!checkEventScope("thread-list-item", scope, event))
34
- return api.on(selector, callback);
23
+ const api = useExtendedAssistantApi({
24
+ threadListItem: DerivedScope({
25
+ source: "threads",
26
+ query: { type: "index", index, archived },
27
+ get: () => baseApi.threads().item({ index, archived }),
28
+ }),
29
+ on(selector, callback) {
30
+ const getItem = () => baseApi.threads().item({ index, archived });
31
+ const { event, scope } = normalizeEventSelector(selector);
32
+ if (!checkEventScope("thread-list-item", scope, event))
33
+ return baseApi.on(selector, callback);
35
34
 
36
- return api.on({ scope: "*", event }, (e) => {
37
- if (e.threadId === getItem().getState().id) {
38
- callback(e);
39
- }
40
- });
41
- },
42
- } satisfies Partial<AssistantApi>;
43
- }, [api, index, archived]);
35
+ return baseApi.on({ scope: "*", event }, (e) => {
36
+ if (e.threadId === getItem().getState().id) {
37
+ callback(e);
38
+ }
39
+ });
40
+ },
41
+ });
44
42
 
45
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
43
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
46
44
  };
47
45
 
48
46
  export const ThreadListItemByIdProvider: FC<
@@ -50,28 +48,26 @@ export const ThreadListItemByIdProvider: FC<
50
48
  id: string;
51
49
  }>
52
50
  > = ({ id, children }) => {
53
- const api = useAssistantApi();
51
+ const baseApi = useAssistantApi();
54
52
 
55
- const api2 = useMemo(() => {
56
- const getItem = () => api.threads().item({ id });
57
- return {
58
- threadListItem: createAssistantApiField({
59
- source: "threads",
60
- query: { type: "id", id },
61
- get: () => getItem(),
62
- }),
63
- on(selector, callback) {
64
- const { event, scope } = normalizeEventSelector(selector);
65
- if (!checkEventScope("thread-list-item", scope, event))
66
- return api.on(selector, callback);
53
+ const api = useExtendedAssistantApi({
54
+ threadListItem: DerivedScope({
55
+ source: "threads",
56
+ query: { type: "id", id },
57
+ get: () => baseApi.threads().item({ id }),
58
+ }),
59
+ on(selector, callback) {
60
+ const getItem = () => baseApi.threads().item({ id });
61
+ const { event, scope } = normalizeEventSelector(selector);
62
+ if (!checkEventScope("thread-list-item", scope, event))
63
+ return baseApi.on(selector, callback);
67
64
 
68
- return api.on({ scope: "*", event }, (e) => {
69
- if (e.threadId !== getItem().getState().id) return;
70
- callback(e);
71
- });
72
- },
73
- } satisfies Partial<AssistantApi>;
74
- }, [api, id]);
65
+ return baseApi.on({ scope: "*", event }, (e) => {
66
+ if (e.threadId !== getItem().getState().id) return;
67
+ callback(e);
68
+ });
69
+ },
70
+ });
75
71
 
76
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
72
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
77
73
  };