@saber2pr/ai-assistant 0.0.4

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/ReadMe.md +57 -0
  2. package/lib/app.d.ts +1 -0
  3. package/lib/app.js +27 -0
  4. package/lib/chat.d.ts +3 -0
  5. package/lib/chat.js +222 -0
  6. package/lib/chat.style.d.ts +12 -0
  7. package/lib/chat.style.js +20 -0
  8. package/lib/components/Codeblock/index.d.ts +9 -0
  9. package/lib/components/Codeblock/index.js +55 -0
  10. package/lib/components/Codeblock/index.style.d.ts +1 -0
  11. package/lib/components/Codeblock/index.style.js +13 -0
  12. package/lib/components/MarkdownText/index.d.ts +3 -0
  13. package/lib/components/MarkdownText/index.js +71 -0
  14. package/lib/components/MyRuntimeProvider/index.d.ts +5 -0
  15. package/lib/components/MyRuntimeProvider/index.js +22 -0
  16. package/lib/components/MyRuntimeProvider/myModelAdapterStream.d.ts +4 -0
  17. package/lib/components/MyRuntimeProvider/myModelAdapterStream.js +180 -0
  18. package/lib/components/Thread/index.d.ts +2 -0
  19. package/lib/components/Thread/index.js +286 -0
  20. package/lib/components/Thread/index.style.d.ts +15 -0
  21. package/lib/components/Thread/index.style.js +18 -0
  22. package/lib/components/ThreadList/index.d.ts +4 -0
  23. package/lib/components/ThreadList/index.js +131 -0
  24. package/lib/constants/index.d.ts +1 -0
  25. package/lib/constants/index.js +4 -0
  26. package/lib/context.d.ts +3 -0
  27. package/lib/context.js +8 -0
  28. package/lib/hooks/useAsync.d.ts +14 -0
  29. package/lib/hooks/useAsync.js +105 -0
  30. package/lib/hooks/useCopy.d.ts +5 -0
  31. package/lib/hooks/useCopy.js +48 -0
  32. package/lib/hooks/useI18n.d.ts +5 -0
  33. package/lib/hooks/useI18n.js +16 -0
  34. package/lib/i18n/i18n.d.ts +14 -0
  35. package/lib/i18n/i18n.js +31 -0
  36. package/lib/i18n/index.d.ts +6 -0
  37. package/lib/i18n/index.js +7 -0
  38. package/lib/i18n/locale.d.ts +4 -0
  39. package/lib/i18n/locale.js +7 -0
  40. package/lib/i18n/locales.d.ts +36 -0
  41. package/lib/i18n/locales.js +37 -0
  42. package/lib/index.d.ts +1 -0
  43. package/lib/index.js +17 -0
  44. package/lib/llm/context.d.ts +3 -0
  45. package/lib/llm/context.js +10 -0
  46. package/lib/llm/engine.d.ts +6 -0
  47. package/lib/llm/engine.js +53 -0
  48. package/lib/styles.d.ts +6 -0
  49. package/lib/styles.js +18 -0
  50. package/lib/types/assistant.d.ts +53 -0
  51. package/lib/types/assistant.js +2 -0
  52. package/lib/utils/event.d.ts +8 -0
  53. package/lib/utils/event.js +28 -0
  54. package/lib/utils/parseStreamData.d.ts +5 -0
  55. package/lib/utils/parseStreamData.js +33 -0
  56. package/lib/utils/streamRequest.d.ts +4 -0
  57. package/lib/utils/streamRequest.js +150 -0
  58. package/package.json +75 -0
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __generator = (this && this.__generator) || function (thisArg, body) {
3
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
4
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5
+ function verb(n) { return function (v) { return step([n, v]); }; }
6
+ function step(op) {
7
+ if (f) throw new TypeError("Generator is already executing.");
8
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
9
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
10
+ if (y = 0, t) op = [op[0] & 2, t.value];
11
+ switch (op[0]) {
12
+ case 0: case 1: t = op; break;
13
+ case 4: _.label++; return { value: op[1], done: false };
14
+ case 5: _.label++; y = op[1]; op = [0]; continue;
15
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
16
+ default:
17
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
18
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
19
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
20
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
21
+ if (t[2]) _.ops.pop();
22
+ _.trys.pop(); continue;
23
+ }
24
+ op = body.call(thisArg, _);
25
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
26
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
27
+ }
28
+ };
29
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
30
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
31
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
32
+ var m = o[Symbol.asyncIterator], i;
33
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
34
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
35
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
36
+ };
37
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
38
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
39
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
40
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
41
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
42
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
43
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
44
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
45
+ function fulfill(value) { resume("next", value); }
46
+ function reject(value) { resume("throw", value); }
47
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.MyModelAdapterStream = void 0;
51
+ var event_1 = require("@/utils/event");
52
+ var constants_1 = require("@/constants");
53
+ var MyModelAdapterStream = function (llm, onBeforeChat) { return ({
54
+ run: function (_a) {
55
+ return __asyncGenerator(this, arguments, function run_1(_b) {
56
+ var chatMessages, chunks, reply, _c, chunks_1, chunks_1_1, chunk, e_1_1, summaryResponse, title, error_1;
57
+ var _d, e_1, _e, _f;
58
+ var _g, _h, _j;
59
+ var messages = _b.messages, abortSignal = _b.abortSignal;
60
+ return __generator(this, function (_k) {
61
+ switch (_k.label) {
62
+ case 0:
63
+ chatMessages = messages.map(function (item) { return ({
64
+ role: item.role,
65
+ content: item.content[0].text,
66
+ }); });
67
+ if (!onBeforeChat) return [3 /*break*/, 2];
68
+ return [4 /*yield*/, __await(onBeforeChat(chatMessages, llm))];
69
+ case 1:
70
+ chatMessages = _k.sent();
71
+ _k.label = 2;
72
+ case 2:
73
+ console.log('🚀 ~ myModelAdapterStream ~ chatMessages:', chatMessages);
74
+ return [4 /*yield*/, __await(llm.chat.completions.create({
75
+ messages: chatMessages,
76
+ temperature: 1,
77
+ stream: true,
78
+ }))];
79
+ case 3:
80
+ chunks = _k.sent();
81
+ reply = "";
82
+ _k.label = 4;
83
+ case 4:
84
+ _k.trys.push([4, 11, 12, 17]);
85
+ _c = true, chunks_1 = __asyncValues(chunks);
86
+ _k.label = 5;
87
+ case 5: return [4 /*yield*/, __await(chunks_1.next())];
88
+ case 6:
89
+ if (!(chunks_1_1 = _k.sent(), _d = chunks_1_1.done, !_d)) return [3 /*break*/, 10];
90
+ _f = chunks_1_1.value;
91
+ _c = false;
92
+ chunk = _f;
93
+ reply += ((_g = chunk.choices[0]) === null || _g === void 0 ? void 0 : _g.delta.content) || "";
94
+ return [4 /*yield*/, __await({
95
+ status: {
96
+ type: 'running',
97
+ },
98
+ content: [
99
+ {
100
+ text: reply,
101
+ type: 'text',
102
+ },
103
+ ],
104
+ })];
105
+ case 7: return [4 /*yield*/, _k.sent()];
106
+ case 8:
107
+ _k.sent();
108
+ _k.label = 9;
109
+ case 9:
110
+ _c = true;
111
+ return [3 /*break*/, 5];
112
+ case 10: return [3 /*break*/, 17];
113
+ case 11:
114
+ e_1_1 = _k.sent();
115
+ e_1 = { error: e_1_1 };
116
+ return [3 /*break*/, 17];
117
+ case 12:
118
+ _k.trys.push([12, , 15, 16]);
119
+ if (!(!_c && !_d && (_e = chunks_1.return))) return [3 /*break*/, 14];
120
+ return [4 /*yield*/, __await(_e.call(chunks_1))];
121
+ case 13:
122
+ _k.sent();
123
+ _k.label = 14;
124
+ case 14: return [3 /*break*/, 16];
125
+ case 15:
126
+ if (e_1) throw e_1.error;
127
+ return [7 /*endfinally*/];
128
+ case 16: return [7 /*endfinally*/];
129
+ case 17: return [4 /*yield*/, __await({
130
+ status: {
131
+ type: 'complete',
132
+ reason: 'stop',
133
+ },
134
+ content: [
135
+ {
136
+ text: reply,
137
+ type: 'text',
138
+ },
139
+ ],
140
+ }
141
+ // 对话完成后,如果这是第一轮对话,生成标题
142
+ )];
143
+ case 18: return [4 /*yield*/, _k.sent()];
144
+ case 19:
145
+ _k.sent();
146
+ if (!(messages.length === 1)) return [3 /*break*/, 23];
147
+ _k.label = 20;
148
+ case 20:
149
+ _k.trys.push([20, 22, , 23]);
150
+ return [4 /*yield*/, __await(llm.chat.completions.create({
151
+ messages: [
152
+ {
153
+ role: 'system',
154
+ content: 'You are a title generation assistant. Please summarize a short title (no more than 10 words) based on the user\'s input, without punctuation.'
155
+ },
156
+ {
157
+ role: 'user',
158
+ content: messages[0].content[0].text
159
+ }
160
+ ],
161
+ temperature: 0.5,
162
+ }))];
163
+ case 21:
164
+ summaryResponse = _k.sent();
165
+ title = (_j = (_h = summaryResponse.choices[0]) === null || _h === void 0 ? void 0 : _h.message.content) === null || _j === void 0 ? void 0 : _j.trim();
166
+ if (title) {
167
+ event_1.Dispatcher.instance.dispatch(constants_1.EVENT_THREAD_SET_TITLE, { data: title });
168
+ }
169
+ return [3 /*break*/, 23];
170
+ case 22:
171
+ error_1 = _k.sent();
172
+ console.error('Failed to generate summary title:', error_1);
173
+ return [3 /*break*/, 23];
174
+ case 23: return [2 /*return*/];
175
+ }
176
+ });
177
+ });
178
+ },
179
+ }); };
180
+ exports.MyModelAdapterStream = MyModelAdapterStream;
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const Thread: FC;
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __rest = (this && this.__rest) || function (s, e) {
47
+ var t = {};
48
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
49
+ t[p] = s[p];
50
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
51
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
52
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
53
+ t[p[i]] = s[p[i]];
54
+ }
55
+ return t;
56
+ };
57
+ var __importDefault = (this && this.__importDefault) || function (mod) {
58
+ return (mod && mod.__esModule) ? mod : { "default": mod };
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.Thread = void 0;
62
+ var antd_1 = require("antd");
63
+ var react_1 = __importStar(require("react"));
64
+ var react_hook_speech_to_text_1 = __importDefault(require("react-hook-speech-to-text"));
65
+ var icons_1 = require("@ant-design/icons");
66
+ var react_2 = require("@assistant-ui/react");
67
+ var MarkdownText_1 = require("../MarkdownText");
68
+ var index_style_1 = require("./index.style");
69
+ var context_1 = require("../../context");
70
+ var useI18n_1 = require("../../hooks/useI18n");
71
+ // 当前聊天对话上下文
72
+ var Thread = function () {
73
+ var config = (0, react_1.useContext)(context_1.AIConfigContext);
74
+ var t = (0, useI18n_1.useI18n)().t;
75
+ return (react_1.default.createElement(react_2.ThreadPrimitive.Root, { style: { height: '100%' } },
76
+ react_1.default.createElement(react_2.ThreadPrimitive.Viewport, { style: { height: '100%', overflowY: 'scroll' } },
77
+ react_1.default.createElement("div", { style: {
78
+ display: 'flex',
79
+ flexDirection: 'column',
80
+ minHeight: '100%',
81
+ } },
82
+ react_1.default.createElement("div", { style: {
83
+ flexGrow: 1,
84
+ paddingBottom: 24,
85
+ } },
86
+ react_1.default.createElement("div", { style: { padding: '0px 24px' } },
87
+ react_1.default.createElement(ThreadWelcome, null),
88
+ react_1.default.createElement(react_2.ThreadPrimitive.Messages, { components: {
89
+ UserMessage: UserMessage,
90
+ EditComposer: EditComposer,
91
+ AssistantMessage: AssistantMessage,
92
+ } }),
93
+ react_1.default.createElement(react_2.ThreadPrimitive.If, { empty: true },
94
+ react_1.default.createElement(antd_1.Alert, { style: {
95
+ margin: '16px 0px',
96
+ maxWidth: '100%',
97
+ }, type: "warning", message: config.emptyMessage || t('defaultEmpty') })))),
98
+ react_1.default.createElement(index_style_1.ButtomSpace, { style: { width: '100%', boxSizing: 'border-box', paddingBottom: 16 } },
99
+ react_1.default.createElement(ThreadScrollToBottom, null),
100
+ react_1.default.createElement(Composer, null))))));
101
+ };
102
+ exports.Thread = Thread;
103
+ // 滚动到消息底部
104
+ var ThreadScrollToBottom = function () {
105
+ return (react_1.default.createElement(react_2.ThreadPrimitive.ScrollToBottom, { asChild: true },
106
+ react_1.default.createElement(antd_1.Button, { style: {
107
+ width: '47px',
108
+ height: '47px',
109
+ borderRadius: 12,
110
+ }, type: "dashed", icon: react_1.default.createElement(icons_1.ArrowDownOutlined, null) })));
111
+ };
112
+ // 顶部的欢迎语
113
+ var ThreadWelcome = function () {
114
+ var config = (0, react_1.useContext)(context_1.AIConfigContext);
115
+ var t = (0, useI18n_1.useI18n)().t;
116
+ return (react_1.default.createElement(react_2.ThreadPrimitive.Empty, null,
117
+ react_1.default.createElement(antd_1.Alert, { style: {
118
+ maxWidth: '100%',
119
+ }, message: config.welcomeMessage || t('defaultWelcome') }),
120
+ react_1.default.createElement(ThreadWelcomeSuggestions, null)));
121
+ };
122
+ // 推荐的预置几个问答
123
+ var ThreadWelcomeSuggestions = function () {
124
+ var config = (0, react_1.useContext)(context_1.AIConfigContext);
125
+ var _a = (0, useI18n_1.useI18n)(), t = _a.t, locale = _a.locale;
126
+ var suggestions = config.suggestions || (locale === 'zh-CN'
127
+ ? ["如何用 Typescript 实现 Helloworld?", "物联网是什么?"]
128
+ : ["How to implement Helloworld in Typescript?", "What is IoT?"]);
129
+ return (react_1.default.createElement(antd_1.Space, { style: { marginTop: 24 } }, suggestions.map(function (suggestion, index) { return (react_1.default.createElement(react_2.ThreadPrimitive.Suggestion, { key: index, prompt: suggestion, method: "replace", style: { border: 'none', padding: 0 }, autoSend: true },
130
+ react_1.default.createElement(antd_1.Card, { hoverable: true }, suggestion))); })));
131
+ };
132
+ // 底部的输入框
133
+ var Composer = function () {
134
+ var config = (0, react_1.useContext)(context_1.AIConfigContext);
135
+ var t = (0, useI18n_1.useI18n)().t;
136
+ return (react_1.default.createElement(react_2.ComposerPrimitive.Root, null,
137
+ react_1.default.createElement(index_style_1.InputSpace, null,
138
+ react_1.default.createElement(index_style_1.UserInput, { rows: 1, autoFocus: true, placeholder: config.placeholder || t('defaultPlaceholder') }),
139
+ react_1.default.createElement(ComposerAction, null))));
140
+ };
141
+ // 小鸟叽叽喳喳地唱着动听的歌,五颜六色的花朵随风舞动,像是在跟我打招呼,真是太美妙啦!
142
+ var SpeechInputButton = function () {
143
+ var _a = (0, react_hook_speech_to_text_1.default)({
144
+ continuous: true,
145
+ useLegacyResults: false,
146
+ }), error = _a.error, interimResult = _a.interimResult, isRecording = _a.isRecording, results = _a.results, startSpeechToText = _a.startSpeechToText, stopSpeechToText = _a.stopSpeechToText;
147
+ var threadRuntime = (0, react_2.useThreadRuntime)();
148
+ (0, react_1.useEffect)(function () {
149
+ if (interimResult) {
150
+ threadRuntime.composer.setText(interimResult);
151
+ }
152
+ }, [interimResult]);
153
+ if (error) {
154
+ console.log("Web Speech API is not available in this browser.", error);
155
+ return react_1.default.createElement(react_1.default.Fragment, null);
156
+ }
157
+ return (react_1.default.createElement(antd_1.Button, { style: {
158
+ width: '47px',
159
+ height: '47px',
160
+ borderRadius: 12,
161
+ }, onClick: function () {
162
+ if (isRecording) {
163
+ stopSpeechToText();
164
+ }
165
+ else {
166
+ startSpeechToText();
167
+ }
168
+ }, icon: isRecording ? react_1.default.createElement(icons_1.LoadingOutlined, null) : react_1.default.createElement(icons_1.AudioOutlined, null) }));
169
+ };
170
+ // 底部的发送/停止对话消息按钮
171
+ var ComposerAction = function () {
172
+ return (react_1.default.createElement(react_1.default.Fragment, null,
173
+ react_1.default.createElement(react_2.ThreadPrimitive.If, { running: false },
174
+ react_1.default.createElement(antd_1.Space, null,
175
+ react_1.default.createElement(react_2.ComposerPrimitive.Send, { asChild: true },
176
+ react_1.default.createElement(antd_1.Button, { style: {
177
+ width: '47px',
178
+ height: '47px',
179
+ borderRadius: 12,
180
+ }, icon: react_1.default.createElement(icons_1.SendOutlined, null) })),
181
+ react_1.default.createElement(SpeechInputButton, null))),
182
+ react_1.default.createElement(react_2.ThreadPrimitive.If, { running: true },
183
+ react_1.default.createElement(react_2.ComposerPrimitive.Cancel, { asChild: true },
184
+ react_1.default.createElement(antd_1.Button, { style: {
185
+ width: '47px',
186
+ height: '47px',
187
+ borderRadius: 12,
188
+ }, icon: react_1.default.createElement(icons_1.StopOutlined, null) })))));
189
+ };
190
+ // 用户询问的消息框
191
+ var UserMessage = function () {
192
+ return (react_1.default.createElement(react_2.MessagePrimitive.Root, { style: {
193
+ display: 'flex',
194
+ justifyContent: 'flex-end',
195
+ marginTop: 16,
196
+ } },
197
+ react_1.default.createElement(antd_1.Space, { align: "start" },
198
+ react_1.default.createElement("div", null,
199
+ react_1.default.createElement(antd_1.Space, null,
200
+ react_1.default.createElement(UserActionBar, null),
201
+ react_1.default.createElement(index_style_1.MessageContainer, null,
202
+ react_1.default.createElement(react_2.MessagePrimitive.Content, null))),
203
+ react_1.default.createElement(BranchPicker, { style: { marginTop: 8 } })),
204
+ react_1.default.createElement(antd_1.Avatar, null, "Y"))));
205
+ };
206
+ // 上下文用户消息框的工具栏
207
+ var UserActionBar = function () {
208
+ return (react_1.default.createElement(react_2.ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last" },
209
+ react_1.default.createElement(react_2.ActionBarPrimitive.Edit, { asChild: true },
210
+ react_1.default.createElement(icons_1.EditOutlined, null))));
211
+ };
212
+ // 编辑上下文询问的输入框
213
+ var EditComposer = function () {
214
+ var t = (0, useI18n_1.useI18n)().t;
215
+ return (react_1.default.createElement(react_2.ComposerPrimitive.Root, { style: {
216
+ padding: '16px 8px',
217
+ } },
218
+ react_1.default.createElement(react_2.ComposerPrimitive.Input, { style: {
219
+ width: '100%',
220
+ height: 300,
221
+ boxSizing: 'border-box',
222
+ whiteSpace: 'pre-wrap',
223
+ wordBreak: 'break-word',
224
+ backgroundColor: '#eff6ff',
225
+ borderRadius: '14px',
226
+ border: 'none',
227
+ padding: '8px 20px',
228
+ // @ts-ignore
229
+ borderRadius: '14px',
230
+ } }),
231
+ react_1.default.createElement("div", { style: {
232
+ display: 'flex',
233
+ justifyContent: 'flex-end',
234
+ } },
235
+ react_1.default.createElement(antd_1.Space, null,
236
+ react_1.default.createElement(react_2.ComposerPrimitive.Cancel, { asChild: true },
237
+ react_1.default.createElement(antd_1.Button, { type: "default", size: "small" }, t('cancel'))),
238
+ react_1.default.createElement(react_2.ComposerPrimitive.Send, { asChild: true },
239
+ react_1.default.createElement(antd_1.Button, { type: "primary", size: "small" }, t('send')))))));
240
+ };
241
+ // AI 回答结果的消息框
242
+ var AssistantMessage = function () {
243
+ return (react_1.default.createElement(react_2.MessagePrimitive.Root, { style: {
244
+ marginTop: 16,
245
+ } },
246
+ react_1.default.createElement(antd_1.Space, { align: "start" },
247
+ react_1.default.createElement(antd_1.Avatar, null, "AI"),
248
+ react_1.default.createElement("div", { style: {
249
+ display: 'inline-block',
250
+ } },
251
+ react_1.default.createElement(react_2.MessagePrimitive.Content, { components: { Text: MarkdownText_1.MarkdownText } }),
252
+ react_1.default.createElement(AssistantActionBar, null),
253
+ react_1.default.createElement(BranchPicker, null)))));
254
+ };
255
+ var AssistantActionBar = function () {
256
+ return (react_1.default.createElement(react_2.ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", autohideFloat: "single-branch", style: {
257
+ marginTop: 8,
258
+ } },
259
+ react_1.default.createElement(antd_1.Space, null,
260
+ react_1.default.createElement(react_2.ActionBarPrimitive.Copy, { asChild: true },
261
+ react_1.default.createElement("div", { style: { cursor: 'pointer' } },
262
+ react_1.default.createElement(react_2.MessagePrimitive.If, { copied: true },
263
+ react_1.default.createElement(icons_1.CheckCircleOutlined, null)),
264
+ react_1.default.createElement(react_2.MessagePrimitive.If, { copied: false },
265
+ react_1.default.createElement(icons_1.CopyOutlined, null)))),
266
+ react_1.default.createElement(react_2.ActionBarPrimitive.Reload, { asChild: true },
267
+ react_1.default.createElement(icons_1.RedoOutlined, null)),
268
+ react_1.default.createElement(react_2.MessagePrimitive.If, { speaking: true },
269
+ react_1.default.createElement(react_2.ActionBarPrimitive.StopSpeaking, { asChild: true },
270
+ react_1.default.createElement(icons_1.PauseCircleOutlined, null))),
271
+ react_1.default.createElement(react_2.MessagePrimitive.If, { speaking: false },
272
+ react_1.default.createElement(react_2.ActionBarPrimitive.Speak, { asChild: true },
273
+ react_1.default.createElement(icons_1.PlayCircleOutlined, null))))));
274
+ };
275
+ var BranchPicker = function (_a) {
276
+ var className = _a.className, rest = __rest(_a, ["className"]);
277
+ return (react_1.default.createElement(react_2.BranchPickerPrimitive.Root, __assign({ hideWhenSingleBranch: true, style: __assign({ marginTop: 8 }, (rest.style || {})) }, rest),
278
+ react_1.default.createElement(react_2.BranchPickerPrimitive.Previous, { asChild: true },
279
+ react_1.default.createElement(icons_1.LeftOutlined, null)),
280
+ react_1.default.createElement("span", null,
281
+ react_1.default.createElement(react_2.BranchPickerPrimitive.Number, null),
282
+ " / ",
283
+ react_1.default.createElement(react_2.BranchPickerPrimitive.Count, null)),
284
+ react_1.default.createElement(react_2.BranchPickerPrimitive.Next, { asChild: true },
285
+ react_1.default.createElement(icons_1.RightOutlined, null))));
286
+ };
@@ -0,0 +1,15 @@
1
+ export declare const MessageContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
2
+ export declare const ButtomSpace: import("styled-components").StyledComponent<import("react").FC<import("antd").SpaceProps> & {
3
+ Compact: import("react").FC<import("antd/lib/space/Compact").SpaceCompactProps>;
4
+ }, any, {}, never>;
5
+ export declare const InputSpace: import("styled-components").StyledComponent<import("react").FC<import("antd").SpaceProps> & {
6
+ Compact: import("react").FC<import("antd/lib/space/Compact").SpaceCompactProps>;
7
+ }, any, {}, never>;
8
+ export declare const UserInput: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("react-textarea-autosize").TextareaAutosizeProps & {
9
+ asChild?: boolean | undefined;
10
+ submitOnEnter?: boolean | undefined;
11
+ cancelOnEscape?: boolean | undefined;
12
+ unstable_focusOnRunStart?: boolean | undefined;
13
+ unstable_focusOnScrollToBottom?: boolean | undefined;
14
+ unstable_focusOnThreadSwitched?: boolean | undefined;
15
+ } & import("react").RefAttributes<HTMLTextAreaElement>>, any, {}, never>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.UserInput = exports.InputSpace = exports.ButtomSpace = exports.MessageContainer = void 0;
11
+ var react_1 = require("@assistant-ui/react");
12
+ var antd_1 = require("antd");
13
+ var styled_components_1 = __importDefault(require("styled-components"));
14
+ exports.MessageContainer = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n box-sizing: border-box;\n white-space: pre-wrap;\n word-break: break-word;\n background-color: #eff6ff;\n border-radius: 14px;\n padding: 8px 20px;\n\n & > p {\n margin-bottom: 0;\n }\n"], ["\n box-sizing: border-box;\n white-space: pre-wrap;\n word-break: break-word;\n background-color: #eff6ff;\n border-radius: 14px;\n padding: 8px 20px;\n\n & > p {\n margin-bottom: 0;\n }\n"])));
15
+ exports.ButtomSpace = (0, styled_components_1.default)(antd_1.Space)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n position: sticky;\n bottom: 0;\n padding-top: 16px;\n background-color: #fff;\n padding: 0 24px;\n & > div:nth-child(2) {\n flex-grow: 1;\n }\n"], ["\n position: sticky;\n bottom: 0;\n padding-top: 16px;\n background-color: #fff;\n padding: 0 24px;\n & > div:nth-child(2) {\n flex-grow: 1;\n }\n"])));
16
+ exports.InputSpace = (0, styled_components_1.default)(antd_1.Space)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n width: 100%;\n & > div:nth-child(1) {\n flex-grow: 1;\n }\n"], ["\n width: 100%;\n & > div:nth-child(1) {\n flex-grow: 1;\n }\n"])));
17
+ exports.UserInput = (0, styled_components_1.default)(react_1.ComposerPrimitive.Input)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n flex-grow: 1;\n padding: 10px;\n background-color: #f7f7f8; /* \u7C7B\u4F3C ChatGPT \u7684\u6D45\u80CC\u666F */\n border-radius: 12px;\n border: 1px solid #d1d5db; /* \u8FB9\u6846\u989C\u8272 */\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* \u5FAE\u5999\u7684\u9634\u5F71\u6548\u679C */\n transition: border-color 0.3s ease; /* \u52A8\u753B\u6548\u679C */\n outline: none;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-size: 16px;\n color: #333;\n min-height: 40px;\n max-height: 200px;\n resize: none;\n transition: background-color 0.5s ease;\n overflow-y: auto;\n\n &:focus {\n background-color: #fff;\n border-color: #40a9ff;\n }\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n flex-grow: 1;\n padding: 10px;\n background-color: #f7f7f8; /* \u7C7B\u4F3C ChatGPT \u7684\u6D45\u80CC\u666F */\n border-radius: 12px;\n border: 1px solid #d1d5db; /* \u8FB9\u6846\u989C\u8272 */\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* \u5FAE\u5999\u7684\u9634\u5F71\u6548\u679C */\n transition: border-color 0.3s ease; /* \u52A8\u753B\u6548\u679C */\n outline: none;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-size: 16px;\n color: #333;\n min-height: 40px;\n max-height: 200px;\n resize: none;\n transition: background-color 0.5s ease;\n overflow-y: auto;\n\n &:focus {\n background-color: #fff;\n border-color: #40a9ff;\n }\n"])));
18
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -0,0 +1,4 @@
1
+ import type { FC } from 'react';
2
+ export declare const ThreadList: FC<{
3
+ onItemClick?: () => void;
4
+ }>;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.ThreadList = void 0;
48
+ var antd_1 = require("antd");
49
+ var react_1 = __importStar(require("react"));
50
+ var icons_1 = require("@ant-design/icons");
51
+ var react_2 = require("@assistant-ui/react");
52
+ var event_1 = require("@/utils/event");
53
+ var constants_1 = require("@/constants");
54
+ var antd_2 = require("antd");
55
+ var useI18n_1 = require("../../hooks/useI18n");
56
+ // 聊天列表
57
+ var ThreadList = function (_a) {
58
+ var onItemClick = _a.onItemClick;
59
+ return (react_1.default.createElement(react_2.ThreadListPrimitive.Root, { style: {
60
+ display: 'flex',
61
+ flexDirection: 'column',
62
+ } },
63
+ react_1.default.createElement(ThreadListItems, { onItemClick: onItemClick })));
64
+ };
65
+ exports.ThreadList = ThreadList;
66
+ // 点击创建新聊天
67
+ var ThreadListNew = function () {
68
+ var t = (0, useI18n_1.useI18n)().t;
69
+ return (react_1.default.createElement(react_2.ThreadListPrimitive.New, { asChild: true },
70
+ react_1.default.createElement(antd_1.Button, { type: "primary", icon: react_1.default.createElement(icons_1.PlusOutlined, null), style: { width: '100%', marginBottom: 16 } }, t('newChat'))));
71
+ };
72
+ // 聊天列表
73
+ var ThreadListItems = function (_a) {
74
+ var onItemClick = _a.onItemClick;
75
+ var runtime = (0, react_2.useAssistantRuntime)();
76
+ var threads = runtime.threads.getState().threads;
77
+ var t = (0, useI18n_1.useI18n)().t;
78
+ return (react_1.default.createElement(react_1.default.Fragment, null,
79
+ react_1.default.createElement(react_2.ThreadListPrimitive.Items, { components: {
80
+ ThreadListItem: function (props) { return (react_1.default.createElement(ThreadListItem, __assign({}, props, { onClick: onItemClick }))); },
81
+ } }),
82
+ threads.length === 0 && (react_1.default.createElement(antd_2.Empty, { description: t('noHistory'), style: { marginTop: 48 } }))));
83
+ };
84
+ var ThreadListItem = function (_a) {
85
+ var onClick = _a.onClick;
86
+ return (react_1.default.createElement(react_2.ThreadListItemPrimitive.Root, { className: "ant-btn", style: {
87
+ marginTop: '8px',
88
+ display: 'flex',
89
+ alignItems: 'center',
90
+ justifyContent: 'space-between',
91
+ width: '100%',
92
+ padding: '8px 12px',
93
+ height: 'auto'
94
+ } },
95
+ react_1.default.createElement(react_2.ThreadListItemPrimitive.Trigger, { onClick: onClick, style: {
96
+ border: 'none',
97
+ padding: 0,
98
+ background: 'transparent',
99
+ flex: 1,
100
+ overflow: 'hidden',
101
+ textOverflow: 'ellipsis',
102
+ display: 'block',
103
+ textAlign: 'left',
104
+ cursor: 'pointer'
105
+ } },
106
+ react_1.default.createElement(ThreadListItemTitle, null)),
107
+ react_1.default.createElement(ThreadListItemDelete, null)));
108
+ };
109
+ // 点击切换聊天
110
+ var ThreadListItemTitle = function () {
111
+ var runtime = (0, react_2.useThreadListItemRuntime)();
112
+ var t = (0, useI18n_1.useI18n)().t;
113
+ (0, react_1.useEffect)(function () {
114
+ var handle = function (event) {
115
+ var state = runtime.getState();
116
+ if (state.isMain) {
117
+ runtime.rename(event.data);
118
+ }
119
+ };
120
+ event_1.Dispatcher.instance.addEventListener(constants_1.EVENT_THREAD_SET_TITLE, handle);
121
+ return function () {
122
+ event_1.Dispatcher.instance.removeEventListener(constants_1.EVENT_THREAD_SET_TITLE, handle);
123
+ };
124
+ }, [runtime]);
125
+ return react_1.default.createElement(react_2.ThreadListItemPrimitive.Title, { fallback: react_1.default.createElement("div", null, t('newChatFallback')) });
126
+ };
127
+ // 归档按钮
128
+ var ThreadListItemDelete = function () {
129
+ return (react_1.default.createElement(react_2.ThreadListItemPrimitive.Delete, { asChild: true },
130
+ react_1.default.createElement(icons_1.DeleteOutlined, null)));
131
+ };
@@ -0,0 +1 @@
1
+ export declare const EVENT_THREAD_SET_TITLE = "thread-set-title";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVENT_THREAD_SET_TITLE = void 0;
4
+ exports.EVENT_THREAD_SET_TITLE = 'thread-set-title';