pcm-agents 0.2.0 → 0.2.2

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 (26) hide show
  1. package/dist/cjs/pcm-chat-message.pcm-hr-chat-modal.entry.cjs.js.map +1 -1
  2. package/dist/cjs/pcm-chat-message_2.cjs.entry.js +51 -40
  3. package/dist/cjs/pcm-chat-message_2.cjs.entry.js.map +1 -1
  4. package/dist/collection/components/pcm-chat-message/pcm-chat-message.css +1281 -1270
  5. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js +2 -6
  6. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js.map +1 -1
  7. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.css +123 -105
  8. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +47 -32
  9. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
  10. package/dist/components/{p-DA_FsPRT.js → p-D0s1Q-3O.js} +5 -9
  11. package/dist/components/p-D0s1Q-3O.js.map +1 -0
  12. package/dist/components/pcm-chat-message.js +1 -1
  13. package/dist/components/pcm-chat-modal.js +1 -1
  14. package/dist/components/pcm-hr-chat-modal.js +49 -34
  15. package/dist/components/pcm-hr-chat-modal.js.map +1 -1
  16. package/dist/esm/pcm-chat-message.pcm-hr-chat-modal.entry.js.map +1 -1
  17. package/dist/esm/pcm-chat-message_2.entry.js +51 -40
  18. package/dist/esm/pcm-chat-message_2.entry.js.map +1 -1
  19. package/dist/pcm-agents/p-f8a52c86.entry.js +2 -0
  20. package/dist/pcm-agents/p-f8a52c86.entry.js.map +1 -0
  21. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  22. package/dist/pcm-agents/pcm-chat-message.pcm-hr-chat-modal.entry.esm.js.map +1 -1
  23. package/package.json +1 -1
  24. package/dist/components/p-DA_FsPRT.js.map +0 -1
  25. package/dist/pcm-agents/p-1a7b8c97.entry.js +0 -2
  26. package/dist/pcm-agents/p-1a7b8c97.entry.js.map +0 -1
