pcm-agents 1.0.0 → 1.0.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 (164) hide show
  1. package/dist/cjs/components-chat-message_33.cjs.entry.js +28 -7
  2. package/dist/cjs/components-chat-message_33.cjs.entry.js.map +1 -1
  3. package/dist/cjs/{conversation-utils-BfkOMf_-.js → conversation-utils-B4jUfmtU.js} +4 -4
  4. package/dist/cjs/{conversation-utils-BfkOMf_-.js.map → conversation-utils-B4jUfmtU.js.map} +1 -1
  5. package/dist/cjs/{index-BnRvF-cO.js → index-Dghp_NL6.js} +3 -3
  6. package/dist/cjs/{index-BnRvF-cO.js.map → index-Dghp_NL6.js.map} +1 -1
  7. package/dist/cjs/index.cjs.js +1 -1
  8. package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
  9. package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
  10. package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
  11. package/dist/cjs/oem-jlzz-modal.cjs.entry.js +23 -2
  12. package/dist/cjs/oem-jlzz-modal.cjs.entry.js.map +1 -1
  13. package/dist/cjs/oem-jlzz-modal.entry.cjs.js.map +1 -1
  14. package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
  15. package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
  16. package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +3 -3
  17. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +2 -2
  18. package/dist/cjs/pcm-jlsx-modal.cjs.entry.js +174 -6
  19. package/dist/cjs/pcm-jlsx-modal.cjs.entry.js.map +1 -1
  20. package/dist/cjs/pcm-jlsx-modal.entry.cjs.js.map +1 -1
  21. package/dist/cjs/{sentry-reporter-CAeLEFLc.js → sentry-reporter-CgJowDyu.js} +3 -3
  22. package/dist/cjs/{sentry-reporter-CAeLEFLc.js.map → sentry-reporter-CgJowDyu.js.map} +1 -1
  23. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.css +8 -2
  24. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js +35 -0
  25. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js.map +1 -1
  26. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.css +1 -1
  27. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.css +14 -0
  28. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js +173 -5
  29. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js.map +1 -1
  30. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.css +8 -2
  31. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +35 -0
  32. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
  33. package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.css +1 -1
  34. package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.css +1 -1
  35. package/dist/components/components-chat-message.js +1 -1
  36. package/dist/components/components-digital-human.js +1 -1
  37. package/dist/components/components-export-records-modal.js +1 -1
  38. package/dist/components/components-mobile-input-btn.js +1 -1
  39. package/dist/components/components-mobile-upload-btn.js +1 -1
  40. package/dist/components/components-position-selector.js +1 -1
  41. package/dist/components/components-thousand-resume-wrapper.js +1 -1
  42. package/dist/components/components-upload.js +1 -1
  43. package/dist/components/components-voice-input-btn.js +1 -1
  44. package/dist/components/index.js +1 -1
  45. package/dist/components/oem-htws-modal.js +5 -5
  46. package/dist/components/oem-jd-modal.js +5 -5
  47. package/dist/components/oem-jlpp-modal.js +7 -7
  48. package/dist/components/oem-jlsx-modal.js +5 -5
  49. package/dist/components/oem-jlzz-modal.js +27 -6
  50. package/dist/components/oem-jlzz-modal.js.map +1 -1
  51. package/dist/components/oem-mnct-modal.js +7 -7
  52. package/dist/components/oem-mnms-modal.js +8 -8
  53. package/dist/components/oem-qgqjl-modal.js +9 -9
  54. package/dist/components/oem-zygh-modal.js +5 -5
  55. package/dist/components/{p-Bab9bYff.js → p-BDEiyYVl.js} +4 -4
  56. package/dist/components/{p-Bab9bYff.js.map → p-BDEiyYVl.js.map} +1 -1
  57. package/dist/components/{p-DkJ7RM7j.js → p-Bg0KKnpU.js} +3 -3
  58. package/dist/components/{p-DkJ7RM7j.js.map → p-Bg0KKnpU.js.map} +1 -1
  59. package/dist/components/{p-CR7hzwAG.js → p-BhdGTSLg.js} +6 -6
  60. package/dist/components/p-BhdGTSLg.js.map +1 -0
  61. package/dist/components/{p-CUpl5cwz.js → p-C-lvK9NX.js} +3 -3
  62. package/dist/components/{p-CUpl5cwz.js.map → p-C-lvK9NX.js.map} +1 -1
  63. package/dist/components/{p-Bn48g_o5.js → p-C7ubjB1x.js} +3 -3
  64. package/dist/components/{p-Bn48g_o5.js.map → p-C7ubjB1x.js.map} +1 -1
  65. package/dist/components/{p-Cp6_0jsj.js → p-CB7myOe_.js} +3 -3
  66. package/dist/components/{p-Cp6_0jsj.js.map → p-CB7myOe_.js.map} +1 -1
  67. package/dist/components/{p-DNPkGKCS.js → p-CEu-bFot.js} +3 -3
  68. package/dist/components/{p-DNPkGKCS.js.map → p-CEu-bFot.js.map} +1 -1
  69. package/dist/components/{p-BH3zMcBy.js → p-CPq5-i_-.js} +4 -4
  70. package/dist/components/{p-BH3zMcBy.js.map → p-CPq5-i_-.js.map} +1 -1
  71. package/dist/components/{p-Cy_hQiQs.js → p-CzFKth7J.js} +3 -3
  72. package/dist/components/{p-Cy_hQiQs.js.map → p-CzFKth7J.js.map} +1 -1
  73. package/dist/components/{p-CCTgkbh7.js → p-D4RnNrxx.js} +3 -3
  74. package/dist/components/{p-CCTgkbh7.js.map → p-D4RnNrxx.js.map} +1 -1
  75. package/dist/components/{p-DrIjQbpV.js → p-DJDJfWq9.js} +3 -3
  76. package/dist/components/{p-DrIjQbpV.js.map → p-DJDJfWq9.js.map} +1 -1
  77. package/dist/components/{p-DuRuN7gY.js → p-i4wY2JnB.js} +3 -3
  78. package/dist/components/{p-DuRuN7gY.js.map → p-i4wY2JnB.js.map} +1 -1
  79. package/dist/components/{p-BBxWf8DW.js → p-oVAdweom.js} +3 -3
  80. package/dist/components/{p-BBxWf8DW.js.map → p-oVAdweom.js.map} +1 -1
  81. package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
  82. package/dist/components/pcm-app-chat-modal.js +1 -1
  83. package/dist/components/pcm-ats-mnms-modal.js +5 -5
  84. package/dist/components/pcm-card.js +1 -1
  85. package/dist/components/pcm-hr-chat-modal.js +2 -2
  86. package/dist/components/pcm-htws-modal.js +8 -8
  87. package/dist/components/pcm-hyzj-modal.js +5 -5
  88. package/dist/components/pcm-jd-modal.js +6 -6
  89. package/dist/components/pcm-jlpp-modal.js +8 -8
  90. package/dist/components/pcm-jlsx-modal.js +177 -9
  91. package/dist/components/pcm-jlsx-modal.js.map +1 -1
  92. package/dist/components/pcm-jlzz-modal.js +28 -7
  93. package/dist/components/pcm-jlzz-modal.js.map +1 -1
  94. package/dist/components/pcm-mnct-modal.js +7 -7
  95. package/dist/components/pcm-mnms-modal.js +8 -8
  96. package/dist/components/pcm-mnms-zp-modal.js +8 -8
  97. package/dist/components/pcm-msbg-modal.js +5 -5
  98. package/dist/components/pcm-qgqjl-modal.js +9 -9
  99. package/dist/components/pcm-virtual-chat-modal.js +1 -1
  100. package/dist/components/pcm-zsk-chat-modal.js +3 -3
  101. package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
  102. package/dist/components/pcm-zygh-modal.js +7 -7
  103. package/dist/components/pcm-zygh-v2-modal.js +7 -7
  104. package/dist/esm/components-chat-message_33.entry.js +28 -7
  105. package/dist/esm/components-chat-message_33.entry.js.map +1 -1
  106. package/dist/esm/{conversation-utils-Ck8snHlu.js → conversation-utils-CLO35DHR.js} +4 -4
  107. package/dist/esm/{conversation-utils-Ck8snHlu.js.map → conversation-utils-CLO35DHR.js.map} +1 -1
  108. package/dist/esm/{index-BR_BEmyI.js → index-KVnu9w-h.js} +4 -4
  109. package/dist/esm/{index-BR_BEmyI.js.map → index-KVnu9w-h.js.map} +1 -1
  110. package/dist/esm/index.js +1 -1
  111. package/dist/esm/oem-htws-modal.entry.js +1 -1
  112. package/dist/esm/oem-jd-modal.entry.js +2 -2
  113. package/dist/esm/oem-jlpp-modal.entry.js +1 -1
  114. package/dist/esm/oem-jlzz-modal.entry.js +23 -2
  115. package/dist/esm/oem-jlzz-modal.entry.js.map +1 -1
  116. package/dist/esm/oem-mnct-modal.entry.js +1 -1
  117. package/dist/esm/oem-mnms-modal.entry.js +1 -1
  118. package/dist/esm/oem-qgqjl-modal.entry.js +3 -3
  119. package/dist/esm/pcm-hr-chat-modal.entry.js +2 -2
  120. package/dist/esm/pcm-jlsx-modal.entry.js +174 -6
  121. package/dist/esm/pcm-jlsx-modal.entry.js.map +1 -1
  122. package/dist/esm/{sentry-reporter-BZPRD4nE.js → sentry-reporter-B4aHQq-A.js} +3 -3
  123. package/dist/esm/{sentry-reporter-BZPRD4nE.js.map → sentry-reporter-B4aHQq-A.js.map} +1 -1
  124. package/dist/pcm-agents/index.esm.js +1 -1
  125. package/dist/pcm-agents/oem-jlzz-modal.entry.esm.js.map +1 -1
  126. package/dist/pcm-agents/{p-4427d0b4.entry.js → p-4d7511e0.entry.js} +2 -2
  127. package/dist/pcm-agents/{p-66459556.entry.js → p-7e8bdfa6.entry.js} +2 -2
  128. package/dist/pcm-agents/{p-7000140e.entry.js → p-8144f0d4.entry.js} +2 -2
  129. package/dist/pcm-agents/{p-4f35fe24.entry.js → p-8256890d.entry.js} +2 -2
  130. package/dist/pcm-agents/p-B4ClCdh9.js +2 -0
  131. package/dist/pcm-agents/{p-CDLRm6tb.js.map → p-B4ClCdh9.js.map} +1 -1
  132. package/dist/pcm-agents/{p-C5UfA3VN.js → p-Bktjt_YJ.js} +2 -2
  133. package/dist/pcm-agents/{p-C5UfA3VN.js.map → p-Bktjt_YJ.js.map} +1 -1
  134. package/dist/pcm-agents/{p-CC_AWE7Q.js → p-CMfzTNOk.js} +2 -2
  135. package/dist/pcm-agents/{p-CC_AWE7Q.js.map → p-CMfzTNOk.js.map} +1 -1
  136. package/dist/pcm-agents/p-aa606968.entry.js +2 -0
  137. package/dist/pcm-agents/p-aa606968.entry.js.map +1 -0
  138. package/dist/pcm-agents/p-dd6362f0.entry.js +2 -0
  139. package/dist/pcm-agents/p-dd6362f0.entry.js.map +1 -0
  140. package/dist/pcm-agents/{p-174577d5.entry.js → p-e2b9a9f2.entry.js} +2 -2
  141. package/dist/pcm-agents/{p-6419b0bb.entry.js → p-eb9b355e.entry.js} +2 -2
  142. package/dist/pcm-agents/{p-8b6019b7.entry.js → p-efb4e819.entry.js} +2 -2
  143. package/dist/pcm-agents/{p-4a767489.entry.js → p-f6683f29.entry.js} +3 -3
  144. package/dist/pcm-agents/{p-4a767489.entry.js.map → p-f6683f29.entry.js.map} +1 -1
  145. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  146. package/dist/pcm-agents/pcm-jlsx-modal.entry.esm.js.map +1 -1
  147. package/dist/types/components/oem-jlzz-modal/oem-jlzz-modal.d.ts +11 -0
  148. package/dist/types/components/pcm-jlsx-modal/pcm-jlsx-modal.d.ts +7 -2
  149. package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +11 -0
  150. package/dist/types/components.d.ts +24 -2
  151. package/package.json +1 -1
  152. package/dist/components/p-CR7hzwAG.js.map +0 -1
  153. package/dist/pcm-agents/p-0abb8e18.entry.js +0 -2
  154. package/dist/pcm-agents/p-0abb8e18.entry.js.map +0 -1
  155. package/dist/pcm-agents/p-99bf652c.entry.js +0 -2
  156. package/dist/pcm-agents/p-99bf652c.entry.js.map +0 -1
  157. package/dist/pcm-agents/p-CDLRm6tb.js +0 -2
  158. /package/dist/pcm-agents/{p-4427d0b4.entry.js.map → p-4d7511e0.entry.js.map} +0 -0
  159. /package/dist/pcm-agents/{p-66459556.entry.js.map → p-7e8bdfa6.entry.js.map} +0 -0
  160. /package/dist/pcm-agents/{p-7000140e.entry.js.map → p-8144f0d4.entry.js.map} +0 -0
  161. /package/dist/pcm-agents/{p-4f35fe24.entry.js.map → p-8256890d.entry.js.map} +0 -0
  162. /package/dist/pcm-agents/{p-174577d5.entry.js.map → p-e2b9a9f2.entry.js.map} +0 -0
  163. /package/dist/pcm-agents/{p-6419b0bb.entry.js.map → p-eb9b355e.entry.js.map} +0 -0
  164. /package/dist/pcm-agents/{p-8b6019b7.entry.js.map → p-efb4e819.entry.js.map} +0 -0
