fmode-ng 0.0.83 → 0.0.85

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 (176) 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-message-card/comp-message-card.component.mjs +1 -1
  5. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +1 -1
  6. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +1 -1
  7. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +1 -1
  8. package/esm2022/lib/aigc/index.mjs +1 -1
  9. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -0
  10. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -0
  11. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -0
  12. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -0
  13. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -0
  14. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -0
  15. package/esm2022/lib/aigc/story/index.mjs +10 -0
  16. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -0
  17. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -0
  18. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -0
  19. package/esm2022/lib/aigc/story/story.service.mjs +10 -0
  20. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +1 -1
  21. package/esm2022/lib/aigc/voice/index.mjs +1 -1
  22. package/esm2022/lib/aigc/voice/{audio.player.mjs → lib/audio/audio.player.mjs} +2 -2
  23. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -0
  24. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -0
  25. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +10 -0
  26. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +1 -1
  27. package/esm2022/lib/aigc/voice/tts/index.mjs +1 -1
  28. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -0
  29. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +10 -0
  30. package/esm2022/lib/aigc/voice/tts/provider-microsoft.mjs +10 -0
  31. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +1 -1
  32. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -0
  33. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +1 -1
  34. package/esm2022/lib/core/agent/chat/index.mjs +1 -1
  35. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +1 -1
  36. package/esm2022/lib/core/index.mjs +10 -0
  37. package/esm2022/lib/core/voice/index.mjs +10 -0
  38. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -0
  39. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -0
  40. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -0
  41. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -0
  42. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -0
  43. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -0
  44. package/esm2022/lib/icon/filetype/index.mjs +10 -0
  45. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -0
  46. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -0
  47. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -0
  48. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -0
  49. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -0
  50. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -0
  51. package/esm2022/lib/icon/index.mjs +10 -0
  52. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -0
  53. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -0
  54. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -0
  55. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +10 -0
  56. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -0
  57. package/esm2022/lib/person/index.mjs +10 -0
  58. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -0
  59. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -0
  60. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -0
  61. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -0
  62. package/esm2022/lib/person/person.service.mjs +10 -0
  63. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -0
  64. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -0
  65. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +10 -0
  66. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -0
  67. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +10 -0
  68. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -0
  69. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +10 -0
  70. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -0
  71. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -0
  72. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -0
  73. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -0
  74. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -0
  75. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -0
  76. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -0
  77. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -0
  78. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -0
  79. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -0
  80. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -0
  81. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -0
  82. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -0
  83. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -0
  84. package/esm2022/lib/text/index.mjs +10 -0
  85. package/esm2022/public-api.mjs +1 -1
  86. package/fesm2022/fmode-ng.mjs +1 -1
  87. package/fesm2022/fmode-ng.mjs.map +1 -1
  88. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +5 -3
  89. package/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.d.ts +4 -2
  90. package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +6 -1
  91. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +6 -3
  92. package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +5 -1
  93. package/lib/aigc/index.d.ts +1 -0
  94. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +23 -0
  95. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +26 -0
  96. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +71 -0
  97. package/lib/aigc/story/fm-story-list/story-preview.d.ts +20 -0
  98. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +38 -0
  99. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +13 -0
  100. package/lib/aigc/story/index.d.ts +5 -0
  101. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +14 -0
  102. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +29 -0
  103. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +44 -0
  104. package/lib/aigc/story/story.service.d.ts +12 -0
  105. package/lib/aigc/voice/fmode-voice.service.d.ts +3 -6
  106. package/lib/aigc/voice/index.d.ts +3 -2
  107. package/lib/aigc/voice/lib/audio/audio.streamer.d.ts +33 -0
  108. package/lib/aigc/voice/{stream.player.d.ts → lib/audio/streamer.microsoft.d.ts} +2 -2
  109. package/lib/aigc/voice/lib/audio/streamer.pcm.d.ts +45 -0
  110. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +17 -37
  111. package/lib/aigc/voice/tts/index.d.ts +3 -0
  112. package/lib/aigc/voice/tts/int-tts-provider.d.ts +35 -0
  113. package/lib/aigc/voice/tts/provider-doubao.d.ts +43 -0
  114. package/lib/aigc/voice/tts/provider-microsoft.d.ts +21 -0
  115. package/lib/core/agent/chat/completion/fmode-completion.d.ts +2 -1
  116. package/lib/core/agent/chat/completion/int-gpt-chat-options.d.ts +72 -0
  117. package/lib/core/agent/chat/index.d.ts +1 -1
  118. package/lib/core/agent/chat/interface.d.ts +3 -0
  119. package/lib/core/agent/prompt/agent.prompt.d.ts +2 -1
  120. package/lib/core/index.d.ts +2 -0
  121. package/lib/core/voice/index.d.ts +1 -0
  122. package/lib/icon/filetype/audio.svg.d.ts +1 -0
  123. package/lib/icon/filetype/avatar.svg.d.ts +1 -0
  124. package/lib/icon/filetype/chat.svg.d.ts +1 -0
  125. package/lib/icon/filetype/docx.svg.d.ts +1 -0
  126. package/lib/icon/filetype/file.svg.d.ts +1 -0
  127. package/lib/icon/filetype/filetype.pipe.d.ts +8 -0
  128. package/lib/icon/filetype/index.d.ts +11 -0
  129. package/lib/icon/filetype/md.svg.d.ts +1 -0
  130. package/lib/icon/filetype/pdf.svg.d.ts +1 -0
  131. package/lib/icon/filetype/pptx.svg.d.ts +1 -0
  132. package/lib/icon/filetype/svgtoblob.d.ts +1 -0
  133. package/lib/icon/filetype/video.svg.d.ts +1 -0
  134. package/lib/icon/filetype/xlsx.svg.d.ts +1 -0
  135. package/lib/icon/index.d.ts +1 -0
  136. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +20 -0
  137. package/lib/person/comp-person-item/comp-person-item.component.d.ts +10 -0
  138. package/lib/person/comp-person-story/comp-person-story.component.d.ts +67 -0
  139. package/lib/person/edit-upload/edit-upload.component.d.ts +81 -0
  140. package/lib/person/edit-upload/edit-upload.module.d.ts +11 -0
  141. package/lib/person/index.d.ts +4 -0
  142. package/lib/person/modal-person-select/modal-person-select.component.d.ts +25 -0
  143. package/lib/person/modal-user-verify/secret-text.pipe.d.ts +7 -0
  144. package/lib/person/modal-user-verify/user-verify.component.d.ts +88 -0
  145. package/lib/person/person-detail/person-detail.component.d.ts +41 -0
  146. package/lib/person/person.service.d.ts +33 -0
  147. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +23 -0
  148. package/lib/text/fm-article-editor/article.service.d.ts +41 -0
  149. package/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.d.ts +19 -0
  150. package/lib/text/fm-article-editor/draft.service.d.ts +33 -0
  151. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +73 -0
  152. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +81 -0
  153. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +90 -0
  154. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +36 -0
  155. package/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.d.ts +12 -0
  156. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +55 -0
  157. package/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.d.ts +31 -0
  158. package/lib/text/fm-article-editor/outline-count.pipe.d.ts +7 -0
  159. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +6 -0
  160. package/lib/text/fm-article-editor/task-article-generation.d.ts +23 -0
  161. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +18 -0
  162. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +14 -0
  163. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +19 -0
  164. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +7 -0
  165. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +14 -0
  166. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +14 -0
  167. package/lib/text/fm-text-quill/fm-text-quill.component.d.ts +39 -0
  168. package/lib/text/index.d.ts +3 -0
  169. package/package.json +6 -2
  170. package/public-api.d.ts +4 -0
  171. package/esm2022/lib/aigc/voice/lib/recorder/engine-pcm.mjs +0 -10
  172. package/esm2022/lib/aigc/voice/lib/recorder/engine-wav.mjs +0 -10
  173. package/esm2022/lib/aigc/voice/stream.player.mjs +0 -10
  174. package/lib/aigc/voice/lib/recorder/engine-pcm.d.ts +0 -1
  175. package/lib/aigc/voice/lib/recorder/engine-wav.d.ts +0 -1
  176. /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/chat/chat-modal-input/modal-input.component.mjs
7
7
  */
