@assistant-ui/react 0.11.14 → 0.11.16

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 (38) hide show
  1. package/dist/context/providers/{AttachmentProvider.d.ts → AttachmentByIndexProvider.d.ts} +1 -1
  2. package/dist/context/providers/AttachmentByIndexProvider.d.ts.map +1 -0
  3. package/dist/context/providers/{AttachmentProvider.js → AttachmentByIndexProvider.js} +2 -2
  4. package/dist/context/providers/AttachmentByIndexProvider.js.map +1 -0
  5. package/dist/context/providers/MessageByIndexProvider.d.ts +5 -0
  6. package/dist/context/providers/MessageByIndexProvider.d.ts.map +1 -0
  7. package/dist/context/providers/MessageByIndexProvider.js +47 -0
  8. package/dist/context/providers/MessageByIndexProvider.js.map +1 -0
  9. package/dist/context/providers/MessageProvider.d.ts +9 -3
  10. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  11. package/dist/context/providers/MessageProvider.js +191 -28
  12. package/dist/context/providers/MessageProvider.js.map +1 -1
  13. package/dist/context/providers/{PartProvider.d.ts → PartByIndexProvider.d.ts} +1 -1
  14. package/dist/context/providers/PartByIndexProvider.d.ts.map +1 -0
  15. package/dist/context/providers/{PartProvider.js → PartByIndexProvider.js} +2 -2
  16. package/dist/context/providers/PartByIndexProvider.js.map +1 -0
  17. package/dist/context/providers/index.d.ts +4 -3
  18. package/dist/context/providers/index.d.ts.map +1 -1
  19. package/dist/context/providers/index.js +5 -3
  20. package/dist/context/providers/index.js.map +1 -1
  21. package/dist/context/react/AssistantApiContext.d.ts +3 -0
  22. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  23. package/dist/context/react/AssistantApiContext.js.map +1 -1
  24. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  25. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +8 -1
  26. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  27. package/package.json +2 -2
  28. package/src/context/providers/MessageByIndexProvider.tsx +52 -0
  29. package/src/context/providers/MessageProvider.tsx +236 -37
  30. package/src/context/providers/index.ts +4 -3
  31. package/src/context/react/AssistantApiContext.tsx +9 -4
  32. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx +8 -0
  33. package/dist/context/providers/AttachmentProvider.d.ts.map +0 -1
  34. package/dist/context/providers/AttachmentProvider.js.map +0 -1
  35. package/dist/context/providers/PartProvider.d.ts.map +0 -1
  36. package/dist/context/providers/PartProvider.js.map +0 -1
  37. /package/src/context/providers/{AttachmentProvider.tsx → AttachmentByIndexProvider.tsx} +0 -0
  38. /package/src/context/providers/{PartProvider.tsx → PartByIndexProvider.tsx} +0 -0
