@assistant-ui/react 0.7.5 → 0.7.6
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/api/ContentPartRuntime.d.ts +3 -3
- package/dist/api/ContentPartRuntime.d.ts.map +1 -1
- package/dist/api/ContentPartRuntime.js +8 -2
- package/dist/api/ContentPartRuntime.js.map +1 -1
- package/dist/api/ContentPartRuntime.mjs +8 -2
- package/dist/api/ContentPartRuntime.mjs.map +1 -1
- package/dist/context/providers/TextContentPartProvider.d.ts.map +1 -1
- package/dist/context/providers/TextContentPartProvider.js +12 -4
- package/dist/context/providers/TextContentPartProvider.js.map +1 -1
- package/dist/context/providers/TextContentPartProvider.mjs +12 -4
- package/dist/context/providers/TextContentPartProvider.mjs.map +1 -1
- package/package.json +4 -4
- package/src/api/ContentPartRuntime.ts +12 -5
- package/src/context/providers/TextContentPartProvider.tsx +14 -4
@@ -20,10 +20,10 @@ export type ContentPartRuntime = {
|
|
20
20
|
};
|
21
21
|
export declare class ContentPartRuntimeImpl implements ContentPartRuntime {
|
22
22
|
private contentBinding;
|
23
|
-
private messageApi
|
24
|
-
private threadApi
|
23
|
+
private messageApi?;
|
24
|
+
private threadApi?;
|
25
25
|
get path(): ContentPartRuntimePath;
|
26
|
-
constructor(contentBinding: ContentPartSnapshotBinding, messageApi
|
26
|
+
constructor(contentBinding: ContentPartSnapshotBinding, messageApi?: MessageStateBinding | undefined, threadApi?: ThreadRuntimeCoreBinding | undefined);
|
27
27
|
getState(): ContentPartState;
|
28
28
|
addToolResult(result: any): void;
|
29
29
|
subscribe(callback: () => void): Unsubscribe;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ContentPartRuntime.d.ts","sourceRoot":"","sources":["../../src/api/ContentPartRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG,CAC3B,qBAAqB,GACrB,0BAA0B,CAC7B,GAAG;IACF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,yBAAyB,CAAC;CAChE,CAAC;AAEF,KAAK,0BAA0B,GAAG,qBAAqB,CACrD,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAEjC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,IAAI,gBAAgB,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;CAC9C,CAAC;AAEF,qBAAa,sBAAuB,YAAW,kBAAkB;IAM7D,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;
|
1
|
+
{"version":3,"file":"ContentPartRuntime.d.ts","sourceRoot":"","sources":["../../src/api/ContentPartRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG,CAC3B,qBAAqB,GACrB,0BAA0B,CAC7B,GAAG;IACF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,yBAAyB,CAAC;CAChE,CAAC;AAEF,KAAK,0BAA0B,GAAG,qBAAqB,CACrD,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAEjC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,IAAI,gBAAgB,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;CAC9C,CAAC;AAEF,qBAAa,sBAAuB,YAAW,kBAAkB;IAM7D,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,SAAS,CAAC;IAPpB,IAAW,IAAI,2BAEd;gBAGS,cAAc,EAAE,0BAA0B,EAC1C,UAAU,CAAC,EAAE,mBAAmB,YAAA,EAChC,SAAS,CAAC,EAAE,wBAAwB,YAAA;IAGvC,QAAQ;IAKR,aAAa,CAAC,MAAM,EAAE,GAAG;IA2BzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI;CAGtC"}
|
@@ -33,15 +33,21 @@ var ContentPartRuntimeImpl = class {
|
|
33
33
|
return this.contentBinding.path;
|
34
34
|
}
|
35
35
|
getState() {
|
36
|
+
console.log(this.contentBinding);
|
36
37
|
return this.contentBinding.getState();
|
37
38
|
}
|
38
39
|
addToolResult(result) {
|
39
|
-
const message = this.messageApi.getState();
|
40
|
-
if (!message) throw new Error("Message is not available");
|
41
40
|
const state = this.contentBinding.getState();
|
42
41
|
if (!state) throw new Error("Content part is not available");
|
43
42
|
if (state.type !== "tool-call")
|
44
43
|
throw new Error("Tried to add tool result to non-tool content part");
|
44
|
+
if (!this.messageApi)
|
45
|
+
throw new Error(
|
46
|
+
"Message API is not available. This is likely a bug in assistant-ui."
|
47
|
+
);
|
48
|
+
if (!this.threadApi) throw new Error("Thread API is not available");
|
49
|
+
const message = this.messageApi.getState();
|
50
|
+
if (!message) throw new Error("Message is not available");
|
45
51
|
const toolName = state.toolName;
|
46
52
|
const toolCallId = state.toolCallId;
|
47
53
|
this.threadApi.getState().addToolResult({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/api/ContentPartRuntime.ts"],"sourcesContent":["import {\n ThreadAssistantContentPart,\n ThreadUserContentPart,\n ContentPartStatus,\n ToolCallContentPartStatus,\n} from \"../types/AssistantTypes\";\nimport { ThreadRuntimeCoreBinding } from \"./ThreadRuntime\";\nimport { MessageStateBinding } from \"./MessageRuntime\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport { Unsubscribe } from \"../types\";\nimport { ContentPartRuntimePath } from \"./RuntimePathTypes\";\n\nexport type ContentPartState = (\n | ThreadUserContentPart\n | ThreadAssistantContentPart\n) & {\n readonly status: ContentPartStatus | ToolCallContentPartStatus;\n};\n\ntype ContentPartSnapshotBinding = SubscribableWithState<\n ContentPartState,\n ContentPartRuntimePath\n>;\n\nexport type ContentPartRuntime = {\n /**\n * Add tool result to a tool call content part that has no tool result yet.\n * This is useful when you are collecting a tool result via user input (\"human tool calls\").\n */\n addToolResult(result: any): void;\n\n readonly path: ContentPartRuntimePath;\n getState(): ContentPartState;\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport class ContentPartRuntimeImpl implements ContentPartRuntime {\n public get path() {\n return this.contentBinding.path;\n }\n\n constructor(\n private contentBinding: ContentPartSnapshotBinding,\n private messageApi
|
1
|
+
{"version":3,"sources":["../../src/api/ContentPartRuntime.ts"],"sourcesContent":["import {\n ThreadAssistantContentPart,\n ThreadUserContentPart,\n ContentPartStatus,\n ToolCallContentPartStatus,\n} from \"../types/AssistantTypes\";\nimport { ThreadRuntimeCoreBinding } from \"./ThreadRuntime\";\nimport { MessageStateBinding } from \"./MessageRuntime\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport { Unsubscribe } from \"../types\";\nimport { ContentPartRuntimePath } from \"./RuntimePathTypes\";\n\nexport type ContentPartState = (\n | ThreadUserContentPart\n | ThreadAssistantContentPart\n) & {\n readonly status: ContentPartStatus | ToolCallContentPartStatus;\n};\n\ntype ContentPartSnapshotBinding = SubscribableWithState<\n ContentPartState,\n ContentPartRuntimePath\n>;\n\nexport type ContentPartRuntime = {\n /**\n * Add tool result to a tool call content part that has no tool result yet.\n * This is useful when you are collecting a tool result via user input (\"human tool calls\").\n */\n addToolResult(result: any): void;\n\n readonly path: ContentPartRuntimePath;\n getState(): ContentPartState;\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport class ContentPartRuntimeImpl implements ContentPartRuntime {\n public get path() {\n return this.contentBinding.path;\n }\n\n constructor(\n private contentBinding: ContentPartSnapshotBinding,\n private messageApi?: MessageStateBinding,\n private threadApi?: ThreadRuntimeCoreBinding,\n ) {}\n\n public getState() {\n console.log(this.contentBinding);\n return this.contentBinding.getState();\n }\n\n public addToolResult(result: any) {\n const state = this.contentBinding.getState();\n if (!state) throw new Error(\"Content part is not available\");\n\n if (state.type !== \"tool-call\")\n throw new Error(\"Tried to add tool result to non-tool content part\");\n\n if (!this.messageApi)\n throw new Error(\n \"Message API is not available. This is likely a bug in assistant-ui.\",\n );\n if (!this.threadApi) throw new Error(\"Thread API is not available\");\n\n const message = this.messageApi.getState();\n if (!message) throw new Error(\"Message is not available\");\n\n const toolName = state.toolName;\n const toolCallId = state.toolCallId;\n\n this.threadApi.getState().addToolResult({\n messageId: message.id,\n toolName,\n toolCallId,\n result,\n });\n }\n\n public subscribe(callback: () => void) {\n return this.contentBinding.subscribe(callback);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCO,IAAM,yBAAN,MAA2D;AAAA,EAKhE,YACU,gBACA,YACA,WACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EARH,IAAW,OAAO;AAChB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAQO,WAAW;AAChB,YAAQ,IAAI,KAAK,cAAc;AAC/B,WAAO,KAAK,eAAe,SAAS;AAAA,EACtC;AAAA,EAEO,cAAc,QAAa;AAChC,UAAM,QAAQ,KAAK,eAAe,SAAS;AAC3C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,+BAA+B;AAE3D,QAAI,MAAM,SAAS;AACjB,YAAM,IAAI,MAAM,mDAAmD;AAErE,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,6BAA6B;AAElE,UAAM,UAAU,KAAK,WAAW,SAAS;AACzC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0BAA0B;AAExD,UAAM,WAAW,MAAM;AACvB,UAAM,aAAa,MAAM;AAEzB,SAAK,UAAU,SAAS,EAAE,cAAc;AAAA,MACtC,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,UAAU,UAAsB;AACrC,WAAO,KAAK,eAAe,UAAU,QAAQ;AAAA,EAC/C;AACF;","names":[]}
|
@@ -9,15 +9,21 @@ var ContentPartRuntimeImpl = class {
|
|
9
9
|
return this.contentBinding.path;
|
10
10
|
}
|
11
11
|
getState() {
|
12
|
+
console.log(this.contentBinding);
|
12
13
|
return this.contentBinding.getState();
|
13
14
|
}
|
14
15
|
addToolResult(result) {
|
15
|
-
const message = this.messageApi.getState();
|
16
|
-
if (!message) throw new Error("Message is not available");
|
17
16
|
const state = this.contentBinding.getState();
|
18
17
|
if (!state) throw new Error("Content part is not available");
|
19
18
|
if (state.type !== "tool-call")
|
20
19
|
throw new Error("Tried to add tool result to non-tool content part");
|
20
|
+
if (!this.messageApi)
|
21
|
+
throw new Error(
|
22
|
+
"Message API is not available. This is likely a bug in assistant-ui."
|
23
|
+
);
|
24
|
+
if (!this.threadApi) throw new Error("Thread API is not available");
|
25
|
+
const message = this.messageApi.getState();
|
26
|
+
if (!message) throw new Error("Message is not available");
|
21
27
|
const toolName = state.toolName;
|
22
28
|
const toolCallId = state.toolCallId;
|
23
29
|
this.threadApi.getState().addToolResult({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/api/ContentPartRuntime.ts"],"sourcesContent":["import {\n ThreadAssistantContentPart,\n ThreadUserContentPart,\n ContentPartStatus,\n ToolCallContentPartStatus,\n} from \"../types/AssistantTypes\";\nimport { ThreadRuntimeCoreBinding } from \"./ThreadRuntime\";\nimport { MessageStateBinding } from \"./MessageRuntime\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport { Unsubscribe } from \"../types\";\nimport { ContentPartRuntimePath } from \"./RuntimePathTypes\";\n\nexport type ContentPartState = (\n | ThreadUserContentPart\n | ThreadAssistantContentPart\n) & {\n readonly status: ContentPartStatus | ToolCallContentPartStatus;\n};\n\ntype ContentPartSnapshotBinding = SubscribableWithState<\n ContentPartState,\n ContentPartRuntimePath\n>;\n\nexport type ContentPartRuntime = {\n /**\n * Add tool result to a tool call content part that has no tool result yet.\n * This is useful when you are collecting a tool result via user input (\"human tool calls\").\n */\n addToolResult(result: any): void;\n\n readonly path: ContentPartRuntimePath;\n getState(): ContentPartState;\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport class ContentPartRuntimeImpl implements ContentPartRuntime {\n public get path() {\n return this.contentBinding.path;\n }\n\n constructor(\n private contentBinding: ContentPartSnapshotBinding,\n private messageApi
|
1
|
+
{"version":3,"sources":["../../src/api/ContentPartRuntime.ts"],"sourcesContent":["import {\n ThreadAssistantContentPart,\n ThreadUserContentPart,\n ContentPartStatus,\n ToolCallContentPartStatus,\n} from \"../types/AssistantTypes\";\nimport { ThreadRuntimeCoreBinding } from \"./ThreadRuntime\";\nimport { MessageStateBinding } from \"./MessageRuntime\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport { Unsubscribe } from \"../types\";\nimport { ContentPartRuntimePath } from \"./RuntimePathTypes\";\n\nexport type ContentPartState = (\n | ThreadUserContentPart\n | ThreadAssistantContentPart\n) & {\n readonly status: ContentPartStatus | ToolCallContentPartStatus;\n};\n\ntype ContentPartSnapshotBinding = SubscribableWithState<\n ContentPartState,\n ContentPartRuntimePath\n>;\n\nexport type ContentPartRuntime = {\n /**\n * Add tool result to a tool call content part that has no tool result yet.\n * This is useful when you are collecting a tool result via user input (\"human tool calls\").\n */\n addToolResult(result: any): void;\n\n readonly path: ContentPartRuntimePath;\n getState(): ContentPartState;\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport class ContentPartRuntimeImpl implements ContentPartRuntime {\n public get path() {\n return this.contentBinding.path;\n }\n\n constructor(\n private contentBinding: ContentPartSnapshotBinding,\n private messageApi?: MessageStateBinding,\n private threadApi?: ThreadRuntimeCoreBinding,\n ) {}\n\n public getState() {\n console.log(this.contentBinding);\n return this.contentBinding.getState();\n }\n\n public addToolResult(result: any) {\n const state = this.contentBinding.getState();\n if (!state) throw new Error(\"Content part is not available\");\n\n if (state.type !== \"tool-call\")\n throw new Error(\"Tried to add tool result to non-tool content part\");\n\n if (!this.messageApi)\n throw new Error(\n \"Message API is not available. This is likely a bug in assistant-ui.\",\n );\n if (!this.threadApi) throw new Error(\"Thread API is not available\");\n\n const message = this.messageApi.getState();\n if (!message) throw new Error(\"Message is not available\");\n\n const toolName = state.toolName;\n const toolCallId = state.toolCallId;\n\n this.threadApi.getState().addToolResult({\n messageId: message.id,\n toolName,\n toolCallId,\n result,\n });\n }\n\n public subscribe(callback: () => void) {\n return this.contentBinding.subscribe(callback);\n }\n}\n"],"mappings":";AAoCO,IAAM,yBAAN,MAA2D;AAAA,EAKhE,YACU,gBACA,YACA,WACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EARH,IAAW,OAAO;AAChB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAQO,WAAW;AAChB,YAAQ,IAAI,KAAK,cAAc;AAC/B,WAAO,KAAK,eAAe,SAAS;AAAA,EACtC;AAAA,EAEO,cAAc,QAAa;AAChC,UAAM,QAAQ,KAAK,eAAe,SAAS;AAC3C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,+BAA+B;AAE3D,QAAI,MAAM,SAAS;AACjB,YAAM,IAAI,MAAM,mDAAmD;AAErE,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,6BAA6B;AAElE,UAAM,UAAU,KAAK,WAAW,SAAS;AACzC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0BAA0B;AAExD,UAAM,WAAW,MAAM;AACvB,UAAM,aAAa,MAAM;AAEzB,SAAK,UAAU,SAAS,EAAE,cAAc;AAAA,MACtC,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,UAAU,UAAsB;AACrC,WAAO,KAAK,eAAe,UAAU,QAAQ;AAAA,EAC/C;AACF;","names":[]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"TextContentPartProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAcnD,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,KAAK,GAAG,iBAAiB,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACjC,CAAC,CAAC;CACJ;AAUD,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,
|
1
|
+
{"version":3,"file":"TextContentPartProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAcnD,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,KAAK,GAAG,iBAAiB,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACjC,CAAC,CAAC;CACJ;AAUD,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAuDrE,CAAC"}
|
@@ -42,15 +42,23 @@ var TextContentPartProvider = ({
|
|
42
42
|
isRunning
|
43
43
|
}) => {
|
44
44
|
const [context] = (0, import_react.useState)(() => {
|
45
|
-
const useContentPartRuntime = (0, import_zustand.create)(
|
46
|
-
// TODO
|
47
|
-
() => new import_ContentPartRuntime.ContentPartRuntimeImpl(null, null, null)
|
48
|
-
);
|
49
45
|
const useContentPart = (0, import_zustand.create)(() => ({
|
50
46
|
status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
|
51
47
|
type: "text",
|
52
48
|
text
|
53
49
|
}));
|
50
|
+
const useContentPartRuntime = (0, import_zustand.create)(
|
51
|
+
() => new import_ContentPartRuntime.ContentPartRuntimeImpl({
|
52
|
+
path: {
|
53
|
+
ref: "text",
|
54
|
+
threadSelector: { type: "main" },
|
55
|
+
messageSelector: { type: "messageId", messageId: "" },
|
56
|
+
contentPartSelector: { type: "index", index: 0 }
|
57
|
+
},
|
58
|
+
getState: useContentPart.getState,
|
59
|
+
subscribe: useContentPart.subscribe
|
60
|
+
})
|
61
|
+
);
|
54
62
|
return { useContentPartRuntime, useContentPart };
|
55
63
|
});
|
56
64
|
(0, import_react.useEffect)(() => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport {\n ContentPartContext,\n ContentPartContextValue,\n} from \"../react/ContentPartContext\";\nimport { ContentPartStatus, TextContentPart } from \"../../types/AssistantTypes\";\nimport { writableStore } from \"../ReadonlyStore\";\nimport {\n ContentPartRuntimeImpl,\n ContentPartState,\n} from \"../../api/ContentPartRuntime\";\n\nexport namespace TextContentPartProvider {\n export type Props = PropsWithChildren<{\n text: string;\n isRunning?: boolean | undefined;\n }>;\n}\n\nconst COMPLETE_STATUS: ContentPartStatus = {\n type: \"complete\",\n};\n\nconst RUNNING_STATUS: ContentPartStatus = {\n type: \"running\",\n};\n\nexport const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({\n children,\n text,\n isRunning,\n}) => {\n const [context] = useState<ContentPartContextValue>(() => {\n const
|
1
|
+
{"version":3,"sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport {\n ContentPartContext,\n ContentPartContextValue,\n} from \"../react/ContentPartContext\";\nimport { ContentPartStatus, TextContentPart } from \"../../types/AssistantTypes\";\nimport { writableStore } from \"../ReadonlyStore\";\nimport {\n ContentPartRuntimeImpl,\n ContentPartState,\n} from \"../../api/ContentPartRuntime\";\n\nexport namespace TextContentPartProvider {\n export type Props = PropsWithChildren<{\n text: string;\n isRunning?: boolean | undefined;\n }>;\n}\n\nconst COMPLETE_STATUS: ContentPartStatus = {\n type: \"complete\",\n};\n\nconst RUNNING_STATUS: ContentPartStatus = {\n type: \"running\",\n};\n\nexport const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({\n children,\n text,\n isRunning,\n}) => {\n const [context] = useState<ContentPartContextValue>(() => {\n const useContentPart = create<ContentPartState>(() => ({\n status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,\n type: \"text\",\n text,\n }));\n\n const useContentPartRuntime = create(\n () =>\n new ContentPartRuntimeImpl({\n path: {\n ref: \"text\",\n threadSelector: { type: \"main\" },\n messageSelector: { type: \"messageId\", messageId: \"\" },\n contentPartSelector: { type: \"index\", index: 0 },\n },\n getState: useContentPart.getState,\n subscribe: useContentPart.subscribe,\n }),\n );\n\n return { useContentPartRuntime, useContentPart };\n });\n\n useEffect(() => {\n const state = context.useContentPart.getState() as ContentPartState & {\n type: \"text\";\n };\n\n const textUpdated = (state as TextContentPart).text !== text;\n const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;\n const statusUpdated = state.status !== targetStatus;\n\n if (!textUpdated && !statusUpdated) return;\n\n writableStore(context.useContentPart).setState(\n {\n type: \"text\",\n text,\n status: targetStatus,\n } satisfies ContentPartState,\n true,\n );\n }, [context, isRunning, text]);\n\n return (\n <ContentPartContext.Provider value={context}>\n {children}\n </ContentPartContext.Provider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAoC;AACpC,qBAAuB;AACvB,gCAGO;AAEP,2BAA8B;AAC9B,gCAGO;AAoEH;AA3DJ,IAAM,kBAAqC;AAAA,EACzC,MAAM;AACR;AAEA,IAAM,iBAAoC;AAAA,EACxC,MAAM;AACR;AAEO,IAAM,0BAA6D,CAAC;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAI,uBAAkC,MAAM;AACxD,UAAM,qBAAiB,uBAAyB,OAAO;AAAA,MACrD,QAAQ,YAAY,iBAAiB;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAEF,UAAM,4BAAwB;AAAA,MAC5B,MACE,IAAI,iDAAuB;AAAA,QACzB,MAAM;AAAA,UACJ,KAAK;AAAA,UACL,gBAAgB,EAAE,MAAM,OAAO;AAAA,UAC/B,iBAAiB,EAAE,MAAM,aAAa,WAAW,GAAG;AAAA,UACpD,qBAAqB,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,QACjD;AAAA,QACA,UAAU,eAAe;AAAA,QACzB,WAAW,eAAe;AAAA,MAC5B,CAAC;AAAA,IACL;AAEA,WAAO,EAAE,uBAAuB,eAAe;AAAA,EACjD,CAAC;AAED,8BAAU,MAAM;AACd,UAAM,QAAQ,QAAQ,eAAe,SAAS;AAI9C,UAAM,cAAe,MAA0B,SAAS;AACxD,UAAM,eAAe,YAAY,iBAAiB;AAClD,UAAM,gBAAgB,MAAM,WAAW;AAEvC,QAAI,CAAC,eAAe,CAAC,cAAe;AAEpC,4CAAc,QAAQ,cAAc,EAAE;AAAA,MACpC;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC;AAE7B,SACE,4CAAC,6CAAmB,UAAnB,EAA4B,OAAO,SACjC,UACH;AAEJ;","names":[]}
|
@@ -23,15 +23,23 @@ var TextContentPartProvider = ({
|
|
23
23
|
isRunning
|
24
24
|
}) => {
|
25
25
|
const [context] = useState(() => {
|
26
|
-
const useContentPartRuntime = create(
|
27
|
-
// TODO
|
28
|
-
() => new ContentPartRuntimeImpl(null, null, null)
|
29
|
-
);
|
30
26
|
const useContentPart = create(() => ({
|
31
27
|
status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
|
32
28
|
type: "text",
|
33
29
|
text
|
34
30
|
}));
|
31
|
+
const useContentPartRuntime = create(
|
32
|
+
() => new ContentPartRuntimeImpl({
|
33
|
+
path: {
|
34
|
+
ref: "text",
|
35
|
+
threadSelector: { type: "main" },
|
36
|
+
messageSelector: { type: "messageId", messageId: "" },
|
37
|
+
contentPartSelector: { type: "index", index: 0 }
|
38
|
+
},
|
39
|
+
getState: useContentPart.getState,
|
40
|
+
subscribe: useContentPart.subscribe
|
41
|
+
})
|
42
|
+
);
|
35
43
|
return { useContentPartRuntime, useContentPart };
|
36
44
|
});
|
37
45
|
useEffect(() => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport {\n ContentPartContext,\n ContentPartContextValue,\n} from \"../react/ContentPartContext\";\nimport { ContentPartStatus, TextContentPart } from \"../../types/AssistantTypes\";\nimport { writableStore } from \"../ReadonlyStore\";\nimport {\n ContentPartRuntimeImpl,\n ContentPartState,\n} from \"../../api/ContentPartRuntime\";\n\nexport namespace TextContentPartProvider {\n export type Props = PropsWithChildren<{\n text: string;\n isRunning?: boolean | undefined;\n }>;\n}\n\nconst COMPLETE_STATUS: ContentPartStatus = {\n type: \"complete\",\n};\n\nconst RUNNING_STATUS: ContentPartStatus = {\n type: \"running\",\n};\n\nexport const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({\n children,\n text,\n isRunning,\n}) => {\n const [context] = useState<ContentPartContextValue>(() => {\n const
|
1
|
+
{"version":3,"sources":["../../../src/context/providers/TextContentPartProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport {\n ContentPartContext,\n ContentPartContextValue,\n} from \"../react/ContentPartContext\";\nimport { ContentPartStatus, TextContentPart } from \"../../types/AssistantTypes\";\nimport { writableStore } from \"../ReadonlyStore\";\nimport {\n ContentPartRuntimeImpl,\n ContentPartState,\n} from \"../../api/ContentPartRuntime\";\n\nexport namespace TextContentPartProvider {\n export type Props = PropsWithChildren<{\n text: string;\n isRunning?: boolean | undefined;\n }>;\n}\n\nconst COMPLETE_STATUS: ContentPartStatus = {\n type: \"complete\",\n};\n\nconst RUNNING_STATUS: ContentPartStatus = {\n type: \"running\",\n};\n\nexport const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({\n children,\n text,\n isRunning,\n}) => {\n const [context] = useState<ContentPartContextValue>(() => {\n const useContentPart = create<ContentPartState>(() => ({\n status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,\n type: \"text\",\n text,\n }));\n\n const useContentPartRuntime = create(\n () =>\n new ContentPartRuntimeImpl({\n path: {\n ref: \"text\",\n threadSelector: { type: \"main\" },\n messageSelector: { type: \"messageId\", messageId: \"\" },\n contentPartSelector: { type: \"index\", index: 0 },\n },\n getState: useContentPart.getState,\n subscribe: useContentPart.subscribe,\n }),\n );\n\n return { useContentPartRuntime, useContentPart };\n });\n\n useEffect(() => {\n const state = context.useContentPart.getState() as ContentPartState & {\n type: \"text\";\n };\n\n const textUpdated = (state as TextContentPart).text !== text;\n const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;\n const statusUpdated = state.status !== targetStatus;\n\n if (!textUpdated && !statusUpdated) return;\n\n writableStore(context.useContentPart).setState(\n {\n type: \"text\",\n text,\n status: targetStatus,\n } satisfies ContentPartState,\n true,\n );\n }, [context, isRunning, text]);\n\n return (\n <ContentPartContext.Provider value={context}>\n {children}\n </ContentPartContext.Provider>\n );\n};\n"],"mappings":";;;AAGA,SAAS,WAAW,gBAAgB;AACpC,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,OAEK;AAEP,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,OAEK;AAoEH;AA3DJ,IAAM,kBAAqC;AAAA,EACzC,MAAM;AACR;AAEA,IAAM,iBAAoC;AAAA,EACxC,MAAM;AACR;AAEO,IAAM,0BAA6D,CAAC;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,IAAI,SAAkC,MAAM;AACxD,UAAM,iBAAiB,OAAyB,OAAO;AAAA,MACrD,QAAQ,YAAY,iBAAiB;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAEF,UAAM,wBAAwB;AAAA,MAC5B,MACE,IAAI,uBAAuB;AAAA,QACzB,MAAM;AAAA,UACJ,KAAK;AAAA,UACL,gBAAgB,EAAE,MAAM,OAAO;AAAA,UAC/B,iBAAiB,EAAE,MAAM,aAAa,WAAW,GAAG;AAAA,UACpD,qBAAqB,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,QACjD;AAAA,QACA,UAAU,eAAe;AAAA,QACzB,WAAW,eAAe;AAAA,MAC5B,CAAC;AAAA,IACL;AAEA,WAAO,EAAE,uBAAuB,eAAe;AAAA,EACjD,CAAC;AAED,YAAU,MAAM;AACd,UAAM,QAAQ,QAAQ,eAAe,SAAS;AAI9C,UAAM,cAAe,MAA0B,SAAS;AACxD,UAAM,eAAe,YAAY,iBAAiB;AAClD,UAAM,gBAAgB,MAAM,WAAW;AAEvC,QAAI,CAAC,eAAe,CAAC,cAAe;AAEpC,kBAAc,QAAQ,cAAc,EAAE;AAAA,MACpC;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC;AAE7B,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAAO,SACjC,UACH;AAEJ;","names":[]}
|
package/package.json
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
"conversational-ui",
|
30
30
|
"conversational-ai"
|
31
31
|
],
|
32
|
-
"version": "0.7.
|
32
|
+
"version": "0.7.6",
|
33
33
|
"license": "MIT",
|
34
34
|
"exports": {
|
35
35
|
".": {
|
@@ -65,7 +65,7 @@
|
|
65
65
|
],
|
66
66
|
"sideEffects": false,
|
67
67
|
"dependencies": {
|
68
|
-
"@ai-sdk/provider": "^0.0
|
68
|
+
"@ai-sdk/provider": "^1.0.0",
|
69
69
|
"@radix-ui/primitive": "^1.1.0",
|
70
70
|
"@radix-ui/react-avatar": "^1.1.1",
|
71
71
|
"@radix-ui/react-compose-refs": "^1.1.0",
|
@@ -83,7 +83,7 @@
|
|
83
83
|
"lucide-react": "^0.460.0",
|
84
84
|
"nanoid": "^5.0.8",
|
85
85
|
"react-textarea-autosize": "^8.5.5",
|
86
|
-
"secure-json-parse": "^
|
86
|
+
"secure-json-parse": "^3.0.1",
|
87
87
|
"zod": "^3.23.8",
|
88
88
|
"zod-to-json-schema": "^3.23.5",
|
89
89
|
"zustand": "^5.0.1"
|
@@ -108,7 +108,7 @@
|
|
108
108
|
},
|
109
109
|
"devDependencies": {
|
110
110
|
"@types/json-schema": "^7.0.15",
|
111
|
-
"@types/node": "^22.9.
|
111
|
+
"@types/node": "^22.9.1",
|
112
112
|
"autoprefixer": "^10.4.20",
|
113
113
|
"esbuild-plugin-file-path-extensions": "^2.1.3",
|
114
114
|
"eslint": "^9",
|
@@ -41,24 +41,31 @@ export class ContentPartRuntimeImpl implements ContentPartRuntime {
|
|
41
41
|
|
42
42
|
constructor(
|
43
43
|
private contentBinding: ContentPartSnapshotBinding,
|
44
|
-
private messageApi
|
45
|
-
private threadApi
|
44
|
+
private messageApi?: MessageStateBinding,
|
45
|
+
private threadApi?: ThreadRuntimeCoreBinding,
|
46
46
|
) {}
|
47
47
|
|
48
48
|
public getState() {
|
49
|
+
console.log(this.contentBinding);
|
49
50
|
return this.contentBinding.getState();
|
50
51
|
}
|
51
52
|
|
52
53
|
public addToolResult(result: any) {
|
53
|
-
const message = this.messageApi.getState();
|
54
|
-
if (!message) throw new Error("Message is not available");
|
55
|
-
|
56
54
|
const state = this.contentBinding.getState();
|
57
55
|
if (!state) throw new Error("Content part is not available");
|
58
56
|
|
59
57
|
if (state.type !== "tool-call")
|
60
58
|
throw new Error("Tried to add tool result to non-tool content part");
|
61
59
|
|
60
|
+
if (!this.messageApi)
|
61
|
+
throw new Error(
|
62
|
+
"Message API is not available. This is likely a bug in assistant-ui.",
|
63
|
+
);
|
64
|
+
if (!this.threadApi) throw new Error("Thread API is not available");
|
65
|
+
|
66
|
+
const message = this.messageApi.getState();
|
67
|
+
if (!message) throw new Error("Message is not available");
|
68
|
+
|
62
69
|
const toolName = state.toolName;
|
63
70
|
const toolCallId = state.toolCallId;
|
64
71
|
|
@@ -35,16 +35,26 @@ export const TextContentPartProvider: FC<TextContentPartProvider.Props> = ({
|
|
35
35
|
isRunning,
|
36
36
|
}) => {
|
37
37
|
const [context] = useState<ContentPartContextValue>(() => {
|
38
|
-
const useContentPartRuntime = create(
|
39
|
-
// TODO
|
40
|
-
() => new ContentPartRuntimeImpl(null as any, null as any, null as any),
|
41
|
-
);
|
42
38
|
const useContentPart = create<ContentPartState>(() => ({
|
43
39
|
status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
|
44
40
|
type: "text",
|
45
41
|
text,
|
46
42
|
}));
|
47
43
|
|
44
|
+
const useContentPartRuntime = create(
|
45
|
+
() =>
|
46
|
+
new ContentPartRuntimeImpl({
|
47
|
+
path: {
|
48
|
+
ref: "text",
|
49
|
+
threadSelector: { type: "main" },
|
50
|
+
messageSelector: { type: "messageId", messageId: "" },
|
51
|
+
contentPartSelector: { type: "index", index: 0 },
|
52
|
+
},
|
53
|
+
getState: useContentPart.getState,
|
54
|
+
subscribe: useContentPart.subscribe,
|
55
|
+
}),
|
56
|
+
);
|
57
|
+
|
48
58
|
return { useContentPartRuntime, useContentPart };
|
49
59
|
});
|
50
60
|
|