@@ -45,11 +45,7 @@ export class ChatMessageComponent {
45
45
  const showLoading = this.message.isStreaming && !this.message.answer;
46
46
  const htmlContent = this.message.answer ? marked(this.message.answer) : '';
47
47
  return (h("div", { class: "assistant-message-container" }, h("div", { class: "message-bubble assistant-message" }, h("div", { class: "markdown-content markdown-body", innerHTML: showLoading ?
48
- `<div class="loading-dots">
49
- <span></span>
50
- <span></span>
51
- <span></span>
52
- </div>` :
48
+ `请稍等...` :
53
49
  htmlContent })), !showLoading && this.message.answer && (h("div", { class: "message-actions" }, h("button", { class: "copy-button", onClick: () => this.copyMessageContent(), title: "\u590D\u5236\u5185\u5BB9" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), h("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })))))));
54
50
  }
55
51
  // 渲染输入数据
@@ -80,7 +76,7 @@ export class ChatMessageComponent {
80
76
  })));
81
77
  }
82
78
  render() {
83
- return (h("div", { key: 'f4061a0751312de217a71b1ced068b3c1fe8cf0f', class: "message-round" }, this.renderUserMessage(), this.renderAssistantMessage()));
79
+ return (h("div", { key: '5748f17414b9442b9b791955de38437184fa2f7e', class: "message-round" }, this.renderUserMessage(), this.renderAssistantMessage()));
84
80
  }
85
81
  static get is() { return "pcm-chat-message"; }
86
82
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"pcm-chat-message.js","sourceRoot":"","sources":["../../../src/components/pcm-chat-message/pcm-chat-message.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, Element, Event, EventEmitter } from '@stencil/core';\r\nimport { marked } from 'marked';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n@Component({\r\n tag: 'pcm-chat-message',\r\n styleUrl: 'pcm-chat-message.css',\r\n shadow: true,\r\n})\r\nexport class ChatMessageComponent {\r\n /**\r\n * 消息数据\r\n */\r\n @Prop() message: ChatMessage;\r\n\r\n /**\r\n * 消息变更事件\r\n */\r\n @Event() messageChange: EventEmitter<Partial<ChatMessage>>;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true\r\n });\r\n }\r\n\r\n // 复制消息内容到剪贴板\r\n private copyMessageContent() {\r\n if (this.message.answer) {\r\n navigator.clipboard.writeText(this.message.answer)\r\n .then(() => {\r\n // 可以添加复制成功的提示\r\n console.log('内容已复制到剪贴板');\r\n })\r\n .catch(err => {\r\n console.error('复制失败:', err);\r\n });\r\n }\r\n }\r\n\r\n // 渲染用户消息部分\r\n private renderUserMessage() {\r\n if (!this.message?.query?.trim()) return null;\r\n\r\n return (\r\n <div class=\"user-message-container\">\r\n <div class=\"message-bubble user-message\">\r\n <p>{this.message.query}</p>\r\n {this.renderInputs()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染助手消息部分\r\n private renderAssistantMessage() {\r\n if (!this.message.answer && !this.message.isStreaming) return null;\r\n\r\n // 只有在开始流式输出且还没有内容时才显示loading\r\n const showLoading = this.message.isStreaming && !this.message.answer;\r\n const htmlContent = this.message.answer ? marked(this.message.answer) : '';\r\n\r\n return (\r\n <div class=\"assistant-message-container\">\r\n <div class=\"message-bubble assistant-message\">\r\n <div\r\n class=\"markdown-content markdown-body\"\r\n innerHTML={showLoading ? \r\n `<div class=\"loading-dots\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>` : \r\n htmlContent\r\n }\r\n ></div>\r\n </div>\r\n {!showLoading && this.message.answer && (\r\n <div class=\"message-actions\">\r\n <button class=\"copy-button\" onClick={() => this.copyMessageContent()} title=\"复制内容\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染输入数据\r\n private renderInputs() {\r\n if (!this.message.inputs) return null;\r\n\r\n return (\r\n <div>\r\n {Object.keys(this.message.inputs).map((key, index) => {\r\n const value = this.message.inputs[key];\r\n if (value && !key.startsWith('hide_') && key !== 'answer') {\r\n if (key === 'file_url') {\r\n return <div key={index} class=\"file-view\">{value}</div>;\r\n } else if (key === 'file_urls' || key === 'fileUrls') {\r\n const fileList = value.split(',');\r\n return (\r\n <div key={index} class=\"flex flex-wrap\">\r\n {fileList.map((fileUrl, fileIndex) => (\r\n <div key={fileIndex} class=\"file-view\">{fileUrl}</div>\r\n ))}\r\n </div>\r\n );\r\n } else if (key === 'job_info') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">职位信息</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else if (key === 'rule') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">评估规则</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else {\r\n return <div key={index} class=\"input-metadata\">{key}: {`${value}`}</div>;\r\n }\r\n }\r\n return null;\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n <div class=\"message-round\">\r\n {this.renderUserMessage()}\r\n {this.renderAssistantMessage()}\r\n </div>\r\n );\r\n }\r\n} "]}
1
+ {"version":3,"file":"pcm-chat-message.js","sourceRoot":"","sources":["../../../src/components/pcm-chat-message/pcm-chat-message.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, Element, Event, EventEmitter } from '@stencil/core';\r\nimport { marked } from 'marked';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n@Component({\r\n tag: 'pcm-chat-message',\r\n styleUrl: 'pcm-chat-message.css',\r\n shadow: true,\r\n})\r\nexport class ChatMessageComponent {\r\n /**\r\n * 消息数据\r\n */\r\n @Prop() message: ChatMessage;\r\n\r\n /**\r\n * 消息变更事件\r\n */\r\n @Event() messageChange: EventEmitter<Partial<ChatMessage>>;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true\r\n });\r\n }\r\n\r\n // 复制消息内容到剪贴板\r\n private copyMessageContent() {\r\n if (this.message.answer) {\r\n navigator.clipboard.writeText(this.message.answer)\r\n .then(() => {\r\n // 可以添加复制成功的提示\r\n console.log('内容已复制到剪贴板');\r\n })\r\n .catch(err => {\r\n console.error('复制失败:', err);\r\n });\r\n }\r\n }\r\n\r\n // 渲染用户消息部分\r\n private renderUserMessage() {\r\n if (!this.message?.query?.trim()) return null;\r\n\r\n return (\r\n <div class=\"user-message-container\">\r\n <div class=\"message-bubble user-message\">\r\n <p>{this.message.query}</p>\r\n {this.renderInputs()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染助手消息部分\r\n private renderAssistantMessage() {\r\n if (!this.message.answer && !this.message.isStreaming) return null;\r\n\r\n // 只有在开始流式输出且还没有内容时才显示loading\r\n const showLoading = this.message.isStreaming && !this.message.answer;\r\n const htmlContent = this.message.answer ? marked(this.message.answer) : '';\r\n\r\n return (\r\n <div class=\"assistant-message-container\">\r\n <div class=\"message-bubble assistant-message\">\r\n <div\r\n class=\"markdown-content markdown-body\"\r\n innerHTML={showLoading ? \r\n `请稍等...` : \r\n htmlContent\r\n }\r\n ></div>\r\n </div>\r\n {!showLoading && this.message.answer && (\r\n <div class=\"message-actions\">\r\n <button class=\"copy-button\" onClick={() => this.copyMessageContent()} title=\"复制内容\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染输入数据\r\n private renderInputs() {\r\n if (!this.message.inputs) return null;\r\n\r\n return (\r\n <div>\r\n {Object.keys(this.message.inputs).map((key, index) => {\r\n const value = this.message.inputs[key];\r\n if (value && !key.startsWith('hide_') && key !== 'answer') {\r\n if (key === 'file_url') {\r\n return <div key={index} class=\"file-view\">{value}</div>;\r\n } else if (key === 'file_urls' || key === 'fileUrls') {\r\n const fileList = value.split(',');\r\n return (\r\n <div key={index} class=\"flex flex-wrap\">\r\n {fileList.map((fileUrl, fileIndex) => (\r\n <div key={fileIndex} class=\"file-view\">{fileUrl}</div>\r\n ))}\r\n </div>\r\n );\r\n } else if (key === 'job_info') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">职位信息</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else if (key === 'rule') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">评估规则</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else {\r\n return <div key={index} class=\"input-metadata\">{key}: {`${value}`}</div>;\r\n }\r\n }\r\n return null;\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n <div class=\"message-round\">\r\n {this.renderUserMessage()}\r\n {this.renderAssistantMessage()}\r\n </div>\r\n );\r\n }\r\n} "]}
@@ -40,6 +40,19 @@
40
40
  height: 100%;
41
41
  border-radius: 0;
42
42
  margin: 0;
43
+ display: flex;
44
+ flex-direction: column;
45
+ height: 100vh;
46
+ max-height: 100vh;
47
+ }
48
+
49
+ /* 确保内容区域也使用 flex 布局并占满剩余空间 */
50
+ .modal-container.fullscreen > div:not(.modal-header):not(.initial-upload) {
51
+ display: flex;
52
+ flex-direction: column;
53
+ flex: 1;
54
+ overflow: hidden; /* 防止内容溢出 */
55
+ height: 100%;
43
56
  }