@@ -5,4 +5,4 @@ export declare const MessageAttachmentByIndexProvider: FC<PropsWithChildren<{
5
5
  export declare const ComposerAttachmentByIndexProvider: FC<PropsWithChildren<{
6
6
  index: number;
7
7
  }>>;
8
- //# sourceMappingURL=AttachmentProvider.d.ts.map
8
+ //# sourceMappingURL=AttachmentByIndexProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentByIndexProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/AttachmentByIndexProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AASjE,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAC/C,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,EAAE,CAChD,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- // src/context/providers/AttachmentProvider.tsx
3
+ // src/context/providers/AttachmentByIndexProvider.tsx
4
4
  import { useMemo } from "react";
5
5
  import {
6
6
  AssistantProvider,
@@ -38,4 +38,4 @@ export {
38
38
  ComposerAttachmentByIndexProvider,
39
39
  MessageAttachmentByIndexProvider
40
40
  };
41
- //# sourceMappingURL=AttachmentProvider.js.map
41
+ //# sourceMappingURL=AttachmentByIndexProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/context/providers/AttachmentByIndexProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\n\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\n\nexport const MessageAttachmentByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n attachment: createAssistantApiField({\n source: \"message\",\n query: { type: \"index\", index },\n get: () => api.message().attachment({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n\nexport const ComposerAttachmentByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n attachment: createAssistantApiField({\n source: \"composer\",\n query: { type: \"index\", index },\n get: () => api.composer().attachment({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AAEzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBE;AAhBF,IAAM,mCAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,YAAY,wBAAwB;AAAA,QAClC,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;AAEO,IAAM,oCAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,YAAY,wBAAwB;AAAA,QAClC,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { type FC, type PropsWithChildren } from "react";
2
+ export declare const MessageByIndexProvider: FC<PropsWithChildren<{
3
+ index: number;
4
+ }>>;
5
+ //# sourceMappingURL=MessageByIndexProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageByIndexProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/MessageByIndexProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAYjE,eAAO,MAAM,sBAAsB,EAAE,EAAE,CACrC,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAkCH,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use client";
2
+
3
+ // src/context/providers/MessageByIndexProvider.tsx
4
+ import { useMemo } from "react";
5
+ import {
6
+ AssistantProvider,
7
+ useAssistantApi,
8
+ createAssistantApiField
9
+ } from "../react/AssistantApiContext.js";
10
+ import {
11
+ checkEventScope,
12
+ normalizeEventSelector
13
+ } from "../../types/EventTypes.js";
14
+ import { jsx } from "react/jsx-runtime";
15
+ var MessageByIndexProvider = ({ index, children }) => {
16
+ const api = useAssistantApi();
17
+ const api2 = useMemo(() => {
18
+ const getMessage = () => api.thread().message({ index });
19
+ return {
20
+ message: createAssistantApiField({
21
+ source: "thread",
22
+ query: { type: "index", index },
23
+ get: () => getMessage()
24
+ }),
25
+ composer: createAssistantApiField({
26
+ source: "message",
27
+ query: {},
28
+ get: () => getMessage().composer
29
+ }),
30
+ on(selector, callback) {
31
+ const { event, scope } = normalizeEventSelector(selector);
32
+ if (!checkEventScope("composer", scope, event) && !checkEventScope("message", scope, event))
33
+ return api.on(selector, callback);
34
+ return api.on({ scope: "thread", event }, (e) => {
35
+ if (e.messageId === getMessage().getState().id) {
36
+ callback(e);
37
+ }
38
+ });
39
+ }
40
+ };
41
+ }, [api, index]);
42
+ return /* @__PURE__ */ jsx(AssistantProvider, { api: api2, children });
43
+ };
44
+ export {
45
+ MessageByIndexProvider
46
+ };
47
+ //# sourceMappingURL=MessageByIndexProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/context/providers/MessageByIndexProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\nimport {\n checkEventScope,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\n\nexport const MessageByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n const getMessage = () => api.thread().message({ index });\n return {\n message: createAssistantApiField({\n source: \"thread\",\n query: { type: \"index\", index },\n get: () => getMessage(),\n }),\n composer: createAssistantApiField({\n source: \"message\",\n query: {},\n get: () => getMessage().composer,\n }),\n on(selector, callback) {\n const { event, scope } = normalizeEventSelector(selector);\n if (\n !checkEventScope(\"composer\", scope, event) &&\n !checkEventScope(\"message\", scope, event)\n )\n return api.on(selector, callback);\n\n return api.on({ scope: \"thread\", event }, (e) => {\n if (e.messageId === getMessage().getState().id) {\n callback(e);\n }\n });\n },\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AACzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAsCE;AApCF,IAAM,yBAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,UAAM,aAAa,MAAM,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;AACvD,WAAO;AAAA,MACL,SAAS,wBAAwB;AAAA,QAC/B,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,WAAW;AAAA,MACxB,CAAC;AAAA,MACD,UAAU,wBAAwB;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO,CAAC;AAAA,QACR,KAAK,MAAM,WAAW,EAAE;AAAA,MAC1B,CAAC;AAAA,MACD,GAAG,UAAU,UAAU;AACrB,cAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AACxD,YACE,CAAC,gBAAgB,YAAY,OAAO,KAAK,KACzC,CAAC,gBAAgB,WAAW,OAAO,KAAK;AAExC,iBAAO,IAAI,GAAG,UAAU,QAAQ;AAElC,eAAO,IAAI,GAAG,EAAE,OAAO,UAAU,MAAM,GAAG,CAAC,MAAM;AAC/C,cAAI,EAAE,cAAc,WAAW,EAAE,SAAS,EAAE,IAAI;AAC9C,qBAAS,CAAC;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}
@@ -1,5 +1,11 @@
1
1
  import { type FC, type PropsWithChildren } from "react";
2
- export declare const MessageByIndexProvider: FC<PropsWithChildren<{
3
- index: number;
4
- }>>;
2
+ import { ThreadMessage } from "../../types/AssistantTypes";
3
+ type ThreadMessageClientProps = {
4
+ message: ThreadMessage;
5
+ isLast?: boolean;
6
+ branchNumber?: number;
7
+ branchCount?: number;
8
+ };
9
+ export declare const MessageProvider: FC<PropsWithChildren<ThreadMessageClientProps>>;
10
+ export {};
5
11
  //# sourceMappingURL=MessageProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/MessageProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAYjE,eAAO,MAAM,sBAAsB,EAAE,EAAE,CACrC,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAkCH,CAAC"}
1
+ {"version":3,"file":"MessageProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/MessageProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAkBjE,OAAO,EAEL,aAAa,EAEd,MAAM,4BAA4B,CAAC;AA4GpC,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAgGF,eAAO,MAAM,eAAe,EAAE,EAAE,CAC9B,iBAAiB,CAAC,wBAAwB,CAAC,CAgB5C,CAAC"}
@@ -4,44 +4,207 @@
4
4
  import { useMemo } from "react";
5
5
  import {
6
6
  AssistantProvider,
7
- useAssistantApi,
8
7
  createAssistantApiField
9
8
  } from "../react/AssistantApiContext.js";
10
9
  import {
11
- checkEventScope,
12
- normalizeEventSelector
13
- } from "../../types/EventTypes.js";
10
+ resource,
11
+ tapInlineResource,
12
+ tapMemo,
13
+ tapState
14
+ } from "@assistant-ui/tap";
15
+ import { useResource } from "@assistant-ui/tap/react";
16
+ import { asStore, tapApi } from "../../utils/tap-store/index.js";
17
+ import { tapLookupResources } from "../../client/util-hooks/tapLookupResources.js";
14
18
  import { jsx } from "react/jsx-runtime";
15
- var MessageByIndexProvider = ({ index, children }) => {
16
- const api = useAssistantApi();
17
- const api2 = useMemo(() => {
18
- const getMessage = () => api.thread().message({ index });
19
+ var NoOpComposerClient = resource(({ type }) => {
20
+ const state = tapMemo(() => {
21
+ return {
22
+ isEditing: false,
23
+ isEmpty: true,
24
+ text: "",
25
+ attachmentAccept: "*",
26
+ attachments: [],
27
+ role: "user",
28
+ runConfig: {},
29
+ canCancel: false,
30
+ type
31
+ };
32
+ }, [type]);
33
+ return tapApi({
34
+ getState: () => state,
35
+ setText: () => {
36
+ throw new Error("Not supported");
37
+ },
38
+ setRole: () => {
39
+ throw new Error("Not supported");
40
+ },
41
+ setRunConfig: () => {
42
+ throw new Error("Not supported");
43
+ },
44
+ addAttachment: () => {
45
+ throw new Error("Not supported");
46
+ },
47
+ clearAttachments: () => {
48
+ throw new Error("Not supported");
49
+ },
50
+ attachment: () => {
51
+ throw new Error("Not supported");
52
+ },
53
+ reset: () => {
54
+ throw new Error("Not supported");
55
+ },
56
+ send: () => {
57
+ throw new Error("Not supported");
58
+ },
59
+ cancel: () => {
60
+ throw new Error("Not supported");
61
+ },
62
+ beginEdit: () => {
63
+ throw new Error("Not supported");
64
+ },
65
+ __internal_getRuntime: () => null
66
+ });
67
+ });
68
+ var ThreadMessagePartClient = resource(
69
+ ({ part }) => {
70
+ const state = tapMemo(() => {
71
+ return {
72
+ ...part,
73
+ status: { type: "complete" }
74
+ };
75
+ }, [part]);
76
+ return tapApi(
77
+ {
78
+ getState: () => state,
79
+ addToolResult: () => {
80
+ throw new Error("Not supported");
81
+ },
82
+ __internal_getRuntime: () => null
83
+ },
84
+ {
85
+ key: state.type === "tool-call" ? "toolCallId-" + state.toolCallId : void 0
86
+ }
87
+ );
88
+ }
89
+ );
90
+ var ThreadMessageAttachmentClient = resource(
91
+ ({ attachment }) => {
92
+ return tapApi(
93
+ {
94
+ getState: () => attachment,
95
+ remove: () => {
96
+ throw new Error("Not supported");
97
+ },
98
+ __internal_getRuntime: () => null
99
+ },
100
+ {
101
+ key: attachment.id
102
+ }
103
+ );
104
+ }
105
+ );
106
+ var ThreadMessageClient = resource(
107
+ ({
108
+ message,
109
+ isLast = true,
110
+ branchNumber = 1,
111
+ branchCount = 1
112
+ }) => {
113
+ const [isCopiedState, setIsCopied] = tapState(false);
114
+ const [isHoveringState, setIsHovering] = tapState(false);
115
+ const parts = tapLookupResources(
116
+ message.content.map(
117
+ (_, idx) => ThreadMessagePartClient({ part: message.content[idx] }, { key: idx })
118
+ )
119
+ );
120
+ const attachments = tapLookupResources(
121
+ message.attachments?.map(
122
+ (_, idx) => ThreadMessageAttachmentClient(
123
+ { attachment: message.attachments[idx] },
124
+ { key: idx }
125
+ )
126
+ ) ?? []
127
+ );
128
+ const composerState = tapInlineResource(
129
+ NoOpComposerClient({ type: "edit" })
130
+ );
131
+ const state = tapMemo(() => {
132
+ return {
133
+ ...message,
134
+ parts: parts.state,
135
+ composer: composerState.state,
136
+ parentId: null,
137
+ isLast,
138
+ branchNumber,
139
+ branchCount,
140
+ speech: void 0,
141
+ submittedFeedback: void 0,
142
+ isCopied: isCopiedState,
143
+ isHovering: isHoveringState
144
+ };
145
+ }, [message, isCopiedState, isHoveringState, isLast]);
146
+ return tapApi({
147
+ getState: () => state,
148
+ composer: composerState.api,
149
+ part: (selector) => {
150
+ if ("index" in selector) {
151
+ return parts.api({ index: selector.index });
152
+ } else {
153
+ return parts.api({ key: "toolCallId-" + selector.toolCallId });
154
+ }
155
+ },
156
+ attachment: (selector) => {
157
+ if ("id" in selector) {
158
+ return attachments.api({ key: selector.id });
159
+ } else {
160
+ return attachments.api(selector);
161
+ }
162
+ },
163
+ reload: () => {
164
+ throw new Error("Not supported in ThreadMessageProvider");
165
+ },
166
+ speak: () => {
167
+ throw new Error("Not supported in ThreadMessageProvider");
168
+ },
169
+ stopSpeaking: () => {
170
+ throw new Error("Not supported in ThreadMessageProvider");
171
+ },
172
+ submitFeedback: () => {
173
+ throw new Error("Not supported in ThreadMessageProvider");
174
+ },
175
+ switchToBranch: () => {
176
+ throw new Error("Not supported in ThreadMessageProvider");
177
+ },
178
+ getCopyText: () => {
179
+ return message.content.map((part) => {
180
+ if ("text" in part && typeof part.text === "string") {
181
+ return part.text;
182
+ }
183
+ return "";
184
+ }).join("\n");
185
+ },
186
+ setIsCopied,
187
+ setIsHovering,
188
+ __internal_getRuntime: () => null
189
+ });
190
+ }
191
+ );
192
+ var MessageProvider = ({ children, ...props }) => {
193
+ const store = useResource(asStore(ThreadMessageClient(props)));
194
+ const api = useMemo(() => {
19
195
  return {
20
196
  message: createAssistantApiField({
21
- source: "thread",
22
- query: { type: "index", index },
23
- get: () => getMessage()
24
- }),
25
- composer: createAssistantApiField({
26
- source: "message",
197
+ source: "root",
27
198
  query: {},
28
- get: () => getMessage().composer
199
+ get: () => store.getState().api
29
200
  }),
30
- on(selector, callback) {
31
- const { event, scope } = normalizeEventSelector(selector);
32
- if (!checkEventScope("composer", scope, event) && !checkEventScope("message", scope, event))
33
- return api.on(selector, callback);
34
- return api.on({ scope: "thread", event }, (e) => {
35
- if (e.messageId === getMessage().getState().id) {
36
- callback(e);
37
- }
38
- });
39
- }
201
+ subscribe: store.subscribe,
202
+ flushSync: store.flushSync
40
203
  };
41
- }, [api, index]);
42
- return /* @__PURE__ */ jsx(AssistantProvider, { api: api2, children });
204
+ }, [store]);
205
+ return /* @__PURE__ */ jsx(AssistantProvider, { api, children });
43
206
  };
44
207
  export {
45
- MessageByIndexProvider
208
+ MessageProvider
46
209
  };
47
210
  //# sourceMappingURL=MessageProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/providers/MessageProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\nimport {\n checkEventScope,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\n\nexport const MessageByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n const getMessage = () => api.thread().message({ index });\n return {\n message: createAssistantApiField({\n source: \"thread\",\n query: { type: \"index\", index },\n get: () => getMessage(),\n }),\n composer: createAssistantApiField({\n source: \"message\",\n query: {},\n get: () => getMessage().composer,\n }),\n on(selector, callback) {\n const { event, scope } = normalizeEventSelector(selector);\n if (\n !checkEventScope(\"composer\", scope, event) &&\n !checkEventScope(\"message\", scope, event)\n )\n return api.on(selector, callback);\n\n return api.on({ scope: \"thread\", event }, (e) => {\n if (e.messageId === getMessage().getState().id) {\n callback(e);\n }\n });\n },\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AACzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAsCE;AApCF,IAAM,yBAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,UAAM,aAAa,MAAM,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;AACvD,WAAO;AAAA,MACL,SAAS,wBAAwB;AAAA,QAC/B,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,WAAW;AAAA,MACxB,CAAC;AAAA,MACD,UAAU,wBAAwB;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO,CAAC;AAAA,QACR,KAAK,MAAM,WAAW,EAAE;AAAA,MAC1B,CAAC;AAAA,MACD,GAAG,UAAU,UAAU;AACrB,cAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AACxD,YACE,CAAC,gBAAgB,YAAY,OAAO,KAAK,KACzC,CAAC,gBAAgB,WAAW,OAAO,KAAK;AAExC,iBAAO,IAAI,GAAG,UAAU,QAAQ;AAElC,eAAO,IAAI,GAAG,EAAE,OAAO,UAAU,MAAM,GAAG,CAAC,MAAM;AAC/C,cAAI,EAAE,cAAc,WAAW,EAAE,SAAS,EAAE,IAAI;AAC9C,qBAAS,CAAC;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../../src/context/providers/MessageProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport {\n AssistantProvider,\n AssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\nimport {\n MessageClientApi,\n MessageClientState,\n} from \"../../client/types/Message\";\nimport {\n resource,\n tapInlineResource,\n tapMemo,\n tapState,\n} from \"@assistant-ui/tap\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport { asStore, tapApi } from \"../../utils/tap-store\";\nimport {\n ThreadAssistantMessagePart,\n ThreadMessage,\n ThreadUserMessagePart,\n} from \"../../types/AssistantTypes\";\nimport {\n ComposerClientApi,\n ComposerClientState,\n} from \"../../client/types/Composer\";\nimport {\n MessagePartClientApi,\n MessagePartClientState,\n} from \"../../client/types/Part\";\nimport { tapLookupResources } from \"../../client/util-hooks/tapLookupResources\";\nimport { Attachment } from \"../../types\";\nimport { AttachmentClientApi } from \"../../client/types/Attachment\";\n\nconst NoOpComposerClient = resource(({ type }: { type: \"edit\" | \"thread\" }) => {\n const state = tapMemo<ComposerClientState>(() => {\n return {\n isEditing: false,\n isEmpty: true,\n text: \"\",\n attachmentAccept: \"*\",\n attachments: [],\n role: \"user\",\n runConfig: {},\n canCancel: false,\n type: type,\n };\n }, [type]);\n\n return tapApi<ComposerClientApi>({\n getState: () => state,\n setText: () => {\n throw new Error(\"Not supported\");\n },\n setRole: () => {\n throw new Error(\"Not supported\");\n },\n setRunConfig: () => {\n throw new Error(\"Not supported\");\n },\n addAttachment: () => {\n throw new Error(\"Not supported\");\n },\n clearAttachments: () => {\n throw new Error(\"Not supported\");\n },\n attachment: () => {\n throw new Error(\"Not supported\");\n },\n reset: () => {\n throw new Error(\"Not supported\");\n },\n send: () => {\n throw new Error(\"Not supported\");\n },\n cancel: () => {\n throw new Error(\"Not supported\");\n },\n beginEdit: () => {\n throw new Error(\"Not supported\");\n },\n __internal_getRuntime: () => null,\n });\n});\n\nconst ThreadMessagePartClient = resource(\n ({ part }: { part: ThreadAssistantMessagePart | ThreadUserMessagePart }) => {\n const state = tapMemo<MessagePartClientState>(() => {\n return {\n ...part,\n status: { type: \"complete\" },\n };\n }, [part]);\n\n return tapApi<MessagePartClientApi>(\n {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n __internal_getRuntime: () => null,\n },\n {\n key:\n state.type === \"tool-call\"\n ? \"toolCallId-\" + state.toolCallId\n : undefined,\n },\n );\n },\n);\n\nconst ThreadMessageAttachmentClient = resource(\n ({ attachment }: { attachment: Attachment }) => {\n return tapApi<AttachmentClientApi>(\n {\n getState: () => attachment,\n remove: () => {\n throw new Error(\"Not supported\");\n },\n __internal_getRuntime: () => null,\n },\n {\n key: attachment.id,\n },\n );\n },\n);\n\ntype ThreadMessageClientProps = {\n message: ThreadMessage;\n isLast?: boolean;\n branchNumber?: number;\n branchCount?: number;\n};\n\nconst ThreadMessageClient = resource(\n ({\n message,\n isLast = true,\n branchNumber = 1,\n branchCount = 1,\n }: ThreadMessageClientProps) => {\n const [isCopiedState, setIsCopied] = tapState(false);\n const [isHoveringState, setIsHovering] = tapState(false);\n\n const parts = tapLookupResources(\n message.content.map((_, idx) =>\n ThreadMessagePartClient({ part: message.content[idx]! }, { key: idx }),\n ),\n );\n\n const attachments = tapLookupResources(\n message.attachments?.map((_, idx) =>\n ThreadMessageAttachmentClient(\n { attachment: message.attachments![idx]! },\n { key: idx },\n ),\n ) ?? [],\n );\n\n const composerState = tapInlineResource(\n NoOpComposerClient({ type: \"edit\" }),\n );\n\n const state = tapMemo<MessageClientState>(() => {\n return {\n ...message,\n parts: parts.state,\n composer: composerState.state,\n parentId: null,\n isLast,\n branchNumber,\n branchCount,\n speech: undefined,\n submittedFeedback: undefined,\n isCopied: isCopiedState,\n isHovering: isHoveringState,\n };\n }, [message, isCopiedState, isHoveringState, isLast]);\n\n return tapApi<MessageClientApi>({\n getState: () => state,\n composer: composerState.api,\n part: (selector) => {\n if (\"index\" in selector) {\n return parts.api({ index: selector.index });\n } else {\n return parts.api({ key: \"toolCallId-\" + selector.toolCallId });\n }\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachments.api({ key: selector.id });\n } else {\n return attachments.api(selector);\n }\n },\n reload: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n speak: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n stopSpeaking: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n submitFeedback: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n switchToBranch: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n getCopyText: () => {\n return message.content\n .map((part) => {\n if (\"text\" in part && typeof part.text === \"string\") {\n return part.text;\n }\n return \"\";\n })\n .join(\"\\n\");\n },\n setIsCopied,\n setIsHovering,\n __internal_getRuntime: () => null,\n });\n },\n);\n\nexport const MessageProvider: FC<\n PropsWithChildren<ThreadMessageClientProps>\n> = ({ children, ...props }) => {\n const store = useResource(asStore(ThreadMessageClient(props)));\n const api = useMemo(() => {\n return {\n message: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => store.getState().api,\n }),\n subscribe: store.subscribe,\n flushSync: store.flushSync,\n } satisfies Partial<AssistantApi>;\n }, [store]);\n\n return <AssistantProvider api={api}>{children}</AssistantProvider>;\n};\n"],"mappings":"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","names":[]}
@@ -2,4 +2,4 @@ import { type FC, type PropsWithChildren } from "react";
2
2
  export declare const PartByIndexProvider: FC<PropsWithChildren<{
3
3
  index: number;
4
4
  }>>;
5
- //# sourceMappingURL=PartProvider.d.ts.map
5
+ //# sourceMappingURL=PartByIndexProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartByIndexProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/PartByIndexProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAQjE,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAClC,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- // src/context/providers/PartProvider.tsx
3
+ // src/context/providers/PartByIndexProvider.tsx
4
4
  import { useMemo } from "react";
5
5
  import {
6
6
  AssistantProvider,
@@ -24,4 +24,4 @@ var PartByIndexProvider = ({ index, children }) => {
24
24
  export {
25
25
  PartByIndexProvider
26
26
  };
27
- //# sourceMappingURL=PartProvider.js.map
27
+ //# sourceMappingURL=PartByIndexProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/context/providers/PartByIndexProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\n\nexport const PartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n part: createAssistantApiField({\n source: \"message\",\n query: { type: \"index\", index },\n get: () => api.message().part({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AACzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBE;AAhBF,IAAM,sBAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,MAAM,wBAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}
@@ -1,7 +1,8 @@
1
1
  export { AssistantRuntimeProvider } from "../../legacy-runtime/AssistantRuntimeProvider";
2
2
  export { ThreadListItemByIndexProvider, ThreadListItemByIdProvider, } from "./ThreadListItemProvider";
3
- export { MessageByIndexProvider } from "./MessageProvider";
4
- export { PartByIndexProvider } from "./PartProvider";
5
- export { MessageAttachmentByIndexProvider, ComposerAttachmentByIndexProvider, } from "./AttachmentProvider";
3
+ export { MessageByIndexProvider } from "./MessageByIndexProvider";
4
+ export { PartByIndexProvider } from "./PartByIndexProvider";
5
+ export { MessageAttachmentByIndexProvider, ComposerAttachmentByIndexProvider, } from "./AttachmentByIndexProvider";
6
6
  export { TextMessagePartProvider } from "./TextMessagePartProvider";
7
+ export { MessageProvider } from "./MessageProvider";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -4,18 +4,20 @@ import {
4
4
  ThreadListItemByIndexProvider,
5
5
  ThreadListItemByIdProvider
6
6
  } from "./ThreadListItemProvider.js";
7
- import { MessageByIndexProvider } from "./MessageProvider.js";
8
- import { PartByIndexProvider } from "./PartProvider.js";
7
+ import { MessageByIndexProvider } from "./MessageByIndexProvider.js";
8
+ import { PartByIndexProvider } from "./PartByIndexProvider.js";
9
9
  import {
10
10
  MessageAttachmentByIndexProvider,
11
11
  ComposerAttachmentByIndexProvider
12
- } from "./AttachmentProvider.js";
12
+ } from "./AttachmentByIndexProvider.js";
13
13
  import { TextMessagePartProvider } from "./TextMessagePartProvider.js";
14
+ import { MessageProvider } from "./MessageProvider.js";
14
15
  export {
15
16
  AssistantRuntimeProvider,
16
17
  ComposerAttachmentByIndexProvider,
17
18
  MessageAttachmentByIndexProvider,
18
19
  MessageByIndexProvider,
20
+ MessageProvider,
19
21
  PartByIndexProvider,
20
22
  TextMessagePartProvider,
21
23
  ThreadListItemByIdProvider,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/providers/index.ts"],"sourcesContent":["export { AssistantRuntimeProvider } from \"../../legacy-runtime/AssistantRuntimeProvider\";\nexport {\n ThreadListItemByIndexProvider,\n ThreadListItemByIdProvider,\n} from \"./ThreadListItemProvider\";\nexport { MessageByIndexProvider } from \"./MessageProvider\";\nexport { PartByIndexProvider } from \"./PartProvider\";\nexport {\n MessageAttachmentByIndexProvider,\n ComposerAttachmentByIndexProvider,\n} from \"./AttachmentProvider\";\nexport { TextMessagePartProvider } from \"./TextMessagePartProvider\";\n"],"mappings":";AAAA,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,+BAA+B;","names":[]}
1
+ {"version":3,"sources":["../../../src/context/providers/index.ts"],"sourcesContent":["export { AssistantRuntimeProvider } from \"../../legacy-runtime/AssistantRuntimeProvider\";\nexport {\n ThreadListItemByIndexProvider,\n ThreadListItemByIdProvider,\n} from \"./ThreadListItemProvider\";\nexport { MessageByIndexProvider } from \"./MessageByIndexProvider\";\nexport { PartByIndexProvider } from \"./PartByIndexProvider\";\nexport {\n MessageAttachmentByIndexProvider,\n ComposerAttachmentByIndexProvider,\n} from \"./AttachmentByIndexProvider\";\nexport { TextMessagePartProvider } from \"./TextMessagePartProvider\";\nexport { MessageProvider } from \"./MessageProvider\";\n"],"mappings":";AAAA,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;","names":[]}
@@ -60,6 +60,9 @@ type MessageMeta = {
60
60
  type: "index";
61
61
  index: number;
62
62
  };
63
+ } | {
64
+ source: "root";
65
+ query: Record<string, never>;
63
66
  };
64
67
  type PartMeta = {
65
68
  source: "message" | "root";
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantApiContext.d.ts","sourceRoot":"","sources":["../../../src/context/react/AssistantApiContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantApiContext.d.ts","sourceRoot":"","sources":["../../../src/context/react/AssistantApiContext.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/react/AssistantApiContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n FC,\n PropsWithChildren,\n useContext,\n useMemo,\n} from \"react\";\n\nimport { ToolUIApi, ToolUIState, ToolUIMeta } from \"../../client/types/ToolUI\";\nimport {\n MessageClientApi,\n MessageClientState,\n} from \"../../client/types/Message\";\nimport {\n ThreadListItemClientApi,\n ThreadListItemClientState,\n} from \"../../client/types/ThreadListItem\";\nimport {\n MessagePartClientApi,\n MessagePartClientState,\n} from \"../../client/types/Part\";\nimport { ThreadClientApi, ThreadClientState } from \"../../client/types/Thread\";\nimport {\n ComposerClientApi,\n ComposerClientState,\n} from \"../../client/types/Composer\";\nimport {\n AttachmentClientApi,\n AttachmentClientState,\n} from \"../../client/types/Attachment\";\nimport { Unsubscribe } from \"@assistant-ui/tap\";\nimport { ModelContextProvider } from \"../../model-context\";\nimport { AssistantRuntime } from \"../../legacy-runtime/runtime/AssistantRuntime\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n AssistantEventSelector,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\nimport {\n ThreadListClientApi,\n ThreadListClientState,\n} from \"../../client/types/ThreadList\";\nimport { ThreadViewportProvider } from \"../providers/ThreadViewportProvider\";\n\nexport type AssistantState = {\n readonly threads: ThreadListClientState;\n readonly toolUIs: ToolUIState;\n\n readonly threadListItem: ThreadListItemClientState;\n readonly thread: ThreadClientState;\n readonly composer: ComposerClientState;\n readonly message: MessageClientState;\n readonly part: MessagePartClientState;\n readonly attachment: AttachmentClientState;\n};\n\ntype AssistantApiField<\n TApi,\n TMeta extends { source: string | null; query: any },\n> = (() => TApi) & (TMeta | { source: null; query: Record<string, never> });\n\n// Meta types for each API method\ntype ThreadsMeta = {\n source: \"root\";\n query: Record<string, never>;\n};\n\ntype ThreadListItemMeta = {\n source: \"threads\";\n query:\n | { type: \"index\"; index: number; archived: boolean }\n | { type: \"main\" }\n | { type: \"id\"; id: string };\n};\n\ntype ThreadMeta = {\n source: \"threads\";\n query: { type: \"main\" };\n};\n\ntype ComposerMeta = {\n source: \"message\" | \"thread\";\n query: Record<string, never>;\n};\n\ntype MessageMeta = {\n source: \"thread\";\n query: { type: \"index\"; index: number };\n};\n\ntype PartMeta = {\n source: \"message\" | \"root\";\n query: { type: \"index\"; index: number } | Record<string, never>;\n};\n\ntype AttachmentMeta = {\n source: \"message\" | \"composer\";\n query: { type: \"index\"; index: number };\n};\n\nexport type AssistantApi = {\n threads: AssistantApiField<ThreadListClientApi, ThreadsMeta>;\n toolUIs: AssistantApiField<ToolUIApi, ToolUIMeta>;\n threadListItem: AssistantApiField<\n ThreadListItemClientApi,\n ThreadListItemMeta\n >;\n thread: AssistantApiField<ThreadClientApi, ThreadMeta>;\n composer: AssistantApiField<ComposerClientApi, ComposerMeta>;\n message: AssistantApiField<MessageClientApi, MessageMeta>;\n part: AssistantApiField<MessagePartClientApi, PartMeta>;\n attachment: AssistantApiField<AttachmentClientApi, AttachmentMeta>;\n\n subscribe(listener: () => void): Unsubscribe;\n flushSync(): void;\n\n on<TEvent extends AssistantEvent>(\n event: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n\n // temp\n registerModelContextProvider(provider: ModelContextProvider): void;\n /** @internal */\n __internal_getRuntime(): AssistantRuntime | null;\n};\n\nexport const createAssistantApiField = <\n TApi,\n TMeta extends { source: any; query: any },\n>(\n config: {\n get: () => TApi;\n } & (TMeta | { source: null; query: Record<string, never> }),\n): AssistantApiField<TApi, TMeta> => {\n const fn = config.get as AssistantApiField<TApi, TMeta>;\n fn.source = config.source;\n fn.query = config.query;\n return fn;\n};\n\nconst NO_OP_FN = () => () => {};\n\nconst AssistantApiContext = createContext<AssistantApi>({\n threads: createAssistantApiField({\n source: null,\n query: {},\n get: () => {\n throw new Error(\"Threads is only available inside <AssistantProvider />\");\n },\n }),\n toolUIs: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"ToolUIs is only available inside <AssistantProvider />\");\n },\n }),\n threadListItem: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ThreadListItem is only available inside <AssistantProvider />\",\n );\n },\n }),\n thread: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Thread is only available inside <AssistantProvider />\");\n },\n }),\n composer: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Composer is only available inside <AssistantProvider />\",\n );\n },\n }),\n message: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Message is only available inside <ThreadPrimitive.Messages />\",\n );\n },\n }),\n part: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Part is only available inside <MessagePrimitive.Parts />\",\n );\n },\n }),\n attachment: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Attachment is only available inside <MessagePrimitive.Attachments /> or <ComposerPrimitive.Attachments />\",\n );\n },\n }),\n\n subscribe: NO_OP_FN,\n flushSync: NO_OP_FN,\n on: (selector) => {\n const { scope } = normalizeEventSelector(selector);\n throw new Error(`Event scope is not available in this component: ${scope}`);\n },\n\n registerModelContextProvider: () => {\n throw new Error(\n \"Registering model context providers is only available inside <AssistantProvider />\",\n );\n },\n __internal_getRuntime: () => {\n return null;\n },\n});\n\nexport const useAssistantApi = (): AssistantApi => {\n return useContext(AssistantApiContext);\n};\n\nconst mergeFns = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => void,\n fn2: (...args: TArgs) => void,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n fn1(...args);\n fn2(...args);\n };\n};\n\nconst mergeFnsWithUnsubscribe = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => Unsubscribe,\n fn2: (...args: TArgs) => Unsubscribe,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n const unsubscribe1 = fn1(...args);\n const unsubscribe2 = fn2(...args);\n\n return () => {\n unsubscribe1();\n unsubscribe2();\n };\n };\n};\n\nconst extendApi = (\n api: AssistantApi,\n api2: Partial<AssistantApi>,\n): AssistantApi => {\n const api2Subscribe = api2.subscribe;\n const api2FlushSync = api2.flushSync;\n return {\n ...api,\n ...api2,\n subscribe: mergeFnsWithUnsubscribe(\n api.subscribe,\n api2Subscribe ?? NO_OP_FN,\n ),\n flushSync: mergeFns(api.flushSync, api2FlushSync ?? NO_OP_FN),\n };\n};\n\nexport const AssistantProvider: FC<\n PropsWithChildren<{ api: Partial<AssistantApi> }>\n> = ({ api: api2, children }) => {\n const api = useAssistantApi();\n const extendedApi = useMemo(() => extendApi(api, api2), [api, api2]);\n\n return (\n <AssistantApiContext.Provider value={extendedApi}>\n {/* TODO temporarily allow accessing viewport state from outside the viewport */}\n {/* TODO figure out if this behavior should be deprecated, since it is quite hacky */}\n <ThreadViewportProvider>{children}</ThreadViewportProvider>\n </AssistantApiContext.Provider>\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/context/react/AssistantApiContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n FC,\n PropsWithChildren,\n useContext,\n useMemo,\n} from \"react\";\n\nimport { ToolUIApi, ToolUIState, ToolUIMeta } from \"../../client/types/ToolUI\";\nimport {\n MessageClientApi,\n MessageClientState,\n} from \"../../client/types/Message\";\nimport {\n ThreadListItemClientApi,\n ThreadListItemClientState,\n} from \"../../client/types/ThreadListItem\";\nimport {\n MessagePartClientApi,\n MessagePartClientState,\n} from \"../../client/types/Part\";\nimport { ThreadClientApi, ThreadClientState } from \"../../client/types/Thread\";\nimport {\n ComposerClientApi,\n ComposerClientState,\n} from \"../../client/types/Composer\";\nimport {\n AttachmentClientApi,\n AttachmentClientState,\n} from \"../../client/types/Attachment\";\nimport { Unsubscribe } from \"@assistant-ui/tap\";\nimport { ModelContextProvider } from \"../../model-context\";\nimport { AssistantRuntime } from \"../../legacy-runtime/runtime/AssistantRuntime\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n AssistantEventSelector,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\nimport {\n ThreadListClientApi,\n ThreadListClientState,\n} from \"../../client/types/ThreadList\";\nimport { ThreadViewportProvider } from \"../providers/ThreadViewportProvider\";\n\nexport type AssistantState = {\n readonly threads: ThreadListClientState;\n readonly toolUIs: ToolUIState;\n\n readonly threadListItem: ThreadListItemClientState;\n readonly thread: ThreadClientState;\n readonly composer: ComposerClientState;\n readonly message: MessageClientState;\n readonly part: MessagePartClientState;\n readonly attachment: AttachmentClientState;\n};\n\ntype AssistantApiField<\n TApi,\n TMeta extends { source: string | null; query: any },\n> = (() => TApi) & (TMeta | { source: null; query: Record<string, never> });\n\n// Meta types for each API method\ntype ThreadsMeta = {\n source: \"root\";\n query: Record<string, never>;\n};\n\ntype ThreadListItemMeta = {\n source: \"threads\";\n query:\n | { type: \"index\"; index: number; archived: boolean }\n | { type: \"main\" }\n | { type: \"id\"; id: string };\n};\n\ntype ThreadMeta = {\n source: \"threads\";\n query: { type: \"main\" };\n};\n\ntype ComposerMeta = {\n source: \"message\" | \"thread\";\n query: Record<string, never>;\n};\n\ntype MessageMeta =\n | {\n source: \"thread\";\n query: { type: \"index\"; index: number };\n }\n | {\n source: \"root\";\n query: Record<string, never>;\n };\n\ntype PartMeta = {\n source: \"message\" | \"root\";\n query: { type: \"index\"; index: number } | Record<string, never>;\n};\n\ntype AttachmentMeta = {\n source: \"message\" | \"composer\";\n query: { type: \"index\"; index: number };\n};\n\nexport type AssistantApi = {\n threads: AssistantApiField<ThreadListClientApi, ThreadsMeta>;\n toolUIs: AssistantApiField<ToolUIApi, ToolUIMeta>;\n threadListItem: AssistantApiField<\n ThreadListItemClientApi,\n ThreadListItemMeta\n >;\n thread: AssistantApiField<ThreadClientApi, ThreadMeta>;\n composer: AssistantApiField<ComposerClientApi, ComposerMeta>;\n message: AssistantApiField<MessageClientApi, MessageMeta>;\n part: AssistantApiField<MessagePartClientApi, PartMeta>;\n attachment: AssistantApiField<AttachmentClientApi, AttachmentMeta>;\n\n subscribe(listener: () => void): Unsubscribe;\n flushSync(): void;\n\n on<TEvent extends AssistantEvent>(\n event: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n\n // temp\n registerModelContextProvider(provider: ModelContextProvider): void;\n /** @internal */\n __internal_getRuntime(): AssistantRuntime | null;\n};\n\nexport const createAssistantApiField = <\n TApi,\n TMeta extends { source: any; query: any },\n>(\n config: {\n get: () => TApi;\n } & (TMeta | { source: null; query: Record<string, never> }),\n): AssistantApiField<TApi, TMeta> => {\n const fn = config.get as AssistantApiField<TApi, TMeta>;\n fn.source = config.source;\n fn.query = config.query;\n return fn;\n};\n\nconst NO_OP_FN = () => () => {};\n\nconst AssistantApiContext = createContext<AssistantApi>({\n threads: createAssistantApiField({\n source: null,\n query: {},\n get: () => {\n throw new Error(\"Threads is only available inside <AssistantProvider />\");\n },\n }),\n toolUIs: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"ToolUIs is only available inside <AssistantProvider />\");\n },\n }),\n threadListItem: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ThreadListItem is only available inside <AssistantProvider />\",\n );\n },\n }),\n thread: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Thread is only available inside <AssistantProvider />\");\n },\n }),\n composer: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Composer is only available inside <AssistantProvider />\",\n );\n },\n }),\n message: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Message is only available inside <ThreadPrimitive.Messages />\",\n );\n },\n }),\n part: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Part is only available inside <MessagePrimitive.Parts />\",\n );\n },\n }),\n attachment: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Attachment is only available inside <MessagePrimitive.Attachments /> or <ComposerPrimitive.Attachments />\",\n );\n },\n }),\n\n subscribe: NO_OP_FN,\n flushSync: NO_OP_FN,\n on: (selector) => {\n const { scope } = normalizeEventSelector(selector);\n throw new Error(`Event scope is not available in this component: ${scope}`);\n },\n\n registerModelContextProvider: () => {\n throw new Error(\n \"Registering model context providers is only available inside <AssistantProvider />\",\n );\n },\n __internal_getRuntime: () => {\n return null;\n },\n});\n\nexport const useAssistantApi = (): AssistantApi => {\n return useContext(AssistantApiContext);\n};\n\nconst mergeFns = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => void,\n fn2: (...args: TArgs) => void,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n fn1(...args);\n fn2(...args);\n };\n};\n\nconst mergeFnsWithUnsubscribe = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => Unsubscribe,\n fn2: (...args: TArgs) => Unsubscribe,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n const unsubscribe1 = fn1(...args);\n const unsubscribe2 = fn2(...args);\n\n return () => {\n unsubscribe1();\n unsubscribe2();\n };\n };\n};\n\nconst extendApi = (\n api: AssistantApi,\n api2: Partial<AssistantApi>,\n): AssistantApi => {\n const api2Subscribe = api2.subscribe;\n const api2FlushSync = api2.flushSync;\n return {\n ...api,\n ...api2,\n subscribe: mergeFnsWithUnsubscribe(\n api.subscribe,\n api2Subscribe ?? NO_OP_FN,\n ),\n flushSync: mergeFns(api.flushSync, api2FlushSync ?? NO_OP_FN),\n };\n};\n\nexport const AssistantProvider: FC<\n PropsWithChildren<{ api: Partial<AssistantApi> }>\n> = ({ api: api2, children }) => {\n const api = useAssistantApi();\n const extendedApi = useMemo(() => extendApi(api, api2), [api, api2]);\n\n return (\n <AssistantApiContext.Provider value={extendedApi}>\n {/* TODO temporarily allow accessing viewport state from outside the viewport */}\n {/* TODO figure out if this behavior should be deprecated, since it is quite hacky */}\n <ThreadViewportProvider>{children}</ThreadViewportProvider>\n </AssistantApiContext.Provider>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantTransportRuntime.d.ts","sourceRoot":"","sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAQlE,OAAO,EACL,yBAAyB,EAK1B,MAAM,SAAS,CAAC;AA2MjB;;GAEG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,EAC5C,SAAS,yBAAyB,CAAC,CAAC,CAAC,KACpC,gBAQF,CAAC"}
1
+ {"version":3,"file":"useAssistantTransportRuntime.d.ts","sourceRoot":"","sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAQlE,OAAO,EACL,yBAAyB,EAK1B,MAAM,SAAS,CAAC;AAmNjB;;GAEG;AACH,eAAO,MAAM,4BAA4B,GAAI,CAAC,EAC5C,SAAS,yBAAyB,CAAC,CAAC,CAAC,KACpC,gBAQF,CAAC"}
@@ -58,12 +58,16 @@ var useAssistantTransportThreadRuntime = (options) => {
58
58
  if (!response.body) {
59
59
  throw new Error("Response body is null");
60
60
  }
61
+ let err;
61
62
  const stream = response.body.pipeThrough(new DataStreamDecoder()).pipeThrough(
62
63
  new AssistantMessageAccumulator({
63
64
  initialMessage: createInitialMessage({
64
65
  unstable_state: agentStateRef.current ?? null
65
66
  }),
66
- throttle: isResume
67
+ throttle: isResume,
68
+ onError: (error) => {
69
+ err = error;
70
+ }
67
71
  })
68
72
  );
69
73
  let markedDelivered = false;
@@ -76,6 +80,9 @@ var useAssistantTransportThreadRuntime = (options) => {
76
80
  agentStateRef.current = chunk.metadata.unstable_state;
77
81
  rerender((prev) => prev + 1);
78
82
  }
83
+ if (err) {
84
+ throw new Error(err);
85
+ }
79
86
  },