8
- import{Component,Input,ViewChild}from"@angular/core";import{Router,RouterModule}from"@angular/router";import{AlertController,ToastController}from"@ionic/angular";import{FmodeChat}from"../../service-fmai/service-chat";import{ChatService}from"../../service-fmai/service-chat";import Parse from"parse";import{ImagineService}from"../../service-fmai/service-imagine/imagine.service";import{IonButton,IonContent,IonIcon,IonInput,IonItem,IonList,IonModal,IonPopover,IonTextarea,IonToolbar,ModalController}from"@ionic/angular/standalone";import{CommonModule}from"@angular/common";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{ModalAudioMessageComponent}from"./modal-audio-message/modal-audio-message.component";import{FmChatMessageCard}from"../chat-message-card/comp-message-card.component";import{addIcons}from"ionicons";import{imageOutline,chevronBackOutline,ellipsisHorizontalOutline,chevronDownOutline,chatboxEllipsesOutline,micOutline,paperPlaneOutline,shareSocialOutline,settingsOutline,alertOutline,colorWandOutline,peopleOutline}from"ionicons/icons";import{AccountService}from"../../../user/account/account.service";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@ionic/angular/standalone";import*as i3 from"@angular/router";import*as i4 from"../../service-fmai/service-imagine/imagine.service";import*as i5 from"../../service-fmai/service-chat";import*as i6 from"../../../user/account/account.service";import*as i7 from"@angular/common";import*as i8 from"@angular/forms";addIcons({colorWandOutline:colorWandOutline,peopleOutline:peopleOutline,alertOutline:alertOutline,imageOutline:imageOutline,chevronBackOutline:chevronBackOutline,ellipsisHorizontalOutline:ellipsisHorizontalOutline,chevronDownOutline:chevronDownOutline,chatboxEllipsesOutline:chatboxEllipsesOutline,micOutline:micOutline,paperPlaneOutline:paperPlaneOutline,shareSocialOutline:shareSocialOutline,settingsOutline:settingsOutline});export class FmChatModalInput{closeAudio(){this.audioComp?.cancel(),this.isAudioModal=!1}async startTalk(){let e,n=document.body.clientHeight||960;this.audioModalHeightPoint=Number((165/n).toFixed(2)),this.chat.stopPlayingVoice(),e=await this.modalCtrl.create({component:ModalAudioMessageComponent,componentProps:{chat:this.chat,modal:e,onBreakPointSet:()=>{e?.setCurrentBreakpoint(this.audioModalHeightPoint)}},breakpoints:[this.audioModalHeightPoint],initialBreakpoint:this.audioModalHeightPoint}),e.present()}constructor(e,n,t,o,i,a,s){this.toastCtrl=e,this.alertCtrl=n,this.modalCtrl=t,this.router=o,this.imagineServ=i,this.chatServ=a,this.account=s,this.errorText="",this.isAudioModal=!1,this.audioModalHeightPoint=.35,this.isShare=!1,this.user=Parse.User.current()}ngOnInit(){this.loadModel();let e=this;this.chat.focusUserInput=()=>{e.chat.isVoiceInputMode=!1,e.userInputComp.setFocus()}}async loadModel(){let e=this.chat?.role?.get("model");await this.chat.loadModelList(e)}async setMessageImage(){let e=await this.imagineServ.getimg();this.chat.userImage=e,console.log(this.chat?.userImage)}onInputFocus(){this.chat.isTexting=!0,this.chat.scrollToBottom&&this.chat.scrollToBottom()}onKeyDown(e){e.ctrlKey&&"Enter"===e.key&&(console.log("Ctrl+Enter 被按下"),this.sendMessage())}async sendMessage(){if(!await this.checkBalance())return!1;if(!this.chat.userInput){return this.errorText="内容不能为空",void(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}this.chat?.sendMessage(this.chat?.userInput,this.chat?.userImage,(e=>{}),{onSSMLComplete:e=>{console.log(e)}}),this.chat.userInput="",this.chat.userImage=""}async checkBalance(){let e=await this.account.getBilling();if(e?.credit?.balance>=10&&(this.chat.isDirect=!0),!this.chat?.currentModel?.get("payLimit"))return!0;if(e?.credit?.balance<10){return(await this.alertCtrl.create({header:"注意",subHeader:"您的余额不足,请充值后解锁高级模型",buttons:[{role:"cancel",text:"取消"},{role:"destructive",text:"充值",handler:()=>{this.router.navigateByUrl("/account/billing")}}]})).present(),!1}return!0}async getChatShare(){this.user=Parse.User.current();let e=new Parse.Query("ChatShare");e.equalTo("user",Parse.User.current().id),e.equalTo("session",this.chat?.sessionId);await e.first()}async toggleChatShare(){let e=new Parse.Query("ChatShare");e.equalTo("user",Parse.User.current().id),e.equalTo("role",this.chat?.role.id),e.equalTo("session",this.chat?.sessionId),e.select("objectId");let n=await e.first();if(n?.id)n.set("messageList",this.chat?.messageList);else{n=new(Parse.Object.extend("ChatShare")),n.set("user",{__type:"Pointer",className:"_User",objectId:Parse.User.current()?.id}),n.set("session",{__type:"Pointer",className:"ChatSession",objectId:this.chat?.sessionId}),n.set("role",{__type:"Pointer",className:"AvatarRole",objectId:this.chat?.role.id}),n.set("company",{__type:"Pointer",className:"Company",objectId:"E4KpGvTEto"}),n.set("messageList",this.chat?.messageList)}await n.save(),this.getChatShare()}async chatShareSuccessMessage(){(await this.toastCtrl.create({duration:1e3,message:"分享成功",color:"primary",icon:"information-circle",position:"top"})).present()}showShare(){this.isShare=!0}handleOkShare(){this.toggleChatShare(),this.chatShareSuccessMessage(),this.isShare=!1}handleCancelShare(){this.isShare=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatModalInput,deps:[{token:i1.ToastController},{token:i1.AlertController},{token:i2.ModalController},{token:i3.Router},{token:i4.ImagineService},{token:i5.ChatService},{token:i6.AccountService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmChatModalInput,isStandalone:!0,selector:"fm-chat-modal-input",inputs:{chat:"chat",message:"message",role:"role"},viewQueries:[{propertyName:"audioComp",first:!0,predicate:ModalAudioMessageComponent,descendants:!0},{propertyName:"userInputComp",first:!0,predicate:["userInput"],descendants:!0}],ngImport:i0,template:'<ion-toolbar>\n <ion-item class="button-item" lines="none">\n \x3c!-- 设置 --\x3e\n \x3c!-- <ion-button fill="outline" slot="start">\n <ion-icon name="settings-outline"></ion-icon> \n </ion-button> --\x3e\n <ng-container *ngFor="let button of chat?.leftButtons">\n <ion-button style="--padding-start:10px;--padding-end:10px;"\n shape="round" *ngIf="button.show()" fill="outline" [title]="button?.title" slot="start" (click)="button.onClick()">\n <ion-icon [name]="button?.icon" [slot]="button?.showTitle?\'start\':\'icon-only\'"></ion-icon>\n {{button?.showTitle&&button?.title}}\n </ion-button>\n </ng-container>\n\n <ng-container *ngFor="let button of chat?.role?.get(\'buttons\')">\n <ion-button shape="round" (click)="chatServ.doButtonAction(button)" fill="outline" slot="start">\n {{button?.name}}\n </ion-button>\n </ng-container>\n\n \x3c!--分享按钮--\x3e\n @if(!chat?.hideShare){\n <ion-button shape="round" *ngIf="chat?.messageList?.length>1" (click)="showShare()" fill="outline" title="分享" slot="end">\n <ion-icon name="share-social-outline"></ion-icon>\n </ion-button>\n }\n <ion-modal [isOpen]="isShare">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="handleCancelShare()">取消</ion-button>\n </ion-buttons>\n <ion-title>对话分享</ion-title>\n <ion-buttons slot="end">\n <ion-button (click)="handleOkShare()">分享</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n <ng-container *ngFor="let message of chat?.messageList;let index=index;">\n \x3c!-- 内容格式化区域 --\x3e\n <fm-chat-message-card [chat]="chat" *ngIf="!message?.hidden" [index]="index" [message]="message" [role]="chat?.role"></fm-chat-message-card>\n </ng-container>\n\n <div *ngIf="false" class="popup-content">\n <div *ngFor="let message of chat?.messageList">\n \x3c!-- 头像 --\x3e\n <div class="item-row user" *ngIf="message?.role!=\'system\'">\n <div>\n <img class="avatar" *ngIf="message?.role!=\'user\'" [src]="(chat?.role?.get(\'avatar\') || chat?.role?.get(\'thumb\') || \'https://file-cloud.fmode.cn/E4KpGvTEto/20230930/l413e6090731854.png\')+\'?\'+\'x-image-process=image/resize,m_fixed,w_100\'+\'&imageView2/1/w/32/h/32\'" >\n </div>\n <div class="user-question">\n <app-comp-user-avatar [user]="user" *ngIf="message?.role==\'user\'"></app-comp-user-avatar>\n </div>\n </div>\n \x3c!-- 内容 --\x3e\n <div class="message-wrapper">\n <div class="message-content-user">\n <div class="user-message" *ngIf="message?.role === \'user\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-role">\n <div class="role-message" *ngIf="message?.role !== \'user\' && message?.role !== \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-system">\n <div class="system-message" *ngIf="message?.role === \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n </div>\n <div class="chat-time" *ngIf="message?.createdAt" [ngClass]="{\'role-time\': message?.role !== \'user\'}">\n <span>{{message?.createdAt | date:"dd/MM/yyyy, HH/mm/ss a"}}</span>\n </div>\n </div>\n </div> \n </ion-content>\n </ng-template>\n </ion-modal>\n\n \x3c!-- 图片 --\x3e\n <ion-button shape="round" *ngIf="chat?.currentModel?.get(\'config\')?.imageEnabled" fill="outline" slot="end" (click)="setMessageImage()">\n <ion-icon name="image-outline"></ion-icon>\n </ion-button>\n \x3c!-- 模型 --\x3e\n @if(!chat?.hideModalSelect){\n <ion-button shape="round" fill="outline" slot="end" id="model-button">\n <ion-icon name="chevron-down-outline"></ion-icon>\n {{chat?.currentModel?.get&&chat?.currentModel?.get("name")||"Fmode-C1.0-128k"}}\n </ion-button>\n <ion-popover trigger="model-button" [dismissOnSelect]="true">\n <ng-template>\n <ion-content>\n <ion-list>\n <ng-container *ngFor="let model of chat.modelList">\n <ion-item (click)="chat.currentModel = model" [button]="true" [detail]="false">\n {{model?.get("name")}}\n <ion-note slot="end">{{model?.get("credit")}}/k</ion-note>\n </ion-item>\n </ng-container>\n </ion-list>\n </ion-content>\n </ng-template>\n </ion-popover>\n }\n\n </ion-item>\n\n <ion-item class="input-item" lines="none">\n \x3c!-- 语音消息输入 --\x3e\n <ng-container *ngIf="chat?.isVoiceInputMode">\n \x3c!-- 切换文本输入 --\x3e\n <ion-button class="btn-input-change" color="primary" (click)="chat.isVoiceInputMode=false" shape="round" size="large">\n <ion-icon name="chatbox-ellipses-outline" slot="icon-only"></ion-icon>\n </ion-button>\n \n <div class="btn-voice-start" (click)="startTalk()">\n <span>\n 点击讲话\n </span> \n </div>\n </ng-container>\n\n \x3c!-- 文本消息输入 --\x3e\n <ng-container *ngIf="!chat?.isVoiceInputMode">\n \x3c!-- 切换语音输入 --\x3e\n <ion-button [style.display]="chat.isTexting?\'none\':\'flex\'" class="btn-input-change" color="primary" *ngIf="chat?.role?.get(\'voiceConfig\')" (click)="chat.isVoiceInputMode=true" shape="round" size="large">\n <ion-icon name="mic-outline" slot="icon-only"></ion-icon>\n </ion-button>\n\n \x3c!-- 文本输入区域 --\x3e\n <ion-textarea\n #userInput\n *ngIf="chat" (keydown)="onKeyDown($event)"\n [errorText]="errorText"\n [(ngModel)]="chat.userInput"\n (ionFocus)="onInputFocus()"\n (ionBlur)="chat.isTexting=false"\n [autoGrow]="true" shape="round" fill="outline"\n label="Ctrl + Enter 发送消息" placeholder="请输入您的提示词"\n labelPlacement="floating"></ion-textarea>\n \n \x3c!-- 文本发送按钮 --\x3e\n <ion-button color="primary" shape="round" size="large" (click)="sendMessage()">\n <ion-icon name="paper-plane-outline" slot="icon-only"></ion-icon>\n </ion-button>\n </ng-container>\n </ion-item>\n</ion-toolbar>\n\n\n\x3c!-- 语音消息输入:弹出区域 --\x3e\n\x3c!-- <ion-modal #audioModal [isOpen]="isAudioModal" (willDismiss)="closeAudio()" [initialBreakpoint]="audioModalHeightPoint" [breakpoints]="[0, audioModalHeightPoint]">\n <ng-template>\n <fm-modal-audio-message #audioComp *ngIf="isAudioModal" [chat]="chat" [modal]="audioModal"></fm-modal-audio-message>\n </ng-template>\n</ion-modal> --\x3e',styles:['@charset "UTF-8";:host-context(body.dark) .btn-voice-start{background-color:#222428;color:#fff}:host-context(body.dark) ion-textarea{background-color:#222428;color:#fff}ion-toolbar{--background:none}ion-toolbar .button-item{--inner-padding-start:5px;--inner-padding-end:0px;--padding-start:5px;--padding-end:0px}ion-toolbar ion-item{--background:transparent}.avatar{border-radius:50%;width:32px;height:32px;object-fit:cover}ion-textarea.custom{--background: #373737;--color: #fff;--padding-end: 10px;--padding-start: 10px;--placeholder-color: #ddd;--placeholder-opacity: .8}ion-textarea.custom textarea{width:calc(100% - 95px)}ion-textarea.custom ion-button{position:absolute;right:0}.input-item{display:flex;min-height:77px;align-items:center;border:none;--inner-padding-start:0px;--inner-padding-end:0px;--padding-start:0px;--padding-end:0px}.input-item ion-textarea{background-color:#fff;max-height:400px;padding:0 5px;margin:0 5px;border-radius:20px;overflow-y:auto}.input-item .btn-voice-start{display:flex;flex:1;justify-content:center;align-items:center;font-weight:700;background:#fff;border-radius:20px;min-height:50px}ion-textarea{transition:width .5s ease}ion-textarea:hover .btn-input-change,ion-textarea:focus-within .btn-input-change{display:none}.input-item:hover ion-textarea,.input-item:focus-within ion-textarea{border-color:var(--logo-color-primary)}::ng-deep .ant-modal-body{max-height:600px;overflow-y:auto}::ng-deep .ant-modal-footer{display:flex;justify-content:space-around}::ng-deep .ant-btn{width:40%}.popup-content{position:relative}.popup-content .message-content-user{display:flex;justify-content:flex-end}.popup-content .message-content-role{display:flex;justify-content:flex-start}.popup-content .message-content-system{display:flex;justify-content:center}.popup-content .user-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#e7f8ff}.popup-content .role-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#f6f6f6}.popup-content .user-question{margin-bottom:5px;display:flex;justify-content:flex-end}.popup-content .chat-time{margin-bottom:10px;display:flex;justify-content:flex-end;font-size:14px;color:#a3a3a3}.popup-content .role-time{justify-content:flex-start}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i7.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:i7.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i7.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"pipe",type:i7.DatePipe,name:"date"},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i8.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i8.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"ngmodule",type:RouterModule},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","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: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:IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:IonModal,selector:"ion-modal"},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonTextarea,selector:"ion-textarea",inputs:["autoGrow","autocapitalize","autofocus","clearOnEdit","color","cols","counter","counterFormatter","debounce","disabled","enterkeyhint","errorText","fill","helperText","inputmode","label","labelPlacement","maxlength","minlength","mode","name","placeholder","readonly","required","rows","shape","spellcheck","value","wrap"]},{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:FmChatMessageCard,selector:"fm-chat-message-card",inputs:["index","message","role","chat"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatModalInput,decorators:[{type:Component,args:[{selector:"fm-chat-modal-input",standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,RouterModule,IonToolbar,IonItem,IonButton,IonList,IonModal,IonInput,IonIcon,IonTextarea,IonPopover,IonContent,FmChatMessageCard,ModalAudioMessageComponent],template:'<ion-toolbar>\n <ion-item class="button-item" lines="none">\n \x3c!-- 设置 --\x3e\n \x3c!-- <ion-button fill="outline" slot="start">\n <ion-icon name="settings-outline"></ion-icon> \n </ion-button> --\x3e\n <ng-container *ngFor="let button of chat?.leftButtons">\n <ion-button style="--padding-start:10px;--padding-end:10px;"\n shape="round" *ngIf="button.show()" fill="outline" [title]="button?.title" slot="start" (click)="button.onClick()">\n <ion-icon [name]="button?.icon" [slot]="button?.showTitle?\'start\':\'icon-only\'"></ion-icon>\n {{button?.showTitle&&button?.title}}\n </ion-button>\n </ng-container>\n\n <ng-container *ngFor="let button of chat?.role?.get(\'buttons\')">\n <ion-button shape="round" (click)="chatServ.doButtonAction(button)" fill="outline" slot="start">\n {{button?.name}}\n </ion-button>\n </ng-container>\n\n \x3c!--分享按钮--\x3e\n @if(!chat?.hideShare){\n <ion-button shape="round" *ngIf="chat?.messageList?.length>1" (click)="showShare()" fill="outline" title="分享" slot="end">\n <ion-icon name="share-social-outline"></ion-icon>\n </ion-button>\n }\n <ion-modal [isOpen]="isShare">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="handleCancelShare()">取消</ion-button>\n </ion-buttons>\n <ion-title>对话分享</ion-title>\n <ion-buttons slot="end">\n <ion-button (click)="handleOkShare()">分享</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n <ng-container *ngFor="let message of chat?.messageList;let index=index;">\n \x3c!-- 内容格式化区域 --\x3e\n <fm-chat-message-card [chat]="chat" *ngIf="!message?.hidden" [index]="index" [message]="message" [role]="chat?.role"></fm-chat-message-card>\n </ng-container>\n\n <div *ngIf="false" class="popup-content">\n <div *ngFor="let message of chat?.messageList">\n \x3c!-- 头像 --\x3e\n <div class="item-row user" *ngIf="message?.role!=\'system\'">\n <div>\n <img class="avatar" *ngIf="message?.role!=\'user\'" [src]="(chat?.role?.get(\'avatar\') || chat?.role?.get(\'thumb\') || \'https://file-cloud.fmode.cn/E4KpGvTEto/20230930/l413e6090731854.png\')+\'?\'+\'x-image-process=image/resize,m_fixed,w_100\'+\'&imageView2/1/w/32/h/32\'" >\n </div>\n <div class="user-question">\n <app-comp-user-avatar [user]="user" *ngIf="message?.role==\'user\'"></app-comp-user-avatar>\n </div>\n </div>\n \x3c!-- 内容 --\x3e\n <div class="message-wrapper">\n <div class="message-content-user">\n <div class="user-message" *ngIf="message?.role === \'user\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-role">\n <div class="role-message" *ngIf="message?.role !== \'user\' && message?.role !== \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-system">\n <div class="system-message" *ngIf="message?.role === \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n </div>\n <div class="chat-time" *ngIf="message?.createdAt" [ngClass]="{\'role-time\': message?.role !== \'user\'}">\n <span>{{message?.createdAt | date:"dd/MM/yyyy, HH/mm/ss a"}}</span>\n </div>\n </div>\n </div> \n </ion-content>\n </ng-template>\n </ion-modal>\n\n \x3c!-- 图片 --\x3e\n <ion-button shape="round" *ngIf="chat?.currentModel?.get(\'config\')?.imageEnabled" fill="outline" slot="end" (click)="setMessageImage()">\n <ion-icon name="image-outline"></ion-icon>\n </ion-button>\n \x3c!-- 模型 --\x3e\n @if(!chat?.hideModalSelect){\n <ion-button shape="round" fill="outline" slot="end" id="model-button">\n <ion-icon name="chevron-down-outline"></ion-icon>\n {{chat?.currentModel?.get&&chat?.currentModel?.get("name")||"Fmode-C1.0-128k"}}\n </ion-button>\n <ion-popover trigger="model-button" [dismissOnSelect]="true">\n <ng-template>\n <ion-content>\n <ion-list>\n <ng-container *ngFor="let model of chat.modelList">\n <ion-item (click)="chat.currentModel = model" [button]="true" [detail]="false">\n {{model?.get("name")}}\n <ion-note slot="end">{{model?.get("credit")}}/k</ion-note>\n </ion-item>\n </ng-container>\n </ion-list>\n </ion-content>\n </ng-template>\n </ion-popover>\n }\n\n </ion-item>\n\n <ion-item class="input-item" lines="none">\n \x3c!-- 语音消息输入 --\x3e\n <ng-container *ngIf="chat?.isVoiceInputMode">\n \x3c!-- 切换文本输入 --\x3e\n <ion-button class="btn-input-change" color="primary" (click)="chat.isVoiceInputMode=false" shape="round" size="large">\n <ion-icon name="chatbox-ellipses-outline" slot="icon-only"></ion-icon>\n </ion-button>\n \n <div class="btn-voice-start" (click)="startTalk()">\n <span>\n 点击讲话\n </span> \n </div>\n </ng-container>\n\n \x3c!-- 文本消息输入 --\x3e\n <ng-container *ngIf="!chat?.isVoiceInputMode">\n \x3c!-- 切换语音输入 --\x3e\n <ion-button [style.display]="chat.isTexting?\'none\':\'flex\'" class="btn-input-change" color="primary" *ngIf="chat?.role?.get(\'voiceConfig\')" (click)="chat.isVoiceInputMode=true" shape="round" size="large">\n <ion-icon name="mic-outline" slot="icon-only"></ion-icon>\n </ion-button>\n\n \x3c!-- 文本输入区域 --\x3e\n <ion-textarea\n #userInput\n *ngIf="chat" (keydown)="onKeyDown($event)"\n [errorText]="errorText"\n [(ngModel)]="chat.userInput"\n (ionFocus)="onInputFocus()"\n (ionBlur)="chat.isTexting=false"\n [autoGrow]="true" shape="round" fill="outline"\n label="Ctrl + Enter 发送消息" placeholder="请输入您的提示词"\n labelPlacement="floating"></ion-textarea>\n \n \x3c!-- 文本发送按钮 --\x3e\n <ion-button color="primary" shape="round" size="large" (click)="sendMessage()">\n <ion-icon name="paper-plane-outline" slot="icon-only"></ion-icon>\n </ion-button>\n </ng-container>\n </ion-item>\n</ion-toolbar>\n\n\n\x3c!-- 语音消息输入:弹出区域 --\x3e\n\x3c!-- <ion-modal #audioModal [isOpen]="isAudioModal" (willDismiss)="closeAudio()" [initialBreakpoint]="audioModalHeightPoint" [breakpoints]="[0, audioModalHeightPoint]">\n <ng-template>\n <fm-modal-audio-message #audioComp *ngIf="isAudioModal" [chat]="chat" [modal]="audioModal"></fm-modal-audio-message>\n </ng-template>\n</ion-modal> --\x3e',styles:['@charset "UTF-8";:host-context(body.dark) .btn-voice-start{background-color:#222428;color:#fff}:host-context(body.dark) ion-textarea{background-color:#222428;color:#fff}ion-toolbar{--background:none}ion-toolbar .button-item{--inner-padding-start:5px;--inner-padding-end:0px;--padding-start:5px;--padding-end:0px}ion-toolbar ion-item{--background:transparent}.avatar{border-radius:50%;width:32px;height:32px;object-fit:cover}ion-textarea.custom{--background: #373737;--color: #fff;--padding-end: 10px;--padding-start: 10px;--placeholder-color: #ddd;--placeholder-opacity: .8}ion-textarea.custom textarea{width:calc(100% - 95px)}ion-textarea.custom ion-button{position:absolute;right:0}.input-item{display:flex;min-height:77px;align-items:center;border:none;--inner-padding-start:0px;--inner-padding-end:0px;--padding-start:0px;--padding-end:0px}.input-item ion-textarea{background-color:#fff;max-height:400px;padding:0 5px;margin:0 5px;border-radius:20px;overflow-y:auto}.input-item .btn-voice-start{display:flex;flex:1;justify-content:center;align-items:center;font-weight:700;background:#fff;border-radius:20px;min-height:50px}ion-textarea{transition:width .5s ease}ion-textarea:hover .btn-input-change,ion-textarea:focus-within .btn-input-change{display:none}.input-item:hover ion-textarea,.input-item:focus-within ion-textarea{border-color:var(--logo-color-primary)}::ng-deep .ant-modal-body{max-height:600px;overflow-y:auto}::ng-deep .ant-modal-footer{display:flex;justify-content:space-around}::ng-deep .ant-btn{width:40%}.popup-content{position:relative}.popup-content .message-content-user{display:flex;justify-content:flex-end}.popup-content .message-content-role{display:flex;justify-content:flex-start}.popup-content .message-content-system{display:flex;justify-content:center}.popup-content .user-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#e7f8ff}.popup-content .role-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#f6f6f6}.popup-content .user-question{margin-bottom:5px;display:flex;justify-content:flex-end}.popup-content .chat-time{margin-bottom:10px;display:flex;justify-content:flex-end;font-size:14px;color:#a3a3a3}.popup-content .role-time{justify-content:flex-start}\n']}]}],ctorParameters:()=>[{type:i1.ToastController},{type:i1.AlertController},{type:i2.ModalController},{type:i3.Router},{type:i4.ImagineService},{type:i5.ChatService},{type:i6.AccountService}],propDecorators:{audioComp:[{type:ViewChild,args:[ModalAudioMessageComponent]}],userInputComp:[{type:ViewChild,args:["userInput"]}],chat:[{type:Input}],message:[{type:Input}],role:[{type:Input}]}});
8
+ import{Component,Input,ViewChild}from"@angular/core";import{Router,RouterModule}from"@angular/router";import{AlertController,ToastController}from"@ionic/angular";import{FmodeChat}from"../../service-fmai/service-chat";import{ChatService}from"../../service-fmai/service-chat";import Parse from"parse";import{ImagineService}from"../../service-fmai/service-imagine/imagine.service";import{IonButton,IonContent,IonIcon,IonInput,IonItem,IonList,IonModal,IonPopover,IonTextarea,IonToolbar,ModalController}from"@ionic/angular/standalone";import{CommonModule}from"@angular/common";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{ModalAudioMessageComponent}from"./modal-audio-message/modal-audio-message.component";import{FmChatMessageCard}from"../chat-message-card/comp-message-card.component";import{addIcons}from"ionicons";import{imageOutline,chevronBackOutline,ellipsisHorizontalOutline,chevronDownOutline,chatboxEllipsesOutline,micOutline,paperPlaneOutline,shareSocialOutline,settingsOutline,alertOutline,colorWandOutline,peopleOutline}from"ionicons/icons";import{AccountService}from"../../../user/account/account.service";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@ionic/angular/standalone";import*as i3 from"@angular/router";import*as i4 from"../../service-fmai/service-imagine/imagine.service";import*as i5 from"../../service-fmai/service-chat";import*as i6 from"../../../user/account/account.service";import*as i7 from"@angular/common";import*as i8 from"@angular/forms";addIcons({colorWandOutline:colorWandOutline,peopleOutline:peopleOutline,alertOutline:alertOutline,imageOutline:imageOutline,chevronBackOutline:chevronBackOutline,ellipsisHorizontalOutline:ellipsisHorizontalOutline,chevronDownOutline:chevronDownOutline,chatboxEllipsesOutline:chatboxEllipsesOutline,micOutline:micOutline,paperPlaneOutline:paperPlaneOutline,shareSocialOutline:shareSocialOutline,settingsOutline:settingsOutline});export class FmChatModalInput{closeAudio(){this.audioComp?.cancel(),this.isAudioModal=!1}async startTalk(){if(this.isSending)return!1;let e,n=document.body.clientHeight||960;this.audioModalHeightPoint=Number((165/n).toFixed(2)),this.chat.stopPlayingVoice(),e=await this.modalCtrl.create({component:ModalAudioMessageComponent,componentProps:{chat:this.chat,modal:e,onBreakPointSet:()=>{e?.setCurrentBreakpoint(this.audioModalHeightPoint)}},breakpoints:[this.audioModalHeightPoint],initialBreakpoint:this.audioModalHeightPoint}),e.present()}constructor(e,n,t,o,i,a,s){this.toastCtrl=e,this.alertCtrl=n,this.modalCtrl=t,this.router=o,this.imagineServ=i,this.chatServ=a,this.account=s,this.errorText="",this.isAudioModal=!1,this.audioModalHeightPoint=.35,this.isSending=!1,this.lastMessageTimestamp=0,this.replyTimeout=15e3,this.isShare=!1,this.user=Parse.User.current()}ngOnInit(){this.loadModel();let e=this;this.chat.focusUserInput=()=>{e.chat.isVoiceInputMode=!1,e.userInputComp.setFocus()}}async loadModel(){let e=this.chat?.role?.get("model");await this.chat.loadModelList(e)}async setMessageImage(){let e=await this.imagineServ.getimg();this.chat.userImage=e,console.log(this.chat?.userImage)}onInputFocus(){this.chat.isTexting=!0,this.chat.scrollToBottom&&this.chat.scrollToBottom()}onKeyDown(e){e.ctrlKey&&"Enter"===e.key&&(console.log("Ctrl+Enter 被按下"),this.sendMessage())}async sendMessage(){if(this.isSending)return!1;const e=Date.now();if(this.lastMessageTimestamp>0&&e-this.lastMessageTimestamp<this.replyTimeout){return this.errorText="请等待上一条消息的回复或稍后再试",(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning",duration:1e3})).present(),!1}if(this.isSending=!0,this.lastMessageTimestamp=Date.now(),!await this.checkBalance())return this.isSending=!1,!1;if(!this.chat.userInput){return this.errorText="内容不能为空",(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present(),void(this.isSending=!1)}this.lastMessageTimeout&&clearTimeout(this.lastMessageTimeout),this.lastMessageTimeout=setTimeout((()=>{this.isSending=!1,this.lastMessageTimestamp=0}),this.replyTimeout),this.chat?.sendMessage(this.chat?.userInput,this.chat?.userImage,(e=>{}),{onMessageStart:e=>{clearTimeout(this.lastMessageTimeout),this.isSending=!1,this.lastMessageTimestamp=0},onSSMLComplete:e=>{console.log(e)}}),this.chat.userInput="",this.chat.userImage=""}async checkBalance(){let e=await this.account.getBilling();if(e?.credit?.balance>=10&&(this.chat.isDirect=!0),!this.chat?.currentModel?.get("payLimit"))return!0;if(e?.credit?.balance<10){return(await this.alertCtrl.create({header:"注意",subHeader:"您的余额不足,请充值后解锁高级模型",buttons:[{role:"cancel",text:"取消"},{role:"destructive",text:"充值",handler:()=>{this.router.navigateByUrl("/account/billing")}}]})).present(),!1}return!0}async getChatShare(){this.user=Parse.User.current();let e=new Parse.Query("ChatShare");e.equalTo("user",Parse.User.current().id),e.equalTo("session",this.chat?.sessionId);await e.first()}async toggleChatShare(){let e=new Parse.Query("ChatShare");e.equalTo("user",Parse.User.current().id),e.equalTo("role",this.chat?.role.id),e.equalTo("session",this.chat?.sessionId),e.select("objectId");let n=await e.first();if(n?.id)n.set("messageList",this.chat?.messageList);else{n=new(Parse.Object.extend("ChatShare")),n.set("user",{__type:"Pointer",className:"_User",objectId:Parse.User.current()?.id}),n.set("session",{__type:"Pointer",className:"ChatSession",objectId:this.chat?.sessionId}),n.set("role",{__type:"Pointer",className:"AvatarRole",objectId:this.chat?.role.id}),n.set("company",{__type:"Pointer",className:"Company",objectId:"E4KpGvTEto"}),n.set("messageList",this.chat?.messageList)}await n.save(),this.getChatShare()}async chatShareSuccessMessage(){(await this.toastCtrl.create({duration:1e3,message:"分享成功",color:"primary",icon:"information-circle",position:"top"})).present()}showShare(){this.isShare=!0}handleOkShare(){this.toggleChatShare(),this.chatShareSuccessMessage(),this.isShare=!1}handleCancelShare(){this.isShare=!1}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatModalInput,deps:[{token:i1.ToastController},{token:i1.AlertController},{token:i2.ModalController},{token:i3.Router},{token:i4.ImagineService},{token:i5.ChatService},{token:i6.AccountService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmChatModalInput,isStandalone:!0,selector:"fm-chat-modal-input",inputs:{chat:"chat",message:"message",role:"role"},viewQueries:[{propertyName:"audioComp",first:!0,predicate:ModalAudioMessageComponent,descendants:!0},{propertyName:"userInputComp",first:!0,predicate:["userInput"],descendants:!0}],ngImport:i0,template:'<ion-toolbar>\n <ion-item class="button-item" lines="none">\n \x3c!-- 设置 --\x3e\n \x3c!-- <ion-button fill="outline" slot="start">\n <ion-icon name="settings-outline"></ion-icon> \n </ion-button> --\x3e\n <ng-container *ngFor="let button of chat?.leftButtons">\n <ion-button style="--padding-start:10px;--padding-end:10px;"\n shape="round" *ngIf="button.show()" fill="outline" [title]="button?.title" slot="start" (click)="button.onClick()">\n <ion-icon [name]="button?.icon" [slot]="button?.showTitle?\'start\':\'icon-only\'"></ion-icon>\n {{button?.showTitle&&button?.title}}\n </ion-button>\n </ng-container>\n\n <ng-container *ngFor="let button of chat?.role?.get(\'buttons\')">\n <ion-button shape="round" (click)="chatServ.doButtonAction(button)" fill="outline" slot="start">\n {{button?.name}}\n </ion-button>\n </ng-container>\n\n \x3c!--分享按钮--\x3e\n @if(!chat?.hideShare){\n <ion-button shape="round" *ngIf="chat?.messageList?.length>1" (click)="showShare()" fill="outline" title="分享" slot="end">\n <ion-icon name="share-social-outline"></ion-icon>\n </ion-button>\n }\n <ion-modal [isOpen]="isShare">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="handleCancelShare()">取消</ion-button>\n </ion-buttons>\n <ion-title>对话分享</ion-title>\n <ion-buttons slot="end">\n <ion-button (click)="handleOkShare()">分享</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n <ng-container *ngFor="let message of chat?.messageList;let index=index;">\n \x3c!-- 内容格式化区域 --\x3e\n <fm-chat-message-card [chat]="chat" *ngIf="!message?.hidden" [index]="index" [message]="message" [role]="chat?.role"></fm-chat-message-card>\n </ng-container>\n\n <div *ngIf="false" class="popup-content">\n <div *ngFor="let message of chat?.messageList">\n \x3c!-- 头像 --\x3e\n <div class="item-row user" *ngIf="message?.role!=\'system\'">\n <div>\n <img class="avatar" *ngIf="message?.role!=\'user\'" [src]="(chat?.role?.get(\'avatar\') || chat?.role?.get(\'thumb\') || \'https://file-cloud.fmode.cn/E4KpGvTEto/20230930/l413e6090731854.png\')+\'?\'+\'x-image-process=image/resize,m_fixed,w_100\'+\'&imageView2/1/w/32/h/32\'" >\n </div>\n <div class="user-question">\n <app-comp-user-avatar [user]="user" *ngIf="message?.role==\'user\'"></app-comp-user-avatar>\n </div>\n </div>\n \x3c!-- 内容 --\x3e\n <div class="message-wrapper">\n <div class="message-content-user">\n <div class="user-message" *ngIf="message?.role === \'user\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-role">\n <div class="role-message" *ngIf="message?.role !== \'user\' && message?.role !== \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-system">\n <div class="system-message" *ngIf="message?.role === \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n </div>\n <div class="chat-time" *ngIf="message?.createdAt" [ngClass]="{\'role-time\': message?.role !== \'user\'}">\n <span>{{message?.createdAt | date:"dd/MM/yyyy, HH/mm/ss a"}}</span>\n </div>\n </div>\n </div> \n </ion-content>\n </ng-template>\n </ion-modal>\n\n \x3c!-- 图片 --\x3e\n <ion-button shape="round" *ngIf="chat?.currentModel?.get(\'config\')?.imageEnabled" fill="outline" slot="end" (click)="setMessageImage()">\n <ion-icon name="image-outline"></ion-icon>\n </ion-button>\n \x3c!-- 模型 --\x3e\n @if(!chat?.hideModalSelect){\n <ion-button shape="round" fill="outline" slot="end" id="model-button">\n <ion-icon name="chevron-down-outline"></ion-icon>\n {{chat?.currentModel?.get&&chat?.currentModel?.get("name")||"Fmode-C1.0-128k"}}\n </ion-button>\n <ion-popover trigger="model-button" [dismissOnSelect]="true">\n <ng-template>\n <ion-content>\n <ion-list>\n <ng-container *ngFor="let model of chat.modelList">\n <ion-item (click)="chat.currentModel = model" [button]="true" [detail]="false">\n {{model?.get("name")}}\n <ion-note slot="end">{{model?.get("credit")}}/k</ion-note>\n </ion-item>\n </ng-container>\n </ion-list>\n </ion-content>\n </ng-template>\n </ion-popover>\n }\n\n </ion-item>\n\n <ion-item class="input-item" lines="none">\n \x3c!-- 语音消息输入 --\x3e\n <ng-container *ngIf="chat?.isVoiceInputMode">\n \x3c!-- 切换文本输入 --\x3e\n <ion-button class="btn-input-change" color="primary" (click)="chat.isVoiceInputMode=false" shape="round" size="large">\n <ion-icon name="chatbox-ellipses-outline" slot="icon-only"></ion-icon>\n </ion-button>\n \n <div class="btn-voice-start" (click)="startTalk()" [class.disabled]="isSending">\n <span>\n 点击讲话\n </span> \n </div>\n </ng-container>\n\n \x3c!-- 文本消息输入 --\x3e\n <ng-container *ngIf="!chat?.isVoiceInputMode">\n \x3c!-- 切换语音输入 --\x3e\n <ion-button [style.display]="chat.isTexting?\'none\':\'flex\'" class="btn-input-change" color="primary" *ngIf="chat?.role?.get(\'voiceConfig\')" (click)="chat.isVoiceInputMode=true" shape="round" size="large">\n <ion-icon name="mic-outline" slot="icon-only"></ion-icon>\n </ion-button>\n\n \x3c!-- 文本输入区域 --\x3e\n <ion-textarea\n #userInput\n *ngIf="chat" (keydown)="onKeyDown($event)"\n [errorText]="errorText"\n [(ngModel)]="chat.userInput"\n (ionFocus)="onInputFocus()"\n (ionBlur)="chat.isTexting=false"\n [autoGrow]="true" shape="round" fill="outline"\n label="Ctrl + Enter 发送消息" placeholder="请输入您的提示词"\n labelPlacement="floating"></ion-textarea>\n \n \x3c!-- 文本发送按钮 --\x3e\n <ion-button [disabled]="isSending"\n color="primary" shape="round" size="large" (click)="sendMessage()">\n <ion-icon name="paper-plane-outline" slot="icon-only"></ion-icon>\n </ion-button>\n </ng-container>\n </ion-item>\n</ion-toolbar>\n\n\n\x3c!-- 语音消息输入:弹出区域 --\x3e\n\x3c!-- <ion-modal #audioModal [isOpen]="isAudioModal" (willDismiss)="closeAudio()" [initialBreakpoint]="audioModalHeightPoint" [breakpoints]="[0, audioModalHeightPoint]">\n <ng-template>\n <fm-modal-audio-message #audioComp *ngIf="isAudioModal" [chat]="chat" [modal]="audioModal"></fm-modal-audio-message>\n </ng-template>\n</ion-modal> --\x3e',styles:['@charset "UTF-8";:host-context(body.dark) .btn-voice-start{background-color:#222428;color:#fff}:host-context(body.dark) ion-textarea{background-color:#222428;color:#fff}ion-toolbar{--background:none}ion-toolbar .button-item{--inner-padding-start:5px;--inner-padding-end:0px;--padding-start:5px;--padding-end:0px}ion-toolbar ion-item{--background:transparent}.disabled{opacity:.5;pointer-events:none}.avatar{border-radius:50%;width:32px;height:32px;object-fit:cover}ion-textarea.custom{--background: #373737;--color: #fff;--padding-end: 10px;--padding-start: 10px;--placeholder-color: #ddd;--placeholder-opacity: .8}ion-textarea.custom textarea{width:calc(100% - 95px)}ion-textarea.custom ion-button{position:absolute;right:0}.input-item{display:flex;min-height:77px;align-items:center;border:none;--inner-padding-start:0px;--inner-padding-end:0px;--padding-start:0px;--padding-end:0px}.input-item ion-textarea{background-color:#fff;max-height:400px;padding:0 5px;margin:0 5px;border-radius:20px;overflow-y:auto}.input-item .btn-voice-start{display:flex;flex:1;justify-content:center;align-items:center;font-weight:700;background:#fff;border-radius:20px;min-height:50px}ion-textarea{transition:width .5s ease}ion-textarea:hover .btn-input-change,ion-textarea:focus-within .btn-input-change{display:none}.input-item:hover ion-textarea,.input-item:focus-within ion-textarea{border-color:var(--logo-color-primary)}::ng-deep .ant-modal-body{max-height:600px;overflow-y:auto}::ng-deep .ant-modal-footer{display:flex;justify-content:space-around}::ng-deep .ant-btn{width:40%}.popup-content{position:relative}.popup-content .message-content-user{display:flex;justify-content:flex-end}.popup-content .message-content-role{display:flex;justify-content:flex-start}.popup-content .message-content-system{display:flex;justify-content:center}.popup-content .user-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#e7f8ff}.popup-content .role-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#f6f6f6}.popup-content .user-question{margin-bottom:5px;display:flex;justify-content:flex-end}.popup-content .chat-time{margin-bottom:10px;display:flex;justify-content:flex-end;font-size:14px;color:#a3a3a3}.popup-content .role-time{justify-content:flex-start}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i7.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:i7.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i7.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"pipe",type:i7.DatePipe,name:"date"},{kind:"ngmodule",type:FormsModule},{kind:"directive",type:i8.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:i8.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"ngmodule",type:RouterModule},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","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: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:IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:IonModal,selector:"ion-modal"},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonTextarea,selector:"ion-textarea",inputs:["autoGrow","autocapitalize","autofocus","clearOnEdit","color","cols","counter","counterFormatter","debounce","disabled","enterkeyhint","errorText","fill","helperText","inputmode","label","labelPlacement","maxlength","minlength","mode","name","placeholder","readonly","required","rows","shape","spellcheck","value","wrap"]},{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:FmChatMessageCard,selector:"fm-chat-message-card",inputs:["index","message","role","chat"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatModalInput,decorators:[{type:Component,args:[{selector:"fm-chat-modal-input",standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,RouterModule,IonToolbar,IonItem,IonButton,IonList,IonModal,IonInput,IonIcon,IonTextarea,IonPopover,IonContent,FmChatMessageCard,ModalAudioMessageComponent],template:'<ion-toolbar>\n <ion-item class="button-item" lines="none">\n \x3c!-- 设置 --\x3e\n \x3c!-- <ion-button fill="outline" slot="start">\n <ion-icon name="settings-outline"></ion-icon> \n </ion-button> --\x3e\n <ng-container *ngFor="let button of chat?.leftButtons">\n <ion-button style="--padding-start:10px;--padding-end:10px;"\n shape="round" *ngIf="button.show()" fill="outline" [title]="button?.title" slot="start" (click)="button.onClick()">\n <ion-icon [name]="button?.icon" [slot]="button?.showTitle?\'start\':\'icon-only\'"></ion-icon>\n {{button?.showTitle&&button?.title}}\n </ion-button>\n </ng-container>\n\n <ng-container *ngFor="let button of chat?.role?.get(\'buttons\')">\n <ion-button shape="round" (click)="chatServ.doButtonAction(button)" fill="outline" slot="start">\n {{button?.name}}\n </ion-button>\n </ng-container>\n\n \x3c!--分享按钮--\x3e\n @if(!chat?.hideShare){\n <ion-button shape="round" *ngIf="chat?.messageList?.length>1" (click)="showShare()" fill="outline" title="分享" slot="end">\n <ion-icon name="share-social-outline"></ion-icon>\n </ion-button>\n }\n <ion-modal [isOpen]="isShare">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="handleCancelShare()">取消</ion-button>\n </ion-buttons>\n <ion-title>对话分享</ion-title>\n <ion-buttons slot="end">\n <ion-button (click)="handleOkShare()">分享</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n <ng-container *ngFor="let message of chat?.messageList;let index=index;">\n \x3c!-- 内容格式化区域 --\x3e\n <fm-chat-message-card [chat]="chat" *ngIf="!message?.hidden" [index]="index" [message]="message" [role]="chat?.role"></fm-chat-message-card>\n </ng-container>\n\n <div *ngIf="false" class="popup-content">\n <div *ngFor="let message of chat?.messageList">\n \x3c!-- 头像 --\x3e\n <div class="item-row user" *ngIf="message?.role!=\'system\'">\n <div>\n <img class="avatar" *ngIf="message?.role!=\'user\'" [src]="(chat?.role?.get(\'avatar\') || chat?.role?.get(\'thumb\') || \'https://file-cloud.fmode.cn/E4KpGvTEto/20230930/l413e6090731854.png\')+\'?\'+\'x-image-process=image/resize,m_fixed,w_100\'+\'&imageView2/1/w/32/h/32\'" >\n </div>\n <div class="user-question">\n <app-comp-user-avatar [user]="user" *ngIf="message?.role==\'user\'"></app-comp-user-avatar>\n </div>\n </div>\n \x3c!-- 内容 --\x3e\n <div class="message-wrapper">\n <div class="message-content-user">\n <div class="user-message" *ngIf="message?.role === \'user\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-role">\n <div class="role-message" *ngIf="message?.role !== \'user\' && message?.role !== \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n <div class="message-content-system">\n <div class="system-message" *ngIf="message?.role === \'system\'">\n <div class="item-content">\n \x3c!-- <fm-markdown-preview *ngIf="!message?.complete" class="content-style" [content]="message?.content" [render]="false"></fm-markdown-preview> --\x3e\n <fm-markdown-preview *ngIf="message?.complete" class="content-style" [content]="message?.content"></fm-markdown-preview>\n </div>\n </div>\n </div>\n </div>\n <div class="chat-time" *ngIf="message?.createdAt" [ngClass]="{\'role-time\': message?.role !== \'user\'}">\n <span>{{message?.createdAt | date:"dd/MM/yyyy, HH/mm/ss a"}}</span>\n </div>\n </div>\n </div> \n </ion-content>\n </ng-template>\n </ion-modal>\n\n \x3c!-- 图片 --\x3e\n <ion-button shape="round" *ngIf="chat?.currentModel?.get(\'config\')?.imageEnabled" fill="outline" slot="end" (click)="setMessageImage()">\n <ion-icon name="image-outline"></ion-icon>\n </ion-button>\n \x3c!-- 模型 --\x3e\n @if(!chat?.hideModalSelect){\n <ion-button shape="round" fill="outline" slot="end" id="model-button">\n <ion-icon name="chevron-down-outline"></ion-icon>\n {{chat?.currentModel?.get&&chat?.currentModel?.get("name")||"Fmode-C1.0-128k"}}\n </ion-button>\n <ion-popover trigger="model-button" [dismissOnSelect]="true">\n <ng-template>\n <ion-content>\n <ion-list>\n <ng-container *ngFor="let model of chat.modelList">\n <ion-item (click)="chat.currentModel = model" [button]="true" [detail]="false">\n {{model?.get("name")}}\n <ion-note slot="end">{{model?.get("credit")}}/k</ion-note>\n </ion-item>\n </ng-container>\n </ion-list>\n </ion-content>\n </ng-template>\n </ion-popover>\n }\n\n </ion-item>\n\n <ion-item class="input-item" lines="none">\n \x3c!-- 语音消息输入 --\x3e\n <ng-container *ngIf="chat?.isVoiceInputMode">\n \x3c!-- 切换文本输入 --\x3e\n <ion-button class="btn-input-change" color="primary" (click)="chat.isVoiceInputMode=false" shape="round" size="large">\n <ion-icon name="chatbox-ellipses-outline" slot="icon-only"></ion-icon>\n </ion-button>\n \n <div class="btn-voice-start" (click)="startTalk()" [class.disabled]="isSending">\n <span>\n 点击讲话\n </span> \n </div>\n </ng-container>\n\n \x3c!-- 文本消息输入 --\x3e\n <ng-container *ngIf="!chat?.isVoiceInputMode">\n \x3c!-- 切换语音输入 --\x3e\n <ion-button [style.display]="chat.isTexting?\'none\':\'flex\'" class="btn-input-change" color="primary" *ngIf="chat?.role?.get(\'voiceConfig\')" (click)="chat.isVoiceInputMode=true" shape="round" size="large">\n <ion-icon name="mic-outline" slot="icon-only"></ion-icon>\n </ion-button>\n\n \x3c!-- 文本输入区域 --\x3e\n <ion-textarea\n #userInput\n *ngIf="chat" (keydown)="onKeyDown($event)"\n [errorText]="errorText"\n [(ngModel)]="chat.userInput"\n (ionFocus)="onInputFocus()"\n (ionBlur)="chat.isTexting=false"\n [autoGrow]="true" shape="round" fill="outline"\n label="Ctrl + Enter 发送消息" placeholder="请输入您的提示词"\n labelPlacement="floating"></ion-textarea>\n \n \x3c!-- 文本发送按钮 --\x3e\n <ion-button [disabled]="isSending"\n color="primary" shape="round" size="large" (click)="sendMessage()">\n <ion-icon name="paper-plane-outline" slot="icon-only"></ion-icon>\n </ion-button>\n </ng-container>\n </ion-item>\n</ion-toolbar>\n\n\n\x3c!-- 语音消息输入:弹出区域 --\x3e\n\x3c!-- <ion-modal #audioModal [isOpen]="isAudioModal" (willDismiss)="closeAudio()" [initialBreakpoint]="audioModalHeightPoint" [breakpoints]="[0, audioModalHeightPoint]">\n <ng-template>\n <fm-modal-audio-message #audioComp *ngIf="isAudioModal" [chat]="chat" [modal]="audioModal"></fm-modal-audio-message>\n </ng-template>\n</ion-modal> --\x3e',styles:['@charset "UTF-8";:host-context(body.dark) .btn-voice-start{background-color:#222428;color:#fff}:host-context(body.dark) ion-textarea{background-color:#222428;color:#fff}ion-toolbar{--background:none}ion-toolbar .button-item{--inner-padding-start:5px;--inner-padding-end:0px;--padding-start:5px;--padding-end:0px}ion-toolbar ion-item{--background:transparent}.disabled{opacity:.5;pointer-events:none}.avatar{border-radius:50%;width:32px;height:32px;object-fit:cover}ion-textarea.custom{--background: #373737;--color: #fff;--padding-end: 10px;--padding-start: 10px;--placeholder-color: #ddd;--placeholder-opacity: .8}ion-textarea.custom textarea{width:calc(100% - 95px)}ion-textarea.custom ion-button{position:absolute;right:0}.input-item{display:flex;min-height:77px;align-items:center;border:none;--inner-padding-start:0px;--inner-padding-end:0px;--padding-start:0px;--padding-end:0px}.input-item ion-textarea{background-color:#fff;max-height:400px;padding:0 5px;margin:0 5px;border-radius:20px;overflow-y:auto}.input-item .btn-voice-start{display:flex;flex:1;justify-content:center;align-items:center;font-weight:700;background:#fff;border-radius:20px;min-height:50px}ion-textarea{transition:width .5s ease}ion-textarea:hover .btn-input-change,ion-textarea:focus-within .btn-input-change{display:none}.input-item:hover ion-textarea,.input-item:focus-within ion-textarea{border-color:var(--logo-color-primary)}::ng-deep .ant-modal-body{max-height:600px;overflow-y:auto}::ng-deep .ant-modal-footer{display:flex;justify-content:space-around}::ng-deep .ant-btn{width:40%}.popup-content{position:relative}.popup-content .message-content-user{display:flex;justify-content:flex-end}.popup-content .message-content-role{display:flex;justify-content:flex-start}.popup-content .message-content-system{display:flex;justify-content:center}.popup-content .user-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#e7f8ff}.popup-content .role-message{padding:10px 10px 0;border-radius:10px;width:fit-content;max-width:100%;background-color:#f6f6f6}.popup-content .user-question{margin-bottom:5px;display:flex;justify-content:flex-end}.popup-content .chat-time{margin-bottom:10px;display:flex;justify-content:flex-end;font-size:14px;color:#a3a3a3}.popup-content .role-time{justify-content:flex-start}\n']}]}],ctorParameters:()=>[{type:i1.ToastController},{type:i1.AlertController},{type:i2.ModalController},{type:i3.Router},{type:i4.ImagineService},{type:i5.ChatService},{type:i6.AccountService}],propDecorators:{audioComp:[{type:ViewChild,args:[ModalAudioMessageComponent]}],userInputComp:[{type:ViewChild,args:["userInput"]}],chat:[{type:Input}],message:[{type:Input}],role:[{type:Input}]}});
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1tb2RhbC1pbnB1dC9tb2RhbC1pbnB1dC5jb21wb25lbnQubWpz`
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-panel/chat-panel.component.mjs
7
7
  */
8
- import{CommonModule}from"@angular/common";import{Component,ElementRef,Input,ViewChild}from"@angular/core";import{ActivatedRoute,Router}from"@angular/router";import{ChatService}from"../../service-fmai/service-chat";import{combineLatest}from"rxjs";import{FmChatHeaderArea}from"../chat-header-area";import{FmChatMesssageArea}from"../chat-message-area";import{FmChatModalInput}from"../chat-modal-input";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"../../service-fmai/service-chat";import*as i3 from"@angular/common";export class ChatPanelComponent{constructor(e,t,a){this.route=e,this.router=t,this.chatServ=a,this.mode="page",this.isDirect=!1,this.showInputModal=!0,this.showMessageArea=!0,this.showHeaderArea=!0,this.hideShare=!1,this.hideModalSelect=!1,this.hideInputPreview=!1,window.location.pathname?.indexOf("chat/session")>-1&&document.body.classList.add("dark")}listenDivChange(){let e=new MutationObserver((()=>{this.fmodeChat.scrollComp=this.contentComp})),t={childList:!0,subtree:!0,attributes:!0};this.contentComp?.nativeElement&&e.observe(this.contentComp?.nativeElement,t)}ngAfterViewInit(){}ngOnInit(){"modal"==this.mode&&this.initChat(),"page"==this.mode&&combineLatest([this.route.params,this.route.queryParams]).subscribe((async e=>{this.initChat(e)}))}async initChat(e){console.log("ChatComp OnInit");let t=e?.[0];if(this.chatId=t?.chatId||this.chatId||null,this.chatId&&await this.chatServ.initChatMap(this.chatId),this.roleId=t?.roleId||this.roleId||"2DXJkRsjXK",this.roleId){let e=await this.chatServ.createNewRoleChat(this.roleId);this.fmodeChat=e}this.chatId&&(this.fmodeChat=this.chatServ.chatMap[this.chatId],this.fmodeChat||this.router.navigate(["/chat/pro/mask"],{queryParams:{type:"employee"}}),this.fmodeChat=this.chatServ.chatMap[this.chatId]),this.leftButtons&&(this.fmodeChat.leftButtons=this.leftButtons),window.location.pathname?.indexOf("chat/session")>-1?this.fmodeChat.isVoiceInputMode=!0:this.fmodeChat.isVoiceInputMode=!1,this.modelList&&(this.fmodeChat.modelList=this.modelList,this.fmodeChat.currentModel=this.modelList[0]),this.isDirect&&(this.fmodeChat.isDirect=this.isDirect),this.hideShare&&(this.fmodeChat.hideShare=this.hideShare),this.hideModalSelect&&(this.fmodeChat.hideModalSelect=this.hideModalSelect),this.hideInputPreview&&(this.fmodeChat.hideInputPreview=this.hideInputPreview),this.fmodeChat.mode=this.mode,this.fmodeChat.onChatSaved=this.onChatSaved,this.fmodeChat.onMessage=this.onMessage,this.fmodeChat.onUserSend=this.onUserSend,this.fmodeChat.onClose=this.onClose,this.onChatInit&&this.onChatInit(this.fmodeChat),setTimeout((()=>{this.fmodeChat.scrollComp=this.contentComp,this.listenDivChange()}),1e3),this.sayWelcome()}sayWelcome(){this.fmodeChat.voiceConfig?.welcome?.enabled&&this.fmodeChat.welcome()}loadMask(){}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ChatPanelComponent,deps:[{token:i1.ActivatedRoute},{token:i1.Router},{token:i2.ChatService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ChatPanelComponent,isStandalone:!0,selector:"app-chat-panel",inputs:{goBack:"goBack",onChatSaved:"onChatSaved",onChatInit:"onChatInit",onMessage:"onMessage",onUserSend:"onUserSend",onClose:"onClose",mode:"mode",chatId:"chatId",maskId:"maskId",roleId:"roleId",leftButtons:"leftButtons",modelList:"modelList",isDirect:"isDirect",showInputModal:"showInputModal",showMessageArea:"showMessageArea",showHeaderArea:"showHeaderArea",hideShare:"hideShare",hideModalSelect:"hideModalSelect",hideInputPreview:"hideInputPreview"},viewQueries:[{propertyName:"headerArea",first:!0,predicate:FmChatHeaderArea,descendants:!0},{propertyName:"contentComp",first:!0,predicate:["contentComp"],descendants:!0}],ngImport:i0,template:'\n\x3c!-- <ion-header></ion-header> --\x3e\n\x3c!-- <ion-content class="ion-padding"> --\x3e\n <div class="chat-page" *ngIf="fmodeChat">\n <div class="header" [class.avatarHeader]="fmodeChat?.isAvatarShow">\n <ng-content select="[chat-header]"></ng-content>\n <fm-chat-header-area [goBack]="goBack" *ngIf="showHeaderArea" [chat]="fmodeChat"></fm-chat-header-area>\n </div>\n \n <div class="content" #contentComp>\n <ng-content select="[chat-content]"></ng-content>\n <fm-chat-message-area *ngIf="showMessageArea" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n \n <div class="footer">\n <ng-content select="[chat-footer]"></ng-content>\n <fm-chat-modal-input *ngIf="showInputModal" [chat]="fmodeChat"></fm-chat-modal-input>\n </div>\n </div>\n\n\x3c!-- </ion-content> --\x3e',styles:[".chat-page{display:flex;flex-direction:column;height:100%;background:#f3f3f3}.chat-page .content,.chat-page .header,.chat-page .footer{justify-content:center;align-items:center}.chat-page .content{flex-grow:1;flex:1;overflow-y:auto}.chat-page .avatarHeader{height:35vh!important;overflow:hidden}.chat-page .header{height:44px;margin-bottom:-1px}.chat-page .footer{height:auto;min-height:130px}:host-context(body.dark) .chat-page{background:#000}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i3.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:FmChatHeaderArea,selector:"fm-chat-header-area",inputs:["chat","goBack"]},{kind:"component",type:FmChatMesssageArea,selector:"fm-chat-message-area",inputs:["chatId","chat"]},{kind:"component",type:FmChatModalInput,selector:"fm-chat-modal-input",inputs:["chat","message","role"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ChatPanelComponent,decorators:[{type:Component,args:[{selector:"app-chat-panel",standalone:!0,imports:[CommonModule,FmChatHeaderArea,FmChatMesssageArea,FmChatModalInput],template:'\n\x3c!-- <ion-header></ion-header> --\x3e\n\x3c!-- <ion-content class="ion-padding"> --\x3e\n <div class="chat-page" *ngIf="fmodeChat">\n <div class="header" [class.avatarHeader]="fmodeChat?.isAvatarShow">\n <ng-content select="[chat-header]"></ng-content>\n <fm-chat-header-area [goBack]="goBack" *ngIf="showHeaderArea" [chat]="fmodeChat"></fm-chat-header-area>\n </div>\n \n <div class="content" #contentComp>\n <ng-content select="[chat-content]"></ng-content>\n <fm-chat-message-area *ngIf="showMessageArea" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n \n <div class="footer">\n <ng-content select="[chat-footer]"></ng-content>\n <fm-chat-modal-input *ngIf="showInputModal" [chat]="fmodeChat"></fm-chat-modal-input>\n </div>\n </div>\n\n\x3c!-- </ion-content> --\x3e',styles:[".chat-page{display:flex;flex-direction:column;height:100%;background:#f3f3f3}.chat-page .content,.chat-page .header,.chat-page .footer{justify-content:center;align-items:center}.chat-page .content{flex-grow:1;flex:1;overflow-y:auto}.chat-page .avatarHeader{height:35vh!important;overflow:hidden}.chat-page .header{height:44px;margin-bottom:-1px}.chat-page .footer{height:auto;min-height:130px}:host-context(body.dark) .chat-page{background:#000}\n"]}]}],ctorParameters:()=>[{type:i1.ActivatedRoute},{type:i1.Router},{type:i2.ChatService}],propDecorators:{headerArea:[{type:ViewChild,args:[FmChatHeaderArea]}],goBack:[{type:Input}],onChatSaved:[{type:Input}],onChatInit:[{type:Input}],onMessage:[{type:Input}],onUserSend:[{type:Input}],onClose:[{type:Input}],mode:[{type:Input}],chatId:[{type:Input}],maskId:[{type:Input}],roleId:[{type:Input}],leftButtons:[{type:Input}],modelList:[{type:Input}],isDirect:[{type:Input}],showInputModal:[{type:Input}],showMessageArea:[{type:Input}],showHeaderArea:[{type:Input}],hideShare:[{type:Input}],hideModalSelect:[{type:Input}],hideInputPreview:[{type:Input}],contentComp:[{type:ViewChild,args:["contentComp"]}]}});export async function openChatPanelModal(e,t){let a=await e.create({component:ChatPanelComponent,componentProps:{roleId:t.roleId,chatId:t.chatId,leftButtons:t.leftButtons,modelList:t.modelList,isDirect:t.isDirect,hideModalSelect:t.hideModalSelect,hideShare:t.hideShare,hideInputPreview:t.hideInputPreview,mode:"modal",onChatInit:t?.onChatInit,onChatSaved:t?.onChatSaved,onMessage:t?.onMessage,onUserSend:t?.onUserSend,onClose:t?.onClose,goBack:()=>{e.dismiss()}},cssClass:"modal-chat-panel",backdropDismiss:!1,keyboardClose:!1});return await a.present(),a}
8
+ import{CommonModule}from"@angular/common";import{Component,ElementRef,Input,ViewChild}from"@angular/core";import{ActivatedRoute,Router}from"@angular/router";import{ChatService}from"../../service-fmai/service-chat";import{combineLatest}from"rxjs";import{FmChatHeaderArea}from"../chat-header-area";import{FmChatMesssageArea}from"../chat-message-area";import{FmChatModalInput}from"../chat-modal-input";import{ModalController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"../../service-fmai/service-chat";import*as i3 from"@angular/common";export class ChatPanelComponent{constructor(e,t,a){this.route=e,this.router=t,this.chatServ=a,this.mode="page",this.isDirect=!1,this.showInputModal=!0,this.showMessageArea=!0,this.showHeaderArea=!0,this.hideShare=!1,this.hideModalSelect=!1,this.hideInputPreview=!1,window.location.pathname?.indexOf("chat/session")>-1&&document.body.classList.add("dark")}listenDivChange(){let e=new MutationObserver((()=>{this.fmodeChat.scrollComp=this.contentComp})),t={childList:!0,subtree:!0,attributes:!0};this.contentComp?.nativeElement&&e.observe(this.contentComp?.nativeElement,t)}ngAfterViewInit(){}ngOnInit(){"modal"==this.mode&&this.initChat(),"page"==this.mode&&combineLatest([this.route.params,this.route.queryParams]).subscribe((async e=>{this.initChat(e)}))}async initChat(e){console.log("ChatComp OnInit");let t=e?.[0];if(this.chatId=t?.chatId||this.chatId||null,this.chatId&&await this.chatServ.initChatMap(this.chatId),this.roleId=t?.roleId||this.roleId||"2DXJkRsjXK",this.roleId){let e=await this.chatServ.createNewRoleChat(this.roleId);this.fmodeChat=e}this.chatId&&(this.fmodeChat=this.chatServ.chatMap[this.chatId],this.fmodeChat||this.router.navigate(["/chat/pro/mask"],{queryParams:{type:"employee"}}),this.fmodeChat=this.chatServ.chatMap[this.chatId]),this.leftButtons&&(this.fmodeChat.leftButtons=this.leftButtons),window.location.pathname?.indexOf("chat/session")>-1?this.fmodeChat.isVoiceInputMode=!0:this.fmodeChat.isVoiceInputMode=!1,this.modelList&&(this.fmodeChat.modelList=this.modelList,this.fmodeChat.currentModel=this.modelList[0]),this.isDirect&&(this.fmodeChat.isDirect=this.isDirect),this.hideShare&&(this.fmodeChat.hideShare=this.hideShare),this.hideModalSelect&&(this.fmodeChat.hideModalSelect=this.hideModalSelect),this.hideInputPreview&&(this.fmodeChat.hideInputPreview=this.hideInputPreview),this.fmodeChat.mode=this.mode,this.fmodeChat.onChatSaved=this.onChatSaved,this.fmodeChat.onMessage=this.onMessage,this.fmodeChat.onUserSend=this.onUserSend,this.fmodeChat.onClose=this.onClose,this.onChatInit&&this.onChatInit(this.fmodeChat),setTimeout((()=>{this.fmodeChat.scrollComp=this.contentComp,this.listenDivChange()}),1e3),this.sayWelcome()}sayWelcome(){this.fmodeChat.voiceConfig?.welcome?.enabled&&this.fmodeChat.welcome()}loadMask(){}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ChatPanelComponent,deps:[{token:i1.ActivatedRoute},{token:i1.Router},{token:i2.ChatService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ChatPanelComponent,isStandalone:!0,selector:"app-chat-panel",inputs:{goBack:"goBack",onChatSaved:"onChatSaved",onChatInit:"onChatInit",onMessage:"onMessage",onUserSend:"onUserSend",onClose:"onClose",mode:"mode",chatId:"chatId",maskId:"maskId",roleId:"roleId",leftButtons:"leftButtons",modelList:"modelList",isDirect:"isDirect",showInputModal:"showInputModal",showMessageArea:"showMessageArea",showHeaderArea:"showHeaderArea",hideShare:"hideShare",hideModalSelect:"hideModalSelect",hideInputPreview:"hideInputPreview"},providers:[ModalController],viewQueries:[{propertyName:"headerArea",first:!0,predicate:FmChatHeaderArea,descendants:!0},{propertyName:"contentComp",first:!0,predicate:["contentComp"],descendants:!0}],ngImport:i0,template:'\n\x3c!-- <ion-header></ion-header> --\x3e\n\x3c!-- <ion-content class="ion-padding"> --\x3e\n <div class="chat-page" *ngIf="fmodeChat">\n <div class="header" [class.avatarHeader]="fmodeChat?.isAvatarShow">\n <ng-content select="[chat-header]"></ng-content>\n <fm-chat-header-area [goBack]="goBack" *ngIf="showHeaderArea" [chat]="fmodeChat"></fm-chat-header-area>\n </div>\n \n <div class="content" #contentComp>\n <ng-content select="[chat-content]"></ng-content>\n <fm-chat-message-area *ngIf="showMessageArea" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n \n <div class="footer">\n <ng-content select="[chat-footer]"></ng-content>\n <fm-chat-modal-input *ngIf="showInputModal" [chat]="fmodeChat"></fm-chat-modal-input>\n </div>\n </div>\n\n\x3c!-- </ion-content> --\x3e',styles:[".chat-page{display:flex;flex-direction:column;height:100%;background:#f3f3f3}.chat-page .content,.chat-page .header,.chat-page .footer{justify-content:center;align-items:center}.chat-page .content{flex-grow:1;flex:1;overflow-y:auto}.chat-page .avatarHeader{height:35vh!important;overflow:hidden}.chat-page .header{height:44px;margin-bottom:-1px}.chat-page .footer{height:auto;min-height:130px}:host-context(body.dark) .chat-page{background:#000}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i3.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:FmChatHeaderArea,selector:"fm-chat-header-area",inputs:["chat","goBack"]},{kind:"component",type:FmChatMesssageArea,selector:"fm-chat-message-area",inputs:["chatId","chat"]},{kind:"component",type:FmChatModalInput,selector:"fm-chat-modal-input",inputs:["chat","message","role"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ChatPanelComponent,decorators:[{type:Component,args:[{selector:"app-chat-panel",standalone:!0,providers:[ModalController],imports:[CommonModule,FmChatHeaderArea,FmChatMesssageArea,FmChatModalInput],template:'\n\x3c!-- <ion-header></ion-header> --\x3e\n\x3c!-- <ion-content class="ion-padding"> --\x3e\n <div class="chat-page" *ngIf="fmodeChat">\n <div class="header" [class.avatarHeader]="fmodeChat?.isAvatarShow">\n <ng-content select="[chat-header]"></ng-content>\n <fm-chat-header-area [goBack]="goBack" *ngIf="showHeaderArea" [chat]="fmodeChat"></fm-chat-header-area>\n </div>\n \n <div class="content" #contentComp>\n <ng-content select="[chat-content]"></ng-content>\n <fm-chat-message-area *ngIf="showMessageArea" [chat]="fmodeChat"></fm-chat-message-area>\n </div>\n \n <div class="footer">\n <ng-content select="[chat-footer]"></ng-content>\n <fm-chat-modal-input *ngIf="showInputModal" [chat]="fmodeChat"></fm-chat-modal-input>\n </div>\n </div>\n\n\x3c!-- </ion-content> --\x3e',styles:[".chat-page{display:flex;flex-direction:column;height:100%;background:#f3f3f3}.chat-page .content,.chat-page .header,.chat-page .footer{justify-content:center;align-items:center}.chat-page .content{flex-grow:1;flex:1;overflow-y:auto}.chat-page .avatarHeader{height:35vh!important;overflow:hidden}.chat-page .header{height:44px;margin-bottom:-1px}.chat-page .footer{height:auto;min-height:130px}:host-context(body.dark) .chat-page{background:#000}\n"]}]}],ctorParameters:()=>[{type:i1.ActivatedRoute},{type:i1.Router},{type:i2.ChatService}],propDecorators:{headerArea:[{type:ViewChild,args:[FmChatHeaderArea]}],goBack:[{type:Input}],onChatSaved:[{type:Input}],onChatInit:[{type:Input}],onMessage:[{type:Input}],onUserSend:[{type:Input}],onClose:[{type:Input}],mode:[{type:Input}],chatId:[{type:Input}],maskId:[{type:Input}],roleId:[{type:Input}],leftButtons:[{type:Input}],modelList:[{type:Input}],isDirect:[{type:Input}],showInputModal:[{type:Input}],showMessageArea:[{type:Input}],showHeaderArea:[{type:Input}],hideShare:[{type:Input}],hideModalSelect:[{type:Input}],hideInputPreview:[{type:Input}],contentComp:[{type:ViewChild,args:["contentComp"]}]}});export async function openChatPanelModal(e,t){let a=await e.create({component:ChatPanelComponent,componentProps:{roleId:t.roleId,chatId:t.chatId,leftButtons:t.leftButtons,modelList:t.modelList,isDirect:t.isDirect,hideModalSelect:t.hideModalSelect,hideShare:t.hideShare,hideInputPreview:t.hideInputPreview,mode:"modal",onChatInit:t?.onChatInit,onChatSaved:t?.onChatSaved,onMessage:t?.onMessage,onUserSend:t?.onUserSend,onClose:t?.onClose,goBack:()=>{e.dismiss()}},cssClass:"modal-chat-panel",backdropDismiss:!1,keyboardClose:!1});return await a.present(),a}
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1wYW5lbC9jaGF0LXBhbmVsLmNvbXBvbmVudC5tanM=`
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
+
@@ -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-splitter/fm-story-splitter.component.mjs
7
+ */
8
+ import{CommonModule,DecimalPipe}from"@angular/common";import{Component,Input}from"@angular/core";import{MatButtonModule}from"@angular/material/button";import{MatCardModule}from"@angular/material/card";import{AgentStory}from"../../../core";import{MatTooltipModule}from"@angular/material/tooltip";import*as i0 from"@angular/core";import*as i1 from"@angular/common";import*as i2 from"@angular/material/card";import*as i3 from"@angular/material/button";import*as i4 from"@angular/material/tooltip";export class FmStorySplitterComponent{constructor(){this.docsList=[]}ngOnInit(){this.story?.story?.id||(this.story=new AgentStory),this.loadSplitter()}async loadSplitter(){let t=this.story?.story?.get("attach");t?.id&&(this.docsList=await(this.story?.loadSlipt(t))),console.log("docsList",this.docsList)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStorySplitterComponent,deps:[],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:FmStorySplitterComponent,isStandalone:!0,selector:"fm-story-splitter",inputs:{story:"story"},ngImport:i0,template:'<div class="layout">\n <ng-container *ngFor="let doc of docsList;let idx=index">\n <mat-card>\n <mat-card-header>\n <mat-card-subtitle>#{{story?.story?.id | uppercase}}{{idx+1 | number: \'3.0\'}} 行{{doc?.get("metadata")?.loc?.lines?.from}}至行{{doc?.get("metadata")?.loc?.lines?.to}}</mat-card-subtitle>\n <mat-card-title>递归字符分割</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <p [matTooltip]="doc?.get(\'pageContent\')" matTooltipPosition="left">{{doc?.get("pageContent")}}</p>\n </mat-card-content>\n <mat-card-actions>\n <button mat-button>#块大小{{500}}</button>\n <button mat-button>#块层叠{{100}}</button>\n </mat-card-actions>\n \x3c!-- <mat-card-footer>\n <mat-progress-bar mode="indeterminate"></mat-progress-bar>\n </mat-card-footer> --\x3e\n </mat-card>\n </ng-container>\n</div>',styles:[".layout{display:flex;flex-direction:column;align-items:center;overflow-y:auto;height:100%;padding:7px}.layout mat-card{margin-bottom:7px;max-width:400px}.layout mat-card p{display:-webkit-box;overflow:hidden;word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i1.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"pipe",type:i1.UpperCasePipe,name:"uppercase"},{kind:"pipe",type:i1.DecimalPipe,name:"number"},{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:"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:"ngmodule",type:MatTooltipModule},{kind:"directive",type:i4.MatTooltip,selector:"[matTooltip]",inputs:["matTooltipPosition","matTooltipPositionAtOrigin","matTooltipDisabled","matTooltipShowDelay","matTooltipHideDelay","matTooltipTouchGestures","matTooltip","matTooltipClass"],exportAs:["matTooltip"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStorySplitterComponent,decorators:[{type:Component,args:[{selector:"fm-story-splitter",standalone:!0,imports:[CommonModule,DecimalPipe,MatCardModule,MatButtonModule,MatTooltipModule],template:'<div class="layout">\n <ng-container *ngFor="let doc of docsList;let idx=index">\n <mat-card>\n <mat-card-header>\n <mat-card-subtitle>#{{story?.story?.id | uppercase}}{{idx+1 | number: \'3.0\'}} 行{{doc?.get("metadata")?.loc?.lines?.from}}至行{{doc?.get("metadata")?.loc?.lines?.to}}</mat-card-subtitle>\n <mat-card-title>递归字符分割</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <p [matTooltip]="doc?.get(\'pageContent\')" matTooltipPosition="left">{{doc?.get("pageContent")}}</p>\n </mat-card-content>\n <mat-card-actions>\n <button mat-button>#块大小{{500}}</button>\n <button mat-button>#块层叠{{100}}</button>\n </mat-card-actions>\n \x3c!-- <mat-card-footer>\n <mat-progress-bar mode="indeterminate"></mat-progress-bar>\n </mat-card-footer> --\x3e\n </mat-card>\n </ng-container>\n</div>',styles:[".layout{display:flex;flex-direction:column;align-items:center;overflow-y:auto;height:100%;padding:7px}.layout mat-card{margin-bottom:7px;max-width:400px}.layout mat-card p{display:-webkit-box;overflow:hidden;word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical}\n"]}]}],ctorParameters:()=>[],propDecorators:{story:[{type:Input}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LXNwbGl0dGVyL2ZtLXN0b3J5LXNwbGl0dGVyLmNvbXBvbmVudC5tanM=`
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/index.mjs
7
+ */
8
+ export*from"./fm-story-card/fm-story-card.component";export*from"./fm-story-list/fm-story-list.component";export*from"./fm-story-loader/fm-story-loader.component";export*from"./fm-story-splitter/fm-story-splitter.component";export*from"./story.service";
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2luZGV4Lm1qcw==`
10
+