@@ -1,10 +1,14 @@
1
1
  .resume-type-container {
2
2
  display: flex;
3
3
  flex-direction: row;
4
- gap: 32px;
4
+ flex-wrap: nowrap;
5
+ justify-content: space-evenly;
6
+ gap: 0;
5
7
  margin-bottom: 16px;
6
8
  border-bottom: 2px solid #f0f0f0;
7
- padding-left: 4px;
9
+ padding-left: 0;
10
+ overflow-x: auto;
11
+ overflow-y: hidden;
8
12
  }
9
13
 
10
14
  .resume-type-item {
@@ -17,6 +21,8 @@
17
21
  border: none;
18
22
  outline: none;
19
23
  font-weight: 400;
24
+ white-space: nowrap;
25
+ flex-shrink: 0;
20
26
  transition: color 0.2s;
21
27
  }
22
28
 
@@ -87,6 +87,14 @@ export class JlzzModal {
87
87
  * 获取简历数据事件(用户点击导出简历json数据后触发)
88
88
  */
89
89
  getResumeData;
90
+ /**
91
+ * 简历下载请求事件。
92
+ * 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,
93
+ * 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。
94
+ * iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,
95
+ * 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。
96
+ */
97
+ resumeDownloadRequested;
90
98
  /**
91
99
  * 附件预览模式
92
100
  * 'drawer': 在右侧抽屉中预览
@@ -243,10 +251,22 @@ export class JlzzModal {
243
251
  const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];
244
252
  if (!allowedOrigins.includes(event.origin))
245
253
  return;
254
+ // 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。
255
+ if (event.source !== this._iframeEl?.contentWindow)
256
+ return;
246
257
  const { type, value } = event.data || {};
247
258
  if (type === 'callParentMethod') {
248
259
  this.exampleMethodFromIframe(value);
249
260
  }
261
+ if (type === 'resumeDownloadRequested') {
262
+ // SDK 仅透传下载信息,不耦合任何宿主小程序路由。
263
+ if (!value?.url || !value?.fileName)
264
+ return;
265
+ this.resumeDownloadRequested.emit({
266
+ url: value.url,
267
+ fileName: value.fileName,
268
+ });
269
+ }
250
270
  // 关键:收到 iframeReady 后再发送 token
251
271
  if (type === 'iframeReady' && this._iframeEl?.contentWindow) {
252
272
  // 动态获取 targetOrigin,兼容本地和线上
@@ -1012,6 +1032,21 @@ export class JlzzModal {
1012
1032
  "resolved": "any",
1013
1033
  "references": {}
1014
1034
  }
1035
+ }, {
1036
+ "method": "resumeDownloadRequested",
1037
+ "name": "resumeDownloadRequested",
1038
+ "bubbles": true,
1039
+ "cancelable": true,
1040
+ "composed": true,
1041
+ "docs": {
1042
+ "tags": [],
1043
+ "text": "\u7B80\u5386\u4E0B\u8F7D\u8BF7\u6C42\u4E8B\u4EF6\u3002\r\n\u89E6\u53D1\u65F6\u673A\uFF1A\u7B80\u5386\u5236\u4F5C\u9875\u9762 \u8FD0\u884C\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F web-view \u7684 SDK iframe \u4E2D\uFF0C\r\n\u7528\u6237\u5728\u79FB\u52A8\u7AEF\u4E0B\u8F7D\u5F39\u7A97\u70B9\u51FB\u201C\u76F4\u63A5\u4E0B\u8F7D\u201D\u65F6\u89E6\u53D1\uFF1B\u666E\u901A\u7F51\u9875\u73AF\u5883\u4ECD\u7531 \u7B80\u5386\u5236\u4F5C\u9875\u9762 \u81EA\u884C\u4E0B\u8F7D\uFF0C\u4E0D\u89E6\u53D1\u6B64\u4E8B\u4EF6\u3002\r\niframe \u53EA\u63D0\u4F9B\u4E0B\u8F7D\u5730\u5740\u548C\u6587\u4EF6\u540D\uFF0C\u5177\u4F53\u8DF3\u8F6C\u5230\u54EA\u4E2A\u5C0F\u7A0B\u5E8F\u9875\u9762\u53CA\u5982\u4F55\u5904\u7406\u4E0B\u8F7D\uFF0C\r\n\u7531 SDK \u63A5\u5165\u65B9\u901A\u8FC7 onResumeDownloadRequested \u56DE\u8C03\u81EA\u884C\u51B3\u5B9A\u3002"
1044
+ },
1045
+ "complexType": {
1046
+ "original": "{\r\n url: string;\r\n fileName: string;\r\n }",
1047
+ "resolved": "{ url: string; fileName: string; }",
1048
+ "references": {}
1049
+ }
1015
1050
  }];
1016
1051
  }
1017
1052
  static get elementRef() { return "hostElement"; }
@@ -1 +1 @@
1
- {"version":3,"file":"pcm-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-jlzz-modal/pcm-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN, sendHttpRequest } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\nimport { Message } from '../../services/message.service';\r\nimport { ConversationItem } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-jlzz-modal',\r\n styleUrls: ['pcm-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class JlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 是否隐藏导出数据按钮\r\n */\r\n @Prop() hideExportButton: boolean = false;\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n /**\r\n * 是否开启移动端上传简历\r\n */\r\n @Prop() mobileUploadAble: boolean = false;\r\n\r\n /**\r\n * 初始简历文本\r\n * 当提供此参数时,组件将直接进入粘贴简历模式并自动开始制作,请在setTimeout中设置\r\n */\r\n @Prop() initialResumeText?: string;\r\n\r\n /**\r\n * 简历制作模式\r\n * 'chat': 直接默认开始对话\r\n * 'file': 让他上传文件\r\n */\r\n @Prop() type?: 'chat' | 'file' | 'upload' | 'paste';\r\n\r\n /**\r\n * 默认开场白\r\n */\r\n @Prop() introduction_prompt?: string;\r\n\r\n /**\r\n * 是否显示历史对话 Tab\r\n */\r\n @Prop() showHistory: boolean = true;\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'paste' | 'chat' | 'history' = 'chat';\r\n @State() resumeText: string = '';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n // 添加历史会话相关状态\r\n @State() isHistoryDrawerOpen: boolean = false;\r\n @State() historyConversations: ConversationItem[] = [];\r\n @State() isLoadingConversations: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n this.resumeText = '';\r\n } else {\r\n await verifyApiKey(this.token);\r\n\r\n // 处理 type 参数\r\n if (this.type === 'chat') {\r\n this.resumeType = 'chat';\r\n setTimeout(() => {\r\n this.handleStartInterview();\r\n }, 100);\r\n } else if (this.type === 'file' || this.type === 'upload') {\r\n this.resumeType = 'upload';\r\n } else if (this.type === 'paste') {\r\n this.resumeType = 'paste';\r\n }\r\n\r\n // 如果提供了初始简历文本,自动进入粘贴模式并开始制作\r\n if (this.initialResumeText && this.initialResumeText.trim()) {\r\n this.resumeType = 'paste';\r\n this.resumeText = this.initialResumeText;\r\n // 使用 setTimeout 确保状态更新后再开始制作\r\n setTimeout(() => {\r\n this.handleStartInterview();\r\n }, 100);\r\n }\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n verifyApiKey(this.token);\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: this.hideExportButton,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'paste' | 'chat' | 'history') => {\r\n this.resumeType = type;\r\n };\r\n\r\n\r\n private handleResumeTextChange = (event: Event) => {\r\n const textarea = event.target as HTMLTextAreaElement;\r\n this.resumeText = textarea.value;\r\n };\r\n\r\n\r\n // 获取历史会话列表\r\n private async loadHistoryConversations() {\r\n this.isLoadingConversations = true;\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/conversations',\r\n method: 'GET',\r\n data: {\r\n bot_id: '39284520284983296',\r\n limit: 50, // 获取最近50个会话\r\n page: 1,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const conversations = result.data.data || [];\r\n\r\n // 格式化会话数据\r\n this.historyConversations = conversations.map((conv: any) => {\r\n // 处理时间戳,确保它是有效的数字\r\n let createdTime: Date;\r\n let timeDisplay = '未知时间';\r\n\r\n try {\r\n // 确保 created_at 是一个有效的时间戳\r\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\r\n\r\n if (isNaN(timestamp) || timestamp <= 0) {\r\n console.warn('无效的时间戳:', conv.created_at);\r\n createdTime = new Date();\r\n } else {\r\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\r\n createdTime = new Date(timestamp * 1000);\r\n }\r\n\r\n // 验证日期是否有效\r\n if (isNaN(createdTime.getTime())) {\r\n console.warn('无效的日期对象:', conv.created_at);\r\n createdTime = new Date();\r\n }\r\n\r\n const now = new Date();\r\n const diffTime = now.getTime() - createdTime.getTime();\r\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n // 格式化时间显示\r\n if (diffDays === 0) {\r\n // 今天\r\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays === 1) {\r\n // 昨天\r\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays > 0 && diffDays < 7) {\r\n // 一周内\r\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\r\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays < 0) {\r\n // 未来时间(可能是时区问题或系统时间不准确)\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else {\r\n // 超过一周\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n }\r\n } catch (error) {\r\n console.error('时间格式化错误:', error, conv.created_at);\r\n timeDisplay = '时间解析失败';\r\n }\r\n\r\n return {\r\n id: conv.id,\r\n name: conv.name || '新会话',\r\n created_at: conv.created_at,\r\n updated_at: conv.updated_at,\r\n status: conv.status,\r\n message_count: conv.message_count || 0,\r\n timeDisplay,\r\n } as ConversationItem;\r\n });\r\n }\r\n } catch (error) {\r\n console.error('获取历史会话失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryConversations',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取历史会话失败',\r\n });\r\n this.someErrorEvent.emit({\r\n error: error,\r\n message: '获取历史会话失败',\r\n });\r\n } finally {\r\n this.isLoadingConversations = false;\r\n }\r\n }\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n if (this.resumeType === 'paste' && !this.resumeText.trim()) {\r\n Message.info('请粘贴简历文本');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'paste',\r\n }}\r\n onClick={() => this.changeType('paste')}\r\n >\r\n 粘贴简历\r\n </div>\r\n {this.showHistory && (\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'history',\r\n }}\r\n onClick={() => {\r\n this.changeType('history');\r\n this.loadHistoryConversations();\r\n }}\r\n >\r\n 历史对话\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-upload\r\n ref={el => this.pcmUploadRef = el}\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n mobileUploadAble={this.mobileUploadAble}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onUploadChange={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'paste' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">请粘贴简历文本</label>\r\n <textarea\r\n id=\"job-description\"\r\n class=\"job-description-textarea\"\r\n placeholder=\"请粘贴简历文本...\"\r\n rows={6}\r\n value={this.resumeText}\r\n onInput={this.handleResumeTextChange}\r\n ></textarea>\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {}\r\n {this.resumeType === 'history' ? (\r\n <div class=\"converstation-list\">\r\n {this.historyConversations.map(conversation => (\r\n <div\r\n key={conversation.id}\r\n class={{\r\n 'conversation-item': true,\r\n 'active': conversation.id === this.conversationId,\r\n }}\r\n onClick={() => {\r\n this.conversationId = conversation.id;\r\n this.isSuccess = true;\r\n this.showChatModal = true;\r\n this.showIframe = true;\r\n }}\r\n >\r\n <div class=\"conversation-info\">\r\n <div class=\"conversation-title\">{conversation.name}</div>\r\n <div class=\"conversation-meta\">\r\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\r\n {conversation.message_count > 0 && <span class=\"message-count\">{conversation.message_count}条消息</span>}\r\n {conversation.status && (\r\n <span\r\n class={{\r\n 'conversation-status': true,\r\n 'completed': conversation.status === '结束',\r\n 'running': conversation.status === '进行中',\r\n }}\r\n >\r\n {conversation.status}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {conversation.id === this.conversationId && (\r\n <div class=\"current-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n (this.resumeType === 'paste' && !this.resumeText.trim()) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : ['upload', 'paste'].includes(this.resumeType) ? '开始制作' : '开始对话'}\r\n </button>\r\n )}\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.resumeType === 'paste' ? this.resumeText : this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n introduction_prompt: this.introduction_prompt,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"pcm-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-jlzz-modal/pcm-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN, sendHttpRequest } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\nimport { Message } from '../../services/message.service';\r\nimport { ConversationItem } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-jlzz-modal',\r\n styleUrls: ['pcm-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class JlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 是否隐藏导出数据按钮\r\n */\r\n @Prop() hideExportButton: boolean = false;\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 简历下载请求事件。\r\n * 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,\r\n * 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。\r\n * iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,\r\n * 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。\r\n */\r\n @Event() resumeDownloadRequested: EventEmitter<{\r\n url: string;\r\n fileName: string;\r\n }>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n /**\r\n * 是否开启移动端上传简历\r\n */\r\n @Prop() mobileUploadAble: boolean = false;\r\n\r\n /**\r\n * 初始简历文本\r\n * 当提供此参数时,组件将直接进入粘贴简历模式并自动开始制作,请在setTimeout中设置\r\n */\r\n @Prop() initialResumeText?: string;\r\n\r\n /**\r\n * 简历制作模式\r\n * 'chat': 直接默认开始对话\r\n * 'file': 让他上传文件\r\n */\r\n @Prop() type?: 'chat' | 'file' | 'upload' | 'paste';\r\n\r\n /**\r\n * 默认开场白\r\n */\r\n @Prop() introduction_prompt?: string;\r\n\r\n /**\r\n * 是否显示历史对话 Tab\r\n */\r\n @Prop() showHistory: boolean = true;\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'paste' | 'chat' | 'history' = 'chat';\r\n @State() resumeText: string = '';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n // 添加历史会话相关状态\r\n @State() isHistoryDrawerOpen: boolean = false;\r\n @State() historyConversations: ConversationItem[] = [];\r\n @State() isLoadingConversations: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n this.resumeText = '';\r\n } else {\r\n await verifyApiKey(this.token);\r\n\r\n // 处理 type 参数\r\n if (this.type === 'chat') {\r\n this.resumeType = 'chat';\r\n setTimeout(() => {\r\n this.handleStartInterview();\r\n }, 100);\r\n } else if (this.type === 'file' || this.type === 'upload') {\r\n this.resumeType = 'upload';\r\n } else if (this.type === 'paste') {\r\n this.resumeType = 'paste';\r\n }\r\n\r\n // 如果提供了初始简历文本,自动进入粘贴模式并开始制作\r\n if (this.initialResumeText && this.initialResumeText.trim()) {\r\n this.resumeType = 'paste';\r\n this.resumeText = this.initialResumeText;\r\n // 使用 setTimeout 确保状态更新后再开始制作\r\n setTimeout(() => {\r\n this.handleStartInterview();\r\n }, 100);\r\n }\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n verifyApiKey(this.token);\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n // 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。\r\n if (event.source !== this._iframeEl?.contentWindow) return;\r\n\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n if (type === 'resumeDownloadRequested') {\r\n // SDK 仅透传下载信息,不耦合任何宿主小程序路由。\r\n if (!value?.url || !value?.fileName) return;\r\n this.resumeDownloadRequested.emit({\r\n url: value.url,\r\n fileName: value.fileName,\r\n });\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: this.hideExportButton,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'paste' | 'chat' | 'history') => {\r\n this.resumeType = type;\r\n };\r\n\r\n\r\n private handleResumeTextChange = (event: Event) => {\r\n const textarea = event.target as HTMLTextAreaElement;\r\n this.resumeText = textarea.value;\r\n };\r\n\r\n\r\n // 获取历史会话列表\r\n private async loadHistoryConversations() {\r\n this.isLoadingConversations = true;\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/conversations',\r\n method: 'GET',\r\n data: {\r\n bot_id: '39284520284983296',\r\n limit: 50, // 获取最近50个会话\r\n page: 1,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const conversations = result.data.data || [];\r\n\r\n // 格式化会话数据\r\n this.historyConversations = conversations.map((conv: any) => {\r\n // 处理时间戳,确保它是有效的数字\r\n let createdTime: Date;\r\n let timeDisplay = '未知时间';\r\n\r\n try {\r\n // 确保 created_at 是一个有效的时间戳\r\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\r\n\r\n if (isNaN(timestamp) || timestamp <= 0) {\r\n console.warn('无效的时间戳:', conv.created_at);\r\n createdTime = new Date();\r\n } else {\r\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\r\n createdTime = new Date(timestamp * 1000);\r\n }\r\n\r\n // 验证日期是否有效\r\n if (isNaN(createdTime.getTime())) {\r\n console.warn('无效的日期对象:', conv.created_at);\r\n createdTime = new Date();\r\n }\r\n\r\n const now = new Date();\r\n const diffTime = now.getTime() - createdTime.getTime();\r\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n // 格式化时间显示\r\n if (diffDays === 0) {\r\n // 今天\r\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays === 1) {\r\n // 昨天\r\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays > 0 && diffDays < 7) {\r\n // 一周内\r\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\r\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays < 0) {\r\n // 未来时间(可能是时区问题或系统时间不准确)\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else {\r\n // 超过一周\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n }\r\n } catch (error) {\r\n console.error('时间格式化错误:', error, conv.created_at);\r\n timeDisplay = '时间解析失败';\r\n }\r\n\r\n return {\r\n id: conv.id,\r\n name: conv.name || '新会话',\r\n created_at: conv.created_at,\r\n updated_at: conv.updated_at,\r\n status: conv.status,\r\n message_count: conv.message_count || 0,\r\n timeDisplay,\r\n } as ConversationItem;\r\n });\r\n }\r\n } catch (error) {\r\n console.error('获取历史会话失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryConversations',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取历史会话失败',\r\n });\r\n this.someErrorEvent.emit({\r\n error: error,\r\n message: '获取历史会话失败',\r\n });\r\n } finally {\r\n this.isLoadingConversations = false;\r\n }\r\n }\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n if (this.resumeType === 'paste' && !this.resumeText.trim()) {\r\n Message.info('请粘贴简历文本');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'paste',\r\n }}\r\n onClick={() => this.changeType('paste')}\r\n >\r\n 粘贴简历\r\n </div>\r\n {this.showHistory && (\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'history',\r\n }}\r\n onClick={() => {\r\n this.changeType('history');\r\n this.loadHistoryConversations();\r\n }}\r\n >\r\n 历史对话\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-upload\r\n ref={el => this.pcmUploadRef = el}\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n mobileUploadAble={this.mobileUploadAble}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onUploadChange={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'paste' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">请粘贴简历文本</label>\r\n <textarea\r\n id=\"job-description\"\r\n class=\"job-description-textarea\"\r\n placeholder=\"请粘贴简历文本...\"\r\n rows={6}\r\n value={this.resumeText}\r\n onInput={this.handleResumeTextChange}\r\n ></textarea>\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {}\r\n {this.resumeType === 'history' ? (\r\n <div class=\"converstation-list\">\r\n {this.historyConversations.map(conversation => (\r\n <div\r\n key={conversation.id}\r\n class={{\r\n 'conversation-item': true,\r\n 'active': conversation.id === this.conversationId,\r\n }}\r\n onClick={() => {\r\n this.conversationId = conversation.id;\r\n this.isSuccess = true;\r\n this.showChatModal = true;\r\n this.showIframe = true;\r\n }}\r\n >\r\n <div class=\"conversation-info\">\r\n <div class=\"conversation-title\">{conversation.name}</div>\r\n <div class=\"conversation-meta\">\r\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\r\n {conversation.message_count > 0 && <span class=\"message-count\">{conversation.message_count}条消息</span>}\r\n {conversation.status && (\r\n <span\r\n class={{\r\n 'conversation-status': true,\r\n 'completed': conversation.status === '结束',\r\n 'running': conversation.status === '进行中',\r\n }}\r\n >\r\n {conversation.status}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {conversation.id === this.conversationId && (\r\n <div class=\"current-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n (this.resumeType === 'paste' && !this.resumeText.trim()) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : ['upload', 'paste'].includes(this.resumeType) ? '开始制作' : '开始对话'}\r\n </button>\r\n )}\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.resumeType === 'paste' ? this.resumeText : this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n introduction_prompt: this.introduction_prompt,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -580,7 +580,7 @@
580
580
  /* 修改工具栏样式 */
581
581
  .input-toolbar {
582
582
  display: flex;
583
- justify-content: end;
583
+ justify-content: flex-end;
584
584
  align-items: center;
585
585
  padding: 8px 12px;
586
586
  background-color: #fff;
@@ -724,7 +724,7 @@
724
724
  /* 修改工具栏样式 */
725
725
  .input-toolbar {
726
726
  display: flex;
727
- justify-content: end;
727
+ justify-content: flex-end;
728
728
  align-items: center;
729
729
  padding: 8px 12px;
730
730
  background-color: #fff;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsChatMessage$1, d as defineCustomElement$1 } from './p-DNPkGKCS.js';
1
+ import { C as ComponentsChatMessage$1, d as defineCustomElement$1 } from './p-CEu-bFot.js';
2
2
 
3
3
  const ComponentsChatMessage = ComponentsChatMessage$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsDigitalHuman$1, d as defineCustomElement$1 } from './p-Cy_hQiQs.js';
1
+ import { C as ComponentsDigitalHuman$1, d as defineCustomElement$1 } from './p-CzFKth7J.js';
2
2
 
3
3
  const ComponentsDigitalHuman = ComponentsDigitalHuman$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsExportRecordsModal$1, d as defineCustomElement$1 } from './p-Cp6_0jsj.js';
1
+ import { C as ComponentsExportRecordsModal$1, d as defineCustomElement$1 } from './p-CB7myOe_.js';
2
2
 
3
3
  const ComponentsExportRecordsModal = ComponentsExportRecordsModal$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsMobileInputBtn$1, d as defineCustomElement$1 } from './p-Bn48g_o5.js';