80
87
  onFinish: options.onFinish,
81
88
  onCancel: () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { AppendMessage } from \"../../../types\";\nimport { useExternalStoreRuntime } from \"../external-store/useExternalStoreRuntime\";\nimport { AssistantRuntime } from \"../../runtime/AssistantRuntime\";\nimport { AddToolResultOptions } from \"../core\";\nimport { useState, useRef, useMemo } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n unstable_createInitialMessage as createInitialMessage,\n} from \"assistant-stream\";\nimport {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport { useToolInvocations } from \"./useToolInvocations\";\nimport { toAISDKTools, getEnabledTools, createRequestHeaders } from \"./utils\";\nimport { useRemoteThreadListRuntime } from \"../remote-thread-list/useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"../remote-thread-list/adapter/in-memory\";\n\nconst useAssistantTransportThreadRuntime = <T,>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume)\n throw new Error(\"No commands to send\");\n\n const headers = await createRequestHeaders(options.headers);\n const context = runtime.thread.getModelContext();\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n commands,\n state: agentStateRef.current,\n system: context.system,\n tools: context.tools\n ? toAISDKTools(getEnabledTools(context.tools))\n : undefined,\n ...context.callSettings,\n ...context.config,\n ...options.body,\n }),\n signal,\n },\n );\n\n options.onResponse?.(response);\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const stream = response.body\n .pipeThrough(new DataStreamDecoder())\n .pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n\n commandQueue.reset();\n },\n onError: (error) => {\n const cmds = [...commandQueue.state.inTransit];\n options.onError?.(error as Error, {\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n commandQueue.markDelivered();\n },\n });\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n adapters: options.adapters,\n onNew: async (message: AppendMessage): Promise<void> => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n // Convert AppendMessage to AddMessageCommand\n const parts: UserMessagePart[] = [];\n\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n const command: AddMessageCommand = {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n };\n\n commandQueue.enqueue(command);\n },\n onCancel: async () => {\n runManager.cancel();\n toolInvocations.abort();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n toolInvocations.reset();\n rerender((prev) => prev + 1);\n },\n });\n\n const toolInvocations = useToolInvocations({\n state: converted,\n getTools: () => runtime.thread.getModelContext().tools,\n onResult: commandQueue.enqueue,\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T,>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n });\n return runtime;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { AppendMessage } from \"../../../types\";\nimport { useExternalStoreRuntime } from \"../external-store/useExternalStoreRuntime\";\nimport { AssistantRuntime } from \"../../runtime/AssistantRuntime\";\nimport { AddToolResultOptions } from \"../core\";\nimport { useState, useRef, useMemo } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n unstable_createInitialMessage as createInitialMessage,\n} from \"assistant-stream\";\nimport {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport { useToolInvocations } from \"./useToolInvocations\";\nimport { toAISDKTools, getEnabledTools, createRequestHeaders } from \"./utils\";\nimport { useRemoteThreadListRuntime } from \"../remote-thread-list/useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"../remote-thread-list/adapter/in-memory\";\n\nconst useAssistantTransportThreadRuntime = <T,>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume)\n throw new Error(\"No commands to send\");\n\n const headers = await createRequestHeaders(options.headers);\n const context = runtime.thread.getModelContext();\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n commands,\n state: agentStateRef.current,\n system: context.system,\n tools: context.tools\n ? toAISDKTools(getEnabledTools(context.tools))\n : undefined,\n ...context.callSettings,\n ...context.config,\n ...options.body,\n }),\n signal,\n },\n );\n\n options.onResponse?.(response);\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n let err: string | undefined;\n const stream = response.body\n .pipeThrough(new DataStreamDecoder())\n .pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n\n commandQueue.reset();\n },\n onError: (error) => {\n const cmds = [...commandQueue.state.inTransit];\n options.onError?.(error as Error, {\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n commandQueue.markDelivered();\n },\n });\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n adapters: options.adapters,\n onNew: async (message: AppendMessage): Promise<void> => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n // Convert AppendMessage to AddMessageCommand\n const parts: UserMessagePart[] = [];\n\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n const command: AddMessageCommand = {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n };\n\n commandQueue.enqueue(command);\n },\n onCancel: async () => {\n runManager.cancel();\n toolInvocations.abort();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n toolInvocations.reset();\n rerender((prev) => prev + 1);\n },\n });\n\n const toolInvocations = useToolInvocations({\n state: converted,\n getTools: () => runtime.thread.getModelContext().tools,\n onResult: commandQueue.enqueue,\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T,>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n });\n return runtime;\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -28,7 +28,7 @@
