fmode-ng 0.0.83 → 0.0.84

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 (171) hide show
  1. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +1 -1
  2. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +1 -1
  3. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +1 -1
  4. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +1 -1
  5. package/esm2022/lib/aigc/index.mjs +1 -1
  6. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -0
  7. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -0
  8. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -0
  9. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -0
  10. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -0
  11. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -0
  12. package/esm2022/lib/aigc/story/index.mjs +10 -0
  13. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -0
  14. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -0
  15. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -0
  16. package/esm2022/lib/aigc/story/story.service.mjs +10 -0
  17. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +1 -1
  18. package/esm2022/lib/aigc/voice/index.mjs +1 -1
  19. package/esm2022/lib/aigc/voice/{audio.player.mjs → lib/audio/audio.player.mjs} +2 -2
  20. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -0
  21. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -0
  22. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +10 -0
  23. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +1 -1
  24. package/esm2022/lib/aigc/voice/tts/index.mjs +1 -1
  25. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -0
  26. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +10 -0
  27. package/esm2022/lib/aigc/voice/tts/provider-microsoft.mjs +10 -0
  28. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +1 -1
  29. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -0
  30. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +1 -1
  31. package/esm2022/lib/core/agent/chat/index.mjs +1 -1
  32. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +1 -1
  33. package/esm2022/lib/core/index.mjs +10 -0
  34. package/esm2022/lib/core/voice/index.mjs +10 -0
  35. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -0
  36. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -0
  37. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -0
  38. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -0
  39. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -0
  40. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -0
  41. package/esm2022/lib/icon/filetype/index.mjs +10 -0
  42. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -0
  43. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -0
  44. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -0
  45. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -0
  46. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -0
  47. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -0
  48. package/esm2022/lib/icon/index.mjs +10 -0
  49. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -0
  50. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -0
  51. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -0
  52. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +10 -0
  53. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -0
  54. package/esm2022/lib/person/index.mjs +10 -0
  55. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -0
  56. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -0
  57. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -0
  58. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -0
  59. package/esm2022/lib/person/person.service.mjs +10 -0
  60. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -0
  61. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -0
  62. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +10 -0
  63. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -0
  64. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +10 -0
  65. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -0
  66. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +10 -0
  67. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -0
  68. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -0
  69. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -0
  70. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -0
  71. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -0
  72. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -0
  73. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -0
  74. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -0
  75. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -0
  76. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -0
  77. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -0
  78. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -0
  79. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -0
  80. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -0
  81. package/esm2022/lib/text/index.mjs +10 -0
  82. package/esm2022/public-api.mjs +1 -1
  83. package/fesm2022/fmode-ng.mjs +1 -1
  84. package/fesm2022/fmode-ng.mjs.map +1 -1
  85. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +5 -3
  86. package/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.d.ts +4 -2
  87. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +6 -3
  88. package/lib/aigc/index.d.ts +1 -0
  89. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +23 -0
  90. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +26 -0
  91. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +71 -0
  92. package/lib/aigc/story/fm-story-list/story-preview.d.ts +20 -0
  93. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +38 -0
  94. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +13 -0
  95. package/lib/aigc/story/index.d.ts +5 -0
  96. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +14 -0
  97. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +29 -0
  98. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +44 -0
  99. package/lib/aigc/story/story.service.d.ts +12 -0
  100. package/lib/aigc/voice/fmode-voice.service.d.ts +3 -6
  101. package/lib/aigc/voice/index.d.ts +3 -2
  102. package/lib/aigc/voice/lib/audio/audio.streamer.d.ts +33 -0
  103. package/lib/aigc/voice/{stream.player.d.ts → lib/audio/streamer.microsoft.d.ts} +2 -2
  104. package/lib/aigc/voice/lib/audio/streamer.pcm.d.ts +45 -0
  105. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +16 -37
  106. package/lib/aigc/voice/tts/index.d.ts +3 -0
  107. package/lib/aigc/voice/tts/int-tts-provider.d.ts +35 -0
  108. package/lib/aigc/voice/tts/provider-doubao.d.ts +42 -0
  109. package/lib/aigc/voice/tts/provider-microsoft.d.ts +21 -0
  110. package/lib/core/agent/chat/completion/fmode-completion.d.ts +2 -1
  111. package/lib/core/agent/chat/completion/int-gpt-chat-options.d.ts +72 -0
  112. package/lib/core/agent/chat/index.d.ts +1 -1
  113. package/lib/core/agent/chat/interface.d.ts +1 -0
  114. package/lib/core/agent/prompt/agent.prompt.d.ts +2 -1
  115. package/lib/core/index.d.ts +2 -0
  116. package/lib/core/voice/index.d.ts +1 -0
  117. package/lib/icon/filetype/audio.svg.d.ts +1 -0
  118. package/lib/icon/filetype/avatar.svg.d.ts +1 -0
  119. package/lib/icon/filetype/chat.svg.d.ts +1 -0
  120. package/lib/icon/filetype/docx.svg.d.ts +1 -0
  121. package/lib/icon/filetype/file.svg.d.ts +1 -0
  122. package/lib/icon/filetype/filetype.pipe.d.ts +8 -0
  123. package/lib/icon/filetype/index.d.ts +11 -0
  124. package/lib/icon/filetype/md.svg.d.ts +1 -0
  125. package/lib/icon/filetype/pdf.svg.d.ts +1 -0
  126. package/lib/icon/filetype/pptx.svg.d.ts +1 -0
  127. package/lib/icon/filetype/svgtoblob.d.ts +1 -0
  128. package/lib/icon/filetype/video.svg.d.ts +1 -0
  129. package/lib/icon/filetype/xlsx.svg.d.ts +1 -0
  130. package/lib/icon/index.d.ts +1 -0
  131. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +20 -0
  132. package/lib/person/comp-person-item/comp-person-item.component.d.ts +10 -0
  133. package/lib/person/comp-person-story/comp-person-story.component.d.ts +67 -0
  134. package/lib/person/edit-upload/edit-upload.component.d.ts +81 -0
  135. package/lib/person/edit-upload/edit-upload.module.d.ts +11 -0
  136. package/lib/person/index.d.ts +4 -0
  137. package/lib/person/modal-person-select/modal-person-select.component.d.ts +25 -0
  138. package/lib/person/modal-user-verify/secret-text.pipe.d.ts +7 -0
  139. package/lib/person/modal-user-verify/user-verify.component.d.ts +88 -0
  140. package/lib/person/person-detail/person-detail.component.d.ts +41 -0
  141. package/lib/person/person.service.d.ts +33 -0
  142. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +23 -0
  143. package/lib/text/fm-article-editor/article.service.d.ts +41 -0
  144. package/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.d.ts +19 -0
  145. package/lib/text/fm-article-editor/draft.service.d.ts +33 -0
  146. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +73 -0
  147. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +81 -0
  148. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +90 -0
  149. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +36 -0
  150. package/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.d.ts +12 -0
  151. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +55 -0
  152. package/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.d.ts +31 -0
  153. package/lib/text/fm-article-editor/outline-count.pipe.d.ts +7 -0
  154. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +6 -0
  155. package/lib/text/fm-article-editor/task-article-generation.d.ts +23 -0
  156. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +18 -0
  157. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +14 -0
  158. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +19 -0
  159. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +7 -0
  160. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +14 -0
  161. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +14 -0
  162. package/lib/text/fm-text-quill/fm-text-quill.component.d.ts +39 -0
  163. package/lib/text/index.d.ts +3 -0
  164. package/package.json +6 -2
  165. package/public-api.d.ts +4 -0
  166. package/esm2022/lib/aigc/voice/lib/recorder/engine-pcm.mjs +0 -10
  167. package/esm2022/lib/aigc/voice/lib/recorder/engine-wav.mjs +0 -10
  168. package/esm2022/lib/aigc/voice/stream.player.mjs +0 -10
  169. package/lib/aigc/voice/lib/recorder/engine-pcm.d.ts +0 -1
  170. package/lib/aigc/voice/lib/recorder/engine-wav.d.ts +0 -1
  171. /package/lib/aigc/voice/{audio.player.d.ts → lib/audio/audio.player.d.ts} +0 -0
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs
7
7
  */