1
+ import { C as ComponentsMobileInputBtn$1, d as defineCustomElement$1 } from './p-C7ubjB1x.js';
2
2
 
3
3
  const ComponentsMobileInputBtn = ComponentsMobileInputBtn$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsMobileUploadBtn$1, d as defineCustomElement$1 } from './p-DrIjQbpV.js';
1
+ import { C as ComponentsMobileUploadBtn$1, d as defineCustomElement$1 } from './p-DJDJfWq9.js';
2
2
 
3
3
  const ComponentsMobileUploadBtn = ComponentsMobileUploadBtn$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsPositionSelector$1, d as defineCustomElement$1 } from './p-CCTgkbh7.js';
1
+ import { C as ComponentsPositionSelector$1, d as defineCustomElement$1 } from './p-D4RnNrxx.js';
2
2
 
3
3
  const ComponentsPositionSelector = ComponentsPositionSelector$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsThousandResumeWrapper$1, d as defineCustomElement$1 } from './p-DkJ7RM7j.js';
1
+ import { C as ComponentsThousandResumeWrapper$1, d as defineCustomElement$1 } from './p-Bg0KKnpU.js';
2
2
 
3
3
  const ComponentsThousandResumeWrapper = ComponentsThousandResumeWrapper$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsUpload$1, d as defineCustomElement$1 } from './p-BH3zMcBy.js';