28
28
  "conversational-ui",
29
29
  "conversational-ai"
30
30
  ],
31
- "version": "0.11.14",
31
+ "version": "0.11.16",
32
32
  "license": "MIT",
33
33
  "type": "module",
34
34
  "exports": {
@@ -59,7 +59,7 @@
59
59
  "@radix-ui/react-use-callback-ref": "^1.1.1",
60
60
  "@radix-ui/react-use-escape-keydown": "^1.1.1",
61
61
  "@standard-schema/spec": "^1.0.0",
62
- "assistant-stream": "^0.2.28",
62
+ "assistant-stream": "^0.2.29",
63
63
  "json-schema": "^0.4.0",
64
64
  "nanoid": "5.1.5",
65
65
  "react-textarea-autosize": "^8.5.9",
@@ -0,0 +1,52 @@
1
+ "use client";
2
+
3
+ import { useMemo, type FC, type PropsWithChildren } from "react";
4
+ import {
5
+ AssistantApi,
6
+ AssistantProvider,
7
+ useAssistantApi,
8
+ createAssistantApiField,
9
+ } from "../react/AssistantApiContext";
10
+ import {
11
+ checkEventScope,
12
+ normalizeEventSelector,
13
+ } from "../../types/EventTypes";
14
+
15
+ export const MessageByIndexProvider: FC<
16
+ PropsWithChildren<{
17
+ index: number;
18
+ }>
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);
41
+
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]);
50
+
51
+ return <AssistantProvider api={api2}>{children}</AssistantProvider>;
52
+ };
@@ -2,51 +2,250 @@
2
2
 
