@antdv-next/x-sdk 0.0.1 → 0.0.3

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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_util/resolveMaybeRef.d.ts +2 -0
  3. package/dist/_util/resolveMaybeRef.js +7 -0
  4. package/dist/_util/types.js +0 -0
  5. package/dist/chat-providers/AbstractChatProvider.d.ts +2 -2
  6. package/dist/chat-providers/AbstractChatProvider.js +42 -0
  7. package/dist/chat-providers/DeepSeekChatProvider.d.ts +2 -2
  8. package/dist/chat-providers/DeepSeekChatProvider.js +59 -0
  9. package/dist/chat-providers/DefaultChatProvider.d.ts +2 -2
  10. package/dist/chat-providers/DefaultChatProvider.js +26 -0
  11. package/dist/chat-providers/OpenAIChatProvider.d.ts +2 -2
  12. package/dist/chat-providers/OpenAIChatProvider.js +49 -0
  13. package/dist/chat-providers/index.js +4 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.js +7 -3
  16. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/expect/index.js +1467 -0
  17. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/pretty-format/index.js +884 -0
  18. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/runner/chunk-artifact.js +1513 -0
  19. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/snapshot/index.js +661 -0
  20. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/spy/index.js +384 -0
  21. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/chunk-pathe.M-eThtNZ.js +80 -0
  22. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/diff.js +1304 -0
  23. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/display.js +556 -0
  24. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/error.js +27 -0
  25. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/helpers.js +179 -0
  26. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/offset.js +25 -0
  27. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/serialize.js +75 -0
  28. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/source-map.js +371 -0
  29. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/utils/timers.js +35 -0
  30. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/_commonjsHelpers.D26ty3Ew.js +4 -0
  31. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/rpc.MzXet3jl.js +50 -0
  32. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/test.CBQUpOM3.js +2645 -0
  33. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/utils.BX5Fg8C4.js +42 -0
  34. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/chai.js +2872 -0
  35. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/magic-string.js +1009 -0
  36. package/dist/node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/tinyrainbow.js +84 -0
  37. package/dist/x-chat/__tests__/index.test.d.ts +1 -0
  38. package/dist/x-chat/__tests__/index.test.js +258 -0
  39. package/dist/x-chat/index.d.ts +14 -23
  40. package/dist/x-chat/index.js +85 -67
  41. package/dist/x-chat/store.d.ts +2 -0
  42. package/dist/{store-C1diHqNH.js → x-chat/store.js} +15 -9
  43. package/dist/x-conversations/__tests__/index.test.d.ts +1 -0
  44. package/dist/x-conversations/__tests__/index.test.js +36 -0
  45. package/dist/x-conversations/index.d.ts +4 -4
  46. package/dist/x-conversations/index.js +37 -1
  47. package/dist/{x-conversations-BrKWhj5r.js → x-conversations/store.js} +2 -31
  48. package/dist/x-request/__tests__/index.test.d.ts +1 -0
  49. package/dist/x-request/__tests__/index.test.js +90 -0
  50. package/dist/x-request/index.d.ts +36 -11
  51. package/dist/x-request/index.js +246 -1
  52. package/dist/x-request/x-fetch.js +18 -0
  53. package/dist/x-stream/__tests__/index.test.d.ts +1 -0
  54. package/dist/x-stream/__tests__/index.test.js +62 -0
  55. package/dist/x-stream/index.js +16 -5
  56. package/package.json +2 -1
  57. package/dist/chat-providers-5x9Va7p5.js +0 -167
  58. package/dist/x-request-BSFGaKND.js +0 -234
