@fecp/designer 5.6.18 → 5.6.19
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/es/designer/package.json.mjs +1 -1
- package/es/designer/src/packages/dialog/useDialogDialog.mjs +1 -1
- package/es/designer/src/packages/dialogGlobal/useDialogGlobalDialog.mjs +1 -1
- package/es/designer/src/packages/form/property/widgets.vue.mjs +2 -2
- package/es/designer.css +131 -53
- package/es/node_modules/@vant/use/dist/index.esm.mjs +1 -1
- package/es/node_modules/d3-sankey/node_modules/d3-path/src/path.mjs +73 -0
- package/es/node_modules/d3-sankey/node_modules/d3-shape/src/array.mjs +4 -0
- package/es/node_modules/d3-sankey/node_modules/d3-shape/src/constant.mjs +8 -0
- package/es/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.mjs +45 -0
- package/es/node_modules/d3-sankey/node_modules/d3-shape/src/point.mjs +10 -0
- package/es/node_modules/d3-sankey/src/sankeyLinkHorizontal.mjs +1 -1
- package/es/node_modules/vant/es/toast/function-call.mjs +1 -1
- package/es/packages/mobile/src/assets/images/ai2.png.mjs +4 -0
- package/es/packages/mobile/src/components/ai/AiChat/AiChat.vue.mjs +145 -22
- package/es/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.mjs +4 -6
- package/es/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.mjs +71 -11
- package/es/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.mjs +37 -3
- package/es/packages/mobile/src/components/form/uploader/Uploader.vue.mjs +1 -2
- package/es/packages/mobile/src/composables/useAI/adapters/h5.mjs +255 -0
- package/es/packages/mobile/src/composables/useAI/adapters/index.mjs +3 -3
- package/es/packages/mobile/src/composables/useAI/useChat.mjs +10 -3
- package/es/packages/mobile/src/composables/usePageEvents.mjs +1 -1
- package/es/packages/mobile/src/index.vue.mjs +20 -8
- package/es/packages/mobile/src/utils/datasource.mjs +1 -1
- package/es/packages/vue/src/components/dialog/DialogRenderer.vue2.mjs +0 -1
- package/es/packages/vue/src/components/forms/number/Number.vue.mjs +0 -1
- package/es/packages/vue/src/components/forms/text/Text.vue.mjs +0 -1
- package/es/packages/vue/src/components/table/TableColumn.vue.mjs +0 -1
- package/es/packages/vue/src/composables/usePageEvents.mjs +0 -1
- package/es/packages/vue/src/utils/datasource.mjs +0 -20
- package/lib/designer/package.json.js +1 -1
- package/lib/designer/src/packages/dialog/useDialogDialog.js +1 -1
- package/lib/designer/src/packages/dialogGlobal/useDialogGlobalDialog.js +1 -1
- package/lib/designer/src/packages/form/property/widgets.vue.js +2 -2
- package/lib/designer.css +131 -53
- package/lib/node_modules/d3-sankey/node_modules/d3-path/src/path.js +73 -0
- package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/array.js +4 -0
- package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/constant.js +8 -0
- package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/link/index.js +45 -0
- package/lib/node_modules/d3-sankey/node_modules/d3-shape/src/point.js +10 -0
- package/lib/node_modules/d3-sankey/src/sankeyLinkHorizontal.js +1 -1
- package/lib/packages/mobile/src/assets/images/ai2.png.js +4 -0
- package/lib/packages/mobile/src/components/ai/AiChat/AiChat.vue.js +144 -21
- package/lib/packages/mobile/src/components/ai/ChatInput/ChatInput.vue.js +4 -6
- package/lib/packages/mobile/src/components/ai/ChatPanel/ChatPanel.vue.js +73 -13
- package/lib/packages/mobile/src/components/ai/MarkdownRenderer/MarkdownRenderer.vue.js +37 -3
- package/lib/packages/mobile/src/components/form/uploader/Uploader.vue.js +1 -2
- package/lib/packages/mobile/src/composables/useAI/adapters/h5.js +255 -0
- package/lib/packages/mobile/src/composables/useAI/adapters/index.js +3 -3
- package/lib/packages/mobile/src/composables/useAI/useChat.js +10 -3
- package/lib/packages/mobile/src/composables/usePageEvents.js +1 -1
- package/lib/packages/mobile/src/index.vue.js +19 -7
- package/lib/packages/mobile/src/utils/datasource.js +1 -1
- package/lib/packages/vue/src/components/dialog/DialogRenderer.vue2.js +0 -1
- package/lib/packages/vue/src/components/forms/number/Number.vue.js +0 -1
- package/lib/packages/vue/src/components/forms/text/Text.vue.js +0 -1
- package/lib/packages/vue/src/components/table/TableColumn.vue.js +0 -1
- package/lib/packages/vue/src/composables/usePageEvents.js +0 -1
- package/lib/packages/vue/src/utils/datasource.js +2 -22
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
var pi = Math.PI, tau = 2 * pi, epsilon = 1e-6, tauEpsilon = tau - epsilon;
|
|
4
|
+
function Path() {
|
|
5
|
+
this._x0 = this._y0 = // start of current subpath
|
|
6
|
+
this._x1 = this._y1 = null;
|
|
7
|
+
this._ = "";
|
|
8
|
+
}
|
|
9
|
+
function path() {
|
|
10
|
+
return new Path();
|
|
11
|
+
}
|
|
12
|
+
Path.prototype = path.prototype = {
|
|
13
|
+
constructor: Path,
|
|
14
|
+
moveTo: function(x, y) {
|
|
15
|
+
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
|
|
16
|
+
},
|
|
17
|
+
closePath: function() {
|
|
18
|
+
if (this._x1 !== null) {
|
|
19
|
+
this._x1 = this._x0, this._y1 = this._y0;
|
|
20
|
+
this._ += "Z";
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
lineTo: function(x, y) {
|
|
24
|
+
this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
25
|
+
},
|
|
26
|
+
quadraticCurveTo: function(x1, y1, x, y) {
|
|
27
|
+
this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
28
|
+
},
|
|
29
|
+
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
|
|
30
|
+
this._ += "C" + +x1 + "," + +y1 + "," + +x2 + "," + +y2 + "," + (this._x1 = +x) + "," + (this._y1 = +y);
|
|
31
|
+
},
|
|
32
|
+
arcTo: function(x1, y1, x2, y2, r) {
|
|
33
|
+
x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
|
|
34
|
+
var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
|
|
35
|
+
if (r < 0) throw new Error("negative radius: " + r);
|
|
36
|
+
if (this._x1 === null) {
|
|
37
|
+
this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
|
|
38
|
+
} else if (!(l01_2 > epsilon)) ;
|
|
39
|
+
else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
|
|
40
|
+
this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
|
|
41
|
+
} else {
|
|
42
|
+
var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
|
|
43
|
+
if (Math.abs(t01 - 1) > epsilon) {
|
|
44
|
+
this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
|
|
45
|
+
}
|
|
46
|
+
this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
arc: function(x, y, r, a0, a1, ccw) {
|
|
50
|
+
x = +x, y = +y, r = +r, ccw = !!ccw;
|
|
51
|
+
var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
|
|
52
|
+
if (r < 0) throw new Error("negative radius: " + r);
|
|
53
|
+
if (this._x1 === null) {
|
|
54
|
+
this._ += "M" + x0 + "," + y0;
|
|
55
|
+
} else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
|
|
56
|
+
this._ += "L" + x0 + "," + y0;
|
|
57
|
+
}
|
|
58
|
+
if (!r) return;
|
|
59
|
+
if (da < 0) da = da % tau + tau;
|
|
60
|
+
if (da > tauEpsilon) {
|
|
61
|
+
this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
|
|
62
|
+
} else if (da > epsilon) {
|
|
63
|
+
this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
rect: function(x, y, w, h) {
|
|
67
|
+
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + +w + "v" + +h + "h" + -w + "Z";
|
|
68
|
+
},
|
|
69
|
+
toString: function() {
|
|
70
|
+
return this._;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.default = path;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const array = require("../array.js");
|
|
4
|
+
const constant = require("../constant.js");
|
|
5
|
+
const point = require("../point.js");
|
|
6
|
+
const path = require("../../../d3-path/src/path.js");
|
|
7
|
+
function linkSource(d) {
|
|
8
|
+
return d.source;
|
|
9
|
+
}
|
|
10
|
+
function linkTarget(d) {
|
|
11
|
+
return d.target;
|
|
12
|
+
}
|
|
13
|
+
function link(curve) {
|
|
14
|
+
var source = linkSource, target = linkTarget, x = point.x, y = point.y, context = null;
|
|
15
|
+
function link2() {
|
|
16
|
+
var buffer, argv = array.slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
|
|
17
|
+
if (!context) context = buffer = path.default();
|
|
18
|
+
curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
|
|
19
|
+
if (buffer) return context = null, buffer + "" || null;
|
|
20
|
+
}
|
|
21
|
+
link2.source = function(_) {
|
|
22
|
+
return arguments.length ? (source = _, link2) : source;
|
|
23
|
+
};
|
|
24
|
+
link2.target = function(_) {
|
|
25
|
+
return arguments.length ? (target = _, link2) : target;
|
|
26
|
+
};
|
|
27
|
+
link2.x = function(_) {
|
|
28
|
+
return arguments.length ? (x = typeof _ === "function" ? _ : constant.default(+_), link2) : x;
|
|
29
|
+
};
|
|
30
|
+
link2.y = function(_) {
|
|
31
|
+
return arguments.length ? (y = typeof _ === "function" ? _ : constant.default(+_), link2) : y;
|
|
32
|
+
};
|
|
33
|
+
link2.context = function(_) {
|
|
34
|
+
return arguments.length ? (context = _ == null ? null : _, link2) : context;
|
|
35
|
+
};
|
|
36
|
+
return link2;
|
|
37
|
+
}
|
|
38
|
+
function curveHorizontal(context, x0, y0, x1, y1) {
|
|
39
|
+
context.moveTo(x0, y0);
|
|
40
|
+
context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
|
|
41
|
+
}
|
|
42
|
+
function linkHorizontal() {
|
|
43
|
+
return link(curveHorizontal);
|
|
44
|
+
}
|
|
45
|
+
exports.linkHorizontal = linkHorizontal;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const index = require("
|
|
3
|
+
const index = require("../node_modules/d3-shape/src/link/index.js");
|
|
4
4
|
function horizontalSource(d) {
|
|
5
5
|
return [d.source.x1, d.y0];
|
|
6
6
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const ai2Icon = "data:image/png;base64,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";
|
|
4
|
+
exports.default = ai2Icon;
|
|
@@ -10,11 +10,19 @@ const index$1 = require("../ChatPanel/index.js");
|
|
|
10
10
|
const useChat = require("../../../composables/useAI/useChat.js");
|
|
11
11
|
const useVoice = require("../../../composables/useAI/useVoice.js");
|
|
12
12
|
const index$3 = require("../../../composables/useAI/adapters/index.js");
|
|
13
|
-
const detector = require("../../../composables/useAI/adapters/detector.js");
|
|
14
13
|
;/* empty css */
|
|
15
14
|
const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.js");
|
|
16
15
|
const index = require("../../../../../../node_modules/vant/es/nav-bar/index.js");
|
|
16
|
+
const functionCall = require("../../../../../../node_modules/vant/es/toast/function-call.js");
|
|
17
17
|
const _hoisted_1 = { class: "mobile-chat-view" };
|
|
18
|
+
const _hoisted_2 = {
|
|
19
|
+
key: 0,
|
|
20
|
+
class: "iconfont icon-mobileyinliang1"
|
|
21
|
+
};
|
|
22
|
+
const _hoisted_3 = {
|
|
23
|
+
key: 1,
|
|
24
|
+
class: "iconfont icon-mobilejingyin"
|
|
25
|
+
};
|
|
18
26
|
const _sfc_main = {
|
|
19
27
|
__name: "AiChat",
|
|
20
28
|
props: {
|
|
@@ -42,6 +50,46 @@ const _sfc_main = {
|
|
|
42
50
|
const ctx = instance.proxy;
|
|
43
51
|
const emit = __emit;
|
|
44
52
|
const sessionId = Vue.ref("mobile_session_" + Date.now());
|
|
53
|
+
const autoRead = Vue.ref(true);
|
|
54
|
+
const speakingId = Vue.ref("");
|
|
55
|
+
let manualStopSeq = null;
|
|
56
|
+
function toggleAutoRead() {
|
|
57
|
+
autoRead.value = !autoRead.value;
|
|
58
|
+
functionCall.showToast(autoRead.value ? "已开启自动朗读" : "已关闭自动朗读");
|
|
59
|
+
if (!autoRead.value) {
|
|
60
|
+
stopManualSpeak();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function stopManualSpeak() {
|
|
64
|
+
if (manualStopSeq) {
|
|
65
|
+
manualStopSeq();
|
|
66
|
+
manualStopSeq = null;
|
|
67
|
+
}
|
|
68
|
+
speakingId.value = "";
|
|
69
|
+
}
|
|
70
|
+
function onManualSpeak(msg) {
|
|
71
|
+
if (speakingId.value === msg.id) {
|
|
72
|
+
stopManualSpeak();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
stopManualSpeak();
|
|
76
|
+
const urls = Array.isArray(msg.speechUrls) && msg.speechUrls.length > 0 ? msg.speechUrls : [];
|
|
77
|
+
if (urls.length === 0) {
|
|
78
|
+
functionCall.showToast("该消息无可朗读的语音");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
speakingId.value = msg.id;
|
|
82
|
+
manualStopSeq = playAudioSequence(
|
|
83
|
+
urls,
|
|
84
|
+
(a) => {
|
|
85
|
+
if (!a) {
|
|
86
|
+
speakingId.value = "";
|
|
87
|
+
manualStopSeq = null;
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
300
|
|
91
|
+
);
|
|
92
|
+
}
|
|
45
93
|
function extractReplyText(data) {
|
|
46
94
|
if (typeof data === "string") return data;
|
|
47
95
|
if (data && typeof data === "object") {
|
|
@@ -49,21 +97,74 @@ const _sfc_main = {
|
|
|
49
97
|
}
|
|
50
98
|
return String(data || "");
|
|
51
99
|
}
|
|
100
|
+
function playAudioSequence(urls, onAudioChange, gap = 300) {
|
|
101
|
+
let idx = 0;
|
|
102
|
+
let advancing = false;
|
|
103
|
+
let pendingTimer = null;
|
|
104
|
+
let stopped = false;
|
|
105
|
+
let currentAudio = null;
|
|
106
|
+
const advance = () => {
|
|
107
|
+
if (advancing) return;
|
|
108
|
+
advancing = true;
|
|
109
|
+
idx++;
|
|
110
|
+
advancing = false;
|
|
111
|
+
pendingTimer = setTimeout(() => {
|
|
112
|
+
pendingTimer = null;
|
|
113
|
+
playNext();
|
|
114
|
+
}, gap);
|
|
115
|
+
};
|
|
116
|
+
const playNext = () => {
|
|
117
|
+
if (stopped || idx >= urls.length) {
|
|
118
|
+
onAudioChange == null ? void 0 : onAudioChange(null);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const audio = new Audio(urls[idx]);
|
|
122
|
+
currentAudio = audio;
|
|
123
|
+
onAudioChange == null ? void 0 : onAudioChange(audio);
|
|
124
|
+
audio.addEventListener("ended", advance);
|
|
125
|
+
audio.addEventListener("error", advance);
|
|
126
|
+
audio.play().catch(advance);
|
|
127
|
+
};
|
|
128
|
+
playNext();
|
|
129
|
+
return () => {
|
|
130
|
+
stopped = true;
|
|
131
|
+
if (pendingTimer) {
|
|
132
|
+
clearTimeout(pendingTimer);
|
|
133
|
+
pendingTimer = null;
|
|
134
|
+
}
|
|
135
|
+
if (currentAudio) {
|
|
136
|
+
currentAudio.pause();
|
|
137
|
+
currentAudio = null;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
52
141
|
function initAdapter() {
|
|
53
|
-
const adapter = index$3.getAdapter();
|
|
142
|
+
const adapter = index$3.getAdapter({ sessionId: sessionId.value, ctx });
|
|
54
143
|
const http = ctx.$http;
|
|
55
144
|
const sid = sessionId.value;
|
|
56
145
|
adapter.createStreamRequest = (options) => {
|
|
57
146
|
const { body, onMessage, onComplete, onError } = options;
|
|
58
147
|
let aborted = false;
|
|
148
|
+
let currentAudio = null;
|
|
149
|
+
let stopAudioSeq = null;
|
|
59
150
|
http.postForm(
|
|
60
151
|
"ai-server/aiAsst/mobileQuery",
|
|
61
|
-
{ sessionId: sid, message: body.prompt },
|
|
152
|
+
{ sessionId: sid, message: body.prompt, isRead: autoRead.value },
|
|
62
153
|
false
|
|
63
154
|
).then((data) => {
|
|
64
155
|
if (aborted) return;
|
|
65
|
-
const replyText = extractReplyText(data);
|
|
156
|
+
const replyText = data && typeof data === "object" && typeof data.message === "string" ? data.message : extractReplyText(data);
|
|
157
|
+
const speechUrls = data && data.speech && Array.isArray(data.speech.urls) ? data.speech.urls.filter(Boolean) : [];
|
|
158
|
+
const lastMsg = messages.value[messages.value.length - 1];
|
|
159
|
+
if (lastMsg && lastMsg.role === "assistant" && speechUrls.length > 0) {
|
|
160
|
+
lastMsg.speechUrls = speechUrls;
|
|
161
|
+
}
|
|
66
162
|
let i = 0;
|
|
163
|
+
if (autoRead.value && speechUrls.length > 0) {
|
|
164
|
+
stopAudioSeq = playAudioSequence(speechUrls, (a) => {
|
|
165
|
+
currentAudio = a;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
67
168
|
const timer = setInterval(() => {
|
|
68
169
|
if (aborted) {
|
|
69
170
|
clearInterval(timer);
|
|
@@ -75,13 +176,21 @@ const _sfc_main = {
|
|
|
75
176
|
clearInterval(timer);
|
|
76
177
|
onComplete();
|
|
77
178
|
}
|
|
78
|
-
},
|
|
179
|
+
}, 20);
|
|
79
180
|
}).catch((err) => {
|
|
80
181
|
if (!aborted) onError(err || new Error("请求失败"));
|
|
81
182
|
});
|
|
82
183
|
return {
|
|
83
184
|
abort: () => {
|
|
84
185
|
aborted = true;
|
|
186
|
+
if (stopAudioSeq) {
|
|
187
|
+
stopAudioSeq();
|
|
188
|
+
stopAudioSeq = null;
|
|
189
|
+
}
|
|
190
|
+
if (currentAudio) {
|
|
191
|
+
currentAudio.pause();
|
|
192
|
+
currentAudio = null;
|
|
193
|
+
}
|
|
85
194
|
}
|
|
86
195
|
};
|
|
87
196
|
};
|
|
@@ -115,22 +224,15 @@ const _sfc_main = {
|
|
|
115
224
|
} = useVoice.useVoice({
|
|
116
225
|
maxDuration: props.maxVoiceDuration,
|
|
117
226
|
onResult: async (result) => {
|
|
118
|
-
const
|
|
119
|
-
if (!
|
|
120
|
-
|
|
121
|
-
id: "voice-tip-" + Date.now(),
|
|
122
|
-
role: "assistant",
|
|
123
|
-
type: "text",
|
|
124
|
-
content: result.transcript || "抱歉,当前环境不支持语音功能",
|
|
125
|
-
status: "done",
|
|
126
|
-
timestamp: Date.now()
|
|
127
|
-
});
|
|
227
|
+
const transcript = (result.transcript || "").trim();
|
|
228
|
+
if (!transcript) {
|
|
229
|
+
functionCall.showToast("语音识别失败,请重试");
|
|
128
230
|
return;
|
|
129
231
|
}
|
|
130
232
|
await sendVoice({
|
|
131
233
|
audioBlob: result.audioBlob,
|
|
132
234
|
duration: result.duration,
|
|
133
|
-
transcript
|
|
235
|
+
transcript,
|
|
134
236
|
audioUrl: null,
|
|
135
237
|
serverId: null
|
|
136
238
|
});
|
|
@@ -170,13 +272,26 @@ const _sfc_main = {
|
|
|
170
272
|
initAdapter();
|
|
171
273
|
if (props.historyMessages && props.historyMessages.length > 0) {
|
|
172
274
|
loadHistory(props.historyMessages);
|
|
275
|
+
} else if (messages.value.length === 0) {
|
|
276
|
+
messages.value.push({
|
|
277
|
+
id: "welcome-" + Date.now(),
|
|
278
|
+
role: "assistant",
|
|
279
|
+
type: "text",
|
|
280
|
+
content: "你好!我是语音助手,有什么可以帮你的吗?",
|
|
281
|
+
status: "done",
|
|
282
|
+
timestamp: Date.now(),
|
|
283
|
+
isWelcome: true
|
|
284
|
+
});
|
|
173
285
|
}
|
|
174
286
|
});
|
|
287
|
+
Vue.onBeforeUnmount(() => {
|
|
288
|
+
stopManualSpeak();
|
|
289
|
+
});
|
|
175
290
|
return (_ctx, _cache) => {
|
|
176
291
|
const _component_van_nav_bar = index.NavBar;
|
|
177
292
|
return Vue.openBlock(), Vue.createElementBlock("div", _hoisted_1, [
|
|
178
293
|
Vue.createVNode(_component_van_nav_bar, {
|
|
179
|
-
title: "
|
|
294
|
+
title: "语音助手",
|
|
180
295
|
"left-text": "收起",
|
|
181
296
|
"left-arrow": "",
|
|
182
297
|
fixed: "",
|
|
@@ -187,16 +302,24 @@ const _sfc_main = {
|
|
|
187
302
|
Vue.createElementVNode("span", {
|
|
188
303
|
class: "nav-right-btn",
|
|
189
304
|
onClick: handleNewChat
|
|
190
|
-
}, "新对话")
|
|
305
|
+
}, "新对话"),
|
|
306
|
+
Vue.createElementVNode("span", {
|
|
307
|
+
class: Vue.normalizeClass(["nav-right-btn nav-read-btn", autoRead.value ? "is-active" : "is-muted"]),
|
|
308
|
+
onClick: toggleAutoRead
|
|
309
|
+
}, [
|
|
310
|
+
autoRead.value ? (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_2)) : (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_3))
|
|
311
|
+
], 2)
|
|
191
312
|
]),
|
|
192
313
|
_: 1
|
|
193
314
|
}),
|
|
194
315
|
Vue.createVNode(Vue.unref(index$1.MobileChatPanel), {
|
|
195
316
|
messages: Vue.unref(messages),
|
|
196
317
|
emptyText: __props.emptyText,
|
|
318
|
+
speakingId: speakingId.value,
|
|
197
319
|
onRetry: Vue.unref(retry),
|
|
198
|
-
onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event))
|
|
199
|
-
|
|
320
|
+
onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event)),
|
|
321
|
+
onSpeak: onManualSpeak
|
|
322
|
+
}, null, 8, ["messages", "emptyText", "speakingId", "onRetry"]),
|
|
200
323
|
Vue.createVNode(Vue.unref(index$2.MobileChatInput), {
|
|
201
324
|
disabled: false,
|
|
202
325
|
isStreaming: Vue.unref(isStreaming),
|
|
@@ -214,5 +337,5 @@ const _sfc_main = {
|
|
|
214
337
|
};
|
|
215
338
|
}
|
|
216
339
|
};
|
|
217
|
-
const _AiChat = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-
|
|
340
|
+
const _AiChat = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-0599028a"]]);
|
|
218
341
|
exports.default = _AiChat;
|
|
@@ -58,7 +58,7 @@ const _sfc_main = {
|
|
|
58
58
|
const emit = __emit;
|
|
59
59
|
const inputRef = Vue.ref(null);
|
|
60
60
|
const inputText = Vue.ref("");
|
|
61
|
-
const isVoiceMode = Vue.ref(
|
|
61
|
+
const isVoiceMode = Vue.ref(true);
|
|
62
62
|
const { isCancelling, onVoiceStart } = useVoiceTouch.useVoiceTouch({
|
|
63
63
|
emit,
|
|
64
64
|
voiceStatus: Vue.computed(() => props.voiceStatus),
|
|
@@ -89,14 +89,12 @@ const _sfc_main = {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
function onSend() {
|
|
92
|
+
var _a;
|
|
92
93
|
const text = inputText.value.trim();
|
|
93
94
|
if (!text || props.disabled || props.isStreaming) return;
|
|
94
95
|
emit("send", text);
|
|
95
96
|
inputText.value = "";
|
|
96
|
-
|
|
97
|
-
var _a;
|
|
98
|
-
return (_a = inputRef.value) == null ? void 0 : _a.focus();
|
|
99
|
-
});
|
|
97
|
+
(_a = inputRef.value) == null ? void 0 : _a.blur();
|
|
100
98
|
}
|
|
101
99
|
function onStopStream() {
|
|
102
100
|
emit("stop");
|
|
@@ -207,5 +205,5 @@ const _sfc_main = {
|
|
|
207
205
|
};
|
|
208
206
|
}
|
|
209
207
|
};
|
|
210
|
-
const _ChatInput = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-
|
|
208
|
+
const _ChatInput = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-05501c87"]]);
|
|
211
209
|
exports.default = _ChatInput;
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
;/* empty css */
|
|
4
|
+
;/* empty css */
|
|
4
5
|
;/* empty css */
|
|
5
6
|
;/* empty css */
|
|
6
|
-
;/* empty css */
|
|
7
7
|
;/* empty css */
|
|
8
8
|
const Vue = require("vue");
|
|
9
9
|
const index$1 = require("../MarkdownRenderer/index.js");
|
|
10
10
|
;/* empty css */
|
|
11
11
|
const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.js");
|
|
12
12
|
const index = require("../../../../../../node_modules/vant/es/empty/index.js");
|
|
13
|
-
const
|
|
14
|
-
|
|
13
|
+
const functionCall = require("../../../../../../node_modules/vant/es/toast/function-call.js");
|
|
14
|
+
require("../../../../../../node_modules/vant/es/toast/index.js");
|
|
15
|
+
const index$2 = require("../../../../../../node_modules/vant/es/icon/index.js");
|
|
16
|
+
const index$3 = require("../../../../../../node_modules/vant/es/loading/index.js");
|
|
15
17
|
const _hoisted_1 = {
|
|
16
18
|
key: 0,
|
|
17
19
|
class: "chat-panel__empty"
|
|
@@ -39,13 +41,23 @@ const _hoisted_7 = {
|
|
|
39
41
|
};
|
|
40
42
|
const _hoisted_8 = {
|
|
41
43
|
key: 2,
|
|
44
|
+
class: "chat-panel__actions"
|
|
45
|
+
};
|
|
46
|
+
const _hoisted_9 = ["onClick"];
|
|
47
|
+
const _hoisted_10 = ["onClick"];
|
|
48
|
+
const _hoisted_11 = {
|
|
49
|
+
key: 1,
|
|
50
|
+
class: "iconfont icon-mobileyinliang"
|
|
51
|
+
};
|
|
52
|
+
const _hoisted_12 = {
|
|
53
|
+
key: 3,
|
|
42
54
|
class: "chat-panel__status"
|
|
43
55
|
};
|
|
44
|
-
const
|
|
56
|
+
const _hoisted_13 = {
|
|
45
57
|
key: 1,
|
|
46
58
|
class: "chat-panel__streaming-dot"
|
|
47
59
|
};
|
|
48
|
-
const
|
|
60
|
+
const _hoisted_14 = ["onClick"];
|
|
49
61
|
const _sfc_main = {
|
|
50
62
|
__name: "ChatPanel",
|
|
51
63
|
props: {
|
|
@@ -56,9 +68,11 @@ const _sfc_main = {
|
|
|
56
68
|
/** 是否自动滚动到底部 */
|
|
57
69
|
autoScroll: { type: Boolean, default: true },
|
|
58
70
|
/** 两条消息间隔多久显示时间戳(ms),默认 5 分钟 */
|
|
59
|
-
timeGap: { type: Number, default: 5 * 60 * 1e3 }
|
|
71
|
+
timeGap: { type: Number, default: 5 * 60 * 1e3 },
|
|
72
|
+
/** 正在朗读的消息 id(用于高亮"停止"态) */
|
|
73
|
+
speakingId: { type: String, default: "" }
|
|
60
74
|
},
|
|
61
|
-
emits: ["retry", "scroll-to-bottom", "navigate"],
|
|
75
|
+
emits: ["retry", "scroll-to-bottom", "navigate", "speak"],
|
|
62
76
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
63
77
|
const props = __props;
|
|
64
78
|
const emit = __emit;
|
|
@@ -81,6 +95,34 @@ const _sfc_main = {
|
|
|
81
95
|
const D = d.getDate();
|
|
82
96
|
return `${M}/${D} ${hh}:${mm}`;
|
|
83
97
|
}
|
|
98
|
+
async function onCopy(msg) {
|
|
99
|
+
var _a;
|
|
100
|
+
try {
|
|
101
|
+
const text = msg.content || "";
|
|
102
|
+
if ((_a = navigator.clipboard) == null ? void 0 : _a.writeText) {
|
|
103
|
+
await navigator.clipboard.writeText(text);
|
|
104
|
+
} else {
|
|
105
|
+
const ta = document.createElement("textarea");
|
|
106
|
+
ta.value = text;
|
|
107
|
+
ta.style.position = "fixed";
|
|
108
|
+
ta.style.opacity = "0";
|
|
109
|
+
document.body.appendChild(ta);
|
|
110
|
+
ta.select();
|
|
111
|
+
document.execCommand("copy");
|
|
112
|
+
document.body.removeChild(ta);
|
|
113
|
+
}
|
|
114
|
+
msg.__copied = true;
|
|
115
|
+
functionCall.showToast("已复制");
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
msg.__copied = false;
|
|
118
|
+
}, 1500);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
functionCall.showToast("复制失败");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function onSpeak(msg) {
|
|
124
|
+
emit("speak", msg);
|
|
125
|
+
}
|
|
84
126
|
function scrollToBottom() {
|
|
85
127
|
if (!panelRef.value) return;
|
|
86
128
|
const el = panelRef.value;
|
|
@@ -137,8 +179,8 @@ const _sfc_main = {
|
|
|
137
179
|
__expose({ scrollToBottom });
|
|
138
180
|
return (_ctx, _cache) => {
|
|
139
181
|
const _component_van_empty = index.Empty;
|
|
140
|
-
const
|
|
141
|
-
const
|
|
182
|
+
const _component_van_icon = index$2.Icon;
|
|
183
|
+
const _component_van_loading = index$3.Loading;
|
|
142
184
|
return Vue.openBlock(), Vue.createElementBlock("div", {
|
|
143
185
|
class: "chat-panel",
|
|
144
186
|
ref_key: "panelRef",
|
|
@@ -185,11 +227,29 @@ const _sfc_main = {
|
|
|
185
227
|
onNavigate: _cache[0] || (_cache[0] = ($event) => emit("navigate", $event))
|
|
186
228
|
}, null, 8, ["content", "is-streaming"])
|
|
187
229
|
])) : (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_7, Vue.toDisplayString(msg.content), 1)),
|
|
188
|
-
|
|
230
|
+
msg.role === "assistant" && msg.status === "done" && msg.content && !msg.isWelcome ? (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_8, [
|
|
231
|
+
Vue.createElementVNode("span", {
|
|
232
|
+
class: "chat-panel__action",
|
|
233
|
+
onClick: ($event) => onCopy(msg)
|
|
234
|
+
}, _cache[3] || (_cache[3] = [
|
|
235
|
+
Vue.createElementVNode("i", { class: "iconfont icon-mobilefuzhi" }, null, -1)
|
|
236
|
+
]), 8, _hoisted_9),
|
|
237
|
+
Vue.createElementVNode("span", {
|
|
238
|
+
class: Vue.normalizeClass(["chat-panel__action", { "chat-panel__action--active": __props.speakingId === msg.id }]),
|
|
239
|
+
onClick: ($event) => onSpeak(msg)
|
|
240
|
+
}, [
|
|
241
|
+
__props.speakingId === msg.id ? (Vue.openBlock(), Vue.createBlock(_component_van_icon, {
|
|
242
|
+
key: 0,
|
|
243
|
+
name: "pause",
|
|
244
|
+
size: "14"
|
|
245
|
+
})) : (Vue.openBlock(), Vue.createElementBlock("i", _hoisted_11))
|
|
246
|
+
], 10, _hoisted_10)
|
|
247
|
+
])) : Vue.createCommentVNode("", true),
|
|
248
|
+
["sending", "streaming", "error"].includes(msg.status) ? (Vue.openBlock(), Vue.createElementBlock("div", _hoisted_12, [
|
|
189
249
|
msg.status === "sending" ? (Vue.openBlock(), Vue.createBlock(_component_van_loading, {
|
|
190
250
|
key: 0,
|
|
191
251
|
size: "14"
|
|
192
|
-
})) : msg.status === "streaming" ? (Vue.openBlock(), Vue.createElementBlock("span",
|
|
252
|
+
})) : msg.status === "streaming" ? (Vue.openBlock(), Vue.createElementBlock("span", _hoisted_13, _cache[4] || (_cache[4] = [
|
|
193
253
|
Vue.createElementVNode("i", null, null, -1),
|
|
194
254
|
Vue.createElementVNode("i", null, null, -1),
|
|
195
255
|
Vue.createElementVNode("i", null, null, -1)
|
|
@@ -204,7 +264,7 @@ const _sfc_main = {
|
|
|
204
264
|
size: "14"
|
|
205
265
|
}),
|
|
206
266
|
Vue.createTextVNode(" " + Vue.toDisplayString(msg.error || "发送失败"), 1)
|
|
207
|
-
], 8,
|
|
267
|
+
], 8, _hoisted_14)) : Vue.createCommentVNode("", true)
|
|
208
268
|
])) : Vue.createCommentVNode("", true)
|
|
209
269
|
], 2))
|
|
210
270
|
], 2);
|
|
@@ -228,5 +288,5 @@ const _sfc_main = {
|
|
|
228
288
|
};
|
|
229
289
|
}
|
|
230
290
|
};
|
|
231
|
-
const _ChatPanel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-
|
|
291
|
+
const _ChatPanel = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c2dc87cf"]]);
|
|
232
292
|
exports.default = _ChatPanel;
|