3
3
  import { useMemo, type FC, type PropsWithChildren } from "react";
4
4
  import {
5
- AssistantApi,
6
5
  AssistantProvider,
7
- useAssistantApi,
6
+ AssistantApi,
8
7
  createAssistantApiField,
9
8
  } from "../react/AssistantApiContext";
10
9
  import {
11
- checkEventScope,
12
- normalizeEventSelector,
13
- } from "../../types/EventTypes";
14
-
15
- export const MessageByIndexProvider: FC<
16
- PropsWithChildren<{
17
- index: number;
18
- }>
19
- > = ({ index, children }) => {
20
- const api = useAssistantApi();
21
- const api2 = useMemo(() => {
22
- const getMessage = () => api.thread().message({ index });
10
+ MessageClientApi,
11
+ MessageClientState,
12
+ } from "../../client/types/Message";
13
+ import {
14
+ resource,
15
+ tapInlineResource,
16
+ tapMemo,
17
+ tapState,
18
+ } from "@assistant-ui/tap";
19
+ import { useResource } from "@assistant-ui/tap/react";
20
+ import { asStore, tapApi } from "../../utils/tap-store";
21
+ import {
22
+ ThreadAssistantMessagePart,
23
+ ThreadMessage,
24
+ ThreadUserMessagePart,
25
+ } from "../../types/AssistantTypes";
26
+ import {
27
+ ComposerClientApi,
28
+ ComposerClientState,
29
+ } from "../../client/types/Composer";
30
+ import {
31
+ MessagePartClientApi,
32
+ MessagePartClientState,
33
+ } from "../../client/types/Part";
34
+ import { tapLookupResources } from "../../client/util-hooks/tapLookupResources";
35
+ import { Attachment } from "../../types";
36
+ import { AttachmentClientApi } from "../../client/types/Attachment";
37
+
38
+ const NoOpComposerClient = resource(({ type }: { type: "edit" | "thread" }) => {
39
+ const state = tapMemo<ComposerClientState>(() => {
40
+ return {
41
+ isEditing: false,
42
+ isEmpty: true,
43
+ text: "",
44
+ attachmentAccept: "*",
45
+ attachments: [],
46
+ role: "user",
47
+ runConfig: {},
48
+ canCancel: false,
49
+ type: type,
50
+ };
51
+ }, [type]);
52
+
53
+ return tapApi<ComposerClientApi>({
54
+ getState: () => state,
55
+ setText: () => {
56
+ throw new Error("Not supported");
57
+ },
58
+ setRole: () => {
59
+ throw new Error("Not supported");
60
+ },
61
+ setRunConfig: () => {
62
+ throw new Error("Not supported");
63
+ },
64
+ addAttachment: () => {
65
+ throw new Error("Not supported");
66
+ },
67
+ clearAttachments: () => {
68
+ throw new Error("Not supported");
69
+ },
70
+ attachment: () => {
71
+ throw new Error("Not supported");
72
+ },
73
+ reset: () => {
74
+ throw new Error("Not supported");
75
+ },
76
+ send: () => {
77
+ throw new Error("Not supported");
78
+ },
79
+ cancel: () => {
80
+ throw new Error("Not supported");
81
+ },
82
+ beginEdit: () => {
83
+ throw new Error("Not supported");
84
+ },
85
+ __internal_getRuntime: () => null,
86
+ });
87
+ });
88
+
89
+ const ThreadMessagePartClient = resource(
90
+ ({ part }: { part: ThreadAssistantMessagePart | ThreadUserMessagePart }) => {
91
+ const state = tapMemo<MessagePartClientState>(() => {
92
+ return {
93
+ ...part,
94
+ status: { type: "complete" },
95
+ };
96
+ }, [part]);
97
+
98
+ return tapApi<MessagePartClientApi>(
99
+ {
100
+ getState: () => state,
101
+ addToolResult: () => {
102
+ throw new Error("Not supported");
103
+ },
104
+ __internal_getRuntime: () => null,
105
+ },
106
+ {
107
+ key:
108
+ state.type === "tool-call"
109
+ ? "toolCallId-" + state.toolCallId
110
+ : undefined,
111
+ },
112
+ );
113
+ },
114
+ );
115
+
116
+ const ThreadMessageAttachmentClient = resource(
117
+ ({ attachment }: { attachment: Attachment }) => {
118
+ return tapApi<AttachmentClientApi>(
119
+ {
120
+ getState: () => attachment,
121
+ remove: () => {
122
+ throw new Error("Not supported");
123
+ },
124
+ __internal_getRuntime: () => null,
125
+ },
126
+ {
127
+ key: attachment.id,
128
+ },
129
+ );
130
+ },
131
+ );
132
+
133
+ type ThreadMessageClientProps = {
134
+ message: ThreadMessage;
135
+ isLast?: boolean;
136
+ branchNumber?: number;
137
+ branchCount?: number;
138
+ };
139
+
140
+ const ThreadMessageClient = resource(
141
+ ({
142
+ message,
143
+ isLast = true,
144
+ branchNumber = 1,
145
+ branchCount = 1,
146
+ }: ThreadMessageClientProps) => {
147
+ const [isCopiedState, setIsCopied] = tapState(false);
148
+ const [isHoveringState, setIsHovering] = tapState(false);
149
+
150
+ const parts = tapLookupResources(
151
+ message.content.map((_, idx) =>
152
+ ThreadMessagePartClient({ part: message.content[idx]! }, { key: idx }),
153
+ ),
154
+ );
155
+
156
+ const attachments = tapLookupResources(
157
+ message.attachments?.map((_, idx) =>
158
+ ThreadMessageAttachmentClient(
159
+ { attachment: message.attachments![idx]! },
160
+ { key: idx },
161
+ ),
162
+ ) ?? [],
163
+ );
164
+
165
+ const composerState = tapInlineResource(
166
+ NoOpComposerClient({ type: "edit" }),
167
+ );
168
+
169
+ const state = tapMemo<MessageClientState>(() => {
170
+ return {
171
+ ...message,
172
+ parts: parts.state,
173
+ composer: composerState.state,
174
+ parentId: null,
175
+ isLast,
176
+ branchNumber,
177
+ branchCount,
178
+ speech: undefined,
179
+ submittedFeedback: undefined,
180
+ isCopied: isCopiedState,
181
+ isHovering: isHoveringState,
182
+ };
183
+ }, [message, isCopiedState, isHoveringState, isLast]);
184
+
185
+ return tapApi<MessageClientApi>({
186
+ getState: () => state,
187
+ composer: composerState.api,
188
+ part: (selector) => {
189
+ if ("index" in selector) {
190
+ return parts.api({ index: selector.index });
191
+ } else {
192
+ return parts.api({ key: "toolCallId-" + selector.toolCallId });
193
+ }
194
+ },
195
+ attachment: (selector) => {
196
+ if ("id" in selector) {
197
+ return attachments.api({ key: selector.id });
198
+ } else {
199
+ return attachments.api(selector);
200
+ }
201
+ },
202
+ reload: () => {
203
+ throw new Error("Not supported in ThreadMessageProvider");
204
+ },
205
+ speak: () => {
206
+ throw new Error("Not supported in ThreadMessageProvider");
207
+ },
208
+ stopSpeaking: () => {
209
+ throw new Error("Not supported in ThreadMessageProvider");
210
+ },
211
+ submitFeedback: () => {
212
+ throw new Error("Not supported in ThreadMessageProvider");
213
+ },
214
+ switchToBranch: () => {
215
+ throw new Error("Not supported in ThreadMessageProvider");
216
+ },
217
+ getCopyText: () => {
218
+ return message.content
219
+ .map((part) => {
220
+ if ("text" in part && typeof part.text === "string") {
221
+ return part.text;
222
+ }
223
+ return "";
224
+ })
225
+ .join("\n");
226
+ },
227
+ setIsCopied,
228
+ setIsHovering,
229
+ __internal_getRuntime: () => null,
230
+ });
231
+ },
232
+ );
233
+
234
+ export const MessageProvider: FC<
235
+ PropsWithChildren<ThreadMessageClientProps>
236
+ > = ({ children, ...props }) => {
237
+ const store = useResource(asStore(ThreadMessageClient(props)));
238
+ const api = useMemo(() => {
23
239
  return {
24
240
  message: createAssistantApiField({
25
- source: "thread",
26
- query: { type: "index", index },
27
- get: () => getMessage(),
28
- }),
29
- composer: createAssistantApiField({
30
- source: "message",
241
+ source: "root",
31
242
  query: {},
32
- get: () => getMessage().composer,
243
+ get: () => store.getState().api,
33
244
  }),
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);
41
-
42
- return api.on({ scope: "thread", event }, (e) => {
43
- if (e.messageId === getMessage().getState().id) {
44
- callback(e);
45
- }
46
- });
47
- },
245
+ subscribe: store.subscribe,
246
+ flushSync: store.flushSync,
48
247
  } satisfies Partial<AssistantApi>;
49
- }, [api, index]);
248
+ }, [store]);
50
249
 