8
- import{Component,ElementRef,ViewChild}from"@angular/core";import{FmodeVoiceService}from"../../voice";import{ChatService}from"../../service-fmai/service-chat";import{IonicModule,NavController,Platform,ModalController}from"@ionic/angular";import{CommonModule}from"@angular/common";import{CompAvatarParticleComponent}from"../comp-avatar-particle/comp-avatar-particle.component";import{CompAvatarRoleImageComponent}from"../comp-avatar-role-image/comp-avatar-role-image.component";import{FormsModule}from"@angular/forms";import{ActivatedRoute,Router,RouterModule}from"@angular/router";import*as Parse from"parse";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{HidexmlPipe}from"../../service-fmai/service-chat";import{ModalChatVoiceInputComponent}from"../modal-chat-voice-input/modal-chat-voice-input.component";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"../../voice";import*as i2 from"@ionic/angular";import*as i3 from"@angular/router";import*as i4 from"../../service-fmai/service-chat";import*as i5 from"../../../nova-cloud/nova-cloud.service";import*as i6 from"@angular/common";export class CompAvatarTalkComponent{constructor(o,e,n,t,i,a,r){this.voiceServ=o,this.platform=e,this.router=n,this.navCtrl=t,this.route=i,this.chatServ=a,this.ncloud=r,this.route.paramMap.subscribe((o=>{this.roleId=o.get("roleId"),this.loadAvatarRole(this.roleId)})),document.body.classList.add("dark")}ngOnInit(){}ngOnDestroy(){document.body.classList.remove("dark"),this.voiceServ.resultText=null,this.fmodeChat&&(this.fmodeChat.latestAIResponse=null)}goBack(){document.body.classList.remove("dark");let o=this.avatarRole?.get("backUrl");try{if(o)return void this.navCtrl.navigateRoot(o);this.navCtrl.navigateRoot("/chat/pro/role/"+this.roleId)}catch(o){this.navCtrl.navigateRoot("/chat/pro/role/"+this.roleId)}}async loadAvatarRole(o){let e=new Parse.Query("AvatarRole");this.avatarRole=await e.get(o);let n=await this.chatServ.createNewRoleChat(this.roleId);n.isTalkMode=!0,this.fmodeChat=n,this.fmodeChat.showAvatar()}ngAfterViewInit(){this.listenDivChange()}listenDivChange(){new MutationObserver((()=>{this.scrollToBottom(this.aiRespComp)})).observe(this.aiRespComp.nativeElement,{childList:!0,subtree:!0,attributes:!0})}scrollToBottom(o){o?.nativeElement?.scrollHeight&&(o.nativeElement.scrollTop=o.nativeElement.scrollHeight)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarTalkComponent,deps:[{token:i1.FmodeVoiceService},{token:i2.Platform},{token:i3.Router},{token:i2.NavController},{token:i3.ActivatedRoute},{token:i4.ChatService},{token:i5.NovaCloudService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:CompAvatarTalkComponent,isStandalone:!0,selector:"app-comp-avatar-talk",providers:[FmodeVoiceService,NovaCloudService,ChatService,Diagnostic,ModalController],viewQueries:[{propertyName:"avatarComp",first:!0,predicate:["avatar"],descendants:!0},{propertyName:"aiRespComp",first:!0,predicate:["aiRespComp"],descendants:!0}],ngImport:i0,template:'<ion-menu #menu contentId="main-content" side="end">\n <ion-header>\n <ion-toolbar>\n <ion-title>资料</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="avatarRole?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{avatarRole?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{avatarRole?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{avatarRole?.get("desc")}}\n\n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="avatarRole?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="avatarRole?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{avatarRole?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="avatarRole?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{avatarRole?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="avatarRole?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{avatarRole?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{avatarRole?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{avatarRole?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n\n </ion-list>\n </ion-card-content>\n </ion-card>\n \n \n \n </ion-content>\n</ion-menu>\n\n<div class="ion-page" id="main-content">\n <ion-header class="ion-no-border">\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="goBack()"> <ion-icon name="chevron-back-outline"></ion-icon> </ion-button>\n </ion-buttons>\n <ion-title>\n <ion-chip *ngIf="avatarRole?.get(\'title\')">{{avatarRole?.get("title")}}</ion-chip>\n </ion-title>\n <ion-buttons slot="end">\n \x3c!-- <ion-button (click)="playTTSTeting()">TTS测试</ion-button> --\x3e\n {{avatarRole?.get("name")}}\n <ion-button (click)="menu.toggle()"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n \x3c!-- <ion-segment value="voice">\n <ion-segment-button (click)="chatServ.createChatPanel(avatarRole)" value="chat">\n <ion-label>聊天</ion-label>\n </ion-segment-button>\n <ion-segment-button routerLink="{{\'/avatar/role/\'+avatarRole?.id}}" value="voice">\n <ion-label>语音</ion-label>\n </ion-segment-button>\n </ion-segment> --\x3e\n\n \x3c!-- 数字形象:动画效果 --\x3e\n <fm-avatar-role-image *ngIf="avatarRole&&fmodeChat" [fmodeChat]="fmodeChat" [role]="avatarRole" #avatar class="avatar"></fm-avatar-role-image>\n \x3c!-- <fm-avatar-role-particle #avatar class="avatar"></fm-avatar-role-particle> --\x3e\n\n \x3c!-- AI回复的最新消息 --\x3e\n <div class="ai-resp-input" #aiRespComp>{{fmodeChat?.latestAIResponse | hidexml}}</div>\n\n <fm-modal-chat-voice-input *ngIf="fmodeChat" [fmodeChat]="fmodeChat"></fm-modal-chat-voice-input>\n\n</div>\n\n',styles:["ion-menu ion-note{color:#ccc;font-weight:700}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.avatar{display:block;width:100%;height:100%}.ai-resp-input{font-size:1rem;color:#fff;position:fixed;top:60px;max-height:15vh;overflow-y:scroll;padding:0 10px}.user-asr-input{font-size:1rem;color:#fff;position:fixed;bottom:6vh;padding:0 10px}.test-button-group{color:#00f;position:fixed;bottom:20vh}.test-button-group button{padding:10px;margin:10px}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:RouterModule},{kind:"ngmodule",type:FormsModule},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i2.IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:i2.IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:i2.IonCard,selector:"ion-card",inputs:["button","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:i2.IonCardContent,selector:"ion-card-content",inputs:["mode"]},{kind:"component",type:i2.IonCardHeader,selector:"ion-card-header",inputs:["color","mode","translucent"]},{kind:"component",type:i2.IonCardSubtitle,selector:"ion-card-subtitle",inputs:["color","mode"]},{kind:"component",type:i2.IonCardTitle,selector:"ion-card-title",inputs:["color","mode"]},{kind:"component",type:i2.IonChip,selector:"ion-chip",inputs:["color","disabled","mode","outline"]},{kind:"component",type:i2.IonContent,selector:"ion-content",inputs:["color","fixedSlotPlacement","forceOverscroll","fullscreen","scrollEvents","scrollX","scrollY"]},{kind:"component",type:i2.IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:i2.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:i2.IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:i2.IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:i2.IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:i2.IonMenu,selector:"ion-menu",inputs:["contentId","disabled","maxEdgeStart","menuId","side","swipeGesture","type"]},{kind:"component",type:i2.IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"component",type:i2.IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:i2.IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:CompAvatarRoleImageComponent,selector:"fm-avatar-role-image",inputs:["fmodeChat","role"]},{kind:"component",type:ModalChatVoiceInputComponent,selector:"fm-modal-chat-voice-input",inputs:["fmodeChat","talkMode"]},{kind:"pipe",type:HidexmlPipe,name:"hidexml"}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarTalkComponent,decorators:[{type:Component,args:[{selector:"app-comp-avatar-talk",standalone:!0,imports:[CommonModule,RouterModule,FormsModule,IonicModule,CompAvatarParticleComponent,CompAvatarRoleImageComponent,ModalChatVoiceInputComponent,HidexmlPipe],providers:[FmodeVoiceService,NovaCloudService,ChatService,Diagnostic,ModalController],template:'<ion-menu #menu contentId="main-content" side="end">\n <ion-header>\n <ion-toolbar>\n <ion-title>资料</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="avatarRole?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{avatarRole?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{avatarRole?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{avatarRole?.get("desc")}}\n\n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="avatarRole?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="avatarRole?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{avatarRole?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="avatarRole?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{avatarRole?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="avatarRole?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{avatarRole?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{avatarRole?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{avatarRole?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n\n </ion-list>\n </ion-card-content>\n </ion-card>\n \n \n \n </ion-content>\n</ion-menu>\n\n<div class="ion-page" id="main-content">\n <ion-header class="ion-no-border">\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="goBack()"> <ion-icon name="chevron-back-outline"></ion-icon> </ion-button>\n </ion-buttons>\n <ion-title>\n <ion-chip *ngIf="avatarRole?.get(\'title\')">{{avatarRole?.get("title")}}</ion-chip>\n </ion-title>\n <ion-buttons slot="end">\n \x3c!-- <ion-button (click)="playTTSTeting()">TTS测试</ion-button> --\x3e\n {{avatarRole?.get("name")}}\n <ion-button (click)="menu.toggle()"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n \x3c!-- <ion-segment value="voice">\n <ion-segment-button (click)="chatServ.createChatPanel(avatarRole)" value="chat">\n <ion-label>聊天</ion-label>\n </ion-segment-button>\n <ion-segment-button routerLink="{{\'/avatar/role/\'+avatarRole?.id}}" value="voice">\n <ion-label>语音</ion-label>\n </ion-segment-button>\n </ion-segment> --\x3e\n\n \x3c!-- 数字形象:动画效果 --\x3e\n <fm-avatar-role-image *ngIf="avatarRole&&fmodeChat" [fmodeChat]="fmodeChat" [role]="avatarRole" #avatar class="avatar"></fm-avatar-role-image>\n \x3c!-- <fm-avatar-role-particle #avatar class="avatar"></fm-avatar-role-particle> --\x3e\n\n \x3c!-- AI回复的最新消息 --\x3e\n <div class="ai-resp-input" #aiRespComp>{{fmodeChat?.latestAIResponse | hidexml}}</div>\n\n <fm-modal-chat-voice-input *ngIf="fmodeChat" [fmodeChat]="fmodeChat"></fm-modal-chat-voice-input>\n\n</div>\n\n',styles:["ion-menu ion-note{color:#ccc;font-weight:700}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.avatar{display:block;width:100%;height:100%}.ai-resp-input{font-size:1rem;color:#fff;position:fixed;top:60px;max-height:15vh;overflow-y:scroll;padding:0 10px}.user-asr-input{font-size:1rem;color:#fff;position:fixed;bottom:6vh;padding:0 10px}.test-button-group{color:#00f;position:fixed;bottom:20vh}.test-button-group button{padding:10px;margin:10px}\n"]}]}],ctorParameters:()=>[{type:i1.FmodeVoiceService},{type:i2.Platform},{type:i3.Router},{type:i2.NavController},{type:i3.ActivatedRoute},{type:i4.ChatService},{type:i5.NovaCloudService}],propDecorators:{avatarComp:[{type:ViewChild,args:["avatar"]}],aiRespComp:[{type:ViewChild,args:["aiRespComp"]}]}});
8
+ import{Component,ElementRef,ViewChild}from"@angular/core";import{FmodeVoiceService}from"../../voice";import{ChatService}from"../../service-fmai/service-chat";import{IonicModule,NavController,Platform,ModalController}from"@ionic/angular";import{CommonModule}from"@angular/common";import{CompAvatarParticleComponent}from"../comp-avatar-particle/comp-avatar-particle.component";import{CompAvatarRoleImageComponent}from"../comp-avatar-role-image/comp-avatar-role-image.component";import{FormsModule}from"@angular/forms";import{ActivatedRoute,Router,RouterModule}from"@angular/router";import*as Parse from"parse";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{HidexmlPipe}from"../../service-fmai/service-chat";import{ModalChatVoiceInputComponent}from"../modal-chat-voice-input/modal-chat-voice-input.component";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular";import*as i3 from"../../service-fmai/service-chat";import*as i4 from"../../../nova-cloud/nova-cloud.service";import*as i5 from"@awesome-cordova-plugins/diagnostic/ngx";import*as i6 from"@angular/common";export class CompAvatarTalkComponent{constructor(o,n,e,t,i,a,r){this.router=o,this.navCtrl=n,this.route=e,this.chatServ=t,this.ncloud=i,this.platform=a,this.diagnostic=r,this.voiceServ=new FmodeVoiceService(this.platform,this.diagnostic),this.route.paramMap.subscribe((o=>{this.roleId=o.get("roleId"),this.loadAvatarRole(this.roleId)})),document.body.classList.add("dark")}ngOnInit(){}ngOnDestroy(){document.body.classList.remove("dark"),this.voiceServ.resultText=null,this.fmodeChat&&(this.fmodeChat.latestAIResponse=null)}goBack(){document.body.classList.remove("dark");let o=this.avatarRole?.get("backUrl");try{if(o)return void this.navCtrl.navigateRoot(o);this.navCtrl.navigateRoot("/chat/pro/role/"+this.roleId)}catch(o){this.navCtrl.navigateRoot("/chat/pro/role/"+this.roleId)}}async loadAvatarRole(o){let n=new Parse.Query("AvatarRole");this.avatarRole=await n.get(o);let e=await this.chatServ.createNewRoleChat(this.roleId);e.isTalkMode=!0,this.fmodeChat=e,this.fmodeChat.showAvatar()}ngAfterViewInit(){this.listenDivChange()}listenDivChange(){new MutationObserver((()=>{this.scrollToBottom(this.aiRespComp)})).observe(this.aiRespComp.nativeElement,{childList:!0,subtree:!0,attributes:!0})}scrollToBottom(o){o?.nativeElement?.scrollHeight&&(o.nativeElement.scrollTop=o.nativeElement.scrollHeight)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarTalkComponent,deps:[{token:i1.Router},{token:i2.NavController},{token:i1.ActivatedRoute},{token:i3.ChatService},{token:i4.NovaCloudService},{token:i2.Platform},{token:i5.Diagnostic}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:CompAvatarTalkComponent,isStandalone:!0,selector:"app-comp-avatar-talk",providers:[NovaCloudService,ChatService,Diagnostic,ModalController],viewQueries:[{propertyName:"avatarComp",first:!0,predicate:["avatar"],descendants:!0},{propertyName:"aiRespComp",first:!0,predicate:["aiRespComp"],descendants:!0}],ngImport:i0,template:'<ion-menu #menu contentId="main-content" side="end">\n <ion-header>\n <ion-toolbar>\n <ion-title>资料</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="avatarRole?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{avatarRole?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{avatarRole?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{avatarRole?.get("desc")}}\n\n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="avatarRole?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="avatarRole?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{avatarRole?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="avatarRole?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{avatarRole?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="avatarRole?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{avatarRole?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{avatarRole?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{avatarRole?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n\n </ion-list>\n </ion-card-content>\n </ion-card>\n \n \n \n </ion-content>\n</ion-menu>\n\n<div class="ion-page" id="main-content">\n <ion-header class="ion-no-border">\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="goBack()"> <ion-icon name="chevron-back-outline"></ion-icon> </ion-button>\n </ion-buttons>\n <ion-title>\n <ion-chip *ngIf="avatarRole?.get(\'title\')">{{avatarRole?.get("title")}}</ion-chip>\n </ion-title>\n <ion-buttons slot="end">\n \x3c!-- <ion-button (click)="playTTSTeting()">TTS测试</ion-button> --\x3e\n {{avatarRole?.get("name")}}\n <ion-button (click)="menu.toggle()"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n \x3c!-- <ion-segment value="voice">\n <ion-segment-button (click)="chatServ.createChatPanel(avatarRole)" value="chat">\n <ion-label>聊天</ion-label>\n </ion-segment-button>\n <ion-segment-button routerLink="{{\'/avatar/role/\'+avatarRole?.id}}" value="voice">\n <ion-label>语音</ion-label>\n </ion-segment-button>\n </ion-segment> --\x3e\n\n \x3c!-- 数字形象:动画效果 --\x3e\n <fm-avatar-role-image *ngIf="avatarRole&&fmodeChat" [fmodeChat]="fmodeChat" [role]="avatarRole" #avatar class="avatar"></fm-avatar-role-image>\n \x3c!-- <fm-avatar-role-particle #avatar class="avatar"></fm-avatar-role-particle> --\x3e\n\n \x3c!-- AI回复的最新消息 --\x3e\n <div class="ai-resp-input" #aiRespComp>{{fmodeChat?.latestAIResponse | hidexml}}</div>\n\n <fm-modal-chat-voice-input *ngIf="fmodeChat" [fmodeChat]="fmodeChat"></fm-modal-chat-voice-input>\n\n</div>\n\n',styles:["ion-menu ion-note{color:#ccc;font-weight:700}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.avatar{display:block;width:100%;height:100%}.ai-resp-input{font-size:1rem;color:#fff;position:fixed;top:60px;max-height:15vh;overflow-y:scroll;padding:0 10px}.user-asr-input{font-size:1rem;color:#fff;position:fixed;bottom:6vh;padding:0 10px}.test-button-group{color:#00f;position:fixed;bottom:20vh}.test-button-group button{padding:10px;margin:10px}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:RouterModule},{kind:"ngmodule",type:FormsModule},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i2.IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:i2.IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:i2.IonCard,selector:"ion-card",inputs:["button","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:i2.IonCardContent,selector:"ion-card-content",inputs:["mode"]},{kind:"component",type:i2.IonCardHeader,selector:"ion-card-header",inputs:["color","mode","translucent"]},{kind:"component",type:i2.IonCardSubtitle,selector:"ion-card-subtitle",inputs:["color","mode"]},{kind:"component",type:i2.IonCardTitle,selector:"ion-card-title",inputs:["color","mode"]},{kind:"component",type:i2.IonChip,selector:"ion-chip",inputs:["color","disabled","mode","outline"]},{kind:"component",type:i2.IonContent,selector:"ion-content",inputs:["color","fixedSlotPlacement","forceOverscroll","fullscreen","scrollEvents","scrollX","scrollY"]},{kind:"component",type:i2.IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:i2.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:i2.IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:i2.IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:i2.IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:i2.IonMenu,selector:"ion-menu",inputs:["contentId","disabled","maxEdgeStart","menuId","side","swipeGesture","type"]},{kind:"component",type:i2.IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"component",type:i2.IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:i2.IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:CompAvatarRoleImageComponent,selector:"fm-avatar-role-image",inputs:["fmodeChat","role"]},{kind:"component",type:ModalChatVoiceInputComponent,selector:"fm-modal-chat-voice-input",inputs:["fmodeChat","talkMode"]},{kind:"pipe",type:HidexmlPipe,name:"hidexml"}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarTalkComponent,decorators:[{type:Component,args:[{selector:"app-comp-avatar-talk",standalone:!0,imports:[CommonModule,RouterModule,FormsModule,IonicModule,CompAvatarParticleComponent,CompAvatarRoleImageComponent,ModalChatVoiceInputComponent,HidexmlPipe],providers:[NovaCloudService,ChatService,Diagnostic,ModalController],template:'<ion-menu #menu contentId="main-content" side="end">\n <ion-header>\n <ion-toolbar>\n <ion-title>资料</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="avatarRole?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{avatarRole?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{avatarRole?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{avatarRole?.get("desc")}}\n\n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="avatarRole?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="avatarRole?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{avatarRole?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="avatarRole?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{avatarRole?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="avatarRole?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{avatarRole?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{avatarRole?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{avatarRole?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n\n </ion-list>\n </ion-card-content>\n </ion-card>\n \n \n \n </ion-content>\n</ion-menu>\n\n<div class="ion-page" id="main-content">\n <ion-header class="ion-no-border">\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="goBack()"> <ion-icon name="chevron-back-outline"></ion-icon> </ion-button>\n </ion-buttons>\n <ion-title>\n <ion-chip *ngIf="avatarRole?.get(\'title\')">{{avatarRole?.get("title")}}</ion-chip>\n </ion-title>\n <ion-buttons slot="end">\n \x3c!-- <ion-button (click)="playTTSTeting()">TTS测试</ion-button> --\x3e\n {{avatarRole?.get("name")}}\n <ion-button (click)="menu.toggle()"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n\n \x3c!-- <ion-segment value="voice">\n <ion-segment-button (click)="chatServ.createChatPanel(avatarRole)" value="chat">\n <ion-label>聊天</ion-label>\n </ion-segment-button>\n <ion-segment-button routerLink="{{\'/avatar/role/\'+avatarRole?.id}}" value="voice">\n <ion-label>语音</ion-label>\n </ion-segment-button>\n </ion-segment> --\x3e\n\n \x3c!-- 数字形象:动画效果 --\x3e\n <fm-avatar-role-image *ngIf="avatarRole&&fmodeChat" [fmodeChat]="fmodeChat" [role]="avatarRole" #avatar class="avatar"></fm-avatar-role-image>\n \x3c!-- <fm-avatar-role-particle #avatar class="avatar"></fm-avatar-role-particle> --\x3e\n\n \x3c!-- AI回复的最新消息 --\x3e\n <div class="ai-resp-input" #aiRespComp>{{fmodeChat?.latestAIResponse | hidexml}}</div>\n\n <fm-modal-chat-voice-input *ngIf="fmodeChat" [fmodeChat]="fmodeChat"></fm-modal-chat-voice-input>\n\n</div>\n\n',styles:["ion-menu ion-note{color:#ccc;font-weight:700}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.avatar{display:block;width:100%;height:100%}.ai-resp-input{font-size:1rem;color:#fff;position:fixed;top:60px;max-height:15vh;overflow-y:scroll;padding:0 10px}.user-asr-input{font-size:1rem;color:#fff;position:fixed;bottom:6vh;padding:0 10px}.test-button-group{color:#00f;position:fixed;bottom:20vh}.test-button-group button{padding:10px;margin:10px}\n"]}]}],ctorParameters:()=>[{type:i1.Router},{type:i2.NavController},{type:i1.ActivatedRoute},{type:i3.ChatService},{type:i4.NovaCloudService},{type:i2.Platform},{type:i5.Diagnostic}],propDecorators:{avatarComp:[{type:ViewChild,args:["avatar"]}],aiRespComp:[{type:ViewChild,args:["aiRespComp"]}]}});
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9jb21wLWF2YXRhci10YWxrL2NvbXAtYXZhdGFyLXRhbGsuY29tcG9uZW50Lm1qcw==`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs
7
7
  */
8
- import{Component,Input}from"@angular/core";import{CommonModule}from"@angular/common";import{ToastController}from"@ionic/angular";import{Router,RouterModule}from"@angular/router";import{IonicModule,Platform}from"@ionic/angular";import{FmodeVoiceService}from"../../voice";import{FmodeChat,ChatService}from"../../service-fmai/service-chat";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@angular/router";import*as i3 from"../../voice";import*as i4 from"../../../nova-cloud/nova-cloud.service";import*as i5 from"../../service-fmai/service-chat";import*as i6 from"@angular/common";export class ModalChatVoiceInputComponent{constructor(t,e,o,n,i,r){this.platform=t,this.router=e,this.voiceServ=o,this.toastCtrl=n,this.ncloud=i,this.chatServ=r,this.talkMode="click",this.talkTips="点击话筒开始讲话",this.errorText="",this.player=new Audio}ngOnInit(){"press"==this.talkMode&&(this.talkTips="轻触底部开始讲话"),setTimeout((()=>{this.initVoiceSevice(),this.initVoiceASR()}),500)}async initVoiceASR(){this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge(),this.startASRAwake()}))}async startASRAwake(){await this.voiceServ.openWithPriviledge(),new this.voiceServ.webSpeech(this.platform).startRecognition("Nihao | Hello")}playMusic(t){this.player.src=`/assets/avatar/voice/${t}.mp3`,this.player.play()}initVoiceSevice(){this.fmodeChat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.fmodeChat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.fmodeChat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{this.startASRAwake()},this.voiceServ.onBeforeFinishTalk=()=>{this.fmodeChat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=()=>{console.log("onAfterFinishTalk"),this.fmodeChat.userInput=this.voiceServ?.resultText,this.sendMessage(),this.startASRAwake()}}async sendMessage(){if(!this.fmodeChat.userInput){return this.errorText="内容不能为空",void(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}this.fmodeChat?.sendMessage(this.voiceServ.resultText,null,(t=>{}),{onSSMLComplete:t=>{console.log(t)}}),this.fmodeChat.userInput="",this.fmodeChat.userImage=""}testTTS(t){console.log(t),t=t||"你好呀,我是飞马小智!很高兴为您介绍脑控科技的发展历程。我们成立于2019年",new this.voiceServ.webSpeech(this.platform).speak(t)}testXunfeiTTS(){}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,deps:[{token:i1.Platform},{token:i2.Router},{token:i3.FmodeVoiceService},{token:i1.ToastController},{token:i4.NovaCloudService},{token:i5.ChatService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalChatVoiceInputComponent,isStandalone:!0,selector:"fm-modal-chat-voice-input",inputs:{fmodeChat:"fmodeChat",talkMode:"talkMode"},providers:[FmodeVoiceService],ngImport:i0,template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i1.IonFab,selector:"ion-fab",inputs:["activated","edge","horizontal","vertical"]},{kind:"component",type:i1.IonFabButton,selector:"ion-fab-button",inputs:["activated","closeIcon","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","show","size","target","translucent","type"]},{kind:"component",type:i1.IonFabList,selector:"ion-fab-list",inputs:["activated","side"]},{kind:"component",type:i1.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"ngmodule",type:RouterModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,decorators:[{type:Component,args:[{selector:"fm-modal-chat-voice-input",standalone:!0,imports:[CommonModule,IonicModule,RouterModule],providers:[FmodeVoiceService],template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n']}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Router},{type:i3.FmodeVoiceService},{type:i1.ToastController},{type:i4.NovaCloudService},{type:i5.ChatService}],propDecorators:{fmodeChat:[{type:Input}],talkMode:[{type:Input}]}});
8
+ import{Component,Input}from"@angular/core";import{CommonModule}from"@angular/common";import{ToastController}from"@ionic/angular";import{Router,RouterModule}from"@angular/router";import{IonicModule,Platform}from"@ionic/angular";import{FmodeVoiceService}from"../../voice";import{FmodeChat,ChatService}from"../../service-fmai/service-chat";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@angular/router";import*as i3 from"../../../nova-cloud/nova-cloud.service";import*as i4 from"../../service-fmai/service-chat";import*as i5 from"@awesome-cordova-plugins/diagnostic/ngx";import*as i6 from"@angular/common";export class ModalChatVoiceInputComponent{constructor(t,o,e,n,i,a){this.platform=t,this.router=o,this.toastCtrl=e,this.ncloud=n,this.chatServ=i,this.diagnostic=a,this.talkMode="click",this.talkTips="点击话筒开始讲话",this.errorText="",this.player=new Audio,this.voiceServ=new FmodeVoiceService(this.platform,this.diagnostic)}ngOnInit(){"press"==this.talkMode&&(this.talkTips="轻触底部开始讲话"),setTimeout((()=>{this.initVoiceSevice(),this.initVoiceASR()}),500)}async initVoiceASR(){this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge(),this.startASRAwake()}))}async startASRAwake(){await this.voiceServ.openWithPriviledge(),new this.voiceServ.webSpeech(this.platform).startRecognition("Nihao | Hello")}playMusic(t){this.player.src=`/assets/avatar/voice/${t}.mp3`,this.player.play()}initVoiceSevice(){this.fmodeChat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.fmodeChat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.fmodeChat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{this.startASRAwake()},this.voiceServ.onBeforeFinishTalk=()=>{this.fmodeChat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=()=>{console.log("onAfterFinishTalk"),this.fmodeChat.userInput=this.voiceServ?.resultText,this.sendMessage(),this.startASRAwake()}}async sendMessage(){if(!this.fmodeChat.userInput){return this.errorText="内容不能为空",void(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}this.fmodeChat?.sendMessage(this.voiceServ.resultText,null,(t=>{}),{onSSMLComplete:t=>{console.log(t)}}),this.fmodeChat.userInput="",this.fmodeChat.userImage=""}testTTS(t){console.log(t),t=t||"你好呀,我是飞马小智!很高兴为您介绍脑控科技的发展历程。我们成立于2019年",new this.voiceServ.webSpeech(this.platform).speak(t)}testXunfeiTTS(){}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,deps:[{token:i1.Platform},{token:i2.Router},{token:i1.ToastController},{token:i3.NovaCloudService},{token:i4.ChatService},{token:i5.Diagnostic}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalChatVoiceInputComponent,isStandalone:!0,selector:"fm-modal-chat-voice-input",inputs:{fmodeChat:"fmodeChat",talkMode:"talkMode"},providers:[],ngImport:i0,template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i1.IonFab,selector:"ion-fab",inputs:["activated","edge","horizontal","vertical"]},{kind:"component",type:i1.IonFabButton,selector:"ion-fab-button",inputs:["activated","closeIcon","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","show","size","target","translucent","type"]},{kind:"component",type:i1.IonFabList,selector:"ion-fab-list",inputs:["activated","side"]},{kind:"component",type:i1.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"ngmodule",type:RouterModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,decorators:[{type:Component,args:[{selector:"fm-modal-chat-voice-input",standalone:!0,imports:[CommonModule,IonicModule,RouterModule],providers:[],template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n']}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Router},{type:i1.ToastController},{type:i3.NovaCloudService},{type:i4.ChatService},{type:i5.Diagnostic}],propDecorators:{fmodeChat:[{type:Input}],talkMode:[{type:Input}]}});
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9tb2RhbC1jaGF0LXZvaWNlLWlucHV0L21vZGFsLWNoYXQtdm9pY2UtaW5wdXQuY29tcG9uZW50Lm1qcw==`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs
7
7
  */
8
- import{CommonModule}from"@angular/common";import{Component,Input}from"@angular/core";import{IonButtons,IonCard,IonHeader,IonIcon,IonButton,IonItem,IonLabel,IonList,IonNote,IonTitle,IonToolbar,IonModal,NavController,IonAvatar}from"@ionic/angular/standalone";import{CompAvatarRoleImageComponent}from"../../avatar";import{CompAvatarRoleVideoComponent}from"../../avatar";import{FmodeChat}from"../../service-fmai/service-chat";import{addIcons}from"ionicons";import{chevronBackOutline,ellipsisHorizontalOutline}from"ionicons/icons";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular/standalone";import*as i2 from"@angular/common";addIcons({chevronBackOutline:chevronBackOutline,ellipsisHorizontalOutline:ellipsisHorizontalOutline});export class FmChatHeaderArea{constructor(n){this.navCtrl=n,this.isModalOpen=!1,this.goBack=()=>{this.navCtrl.back()}}async back(){if(this.chat?.onClose){if(!await(this.chat?.onClose(this.chat)))return}this.goBack()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,deps:[{token:i1.NavController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:FmChatHeaderArea,isStandalone:!0,selector:"fm-chat-header-area",inputs:{chat:"chat",goBack:"goBack"},ngImport:i0,template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i2.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonModal,selector:"ion-modal"},{kind:"component",type:IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonCard,selector:"ion-card",inputs:["button","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"component",type:CompAvatarRoleImageComponent,selector:"fm-avatar-role-image",inputs:["fmodeChat","role"]},{kind:"component",type:CompAvatarRoleVideoComponent,selector:"fm-avatar-role-video",inputs:["fmodeChat","role"],outputs:["onClose"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,decorators:[{type:Component,args:[{selector:"fm-chat-header-area",standalone:!0,imports:[CommonModule,IonToolbar,IonButtons,IonButton,IonIcon,IonModal,IonAvatar,IonTitle,IonHeader,IonList,IonItem,IonCard,IonLabel,IonNote,CompAvatarRoleImageComponent,CompAvatarRoleVideoComponent],template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"]}]}],ctorParameters:()=>[{type:i1.NavController}],propDecorators:{chat:[{type:Input}],goBack:[{type:Input}]}});
8
+ import{CommonModule}from"@angular/common";import{Component,Input}from"@angular/core";import{IonButtons,IonCard,IonHeader,IonIcon,IonButton,IonItem,IonLabel,IonList,IonNote,IonTitle,IonToolbar,IonModal,NavController,IonAvatar}from"@ionic/angular/standalone";import{CompAvatarRoleImageComponent}from"../../avatar";import{CompAvatarRoleVideoComponent}from"../../avatar";import{FmodeChat}from"../../service-fmai/service-chat";import{addIcons}from"ionicons";import{chevronBackOutline,ellipsisHorizontalOutline}from"ionicons/icons";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular/standalone";import*as i2 from"@angular/common";addIcons({chevronBackOutline:chevronBackOutline,ellipsisHorizontalOutline:ellipsisHorizontalOutline});export class FmChatHeaderArea{constructor(n){this.navCtrl=n,this.isModalOpen=!1,this.goBack=()=>{this.navCtrl.back()}}async back(){if(this.chat?.onClose){if(!await(this.chat?.onClose(this.chat)))return}this.goBack()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,deps:[{token:i1.NavController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:FmChatHeaderArea,isStandalone:!0,selector:"fm-chat-header-area",inputs:{chat:"chat",goBack:"goBack"},ngImport:i0,template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img style="width:100%" [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i2.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonModal,selector:"ion-modal"},{kind:"component",type:IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonCard,selector:"ion-card",inputs:["button","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"component",type:CompAvatarRoleImageComponent,selector:"fm-avatar-role-image",inputs:["fmodeChat","role"]},{kind:"component",type:CompAvatarRoleVideoComponent,selector:"fm-avatar-role-video",inputs:["fmodeChat","role"],outputs:["onClose"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,decorators:[{type:Component,args:[{selector:"fm-chat-header-area",standalone:!0,imports:[CommonModule,IonToolbar,IonButtons,IonButton,IonIcon,IonModal,IonAvatar,IonTitle,IonHeader,IonList,IonItem,IonCard,IonLabel,IonNote,CompAvatarRoleImageComponent,CompAvatarRoleVideoComponent],template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img style="width:100%" [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"]}]}],ctorParameters:()=>[{type:i1.NavController}],propDecorators:{chat:[{type:Input}],goBack:[{type:Input}]}});
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1oZWFkZXItYXJlYS9jb21wLWhlYWRlci1hcmVhLmNvbXBvbmVudC5tanM=`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs
7
7
  */
8
- import{Component,Input}from"@angular/core";import{IonButton,IonIcon,IonSpinner,ModalController,ToastController}from"@ionic/angular/standalone";import{FmodeVoiceService}from"../../../voice/fmode-voice.service";import{FmodeChat}from"../../../service-fmai/service-chat";import{CommonModule}from"@angular/common";import{NovaUploadService}from"../../../../storage/service-upload/nova-upload.service";import Parse from"parse";import*as i0 from"@angular/core";import*as i1 from"../../../voice/fmode-voice.service";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../../../storage/service-upload/nova-upload.service";import*as i4 from"@angular/common";export class ModalAudioMessageComponent{constructor(e,i,t){this.voiceServ=e,this.toastCtrl=i,this.uploadServ=t,this.isRecording=!1,this.player=new Audio,this.durationStr="0:00"}ngOnInit(){this.chat.userInput="",this.initVoiceSevice(),this.voiceServ.startTalk()}playMusic(e){this.player||(this.player=new Audio),this.player.src=`/assets/avatar/voice/${e}.mp3`;try{this.player?.play()}catch(e){}}initVoiceSevice(){this.chat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.chat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onAfterRecordStart=()=>{this.isRecording=!0},this.voiceServ.onDurationStrChange=e=>{this.durationStr=e},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.chat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{},this.voiceServ.onBeforeFinishTalk=()=>{this.chat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=async()=>{console.log("onAfterFinishTalk1",this.voiceServ?.resultText),console.log("onAfterFinishTalk2",this.voiceServ?.resultTextTemp),this.chat.userInput=""+(this.voiceServ?.resultTextTemp||this.voiceServ?.resultText),this.chat?.userInput&&await this.saveChatVoice(),this.sendMessage()}}async saveChatVoice(){let e=this.voiceServ.recordWavBlob,i=this.voiceServ.recordDuration;if(e){let t=Parse.Object.extend("ChatVoice");this.chatVoice=new t,this.chatVoice.set("content",this.chat.userInput),this.chatVoice.set("role","user"),this.chatVoice.set("duration",i);let n=localStorage.getItem("company");n&&this.chatVoice.set("company",{__type:"Pointer",className:"Company",objectId:n}),Parse.User.current()?.id&&this.chatVoice.set("user",Parse.User.current().toPointer());let o=this.chatVoice?.id||this.uploadServ?.genMd5(this.chatVoice?.get("content")||this.chatVoice?.get("ssml")),a=new Date,s=o+a.getFullYear()+(a.getMonth()+1)+a.getDate()+a.getHours()+a.getMinutes()+a.getSeconds()+".wav",r=new File([e],s,{type:"audio/wav"}),c=await this.uploadServ.upload(r,(e=>{console.log(e)})),d={__type:"Pointer",className:"Attachment",objectId:c?.id};d?.objectId&&(this.chatVoice.set("voiceFile",d),this.chatVoice=await this.chatVoice.save())}}async sendMessage(){if(this.chat.userInput)this.chat?.sendMessage(""+this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}},{id:this.chatVoice?.id,duration:this.chatVoice?.get("duration")});else{(await this.toastCtrl.create({message:"内容不能为空",position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}}cancel(){this.clear(),this.voiceServ.cancelTalk(),this.modal?.dismiss(null,"cancel")}send(){this.clear(),this.voiceServ.finishTalk(),this.modal?.dismiss(null,"send")}clear(){this.now=void 0,this.isRecording=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,deps:[{token:i1.FmodeVoiceService},{token:i2.ToastController},{token:i3.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalAudioMessageComponent,isStandalone:!0,selector:"fm-modal-audio-message",inputs:{chat:"chat",modal:"modal"},providers:[ModalController],ngImport:i0,template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i4.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonSpinner,selector:"ion-spinner",inputs:["color","duration","name","paused"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,decorators:[{type:Component,args:[{selector:"fm-modal-audio-message",standalone:!0,imports:[CommonModule,IonButton,IonIcon,IonSpinner],providers:[ModalController],template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"]}]}],ctorParameters:()=>[{type:i1.FmodeVoiceService},{type:i2.ToastController},{type:i3.NovaUploadService}],propDecorators:{chat:[{type:Input}],modal:[{type:Input}]}});
8
+ import{Component,Input}from"@angular/core";import{IonButton,IonIcon,IonSpinner,ModalController,Platform,ToastController}from"@ionic/angular/standalone";import{FmodeVoiceService}from"../../../voice/fmode-voice.service";import{FmodeChat}from"../../../service-fmai/service-chat";import{CommonModule}from"@angular/common";import{NovaUploadService}from"../../../../storage/service-upload/nova-upload.service";import Parse from"parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular/standalone";import*as i2 from"../../../../storage/service-upload/nova-upload.service";import*as i3 from"@awesome-cordova-plugins/diagnostic/ngx";import*as i4 from"@angular/common";export class ModalAudioMessageComponent{constructor(e,i,t,n){this.toastCtrl=e,this.uploadServ=i,this.platform=t,this.diagnostic=n,this.isRecording=!1,this.player=new Audio,this.durationStr="0:00",this.voiceServ=new FmodeVoiceService(this.platform,this.diagnostic)}ngOnInit(){this.chat.userInput="",this.initVoiceSevice(),this.voiceServ.startTalk()}playMusic(e){this.player||(this.player=new Audio),this.player.src=`/assets/avatar/voice/${e}.mp3`;try{this.player?.play()}catch(e){}}initVoiceSevice(){this.chat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.chat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onAfterRecordStart=()=>{this.isRecording=!0},this.voiceServ.onDurationStrChange=e=>{this.durationStr=e},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.chat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{},this.voiceServ.onBeforeFinishTalk=()=>{this.chat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=async()=>{console.log("onAfterFinishTalk1",this.voiceServ?.resultText),console.log("onAfterFinishTalk2",this.voiceServ?.resultTextTemp),this.chat.userInput=""+(this.voiceServ?.resultTextTemp||this.voiceServ?.resultText),this.chat?.userInput&&await this.saveChatVoice(),this.sendMessage()}}async saveChatVoice(){let e=this.voiceServ.recordWavBlob,i=this.voiceServ.recordDuration;if(e){let t=Parse.Object.extend("ChatVoice");this.chatVoice=new t,this.chatVoice.set("content",this.chat.userInput),this.chatVoice.set("role","user"),this.chatVoice.set("duration",i);let n=localStorage.getItem("company");n&&this.chatVoice.set("company",{__type:"Pointer",className:"Company",objectId:n}),Parse.User.current()?.id&&this.chatVoice.set("user",Parse.User.current().toPointer());let o=this.chatVoice?.id||this.uploadServ?.genMd5(this.chatVoice?.get("content")||this.chatVoice?.get("ssml")),a=new Date,s=o+a.getFullYear()+(a.getMonth()+1)+a.getDate()+a.getHours()+a.getMinutes()+a.getSeconds()+".wav",r=new File([e],s,{type:"audio/wav"}),c=await this.uploadServ.upload(r,(e=>{console.log(e)})),d={__type:"Pointer",className:"Attachment",objectId:c?.id};d?.objectId&&(this.chatVoice.set("voiceFile",d),this.chatVoice=await this.chatVoice.save())}}async sendMessage(){if(this.chat.userInput)this.chat?.sendMessage(""+this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}},{id:this.chatVoice?.id,duration:this.chatVoice?.get("duration")});else{(await this.toastCtrl.create({message:"内容不能为空",position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}}cancel(){this.clear(),this.voiceServ.cancelTalk(),this.modal?.dismiss(null,"cancel")}send(){this.clear(),this.voiceServ.finishTalk(),this.modal?.dismiss(null,"send")}clear(){this.now=void 0,this.isRecording=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,deps:[{token:i1.ToastController},{token:i2.NovaUploadService},{token:i1.Platform},{token:i3.Diagnostic}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalAudioMessageComponent,isStandalone:!0,selector:"fm-modal-audio-message",inputs:{chat:"chat",modal:"modal"},providers:[ModalController],ngImport:i0,template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i4.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonSpinner,selector:"ion-spinner",inputs:["color","duration","name","paused"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalAudioMessageComponent,decorators:[{type:Component,args:[{selector:"fm-modal-audio-message",standalone:!0,imports:[CommonModule,IonButton,IonIcon,IonSpinner],providers:[ModalController],template:'\x3c!-- <div style="background:#FFFFFF;color:#000000;width:100%">\n {{this.chat.userInput}}\n</div> --\x3e\n<div class="modal-area">\n\n \x3c!-- 加载WebSockets动画 --\x3e\n <ng-container *ngIf="!isRecording">\n <div class="row">\n <ion-spinner name="crescent" color="success" style="width:80px;height:80px;"></ion-spinner>\n </div>\n </ng-container>\n \x3c!-- 录音中动画 --\x3e\n <ng-container *ngIf="isRecording">\n <div class="actions row">\n \x3c!-- 取消 --\x3e\n <ion-button (click)="cancel()" size="large" shape="round" color="light">\n <ion-icon name="close-outline"></ion-icon>\n </ion-button>\n \x3c!-- 音频 --\x3e\n <div class="audio-input">\n <div class="timer row">\n {{durationStr || "00:00"}}\n </div>\n <div class="audio-wave row">\n <div class="audio">\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n <div class="wave"></div>\n </div>\n </div>\n </div>\n \x3c!-- 发送 --\x3e\n <ion-button (click)="send()" size="large" shape="round" color="success">\n <ion-icon name="send-outline"></ion-icon>\n </ion-button>\n </div>\n \n <div class="tips row">\n 请您讲话,AI会识别!\n </div>\n </ng-container>\n</div>',styles:[":host-context(body.dark) .modal-area{color:#fff}.modal-area{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding-top:15px}.modal-area .row{margin:10px}.modal-area .tips{padding-top:5px}.modal-area .timer{font-size:1.5rem;font-weight:700}.modal-area .actions{display:flex;justify-content:space-around;width:100%;height:86px}.audio-input{display:flex;flex-direction:column;justify-content:center;align-items:center}.audio{display:flex;justify-content:space-between;align-items:center;gap:8px;width:60px;height:40px}.audio .wave{height:40px;display:block;width:10px;height:6px;border-radius:8px;background:orange}.audio .wave{animation:audio-wave 2s ease-in-out infinite}.audio .wave:nth-child(1){animation-delay:.1s}.audio .wave:nth-child(2){animation-delay:.2s}.audio .wave:nth-child(3){animation-delay:.3s}.audio .wave:nth-child(4){animation-delay:.4s}.audio .wave:nth-child(5){animation-delay:.5s}@keyframes audio-wave{0%{height:6px;transform:translateY(0);background:#ff8e3a}25%{height:6px;transform:translateY(0);background:#9c73f8}50%{height:30px;transform:translateY(-5px) scaleY(1.5);background:#ed509e}75%{height:6px;transform:translateY(0);background:#9c73f8}to{height:6px;transform:translateY(0);background:#0fccce}}\n"]}]}],ctorParameters:()=>[{type:i1.ToastController},{type:i2.NovaUploadService},{type:i1.Platform},{type:i3.Diagnostic}],propDecorators:{chat:[{type:Input}],modal:[{type:Input}]}});
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1tb2RhbC1pbnB1dC9tb2RhbC1hdWRpby1tZXNzYWdlL21vZGFsLWF1ZGlvLW1lc3NhZ2UuY29tcG9uZW50Lm1qcw==`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/index.mjs
7
7
  */
8
- export*from"./service-fmai/fmai.service";export*from"./service-fmai/service-imagine";export*from"./service-fmai/service-chat";export*from"./comp-markdown-preview/plugins/md-mathjax/index";export*from"./comp-markdown-preview/markdown-parse";export*from"./comp-markdown-preview/markdown-preview.module";export*from"./comp-markdown-preview/markdown-preview.component";export*from"./comp-markdown-preview/clipboard.service";export*from"./voice";export*from"./avatar";export*from"./agent";export*from"./chat";
8
+ export*from"./service-fmai/fmai.service";export*from"./service-fmai/service-imagine";export*from"./service-fmai/service-chat";export*from"./comp-markdown-preview/plugins/md-mathjax/index";export*from"./comp-markdown-preview/markdown-parse";export*from"./comp-markdown-preview/markdown-preview.module";export*from"./comp-markdown-preview/markdown-preview.component";export*from"./comp-markdown-preview/clipboard.service";export*from"./voice";export*from"./avatar";export*from"./agent";export*from"./chat";export*from"./story";
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2luZGV4Lm1qcw==`
10
10
 
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs
7
+ */
8
+ import{Component,Input}from"@angular/core";import{MatButtonModule}from"@angular/material/button";import{DomSanitizer}from"@angular/platform-browser";import{IonIcon,ModalController}from"@ionic/angular/standalone";import{NzPipesModule}from"ng-zorro-antd/pipes";import{FiletypePipe}from"../../../icon";import Parse from"parse";import*as i0 from"@angular/core";import*as i1 from"@angular/platform-browser";import*as i2 from"@ionic/angular/standalone";import*as i3 from"@angular/material/button";import*as i4 from"ng-zorro-antd/pipes";export class FmOfficeViewerComponent{constructor(e,t){this.domSan=e,this.modalCtrl=t,this.officeHost="https://office.fmode.cn/browser/baa6eef/cool.html",this.wopiHost="https://server.fmode.cn/api/office",this.permission="readonly",this.showHeader=!1}back(){this.modalCtrl.dismiss()}ngOnInit(){this.genSafeUrl()}genSafeUrl(){if(this.fileId){let e=`${this.officeHost}?lang=zh-cn&permission=${this.permission}&WOPISrc=${this.wopiHost}/wopi/files/${this.fileId}`;this.safeUrl=this.domSan.bypassSecurityTrustResourceUrl(e),this.loadAttachment(this.fileId)}}async loadAttachment(e){let t=new Parse.Query("Attachment");this.attach=await t.get(e)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmOfficeViewerComponent,deps:[{token:i1.DomSanitizer},{token:i2.ModalController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmOfficeViewerComponent,isStandalone:!0,selector:"fm-office-viewer",inputs:{officeHost:"officeHost",wopiHost:"wopiHost",fileId:"fileId",permission:"permission",showHeader:"showHeader"},ngImport:i0,template:'@if(showHeader&&attach?.id){\n <div class="filebar">\n \x3c!-- 文件信息 --\x3e\n <div class="file-info" style="display:flex;align-items:center;">\n \x3c!-- 图标+大小 --\x3e\n <ion-icon [src]="attach?.get(\'url\') | filetype"></ion-icon>\n <span class="size">{{attach?.get("size") | nzBytes }}</span>\n </div>\n \x3c!-- 标题 --\x3e\n <div class="title">\n {{attach?.get("name") || \'未命名\'}}\n </div>\n \x3c!-- 操作区域 --\x3e\n <div class="actions" style="display:flex;align-items:center;justify-content: flex-end;">\n \x3c!-- 关闭 --\x3e\n <button mat-button (click)="back()" aria-label="预览">\n 关闭\n </button>\n </div>\n </div>\n}\n@if(safeUrl){\n <iframe [src]="safeUrl" frameborder="0" allow="clipboard-read *; clipboard-write *"></iframe> \n}',styles:["iframe{width:100%;height:100%}.filebar{display:flex;justify-content:space-between;align-items:center;padding:5px 15px}.filebar .file-info{max-width:80px}.filebar .title{flex:1;font-weight:700;margin-left:5px;margin-right:5px;max-width:220px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding:5px 15px;text-align:center}.filebar mat-card-content{color:#333}.filebar ion-icon{font-size:28px;min-width:30px}.filebar ion-chip{color:#333}.filebar .actions{max-width:104px}\n"],dependencies:[{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i3.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"ngmodule",type:NzPipesModule},{kind:"pipe",type:i4.NzBytesPipe,name:"nzBytes"},{kind:"pipe",type:FiletypePipe,name:"filetype"}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmOfficeViewerComponent,decorators:[{type:Component,args:[{selector:"fm-office-viewer",standalone:!0,imports:[IonIcon,MatButtonModule,NzPipesModule,FiletypePipe],template:'@if(showHeader&&attach?.id){\n <div class="filebar">\n \x3c!-- 文件信息 --\x3e\n <div class="file-info" style="display:flex;align-items:center;">\n \x3c!-- 图标+大小 --\x3e\n <ion-icon [src]="attach?.get(\'url\') | filetype"></ion-icon>\n <span class="size">{{attach?.get("size") | nzBytes }}</span>\n </div>\n \x3c!-- 标题 --\x3e\n <div class="title">\n {{attach?.get("name") || \'未命名\'}}\n </div>\n \x3c!-- 操作区域 --\x3e\n <div class="actions" style="display:flex;align-items:center;justify-content: flex-end;">\n \x3c!-- 关闭 --\x3e\n <button mat-button (click)="back()" aria-label="预览">\n 关闭\n </button>\n </div>\n </div>\n}\n@if(safeUrl){\n <iframe [src]="safeUrl" frameborder="0" allow="clipboard-read *; clipboard-write *"></iframe> \n}',styles:["iframe{width:100%;height:100%}.filebar{display:flex;justify-content:space-between;align-items:center;padding:5px 15px}.filebar .file-info{max-width:80px}.filebar .title{flex:1;font-weight:700;margin-left:5px;margin-right:5px;max-width:220px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding:5px 15px;text-align:center}.filebar mat-card-content{color:#333}.filebar ion-icon{font-size:28px;min-width:30px}.filebar ion-chip{color:#333}.filebar .actions{max-width:104px}\n"]}]}],ctorParameters:()=>[{type:i1.DomSanitizer},{type:i2.ModalController}],propDecorators:{officeHost:[{type:Input}],wopiHost:[{type:Input}],fileId:[{type:Input}],permission:[{type:Input}],showHeader:[{type:Input}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLW9mZmljZS12aWV3ZXIvZm0tb2ZmaWNlLXZpZXdlci5jb21wb25lbnQubWpz`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs
7
+ */
8
+ import{Component,EventEmitter,Input,Output}from"@angular/core";import{MatCardModule}from"@angular/material/card";import{MatButtonModule}from"@angular/material/button";import{MatProgressBarModule}from"@angular/material/progress-bar";import{AgentStory}from"../../../core";import{NgIf}from"@angular/common";import{IonChip,IonIcon}from"@ionic/angular/standalone";import{MatCheckboxModule}from"@angular/material/checkbox";import{NzPipesModule}from"ng-zorro-antd/pipes";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{MatIconModule}from"@angular/material/icon";import{FiletypePipe}from"../../../icon/filetype";import*as i0 from"@angular/core";import*as i1 from"@angular/forms";import*as i2 from"@angular/material/card";import*as i3 from"@angular/material/button";import*as i4 from"@angular/material/progress-bar";import*as i5 from"@angular/material/checkbox";import*as i6 from"@angular/material/icon";import*as i7 from"ng-zorro-antd/pipes";export class FmStoryCardComponent{get checked(){return this._checked}set checked(t){this.checkedChange.emit(t),this._checked=t}constructor(){this.isSelectMode=!1,this._checked=!1,this.checkedChange=new EventEmitter,this.onCheckStory=new EventEmitter,this.onPreviewStory=new EventEmitter,this.onDestoryStory=new EventEmitter,this.colorMap={chat:"#673ab7",diary:"#1179ff",document:"#00c80c"}}checkStory(t,e){this.checked=e,this.onCheckStory.emit({agentStory:t,event:e})}previewStory(t){this.onPreviewStory.emit(t)}destroyStory(t){this.onDestoryStory.emit(t)}ngOnInit(){this.agentStory=new AgentStory(this.story,this.story?.get("person"),this.story?.get("book"))}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryCardComponent,deps:[],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryCardComponent,isStandalone:!0,selector:"fm-story-card",inputs:{story:"story",isSelectMode:"isSelectMode",_checked:["checked","_checked"]},outputs:{checkedChange:"checkedChange",onCheckStory:"onCheckStory",onPreviewStory:"onPreviewStory",onDestoryStory:"onDestoryStory"},ngImport:i0,template:'<mat-card class="story-card">\n <mat-card-header>\n \x3c!-- 新故事卡片标题 --\x3e\n <ng-container *ngIf="!agentStory?.story?.get(\'attach\') && !agentStory?.story?.get(\'chatSession\')"> \n <mat-card-subtitle>{{ 0 | nzBytes: 0 : \'B\' : \'MB\' }}</mat-card-subtitle>\n <mat-card-title>新故事</mat-card-title>\n </ng-container>\n \x3c!-- 附件故事卡片标题 + 对话故事卡片标题 --\x3e\n\n <mat-card-subtitle>\n <div class="filebar">\n \x3c!-- 文件信息 --\x3e\n <div class="file-info" style="display:flex;align-items:center;">\n \x3c!-- 图标+大小 --\x3e\n @if(agentStory?.story?.get(\'attach\')){\n <ion-icon [src]="agentStory?.story?.get(\'attach\')?.get(\'url\') | filetype"></ion-icon>\n <span class="size">{{agentStory?.story?.get("attach")?.get("size") | nzBytes }}</span>\n }\n @if(agentStory?.story?.get(\'chatSession\')?.id){\n <ion-icon [src]="\'.chat\'|filetype"></ion-icon>\n <span class="size">{{agentStory?.story?.get("chatSession")?.get("messageList")?.length }}条</span>\n }\n </div>\n \x3c!-- 标题 --\x3e\n <div class="title">\n @if(agentStory?.story?.get(\'attach\')){\n {{agentStory?.story?.get("attach")?.get("name")}}\n }\n @if(agentStory?.story?.get(\'chatSession\')?.id){\n {{agentStory?.story?.get("title")}}\n }\n </div>\n \x3c!-- 操作区域 --\x3e\n <div class="actions" style="display:flex;align-items:center;justify-content: flex-end;">\n \x3c!-- 预览 --\x3e\n <button mat-button (click)="previewStory(agentStory)" aria-label="预览">\n 预览\n </button>\n \x3c!-- 选择 --\x3e\n <mat-checkbox *ngIf="isSelectMode"\n [ngModel]="checked" (ngModelChange)="checkStory(agentStory,$event)"\n [labelPosition]="\'before\'">\n </mat-checkbox>\n </div>\n </div>\n </mat-card-subtitle>\n \x3c!-- <mat-card-title></mat-card-title> --\x3e\n </mat-card-header>\n <mat-card-content>\n {{agentStory?.story?.get("desc")}}\n \x3c!-- <p>This card has divider and indeterminate progress as footer</p>\n <p>----</p>\n <mat-divider></mat-divider> --\x3e\n <ng-container>\n <br/>\n <div style="width:100%;display:flex;flex:1;flex-wrap:wrap;overflow-x:auto;align-items: center;justify-content: space-between;">\n <div style="display:flex;flex-wrap:wrap;max-width: calc(100% - 50px);">\n @if(agentStory?.story?.get(\'keywords\')?.length){\n @for(item of agentStory?.story?.get(\'keywords\'); track item){\n <ion-chip style="white-space:nowrap;" color="light" [outline]="true">#{{item}}</ion-chip>\n }\n }\n\n </div>\n \x3c!-- 删除 --\x3e\n @if(!isSelectMode){\n <button style="min-width:30px;" mat-icon-button color="warn" (click)="destroyStory(agentStory)" aria-label="删除">\n <mat-icon>delete</mat-icon>\n </button>\n }\n\n </div>\n </ng-container>\n </mat-card-content>\n <mat-card-actions *ngIf="false">\n \x3c!-- <button mat-button color="primary" (click)="previewStory(agentStory)">预览</button> --\x3e\n \x3c!-- <button *ngIf="isSelectMode" mat-button [color]="checked?\'warn\':\'primary\'" (click)="checkStory(agentStory,!checked)">{{checked?\'取消\':\'选择\'}}</button> --\x3e\n \x3c!-- <button *ngIf="!isSelectMode" mat-button color="primary" (click)="previewStory(agentStory)">学习</button> --\x3e\n \x3c!-- <button *ngIf="!isSelectMode" mat-button color="warn" (click)="destroyStory(agentStory)">删除</button> --\x3e\n </mat-card-actions>\n <mat-card-footer>\n \x3c!-- [color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" --\x3e\n <mat-progress-bar [style.--mdc-linear-progress-active-indicator-color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" *ngIf="!agentStory?.story?.get(\'attach\')?.id && !agentStory?.story?.get(\'chatSession\')?.id" mode="buffer" [value]="10" [bufferValue]="20"></mat-progress-bar>\n <mat-progress-bar [style.--mdc-linear-progress-active-indicator-color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" *ngIf="agentStory?.story?.get(\'attach\')?.id || agentStory?.story?.get(\'chatSession\')?.id" mode="determinate" [value]="100" ></mat-progress-bar>\n </mat-card-footer>\n</mat-card>',styles:[":host-context(body.dark) .story-card .title{color:#fff}:host-context(body.dark) .story-card mat-card-content{color:#ccc}:host-context(body.dark) .story-card ion-chip{color:#ccc}:host-context(body.dark) .story-card .file-info,:host-context(body.dark) .story-card button{color:#ccc}.story-card{border-radius:10px}.story-card .filebar{display:flex;justify-content:space-between;align-items:center}.story-card .filebar .file-info{max-width:80px}.story-card .filebar .title{flex:1;font-weight:700;margin-left:5px;margin-right:5px;max-width:220px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:1.2rem;font-weight:400}.story-card .filebar mat-card-content{color:#333}.story-card .filebar ion-chip{color:#333}.story-card .filebar .actions{max-width:104px}.story-card .size{min-width:40px}.story-card ion-icon{font-size:28px;min-width:30px}.story-card ion-chip{font-size:12px;padding:0 5px}.story-card mat-card-header{flex-direction:column}.story-card mat-card-footer{padding-top:10px;border-radius:10px;overflow:hidden}\n"],dependencies:[{kind:"directive",type:NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i1.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i1.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"component",type:IonChip,selector:"ion-chip",inputs:["color","disabled","mode","outline"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"ngmodule",type:MatCardModule},{kind:"component",type:i2.MatCard,selector:"mat-card",inputs:["appearance"],exportAs:["matCard"]},{kind:"directive",type:i2.MatCardActions,selector:"mat-card-actions",inputs:["align"],exportAs:["matCardActions"]},{kind:"directive",type:i2.MatCardContent,selector:"mat-card-content"},{kind:"directive",type:i2.MatCardFooter,selector:"mat-card-footer"},{kind:"component",type:i2.MatCardHeader,selector:"mat-card-header"},{kind:"directive",type:i2.MatCardSubtitle,selector:"mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]"},{kind:"directive",type:i2.MatCardTitle,selector:"mat-card-title, [mat-card-title], [matCardTitle]"},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i3.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"component",type:i3.MatIconButton,selector:"button[mat-icon-button]",exportAs:["matButton"]},{kind:"ngmodule",type:MatProgressBarModule},{kind:"component",type:i4.MatProgressBar,selector:"mat-progress-bar",inputs:["color","value","bufferValue","mode"],outputs:["animationEnd"],exportAs:["matProgressBar"]},{kind:"ngmodule",type:MatCheckboxModule},{kind:"component",type:i5.MatCheckbox,selector:"mat-checkbox",inputs:["aria-label","aria-labelledby","aria-describedby","id","required","labelPosition","name","value","disableRipple","tabIndex","color","checked","disabled","indeterminate"],outputs:["change","indeterminateChange"],exportAs:["matCheckbox"]},{kind:"ngmodule",type:MatIconModule},{kind:"component",type:i6.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"ngmodule",type:NzPipesModule},{kind:"pipe",type:i7.NzBytesPipe,name:"nzBytes"},{kind:"pipe",type:FiletypePipe,name:"filetype"}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryCardComponent,decorators:[{type:Component,args:[{selector:"fm-story-card",standalone:!0,imports:[NgIf,FormsModule,ReactiveFormsModule,IonChip,IonIcon,MatCardModule,MatButtonModule,MatProgressBarModule,MatCheckboxModule,MatIconModule,NzPipesModule,FiletypePipe],template:'<mat-card class="story-card">\n <mat-card-header>\n \x3c!-- 新故事卡片标题 --\x3e\n <ng-container *ngIf="!agentStory?.story?.get(\'attach\') && !agentStory?.story?.get(\'chatSession\')"> \n <mat-card-subtitle>{{ 0 | nzBytes: 0 : \'B\' : \'MB\' }}</mat-card-subtitle>\n <mat-card-title>新故事</mat-card-title>\n </ng-container>\n \x3c!-- 附件故事卡片标题 + 对话故事卡片标题 --\x3e\n\n <mat-card-subtitle>\n <div class="filebar">\n \x3c!-- 文件信息 --\x3e\n <div class="file-info" style="display:flex;align-items:center;">\n \x3c!-- 图标+大小 --\x3e\n @if(agentStory?.story?.get(\'attach\')){\n <ion-icon [src]="agentStory?.story?.get(\'attach\')?.get(\'url\') | filetype"></ion-icon>\n <span class="size">{{agentStory?.story?.get("attach")?.get("size") | nzBytes }}</span>\n }\n @if(agentStory?.story?.get(\'chatSession\')?.id){\n <ion-icon [src]="\'.chat\'|filetype"></ion-icon>\n <span class="size">{{agentStory?.story?.get("chatSession")?.get("messageList")?.length }}条</span>\n }\n </div>\n \x3c!-- 标题 --\x3e\n <div class="title">\n @if(agentStory?.story?.get(\'attach\')){\n {{agentStory?.story?.get("attach")?.get("name")}}\n }\n @if(agentStory?.story?.get(\'chatSession\')?.id){\n {{agentStory?.story?.get("title")}}\n }\n </div>\n \x3c!-- 操作区域 --\x3e\n <div class="actions" style="display:flex;align-items:center;justify-content: flex-end;">\n \x3c!-- 预览 --\x3e\n <button mat-button (click)="previewStory(agentStory)" aria-label="预览">\n 预览\n </button>\n \x3c!-- 选择 --\x3e\n <mat-checkbox *ngIf="isSelectMode"\n [ngModel]="checked" (ngModelChange)="checkStory(agentStory,$event)"\n [labelPosition]="\'before\'">\n </mat-checkbox>\n </div>\n </div>\n </mat-card-subtitle>\n \x3c!-- <mat-card-title></mat-card-title> --\x3e\n </mat-card-header>\n <mat-card-content>\n {{agentStory?.story?.get("desc")}}\n \x3c!-- <p>This card has divider and indeterminate progress as footer</p>\n <p>----</p>\n <mat-divider></mat-divider> --\x3e\n <ng-container>\n <br/>\n <div style="width:100%;display:flex;flex:1;flex-wrap:wrap;overflow-x:auto;align-items: center;justify-content: space-between;">\n <div style="display:flex;flex-wrap:wrap;max-width: calc(100% - 50px);">\n @if(agentStory?.story?.get(\'keywords\')?.length){\n @for(item of agentStory?.story?.get(\'keywords\'); track item){\n <ion-chip style="white-space:nowrap;" color="light" [outline]="true">#{{item}}</ion-chip>\n }\n }\n\n </div>\n \x3c!-- 删除 --\x3e\n @if(!isSelectMode){\n <button style="min-width:30px;" mat-icon-button color="warn" (click)="destroyStory(agentStory)" aria-label="删除">\n <mat-icon>delete</mat-icon>\n </button>\n }\n\n </div>\n </ng-container>\n </mat-card-content>\n <mat-card-actions *ngIf="false">\n \x3c!-- <button mat-button color="primary" (click)="previewStory(agentStory)">预览</button> --\x3e\n \x3c!-- <button *ngIf="isSelectMode" mat-button [color]="checked?\'warn\':\'primary\'" (click)="checkStory(agentStory,!checked)">{{checked?\'取消\':\'选择\'}}</button> --\x3e\n \x3c!-- <button *ngIf="!isSelectMode" mat-button color="primary" (click)="previewStory(agentStory)">学习</button> --\x3e\n \x3c!-- <button *ngIf="!isSelectMode" mat-button color="warn" (click)="destroyStory(agentStory)">删除</button> --\x3e\n </mat-card-actions>\n <mat-card-footer>\n \x3c!-- [color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" --\x3e\n <mat-progress-bar [style.--mdc-linear-progress-active-indicator-color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" *ngIf="!agentStory?.story?.get(\'attach\')?.id && !agentStory?.story?.get(\'chatSession\')?.id" mode="buffer" [value]="10" [bufferValue]="20"></mat-progress-bar>\n <mat-progress-bar [style.--mdc-linear-progress-active-indicator-color]="colorMap[agentStory?.story?.get(\'type\') || \'document\']" *ngIf="agentStory?.story?.get(\'attach\')?.id || agentStory?.story?.get(\'chatSession\')?.id" mode="determinate" [value]="100" ></mat-progress-bar>\n </mat-card-footer>\n</mat-card>',styles:[":host-context(body.dark) .story-card .title{color:#fff}:host-context(body.dark) .story-card mat-card-content{color:#ccc}:host-context(body.dark) .story-card ion-chip{color:#ccc}:host-context(body.dark) .story-card .file-info,:host-context(body.dark) .story-card button{color:#ccc}.story-card{border-radius:10px}.story-card .filebar{display:flex;justify-content:space-between;align-items:center}.story-card .filebar .file-info{max-width:80px}.story-card .filebar .title{flex:1;font-weight:700;margin-left:5px;margin-right:5px;max-width:220px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:1.2rem;font-weight:400}.story-card .filebar mat-card-content{color:#333}.story-card .filebar ion-chip{color:#333}.story-card .filebar .actions{max-width:104px}.story-card .size{min-width:40px}.story-card ion-icon{font-size:28px;min-width:30px}.story-card ion-chip{font-size:12px;padding:0 5px}.story-card mat-card-header{flex-direction:column}.story-card mat-card-footer{padding-top:10px;border-radius:10px;overflow:hidden}\n"]}]}],ctorParameters:()=>[],propDecorators:{story:[{type:Input}],isSelectMode:[{type:Input}],_checked:[{type:Input,args:["checked"]}],checkedChange:[{type:Output}],onCheckStory:[{type:Output}],onPreviewStory:[{type:Output}],onDestoryStory:[{type:Output}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWNhcmQvZm0tc3RvcnktY2FyZC5jb21wb25lbnQubWpz`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs
7
+ */
8
+ import{CommonModule}from"@angular/common";import{Component,EventEmitter,Inject,Input,Output}from"@angular/core";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{MatButtonModule}from"@angular/material/button";import{MatButtonToggleModule}from"@angular/material/button-toggle";import{MatCardModule}from"@angular/material/card";import{MatCheckboxModule}from"@angular/material/checkbox";import{MatDialog,MatDialogModule,MatDialogRef,MAT_DIALOG_DATA}from"@angular/material/dialog";import{MatDividerModule}from"@angular/material/divider";import{MatIconModule}from"@angular/material/icon";import{MatProgressBarModule}from"@angular/material/progress-bar";import{FmStoryCardComponent}from"../fm-story-card/fm-story-card.component";import Parse from"parse";import{AgentStory}from"../../../core";import{ActivatedRoute,Router}from"@angular/router";import{LoadingController}from"@ionic/angular";import{StoryService}from"../story.service";import{AlertController,IonAvatar,IonChip,IonContent,IonIcon,IonItem,IonItemDivider,IonItemGroup,IonLabel,IonPopover,ModalController,NavController}from"@ionic/angular/standalone";import{MatToolbarModule}from"@angular/material/toolbar";import{MatChipListbox,MatChipsModule}from"@angular/material/chips";import{avatarIcon}from"../../../icon/filetype";import{previewStoryMobile}from"./story-preview";import{addIcons}from"ionicons";import*as icons from"ionicons/icons";import{ChatService}from"../../service-fmai/service-chat/chat.service";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{NovaUploadService}from"../../../storage/service-upload/nova-upload.service";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular";import*as i3 from"@angular/material/dialog";import*as i4 from"../story.service";import*as i5 from"../../service-fmai/service-chat/chat.service";import*as i6 from"@ionic/angular/standalone";import*as i7 from"../../../nova-cloud/nova-cloud.service";import*as i8 from"../../../storage/service-upload/nova-upload.service";import*as i9 from"@angular/common";import*as i10 from"@angular/material/chips";import*as i11 from"@angular/material/button-toggle";import*as i12 from"@angular/material/button";import*as i13 from"@angular/material/icon";addIcons(icons);export class FmStoryListComponent{changeStoryType(t){this.storyType=t,this.loadStory()}cancel(){this.onCancel.emit(!0)}checkStory(t){let e=t?.story,o=t?.event;console.log(t),console.log(e,o),e?.story?.id&&(this.checkedMap[e?.story?.id]=o),this.selectCount=Object.values(this.checkedMap)?.filter((t=>t))?.length||0,this.onCountChange.emit(this.selectCount),this.calcSelectTokens()}async calcSelectTokens(){let t=await this.getAllSelectDocument(),e=t?.documentList||[];this.selectToken=0;let o=t?.storyList?.filter((t=>t.get("chatSession")));return e.forEach((t=>{let e=t?.get("pageContent")||"";e=e?.replaceAll("\n\n","\n"),this.selectToken+=1.5*e.length})),o.forEach((t=>{let e=t?.get("contentJson");e=JSON.stringify(e),e=e?.replaceAll("\n\n","\n"),console.log(e),this.selectToken+=1.5*e.length})),this.onTokenChange.emit(this.selectToken),this.selectToken}async confirmSelectedList(){let t=await this.getAllSelectDocument(),e=t?.documentList||[],o=t?.storyList||[];this.onConfirmSelect.emit({storyList:o,documentList:e})}async getAllSelectDocument(){let t=[],e=[];this.storyServ.storyList?.forEach((t=>{t?.story?.id&&this.checkedMap[t?.story?.id||"new"]&&e.push(t?.story)}));let o=e?.map((t=>t?.get("attach")?.get("md5")));if(o=o?.filter((t=>t)),o?.length){let e=new Parse.Query("Document");e.equalTo("type","entire"),e.limit(200),console.log("md5List",o),e.containedIn("md5",o),t=await e.find()}return{documentList:t,storyList:e}}constructor(t,e,o,n,i,a,r,l,s,c,p){this.route=t,this.loadingCtrl=e,this.dialog=o,this.router=n,this.storyServ=i,this.chatServ=a,this.alertCtrl=r,this.modalCtrl=l,this.navCtrl=s,this.ncloud=c,this.nupload=p,this.defaultAvatar=avatarIcon,this.isPreview=!1,this.currentTab="我的",this.height="100%",this.isSelectMode=!1,this.checkedMap={},this.selectCount=0,this.selectToken=0,this.onCancel=new EventEmitter,this.onCountChange=new EventEmitter,this.onTokenChange=new EventEmitter,this.onPreviewStory=new EventEmitter,this.storyType="",this.onConfirmSelect=new EventEmitter}async ngOnInit(){if(!this.person?.id||this.book?.id){let t=this.route.snapshot.params?.id||this.route?.parent?.snapshot?.params?.id;if(location?.pathname?.indexOf("editor/book")>-1){let e=new Parse.Query("Book");e.include("person"),this.book=await e.get(t),this.person=this.book.get("person")}if(location?.pathname?.indexOf("editor/person")>-1){let e=new Parse.Query("Person");this.person=await e.get(t)}}await this.loadStory(),0==this.storyServ.storyList?.length&&this.newStory()}getArticleDocList(){let t={},e=this.article?.get("outlineJson"),o=e?.sections;return o?.forEach((e=>{let o=e?.docList;o?.forEach((e=>{t[e]||(t[e]=!0,this.checkedMap[e]=!0)}))})),console.log(Object.keys(t)),Object.keys(t)||[]}async loadStory(){this.storyServ.storyList=[];let t,e=[];if(this.article?.id&&(t=await this.getArticleDocList(),t?.length&&e.push({objectId:{$in:t}})),this.person?.id&&"主角数据"==this.currentTab){let t={__type:"Pointer",className:"Person",objectId:this.person.id};e.push({person:t})}if(this.book?.id&&"主角数据"==this.currentTab){let t={__type:"Pointer",className:"Book",objectId:this.book.id};e.push({book:t})}if(Parse.User.current()?.id&&e.push({user:Parse.User.current()?.toPointer()}),!e?.length)return;let o=Parse.Query.fromJSON("Story",{where:{$or:e}});o.include("attach","chatSession","person"),this.storyType&&o.equalTo("type",this.storyType),"主角数据"==this.currentTab&&o.equalTo("person",this.person?.id),"书籍数据"==this.currentTab&&o.equalTo("book",this.book?.id),o.notEqualTo("isDeleted",!0),o.addDescending("createdAt");let n=await o.find();this.storyServ.storyList=n.map((t=>new AgentStory(t,void 0,void 0))),this.currentStory=this.storyServ.storyList?.[0],this.selectCount=Object.values(this.checkedMap)?.filter((t=>t))?.length||0,this.onCountChange.emit(this.selectCount),this.calcSelectTokens()}newStory(){this.currentStory=this.storyServ.newStory({person:this.person,book:this.book}),this.currentStory&&this.previewStory(this.currentStory)}async previewStory(t){let e=t;if(this.onPreviewStory.emit(e),document.body.clientWidth<1e3)return void(e?.story&&previewStoryMobile(e?.story,{chatServ:this.chatServ,alertCtrl:this.alertCtrl,modalCtrl:this.modalCtrl,navCtrl:this.navCtrl,ncloud:this.ncloud,nupload:this.nupload}));this.currentStory=void 0;let o=e?.story?.get("attach")?.id?1e3:100;(await this.loadingCtrl.create({message:"故事渲染中...",duration:o})).present(),this.currentStory=e}async destroyStory(t,e){let o=t;this.dialog.open(DialogDeleteStoryDialog,{data:{}}).afterClosed().subscribe((async t=>{if(t)return o?.story?.id&&(o.story.set("isDeleted",!0),await o.story.save()),this.storyServ.storyList?.splice(e,1),void(this.storyServ.storyList?.[0]?this.previewStory(this.storyServ.storyList?.[0]):this.currentStory=void 0)}))}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryListComponent,deps:[{token:i1.ActivatedRoute},{token:i2.LoadingController},{token:i3.MatDialog},{token:i1.Router},{token:i4.StoryService},{token:i5.ChatService},{token:i6.AlertController},{token:i6.ModalController},{token:i6.NavController},{token:i7.NovaCloudService},{token:i8.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryListComponent,isStandalone:!0,selector:"fm-story-list",inputs:{id:"id",article:"article",person:"person",book:"book",isSelectMode:"isSelectMode"},outputs:{onCancel:"onCancel",onCountChange:"onCountChange",onTokenChange:"onTokenChange",onPreviewStory:"onPreviewStory",onConfirmSelect:"onConfirmSelect"},ngImport:i0,template:'\x3c!-- \n <ion-header>\n <ion-toolbar>\n <ion-title>知识库</ion-title>\n <ion-buttons slot="end">\n <ion-button *ngIf="!isSelectMode" (click)="newStory()" [strong]="true">新建</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content> --\x3e\n\n <div class="page">\n\n <div class="filter">\n \x3c!-- <button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">\n <mat-icon>menu</mat-icon>\n </button> --\x3e\n\n \x3c!-- 知识库切换 --\x3e\n <ion-chip>\n <ion-avatar>\n <img alt="角色头像" [src]="defaultAvatar" />\n </ion-avatar>\n <ion-label>故事卡片</ion-label>\n <ion-icon name="swap-vertical-outline"></ion-icon>\n </ion-chip>\n\n <span class="example-spacer"></span>\n\n\n \x3c!-- 添加故事 --\x3e\n @if(false){\n <button mat-flat-button color="primary" (click)="newStory()" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 上传\n </button>\n }\n\n \x3c!-- 选择状态 --\x3e\n <button mat-button color="primary" (click)="cancel()" *ngIf="isSelectMode" style="margin-left:5px;">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 取消\n </button>\n <button mat-flat-button color="primary" (click)="confirmSelectedList()" *ngIf="isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 确认选择\n </button>\n \x3c!-- <button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">\n <mat-icon>favorite</mat-icon>\n </button> --\x3e\n <button id="trigger-button" mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">\n <mat-icon>tune</mat-icon>\n </button>\n <ion-popover trigger="trigger-button" size="auto" side="bottom" alignment="end" style="--width: 34%;margin-left: 0%;">\n <ng-template>\n <ion-content class="ion-padding">\n <ion-item-group>\n <ion-item-divider>\n <ion-label>类型</ion-label>\n </ion-item-divider>\n <ion-item lines="none">\n <mat-chip-listbox [value]="storyType" aria-label="类型">\n <mat-chip-option (click)="changeStoryType(\'\')" value="">全部</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'document\')" value="document">文档</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'chat\')" value="chat">聊天</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'diary\')" value="diary">日记</mat-chip-option>\n \x3c!-- <mat-chip-option color="accent" selected>Accent fish</mat-chip-option> --\x3e\n \x3c!-- <mat-chip-option color="warn">Warn fish</mat-chip-option> --\x3e\n </mat-chip-listbox>\n </ion-item>\n </ion-item-group>\n \n </ion-content>\n </ng-template>\n </ion-popover>\n </div>\n\n \x3c!-- 选择模式:选择数据 --\x3e\n @if(selectCount&&selectToken){\n <div class="select">\n <span>已选 {{selectCount||0}}个</span>\n <span style="margin-left:3px;">约{{selectToken||0}}tokens</span>\n </div>\n }\n \n <div class="list">\n\n\n \x3c!-- 切换筛选类型(角色故事、书籍故事、用户故事) --\x3e\n @if(person?.id || book?.id){\n <mat-button-toggle-group name="fontStyle">\n <mat-button-toggle (click)="currentTab=\'我的\';loadStory()" *ngIf="person?.id || book?.id" [checked]="currentTab==\'我的\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 我的\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'主角\';loadStory()" *ngIf="person?.id" [checked]="currentTab==\'主角\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 主角\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'书籍\';loadStory()" *ngIf="book?.id" [checked]="currentTab==\'书籍\'">\n <span nz-icon nzType="read" nzTheme="outline"></span> 书籍\n </mat-button-toggle>\n </mat-button-toggle-group>\n }\n \n \x3c!-- 故事卡片 --\x3e\n <ng-container *ngFor="let story of storyServ.storyList;let index=index;">\n <fm-story-card class="list-item" [story]="story?.story" [isSelectMode]="isSelectMode" \n [(checked)]="checkedMap[story?.story?.id||\'\']"\n (onCheckStory)="checkStory($event)" \n (onPreviewStory)="previewStory($event)"\n (onDestoryStory)="destroyStory($event,index)"\n ></fm-story-card>\n </ng-container>\n </div>\n \x3c!-- </ion-content> --\x3e\n</div>\n',styles:[".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i9.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i9.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:FormsModule},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"ngmodule",type:MatToolbarModule},{kind:"ngmodule",type:MatChipsModule},{kind:"component",type:i10.MatChipListbox,selector:"mat-chip-listbox",inputs:["multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:i10.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["selectable","selected"],outputs:["selectionChange"]},{kind:"ngmodule",type:MatButtonToggleModule},{kind:"directive",type:i11.MatButtonToggleGroup,selector:"mat-button-toggle-group",inputs:["appearance","name","vertical","value","multiple","disabled","hideSingleSelectionIndicator","hideMultipleSelectionIndicator"],outputs:["valueChange","change"],exportAs:["matButtonToggleGroup"]},{kind:"component",type:i11.MatButtonToggle,selector:"mat-button-toggle",inputs:["aria-label","aria-labelledby","id","name","value","tabIndex","disableRipple","appearance","checked","disabled"],outputs:["change"],exportAs:["matButtonToggle"]},{kind:"ngmodule",type:MatCheckboxModule},{kind:"ngmodule",type:MatDialogModule},{kind:"ngmodule",type:MatCardModule},{kind:"ngmodule",type:MatProgressBarModule},{kind:"ngmodule",type:MatDividerModule},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i12.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"component",type:i12.MatIconButton,selector:"button[mat-icon-button]",exportAs:["matButton"]},{kind:"ngmodule",type:MatIconModule},{kind:"component",type:i13.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"component",type:IonPopover,selector:"ion-popover"},{kind:"component",type:IonContent,selector:"ion-content",inputs:["color","fixedSlotPlacement","forceOverscroll","fullscreen","scrollEvents","scrollX","scrollY"]},{kind:"component",type:IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonItemGroup,selector:"ion-item-group"},{kind:"component",type:IonItemDivider,selector:"ion-item-divider",inputs:["color","mode","sticky"]},{kind:"component",type:IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:IonChip,selector:"ion-chip",inputs:["color","disabled","mode","outline"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonAvatar,selector:"ion-avatar"},{kind:"component",type:FmStoryCardComponent,selector:"fm-story-card",inputs:["story","isSelectMode","checked"],outputs:["checkedChange","onCheckStory","onPreviewStory","onDestoryStory"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryListComponent,decorators:[{type:Component,args:[{selector:"fm-story-list",standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,MatToolbarModule,MatChipsModule,MatButtonToggleModule,MatCheckboxModule,MatDialogModule,MatCardModule,MatProgressBarModule,MatDividerModule,MatButtonModule,MatIconModule,MatChipsModule,MatChipListbox,IonPopover,IonContent,IonItem,IonItemGroup,IonItemDivider,IonLabel,IonChip,IonIcon,IonAvatar,FmStoryCardComponent],template:'\x3c!-- \n <ion-header>\n <ion-toolbar>\n <ion-title>知识库</ion-title>\n <ion-buttons slot="end">\n <ion-button *ngIf="!isSelectMode" (click)="newStory()" [strong]="true">新建</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content> --\x3e\n\n <div class="page">\n\n <div class="filter">\n \x3c!-- <button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">\n <mat-icon>menu</mat-icon>\n </button> --\x3e\n\n \x3c!-- 知识库切换 --\x3e\n <ion-chip>\n <ion-avatar>\n <img alt="角色头像" [src]="defaultAvatar" />\n </ion-avatar>\n <ion-label>故事卡片</ion-label>\n <ion-icon name="swap-vertical-outline"></ion-icon>\n </ion-chip>\n\n <span class="example-spacer"></span>\n\n\n \x3c!-- 添加故事 --\x3e\n @if(false){\n <button mat-flat-button color="primary" (click)="newStory()" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 上传\n </button>\n }\n\n \x3c!-- 选择状态 --\x3e\n <button mat-button color="primary" (click)="cancel()" *ngIf="isSelectMode" style="margin-left:5px;">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 取消\n </button>\n <button mat-flat-button color="primary" (click)="confirmSelectedList()" *ngIf="isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 确认选择\n </button>\n \x3c!-- <button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">\n <mat-icon>favorite</mat-icon>\n </button> --\x3e\n <button id="trigger-button" mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">\n <mat-icon>tune</mat-icon>\n </button>\n <ion-popover trigger="trigger-button" size="auto" side="bottom" alignment="end" style="--width: 34%;margin-left: 0%;">\n <ng-template>\n <ion-content class="ion-padding">\n <ion-item-group>\n <ion-item-divider>\n <ion-label>类型</ion-label>\n </ion-item-divider>\n <ion-item lines="none">\n <mat-chip-listbox [value]="storyType" aria-label="类型">\n <mat-chip-option (click)="changeStoryType(\'\')" value="">全部</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'document\')" value="document">文档</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'chat\')" value="chat">聊天</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'diary\')" value="diary">日记</mat-chip-option>\n \x3c!-- <mat-chip-option color="accent" selected>Accent fish</mat-chip-option> --\x3e\n \x3c!-- <mat-chip-option color="warn">Warn fish</mat-chip-option> --\x3e\n </mat-chip-listbox>\n </ion-item>\n </ion-item-group>\n \n </ion-content>\n </ng-template>\n </ion-popover>\n </div>\n\n \x3c!-- 选择模式:选择数据 --\x3e\n @if(selectCount&&selectToken){\n <div class="select">\n <span>已选 {{selectCount||0}}个</span>\n <span style="margin-left:3px;">约{{selectToken||0}}tokens</span>\n </div>\n }\n \n <div class="list">\n\n\n \x3c!-- 切换筛选类型(角色故事、书籍故事、用户故事) --\x3e\n @if(person?.id || book?.id){\n <mat-button-toggle-group name="fontStyle">\n <mat-button-toggle (click)="currentTab=\'我的\';loadStory()" *ngIf="person?.id || book?.id" [checked]="currentTab==\'我的\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 我的\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'主角\';loadStory()" *ngIf="person?.id" [checked]="currentTab==\'主角\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 主角\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'书籍\';loadStory()" *ngIf="book?.id" [checked]="currentTab==\'书籍\'">\n <span nz-icon nzType="read" nzTheme="outline"></span> 书籍\n </mat-button-toggle>\n </mat-button-toggle-group>\n }\n \n \x3c!-- 故事卡片 --\x3e\n <ng-container *ngFor="let story of storyServ.storyList;let index=index;">\n <fm-story-card class="list-item" [story]="story?.story" [isSelectMode]="isSelectMode" \n [(checked)]="checkedMap[story?.story?.id||\'\']"\n (onCheckStory)="checkStory($event)" \n (onPreviewStory)="previewStory($event)"\n (onDestoryStory)="destroyStory($event,index)"\n ></fm-story-card>\n </ng-container>\n </div>\n \x3c!-- </ion-content> --\x3e\n</div>\n',styles:[".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"]}]}],ctorParameters:()=>[{type:i1.ActivatedRoute},{type:i2.LoadingController},{type:i3.MatDialog},{type:i1.Router},{type:i4.StoryService},{type:i5.ChatService},{type:i6.AlertController},{type:i6.ModalController},{type:i6.NavController},{type:i7.NovaCloudService},{type:i8.NovaUploadService}],propDecorators:{id:[{type:Input}],article:[{type:Input}],person:[{type:Input}],book:[{type:Input}],isSelectMode:[{type:Input}],onCancel:[{type:Output}],onCountChange:[{type:Output}],onTokenChange:[{type:Output}],onPreviewStory:[{type:Output}],onConfirmSelect:[{type:Output}]}});export class DialogDeleteStoryDialog{constructor(t,e){this.dialogRef=t,this.data=e}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogDeleteStoryDialog,deps:[{token:i3.MatDialogRef},{token:MAT_DIALOG_DATA}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:DialogDeleteStoryDialog,isStandalone:!0,selector:"delete-story-dialog",ngImport:i0,template:'<h1 mat-dialog-title>删除故事</h1>\n<div mat-dialog-content>\n 请问您要删除该故事及其所有线索吗?\n</div>\n<div mat-dialog-actions>\n <button mat-button mat-dialog-close cdkFocusInitial>取消</button>\n <button mat-button [mat-dialog-close]="true" color="warn">删除</button>\n</div>',dependencies:[{kind:"ngmodule",type:MatDialogModule},{kind:"directive",type:i3.MatDialogClose,selector:"[mat-dialog-close], [matDialogClose]",inputs:["aria-label","type","mat-dialog-close","matDialogClose"],exportAs:["matDialogClose"]},{kind:"directive",type:i3.MatDialogTitle,selector:"[mat-dialog-title], [matDialogTitle]",inputs:["id"],exportAs:["matDialogTitle"]},{kind:"directive",type:i3.MatDialogActions,selector:"[mat-dialog-actions], mat-dialog-actions, [matDialogActions]",inputs:["align"]},{kind:"directive",type:i3.MatDialogContent,selector:"[mat-dialog-content], mat-dialog-content, [matDialogContent]"},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i12.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogDeleteStoryDialog,decorators:[{type:Component,args:[{selector:"delete-story-dialog",standalone:!0,imports:[MatDialogModule,MatButtonModule],template:'<h1 mat-dialog-title>删除故事</h1>\n<div mat-dialog-content>\n 请问您要删除该故事及其所有线索吗?\n</div>\n<div mat-dialog-actions>\n <button mat-button mat-dialog-close cdkFocusInitial>取消</button>\n <button mat-button [mat-dialog-close]="true" color="warn">删除</button>\n</div>'}]}],ctorParameters:()=>[{type:i3.MatDialogRef},{type:void 0,decorators:[{type:Inject,args:[MAT_DIALOG_DATA]}]}]});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWxpc3QvZm0tc3RvcnktbGlzdC5jb21wb25lbnQubWpz`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs
7
+ */
8
+ import{AgentStory}from"../../../core";import{FmOfficeViewerComponent}from"../fm-office-viewer/fm-office-viewer.component";import{openChatStoryModal}from"../modal-chat-story/modal-chat-story.component";import Parse from"parse";export async function previewStoryMobile(t,e){let o,r=await getStoryType(t);if(o=new AgentStory(t,t?.get("person"),t?.get("book")),console.log(r,o?.story),"document"==r){let t=o?.story?.get("attach")?.id;openStoryPreview(e?.modalCtrl,e?.alertCtrl,{previewComp:FmOfficeViewerComponent,props:{showHeader:!0,fileId:t}})}"chat"==r&&openChatStoryModal(e?.modalCtrl,t?.get("chatSession"),{type:"chat",title:"采访总结",subtitle:"任务: 总结分析本次对话",desc:"总结后的对话信息,将进入人物知识库,可被检索和选择。但不可继续聊天!您是否确认总结本次对话内容?",promptTpl:"story-chat-session-tpl"}),"diary"==r&&openChatStoryModal(e?.modalCtrl,t?.get("chatSession"),{type:"diary",title:"日记整理",subtitle:"任务:语音整理日记文本",desc:"总结生成后的日记将加入日记列表,可被检索和选择。但是不可继续对话!您是否确认生成本次日记?",promptTpl:"diary-chat-session-html-tpl"})}export async function getStoryType(t){return"diary"==t?.get("type")?"diary":t?.get("attach")?.id?"document":t?.get("chatSession")?.id?"chat":""}export async function getRoleById(t){return new Parse.Query("AvatarRole").get(t)}export async function openStoryPreview(t,e,o){o.props=o?.props||{},o.props.onBreakPointSet=()=>{r?.setCurrentBreakpoint(.75)};let r=await t.create({component:o?.previewComp,componentProps:o?.props,breakpoints:[1],initialBreakpoint:1});r.present();let{data:i,role:a}=await r.onWillDismiss();if("confirm"==a)return i}
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWxpc3Qvc3RvcnktcHJldmlldy5tanM=`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs
7
+ */
8
+ import{CommonModule}from"@angular/common";import{ChangeDetectorRef,Component,Input}from"@angular/core";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import{NavController}from"@ionic/angular";import{ChatService}from"../../service-fmai/service-chat/chat.service";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{NovaUploadService}from"../../../storage/service-upload/nova-upload.service";import{FmodeChat}from"../../../core";import{FmChatMesssageArea}from"../../chat";import{NzIconModule}from"ng-zorro-antd/icon";import{NzUploadModule}from"ng-zorro-antd/upload";import Parse from"parse";import{from}from"rxjs";import{StoryService}from"../story.service";import{AgentStory}from"../../../core";import{FmOfficeViewerComponent}from"../fm-office-viewer/fm-office-viewer.component";import{FmStorySplitterComponent}from"../fm-story-splitter/fm-story-splitter.component";import{CompDiaryStoryComponent}from"../modal-chat-story/comp-diary-story/comp-diary-story.component";import{getRoleById}from"../fm-story-list/story-preview";import{CompChatStoryJsonComponent}from"../modal-chat-story/comp-chat-story-json/comp-chat-story-json.component";import*as i0 from"@angular/core";import*as i1 from"../../../storage/service-upload/nova-upload.service";import*as i2 from"../../service-fmai/service-chat/chat.service";import*as i3 from"@ionic/angular";import*as i4 from"../../../nova-cloud/nova-cloud.service";import*as i5 from"../story.service";import*as i6 from"@angular/common";import*as i7 from"ng-zorro-antd/upload";import*as i8 from"ng-zorro-antd/icon";export class FmStoryLoaderComponent{constructor(o,t,e,n,i,r){this.nupload=o,this.chatServ=t,this.navCtrl=e,this.ncloud=n,this.cdRef=i,this.storyServ=r,this.isSelectMode=!1,this.fileType="",this.uploadToNovaRequest=o=>{console.log("fileReq",o),console.log(o?.file);let t=o.postFile;return from(this.nupload.upload(t,(t=>{o.file.percent=t?.total?.percent||0,100==t?.total?.percent&&(o.file.status="done",this.uploadedFile=o.file),console.log("progress",t)}))).subscribe({next:async t=>{console.log("response",t),t?.id&&(this.attachment=await(this.story?.setAttachment(t)),this.story?.story?.set("attach",this.attachment),this.cdRef.detectChanges(),console.log(this.story)),o.onSuccess?.(t,o.file,null)},error:t=>{o.onError?.(t,o.file)}})},this.fileType=["text/csv","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/pdf","application/vnd.openxmlformats-officedocument.presentationml.presentation"].join(",")}ngOnInit(){this.initStory()}initStory(o,t){this.attachment=void 0,this.chatSession=void 0,this.fmodeChat=void 0,o&&(this.story=o),setTimeout((()=>{t?.isNew&&(this.story=this.storyServ.storyList?.[0]),this.attachment=this.story?.story?.get("attach"),this.chatSession=this.story?.story?.get("chatSession"),this.loadChatSessionToFmodeChat(this.story)}),100)}async loadChatSessionToFmodeChat(o){let t=o?.story?.get("chatSession"),e=t?.id||t?.objectId;if(console.log("chatId",e),!t?.get("role")?.id){let o=new Parse.Query("ChatSession");o.equalTo("objectId",e),o.include("role"),t=await o.first(e)}if(e){let o=await getRoleById(t?.get("role")?.id),n=this.navCtrl;this.fmodeChat=new FmodeChat(e,o,t,this,n,this.ncloud,this.nupload),this.chatServ.chatMap[e]=this.fmodeChat}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,deps:[{token:i1.NovaUploadService},{token:i2.ChatService},{token:i3.NavController},{token:i4.NovaCloudService},{token:i0.ChangeDetectorRef},{token:i5.StoryService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryLoaderComponent,isStandalone:!0,selector:"fm-story-loader",inputs:{isSelectMode:"isSelectMode",story:"story"},providers:[NovaUploadService,Diagnostic],ngImport:i0,template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:NzUploadModule},{kind:"component",type:i7.NzUploadComponent,selector:"nz-upload",inputs:["nzType","nzLimit","nzSize","nzFileType","nzAccept","nzAction","nzDirectory","nzOpenFileDialogOnClick","nzBeforeUpload","nzCustomRequest","nzData","nzFilter","nzFileList","nzDisabled","nzHeaders","nzListType","nzMultiple","nzName","nzShowUploadList","nzShowButton","nzWithCredentials","nzRemove","nzPreview","nzPreviewFile","nzPreviewIsImage","nzTransformFile","nzDownload","nzIconRender","nzFileListRender"],outputs:["nzChange","nzFileListChange"],exportAs:["nzUpload"]},{kind:"ngmodule",type:NzIconModule},{kind:"directive",type:i8.NzIconDirective,selector:"[nz-icon]",inputs:["nzSpin","nzRotate","nzType","nzTheme","nzTwotoneColor","nzIconfont"],exportAs:["nzIcon"]},{kind:"component",type:FmOfficeViewerComponent,selector:"fm-office-viewer",inputs:["officeHost","wopiHost","fileId","permission","showHeader"]},{kind:"component",type:FmStorySplitterComponent,selector:"fm-story-splitter",inputs:["story"]},{kind:"component",type:CompDiaryStoryComponent,selector:"comp-diary-story",inputs:["story","person","showHeader","readOnly"]},{kind:"component",type:CompChatStoryJsonComponent,selector:"comp-chat-story-json",inputs:["story","person","showHeader"]},{kind:"component",type:FmChatMesssageArea,selector:"fm-chat-message-area",inputs:["chatId","chat"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryLoaderComponent,decorators:[{type:Component,args:[{selector:"fm-story-loader",standalone:!0,imports:[CommonModule,NzUploadModule,NzIconModule,FmOfficeViewerComponent,FmStorySplitterComponent,CompDiaryStoryComponent,CompChatStoryJsonComponent,FmChatMesssageArea],providers:[NovaUploadService,Diagnostic],template:'<div class="layout">\n <ng-container *ngIf="!attachment && !chatSession">\n <div class="col-uploader">\n <nz-upload\n nzType="drag"\n [nzAccept]="fileType"\n [nzMultiple]="false"\n [nzCustomRequest]="uploadToNovaRequest"\n >\n <p class="ant-upload-drag-icon">\n <span nz-icon nzType="inbox"></span>\n </p>\n <p class="ant-upload-text">拖拽文件到这里 或 点击上传文件</p>\n <p class="ant-upload-hint">\n 支持 .docx, .pptx, .pdf, .csv, .txt, .md 文件\n </p>\n </nz-upload>\n </div>\n </ng-container>\n\n \x3c!-- 附件加载器:显示附件预览效果 --\x3e\n <ng-container *ngIf="story?.story?.get(\'attach\')?.id">\n <div class="col-preview">\n <fm-office-viewer [fileId]="attachment?.id"></fm-office-viewer>\n </div>\n <div class="col-document" *ngIf="!isSelectMode">\n <fm-story-splitter [story]="story"></fm-story-splitter>\n </div>\n </ng-container>\n\n \x3c!-- 会话加载器:显示对话总结及聊天记录 --\x3e\n <ng-container *ngIf="fmodeChat">\n <div class="col-preview">\n <fm-chat-message-area *ngIf="fmodeChat" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n <div class="col-document" style="min-width:360px;">\n @if(story?.story?.get("type")=="chat"){\n <comp-chat-story-json [story]="story?.story"></comp-chat-story-json>\n }\n @if(story?.story?.get("type")=="diary"){\n <comp-diary-story [story]="story?.story"></comp-diary-story>\n }\n </div>\n </ng-container>\n</div>',styles:[".layout{display:flex;height:100%}.layout .col-uploader{height:100%;width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.layout .col-uploader nz-upload{min-width:300px;max-width:500px;width:60%}.layout .col-preview{height:100%;flex:auto;overflow-y:auto}.layout .col-document{height:100%;overflow-y:auto}\n"]}]}],ctorParameters:()=>[{type:i1.NovaUploadService},{type:i2.ChatService},{type:i3.NavController},{type:i4.NovaCloudService},{type:i0.ChangeDetectorRef},{type:i5.StoryService}],propDecorators:{isSelectMode:[{type:Input}],story:[{type:Input}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWxvYWRlci9mbS1zdG9yeS1sb2FkZXIuY29tcG9uZW50Lm1qcw==`
10
+