@@ -0,0 +1,84 @@
1
+ //#region ../../node_modules/.pnpm/@voidzero-dev+vite-plus-test@0.1.14_@types+node@24.12.0_@voidzero-dev+vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/vendor/tinyrainbow.mjs
2
+ var d = {
3
+ reset: [0, 0],
4
+ bold: [
5
+ 1,
6
+ 22,
7
+ "\x1B[22m\x1B[1m"
8
+ ],
9
+ dim: [
10
+ 2,
11
+ 22,
12
+ "\x1B[22m\x1B[2m"
13
+ ],
14
+ italic: [3, 23],
15
+ underline: [4, 24],
16
+ inverse: [7, 27],
17
+ hidden: [8, 28],
18
+ strikethrough: [9, 29],
19
+ black: [30, 39],
20
+ red: [31, 39],
21
+ green: [32, 39],
22
+ yellow: [33, 39],
23
+ blue: [34, 39],
24
+ magenta: [35, 39],
25
+ cyan: [36, 39],
26
+ white: [37, 39],
27
+ gray: [90, 39],
28
+ bgBlack: [40, 49],
29
+ bgRed: [41, 49],
30
+ bgGreen: [42, 49],
31
+ bgYellow: [43, 49],
32
+ bgBlue: [44, 49],
33
+ bgMagenta: [45, 49],
34
+ bgCyan: [46, 49],
35
+ bgWhite: [47, 49],
36
+ blackBright: [90, 39],
37
+ redBright: [91, 39],
38
+ greenBright: [92, 39],
39
+ yellowBright: [93, 39],
40
+ blueBright: [94, 39],
41
+ magentaBright: [95, 39],
42
+ cyanBright: [96, 39],
43
+ whiteBright: [97, 39],
44
+ bgBlackBright: [100, 49],
45
+ bgRedBright: [101, 49],
46
+ bgGreenBright: [102, 49],
47
+ bgYellowBright: [103, 49],
48
+ bgBlueBright: [104, 49],
49
+ bgMagentaBright: [105, 49],
50
+ bgCyanBright: [106, 49],
51
+ bgWhiteBright: [107, 49]
52
+ };
53
+ function g(e) {
54
+ return String(e);
55
+ }
56
+ g.open = "";
57
+ g.close = "";
58
+ function h() {
59
+ let e = typeof process != "undefined" ? process : void 0, n = (e == null ? void 0 : e.env) || {}, a = n.FORCE_TTY !== "false", i = (e == null ? void 0 : e.argv) || [];
60
+ return !("NO_COLOR" in n || i.includes("--no-color")) && ("FORCE_COLOR" in n || i.includes("--color") || (e == null ? void 0 : e.platform) === "win32" || a && n.TERM !== "dumb" || "CI" in n) || typeof window != "undefined" && !!window.chrome;
61
+ }
62
+ function f() {
63
+ let e = h(), n = (r, t, u, o) => {
64
+ let l = "", s = 0;
65
+ do
66
+ l += r.substring(s, o) + u, s = o + t.length, o = r.indexOf(t, s);
67
+ while (~o);
68
+ return l + r.substring(s);
69
+ }, a = (r, t, u = r) => {
70
+ let o = (l) => {
71
+ let s = String(l), b = s.indexOf(t, r.length);
72
+ return ~b ? r + n(s, t, u, b) + t : r + s + t;
73
+ };
74
+ return o.open = r, o.close = t, o;
75
+ }, i = { isColorSupported: e }, c = (r) => `\x1B[${r}m`;
76
+ for (let r in d) {
77
+ let t = d[r];
78
+ i[r] = e ? a(c(t[0]), c(t[1]), t[2]) : g;
79
+ }
80
+ return i;
81
+ }
82
+ var C = f();
83
+ //#endregion
84
+ export { f as createColors, C as default, h as isSupported };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,258 @@
1
+ import AbstractChatProvider from "../../chat-providers/AbstractChatProvider.js";
2
+ import { AbstractXRequestClass } from "../../x-request/index.js";
3
+ import { chatMessagesStoreHelper } from "../store.js";
4
+ import useXChat from "../index.js";
5
+ import { h as describe, m as it } from "../../node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/@vitest/runner/chunk-artifact.js";
6
+ import { g as globalExpect, v as vi } from "../../node_modules/.pnpm/@voidzero-dev_vite-plus-test@0.1.14_@types_node@24.12.0_@voidzero-dev_vite-plus-core@0._0c620f79340a656256b2ffe23b3e6dd1/node_modules/@voidzero-dev/vite-plus-test/dist/chunks/test.CBQUpOM3.js";
7
+ import { computed, effectScope, nextTick, reactive, readonly, ref } from "vue";
8
+ //#region src/x-chat/__tests__/index.test.ts
9
+ var MockManualRequest = class extends AbstractXRequestClass {
10
+ shouldFail;
11
+ _asyncHandler = Promise.resolve();
12
+ _state = reactive({
13
+ isTimeout: false,
14
+ isStreamTimeout: false,
15
+ isRequesting: false
16
+ });
17
+ constructor(shouldFail) {
18
+ super("https://mock.request", { manual: true });
19
+ this.shouldFail = shouldFail;
20
+ }
21
+ get asyncHandler() {
22
+ return this._asyncHandler;
23
+ }
24
+ get isTimeout() {
25
+ return this._state.isTimeout;
26
+ }
27
+ get isStreamTimeout() {
28
+ return this._state.isStreamTimeout;
29
+ }
30
+ get isRequesting() {
31
+ return this._state.isRequesting;
32
+ }
33
+ get manual() {
34
+ return true;
35
+ }
36
+ get state() {
37
+ return readonly(this._state);
38
+ }
39
+ run(params) {
40
+ const callbacks = this.options.callbacks;
41
+ this._state.isRequesting = true;
42
+ this._asyncHandler = new Promise((resolve) => {
43
+ setTimeout(() => {
44
+ const headers = new Headers({ "content-type": "application/json" });
45
+ if (this.shouldFail.value) callbacks?.onError?.(/* @__PURE__ */ new Error("MockError"), { error: { message: "mock failed" } }, headers);
46
+ else {
47
+ const chunk = `echo:${params?.input || ""}`;
48
+ callbacks?.onUpdate?.(chunk, headers);
49
+ callbacks?.onSuccess?.([chunk], headers);
50
+ }
51
+ this._state.isRequesting = false;
52
+ resolve();
53
+ }, 0);
54
+ });
55
+ }
56
+ abort() {
57
+ this._state.isRequesting = false;
58
+ }
59
+ };
60
+ var MockProvider = class extends AbstractChatProvider {
61
+ transformParams(requestParams) {
62
+ return { input: requestParams.input || "" };
63
+ }
64
+ transformLocalMessage(requestParams) {
65
+ return requestParams.input || "";
66
+ }
67
+ transformMessage(info) {
68
+ if (info.chunk) return info.chunk;
69
+ if (Array.isArray(info.chunks) && info.chunks.length > 0) return info.chunks[info.chunks.length - 1];
70
+ return info.originMessage || "";
71
+ }
72
+ };
73
+ var DeferredManualRequest = class extends AbstractXRequestClass {
74
+ _state = reactive({
75
+ isTimeout: false,
76
+ isStreamTimeout: false,
77
+ isRequesting: false
78
+ });
79
+ callbacks;
80
+ params;
81
+ constructor() {
82
+ super("https://mock.request", { manual: true });
83
+ }
84
+ get asyncHandler() {
85
+ return Promise.resolve();
86
+ }
87
+ get isTimeout() {
88
+ return this._state.isTimeout;
89
+ }
90
+ get isStreamTimeout() {
91
+ return this._state.isStreamTimeout;
92
+ }
93
+ get isRequesting() {
94
+ return this._state.isRequesting;
95
+ }
96
+ get manual() {
97
+ return true;
98
+ }
99
+ get state() {
100
+ return readonly(this._state);
101
+ }
102
+ run(params) {
103
+ this.params = params;
104
+ this.callbacks = this.options.callbacks;
105
+ this._state.isRequesting = true;
106
+ }
107
+ resolve() {
108
+ const headers = new Headers({ "content-type": "application/json" });
109
+ const chunk = `echo:${this.params?.input || ""}`;
110
+ this.callbacks?.onUpdate?.(chunk, headers);
111
+ this.callbacks?.onSuccess?.([chunk], headers);
112
+ this._state.isRequesting = false;
113
+ }
114
+ abort() {
115
+ this._state.isRequesting = false;
116
+ }
117
+ };
118
+ describe("useXChat", () => {
119
+ it("uses reactive requestPlaceholder and requestFallback refs", async () => {
120
+ vi.useFakeTimers();
121
+ const shouldFail = ref(false);
122
+ const request = new MockManualRequest(shouldFail);
123
+ const provider = new MockProvider({ request });
124
+ const requestPlaceholder = ref("Thinking #1");
125
+ const requestFallback = ref("Fallback #1");
126
+ const scope = effectScope();
127
+ const chat = scope.run(() => useXChat({
128
+ provider,
129
+ requestPlaceholder,
130
+ requestFallback
131
+ }));
132
+ globalExpect(chat).toBeTruthy();
133
+ if (!chat) return;
134
+ chat.onRequest({ input: "hello" });
135
+ globalExpect(chat.messages.value.at(-1)?.status).toBe("loading");
136
+ globalExpect(chat.messages.value.at(-1)?.message).toBe("Thinking #1");
137
+ await vi.runAllTimersAsync();
138
+ await request.asyncHandler;
139
+ requestPlaceholder.value = "Thinking #2";
140
+ chat.onRequest({ input: "again" });
141
+ globalExpect(chat.messages.value.at(-1)?.status).toBe("loading");
142
+ globalExpect(chat.messages.value.at(-1)?.message).toBe("Thinking #2");
143
+ await vi.runAllTimersAsync();
144
+ await request.asyncHandler;
145
+ shouldFail.value = true;
146
+ chat.onRequest({ input: "error" });
147
+ await vi.runAllTimersAsync();
148
+ await request.asyncHandler;
149
+ globalExpect(chat.messages.value.at(-1)?.status).toBe("error");
150
+ globalExpect(chat.messages.value.at(-1)?.message).toBe("Fallback #1");
151
+ requestFallback.value = "Fallback #2";
152
+ chat.onRequest({ input: "error-again" });
153
+ await vi.runAllTimersAsync();
154
+ await request.asyncHandler;
155
+ globalExpect(chat.messages.value.at(-1)?.status).toBe("error");
156
+ globalExpect(chat.messages.value.at(-1)?.message).toBe("Fallback #2");
157
+ scope.stop();
158
+ vi.useRealTimers();
159
+ });
160
+ it("refreshes default messages when defaultMessages ref changes", async () => {
161
+ const defaultMessages = ref([{ message: "history-1" }]);
162
+ const scope = effectScope();
163
+ const chat = scope.run(() => useXChat({ defaultMessages }));
164
+ globalExpect(chat).toBeTruthy();
165
+ if (!chat) return;
166
+ await Promise.resolve();
167
+ await nextTick();
168
+ globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["history-1"]);
169
+ defaultMessages.value = [{ message: "history-2" }];
170
+ await nextTick();
171
+ await Promise.resolve();
172
+ globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["history-2"]);
173
+ scope.stop();
174
+ });
175
+ it("accepts computed provider refs", async () => {
176
+ vi.useFakeTimers();
177
+ const shouldFail = ref(false);
178
+ const provider = computed(() => new MockProvider({ request: new MockManualRequest(shouldFail) }));
179
+ const scope = effectScope();
180
+ const chat = scope.run(() => useXChat({ provider }));
181
+ globalExpect(chat).toBeTruthy();
182
+ if (!chat) return;
183
+ chat.onRequest({ input: "provider" });
184
+ await vi.runAllTimersAsync();
185
+ globalExpect(chat.messages.value.at(-1)?.status).toBe("success");
186
+ scope.stop();
187
+ vi.useRealTimers();
188
+ });
189
+ it("derives parsedMessages from parser output", async () => {
190
+ vi.useFakeTimers();
191
+ const scope = effectScope();
192
+ const chat = scope.run(() => useXChat({ parser: (message) => [message.toUpperCase(), `${message}!`] }));
193
+ globalExpect(chat).toBeTruthy();
194
+ if (!chat) return;
195
+ await Promise.resolve();
196
+ await nextTick();
197
+ chat.setMessages([{
198
+ id: "msg_1",
199
+ message: "hello",
200
+ status: "success"
201
+ }]);
202
+ await vi.advanceTimersByTimeAsync(60);
203
+ await nextTick();
204
+ globalExpect(chat.parsedMessages.value).toEqual([{
205
+ id: "msg_1_0",
206
+ message: "HELLO",
207
+ status: "success"
208
+ }, {
209
+ id: "msg_1_1",
210
+ message: "hello!",
211
+ status: "success"
212
+ }]);
213
+ scope.stop();
214
+ vi.useRealTimers();
215
+ });
216
+ it("keeps streaming updates isolated to the request conversation after switching", async () => {
217
+ const activeConversationKey = ref("a");
218
+ const requestA = new DeferredManualRequest();
219
+ const requestB = new DeferredManualRequest();
220
+ const providers = {
221
+ a: new MockProvider({ request: requestA }),
222
+ b: new MockProvider({ request: requestB })
223
+ };
224
+ const scope = effectScope();
225
+ const chat = scope.run(() => useXChat({
226
+ provider: computed(() => providers[activeConversationKey.value]),
227
+ conversationKey: activeConversationKey
228
+ }));
229
+ globalExpect(chat).toBeTruthy();
230
+ if (!chat) return;
231
+ await Promise.resolve();
232
+ await nextTick();
233
+ chat.onRequest({ input: "from-a" });
234
+ globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["from-a"]);
235
+ activeConversationKey.value = "b";
236
+ await nextTick();
237
+ globalExpect(chat.messages.value).toEqual([]);
238
+ requestA.resolve();
239
+ await nextTick();
240
+ globalExpect(chat.messages.value).toEqual([]);
241
+ globalExpect(chatMessagesStoreHelper.getMessages("a")?.map((item) => ({
242
+ message: item.message,
243
+ status: item.status
244
+ }))).toEqual([{
245
+ message: "from-a",
246
+ status: "local"
247
+ }, {
248
+ message: "echo:from-a",
249
+ status: "success"
250
+ }]);
251
+ globalExpect(chatMessagesStoreHelper.getMessages("b")).toEqual([]);
252
+ activeConversationKey.value = "a";
253
+ await nextTick();
254
+ globalExpect(chat.messages.value.map((item) => item.message)).toEqual(["from-a", "echo:from-a"]);
255
+ scope.stop();
256
+ });
257
+ });
258
+ //#endregion
@@ -1,4 +1,4 @@
1
- import { Ref } from 'vue';
1
+ import { MaybeRef } from 'vue';
2
2
  import { AnyObject } from '../_util/types';