51
- return <AssistantProvider api={api2}>{children}</AssistantProvider>;
250
+ return <AssistantProvider api={api}>{children}</AssistantProvider>;
52
251
  };
@@ -3,10 +3,11 @@ export {
3
3
  ThreadListItemByIndexProvider,
4
4
  ThreadListItemByIdProvider,
5
5
  } from "./ThreadListItemProvider";
6
- export { MessageByIndexProvider } from "./MessageProvider";
7
- export { PartByIndexProvider } from "./PartProvider";
6
+ export { MessageByIndexProvider } from "./MessageByIndexProvider";
7
+ export { PartByIndexProvider } from "./PartByIndexProvider";
8
8
  export {
9
9
  MessageAttachmentByIndexProvider,
10
10
  ComposerAttachmentByIndexProvider,
11
- } from "./AttachmentProvider";
11
+ } from "./AttachmentByIndexProvider";
12
12
  export { TextMessagePartProvider } from "./TextMessagePartProvider";
13
+ export { MessageProvider } from "./MessageProvider";
@@ -86,10 +86,15 @@ type ComposerMeta = {
86
86
  query: Record<string, never>;
87
87
  };
88
88
 
89
- type MessageMeta = {
90
- source: "thread";
91
- query: { type: "index"; index: number };
92
- };
89
+ type MessageMeta =
90
+ | {
91
+ source: "thread";
92
+ query: { type: "index"; index: number };
93
+ }
94
+ | {
95
+ source: "root";
96
+ query: Record<string, never>;
97
+ };
93
98
 