44
57
 
45
58
  /* PC端布局 */
@@ -90,89 +103,62 @@
90
103
  flex-direction: column;
91
104
  }
92
105
 
93
- .chat-history {
94
- /* 保持固定高度 */
95
- height: 34vh;
96
- max-height: 34vh;
97
- min-height: 34vh;
98
- flex: 0 0 auto; /* 防止 chat-history 被拉伸 */
99
- }
100
-
101
- .recording-section {
102
- flex: 1 1 auto;
103
- height: auto;
104
- margin: 0;
105
- padding: 20px;
106
- display: flex;
107
- flex-direction: column;
108
- justify-content: center;
109
- align-items: center;
110
- background-color: #f5f5f5;
111
- }
106
+ }
107
+ .video-preview.placeholder {
108
+ display: flex;
109
+ justify-content: center;
110
+ align-items: center;
111
+ background: #EAEAEA;
112
+ }
112
113
 
113
- .recording-container {
114
- width: 320px;
115
- display: flex;
116
- flex-direction: column;
117
- align-items: center;
118
- }
114
+ .placeholder-status {
115
+ color: #00000066;
116
+ }
119
117
 
120
- .video-area {
121
- width: 100%;
122
- }
118
+ .waiting-message p {
119
+ margin: 0;
120
+ font-size: 16px;
121
+ color: white;
122
+ font-weight: 500;
123
+ }
123
124
 