3
3
  import { ConversationData } from '../x-conversations';
4
4
  import { SSEOutput } from '../x-stream';
@@ -26,18 +26,19 @@ type RequestFallbackFn<Input, MessageInfoType, Message> = (requestParams: Partia
26
26
  export type RequestParams<Message> = {
27
27
  [Key: PropertyKey]: Message;
28
28
  } & AnyObject;
29
- type MaybeRef<T> = T | Ref<T>;
29
+ type ParserFn<ChatMessage, BubbleMessage> = (message: ChatMessage) => BubbleMessage | BubbleMessage[];
30
+ type DefaultMessagesFn<ChatMessage extends SimpleType> = ((info: {
31
+ conversationKey?: ConversationData["key"];
32
+ }) => Promise<DefaultMessageInfo<ChatMessage>[]>) | ((info?: {
33
+ conversationKey?: ConversationData["key"];
34
+ }) => DefaultMessageInfo<ChatMessage>[]);
30
35
  export interface XChatConfig<ChatMessage extends SimpleType = string, BubbleMessage extends SimpleType = ChatMessage, Input = ChatMessage, Output = ChatMessage> {
31
- provider?: AbstractChatProvider<ChatMessage, Input, Output>;
36
+ provider?: MaybeRef<AbstractChatProvider<ChatMessage, Input, Output>>;
32
37
  conversationKey?: MaybeRef<ConversationData["key"] | undefined>;
33
- defaultMessages?: DefaultMessageInfo<ChatMessage>[] | ((info: {
34
- conversationKey?: ConversationData["key"];
35
- }) => Promise<DefaultMessageInfo<ChatMessage>[]>) | ((info?: {
36
- conversationKey?: ConversationData["key"];
37
- }) => DefaultMessageInfo<ChatMessage>[]);
38
- parser?: (message: ChatMessage) => BubbleMessage | BubbleMessage[];
39
- requestPlaceholder?: ChatMessage | RequestPlaceholderFn<Input, ChatMessage>;
40
- requestFallback?: ChatMessage | RequestFallbackFn<Input, MessageInfo<ChatMessage>, ChatMessage>;
38
+ defaultMessages?: MaybeRef<DefaultMessageInfo<ChatMessage>[]> | DefaultMessagesFn<ChatMessage>;
39
+ parser?: ParserFn<ChatMessage, BubbleMessage> | undefined;
40
+ requestPlaceholder?: MaybeRef<ChatMessage> | RequestPlaceholderFn<Input, ChatMessage>;
41
+ requestFallback?: MaybeRef<ChatMessage> | RequestFallbackFn<Input, MessageInfo<ChatMessage>, ChatMessage>;
41
42
  }
42
43
  export interface MessageInfo<Message extends SimpleType> {
43
44
  id: number | string;
@@ -58,18 +59,8 @@ export default function useXChat<ChatMessage extends SimpleType = string, Parsed
58
59
  readonly onRequest: (requestParams: Partial<Input>, opts?: {
59
60
  extraInfo: AnyObject;
60
61
  }) => void;
61
- readonly isDefaultMessagesRequesting: Ref<boolean, boolean>;
62
- readonly messages: Ref<{
63
- id: number | string;
64
- message: import('vue').UnwrapRef<ChatMessage>;
65
- status: MessageStatus;
66
- extraInfo?: AnyObject | undefined;
67
- }[], MessageInfo<ChatMessage>[] | {
68
- id: number | string;
69
- message: import('vue').UnwrapRef<ChatMessage>;
70
- status: MessageStatus;
71
- extraInfo?: AnyObject | undefined;
72
- }[]>;
62
+ readonly isDefaultMessagesRequesting: Readonly<import('vue').Ref<boolean, boolean>>;
63
+ readonly messages: import('vue').ShallowRef<MessageInfo<ChatMessage>[], MessageInfo<ChatMessage>[]>;
73
64
  readonly parsedMessages: import('vue').ComputedRef<MessageInfo<ParsedMessage>[]>;
74
65
  readonly setMessages: (updater: MessageInfo<ChatMessage>[] | ((ori: MessageInfo<ChatMessage>[]) => MessageInfo<ChatMessage>[])) => boolean;
75
66
  readonly removeMessage: (id: string | number) => boolean;