94
99
  type PartMeta = {
95
100
  source: "message" | "root";
@@ -81,6 +81,7 @@ const useAssistantTransportThreadRuntime = <T,>(
81
81
  throw new Error("Response body is null");
82
82
  }
83
83
 
84
+ let err: string | undefined;
84
85
  const stream = response.body
85
86
  .pipeThrough(new DataStreamDecoder())
86
87
  .pipeThrough(
@@ -90,6 +91,9 @@ const useAssistantTransportThreadRuntime = <T,>(
90
91
  (agentStateRef.current as ReadonlyJSONValue) ?? null,
91
92
  }),
92
93
  throttle: isResume,
94
+ onError: (error) => {
95
+ err = error;
96
+ },
93
97
  }),
94
98
  );
95
99
 
@@ -106,6 +110,10 @@ const useAssistantTransportThreadRuntime = <T,>(
106
110
  agentStateRef.current = chunk.metadata.unstable_state as T;
107
111
  rerender((prev) => prev + 1);
108
112
  }
113
+
114
+ if (err) {
115
+ throw new Error(err);
116
+ }
109
117
  },
110
118
  onFinish: options.onFinish,
111
119
  onCancel: () => {
@@ -1 +0,0 @@
1
- {"version":3,"file":"AttachmentProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/AttachmentProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AASjE,eAAO,MAAM,gCAAgC,EAAE,EAAE,CAC/C,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,EAAE,CAChD,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/context/providers/AttachmentProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\n\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\n\nexport const MessageAttachmentByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n attachment: createAssistantApiField({\n source: \"message\",\n query: { type: \"index\", index },\n get: () => api.message().attachment({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n\nexport const ComposerAttachmentByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n attachment: createAssistantApiField({\n source: \"composer\",\n query: { type: \"index\", index },\n get: () => api.composer().attachment({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AAEzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBE;AAhBF,IAAM,mCAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,YAAY,wBAAwB;AAAA,QAClC,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;AAEO,IAAM,oCAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,YAAY,wBAAwB;AAAA,QAClC,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PartProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/PartProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAQjE,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAClC,iBAAiB,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAcH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/context/providers/PartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport {\n AssistantApi,\n AssistantProvider,\n useAssistantApi,\n createAssistantApiField,\n} from \"../react/AssistantApiContext\";\n\nexport const PartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const api = useAssistantApi();\n const api2 = useMemo(() => {\n return {\n part: createAssistantApiField({\n source: \"message\",\n query: { type: \"index\", index },\n get: () => api.message().part({ index }),\n }),\n } satisfies Partial<AssistantApi>;\n }, [api, index]);\n\n return <AssistantProvider api={api2}>{children}</AssistantProvider>;\n};\n"],"mappings":";;;AAEA,SAAS,eAAgD;AACzD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBE;AAhBF,IAAM,sBAIT,CAAC,EAAE,OAAO,SAAS,MAAM;AAC3B,QAAM,MAAM,gBAAgB;AAC5B,QAAM,OAAO,QAAQ,MAAM;AACzB,WAAO;AAAA,MACL,MAAM,wBAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,OAAO,EAAE,MAAM,SAAS,MAAM;AAAA,QAC9B,KAAK,MAAM,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,KAAK,KAAK,CAAC;AAEf,SAAO,oBAAC,qBAAkB,KAAK,MAAO,UAAS;AACjD;","names":[]}