@assistant-ui/core 0.2.12 → 0.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/thread-history.d.ts +3 -1
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js.map +1 -1
- package/dist/react/AssistantProvider.js +6 -1
- package/dist/react/AssistantProvider.js.map +1 -1
- package/dist/react/RuntimeAdapter.d.ts +1 -1
- package/dist/react/RuntimeAdapter.d.ts.map +1 -1
- package/dist/react/RuntimeAdapter.js +16 -6
- package/dist/react/RuntimeAdapter.js.map +1 -1
- package/dist/react/client/DataRenderers.d.ts +1 -8
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.js +3 -2
- package/dist/react/client/DataRenderers.js.map +1 -1
- package/dist/react/client/Interactables.d.ts +1 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +4 -3
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/Tools.d.ts +2 -13
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +4 -3
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.d.ts +3 -2
- package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.js +4 -4
- package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +28 -1
- package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js +43 -9
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.js +3 -2
- package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -0
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +6 -0
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +2 -0
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/utils/groupParts.d.ts +13 -1
- package/dist/react/utils/groupParts.d.ts.map +1 -1
- package/dist/react/utils/groupParts.js +17 -5
- package/dist/react/utils/groupParts.js.map +1 -1
- package/dist/runtime/api/bindings.d.ts +1 -0
- package/dist/runtime/api/bindings.d.ts.map +1 -1
- package/dist/runtime/api/message-runtime.d.ts +2 -0
- package/dist/runtime/api/message-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-runtime.js +5 -0
- package/dist/runtime/api/message-runtime.js.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +1 -0
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +3 -0
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +4 -0
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/branch/external-thread-branch-adapter.d.ts +30 -0
- package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -0
- package/dist/runtime/branch/external-thread-branch-adapter.js +0 -0
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -0
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +1 -0
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js +13 -0
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/local-runtime-options.d.ts +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +8 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +63 -5
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/should-continue.js +4 -2
- package/dist/runtimes/local/should-continue.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +2 -0
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +4 -0
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.js +4 -0
- package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -0
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -0
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/store/clients/chain-of-thought-client.d.ts +2 -7
- package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
- package/dist/store/clients/chain-of-thought-client.js +3 -2
- package/dist/store/clients/chain-of-thought-client.js.map +1 -1
- package/dist/store/clients/model-context-client.d.ts +1 -1
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/model-context-client.js +3 -2
- package/dist/store/clients/model-context-client.js.map +1 -1
- package/dist/store/clients/no-op-composer-client.d.ts +2 -4
- package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
- package/dist/store/clients/no-op-composer-client.js +3 -2
- package/dist/store/clients/no-op-composer-client.js.map +1 -1
- package/dist/store/clients/runtime-adapter.d.ts +1 -3
- package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
- package/dist/store/clients/runtime-adapter.js +2 -15
- package/dist/store/clients/runtime-adapter.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts +1 -4
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +6 -4
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/clients/thread-message-client.d.ts +1 -1
- package/dist/store/clients/thread-message-client.d.ts.map +1 -1
- package/dist/store/clients/thread-message-client.js +14 -10
- package/dist/store/clients/thread-message-client.js.map +1 -1
- package/dist/store/internal.d.ts +2 -2
- package/dist/store/internal.js +2 -2
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -4
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.js +3 -2
- package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +2 -10
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.js +9 -6
- package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -4
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.js +3 -2
- package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +2 -7
- package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.js +10 -6
- package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +2 -4
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +3 -2
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -5
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.js +6 -4
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts +2 -4
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +7 -4
- package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
- package/dist/store/scopes/message.d.ts +1 -0
- package/dist/store/scopes/message.d.ts.map +1 -1
- package/dist/store/scopes/thread-list-item.d.ts +1 -0
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +1 -0
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/adapters/thread-history.ts +2 -0
- package/src/index.ts +1 -0
- package/src/react/AssistantProvider.tsx +3 -1
- package/src/react/RuntimeAdapter.ts +25 -8
- package/src/react/client/DataRenderers.ts +42 -45
- package/src/react/client/Interactables.ts +261 -261
- package/src/react/client/Tools.ts +6 -4
- package/src/react/primitives/message/MessageGroupedParts.tsx +19 -7
- package/src/react/primitives/message/MessageParts.tsx +64 -13
- package/src/react/providers/TextMessagePartProvider.tsx +5 -3
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +1 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +11 -0
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -0
- package/src/react/utils/groupParts.ts +27 -0
- package/src/runtime/api/bindings.ts +1 -0
- package/src/runtime/api/message-runtime.ts +7 -0
- package/src/runtime/api/thread-list-runtime.ts +1 -0
- package/src/runtime/api/thread-runtime.ts +7 -0
- package/src/runtime/base/base-thread-runtime-core.ts +1 -0
- package/src/runtime/branch/external-thread-branch-adapter.ts +26 -0
- package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
- package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
- package/src/runtimes/external-store/external-store-adapter.ts +1 -0
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +24 -0
- package/src/runtimes/local/local-runtime-options.ts +1 -1
- package/src/runtimes/local/local-thread-runtime-core.test.ts +311 -0
- package/src/runtimes/local/local-thread-runtime-core.ts +104 -7
- package/src/runtimes/local/should-continue.ts +23 -13
- package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +5 -0
- package/src/runtimes/remote-thread-list/empty-thread-core.ts +5 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +2 -0
- package/src/runtimes/remote-thread-list/types.ts +1 -0
- package/src/store/clients/chain-of-thought-client.ts +5 -3
- package/src/store/clients/model-context-client.test.ts +5 -4
- package/src/store/clients/model-context-client.ts +21 -21
- package/src/store/clients/no-op-composer-client.ts +5 -3
- package/src/store/clients/runtime-adapter.ts +0 -24
- package/src/store/clients/suggestions.ts +9 -18
- package/src/store/clients/thread-message-client.ts +29 -26
- package/src/store/internal.ts +1 -4
- package/src/store/runtime-clients/attachment-runtime-client.ts +14 -14
- package/src/store/runtime-clients/composer-runtime-client.ts +30 -24
- package/src/store/runtime-clients/message-part-runtime-client.ts +5 -3
- package/src/store/runtime-clients/message-runtime-client.ts +26 -19
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +5 -3
- package/src/store/runtime-clients/thread-list-runtime-client.ts +10 -6
- package/src/store/runtime-clients/thread-runtime-client.ts +11 -6
- package/src/store/scopes/message.ts +1 -0
- package/src/store/scopes/thread-list-item.ts +1 -0
- package/src/store/scopes/thread.ts +1 -0
- package/src/tests/external-store-thread-runtime-core.test.ts +57 -0
- package/src/tests/groupMessageParts.test.ts +84 -0
- package/src/tests/groupParts.test.ts +55 -0
|
@@ -3,11 +3,11 @@ import { resource } from "@assistant-ui/tap";
|
|
|
3
3
|
import type { ClientOutput } from "@assistant-ui/store";
|
|
4
4
|
import type { ComposerState } from "../scopes/composer";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
const useNoOpComposerClient = ({
|
|
7
7
|
type,
|
|
8
8
|
}: {
|
|
9
9
|
type: "edit" | "thread";
|
|
10
|
-
}): ClientOutput<"composer"> {
|
|
10
|
+
}): ClientOutput<"composer"> => {
|
|
11
11
|
const state = useMemo<ComposerState>(() => {
|
|
12
12
|
return {
|
|
13
13
|
isEditing: false,
|
|
@@ -71,4 +71,6 @@ export const NoOpComposerClient = resource(function NoOpComposerClient({
|
|
|
71
71
|
throw new Error("Not supported");
|
|
72
72
|
},
|
|
73
73
|
};
|
|
74
|
-
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const NoOpComposerClient = resource(useNoOpComposerClient);
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
import { useResource, resource } from "@assistant-ui/tap";
|
|
3
|
-
import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
|
|
4
|
-
import { ThreadListClient } from "../runtime-clients/thread-list-runtime-client";
|
|
5
1
|
import {
|
|
6
|
-
useAssistantClientRef,
|
|
7
2
|
Derived,
|
|
8
3
|
type ScopesConfig,
|
|
9
4
|
type AssistantClient,
|
|
@@ -11,25 +6,6 @@ import {
|
|
|
11
6
|
import { ModelContext } from "./model-context-client";
|
|
12
7
|
import { Suggestions } from "./suggestions";
|
|
13
8
|
|
|
14
|
-
export const RuntimeAdapterResource = resource(function RuntimeAdapterResource(
|
|
15
|
-
runtime: AssistantRuntime,
|
|
16
|
-
) {
|
|
17
|
-
const clientRef = useAssistantClientRef();
|
|
18
|
-
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
return runtime.registerModelContextProvider(
|
|
21
|
-
clientRef.current!.modelContext(),
|
|
22
|
-
);
|
|
23
|
-
}, [runtime, clientRef]);
|
|
24
|
-
|
|
25
|
-
return useResource(
|
|
26
|
-
ThreadListClient({
|
|
27
|
-
runtime: runtime.threads,
|
|
28
|
-
__internal_assistantRuntime: runtime,
|
|
29
|
-
}),
|
|
30
|
-
);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
9
|
export const baseRuntimeAdapterTransformScopes = (
|
|
34
10
|
scopes: ScopesConfig,
|
|
35
11
|
parent: AssistantClient,
|
|
@@ -9,17 +9,19 @@ export type SuggestionConfig =
|
|
|
9
9
|
| string
|
|
10
10
|
| { title: string; label: string; prompt: string };
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const useSuggestionClient = (
|
|
13
13
|
state: SuggestionState,
|
|
14
|
-
): ClientOutput<"suggestion"> {
|
|
14
|
+
): ClientOutput<"suggestion"> => {
|
|
15
15
|
return {
|
|
16
16
|
getState: () => state,
|
|
17
17
|
};
|
|
18
|
-
}
|
|
18
|
+
};
|
|
19
19
|
|
|
20
|
-
const
|
|
20
|
+
const SuggestionClient = resource(useSuggestionClient);
|
|
21
|
+
|
|
22
|
+
const useSuggestionsResource = (
|
|
21
23
|
suggestions?: SuggestionConfig[],
|
|
22
|
-
): ClientOutput<"suggestions"> {
|
|
24
|
+
): ClientOutput<"suggestions"> => {
|
|
23
25
|
const [state] = useState<SuggestionsState>(() => {
|
|
24
26
|
const normalizedSuggestions = (suggestions ?? []).map((s) => {
|
|
25
27
|
if (typeof s === "string") {
|
|
@@ -55,17 +57,6 @@ const SuggestionsResource = resource(function SuggestionsResource(
|
|
|
55
57
|
return suggestionClients.get({ index });
|
|
56
58
|
},
|
|
57
59
|
};
|
|
58
|
-
}
|
|
60
|
+
};
|
|
59
61
|
|
|
60
|
-
export const Suggestions
|
|
61
|
-
(): import("@assistant-ui/tap").ResourceElement<
|
|
62
|
-
ClientOutput<"suggestions">,
|
|
63
|
-
undefined
|
|
64
|
-
>;
|
|
65
|
-
(
|
|
66
|
-
suggestions: SuggestionConfig[],
|
|
67
|
-
): import("@assistant-ui/tap").ResourceElement<
|
|
68
|
-
ClientOutput<"suggestions">,
|
|
69
|
-
SuggestionConfig[]
|
|
70
|
-
>;
|
|
71
|
-
} = SuggestionsResource as any;
|
|
62
|
+
export const Suggestions = resource(useSuggestionsResource);
|
|
@@ -11,12 +11,13 @@ import { useClientLookup } from "@assistant-ui/store";
|
|
|
11
11
|
import type { MessageState } from "../scopes/message";
|
|
12
12
|
import type { PartState } from "../scopes/part";
|
|
13
13
|
import { NoOpComposerClient } from "./no-op-composer-client";
|
|
14
|
+
import { getThreadMessageText } from "../../utils/text";
|
|
14
15
|
|
|
15
|
-
const
|
|
16
|
+
const useThreadMessagePartClient = ({
|
|
16
17
|
part,
|
|
17
18
|
}: {
|
|
18
19
|
part: ThreadAssistantMessagePart | ThreadUserMessagePart;
|
|
19
|
-
}): ClientOutput<"part"> {
|
|
20
|
+
}): ClientOutput<"part"> => {
|
|
20
21
|
const state = useMemo<PartState>(() => {
|
|
21
22
|
return {
|
|
22
23
|
...part,
|
|
@@ -36,21 +37,25 @@ const ThreadMessagePartClient = resource(function ThreadMessagePartClient({
|
|
|
36
37
|
throw new Error("Not supported");
|
|
37
38
|
},
|
|
38
39
|
};
|
|
39
|
-
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const ThreadMessagePartClient = resource(useThreadMessagePartClient);
|
|
43
|
+
|
|
44
|
+
const useThreadMessageAttachmentClient = ({
|
|
45
|
+
attachment,
|
|
46
|
+
}: {
|
|
47
|
+
attachment: Attachment;
|
|
48
|
+
}): ClientOutput<"attachment"> => {
|
|
49
|
+
return {
|
|
50
|
+
getState: () => attachment,
|
|
51
|
+
remove: () => {
|
|
52
|
+
throw new Error("Not supported");
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
};
|
|
40
56
|
|
|
41
57
|
const ThreadMessageAttachmentClient = resource(
|
|
42
|
-
|
|
43
|
-
attachment,
|
|
44
|
-
}: {
|
|
45
|
-
attachment: Attachment;
|
|
46
|
-
}): ClientOutput<"attachment"> {
|
|
47
|
-
return {
|
|
48
|
-
getState: () => attachment,
|
|
49
|
-
remove: () => {
|
|
50
|
-
throw new Error("Not supported");
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
},
|
|
58
|
+
useThreadMessageAttachmentClient,
|
|
54
59
|
);
|
|
55
60
|
export type ThreadMessageClientProps = {
|
|
56
61
|
message: ThreadMessage;
|
|
@@ -60,13 +65,13 @@ export type ThreadMessageClientProps = {
|
|
|
60
65
|
branchCount?: number;
|
|
61
66
|
};
|
|
62
67
|
|
|
63
|
-
|
|
68
|
+
const useThreadMessageClient = ({
|
|
64
69
|
message,
|
|
65
70
|
index,
|
|
66
71
|
isLast = true,
|
|
67
72
|
branchNumber = 1,
|
|
68
73
|
branchCount = 1,
|
|
69
|
-
}: ThreadMessageClientProps): ClientOutput<"message"> {
|
|
74
|
+
}: ThreadMessageClientProps): ClientOutput<"message"> => {
|
|
70
75
|
const [isCopiedState, setIsCopied] = useState(false);
|
|
71
76
|
const [isHoveringState, setIsHovering] = useState(false);
|
|
72
77
|
|
|
@@ -137,6 +142,9 @@ export const ThreadMessageClient = resource(function ThreadMessageClient({
|
|
|
137
142
|
return attachments.get(selector);
|
|
138
143
|
}
|
|
139
144
|
},
|
|
145
|
+
delete: () => {
|
|
146
|
+
throw new Error("Not supported in ThreadMessageProvider");
|
|
147
|
+
},
|
|
140
148
|
reload: () => {
|
|
141
149
|
throw new Error("Not supported in ThreadMessageProvider");
|
|
142
150
|
},
|
|
@@ -153,16 +161,11 @@ export const ThreadMessageClient = resource(function ThreadMessageClient({
|
|
|
153
161
|
throw new Error("Not supported in ThreadMessageProvider");
|
|
154
162
|
},
|
|
155
163
|
getCopyText: () => {
|
|
156
|
-
return message
|
|
157
|
-
.map((part) => {
|
|
158
|
-
if ("text" in part && typeof part.text === "string") {
|
|
159
|
-
return part.text;
|
|
160
|
-
}
|
|
161
|
-
return "";
|
|
162
|
-
})
|
|
163
|
-
.join("\n");
|
|
164
|
+
return getThreadMessageText(message);
|
|
164
165
|
},
|
|
165
166
|
setIsCopied,
|
|
166
167
|
setIsHovering,
|
|
167
168
|
};
|
|
168
|
-
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
export const ThreadMessageClient = resource(useThreadMessageClient);
|
package/src/store/internal.ts
CHANGED
|
@@ -5,7 +5,4 @@ export { MessageClient } from "./runtime-clients/message-runtime-client";
|
|
|
5
5
|
export { ThreadClient } from "./runtime-clients/thread-runtime-client";
|
|
6
6
|
export { ThreadListItemClient } from "./runtime-clients/thread-list-item-runtime-client";
|
|
7
7
|
export { ThreadListClient } from "./runtime-clients/thread-list-runtime-client";
|
|
8
|
-
export {
|
|
9
|
-
RuntimeAdapterResource,
|
|
10
|
-
baseRuntimeAdapterTransformScopes,
|
|
11
|
-
} from "./clients/runtime-adapter";
|
|
8
|
+
export { baseRuntimeAdapterTransformScopes } from "./clients/runtime-adapter";
|
|
@@ -3,18 +3,18 @@ import type { ClientOutput } from "@assistant-ui/store";
|
|
|
3
3
|
import type { AttachmentRuntime } from "../../runtime/api/attachment-runtime";
|
|
4
4
|
import { useSubscribable } from "./useSubscribable";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const state = useSubscribable(runtime);
|
|
6
|
+
const useAttachmentRuntimeClient = ({
|
|
7
|
+
runtime,
|
|
8
|
+
}: {
|
|
9
|
+
runtime: AttachmentRuntime;
|
|
10
|
+
}): ClientOutput<"attachment"> => {
|
|
11
|
+
const state = useSubscribable(runtime);
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
return {
|
|
14
|
+
getState: () => state,
|
|
15
|
+
remove: runtime.remove,
|
|
16
|
+
__internal_getRuntime: () => runtime,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const AttachmentRuntimeClient = resource(useAttachmentRuntimeClient);
|
|
@@ -15,28 +15,30 @@ import type { QueueItemState } from "../scopes/queue-item";
|
|
|
15
15
|
import { AttachmentRuntimeClient } from "./attachment-runtime-client";
|
|
16
16
|
import { useSubscribable } from "./useSubscribable";
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
);
|
|
18
|
+
const useComposerAttachmentClientByIndex = ({
|
|
19
|
+
runtime,
|
|
20
|
+
index,
|
|
21
|
+
}: {
|
|
22
|
+
runtime: ComposerRuntime;
|
|
23
|
+
index: number;
|
|
24
|
+
}) => {
|
|
25
|
+
const attachmentRuntime = useMemo(
|
|
26
|
+
() => runtime.getAttachmentByIndex(index),
|
|
27
|
+
[runtime, index],
|
|
28
|
+
);
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
return useResource(
|
|
31
|
+
AttachmentRuntimeClient({
|
|
32
|
+
runtime: attachmentRuntime,
|
|
33
|
+
}),
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const ComposerAttachmentClientByIndex = resource(
|
|
38
|
+
useComposerAttachmentClientByIndex,
|
|
37
39
|
);
|
|
38
40
|
|
|
39
|
-
const
|
|
41
|
+
const useQueueItemClient = ({
|
|
40
42
|
item,
|
|
41
43
|
onSteer,
|
|
42
44
|
onRemove,
|
|
@@ -44,15 +46,17 @@ const QueueItemClient = resource(function QueueItemClient({
|
|
|
44
46
|
item: QueueItemState;
|
|
45
47
|
onSteer: () => void;
|
|
46
48
|
onRemove: () => void;
|
|
47
|
-
}): ClientOutput<"queueItem"> {
|
|
49
|
+
}): ClientOutput<"queueItem"> => {
|
|
48
50
|
return {
|
|
49
51
|
getState: () => item,
|
|
50
52
|
steer: onSteer,
|
|
51
53
|
remove: onRemove,
|
|
52
54
|
};
|
|
53
|
-
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const QueueItemClient = resource(useQueueItemClient);
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
const useComposerClient = ({
|
|
56
60
|
threadIdRef,
|
|
57
61
|
messageIdRef,
|
|
58
62
|
runtime,
|
|
@@ -60,7 +64,7 @@ export const ComposerClient = resource(function ComposerClient({
|
|
|
60
64
|
threadIdRef: { current: string };
|
|
61
65
|
messageIdRef?: { current: string };
|
|
62
66
|
runtime: ComposerRuntime;
|
|
63
|
-
}): ClientOutput<"composer"> {
|
|
67
|
+
}): ClientOutput<"composer"> => {
|
|
64
68
|
const runtimeState = useSubscribable(runtime);
|
|
65
69
|
const emit = useAssistantEmit();
|
|
66
70
|
|
|
@@ -173,4 +177,6 @@ export const ComposerClient = resource(function ComposerClient({
|
|
|
173
177
|
queueItem: (selector) => queueItems.get(selector),
|
|
174
178
|
__internal_getRuntime: () => runtime,
|
|
175
179
|
};
|
|
176
|
-
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
export const ComposerClient = resource(useComposerClient);
|
|
@@ -3,11 +3,11 @@ import type { ClientOutput } from "@assistant-ui/store";
|
|
|
3
3
|
import type { MessagePartRuntime } from "../../runtime/api/message-part-runtime";
|
|
4
4
|
import { useSubscribable } from "./useSubscribable";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
const useMessagePartClient = ({
|
|
7
7
|
runtime,
|
|
8
8
|
}: {
|
|
9
9
|
runtime: MessagePartRuntime;
|
|
10
|
-
}): ClientOutput<"part"> {
|
|
10
|
+
}): ClientOutput<"part"> => {
|
|
11
11
|
const state = useSubscribable(runtime);
|
|
12
12
|
|
|
13
13
|
return {
|
|
@@ -18,4 +18,6 @@ export const MessagePartClient = resource(function MessagePartClient({
|
|
|
18
18
|
runtime.respondToToolApproval(response),
|
|
19
19
|
__internal_getRuntime: () => runtime,
|
|
20
20
|
};
|
|
21
|
-
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const MessagePartClient = resource(useMessagePartClient);
|
|
@@ -12,43 +12,47 @@ import { MessagePartClient } from "./message-part-runtime-client";
|
|
|
12
12
|
import type { MessageState } from "../scopes/message";
|
|
13
13
|
import { AttachmentRuntimeClient } from "./attachment-runtime-client";
|
|
14
14
|
|
|
15
|
+
const useMessageAttachmentClientByIndex = ({
|
|
16
|
+
runtime,
|
|
17
|
+
index,
|
|
18
|
+
}: {
|
|
19
|
+
runtime: MessageRuntime;
|
|
20
|
+
index: number;
|
|
21
|
+
}) => {
|
|
22
|
+
const attachmentRuntime = useMemo(
|
|
23
|
+
() => runtime.getAttachmentByIndex(index),
|
|
24
|
+
[runtime, index],
|
|
25
|
+
);
|
|
26
|
+
return useResource(AttachmentRuntimeClient({ runtime: attachmentRuntime }));
|
|
27
|
+
};
|
|
28
|
+
|
|
15
29
|
const MessageAttachmentClientByIndex = resource(
|
|
16
|
-
|
|
17
|
-
runtime,
|
|
18
|
-
index,
|
|
19
|
-
}: {
|
|
20
|
-
runtime: MessageRuntime;
|
|
21
|
-
index: number;
|
|
22
|
-
}) {
|
|
23
|
-
const attachmentRuntime = useMemo(
|
|
24
|
-
() => runtime.getAttachmentByIndex(index),
|
|
25
|
-
[runtime, index],
|
|
26
|
-
);
|
|
27
|
-
return useResource(AttachmentRuntimeClient({ runtime: attachmentRuntime }));
|
|
28
|
-
},
|
|
30
|
+
useMessageAttachmentClientByIndex,
|
|
29
31
|
);
|
|
30
32
|
|
|
31
|
-
const
|
|
33
|
+
const useMessagePartByIndex = ({
|
|
32
34
|
runtime,
|
|
33
35
|
index,
|
|
34
36
|
}: {
|
|
35
37
|
runtime: MessageRuntime;
|
|
36
38
|
index: number;
|
|
37
|
-
}) {
|
|
39
|
+
}) => {
|
|
38
40
|
const partRuntime = useMemo(
|
|
39
41
|
() => runtime.getMessagePartByIndex(index),
|
|
40
42
|
[runtime, index],
|
|
41
43
|
);
|
|
42
44
|
return useResource(MessagePartClient({ runtime: partRuntime }));
|
|
43
|
-
}
|
|
45
|
+
};
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
const MessagePartByIndex = resource(useMessagePartByIndex);
|
|
48
|
+
|
|
49
|
+
const useMessageClient = ({
|
|
46
50
|
runtime,
|
|
47
51
|
threadIdRef,
|
|
48
52
|
}: {
|
|
49
53
|
runtime: MessageRuntime;
|
|
50
54
|
threadIdRef: { current: string };
|
|
51
|
-
}): ClientOutput<"message"> {
|
|
55
|
+
}): ClientOutput<"message"> => {
|
|
52
56
|
const runtimeState = useSubscribable(runtime);
|
|
53
57
|
|
|
54
58
|
const [isCopiedState, setIsCopied] = useState(false);
|
|
@@ -117,6 +121,7 @@ export const MessageClient = resource(function MessageClient({
|
|
|
117
121
|
|
|
118
122
|
composer: () => composer.methods,
|
|
119
123
|
|
|
124
|
+
delete: () => runtime.delete(),
|
|
120
125
|
reload: (config) => runtime.reload(config),
|
|
121
126
|
speak: () => runtime.speak(),
|
|
122
127
|
stopSpeaking: () => runtime.stopSpeaking(),
|
|
@@ -144,4 +149,6 @@ export const MessageClient = resource(function MessageClient({
|
|
|
144
149
|
|
|
145
150
|
__internal_getRuntime: () => runtime,
|
|
146
151
|
};
|
|
147
|
-
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const MessageClient = resource(useMessageClient);
|
|
@@ -8,11 +8,11 @@ import type {
|
|
|
8
8
|
} from "../../runtime/api/thread-list-item-runtime";
|
|
9
9
|
import { useSubscribable } from "./useSubscribable";
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const useThreadListItemClient = ({
|
|
12
12
|
runtime,
|
|
13
13
|
}: {
|
|
14
14
|
runtime: ThreadListItemRuntime;
|
|
15
|
-
}): ClientOutput<"threadListItem"> {
|
|
15
|
+
}): ClientOutput<"threadListItem"> => {
|
|
16
16
|
const state = useSubscribable(runtime);
|
|
17
17
|
const emit = useAssistantEmit();
|
|
18
18
|
|
|
@@ -53,4 +53,6 @@ export const ThreadListItemClient = resource(function ThreadListItemClient({
|
|
|
53
53
|
detach: runtime.detach,
|
|
54
54
|
__internal_getRuntime: () => runtime,
|
|
55
55
|
};
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const ThreadListItemClient = resource(useThreadListItemClient);
|
|
@@ -12,13 +12,13 @@ import { ThreadListItemClient } from "./thread-list-item-runtime-client";
|
|
|
12
12
|
import { ThreadClient } from "./thread-runtime-client";
|
|
13
13
|
import type { ThreadsState } from "../scopes/threads";
|
|
14
14
|
|
|
15
|
-
const
|
|
15
|
+
const useThreadListItemClientById = ({
|
|
16
16
|
runtime,
|
|
17
17
|
id,
|
|
18
18
|
}: {
|
|
19
19
|
runtime: ThreadListRuntime;
|
|
20
20
|
id: string;
|
|
21
|
-
}) {
|
|
21
|
+
}) => {
|
|
22
22
|
const threadListItemRuntime = useMemo(
|
|
23
23
|
() => runtime.getItemById(id),
|
|
24
24
|
[runtime, id],
|
|
@@ -28,15 +28,17 @@ const ThreadListItemClientById = resource(function ThreadListItemClientById({
|
|
|
28
28
|
runtime: threadListItemRuntime,
|
|
29
29
|
}),
|
|
30
30
|
);
|
|
31
|
-
}
|
|
31
|
+
};
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const ThreadListItemClientById = resource(useThreadListItemClientById);
|
|
34
|
+
|
|
35
|
+
const useThreadListClient = ({
|
|
34
36
|
runtime,
|
|
35
37
|
__internal_assistantRuntime,
|
|
36
38
|
}: {
|
|
37
39
|
runtime: ThreadListRuntime;
|
|
38
40
|
__internal_assistantRuntime: AssistantRuntime;
|
|
39
|
-
}): ClientOutput<"threads"> {
|
|
41
|
+
}): ClientOutput<"threads"> => {
|
|
40
42
|
const runtimeState = useSubscribable(runtime);
|
|
41
43
|
|
|
42
44
|
const main = useClientResource(
|
|
@@ -96,4 +98,6 @@ export const ThreadListClient = resource(function ThreadListClient({
|
|
|
96
98
|
loadMore: () => runtime.loadMore(),
|
|
97
99
|
__internal_getAssistantRuntime: () => __internal_assistantRuntime,
|
|
98
100
|
};
|
|
99
|
-
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const ThreadListClient = resource(useThreadListClient);
|
|
@@ -14,7 +14,7 @@ import { MessageClient } from "./message-runtime-client";
|
|
|
14
14
|
import { useSubscribable } from "./useSubscribable";
|
|
15
15
|
import type { ThreadState } from "../scopes/thread";
|
|
16
16
|
|
|
17
|
-
const
|
|
17
|
+
const useMessageClientById = ({
|
|
18
18
|
runtime,
|
|
19
19
|
id,
|
|
20
20
|
threadIdRef,
|
|
@@ -22,20 +22,22 @@ const MessageClientById = resource(function MessageClientById({
|
|
|
22
22
|
runtime: ThreadRuntime;
|
|
23
23
|
id: string;
|
|
24
24
|
threadIdRef: RefObject<string>;
|
|
25
|
-
}) {
|
|
25
|
+
}) => {
|
|
26
26
|
const messageRuntime = useMemo(
|
|
27
27
|
() => runtime.getMessageById(id),
|
|
28
28
|
[runtime, id],
|
|
29
29
|
);
|
|
30
30
|
|
|
31
31
|
return useResource(MessageClient({ runtime: messageRuntime, threadIdRef }));
|
|
32
|
-
}
|
|
32
|
+
};
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
const MessageClientById = resource(useMessageClientById);
|
|
35
|
+
|
|
36
|
+
const useThreadClient = ({
|
|
35
37
|
runtime,
|
|
36
38
|
}: {
|
|
37
39
|
runtime: ThreadRuntime;
|
|
38
|
-
}): ClientOutput<"thread"> {
|
|
40
|
+
}): ClientOutput<"thread"> => {
|
|
39
41
|
const runtimeState = useSubscribable(runtime);
|
|
40
42
|
const emit = useAssistantEmit();
|
|
41
43
|
|
|
@@ -109,6 +111,7 @@ export const ThreadClient = resource(function ThreadClient({
|
|
|
109
111
|
getState: () => state,
|
|
110
112
|
composer: () => composer.methods,
|
|
111
113
|
append: runtime.append,
|
|
114
|
+
deleteMessage: runtime.deleteMessage,
|
|
112
115
|
startRun: runtime.startRun,
|
|
113
116
|
resumeRun: runtime.resumeRun,
|
|
114
117
|
cancelRun: runtime.cancelRun,
|
|
@@ -132,4 +135,6 @@ export const ThreadClient = resource(function ThreadClient({
|
|
|
132
135
|
},
|
|
133
136
|
__internal_getRuntime: () => runtime,
|
|
134
137
|
};
|
|
135
|
-
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export const ThreadClient = resource(useThreadClient);
|
|
@@ -42,6 +42,7 @@ export type MessageMethods = {
|
|
|
42
42
|
*/
|
|
43
43
|
getState(): MessageState;
|
|
44
44
|
composer(): ComposerMethods;
|
|
45
|
+
delete(): void | Promise<void>;
|
|
45
46
|
reload(config?: { runConfig?: RunConfig }): void;
|
|
46
47
|
/** @deprecated This API is still under active development and might change without notice. */
|
|
47
48
|
speak(): void;
|
|
@@ -6,6 +6,7 @@ export type ThreadListItemState = {
|
|
|
6
6
|
readonly remoteId: string | undefined;
|
|
7
7
|
readonly externalId: string | undefined;
|
|
8
8
|
readonly title?: string | undefined;
|
|
9
|
+
readonly lastMessageAt?: Date | undefined;
|
|
9
10
|
readonly status: ThreadListItemStatus;
|
|
10
11
|
readonly custom?: Record<string, unknown> | undefined;
|
|
11
12
|
};
|
|
@@ -88,6 +88,7 @@ export type ThreadMethods = {
|
|
|
88
88
|
* ```
|
|
89
89
|
*/
|
|
90
90
|
append(message: CreateAppendMessage): void;
|
|
91
|
+
deleteMessage(messageId: string): void | Promise<void>;
|
|
91
92
|
/**
|
|
92
93
|
* Start a new run with the given configuration.
|
|
93
94
|
* @param config The configuration for starting the run
|
|
@@ -49,6 +49,15 @@ describe("ExternalStoreThreadRuntimeCore - state reference stability", () => {
|
|
|
49
49
|
expect(runtime.capabilities).not.toBe(capsBefore);
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
+
it("enables delete when setMessages is provided", () => {
|
|
53
|
+
const runtime = new ExternalStoreThreadRuntimeCore(
|
|
54
|
+
mockContextProvider,
|
|
55
|
+
makeStore({ setMessages: vi.fn() }),
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
expect(runtime.capabilities.delete).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
52
61
|
it("should maintain stable reference across repeated setAdapter calls", () => {
|
|
53
62
|
const runtime = new ExternalStoreThreadRuntimeCore(
|
|
54
63
|
mockContextProvider,
|
|
@@ -152,6 +161,54 @@ describe("ExternalStoreThreadRuntimeCore - state reference stability", () => {
|
|
|
152
161
|
|
|
153
162
|
expect(runtime.capabilities).toBe(capsBefore);
|
|
154
163
|
});
|
|
164
|
+
|
|
165
|
+
describe("deleteMessage", () => {
|
|
166
|
+
it("removes only the selected message", async () => {
|
|
167
|
+
const setMessages = vi.fn();
|
|
168
|
+
const runtime = new ExternalStoreThreadRuntimeCore(
|
|
169
|
+
mockContextProvider,
|
|
170
|
+
makeStore({
|
|
171
|
+
messages: [
|
|
172
|
+
{
|
|
173
|
+
id: "u1",
|
|
174
|
+
role: "user",
|
|
175
|
+
content: [{ type: "text", text: "first" }],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: "a1",
|
|
179
|
+
role: "assistant",
|
|
180
|
+
content: [{ type: "text", text: "answer" }],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: "u2",
|
|
184
|
+
role: "user",
|
|
185
|
+
content: [{ type: "text", text: "second" }],
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
setMessages,
|
|
189
|
+
}),
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
await runtime.deleteMessage("a1");
|
|
193
|
+
|
|
194
|
+
expect(setMessages).toHaveBeenCalledWith([
|
|
195
|
+
expect.objectContaining({ id: "u1" }),
|
|
196
|
+
expect.objectContaining({ id: "u2" }),
|
|
197
|
+
]);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("delegates to onDelete when provided", async () => {
|
|
201
|
+
const onDelete = vi.fn();
|
|
202
|
+
const runtime = new ExternalStoreThreadRuntimeCore(
|
|
203
|
+
mockContextProvider,
|
|
204
|
+
makeStore({ onDelete }),
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
await runtime.deleteMessage("m1");
|
|
208
|
+
|
|
209
|
+
expect(onDelete).toHaveBeenCalledWith("m1");
|
|
210
|
+
});
|
|
211
|
+
});
|
|
155
212
|
});
|
|
156
213
|
describe("ExternalStoreThreadRuntimeCore - optimistic message reconciliation", () => {
|
|
157
214
|
type Raw = {
|