1
+ import { C as ComponentsUpload$1, d as defineCustomElement$1 } from './p-CPq5-i_-.js';
2
2
 
3
3
  const ComponentsUpload = ComponentsUpload$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,4 +1,4 @@
1
- import { C as ComponentsVoiceInputBtn$1, d as defineCustomElement$1 } from './p-CUpl5cwz.js';
1
+ import { C as ComponentsVoiceInputBtn$1, d as defineCustomElement$1 } from './p-C-lvK9NX.js';
2
2
 
3
3
  const ComponentsVoiceInputBtn = ComponentsVoiceInputBtn$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,6 +1,6 @@
1
1
  import { D as DEBUG_BUILD$2, l as logger, g as getFunctionName, G as GLOBAL_OBJ, d as dsnToString, a as getSentryCarrier, n as normalize, S as SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, b as SEMANTIC_ATTRIBUTE_PROFILE_ID, c as dateTimestampInSeconds, m as makeDsn, u as uuid4, e as checkOrSetAlreadyCaught, i as isPrimitive, f as updateSession, r as resolvedSyncPromise, h as DEFAULT_ENVIRONMENT, j as SyncPromise, p as prepareEvent, k as getTraceContextFromScope, o as getDynamicSamplingContextFromScope, q as getCurrentScope, s as getIsolationScope, t as rejectedSyncPromise, v as isParameterizedString, w as showSpanDropWarning, x as merge, y as isThenable, z as isPlainObject, A as consoleSandbox, B as SDK_VERSION, C as getClient, E as getOriginalFunction, F as getEventDescription, H as stringMatchesSomePattern, I as isInstanceOf, J as CONSOLE_LEVELS, K as fill, L as originalConsoleMethods, M as getFramesFromEvent, N as timestampInSeconds, O as isError, P as addNonEnumerableProperty, Q as isRequest, R as getLocationHref, T as markFunctionWrapped, U as withScope, V as addExceptionTypeValue, W as addExceptionMechanism, X as captureException, Y as isErrorEvent$1, Z as isDOMError, _ as isDOMException, $ as isEvent, a0 as normalizeToSize, a1 as extractExceptionKeysForMessage, a2 as isString, a3 as createStackParser, a4 as UNKNOWN_FUNCTION, a5 as htmlTreeAsString, a6 as safeJoin, a7 as getComponentName, a8 as startSession, a9 as captureSession, aa as captureEvent, ab as stackParserFromStackParserOptions } from './p-75J0r72D.js';