124
- .video-preview {
125
- width: 100%;
126
- height: 200px;
127
- position: relative;
128
- border: 1px solid #ddd;
129
- border-radius: 4px;
130
- overflow: hidden;
131
- background: #fff;
132
- }
125
+ .recording-container {
126
+ width: 100%;
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ }
133
131
 
134
- .video-preview.placeholder {
135
- display: flex;
136
- justify-content: center;
137
- align-items: center;
138
- background: #f8f8f8;
139
- }
140
132
 
141
- .waiting-message {
142
- background: #1890ff;
143
- padding: 12px 20px;
144
- border-radius: 24px;
145
- text-align: center;
146
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
147
- white-space: nowrap;
148
- }
149
133
 
150
- /* 添加加载状态的样式 */
151
- .waiting-message.loading {
152
- background: #faad14;
153
- }
134
+ .video-area {
135
+ width: 100%;
136
+ display: flex;
137
+ flex-direction: column;
138
+ align-items: center;
139
+ }
154
140
 
155
- .waiting-message p {
156
- margin: 0;
157
- font-size: 16px;
158
- color: white;
159
- font-weight: 500;
160
- }
141
+ .stop-recording-button {
142
+ width: 100%;
143
+ height: 100%;
144
+ font-size: 16px;
145
+ background: #f44336;
146
+ border-radius: 6px;
147
+ color: white;
148
+ border: none;
149
+ cursor: pointer;
150
+ }
161
151
 
162
- .stop-recording-button {
163
- width: 100%;
164
- padding: 12px;
165
- font-size: 16px;
166
- border-radius: 4px;
167
- background: #f44336;
168
- color: white;
169
- border: none;
170
- cursor: pointer;
171
- }
152
+ .stop-recording-button:hover {
153
+ background: #d32f2f;
154
+ }
172
155
 
173
- .stop-recording-button:hover {
174
- background: #d32f2f;
175
- }
156
+ .play-audio-container {
157
+ width: 100%;
158
+ height: 100%;
159
+ display: flex;
160
+ justify-content: center;
161
+ align-items: center;
176
162
  }
177
163
 
178
164
  .modal-header {
@@ -182,6 +168,7 @@
182
168
  padding: 4px 16px;
183
169
  height: 50px;
184
170
  border-bottom: 1px solid #e8e8e8;
171
+ flex-shrink: 0; /* 防止头部被压缩 */
185
172
  }
186
173
 
187
174
  .header-left {
@@ -228,10 +215,18 @@
228
215
  overflow-y: auto;
229
216
  padding: 20px;
230
217
  scroll-behavior: smooth;
231
- max-height: 25vh;
232
- height: 25vh;
218
+ min-height: 200px;
219
+ background: url(https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/web/sdk/chat_bg.png);
220
+ background-size: 100%;
221
+ }
222
+
223
+ /* 添加全屏模式下的样式 */
224
+ .fullscreen .chat-history {
225
+ height: auto;
226
+ flex: 1 1 auto;
233
227
  }
234
228
 
229
+
235
230
  .message-input {
236
231
  padding: 16px;
237
232
  border-top: 1px solid #eee;
@@ -354,8 +349,13 @@
354
349
  }
355
350
 
356
351
  @keyframes spin {
357
- 0% { transform: rotate(0deg); }
358
- 100% { transform: rotate(360deg); }
352
+ 0% {
353
+ transform: rotate(0deg);
354
+ }
355
+
356
+ 100% {
357
+ transform: rotate(360deg);
358
+ }
359
359
  }
360
360
 
361
361
  /* 修改 messages-wrapper 的样式 */
@@ -521,7 +521,7 @@
521
521
  }
522
522
 
523
523
  .initial-upload {
524
- padding: 2rem 1rem;
524
+ padding: 1rem 1rem;
525
525
  display: flex;
526
526
  flex-direction: column;
527
527
  align-items: center;
@@ -593,7 +593,7 @@
593
593
  }
594
594
 
595
595
  .submit-button {
596
- margin-bottom: 1rem;
596
+ margin-top: 1rem;
597
597
  padding: 0.8rem 2rem;
598
598
  background: #1890ff;
599
599
  color: white;
@@ -602,6 +602,7 @@
602
602
  font-size: 1rem;
603
603
  cursor: pointer;
604
604
  transition: all 0.3s ease;
605
+ width: 95%;
605
606
  }