2
2
  export { g as getAssetPath, r as render, s as setAssetPath, a as setNonce, b as setPlatformOptions } from './p-CR7WLzmM.js';
3
- export { f as format } from './p-DuRuN7gY.js';
3
+ export { f as format } from './p-i4wY2JnB.js';
4
4
 
5
5
  /**
6
6
  * Parse a sample rate from a given value.
@@ -1,14 +1,14 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-CR7WLzmM.js';
2
- import { a as authStore, v as verifyApiKey, b as verifySmsCode } from './p-DuRuN7gY.js';
2
+ import { a as authStore, v as verifyApiKey, b as verifySmsCode } from './p-i4wY2JnB.js';
3
3
  import { E as ErrorEventBus } from './p-C0FYX2-Z.js';
4
4
  import { c as configStore } from './p-DUQ46MUh.js';
5
5
  import { M as Message } from './p-D39f_W8k.js';
6
- import { d as defineCustomElement$7 } from './p-DNPkGKCS.js';
6
+ import { d as defineCustomElement$7 } from './p-CEu-bFot.js';
7
7
  import { d as defineCustomElement$6 } from './p-C_2iEeJ3.js';
8
- import { d as defineCustomElement$5 } from './p-Cy_hQiQs.js';
8
+ import { d as defineCustomElement$5 } from './p-CzFKth7J.js';
9
9
  import { d as defineCustomElement$4 } from './p-CwAO1-FC.js';
10
- import { d as defineCustomElement$3 } from './p-DrIjQbpV.js';
11
- import { d as defineCustomElement$2 } from './p-CR7hzwAG.js';
10
+ import { d as defineCustomElement$3 } from './p-DJDJfWq9.js';
11
+ import { d as defineCustomElement$2 } from './p-BhdGTSLg.js';
12
12
 
13
13
  const oemHtwsModalCss = ".input-mode-toggle{display:flex;align-items:center;margin-bottom:16px}.input-mode-toggle span{color:#333;margin-right:12px}.toggle-button{display:flex;align-items:center;background:none;border:none;color:#2E6EDF;cursor:pointer;font-size:14px;padding:4px 8px}.toggle-button svg{margin-right:4px}.free-input{width:100%}.textarea-container{margin-bottom:16px}.textarea-container label{display:block;margin-bottom:8px;font-weight:500;color:#333}.textarea-container textarea{border:1px solid #ddd;border-radius:4px;font-size:14px;resize:vertical;background-color:#f9f9f9;min-height:150px;width:100%;padding:12px 16px;margin-bottom:20px;max-width:100%;box-sizing:border-box;word-wrap:break-word}.textarea-container textarea:focus{outline:none;border-color:#2E6EDF;box-shadow:0 0 0 2px rgba(46, 110, 223, 0.2)}.required{color:#f56c6c}.input-guide{background-color:#f5f7fa;border-radius:4px;padding:12px 16px;margin-bottom:20px;max-width:100%;box-sizing:border-box;word-wrap:break-word}.guide-title{font-weight:500;color:#333;margin-bottom:8px}.guide-content{color:#666;font-size:13px;max-width:100%;word-wrap:break-word}.guide-content div{margin-bottom:4px}.phone-input{width:calc(100% - 16px);padding:8px;border:1px solid #ddd;border-radius:4px;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s}.phone-input:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.verification-code-container{display:flex;gap:8px;align-items:center}.verification-code-input{flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s}.verification-code-input:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.send-code-button{padding:8px 16px;background:#0D75FB;color:white;border:none;border-radius:4px;font-size:14px;cursor:pointer;transition:all 0.3s ease;white-space:nowrap;min-width:100px}.send-code-button:hover:not(:disabled){background-color:#40a9ff}.send-code-button:disabled{background-color:rgba(0, 0, 0, 0.04);color:rgba(0, 0, 0, 0.25);cursor:not-allowed}";
14
14
 
@@ -1,14 +1,14 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-CR7WLzmM.js';
2
- import { a as authStore, v as verifyApiKey, s as sendHttpRequest } from './p-DuRuN7gY.js';
2
+ import { a as authStore, v as verifyApiKey, s as sendHttpRequest } from './p-i4wY2JnB.js';
3
3
  import { E as ErrorEventBus } from './p-C0FYX2-Z.js';
4
4
  import { c as configStore } from './p-DUQ46MUh.js';
5
5
  import { S as SentryReporter } from './p-DC-AWTHS.js';
6
- import { d as defineCustomElement$7 } from './p-DNPkGKCS.js';
6
+ import { d as defineCustomElement$7 } from './p-CEu-bFot.js';
7
7
  import { d as defineCustomElement$6 } from './p-C_2iEeJ3.js';
8
- import { d as defineCustomElement$5 } from './p-Cy_hQiQs.js';
8
+ import { d as defineCustomElement$5 } from './p-CzFKth7J.js';
9
9
  import { d as defineCustomElement$4 } from './p-CwAO1-FC.js';
10
- import { d as defineCustomElement$3 } from './p-CUpl5cwz.js';
11
- import { d as defineCustomElement$2 } from './p-CR7hzwAG.js';
10
+ import { d as defineCustomElement$3 } from './p-C-lvK9NX.js';
11
+ import { d as defineCustomElement$2 } from './p-BhdGTSLg.js';
12
12
 
13
13
  const oemJdModalCss = ".input-mode-toggle{display:flex;align-items:center;margin-bottom:16px}.input-mode-toggle span{color:#333;margin-right:12px}.toggle-button{display:flex;align-items:center;background:none;border:none;color:#2E6EDF;cursor:pointer;font-size:14px;padding:4px 8px}.toggle-button svg{margin-right:4px}.toggle-button:disabled{opacity:0.5;cursor:not-allowed}.structured-input{width:100%}.job-name-input{margin-bottom:20px}.job-name-input label{display:block;margin-bottom:8px;font-weight:500;color:#333}.job-name-input input{width:95%;padding:10px 12px;border:1px solid #ddd;border-radius:4px;font-size:14px;background-color:#f9f9f9}.job-name-input input:focus{outline:none;border-color:#2E6EDF;box-shadow:0 0 0 2px rgba(46, 110, 223, 0.2)}.required{color:#f56c6c}.button-container{display:flex;justify-content:center;margin-top:24px;gap:12px;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.next-button{background-color:#2E6EDF;color:white}.next-button:hover{background-color:#2457b8}.next-button:disabled{background-color:#a0c0e8;cursor:not-allowed}.prev-button{background-color:#f0f0f0 !important;color:#333 !important}.prev-button:hover{background-color:#e0e0e0}.tag-selection{width:100%}.tag-selection-content{width:100%}.section-title{font-weight:600;color:#333;margin-bottom:12px;font-size:16px}.ai-tags-section,.basic-tags-section{margin-bottom:24px}.tag-group{margin-bottom:16px}.tag-title{color:#555;margin-bottom:8px;font-weight:500}.tag-container{display:flex;flex-wrap:wrap;gap:8px;max-width:100%;box-sizing:border-box}.tag{display:inline-flex;align-items:center;padding:6px 12px;border-radius:4px;background-color:#f5f5f5;border:1px solid #e0e0e0;color:#333;font-size:13px;cursor:pointer;transition:all 0.2s;max-width:100%;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tag:hover{background-color:#e8e8e8}.tag-selected{background-color:#e6f0ff;border-color:#2E6EDF;color:#2E6EDF}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0;background-color:#f9f9f9;border-radius:8px;margin:20px 0;max-width:100%;box-sizing:border-box}.loading-spinner{width:40px;height:40px;border:3px solid rgba(46, 110, 223, 0.2);border-radius:50%;border-top-color:#2E6EDF;animation:spin 1s linear infinite;margin-bottom:16px}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{text-align:center;color:#333;font-weight:500}.loading-subtext{color:#888;font-size:14px;margin-top:4px}.free-input{width:100%}.textarea-container{margin-bottom:16px}.textarea-container label{display:block;margin-bottom:8px;font-weight:500;color:#333}.textarea-container textarea{border:1px solid #ddd;border-radius:4px;font-size:14px;resize:vertical;background-color:#f9f9f9;min-height:150px;width:100%;padding:12px 16px;margin-bottom:20px;max-width:100%;box-sizing:border-box;word-wrap:break-word}.textarea-container textarea:focus{outline:none;border-color:#2E6EDF;box-shadow:0 0 0 2px rgba(46, 110, 223, 0.2)}.voice-textarea-wrapper{position:relative}.voice-textarea-wrapper textarea{padding-bottom:52px}.voice-input-entry{position:absolute;right:12px;bottom:32px;z-index:1}.input-guide{background-color:#f5f7fa;border-radius:4px;padding:12px 16px;margin-bottom:20px;max-width:100%;box-sizing:border-box;word-wrap:break-word}.guide-title{font-weight:500;color:#333;margin-bottom:8px}.guide-content{color:#666;font-size:13px;max-width:100%;word-wrap:break-word}.guide-content div{margin-bottom:4px}@media (max-width: 768px){.tag-container{gap:7px}.tag{padding:4px 8px;font-size:12px}}@media (max-width: 480px){.button-container{flex-direction:column;align-items:center}.next-button,.prev-button,.submit-button{width:100%;margin-bottom:8px}.tag{max-width:calc(50% - 8px)}}.tag-selection,.tag-selection-content,.ai-tags-section,.basic-tags-section,.structured-input,.free-input{max-width:100%;box-sizing:border-box}";
14
14
 
@@ -1,16 +1,16 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-CR7WLzmM.js';
2
- import { a as authStore, v as verifyApiKey, b as verifySmsCode } from './p-DuRuN7gY.js';
2
+ import { a as authStore, v as verifyApiKey, b as verifySmsCode } from './p-i4wY2JnB.js';
3
3
  import { E as ErrorEventBus } from './p-C0FYX2-Z.js';
4
4
  import { c as configStore } from './p-DUQ46MUh.js';
5
5
  import { M as Message } from './p-D39f_W8k.js';
6
- import { d as defineCustomElement$9 } from './p-DNPkGKCS.js';
6
+ import { d as defineCustomElement$9 } from './p-CEu-bFot.js';
7
7
  import { d as defineCustomElement$8 } from './p-C_2iEeJ3.js';
8
- import { d as defineCustomElement$7 } from './p-Cy_hQiQs.js';
8
+ import { d as defineCustomElement$7 } from './p-CzFKth7J.js';
9
9
  import { d as defineCustomElement$6 } from './p-CwAO1-FC.js';
10
- import { d as defineCustomElement$5 } from './p-Bn48g_o5.js';
11
- import { d as defineCustomElement$4 } from './p-DrIjQbpV.js';
12
- import { d as defineCustomElement$3 } from './p-CCTgkbh7.js';
13
- import { d as defineCustomElement$2 } from './p-CR7hzwAG.js';
10
+ import { d as defineCustomElement$5 } from './p-C7ubjB1x.js';
11
+ import { d as defineCustomElement$4 } from './p-DJDJfWq9.js';
12
+ import { d as defineCustomElement$3 } from './p-D4RnNrxx.js';
13
+ import { d as defineCustomElement$2 } from './p-BhdGTSLg.js';
14
14
 
15
15
  const oemJlppModalCss = ".label-with-button{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.button-group{display:flex;gap:8px;align-items:center}.position-selector-button{padding:4px 12px;background:#1890ff;color:white;border:none;border-radius:4px;font-size:13px;cursor:pointer;transition:all 0.3s ease;white-space:nowrap;height:28px;line-height:20px}.position-selector-button:hover{background:#40a9ff}.position-selector-button:active{background:#096dd9}.phone-input{width:calc(100% - 16px);padding:8px;border:1px solid #ddd;border-radius:4px;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s}.phone-input:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.verification-code-container{display:flex;gap:8px;align-items:center}.verification-code-input{flex:1;padding:8px;border:1px solid #ddd;border-radius:4px;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s}.verification-code-input:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.send-code-button{padding:8px 16px;background:#0D75FB;color:white;border:none;border-radius:4px;font-size:14px;cursor:pointer;transition:all 0.3s ease;white-space:nowrap;min-width:100px}.send-code-button:hover:not(:disabled){background-color:#40a9ff}.send-code-button:disabled{background-color:rgba(0, 0, 0, 0.04);color:rgba(0, 0, 0, 0.25);cursor:not-allowed}.position-selector-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.5);display:flex;align-items:center;justify-content:center;z-index:3000;padding:20px}.position-selector-modal{background:white;border-radius:8px;width:90%;max-width:900px;height:80vh;max-height:600px;display:flex;flex-direction:column;box-shadow:0 4px 12px rgba(0, 0, 0, 0.15);animation:modalFadeIn 0.3s ease}@keyframes modalFadeIn{from{opacity:0;transform:scale(0.95) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.position-selector-modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 24px;border-bottom:1px solid #f0f0f0;flex-shrink:0}.position-selector-modal-header h3{margin:0;font-size:16px;font-weight:500;color:rgba(0, 0, 0, 0.85)}.position-selector-close-btn{background:none;border:none;font-size:24px;line-height:1;cursor:pointer;color:rgba(0, 0, 0, 0.45);padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all 0.3s}.position-selector-close-btn:hover{background-color:rgba(0, 0, 0, 0.06);color:rgba(0, 0, 0, 0.85)}.position-selector-modal-body{flex:1;overflow:hidden;display:flex;flex-direction:column}@media screen and (max-width: 768px){.position-selector-modal{width:100%;height:90vh;max-height:none;border-radius:8px 8px 0 0;margin-top:auto}.position-selector-modal-overlay{padding:0;align-items:flex-end}}";
16
16
 
@@ -1,5 +1,5 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-CR7WLzmM.js';
2
- import { a as authStore, v as verifyApiKey, s as sendHttpRequest, P as PCM_DOMAIN, g as getCosPreviewUrl, u as uploadFileByUrl, c as sendSSERequest } from './p-DuRuN7gY.js';
2
+ import { a as authStore, v as verifyApiKey, s as sendHttpRequest, P as PCM_DOMAIN, g as getCosPreviewUrl, u as uploadFileByUrl, c as sendSSERequest } from './p-i4wY2JnB.js';
3
3
  import { s as showMessage } from './p-DnoxSHNP.js';
4
4
  import { M as Message } from './p-D39f_W8k.js';
5
5
  import { E as ErrorEventBus } from './p-C0FYX2-Z.js';
@@ -7,11 +7,11 @@ import { c as configStore } from './p-DUQ46MUh.js';
7
7
  import { S as SentryReporter } from './p-DC-AWTHS.js';
8
8
  import { m as marked, e as extendedTables } from './p-CiuTLfbq.js';
9
9
  import { d as defineCustomElement$7 } from './p-CwAO1-FC.js';
10
- import { d as defineCustomElement$6 } from './p-Cp6_0jsj.js';
10
+ import { d as defineCustomElement$6 } from './p-CB7myOe_.js';
11
11
  import { d as defineCustomElement$5 } from './p-DX4-Pg0f.js';
12
- import { d as defineCustomElement$4 } from './p-Bn48g_o5.js';
13
- import { d as defineCustomElement$3 } from './p-DrIjQbpV.js';
14
- import { d as defineCustomElement$2 } from './p-CCTgkbh7.js';
12
+ import { d as defineCustomElement$4 } from './p-C7ubjB1x.js';
13
+ import { d as defineCustomElement$3 } from './p-DJDJfWq9.js';
14
+ import { d as defineCustomElement$2 } from './p-D4RnNrxx.js';
15
15
 
16
16
  const globalCss = ".modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.5);display:flex;z-index:1000;overflow-y:auto}.fullscreen-overlay{padding:0;background-color:rgba(0, 0, 0, 0.7);position:absolute;width:100%;height:auto}.modal-container{background-color:#fff;border-radius:8px;width:100%;display:flex;flex-direction:column;position:relative;margin:5vh auto auto auto;transition:all 0.3s ease-out;overflow:hidden}.modal-container.fullscreen{width:100%;max-width:none;height:100%;border-radius:0;margin:0;display:flex;flex-direction:column;max-height:100%}.pc-layout{width:80%;max-width:600px;min-width:320px}@media screen and (max-width: 768px){.pc-layout{width:95%}.modal-overlay{padding:10px 0px 0px 0px}.modal-container.fullscreen{width:100%;height:100%;max-height:100%;border-radius:16px 16px 0 0;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;height:50px;border-bottom:1px solid #e8e8e8;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:#333}.header-icon{width:24px;height:24px}.close-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:4px}.close-button:hover{background-color:rgba(0, 0, 0, 0.04)}.close-button span{font-size:24px;line-height:1;color:#999}.close-button:hover span{color:#666}.upload-area{cursor:pointer;width:100%}.upload-placeholder{transition:all 0.3s ease;display:flex;flex-direction:column;align-items:center;background:rgba(0, 0, 0, 0.02);border:1px dashed #d9d9d9;border-radius:8px;cursor:pointer}.upload-placeholder:hover{border:1px dashed #1890ff}.upload-placeholder img{margin-top:8px;width:50px;height:50px}.upload-placeholder .upload-text{margin:4px 0;color:#332F39;font-size:14px}.upload-placeholder .upload-hint{font-size:14px;color:#949AA5;margin-top:8px;padding:0px 10px;text-align:center;white-space:normal;word-wrap:break-word;word-break:break-all;line-height:1.4}.file-item{position:relative;padding:16px;border:1px solid #e2e8f0;border-radius:8px;transition:border-color 0.3s;cursor:pointer;margin-bottom:16px;display:flex;justify-content:space-between;align-items:center}.file-item:hover{border-color:#0D75FB}.file-item-content{display:flex;align-items:center;gap:8px;flex:1;min-width:0;overflow:hidden}.file-icon{color:#0D75FB;flex-shrink:0}.file-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 50px)}.remove-file{background:transparent;border:none;color:#94a3b8;cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;padding:4px;margin-left:8px;border-radius:4px;transition:all 0.2s;min-width:30px;min-height:30px}.remove-file:hover{background-color:#f1f5f9;color:#475569}.file-input{display:none}.input-container{padding:20px;display:flex;flex-direction:column;height:calc(100% - 50px);background:linear-gradient(150deg, #2a6ee933, #0000 50%) 0 0 / 400px 200px no-repeat, #fff;overflow-y:auto}.input-container h3{margin-top:0;margin-bottom:20px;font-size:18px;color:#333;text-align:center}.jd-input-section{margin-bottom:20px}.jd-input-section label{display:block;margin-bottom:8px;font-weight:500;color:#333}.job-description-textarea{width:calc(100% - 16px);border:1px solid #ddd;border-radius:4px;resize:vertical;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s;padding:8px}.job-description-textarea:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.resume-upload-section{margin-bottom:20px;width:100%;display:flex;flex-direction:column}.resume-upload-section label{display:block;margin-bottom:8px;font-weight:500;color:#333}.interview-settings-section{margin-bottom:24px;padding:20px;background-color:#f8f9fa;border-radius:8px;border:1px solid #e9ecef}.settings-row{margin-bottom:20px}.settings-row:last-child{margin-bottom:0}.settings-label{display:block;font-weight:500;color:#333;margin-bottom:12px;font-size:14px}.question-number-section{width:100%}.slider-container{display:flex;align-items:center;gap:12px}.question-slider{flex:1;height:6px;background:#ddd;outline:none;border-radius:3px;-webkit-appearance:none;appearance:none}.question-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;background:#0D75FB;cursor:pointer;border-radius:50%;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}.question-slider::-moz-range-thumb{width:20px;height:20px;background:#0D75FB;cursor:pointer;border-radius:50%;border:none;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}.slider-value{font-weight:600;color:#0D75FB;font-size:14px;min-width:30px;text-align:center}.analysis-toggle-section{width:100%}.toggle-container{display:flex;align-items:center;gap:12px}.toggle-switch{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input{opacity:0;width:0;height:0}.toggle-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;transition:0.3s;border-radius:24px}.toggle-slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:white;transition:0.3s;border-radius:50%;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}input:checked+.toggle-slider{background-color:#0D75FB}input:checked+.toggle-slider:before{transform:translateX(20px)}.toggle-text{font-size:14px;color:#666;font-weight:500}.submit-button{margin-top:10px;padding:10px 30px;background:#0D75FB;color:white;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:all 0.3s ease;width:100%;max-width:400px;align-self:center}.submit-button:hover{background-color:#40a9ff}.submit-button:disabled{background-color:rgba(0,0,0,0.04);color:rgba(0,0,0,0.25);cursor:not-allowed}.ai-disclaimer{margin-top:16px;text-align:center;font-size:12px;color:#999;line-height:1.5}.ai-disclaimer p{margin:4px 0}.beian-info{display:flex;justify-content:center;flex-wrap:wrap;gap:4px}.ai-disclaimer a{color:#666;text-decoration:none;transition:color 0.2s ease}.ai-disclaimer a:hover{color:#1890ff;text-decoration:underline}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:24px}.loading-spinner{width:40px;height:40px;border:4px solid rgba(0, 0, 0, 0.1);border-radius:50%;border-top-color:var(--pcm-primary-color, #1890ff);animation:spin 1s linear infinite;margin-bottom:16px}.loading-text{font-size:16px;color:var(--pcm-text-color, #333)}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.header-history-button{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:4px 8px;border:none;border-radius:4px;background:transparent;color:#bbb;cursor:pointer;font-size:13px;font-family:inherit;line-height:1;transition:all 0.2s ease;flex-shrink:0;white-space:nowrap}.header-history-button svg{width:16px;height:16px;display:block;flex-shrink:0}.header-history-button:hover{background-color:rgba(0, 0, 0, 0.04);color:#666}.header-history-button:focus-visible{outline:2px solid rgba(13, 117, 251, 0.35);outline-offset:2px}.history-drawer-content{height:100%;display:flex;flex-direction:column}.conversation-list{flex:1;overflow-y:auto;padding:8px 0}.loading-conversations,.empty-conversations{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:#999}.loading-conversations .loading-spinner-small{margin-bottom:12px}.conversation-item{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;margin:0 8px 4px 8px;border-radius:8px;cursor:pointer;transition:all 0.2s ease;border:1px solid transparent}.conversation-item:hover{background:#f5f5f5}.conversation-info{flex:1;min-width:0}.conversation-title{font-size:14px;font-weight:500;color:#262626;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conversation-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#8c8c8c}.conversation-time{flex-shrink:0}.message-count{flex-shrink:0}.conversation-status{padding:2px 6px;border-radius:4px;font-size:11px;font-weight:500}.conversation-status.completed{background:#f6ffed;color:#52c41a}.conversation-status.running{background:#fff7e6;color:#fa8c16}.header-history-entry{display:inline-flex;align-items:center;justify-content:center;margin-left:8px;padding:4px 8px;border:none;border-radius:4px;background:#e6f7ff;color:#1890ff;cursor:pointer;font-size:12px;font-family:inherit;line-height:1;white-space:nowrap;transition:all 0.2s ease}.header-history-entry:hover{background:#bae7ff;color:#0958d9;transform:translateY(-1px)}.header-history-entry:focus-visible{outline:2px solid rgba(13, 117, 251, 0.35);outline-offset:2px}.history-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px 16px;border-top:1px solid #f0f0f0}.history-pagination-button{min-width:72px;padding:6px 12px;border:1px solid #d9d9d9;border-radius:6px;background:#fff;color:#595959;cursor:pointer;font-size:12px;transition:all 0.2s ease}.history-pagination-button:hover:not(:disabled){border-color:#1890ff;color:#1890ff;background:#e6f7ff}.history-pagination-button:disabled{border-color:#f0f0f0;color:#bfbfbf;background:#fafafa;cursor:not-allowed}.history-pagination-info{flex:1;text-align:center;color:#8c8c8c;font-size:12px}";
17
17