606
607
 
607
608
  .submit-button:disabled {
@@ -615,7 +616,7 @@
615
616
 
616
617
  .category-select,
617
618
  .dimension-select {
618
- margin: 20px 0;
619
+ margin: 30px 0;
619
620
  }
620
621
 
621
622
  .category-options,
@@ -628,9 +629,9 @@
628
629
 
629
630
  .category-button,
630
631
  .dimension-button {
631
- padding: 8px 16px;
632
- border: 1px solid #ddd;
633
- border-radius: 20px;
632
+ padding: 12px 16px;
633
+ border: 1px solid #E5E5E5;
634
+ border-radius: 6px;
634
635
  background: white;
635
636
  cursor: pointer;
636
637
  transition: all 0.3s;
@@ -642,33 +643,33 @@
642
643
  }
643
644
 
644
645
  .category-button.selected {
645
- background: #1890ff;
646
+ background-image: linear-gradient(111deg, #4A9FFF 0%, #1058FF 100%);
646
647
  color: white;
647
- border-color: #1890ff;
648
648
  }
649
649
 
650
650
  .dimension-button.selected {
651
- background: #52c41a;
651
+ background-image: linear-gradient(111deg, #4A9FFF 0%, #1058FF 100%);
652
652
  color: white;
653
- border-color: #52c41a;
654
653
  }
655
654
 
656
655
  .recording-section {
657
- margin-top: 10px;
658
- padding: 10px;
659
656
  border-top: 1px solid #eee;
660
657
  display: flex;
661
658
  flex-direction: column;
662
659
  align-items: center;
660
+ padding: 20px;
661
+ border-radius: 14px 14px 0 0;
662
+ flex: 0 0 auto;
663
663
  }
664
664
 
665
665
  .recording-section .video-preview {
666
- width: 320px;
666
+ width: 100%;
667
667
  height: 200px;
668
+ max-width: 400px;
668
669
  position: relative;
669
670
  margin-bottom: 10px;
670
671
  border: 1px solid #ddd;
671
- border-radius: 4px;
672
+ border-radius: 12px;
672
673
  overflow: hidden;
673
674
  }
674
675
 
@@ -710,17 +711,23 @@
710
711
  }
711
712
 
712
713
  @keyframes blink {
713
- 0% { opacity: 1; }
714
- 50% { opacity: 0.5; }
715
- 100% { opacity: 1; }
714
+ 0% {
715
+ opacity: 1;
716
+ }
717
+
718
+ 50% {
719
+ opacity: 0.5;
720
+ }
721
+
722
+ 100% {
723
+ opacity: 1;
724
+ }
716
725
  }
717
726
 
718
727
  .recording-section .stop-recording-button {
719
- padding: 8px 16px;
720
728
  background-color: #f44336;
721
729
  color: white;
722
730
  border: none;
723
- border-radius: 4px;
724
731
  cursor: pointer;
725
732
  font-weight: bold;
726
733
  }
@@ -739,21 +746,26 @@
739
746
  }
740
747
 
741
748
  .recording-controls {
749
+ margin-top: 10px;
750
+ height: 53px;
751
+ width: 100%;
752
+ max-width: 400px;
742
753
  display: flex;
743
754
  justify-content: center;
744
- align-items: center;
745
- margin-top: 1rem;
746
- min-height: 40px; /* 确保高度一致 */
747
755
  }
748
756
 
749
757
  .recording-controls .waiting-message {
750
758
  text-align: center;
751
759
  color: white;
752
760
  font-size: 1rem;
753
- background: #1890ff;
754
- padding: 12px 20px;
755
- border-radius: 24px;
761
+ background-image: linear-gradient(100deg, #4A9FFF 0%, #1058FF 100%);
762
+ border-radius: 6px;
756
763
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
764
+ width: 95%;
765
+ display: flex;
766
+ justify-content: center;
767
+ align-items: center;
768
+ cursor: pointer;
757
769
  }
758
770
 
759
771
  .recording-controls .waiting-message.loading {
@@ -768,11 +780,9 @@
768
780
  }
769
781
 
770
782
  .recording-controls .stop-recording-button {
771
- padding: 8px 20px;
772
783
  background-color: #dc3545;
773
784
  color: white;
774
785
  border: none;
775
- border-radius: 4px;
776
786
  cursor: pointer;
777
787
  font-size: 1rem;
778
788
  }
@@ -781,4 +791,12 @@
781
791
  background-color: #c82333;
782
792
  }
783
793
 
794
+ /* 添加禁用状态的样式 */
795
+ .recording-controls .stop-recording-button.disabled {
796
+ background: #ccc;
797
+ cursor: not-allowed;
798
+ }
784
799
 
800
+ .recording-controls .stop-recording-button.disabled:hover {
801
+ background: #ccc;
802
+ }
@@ -228,6 +228,7 @@ export class ChatHRModal {
228
228
  async sendMessageToAPI(message) {
229
229
  this.isLoading = true;
230
230
  let answer = '';
231
+ let llmText = ''; // 添加变量存储 LLMText
231
232
  const now = new Date();
232
233
  const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;
233
234
  // 如果消息为空但有文件,使用默认文本
@@ -304,6 +305,11 @@ export class ChatHRModal {
304
305
  this.conversationId = data.conversation_id;
305
306
  this.updateUrlWithConversationId(data.conversation_id);
306
307
  }
308
+ // 检查是否有 node_finished 事件和 LLMText
309
+ if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {
310
+ llmText = data.data.inputs.LLMText;
311
+ console.log('获取到 LLMText:', llmText);
312
+ }
307
313
  if (data.event === 'message') {
308
314
  const inputMessage = { message: message };
309
315
  convertWorkflowStreamNodeToMessageRound('message', inputMessage, data);
@@ -356,18 +362,22 @@ export class ChatHRModal {
356
362
  console.log(this.currentQuestionNumber);
357
363
  console.log(message);
358
364
  if (latestAIMessage && latestAIMessage.answer) {
359
- // 合成语音
360
- const audioUrl = await this.synthesizeAudio(latestAIMessage.answer);
361
- if (this.enableVoice) {
362
- // 自动播放语音
363
- await this.playAudio(audioUrl);
364
- // 自动播放模式下,播放完成后立即开始等待录制
365
- this.startWaitingToRecord();
366
- }
367
- else {
368
- // 只保存音频URL,不自动播放
369
- this.audioUrl = audioUrl;
370
- // 非自动播放模式下,不立即开始等待录制
365
+ // 优先使用 LLMText,如果没有则使用 answer
366
+ const textForSynthesis = llmText || latestAIMessage.answer;
367
+ if (textForSynthesis) {
368
+ // 合成语音
369
+ const audioUrl = await this.synthesizeAudio(textForSynthesis);
370
+ if (this.enableVoice) {
371
+ // 自动播放语音
372
+ await this.playAudio(audioUrl);
373
+ // 自动播放模式下,播放完成后立即开始等待录制
374
+ this.startWaitingToRecord();
375
+ }
376
+ else {
377
+ // 只保存音频URL,不自动播放
378
+ this.audioUrl = audioUrl;
379
+ // 非自动播放模式下,不立即开始等待录制
380
+ }
371
381
  }
372
382
  }
373
383
  }
@@ -1006,6 +1016,27 @@ export class ChatHRModal {
1006
1016
  'recording-status': true,
1007
1017
  'warning': this.showCountdownWarning
1008
1018
  } }, h("span", { class: "recording-dot" }), h("span", null, "\u5F55\u5236\u4E2D ", Math.floor(this.recordingTimeLeft / 60), ":", (this.recordingTimeLeft % 60).toString().padStart(2, '0'), this.showCountdownWarning && ` (即将自动完成)`))));
1019
+ // 渲染占位符状态信息
1020
+ const renderPlaceholderStatus = () => {
1021
+ // 正在播放音频
1022
+ if (this.isPlayingAudio) {
1023
+ return (h("div", { class: "placeholder-status" }, h("p", null, "\u6B63\u5728\u64AD\u653E\u95EE\u9898\uFF0C\u8BF7\u542C\u5B8C\u540E\u51C6\u5907\u56DE\u7B54...")));
1024
+ }
1025
+ // 正在上传视频
1026
+ if (this.isUploadingVideo) {
1027
+ return (h("div", { class: "placeholder-status" }, h("p", null, "\u6B63\u5728\u4E0A\u4F20\u89C6\u9891\uFF0C\u8BF7\u7A0D\u5019...")));
1028
+ }
1029
+ // 正在加载或等待AI回复
1030
+ if (this.isLoading || this.currentStreamingMessage) {
1031
+ return (h("div", { class: "placeholder-status" }, h("p", null, "\u8BF7\u7B49\u5F85\u9898\u76EE...")));
1032
+ }
1033
+ // 等待开始录制
1034
+ if (this.waitingToRecord) {
1035
+ return (h("div", { class: "placeholder-status" }, h("p", null, "\u8BF7\u51C6\u5907\u597D\uFF0C", this.waitingTimeLeft, "\u79D2\u540E\u5C06\u5F00\u59CB\u5F55\u5236\u60A8\u7684\u56DE\u7B54...")));
1036
+ }
1037
+ // 添加默认状态
1038
+ return (h("div", { class: "placeholder-status default-status" }, h("p", null, "\u51C6\u5907\u4E2D...")));
1039
+ };
1009
1040
  return (h("div", { class: overlayClass, style: modalStyle }, h("div", { class: containerClass }, this.isShowHeader && (h("div", { class: "modal-header" }, h("div", { class: "header-left" }, this.icon && h("img", { src: this.icon, class: "header-icon", alt: "\u5E94\u7528\u56FE\u6807" }), h("div", null, this.modalTitle)), this.isNeedClose && (h("button", { class: "close-button", onClick: this.handleClose }, h("span", null, "\u00D7"))))), this.showInitialUpload ? (h("div", { class: "initial-upload" }, h("div", { class: "upload-section" }, this.requireResume && (h(h.Fragment, null, h("h3", null, "\u5F00\u59CB\u524D\uFF0C\u8BF7\u4E0A\u4F20\u60A8\u7684\u7B80\u5386"), h("div", { class: "upload-area", onClick: this.handleUploadClick }, this.selectedFile ? (h("div", { class: "file-info" }, h("span", null, this.selectedFile.name), h("button", { class: "remove-file", onClick: (e) => {
1010
1041
  e.stopPropagation();
1011
1042
  this.clearSelectedFile();
@@ -1018,32 +1049,16 @@ export class ChatHRModal {
1018
1049
  }, onClick: () => this.handleDimensionSelect(dimension) }, dimension))))), h("button", { class: "submit-button", disabled: (this.requireResume && !this.selectedFile) ||
1019
1050
  !this.selectedJobCategory ||
1020
1051
  this.selectedDimensions.length === 0 ||
1021
- (this.requireResume && this.isUploading), onClick: this.handleInitialSubmit }, this.requireResume && this.isUploading ? '上传中...' : '开始面试')), this.requireResume && (h("input", { type: "file", class: "file-input", onChange: this.handleFileChange, accept: ".pdf,.doc,.docx,.txt" })))) : (h(h.Fragment, null, h("div", { class: "chat-history", onScroll: this.handleScroll }, this.isLoadingHistory ? (h("div", { class: "loading-container" }, h("div", { class: "loading-spinner" }), h("p", null, "\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u4E2D..."))) : (h(h.Fragment, null, this.messages.map((message) => (h("div", { id: `message_${message.id}`, key: message.id }, h("pcm-chat-message", { message: message, onMessageChange: (event) => {
1052
+ (this.requireResume && this.isUploading), onClick: this.handleInitialSubmit }, this.requireResume && this.isUploading ? '上传中...' : '开始面试')), this.requireResume && (h("input", { type: "file", class: "file-input", onChange: this.handleFileChange, accept: ".pdf,.doc,.docx,.txt" })))) : (h("div", { style: { height: '100%' } }, h("div", { class: "chat-history", onScroll: this.handleScroll }, this.isLoadingHistory ? (h("div", { class: "loading-container" }, h("div", { class: "loading-spinner" }), h("p", null, "\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u4E2D..."))) : (h("div", null, this.messages.map((message) => (h("div", { id: `message_${message.id}`, key: message.id }, h("pcm-chat-message", { message: message, onMessageChange: (event) => {
1022
1053
  const updatedMessages = this.messages.map(msg => msg.id === message.id ? { ...msg, ...event.detail } : msg);
1023
1054
  this.messages = updatedMessages;
1024
- } })))), this.currentStreamingMessage && (h("div", { id: `message_${this.currentStreamingMessage.id}` }, h("pcm-chat-message", { message: this.currentStreamingMessage }))), this.messages.length === 0 && !this.currentStreamingMessage && (h("div", { class: "empty-state" }, h("p", null, "\u8BF7\u4E0A\u4F20\u7B80\u5386\u5F00\u59CB\u9762\u8BD5")))))), h("div", { class: "recording-section" }, h("div", { class: "recording-container" }, h("div", { class: "video-area" }, this.showRecordingUI ? (renderVideoPreview()) : (h("div", { class: "video-preview placeholder" }))), h("div", { class: "recording-controls" }, this.showRecordingUI ? (h("button", { class: "stop-recording-button", onClick: () => this.stopRecording() }, "\u5B8C\u6210\u56DE\u7B54")) : (h("div", { class: "waiting-message" }, (() => {
1025
- // 正在播放音频
1026
- if (this.isPlayingAudio) {
1027
- return h("p", null, "\u6B63\u5728\u64AD\u653E\u95EE\u9898\uFF0C\u8BF7\u542C\u5B8C\u540E\u51C6\u5907\u56DE\u7B54...");
1028
- }
1029
- // 正在上传视频
1030
- if (this.isUploadingVideo) {
1031
- return h("p", null, "\u6B63\u5728\u4E0A\u4F20\u89C6\u9891\uFF0C\u8BF7\u7A0D\u5019...");
1032
- }
1033
- // 正在加载或等待AI回复
1034
- if (this.isLoading || this.currentStreamingMessage) {
1035
- return h("p", null, "\u8BF7\u7B49\u5F85\u9898\u76EE...");
1036
- }
1037
- // 等待开始录制
1038
- if (this.waitingToRecord) {
1039
- return h("p", null, "\u8BF7\u51C6\u5907\u597D\uFF0C", this.waitingTimeLeft, "\u79D2\u540E\u5C06\u5F00\u59CB\u5F55\u5236\u60A8\u7684\u56DE\u7B54...");
1040
- }
1055
+ } })))), this.currentStreamingMessage && (h("div", { id: `message_${this.currentStreamingMessage.id}` }, h("pcm-chat-message", { message: this.currentStreamingMessage }))), this.messages.length === 0 && !this.currentStreamingMessage && (h("div", { class: "empty-state" }, h("p", null, "\u8BF7\u4E0A\u4F20\u7B80\u5386\u5F00\u59CB\u9762\u8BD5")))))), h("div", { class: "recording-section" }, h("div", { class: "recording-container" }, h("div", { class: "video-area" }, this.showRecordingUI ? (renderVideoPreview()) : (h("div", { class: "video-preview placeholder" }, renderPlaceholderStatus()))), h("div", { class: "recording-controls" }, this.showRecordingUI ? (h("button", { class: "stop-recording-button", onClick: () => this.stopRecording() }, "\u5B8C\u6210\u672C\u9898\u56DE\u7B54")) : (h("div", { class: "waiting-message" }, (() => {
1041
1056
  // 显示播放按钮(当不自动播放且有音频URL时)
1042
1057
  if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {
1043
1058
  return (h("div", { class: "play-audio-container", onClick: this.handlePlayAudio }, h("p", null, h("svg", { viewBox: "0 0 24 24", width: "24", height: "24", fill: "currentColor", style: { verticalAlign: 'middle', marginRight: '8px' } }, h("path", { d: "M8 5v14l11-7z" })), h("span", { style: { verticalAlign: 'middle' } }, "\u64AD\u653E\u9898\u76EE"))));
1044
1059
  }
1045
- // 默认状态
1046
- return h("p", null, "\u51C6\u5907\u4E2D...");
1060
+ // 其他状态下显示禁用的"完成回答"按钮
1061
+ return (h("button", { class: "stop-recording-button disabled", disabled: true }, "\u5B8C\u6210\u56DE\u7B54"));
1047
1062
  })()))))))))));
1048
1063
  }
1049
1064
  static get is() { return "pcm-hr-chat-modal"; }