sense-audio-type 1.0.0

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.
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface RewriteResultProps {
3
+ text: string;
4
+ onClose: () => void;
5
+ onCopy: () => void;
6
+ }
7
+ declare const RewriteResult: React.FC<RewriteResultProps>;
8
+ export default RewriteResult;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ export type StatusIndicatorStatus = 'speaking' | 'silent' | 'loading';
3
+ interface StatusIndicatorProps {
4
+ status: StatusIndicatorStatus;
5
+ isHiding?: boolean;
6
+ volumes?: number[];
7
+ }
8
+ declare const StatusIndicator: React.FC<StatusIndicatorProps>;
9
+ export default StatusIndicator;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ interface ToastProps {
3
+ message: string;
4
+ type?: 'success' | 'error' | 'info';
5
+ duration?: number;
6
+ onClose: () => void;
7
+ }
8
+ declare const Toast: React.FC<ToastProps>;
9
+ export default Toast;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface WaveBarsProps {
3
+ volumes?: number[];
4
+ isStatic?: boolean;
5
+ className?: string;
6
+ }
7
+ declare const WaveBars: React.FC<WaveBarsProps>;
8
+ export default WaveBars;
@@ -0,0 +1,9 @@
1
+ export * from './sdks';
2
+ export interface SDKOptions {
3
+ enabled?: boolean;
4
+ /** 用于换取 token */
5
+ publicKey?: string;
6
+ /** 后续请求参数 target_lang */
7
+ targetLang?: string;
8
+ }
9
+ export declare function initSDK(options?: SDKOptions): void;
@@ -0,0 +1,2 @@
1
+ import*as e from"react";import t,{useState as n,useEffect as o}from"react";import*as r from"react-dom/client";import*as i from"react-dom";function a(e){return"https://staging.api.senseaudio.cn".concat("/v1/asr/input_stream")}function s(){return"undefined"!=typeof window&&(window.senseAiHelperSdk||(window.senseAiHelperSdk={}),window.senseAiHelperSdk.inputListener||(window.senseAiHelperSdk.inputListener={shortcutKey:{key:"Alt"},recognitionLang:"zh-CN",asrApi:{url:a(),headers:{},mode:"stream"},publicKey:"",targetLang:"None",model:"sense-asr-deepthink",authToken:null,authTokenPromise:null,selectedText:"",currentInputElement:null,isKeyPressed:!1,isRecordingStarting:!1,isIndicatorShown:!1,mediaRecorder:null,audioChunks:[],isRecording:!1,recognizedText:"",interimText:"",audioContext:null,audioAnalyser:null,audioAnalysisFrameId:null,currentVolumes:null,statusIndicatorRoot:null,toastRoot:null,currentIndicatorStatus:void 0,isHidingIndicator:!1,hideIndicatorTimer:null,isCreatingIndicator:!1,rewriteResultRoot:null,onRecordingStart:null,onRecordingUpdate:null,onRecordingEnd:null,onError:null,shouldContinueRecording:function(){return!1},isInitialized:!1})),window.senseAiHelperSdk.inputListener}function l(e){var t=s();Object.assign(t,e)}var d=function(){return d=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},d.apply(this,arguments)};function u(e,t,n,o){return new(n||(n=Promise))(function(r,i){function a(e){try{l(o.next(e))}catch(e){i(e)}}function s(e){try{l(o.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,s)}l((o=o.apply(e,t||[])).next())})}function c(e,t){var n,o,r,i={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(l){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,o&&(r=2&s[0]?o.return:s[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,s[1])).done)return r;switch(o=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(r=i.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){i.label=s[1];break}if(6===s[0]&&i.label<r[1]){i.label=r[1],r=s;break}if(r&&i.label<r[2]){i.label=r[2],i.ops.push(s);break}r[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],o=0}finally{n=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,l])}}}function _(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===n&&o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}"function"==typeof SuppressedError&&SuppressedError;var m={statusIndicator:"StatusIndicator-module__statusIndicator___joWb0",hiding:"StatusIndicator-module__hiding___sv8Jg",waveContainer:"StatusIndicator-module__waveContainer___1DHzO",waveBarsContainer:"StatusIndicator-module__waveBarsContainer___MOYeO",dotsContainer:"StatusIndicator-module__dotsContainer___BOEoa",dot:"StatusIndicator-module__dot___A5ESi",loadingWithWaveContainer:"StatusIndicator-module__loadingWithWaveContainer___DG1Yx",rotatingPoints:"StatusIndicator-module__rotatingPoints___P6lwm",rotatingPoint:"StatusIndicator-module__rotatingPoint___QmHOY",waveBar:"StatusIndicator-module__waveBar___irNLu"};_("@keyframes StatusIndicator-module__slideIn___g7A8l{0%{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes StatusIndicator-module__slideOut___7BI02{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}@keyframes StatusIndicator-module__fadeIn___-ft5Z{0%{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%)}}@keyframes StatusIndicator-module__fadeOut___S2Lbf{0%{opacity:1;transform:translate(-50%)}to{opacity:0;transform:translate(-50%,10px)}}@keyframes StatusIndicator-module__waveAnimation___eM33k{0%,to{height:6px}25%{height:18px}50%{height:30px}75%{height:18px}}@keyframes StatusIndicator-module__spin___9Y9Qv{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes StatusIndicator-module__loadingDots___tV9-o{0%,80%,to{opacity:.5;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@keyframes StatusIndicator-module__rotatePoints___jYhWY{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.StatusIndicator-module__statusIndicator___joWb0{align-items:flex-start;animation:StatusIndicator-module__fadeIn___-ft5Z .3s ease-out;background:linear-gradient(180deg,#14192f,#252c4a);border:1px solid var(--Angular,#ffc876);border-radius:27px;bottom:-30px;box-shadow:0 4px 24px 0 rgba(36,54,134,.25);box-sizing:border-box;display:flex;gap:3px;height:49.5px;justify-content:center;left:50%;padding:12px 16.5px 12px 12px;position:fixed;transform:translate(-50%);width:171px;z-index:2147483647}.StatusIndicator-module__statusIndicator___joWb0.StatusIndicator-module__hiding___sv8Jg{animation:StatusIndicator-module__fadeOut___S2Lbf .3s ease-out}.StatusIndicator-module__waveContainer___1DHzO{align-items:center;display:flex;height:100%;justify-content:center;position:relative;width:100%}.StatusIndicator-module__waveBarsContainer___MOYeO{align-items:center;display:flex;height:25.5px;justify-content:center}.StatusIndicator-module__waveCanvas___XUPyx{display:block;height:100%;width:100%}.StatusIndicator-module__dotsContainer___BOEoa{align-items:center;display:flex;gap:9px;height:36px}.StatusIndicator-module__dot___A5ESi{background:#fff;border-radius:50%;height:6px;opacity:.6;width:9px}.StatusIndicator-module__loadingWithWaveContainer___DG1Yx{align-items:center;display:flex;gap:3px;height:100%;justify-content:center;width:100%}.StatusIndicator-module__loadingDots___tV9-o{align-items:center;display:flex;flex-shrink:0;gap:4.5px}.StatusIndicator-module__loadingDot___zwgLy{animation:StatusIndicator-module__loadingDots___tV9-o 1.4s ease-in-out infinite;background:#fff;border-radius:50%;height:6px;width:6px}.StatusIndicator-module__loadingDot___zwgLy:first-child{animation-delay:0s}.StatusIndicator-module__loadingDot___zwgLy:nth-child(2){animation-delay:.2s}.StatusIndicator-module__loadingDot___zwgLy:nth-child(3){animation-delay:.4s}.StatusIndicator-module__rotatingPoints___P6lwm{animation:StatusIndicator-module__rotatePoints___jYhWY 1s linear infinite;flex-shrink:0;height:24px;position:relative;width:24px}.StatusIndicator-module__rotatingPoint___QmHOY{background:#fff;border-radius:1.5px;height:6px;left:50%;margin-left:-1.5px;margin-top:-3px;position:absolute;top:50%;transform-origin:center center;width:3px}.StatusIndicator-module__rotatingPoint___QmHOY:first-child{opacity:.25;transform:rotate(0deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(2){opacity:.4;transform:rotate(45deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(3){opacity:.55;transform:rotate(90deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(4){opacity:.7;transform:rotate(135deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(5){opacity:.85;transform:rotate(180deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(6){opacity:.95;transform:rotate(225deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(7){opacity:1;transform:rotate(270deg) translateY(-7.5px)}.StatusIndicator-module__rotatingPoint___QmHOY:nth-child(8){opacity:.95;transform:rotate(315deg) translateY(-7.5px)}.StatusIndicator-module__loadingContainer___5w5a0{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.StatusIndicator-module__loadingOverlay___wLfWy{align-items:center;backdrop-filter:blur(2px);background:rgba(0,0,0,.3);border-radius:12px;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.StatusIndicator-module__spinner___j8wsu{animation:StatusIndicator-module__spin___9Y9Qv .8s linear infinite;border:3px solid hsla(0,0%,100%,.3);border-radius:50%;border-top-color:#fff;height:24px;width:24px}.StatusIndicator-module__waveBar___irNLu{align-items:center;align-self:center;display:flex;flex-shrink:0;justify-content:center;transition:height .1s ease-out}");var f={barCount:13,maxBarHeight:25.5,minBarHeight:4.5,barWidth:4.5,gap:3,borderRadius:2.25},p=f,g={gradientStart:"#ffffff",gradientMiddle:"#f0f0f0",gradientEnd:"#ffffff"},h={interpolationFactor:.7},v=d(d({},f),{staticHeightRatio:.5}),y=function(e){var r=e.volumes,i=e.isStatic,a=void 0!==i&&i,s=e.className,l=void 0===s?"":s,d=n(new Array(p.barCount).fill(p.minBarHeight)),u=d[0],c=d[1];o(function(){if(a){var e=p,t=e.maxBarHeight-e.minBarHeight,n=v.staticHeightRatio,o=new Array(e.barCount).fill(0).map(function(o,r){var i=(e.barCount-1)/2,a=Math.abs(r-i)/i,s=1-.4*Math.pow(a,2),l=Math.max(.6,Math.min(1,s));return e.minBarHeight+l*t*n});c(o)}else if(r&&0!==r.length){var i=p,s=h,l=i.maxBarHeight-i.minBarHeight;c(function(e){var t=(i.barCount-1)/2;return e.map(function(e,n){var o=r[n]||0,a=n-t,d=Math.round(t-a),u=(o+(r[Math.max(0,Math.min(i.barCount-1,d))]||0))/2,c=Math.sqrt(Math.min(u/255,1)),_=Math.abs(a)/t,m=1-.4*Math.pow(_,2),f=Math.max(.6,Math.min(1,m)),p=e+(i.minBarHeight+c*f*l-e)*s.interpolationFactor;return Math.max(i.minBarHeight,Math.min(p,i.maxBarHeight))})})}},[r,a]);var _=p,f=g;return t.createElement("div",{className:"".concat(m.waveContainer," ").concat(m.waveBarsContainer," ").concat(l)},u.map(function(e,n){var o=n===_.barCount-1;return t.createElement("div",{key:n,className:m.waveBar,style:{background:"linear-gradient(to bottom, ".concat(f.gradientStart,", ").concat(f.gradientMiddle,", ").concat(f.gradientEnd,")"),width:"".concat(_.barWidth,"px"),height:"".concat(e,"px"),borderRadius:"".concat(_.borderRadius,"px"),marginRight:o?"0":"".concat(_.gap,"px")}})}))},w=function(t){var n=t.status,o=t.isHiding,r=void 0!==o&&o,i=t.volumes,a=[m.statusIndicator,r?m.hiding:"","loading"===n?m.loadingWithWave:""].filter(Boolean).join(" ");return e.createElement("div",{id:"sdk-status-indicator",className:a},"speaking"===n?e.createElement("div",{className:m.loadingWithWaveContainer},e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 16 16",fill:"none"},e.createElement("path",{d:"M8 12.6665V14.6665",stroke:"url(#paint0_linear_1445_38138)",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),e.createElement("path",{d:"M10.3337 3.66683C10.3337 2.37817 9.28899 1.3335 8.00033 1.3335C6.71166 1.3335 5.66699 2.37817 5.66699 3.66683V8.00016C5.66699 9.28883 6.71166 10.3335 8.00033 10.3335C9.28899 10.3335 10.3337 9.28883 10.3337 8.00016V3.66683Z",fill:"url(#paint1_linear_1445_38138)",stroke:"url(#paint2_linear_1445_38138)",strokeWidth:"1.66667",strokeLinejoin:"round"}),e.createElement("path",{d:"M3 7.6665C3 10.4279 5.23857 12.6665 8 12.6665C10.7614 12.6665 13 10.4279 13 7.6665",stroke:"url(#paint3_linear_1445_38138)",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),e.createElement("defs",null,e.createElement("linearGradient",{id:"paint0_linear_1445_38138",x1:"8.5",y1:"12.6665",x2:"8.5",y2:"14.6665",gradientUnits:"userSpaceOnUse"},e.createElement("stop",{stopColor:"#ECFAFF"}),e.createElement("stop",{offset:"1",stopColor:"#BDC8FD"})),e.createElement("linearGradient",{id:"paint1_linear_1445_38138",x1:"8.00033",y1:"1.3335",x2:"8.00033",y2:"10.3335",gradientUnits:"userSpaceOnUse"},e.createElement("stop",{stopColor:"#ECFAFF"}),e.createElement("stop",{offset:"1",stopColor:"#BDC8FD"})),e.createElement("linearGradient",{id:"paint2_linear_1445_38138",x1:"8.00033",y1:"1.3335",x2:"8.00033",y2:"10.3335",gradientUnits:"userSpaceOnUse"},e.createElement("stop",{stopColor:"#ECFAFF"}),e.createElement("stop",{offset:"1",stopColor:"#BDC8FD"})),e.createElement("linearGradient",{id:"paint3_linear_1445_38138",x1:"8",y1:"7.6665",x2:"8",y2:"12.6665",gradientUnits:"userSpaceOnUse"},e.createElement("stop",{stopColor:"#ECFAFF"}),e.createElement("stop",{offset:"1",stopColor:"#BDC8FD"})))),e.createElement(y,{volumes:i,isStatic:!1})):"silent"===n?e.createElement("div",{className:m.loadingWithWaveContainer},e.createElement("div",{className:m.dotsContainer},Array.from({length:10}).map(function(t,n){return e.createElement("div",{key:n,className:m.dot})}))):"loading"===n?e.createElement("div",{className:m.loadingWithWaveContainer},e.createElement("div",{className:m.rotatingPoints},Array.from({length:8}).map(function(t,n){return e.createElement("div",{key:n,className:m.rotatingPoint})})),e.createElement(y,{isStatic:!0})):null)},x={toast:"Toast-module__toast___TNqrY",slideIn:"Toast-module__slideIn___OVESo",success:"Toast-module__success___NZdm8",error:"Toast-module__error___yF0Tc",info:"Toast-module__info___lUXoo",hiding:"Toast-module__hiding___mUWl5",slideOut:"Toast-module__slideOut___M2e0e"};_("@keyframes Toast-module__slideIn___OVESo{0%{opacity:0;transform:translate(-50%,-100%)}to{opacity:1;transform:translate(-50%)}}@keyframes Toast-module__slideOut___M2e0e{0%{opacity:1;transform:translate(-50%)}to{opacity:0;transform:translate(-50%,-100%)}}.Toast-module__toast___TNqrY{animation:Toast-module__slideIn___OVESo .3s ease-out;border-radius:8px;font-family:Arial,sans-serif;font-size:14px;left:50%;padding:6px 14px;position:fixed;top:20px;transform:translateX(-50%);z-index:2147483647}.Toast-module__toast___TNqrY.Toast-module__success___NZdm8{background-color:#6bff8d;border:1px solid #fde2e2;color:#f67e7e}.Toast-module__toast___TNqrY.Toast-module__error___yF0Tc{background-color:#fef0f0;border:1px solid #fde2e2;color:#f67e7e}.Toast-module__toast___TNqrY.Toast-module__info___lUXoo{background-color:#fdf6ec;border:1px solid #faecd8;color:#eaae55}.Toast-module__toast___TNqrY.Toast-module__hiding___mUWl5{animation:Toast-module__slideOut___M2e0e .3s ease-out}");var b=function(t){var n=t.message,o=t.type,r=void 0===o?"success":o,i=t.duration,a=void 0===i?2e3:i,s=t.onClose;e.useEffect(function(){var e=setTimeout(function(){s()},a);return function(){return clearTimeout(e)}},[a,s]);var l=[x.toast,x[r]].filter(Boolean).join(" ");return e.createElement("div",{className:l},n)},R="RewriteResult-module__overlay___4tJMY",E="RewriteResult-module__header___cheJF",I="RewriteResult-module__close___D9aIV",k="RewriteResult-module__body___vQYaF",T="RewriteResult-module__footer___68OdM",S="RewriteResult-module__m2___cEJhO",C="RewriteResult-module__logo___hbjf0",A="RewriteResult-module__button___nLV0i";_('@keyframes RewriteResult-module__sdk-rewrite-fade-in___tItTw{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.RewriteResult-module__overlay___4tJMY{align-items:flex-end;display:flex;height:100%;justify-content:center;pointer-events:none;width:100%}.RewriteResult-module__popup___IjoJz{animation:RewriteResult-module__sdk-rewrite-fade-in___tItTw .18s ease-out;background:rgba(0,0,0,.85);border-radius:12px;box-shadow:0 12px 32px rgba(0,0,0,.35);color:#fff;display:flex;flex-direction:column;font-size:14px;gap:12px;max-width:480px;min-width:280px;padding:16px 20px;pointer-events:auto}.RewriteResult-module__header___cheJF{align-items:center;display:flex;justify-content:flex-end}.RewriteResult-module__close___D9aIV{background:transparent;border:none;color:#fff;cursor:pointer;font-size:16px;line-height:1;padding:0;position:absolute;right:16px;top:8px}.RewriteResult-module__body___vQYaF{background:hsla(0,0%,100%,.08);border-radius:8px;line-height:1.5;padding:12px;word-break:break-word}.RewriteResult-module__footer___68OdM{display:flex;gap:8px;justify-content:flex-end}.RewriteResult-module__primary___MIFKB{background:#4b8cf7;border:none;border-radius:8px;color:#fff;cursor:pointer;font-weight:600;padding:8px 14px;transition:background .12s ease}.RewriteResult-module__primary___MIFKB:hover{background:#3b79e0}.RewriteResult-module__primary___MIFKB:active{background:#2f67c4}.RewriteResult-module__m2___cEJhO{align-items:center;animation:RewriteResult-module__gradient-shift___vfj5d 5s ease-in-out infinite;background:linear-gradient(135deg,#1e1e24 10%,#050505 60%);background-size:100% 100%;border-radius:12px;display:flex;flex-direction:column;gap:12px;justify-content:center;max-width:480px;min-width:280px;padding:16px 20px;pointer-events:auto;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.RewriteResult-module__m2___cEJhO .RewriteResult-module__logo___hbjf0{-webkit-text-fill-color:currentColor;background:none;background-clip:initial;-webkit-background-clip:initial;color:#fff;display:inline-block;font-size:14px;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:baseline}.RewriteResult-module__m2___cEJhO .RewriteResult-module__logo___hbjf0 svg{height:5vmin;margin-right:-1vmin;width:5vmin}.RewriteResult-module__m2___cEJhO:after{--size:1px;z-index:-1}.RewriteResult-module__m2___cEJhO:before{--size:6px;animation:RewriteResult-module__blur-animation___tZWlQ 3s ease-in-out infinite alternate;filter:blur(1vmin);z-index:-2}@keyframes RewriteResult-module__blur-animation___tZWlQ{to{filter:blur(3vmin);transform:scale(1.05)}}@keyframes RewriteResult-module__gradient-shift___vfj5d{0%{background-position:0 50%}50%{background-position:100% 50%}to{background-position:0 50%}}.RewriteResult-module__button___nLV0i{background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987);border-radius:10px;color:#fff;cursor:pointer;font-size:14px;font-weight:700;padding:6px 24px;pointer-events:auto;position:relative;text-decoration:none}.RewriteResult-module__button___nLV0i span{position:relative;z-index:1}.RewriteResult-module__button___nLV0i:before{background:#272727;border-radius:9px;content:"";inset:1px;position:absolute;transition:.5s}.RewriteResult-module__button___nLV0i:hover:before{opacity:.7}.RewriteResult-module__button___nLV0i:after{background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987);border-radius:9px;content:"";filter:blur(20px);inset:0;opacity:0;position:absolute;transition:.5s}.RewriteResult-module__button___nLV0i:hover:after{opacity:1}');var L=function(e){var n=e.text,o=e.onClose,r=e.onCopy;return t.createElement("div",{className:R},t.createElement("div",{className:S},t.createElement("div",{className:E},t.createElement("button",{className:I,onClick:o,"aria-label":"close"},"×")),t.createElement("div",{className:C},t.createElement("div",{className:k},n)),t.createElement("div",{className:T},t.createElement("button",{onClick:r,className:A},t.createElement("span",null,"复制")))))};var M="undefined"!=typeof window&&window.React?window.React:e,O=function(){if("undefined"!=typeof window&&window.ReactDOM){var e=window.ReactDOM;if(e.createRoot)return{createRoot:e.createRoot,render:e.render};if(e.render)return{createRoot:function(t){return{render:function(n){e.render(n,t)}}},render:e.render}}if("undefined"!=typeof window&&window.ReactDOMClient){var t=window.ReactDOMClient;if(t.createRoot)return{createRoot:t.createRoot}}return r&&"function"==typeof r.createRoot?r:i&&"function"==typeof i.render?{createRoot:function(e){return{render:function(t){i.render(t,e)}}},render:i.render}:r}();function j(e){var t=s();if(!t.isCreatingIndicator&&(t.isHidingIndicator&&null!==t.hideIndicatorTimer&&(clearTimeout(t.hideIndicatorTimer),l({hideIndicatorTimer:null,isHidingIndicator:!1})),M&&O))if(t.currentIndicatorStatus===e&&t.statusIndicatorRoot)"speaking"===e&&P();else{l({isCreatingIndicator:!0});try{if(function(){if(!s().statusIndicatorRoot){var e=document.getElementById("sdk-status-indicator-container");e||((e=document.createElement("div")).id="sdk-status-indicator-container",e.style.cssText="position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647",document.body.appendChild(e));try{l({statusIndicatorRoot:O.createRoot(e)})}catch(e){}}}(),!t.statusIndicatorRoot)return void l({isCreatingIndicator:!1});var n=M.createElement("div",{id:"sdk-status-indicator-wrapper",style:{position:"fixed",bottom:"100px",left:"50%",transform:"translate(-50%, 0)",zIndex:2147483647,pointerEvents:"none"}},M.createElement(w,{status:e,isHiding:!1,volumes:t.currentVolumes||void 0}));t.statusIndicatorRoot.render(n),l({currentIndicatorStatus:e})}catch(e){}finally{l({isCreatingIndicator:!1})}}}function P(){var e=s();if(e.statusIndicatorRoot&&"speaking"===e.currentIndicatorStatus&&M){var t=M.createElement("div",{id:"sdk-status-indicator-wrapper",style:{position:"fixed",bottom:"100px",left:"50%",transform:"translate(-50%, 0)",zIndex:2147483647,pointerEvents:"none"}},M.createElement(w,{status:e.currentIndicatorStatus,isHiding:!1,volumes:e.currentVolumes||void 0}));e.statusIndicatorRoot.render(t)}}function z(){var e=s();if(B(),!e.isHidingIndicator&&e.statusIndicatorRoot&&void 0!==e.currentIndicatorStatus&&M){l({isHidingIndicator:!0}),null!==e.hideIndicatorTimer&&clearTimeout(e.hideIndicatorTimer);var t=M.createElement("div",{id:"sdk-status-indicator-wrapper",style:{position:"fixed",bottom:"100px",left:"50%",transform:"translate(-50%, 0)",zIndex:2147483647,pointerEvents:"none"}},M.createElement(w,{status:e.currentIndicatorStatus,isHiding:!0,volumes:void 0}));e.statusIndicatorRoot.render(t);var n=window.setTimeout(function(){e.statusIndicatorRoot&&e.statusIndicatorRoot.render(null),l({currentIndicatorStatus:void 0,hideIndicatorTimer:null,isHidingIndicator:!1})},300);l({hideIndicatorTimer:n})}}function K(e){var t=s();t.audioAnalysisFrameId&&B();var n=e.frequencyBinCount,o=new Uint8Array(n),r=0;var i=requestAnimationFrame(function i(a){if(a-r>=20){e.getByteFrequencyData(o);for(var d=p.barCount,u=[],c=0;c<d;c++){var _=Math.pow(n,c/d),m=Math.pow(n,(c+1)/d),f=Math.floor(_),g=c===d-1?n:Math.floor(m);if(f>=g||f>=n)u.push(0);else{for(var h=0,v=0,y=0,w=f;w<g&&w<n;w++){var x=o[w];h+=x,x>v&&(v=x),y++}var b=.4*v+.6*(y>0?h/y:0);u.push(Math.max(b,5))}}!function(e){var t=s();if("loading"===t.currentIndicatorStatus)return;l({currentVolumes:e}),P()}(u),r=a}null!==t.audioAnalysisFrameId&&l({audioAnalysisFrameId:requestAnimationFrame(i)})});l({audioAnalysisFrameId:i})}function B(){var e=s();e.audioAnalysisFrameId&&(cancelAnimationFrame(e.audioAnalysisFrameId),l({audioAnalysisFrameId:null,currentVolumes:null}))}function H(e,t){void 0===t&&(t="success");var n=s();if(M&&O){!function(){if(!s().toastRoot){var e=document.getElementById("sdk-toast-container");e||((e=document.createElement("div")).id="sdk-toast-container",e.style.cssText="position:fixed;top:0;right:0;z-index:2147483647;pointer-events:none",document.body.appendChild(e));try{l({toastRoot:O.createRoot(e)})}catch(e){}}}();var o=M.createElement(b,{message:e,type:t,duration:2e3,onClose:function(){n.toastRoot&&n.toastRoot.render(null)}});n.toastRoot&&(n.toastRoot.render(o),setTimeout(function(){n.toastRoot&&n.toastRoot.render(null)},2e3))}}function N(e){var t=this;if(s(),M&&O&&e){!function(){if(!s().rewriteResultRoot){var e=document.getElementById("sdk-rewrite-result-container");e||((e=document.createElement("div")).id="sdk-rewrite-result-container",e.style.cssText="position:fixed;inset:0;z-index:2147483647;display:flex;align-items:flex-end;justify-content:center;pointer-events:none;padding:40px",document.body.appendChild(e));try{l({rewriteResultRoot:O.createRoot(e)})}catch(e){}}}();var n=s().rewriteResultRoot;if(n){var o=function(){n.render(null)},r=M.createElement(L,{text:e,onClose:o,onCopy:function(){return u(t,void 0,void 0,function(){return c(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,navigator.clipboard.writeText(e)];case 1:return t.sent(),o(),[3,3];case 2:return t.sent(),H("复制失败","error"),[3,3];case 3:return[2]}})})}});n.render(r)}}}var F={"x-platform":"WEB","x-version":"0.0.1","x-product":"SenseType"};function D(e){return"None"===e?"":e}function Y(){return u(this,void 0,void 0,function(){var e,t,n=this;return c(this,function(o){switch(o.label){case 0:return(e=s()).authToken?[2,e.authToken]:e.authTokenPromise?[4,e.authTokenPromise]:[3,2];case 1:case 3:return[2,o.sent()];case 2:if(!e.publicKey)throw new Error("缺少 publicKey:无法换取 token");return t=u(n,void 0,void 0,function(){var t,n;return c(this,function(o){switch(o.label){case 0:return[4,Q({durationSeconds:86400,publicKey:e.publicKey})];case 1:if(t=o.sent(),n=function(e){var t,n,o,r;if("string"==typeof e)return e.trim()||null;if(!e||"object"!=typeof e)return null;for(var i=e,a=0,s=[null==i?void 0:i.token,null==i?void 0:i.access_token,null===(t=null==i?void 0:i.result)||void 0===t?void 0:t.token,null===(n=null==i?void 0:i.result)||void 0===n?void 0:n.access_token,null===(o=null==i?void 0:i.data)||void 0===o?void 0:o.token,null===(r=null==i?void 0:i.data)||void 0===r?void 0:r.access_token];a<s.length;a++){var l=s[a];if("string"==typeof l&&l.trim())return l.trim()}return null}(t),!n)throw new Error("获取 token 失败:响应中未找到 token 字段");return l({authToken:n,authTokenPromise:null}),[2,n]}})}).catch(function(e){throw l({authTokenPromise:null}),e}),l({authTokenPromise:t}),[4,t]}})})}function U(e){return u(this,void 0,void 0,function(){var t,n,o;return c(this,function(r){switch(r.label){case 0:return t=s(),n=d(d({},F),e||{}),t.publicKey?[4,Y()]:[3,2];case 1:o=r.sent(),n.Authorization=function(e){var t=e.trim();return t?/^Bearer\s+/i.test(t)?t:"Bearer ".concat(t):t}(o),r.label=2;case 2:return[2,n]}})})}function W(e){return u(this,void 0,void 0,function(){var t,n,o,r,i,a,s,l,u,_,m;return c(this,function(c){switch(c.label){case 0:return t="https://staging.api.senseaudio.cn".concat("/v1/asr/input_rewrite"),[4,U(d(d({},(null===(_=e.asrApi)||void 0===_?void 0:_.headers)||{}),{accept:"application/json","x-platform":"WEB","x-version":"0.0.1","x-product":"SenseType","Content-Type":"application/x-www-form-urlencoded"}))];case 1:return n=c.sent(),o=D(e.targetLang),r={original_text:e.originalText,rewrite_instruction:e.rewriteInstruction,model:e.model},o&&(r.target_lang=o),i=new URLSearchParams(r).toString(),[4,fetch(t,{method:"POST",headers:n,body:i})];case 2:return(a=c.sent()).ok?[3,4]:[4,a.text().catch(function(){return""})];case 3:throw s=c.sent(),new Error("重写接口失败: ".concat(a.status," ").concat(a.statusText).concat(s?" - ".concat(s):""));case 4:return[4,a.json().catch(function(){return{}})];case 5:return l=c.sent(),[2,"string"==typeof(u=null===(m=null==l?void 0:l.result)||void 0===m?void 0:m.rewritten_text)?u:""]}})})}function V(e){return u(this,void 0,void 0,function(){var t,n,o,r,i,a,s,l,u,_,m,f,p,g;return c(this,function(c){switch(c.label){case 0:return t="recording.mp3",n=new File([e.audioBlob],t,{type:"audio/mpeg"}),(o=new FormData).append("file",n,t),o.append("model",e.model),(r=D(e.targetLang))&&o.append("target_lang",r),[4,U(d({accept:"*/*","Accept-Language":"en,zh-CN;q=0.9,zh;q=0.8","Cache-Control":"no-cache","x-platform":"WEB","x-version":"0.0.1","x-product":"SenseType",Pragma:"no-cache"},e.headers||{}))];case 1:return delete(i=c.sent())["Content-Type"],[4,fetch(e.asrUrl,{method:"POST",headers:i,body:o,mode:"cors",credentials:"omit",cache:"no-cache"})];case 2:return(a=c.sent()).ok?[3,4]:[4,a.text().catch(function(){return""})];case 3:throw s=c.sent(),new Error("API 请求失败: ".concat(a.status," ").concat(a.statusText).concat(s?" - ".concat(s):""));case 4:return l=a.headers.get("content-type")||"",u="",l.includes("application/json")?[4,a.json().catch(function(){return{}})]:[3,6];case 5:return _=c.sent(),m=null!==(g=null!==(p=null===(f=null==_?void 0:_.result)||void 0===f?void 0:f.final_text)&&void 0!==p?p:null==_?void 0:_.final_text)&&void 0!==g?g:"",u="string"==typeof m?m.trim():"",[3,8];case 6:return[4,a.text()];case 7:u=c.sent().trim(),c.label=8;case 8:return[2,u]}})})}function Q(e){return u(this,void 0,void 0,function(){var t,n,o,r,i,a,s;return c(this,function(l){switch(l.label){case 0:return t="https://staging.auth.senseaudio.cn/v1/apikey/apply_token_via_public_key",n=e.baseUrl?new URL(t,e.baseUrl).toString():t,o=d(d(d({},F),{"Content-Type":"application/json"}),e.headers||{}),r={duration_seconds:e.durationSeconds,public_key:e.publicKey},e.paths&&e.paths.length>0&&(r.paths=e.paths),i=JSON.stringify(r),[4,fetch(n,{method:"POST",headers:o,body:i})];case 1:return(a=l.sent()).ok?[3,3]:[4,a.text().catch(function(){return""})];case 2:throw s=l.sent(),new Error("apply_token_via_public_key 失败: ".concat(a.status," ").concat(a.statusText).concat(s?" - ".concat(s):""));case 3:return(a.headers.get("content-type")||"").includes("application/json")?[4,a.json().catch(function(){return{}})]:[3,5];case 4:case 6:return[2,l.sent()];case 5:return[4,a.text()]}})})}function q(){return u(this,void 0,void 0,function(){var e;return c(this,function(t){switch(t.label){case 0:return(e=s()).publicKey?e.authToken?[2]:[4,Y()]:[2];case 1:return t.sent(),[2]}})})}function J(e){return u(this,void 0,void 0,function(){var t=this;return c(this,function(n){return[2,new Promise(function(n,o){try{var r=new(window.AudioContext||window.webkitAudioContext),i=new FileReader;i.onload=function(e){return u(t,void 0,void 0,function(){var t,i,a,s,l,d,u,_,m,f,p,g,h,v,y,w,x,b,R,E,I;return c(this,function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),[4,r.decodeAudioData(null===(I=e.target)||void 0===I?void 0:I.result)];case 1:if(t=c.sent(),i=t.getChannelData(0),a=t.sampleRate,s=i,t.numberOfChannels>1)for(l=t.getChannelData(1),s=new Float32Array(i.length),p=0;p<i.length;p++)s[p]=(i[p]+l[p])/2;for(d=new Int16Array(s.length),p=0;p<s.length;p++)u=Math.max(-1,Math.min(1,s[p])),d[p]=u<0?32768*u:32767*u;if(void 0!==window.lamejs){for(_=window.lamejs,m=new _.Mp3Encoder(1,a,128),f=[],p=0;p<d.length;p+=1152)g=d.subarray(p,p+1152),(h=m.encodeBuffer(g)).length>0&&f.push(h);for((v=m.flush()).length>0&&f.push(v),y=[],w=0,x=f;w<x.length;w++)b=x[w],R=new ArrayBuffer(b.byteLength),new Uint8Array(R).set(new Uint8Array(b.buffer,b.byteOffset,b.byteLength)),y.push(R);n(new Blob(y,{type:"audio/mpeg"}))}else o(new Error("需要加载lamejs库"));return[3,3];case 2:return E=c.sent(),o(E),[3,3];case 3:return[2]}})})},i.onerror=o,i.readAsArrayBuffer(e)}catch(e){o(e)}})]})})}function X(e){return u(this,void 0,void 0,function(){var t,n,o,r,i,a,d,u,_,m,f;return c(this,function(c){switch(c.label){case 0:if(t=s(),null===(i=t.asrApi)||void 0===i||i.mode,!(null===(a=t.asrApi)||void 0===a?void 0:a.url))return null===(d=t.onError)||void 0===d||d.call(t,"API 配置不存在"),[2];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,V({audioBlob:e,asrUrl:t.asrApi.url,headers:t.asrApi.headers,model:t.model,targetLang:t.targetLang})];case 2:return(n=c.sent())?(l({recognizedText:(t.recognizedText?t.recognizedText+" ":"")+n}),null===(u=t.onRecordingUpdate)||void 0===u||u.call(t,t.recognizedText)):H("未识别到信息","info"),t.shouldContinueRecording()||(r=t.recognizedText.trim(),l({recognizedText:"",interimText:""}),null===(_=t.onRecordingEnd)||void 0===_||_.call(t,r)),[3,4];case 3:return o=c.sent(),z(),null===(m=t.onError)||void 0===m||m.call(t,"API 请求失败: ".concat(o.message||"未知错误")),t.shouldContinueRecording()||(r=t.recognizedText.trim(),l({recognizedText:"",interimText:""}),null===(f=t.onRecordingEnd)||void 0===f||f.call(t,r)),[3,4];case 4:return[2]}})})}function G(e){var t,n,o=s();o.isRecording||((null===(t=o.asrApi)||void 0===t?void 0:t.url)?Z():null===(n=o.onError)||void 0===n||n.call(o,"API 配置不存在"))}function Z(e){return u(this,void 0,void 0,function(){var e,t,n,o,r,i,a,d,_,m,f,p=this;return c(this,function(g){switch(g.label){case 0:e=s(),g.label=1;case 1:return g.trys.push([1,3,,4]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 2:return t=g.sent(),n=new(window.AudioContext||window.webkitAudioContext),o=n.createMediaStreamSource(t),(r=n.createAnalyser()).fftSize=256,r.smoothingTimeConstant=.4,r.minDecibels=-90,r.maxDecibels=-10,o.connect(r),l({audioAnalyser:r,audioContext:n}),l({mediaRecorder:i=new MediaRecorder(t,{mimeType:MediaRecorder.isTypeSupported("audio/webm")?"audio/webm":MediaRecorder.isTypeSupported("audio/webm;codecs=opus")?"audio/webm;codecs=opus":MediaRecorder.isTypeSupported("audio/mp4")?"audio/mp4":"audio/webm"}),audioChunks:[],isRecording:!0}),i.ondataavailable=function(t){t.data.size>0&&e.audioChunks.push(t.data)},i.onstop=function(){return u(p,void 0,void 0,function(){var n,o,r,a,s,d,u,_,m;return c(this,function(c){switch(c.label){case 0:if(c.trys.push([0,8,,9]),B(),e.audioContext&&(e.audioContext.close().catch(console.error),l({audioContext:null,audioAnalyser:null})),t.getTracks().forEach(function(e){return e.stop()}),0===e.audioChunks.length)return l({isRecording:!1}),null===(r=e.onRecordingEnd)||void 0===r||r.call(e,""),[2];if(n=new Blob(e.audioChunks,{type:i.mimeType}),l({audioChunks:[]}),o=n,n.type.includes("mpeg")||n.type.includes("mp3"))return[3,6];if(void 0!==window.lamejs)return[3,4];null===(a=e.onRecordingUpdate)||void 0===a||a.call(e,"正在加载MP3编码器..."),c.label=1;case 1:return c.trys.push([1,3,,4]),[4,new Promise(function(e,t){if(void 0===window.lamejs)if(window.__lamejsLoading){var n=setInterval(function(){void 0!==window.lamejs&&(clearInterval(n),e())},100);setTimeout(function(){clearInterval(n),t(new Error("加载lamejs超时"))},1e4)}else{window.__lamejsLoading=!0;var o=document.createElement("script");o.src="https://cdnjs.cloudflare.com/ajax/libs/lamejs/1.2.1/lame.min.js",o.async=!0,o.onload=function(){window.__lamejsLoading=!1,void 0!==window.lamejs?e():t(new Error("lamejs 加载失败"))},o.onerror=function(){window.__lamejsLoading=!1,H("语音加载失败:网络错误","error"),t(new Error("lamejs 加载失败:网络错误"))},document.head.appendChild(o)}else e()})];case 2:return c.sent(),[3,4];case 3:return c.sent(),null===(s=e.onError)||void 0===s||s.call(e,"无法加载MP3编码器"),l({isRecording:!1}),null===(d=e.onRecordingEnd)||void 0===d||d.call(e,""),[2];case 4:return null===(u=e.onRecordingUpdate)||void 0===u||u.call(e,"正在转换为MP3格式..."),[4,J(n)];case 5:o=c.sent(),c.label=6;case 6:return[4,X(o)];case 7:return c.sent(),e.shouldContinueRecording()?Z():l({isRecording:!1}),[3,9];case 8:return c.sent(),l({isRecording:!1}),z(),null===(_=e.onError)||void 0===_||_.call(e,"处理录音数据失败"),null===(m=e.onRecordingEnd)||void 0===m||m.call(e,""),[3,9];case 9:return[2]}})})},i.start(),null===(_=e.onRecordingStart)||void 0===_||_.call(e),null===(m=e.onRecordingUpdate)||void 0===m||m.call(e,"正在录音..."),j("speaking"),K(r),[3,4];case 3:return a=g.sent(),l({isRecording:!1}),B(),z(),e.audioContext&&(e.audioContext.close().catch(console.error),l({audioContext:null,audioAnalyser:null})),d="NotAllowedError"===a.name?"麦克风权限被拒绝":"NotFoundError"===a.name?"未找到麦克风设备":"启动录音失败",null===(f=e.onError)||void 0===f||f.call(e,d),[3,4];case 4:return[2]}})})}function $(){var e,t=s();if(B(),t.mediaRecorder&&t.isRecording)try{"recording"===t.mediaRecorder.state?t.mediaRecorder.stop():(l({isRecording:!1}),z())}catch(n){l({isRecording:!1}),z(),t.audioContext&&(t.audioContext.close().catch(console.error),l({audioContext:null,audioAnalyser:null})),(null===(e=t.mediaRecorder)||void 0===e?void 0:e.stream)&&t.mediaRecorder.stream.getTracks().forEach(function(e){return e.stop()})}else z()}function ee(e){l({currentInputElement:e})}var te=null,ne=!1;function oe(e){var t=s().shortcutKey,n=!1,o="AltLeft"===t.code||"AltRight"===t.code||"Alt"===t.key,r="ControlLeft"===t.code||"ControlRight"===t.code||"Control"===t.key,i="ShiftLeft"===t.code||"ShiftRight"===t.code||"Shift"===t.key,a="AltLeft"===e.code||"AltRight"===e.code||"Alt"===e.key,l="ControlLeft"===e.code||"ControlRight"===e.code||"Control"===e.key,d="ShiftLeft"===e.code||"ShiftRight"===e.code||"Shift"===e.key;if(o&&a||r&&l||i&&d?n=!0:(t.code&&e.code===t.code&&(n=void 0===t.location||e.location===t.location),!n&&t.key&&e.key===t.key&&(n=void 0===t.location||e.location===t.location)),!t.code&&!t.key)return!1;if(!n)return!1;var u=o,c=r,_=i;if(u&&(e.ctrlKey||e.shiftKey||e.metaKey))return!1;if(c&&(e.altKey||e.shiftKey||e.metaKey))return!1;if(_&&(e.altKey||e.ctrlKey||e.metaKey))return!1;if(!u&&!c&&!_&&(e.ctrlKey||e.shiftKey||e.altKey||e.metaKey))return!1;return!0}function re(e){var t=s();if(oe(e))if(e.repeat)e.preventDefault();else if(!t.isKeyPressed){t.rewriteResultRoot&&function(){var e=s();e.rewriteResultRoot&&e.rewriteResultRoot.render(null)}();var n,o=(t.currentInputElement,(n=window.getSelection())?n.toString():""),r=!!o,i=!!t.currentInputElement&&document.activeElement===t.currentInputElement;r||i?(l({isKeyPressed:!0,isRecordingStarting:!0,isIndicatorShown:!1,selectedText:o}),e.preventDefault(),z(),te=window.setTimeout(function(){var e=s();e.isKeyPressed&&(l({isRecordingStarting:!1}),G(e.recognitionLang))},200)):H("请先聚焦输入框或框选文本","info")}}function ie(e){var t=s();oe(e)&&(e.preventDefault(),null!==te&&(clearTimeout(te),te=null),t.isRecording&&(j("loading"),$()),l({isKeyPressed:!1,isRecordingStarting:!1,isIndicatorShown:!1}))}function ae(e){var t=e.target;if("INPUT"===t.tagName||"TEXTAREA"===t.tagName||"true"===t.contentEditable||t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement){var n=t;l({currentInputElement:n}),ee(n)}}function se(e){var t;s(),(t=s(),{isRecording:t.isRecording,recognizedText:t.recognizedText,interimText:t.interimText}).isRecording&&($(),l({isKeyPressed:!1}),z()),l({currentInputElement:null,selectedText:""}),ee(null)}function le(){var e,t=s();ne||(e={onStart:function(){t.isKeyPressed&&l({isIndicatorShown:!0})},onUpdate:function(){},onEnd:function(e){var t=s().selectedText;l({isIndicatorShown:!1,isRecordingStarting:!1,isKeyPressed:!1,selectedText:""}),e?t?(j("loading"),function(e,t){u(this,void 0,void 0,function(){var n,o;return c(this,function(r){switch(r.label){case 0:n=s(),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,W({originalText:e,rewriteInstruction:t,asrApi:n.asrApi,model:n.model,targetLang:n.targetLang})];case 2:return o=r.sent(),z(),o?N(o):H("未识别到信息","info"),[3,4];case 3:return r.sent(),z(),H("服务器请求超时","error"),[3,4];case 4:return[2]}})})}(t,e)):(z(),function(e){var t,n,o=s().currentInputElement;if(o&&e)if(o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement){var r=o.selectionStart||0,i=o.selectionEnd||0,a=o.value,l=a.substring(0,r)+e+a.substring(i),d=r+e.length,u=o._valueTracker,c=a;if("undefined"!=typeof InputEvent){var _=new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,inputType:"insertText",data:e});if(!o.dispatchEvent(_))return}var m=null;o instanceof HTMLInputElement?m=(null===(t=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value"))||void 0===t?void 0:t.set)||null:o instanceof HTMLTextAreaElement&&(m=(null===(n=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value"))||void 0===n?void 0:n.set)||null),m?m.call(o,l):o.value=l,u&&u.setValue(c),o.selectionStart=d,o.selectionEnd=d;var f="undefined"!=typeof InputEvent?new InputEvent("input",{bubbles:!0,cancelable:!0,data:e,inputType:"insertText"}):new Event("input",{bubbles:!0,cancelable:!0});o.dispatchEvent(f),u&&u.setValue(l);var p=new Event("change",{bubbles:!0,cancelable:!0});o.dispatchEvent(p),document.activeElement!==o&&o.focus(),setTimeout(function(){o&&(o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement)&&(o.selectionStart=d,o.selectionEnd=d)},0)}else if("true"===o.contentEditable){var g=window.getSelection();if(g&&g.rangeCount>0){(v=g.getRangeAt(0)).deleteContents();var h=document.createTextNode(e);v.insertNode(h),v.setStartAfter(h),v.setEndAfter(h),g.removeAllRanges(),g.addRange(v)}else{var v;h=document.createTextNode(e),o.appendChild(h),(v=document.createRange()).setStartAfter(h),v.setEndAfter(h);var y=window.getSelection();y&&(y.removeAllRanges(),y.addRange(v))}f=new Event("input",{bubbles:!0,cancelable:!0}),o.dispatchEvent(f),p=new Event("change",{bubbles:!0,cancelable:!0}),o.dispatchEvent(p),document.activeElement!==o&&o.focus()}}(e)):z()},onError:function(e){l({isIndicatorShown:!1}),H("服务器连接超时","error"),z()},shouldContinue:function(){return!1}},l({onRecordingStart:e.onStart||null,onRecordingUpdate:e.onUpdate||null,onRecordingEnd:e.onEnd||null,onError:e.onError||null,shouldContinueRecording:e.shouldContinue||function(){return!1}}),document.addEventListener("keydown",re,!0),document.addEventListener("keyup",ie,!0),document.addEventListener("focusin",ae,!0),document.addEventListener("focusout",se,!0),ne=!0)}function de(){if("undefined"!=typeof document&&!(document.querySelectorAll("style[data-sdk-styles]").length>0))return document.head?void 0:"loading"===document.readyState?void document.addEventListener("DOMContentLoaded",de):void setTimeout(de,0)}function ue(e){var t,n,o=s();o.isInitialized||(l({asrApi:{url:(null===(t=null==e?void 0:e.asrApi)||void 0===t?void 0:t.url)||a(),headers:(null===(n=null==e?void 0:e.asrApi)||void 0===n?void 0:n.headers)||{},mode:"stream"}}),(null==e?void 0:e.lang)&&l({recognitionLang:e.lang}),l({publicKey:(null==e?void 0:e.publicKey)||"",targetLang:(null==e?void 0:e.targetLang)||o.targetLang||"None",model:"sense-asr-deepthink",authToken:null,authTokenPromise:null}),(null==e?void 0:e.publicKey)&&q().catch(function(){}),(null==e?void 0:e.shortcutKey)&&l({shortcutKey:e.shortcutKey}),l({isInitialized:!0}),de(),le())}function ce(e){var t,n,o,r,i,a=s();a.isInitialized&&ne&&(null!==te&&(clearTimeout(te),te=null),document.removeEventListener("keydown",re,!0),document.removeEventListener("keyup",ie,!0),document.removeEventListener("focusin",ae,!0),document.removeEventListener("focusout",se,!0),ne=!1),l({isInitialized:!1}),ue({lang:null!==(t=null==e?void 0:e.lang)&&void 0!==t?t:a.recognitionLang,shortcutKey:null!==(n=null==e?void 0:e.shortcutKey)&&void 0!==n?n:a.shortcutKey,asrApi:null!==(o=null==e?void 0:e.asrApi)&&void 0!==o?o:a.asrApi,publicKey:null!==(r=null==e?void 0:e.publicKey)&&void 0!==r?r:a.publicKey,targetLang:null!==(i=null==e?void 0:e.targetLang)&&void 0!==i?i:a.targetLang})}function _e(e){if(!1!==(null==e?void 0:e.enabled)){var t=e?{publicKey:e.publicKey,targetLang:e.targetLang}:void 0;"loading"===document.readyState?document.addEventListener("DOMContentLoaded",function(){ue(t)}):ue(t)}}function me(e){!function(e){ce({publicKey:e}),q().catch(function(){})}(e)}function fe(e){!function(e){l({targetLang:e})}(e)}var pe={init:_e,setPublicKey:me,setTargetLang:fe},ge={InputListener:Object.freeze({__proto__:null,InputListener:pe,initInputListenerSDK:_e,setPublicKey:me,setTargetLang:fe})};function he(e){_e(e)}export{pe as InputListener,ge as SDKs,_e as initInputListenerSDK,he as initSDK,me as setPublicKey,fe as setTargetLang};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/utils/inputListener/state.ts","../../node_modules/tslib/tslib.es6.js","../../node_modules/style-inject/dist/style-inject.es.js","../../src/utils/inputListener/waveConfig.ts","../../src/components/WaveBars.tsx","../../src/components/StatusIndicator.tsx","../../src/components/Toast.tsx","../../src/components/RewriteResult.tsx","../../src/utils/inputListener/ui.ts","../../src/utils/inputListener/api.ts","../../src/utils/inputListener/recognition.ts","../../src/utils/inputListener/input.ts","../../src/utils/inputListener/events.ts","../../src/utils/inputListener/core.ts","../../src/sdks/inputListener.ts","../../src/sdks/index.ts","../../src/index.ts"],"sourcesContent":["// 统一状态管理\n\nexport type AsrMode = 'stream';\n\nexport interface ShortcutKeyConfig {\n code?: string;\n key?: string;\n location?: number;\n}\n\nexport interface ASRApiConfig {\n url?: string;\n headers?: Record<string, string>;\n mode?: AsrMode;\n}\n\nexport interface InputListenerState {\n // 配置\n shortcutKey: ShortcutKeyConfig;\n recognitionLang: string;\n asrApi: ASRApiConfig;\n /** initSDK 传入,用于换取 token */\n publicKey: string;\n /** initSDK 传入,后续所有接口参数都需要带上 */\n targetLang: string;\n /** 后续所有接口参数都需要带上 */\n model: string;\n /** 通过 publicKey 换取到的 token */\n authToken: string | null;\n /** token 获取中的 promise,用于并发复用 */\n authTokenPromise: Promise<string> | null;\n selectedText: string;\n \n // 输入元素\n currentInputElement: HTMLElement | null;\n \n // 快捷键状态\n isKeyPressed: boolean;\n isRecordingStarting: boolean;\n isIndicatorShown: boolean;\n \n // 录音状态\n mediaRecorder: MediaRecorder | null;\n audioChunks: Blob[];\n isRecording: boolean;\n recognizedText: string;\n interimText: string;\n \n // 音频分析\n audioContext: AudioContext | null;\n audioAnalyser: AnalyserNode | null;\n audioAnalysisFrameId: number | null;\n currentVolumes: number[] | null;\n \n // UI 状态\n statusIndicatorRoot: any | null;\n toastRoot: any | null;\n currentIndicatorStatus: 'speaking' | 'silent' | 'loading' | undefined;\n isHidingIndicator: boolean;\n hideIndicatorTimer: number | null;\n isCreatingIndicator: boolean;\n rewriteResultRoot: any | null;\n \n // 回调\n onRecordingStart: (() => void) | null;\n onRecordingUpdate: ((text: string) => void) | null;\n onRecordingEnd: ((finalText: string) => void) | null;\n onError: ((error: string) => void) | null;\n shouldContinueRecording: () => boolean;\n \n // 初始化状态\n isInitialized: boolean;\n}\n\nconst STREAM_API_PATH = '/v1/asr/input_stream';\n\nexport function getDefaultAsrApiUrl(mode: AsrMode = 'stream'): string {\n const path = STREAM_API_PATH;\n return `https://staging.api.senseaudio.cn${path}`;\n}\n\nfunction initWindowObject() {\n if (typeof window === 'undefined') return;\n \n if (!(window as any).senseAiHelperSdk) {\n (window as any).senseAiHelperSdk = {};\n }\n \n if (!(window as any).senseAiHelperSdk.inputListener) {\n (window as any).senseAiHelperSdk.inputListener = {\n // 默认快捷键:Alt/Option(左右两边都可触发)\n shortcutKey: { key: 'Alt' },\n recognitionLang: 'zh-CN',\n asrApi: { url: getDefaultAsrApiUrl('stream'), headers: {}, mode: 'stream' },\n publicKey: '',\n targetLang: 'None',\n model: 'sense-asr-deepthink',\n authToken: null,\n authTokenPromise: null,\n selectedText: '',\n currentInputElement: null,\n isKeyPressed: false,\n isRecordingStarting: false,\n isIndicatorShown: false,\n mediaRecorder: null,\n audioChunks: [],\n isRecording: false,\n recognizedText: '',\n interimText: '',\n audioContext: null,\n audioAnalyser: null,\n audioAnalysisFrameId: null,\n currentVolumes: null,\n statusIndicatorRoot: null,\n toastRoot: null,\n currentIndicatorStatus: undefined,\n isHidingIndicator: false,\n hideIndicatorTimer: null,\n isCreatingIndicator: false,\n rewriteResultRoot: null,\n onRecordingStart: null,\n onRecordingUpdate: null,\n onRecordingEnd: null,\n onError: null,\n shouldContinueRecording: () => false,\n isInitialized: false,\n };\n }\n}\n\nexport function getState(): InputListenerState {\n initWindowObject();\n return (window as any).senseAiHelperSdk.inputListener;\n}\n\nexport function updateState(updates: Partial<InputListenerState>) {\n const state = getState();\n Object.assign(state, updates);\n}\n\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","// 波形绘制样式配置\n// 可以在这里修改所有波形相关的样式参数\n\nexport interface WaveBarConfig {\n // 波形条数量\n barCount: number;\n // 最大高度\n maxBarHeight: number;\n // 最小高度\n minBarHeight: number;\n // 波形条宽度\n barWidth: number;\n // 波形条之间的间距\n gap: number;\n // 圆角半径\n borderRadius: number;\n}\n\nexport interface WaveColorsConfig {\n // 渐变起始颜色(顶部)\n gradientStart: string;\n // 渐变中间颜色\n gradientMiddle: string;\n // 渐变结束颜色(底部)\n gradientEnd: string;\n}\n\nexport interface WaveAnimationConfig {\n // 插值系数(0-1,越小变化越快)\n interpolationFactor: number;\n // 音量增强系数\n volumeEnhancement: number;\n // 音量敏感度(0-1,越小越敏感)\n volumeSensitivity: number;\n // 最小显示阈值(0-1)\n minThreshold: number;\n // 放大系数\n amplificationFactor: number;\n // 对称因子(0-1,控制中心到边缘的递减程度)\n symmetryFactor: number;\n}\n\nexport interface WaveCanvasConfig {\n // Canvas 宽度\n width: number;\n // Canvas 高度\n height: number;\n}\n\n// 默认配置\nexport const defaultWaveBarConfig: WaveBarConfig = {\n barCount: 13, // 9 + 4\n maxBarHeight: 25.5, // 17 * 1.5\n minBarHeight: 4.5, // 3 * 1.5,最小高度,接近点的形式,声音小时波形条会收缩到这里\n barWidth: 4.5, // 3 * 1.5\n gap: 3, // 2 * 1.5\n borderRadius: 2.25 // 1.5 * 1.5\n};\n\nexport const defaultWaveColorsConfig: WaveColorsConfig = {\n gradientStart: '#ffffff',\n gradientMiddle: '#f0f0f0',\n gradientEnd: '#ffffff'\n};\n\nexport const defaultWaveAnimationConfig: WaveAnimationConfig = {\n interpolationFactor: 0.7, // 插值系数,控制平滑度(增大以提高响应速度)\n volumeEnhancement: 0.5, // 音量增强(使用平方根)\n volumeSensitivity: 0.5, // 音量敏感度\n minThreshold: 0.05, // 最小显示阈值(降低以提高敏感度)\n amplificationFactor: 1.2, // 放大系数\n symmetryFactor: 1.4 // 对称因子,控制中心到边缘的递减(0.8 表示最外侧保留 20% 高度,增强中间高两边低的效果)\n};\n\nexport const defaultWaveCanvasConfig: WaveCanvasConfig = {\n width: 105, // 70 * 1.5\n height: 24 // 16 * 1.5\n};\n\n// 导出完整配置对象\nexport const waveConfig = {\n bar: defaultWaveBarConfig,\n colors: defaultWaveColorsConfig,\n animation: defaultWaveAnimationConfig,\n canvas: defaultWaveCanvasConfig\n};\n\n// 用于 loading 状态的静态波形条配置\nexport const staticWaveConfig = {\n ...defaultWaveBarConfig,\n // 静态波形条使用固定的中等高度(50%)\n staticHeightRatio: 0.5\n};\n\n","import React, { useState, useEffect } from 'react';\nimport styles from './StatusIndicator.module.scss';\nimport { waveConfig, staticWaveConfig } from '../utils/inputListener/waveConfig';\n\ninterface WaveBarsProps {\n volumes?: number[]; // 音频音量数据(用于动态波形)\n isStatic?: boolean; // 是否为静态波形(loading 状态)\n className?: string;\n}\n\nconst WaveBars: React.FC<WaveBarsProps> = ({ \n volumes, \n isStatic = false,\n className = '' \n}) => {\n // 初始化时使用最小高度(接近点的形式),声音小时会收缩到这里\n const [barHeights, setBarHeights] = useState<number[]>(\n new Array(waveConfig.bar.barCount).fill(waveConfig.bar.minBarHeight)\n );\n\n // 更新波形条高度\n useEffect(() => {\n if (isStatic) {\n // 静态波形:使用固定高度(从最小高度向上扩展)\n const { bar } = waveConfig;\n const heightRange = bar.maxBarHeight - bar.minBarHeight;\n const staticHeightRatio = staticWaveConfig.staticHeightRatio;\n const heights = new Array(bar.barCount).fill(0).map((_, i) => {\n const centerIndex = (bar.barCount - 1) / 2;\n const distanceFromCenter = Math.abs(i - centerIndex);\n const maxDistance = centerIndex;\n // 使用平方函数让递减更平缓,与动态波形保持一致\n const normalizedDistance = distanceFromCenter / maxDistance;\n const baseSymmetry = 1 - Math.pow(normalizedDistance, 2) * 0.4;\n // 限制对称因子范围:最小 0.6,最大 1.0\n const symmetry = Math.max(0.6, Math.min(1.0, baseSymmetry));\n // 从最小高度向上扩展,使用静态高度比例\n return bar.minBarHeight + symmetry * heightRange * staticHeightRatio;\n });\n setBarHeights(heights);\n return;\n }\n\n if (!volumes || volumes.length === 0) {\n return;\n }\n\n const { bar, animation } = waveConfig;\n const heightRange = bar.maxBarHeight - bar.minBarHeight;\n\n // 计算每个波形条的目标高度\n setBarHeights(prevHeights => {\n const centerIndex = (bar.barCount - 1) / 2;\n \n return prevHeights.map((prevHeight, i) => {\n // 获取当前频段的音量值 (0-255)\n const rawVolume = volumes[i] || 0;\n \n // 计算对称位置(让左右两侧使用相同的音频数据,实现对称)\n const distanceFromCenter = i - centerIndex;\n const symmetricIndex = Math.round(centerIndex - distanceFromCenter);\n // 使用对称位置的音频数据,如果对称位置不存在则使用当前位置\n const symmetricVolume = volumes[Math.max(0, Math.min(bar.barCount - 1, symmetricIndex))] || 0;\n // 混合当前位置和对称位置的音频数据,实现对称效果\n const mixedVolume = (rawVolume + symmetricVolume) / 2;\n \n // 归一化到 0-1 范围,使用平方根增强低音量的响应\n const normalizedVolume = Math.sqrt(Math.min(mixedVolume / 255, 1));\n \n // 计算对称因子(中心高,两边低)\n const absDistanceFromCenter = Math.abs(distanceFromCenter);\n const maxDistance = centerIndex;\n // 对称因子:中心为 1,向两边递减\n const normalizedDistance = absDistanceFromCenter / maxDistance; // 0-1\n // 使用更平缓的曲线,让两侧也有明显波动\n // 计算基础对称因子:使用平方函数让递减更平缓,同时确保两侧不会太低\n // 使用较小的系数,让递减更温和\n const baseSymmetryFactor = 1 - Math.pow(normalizedDistance, 2) * 0.4;\n // 限制对称因子范围:最小 0.6(保证两侧有 60% 的波动范围),最大 1.0\n // 这样即使是最外侧的条,也能有 60% 的高度范围可以波动,不会太低\n const symmetryFactor = Math.max(0.6, Math.min(1.0, baseSymmetryFactor));\n \n // 基础高度:音量 * 对称因子 * 高度范围 + 最小高度\n // 使用平方根曲线让响应更自然\n const targetHeight = bar.minBarHeight + normalizedVolume * symmetryFactor * heightRange;\n \n // 平滑插值过渡\n const interpolationFactor = animation.interpolationFactor;\n const newHeight = prevHeight + (targetHeight - prevHeight) * interpolationFactor;\n \n // 确保高度在有效范围内\n return Math.max(bar.minBarHeight, Math.min(newHeight, bar.maxBarHeight));\n });\n });\n }, [volumes, isStatic]);\n\n const { bar, colors } = waveConfig;\n\n return (\n <div className={`${styles.waveContainer} ${styles.waveBarsContainer} ${className}`}>\n {barHeights.map((height, index) => {\n const isLast = index === bar.barCount - 1;\n \n return (\n <div\n key={index}\n className={styles.waveBar}\n style={{\n background: `linear-gradient(to bottom, ${colors.gradientStart}, ${colors.gradientMiddle}, ${colors.gradientEnd})`,\n width: `${bar.barWidth}px`,\n height: `${height}px`,\n borderRadius: `${bar.borderRadius}px`,\n marginRight: isLast ? '0' : `${bar.gap}px`\n }}\n />\n );\n })}\n </div>\n );\n};\n\nexport default WaveBars;\n\n","import * as React from 'react';\nimport styles from './StatusIndicator.module.scss';\nimport WaveBars from './WaveBars';\n\nexport type StatusIndicatorStatus = 'speaking' | 'silent' | 'loading';\n\ninterface StatusIndicatorProps {\n status: StatusIndicatorStatus;\n isHiding?: boolean;\n volumes?: number[]; // 音频音量数据(用于动态波形)\n}\n\nconst StatusIndicator: React.FC<StatusIndicatorProps> = ({ \n status, \n isHiding = false,\n volumes\n}) => {\n // 根据不同的状态渲染对应的内容\n const renderContent = () => {\n // 录入状态(正在说话):显示麦克风图标和动态波形条\n if (status === 'speaking') {\n return (\n <div className={styles.loadingWithWaveContainer}>\n {/* 麦克风图标 SVG */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 12.6665V14.6665\" stroke=\"url(#paint0_linear_1445_38138)\" strokeWidth=\"1.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10.3337 3.66683C10.3337 2.37817 9.28899 1.3335 8.00033 1.3335C6.71166 1.3335 5.66699 2.37817 5.66699 3.66683V8.00016C5.66699 9.28883 6.71166 10.3335 8.00033 10.3335C9.28899 10.3335 10.3337 9.28883 10.3337 8.00016V3.66683Z\" fill=\"url(#paint1_linear_1445_38138)\" stroke=\"url(#paint2_linear_1445_38138)\" strokeWidth=\"1.66667\" strokeLinejoin=\"round\"/>\n <path d=\"M3 7.6665C3 10.4279 5.23857 12.6665 8 12.6665C10.7614 12.6665 13 10.4279 13 7.6665\" stroke=\"url(#paint3_linear_1445_38138)\" strokeWidth=\"1.66667\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n {/* SVG 渐变定义 */}\n <defs>\n <linearGradient id=\"paint0_linear_1445_38138\" x1=\"8.5\" y1=\"12.6665\" x2=\"8.5\" y2=\"14.6665\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#ECFAFF\"/>\n <stop offset=\"1\" stopColor=\"#BDC8FD\"/>\n </linearGradient>\n <linearGradient id=\"paint1_linear_1445_38138\" x1=\"8.00033\" y1=\"1.3335\" x2=\"8.00033\" y2=\"10.3335\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#ECFAFF\"/>\n <stop offset=\"1\" stopColor=\"#BDC8FD\"/>\n </linearGradient>\n <linearGradient id=\"paint2_linear_1445_38138\" x1=\"8.00033\" y1=\"1.3335\" x2=\"8.00033\" y2=\"10.3335\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#ECFAFF\"/>\n <stop offset=\"1\" stopColor=\"#BDC8FD\"/>\n </linearGradient>\n <linearGradient id=\"paint3_linear_1445_38138\" x1=\"8\" y1=\"7.6665\" x2=\"8\" y2=\"12.6665\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#ECFAFF\"/>\n <stop offset=\"1\" stopColor=\"#BDC8FD\"/>\n </linearGradient>\n </defs>\n </svg>\n {/* 动态波形条,根据音量数据实时更新 */}\n <WaveBars volumes={volumes} isStatic={false} />\n </div>\n );\n } else if (status === 'silent') {\n // 静音状态:显示点状动画\n return (\n <div className={styles.loadingWithWaveContainer}>\n <div className={styles.dotsContainer}>\n {Array.from({ length: 10 }).map((_, i) => (\n <div key={i} className={styles.dot} />\n ))}\n </div>\n </div>\n );\n } else if (status === 'loading') {\n // 加载状态:同时显示静止的波形条和旋转加载点(加载点在右边)\n return (\n <div className={styles.loadingWithWaveContainer}>\n {/* 旋转的加载点 */}\n <div className={styles.rotatingPoints}>\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className={styles.rotatingPoint} />\n ))}\n </div>\n {/* 静态波形条 */}\n <WaveBars isStatic={true} />\n </div>\n );\n }\n return null;\n };\n\n const className = [\n styles.statusIndicator,\n isHiding ? styles.hiding : '',\n status === 'loading' ? styles.loadingWithWave : ''\n ].filter(Boolean).join(' ');\n\n return (\n <div\n id=\"sdk-status-indicator\"\n className={className}\n >\n {renderContent()}\n </div>\n );\n};\n\nexport default StatusIndicator;\n","import * as React from 'react';\nimport styles from './Toast.module.scss';\n\ninterface ToastProps {\n message: string;\n type?: 'success' | 'error' | 'info';\n duration?: number;\n onClose: () => void;\n}\n\nconst Toast: React.FC<ToastProps> = ({ \n message, \n type = 'success',\n duration = 2000, \n onClose \n}) => {\n React.useEffect(() => {\n const timer = setTimeout(() => {\n onClose();\n }, duration);\n return () => clearTimeout(timer);\n }, [duration, onClose]);\n\n const className = [\n styles.toast,\n styles[type]\n ].filter(Boolean).join(' ');\n\n return (\n <div className={className}>\n {message}\n </div>\n );\n};\n\nexport default Toast;\n","import React from 'react';\nimport styles from './RewriteResult.module.scss';\n\ninterface RewriteResultProps {\n text: string;\n onClose: () => void;\n onCopy: () => void;\n}\n\nconst RewriteResult: React.FC<RewriteResultProps> = ({ text, onClose, onCopy }) => {\n return (\n <div className={styles.overlay}>\n {/* <div className={styles.popup}>\n <div className={styles.header}>\n <div>重写结果</div>\n <button className={styles.close} onClick={onClose} aria-label=\"close\">×</button>\n </div>\n <div className={styles.body}>{text}</div>\n <div className={styles.footer}>\n <button className={styles.primary} onClick={onCopy}>复制</button>\n </div>\n </div> */}\n\n <div className={styles.m2}>\n <div className={styles.header}>\n <button className={styles.close} onClick={onClose} aria-label=\"close\">×</button>\n </div>\n <div className={styles.logo}>\n <div className={styles.body}>{text}</div>\n </div>\n <div className={styles.footer}>\n <button onClick={onCopy} className={styles.button}>\n <span>复制</span>\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default RewriteResult;\n\n","// UI 功能:使用 React DOM 渲染组件\n\nimport { getState, updateState } from './state';\nimport StatusIndicator, { StatusIndicatorStatus } from '../../components/StatusIndicator';\nimport Toast from '../../components/Toast';\nimport RewriteResult from '../../components/RewriteResult';\nimport { waveConfig } from './waveConfig';\nimport * as BundledReact from 'react';\nimport * as BundledReactDOMClient from 'react-dom/client';\nimport * as BundledReactDOM from 'react-dom';\n\n// 智能获取 React:优先使用全局的,如果没有再使用打包进来的\nfunction getReact() {\n if (typeof window !== 'undefined' && (window as any).React) {\n return (window as any).React;\n }\n return BundledReact;\n}\n\n// 智能获取 ReactDOM:优先使用全局的,如果没有再使用打包进来的\n// 兼容 React 17 和 React 18\nfunction getReactDOM() {\n // 首先尝试从全局获取 ReactDOM(用户项目中的 React)\n if (typeof window !== 'undefined' && (window as any).ReactDOM) {\n const globalReactDOM = (window as any).ReactDOM;\n \n // React 18: 尝试使用 createRoot\n if (globalReactDOM.createRoot) {\n return { \n createRoot: globalReactDOM.createRoot,\n render: globalReactDOM.render // 保留 render 用于 React 17 兼容\n } as any;\n }\n \n // React 17: 使用 render\n if (globalReactDOM.render) {\n return {\n createRoot: (container: HTMLElement) => {\n // React 17 兼容:将 createRoot 转换为 render\n return {\n render: (element: any) => {\n globalReactDOM.render(element, container);\n }\n };\n },\n render: globalReactDOM.render\n } as any;\n }\n }\n \n // 尝试从全局 ReactDOMClient 获取(React 18 UMD 格式)\n if (typeof window !== 'undefined' && (window as any).ReactDOMClient) {\n const globalReactDOMClient = (window as any).ReactDOMClient;\n if (globalReactDOMClient.createRoot) {\n return { createRoot: globalReactDOMClient.createRoot } as typeof BundledReactDOMClient;\n }\n }\n \n // 降级到打包进来的 ReactDOM(优先使用 react-dom/client,如果没有则使用 react-dom)\n if (BundledReactDOMClient && typeof BundledReactDOMClient.createRoot === 'function') {\n return BundledReactDOMClient;\n }\n \n // 最后尝试使用 react-dom(React 17 兼容)\n if (BundledReactDOM && typeof BundledReactDOM.render === 'function') {\n return {\n createRoot: (container: HTMLElement) => {\n return {\n render: (element: any) => {\n BundledReactDOM.render(element, container);\n }\n };\n },\n render: BundledReactDOM.render\n } as any;\n }\n \n return BundledReactDOMClient;\n}\n\nconst React = getReact();\nconst ReactDOM = getReactDOM();\n\n// 初始化 Toast 容器\nfunction initToastContainer() {\n const state = getState();\n if (state.toastRoot) return;\n \n let container = document.getElementById('sdk-toast-container');\n if (!container) {\n container = document.createElement('div');\n container.id = 'sdk-toast-container';\n container.style.cssText = 'position:fixed;top:0;right:0;z-index:2147483647;pointer-events:none';\n document.body.appendChild(container);\n }\n \n try {\n updateState({ toastRoot: ReactDOM.createRoot(container) });\n } catch (e) {\n // ReactDOM 不可用\n }\n}\n\n// 初始化重写结果容器\nfunction initRewriteResultContainer() {\n const state = getState();\n if (state.rewriteResultRoot) return;\n\n let container = document.getElementById('sdk-rewrite-result-container');\n if (!container) {\n container = document.createElement('div');\n container.id = 'sdk-rewrite-result-container';\n container.style.cssText = 'position:fixed;inset:0;z-index:2147483647;display:flex;align-items:flex-end;justify-content:center;pointer-events:none;padding:40px';\n document.body.appendChild(container);\n }\n\n try {\n updateState({ rewriteResultRoot: ReactDOM.createRoot(container) });\n } catch (e) {\n // ReactDOM 不可用\n }\n}\n\n// 初始化状态指示器容器\nfunction initStatusIndicatorContainer() {\n const state = getState();\n if (state.statusIndicatorRoot) return;\n \n let container = document.getElementById('sdk-status-indicator-container');\n if (!container) {\n container = document.createElement('div');\n container.id = 'sdk-status-indicator-container';\n container.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647';\n document.body.appendChild(container);\n }\n \n try {\n updateState({ statusIndicatorRoot: ReactDOM.createRoot(container) });\n } catch (e) {\n // ReactDOM 不可用\n }\n}\n\n// 显示状态指示器\nexport function showStatusIndicator(status: StatusIndicatorStatus) {\n const state = getState();\n \n if (state.isCreatingIndicator) return;\n \n if (state.isHidingIndicator && state.hideIndicatorTimer !== null) {\n clearTimeout(state.hideIndicatorTimer);\n updateState({ hideIndicatorTimer: null, isHidingIndicator: false });\n }\n \n if (!React || !ReactDOM) return;\n \n if (state.currentIndicatorStatus === status && state.statusIndicatorRoot) {\n if (status === 'speaking') {\n updateStatusIndicatorVolumes();\n }\n return;\n }\n \n updateState({ isCreatingIndicator: true });\n \n try {\n initStatusIndicatorContainer();\n \n if (!state.statusIndicatorRoot) {\n updateState({ isCreatingIndicator: false });\n return;\n }\n \n const wrapper = React.createElement('div', {\n id: 'sdk-status-indicator-wrapper',\n style: {\n position: 'fixed',\n bottom: '100px',\n left: '50%',\n transform: 'translate(-50%, 0)',\n zIndex: 2147483647,\n pointerEvents: 'none'\n }\n }, React.createElement(StatusIndicator, {\n status,\n isHiding: false,\n volumes: state.currentVolumes || undefined\n }));\n \n state.statusIndicatorRoot.render(wrapper);\n updateState({ currentIndicatorStatus: status });\n } catch (error) {\n console.error('创建状态指示器失败:', error);\n } finally {\n updateState({ isCreatingIndicator: false });\n }\n}\n\n// 更新状态指示器的音量数据\nfunction updateStatusIndicatorVolumes() {\n const state = getState();\n \n if (!state.statusIndicatorRoot || state.currentIndicatorStatus !== 'speaking' || !React) {\n return;\n }\n \n const wrapper = React.createElement('div', {\n id: 'sdk-status-indicator-wrapper',\n style: {\n position: 'fixed',\n bottom: '100px',\n left: '50%',\n transform: 'translate(-50%, 0)',\n zIndex: 2147483647,\n pointerEvents: 'none'\n }\n }, React.createElement(StatusIndicator, {\n status: state.currentIndicatorStatus!,\n isHiding: false,\n volumes: state.currentVolumes || undefined\n }));\n \n state.statusIndicatorRoot.render(wrapper);\n}\n\n// 隐藏状态指示器\nexport function hideStatusIndicator() {\n const state = getState();\n \n stopAudioAnalysis();\n \n if (state.isHidingIndicator) return;\n \n if (state.statusIndicatorRoot && state.currentIndicatorStatus !== undefined && React) {\n updateState({ isHidingIndicator: true });\n \n if (state.hideIndicatorTimer !== null) {\n clearTimeout(state.hideIndicatorTimer);\n }\n \n const wrapper = React.createElement('div', {\n id: 'sdk-status-indicator-wrapper',\n style: {\n position: 'fixed',\n bottom: '100px',\n left: '50%',\n transform: 'translate(-50%, 0)',\n zIndex: 2147483647,\n pointerEvents: 'none'\n }\n }, React.createElement(StatusIndicator, {\n status: state.currentIndicatorStatus!,\n isHiding: true,\n volumes: undefined\n }));\n \n state.statusIndicatorRoot.render(wrapper);\n \n const timer = window.setTimeout(() => {\n if (state.statusIndicatorRoot) {\n state.statusIndicatorRoot.render(null);\n }\n updateState({\n currentIndicatorStatus: undefined,\n hideIndicatorTimer: null,\n isHidingIndicator: false\n });\n }, 300);\n \n updateState({ hideIndicatorTimer: timer });\n }\n}\n\n// 启动音频分析\nexport function startAudioAnalysis(analyserNode: AnalyserNode) {\n const state = getState();\n \n if (state.audioAnalysisFrameId) {\n stopAudioAnalysis();\n }\n \n const bufferLength = analyserNode.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n \n let lastUpdateTime = 0;\n const updateInterval = 20;\n \n function updateWaveform(currentTime: number) {\n if (currentTime - lastUpdateTime >= updateInterval) {\n analyserNode.getByteFrequencyData(dataArray);\n \n const barCount = waveConfig.bar.barCount; // 使用配置中的波动条数量\n const volumes: number[] = [];\n \n // 使用对数分布来分配频率数据,让低频段分配更多频段,高频段分配较少频段\n // 这样可以确保所有波形条都能获得有效数据\n for (let i = 0; i < barCount; i++) {\n // 对数分布:将频率范围按对数方式分成 barCount 段\n // 低频段(人声主要频段)会分配更多数据点\n const logStart = Math.pow(bufferLength, i / barCount);\n const logEnd = Math.pow(bufferLength, (i + 1) / barCount);\n const start = Math.floor(logStart);\n const end = i === barCount - 1 ? bufferLength : Math.floor(logEnd);\n \n if (start >= end || start >= bufferLength) {\n volumes.push(0);\n continue;\n }\n \n let sum = 0;\n let max = 0;\n let count = 0;\n for (let j = start; j < end && j < bufferLength; j++) {\n const value = dataArray[j];\n sum += value;\n if (value > max) max = value;\n count++;\n }\n \n const avg = count > 0 ? sum / count : 0;\n // 调整混合比例,增加最大值权重,让波动更明显\n const mixed = max * 0.4 + avg * 0.6;\n // 添加最小阈值,确保即使音量很小也有基础响应\n const minThreshold = 5; // 最小音量阈值\n volumes.push(Math.max(mixed, minThreshold));\n }\n \n updateWaveBars(volumes);\n lastUpdateTime = currentTime;\n }\n \n if (state.audioAnalysisFrameId !== null) {\n const frameId = requestAnimationFrame(updateWaveform);\n updateState({ audioAnalysisFrameId: frameId });\n }\n }\n \n const frameId = requestAnimationFrame(updateWaveform);\n updateState({ audioAnalysisFrameId: frameId });\n}\n\n// 停止音频分析\nexport function stopAudioAnalysis() {\n const state = getState();\n if (state.audioAnalysisFrameId) {\n cancelAnimationFrame(state.audioAnalysisFrameId);\n updateState({ audioAnalysisFrameId: null, currentVolumes: null });\n }\n}\n\n// 更新波形条\nexport function updateWaveBars(volumes: number[]) {\n const state = getState();\n \n if (state.currentIndicatorStatus === 'loading') return;\n \n updateState({ currentVolumes: volumes });\n updateStatusIndicatorVolumes();\n}\n\n// 显示 Toast\nexport function showToast(message: string, type: 'success' | 'error' | 'info' = 'success') {\n // 只在开发环境显示\n // const nodeEnv = typeof process !== 'undefined' && process.env ? process.env.NODE_ENV : 'production';\n // if (nodeEnv !== 'development') return;\n \n const state = getState();\n \n if (!React || !ReactDOM) return;\n \n initToastContainer();\n \n const ToastElement = React.createElement(Toast, {\n message,\n type,\n duration: 2000,\n onClose: () => {\n if (state.toastRoot) {\n state.toastRoot.render(null);\n }\n }\n });\n \n if (state.toastRoot) {\n state.toastRoot.render(ToastElement);\n setTimeout(() => {\n if (state.toastRoot) {\n state.toastRoot.render(null);\n }\n }, 2000);\n }\n}\n\n// 隐藏重写结果弹框\nexport function hideRewriteResult() {\n const state = getState();\n if (state.rewriteResultRoot) {\n state.rewriteResultRoot.render(null);\n }\n}\n\n// 显示重写结果弹框,带拷贝按钮\nexport function showRewriteResult(text: string) {\n const state = getState();\n if (!React || !ReactDOM || !text) return;\n\n initRewriteResultContainer();\n const root = getState().rewriteResultRoot;\n if (!root) return;\n\n const close = () => {\n root.render(null);\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n // showToast('已复制', 'success');\n close(); // 复制成功后关闭弹框\n } catch (e) {\n showToast('复制失败', 'error');\n }\n };\n\n const popup = React.createElement(\n RewriteResult,\n {\n text,\n onClose: close,\n onCopy: handleCopy\n }\n );\n\n root.render(\n popup\n );\n}\n\n","/**\n * 网络请求层:集中处理 ASR / Rewrite 等接口调用,避免与业务逻辑混在一起。\n *\n * 设计目标:\n * - 业务层(events/recognition)只负责流程控制与 UI 状态,不直接写 fetch\n * - API 层负责:URL 生成、请求参数组装、响应解析、错误抛出\n *\n * 约定:\n * - 所有请求失败会 throw Error(由调用方决定如何 toast / fallback)\n * - 返回值尽量“纯数据”(string),不引入 UI 依赖\n */\n\nimport type { AsrMode, ASRApiConfig } from './state';\nimport { getDefaultAsrApiUrl, getState, updateState } from './state';\n\nconst REWRITE_API_PATH = '/v1/asr/input_rewrite';\n\n// 统一追加的请求头(用户要求:后续所有请求头都要带上)\nconst COMMON_HEADERS: Record<string, string> = {\n 'x-platform': 'WEB',\n 'x-version': '0.0.1',\n 'x-product': 'SenseType'\n};\n\nfunction normalizeTargetLang(targetLang: string): string {\n // 不做转译:传什么就用什么;None 表示默认语言 => 不传\n return targetLang === 'None' ? '' : targetLang;\n}\n\nfunction normalizeBearerToken(token: string): string {\n const t = token.trim();\n if (!t) return t;\n return /^Bearer\\s+/i.test(t) ? t : `Bearer ${t}`;\n}\n\nfunction extractTokenFromResponse(data: unknown): string | null {\n if (typeof data === 'string') return data.trim() || null;\n if (!data || typeof data !== 'object') return null;\n const anyData: any = data;\n const candidates = [\n anyData?.token,\n anyData?.access_token,\n anyData?.result?.token,\n anyData?.result?.access_token,\n anyData?.data?.token,\n anyData?.data?.access_token\n ];\n for (const c of candidates) {\n if (typeof c === 'string' && c.trim()) return c.trim();\n }\n return null;\n}\n\n/**\n * 确保已拿到 auth token(如果 state.publicKey 存在,会自动用它换取)。\n * - durationSeconds 固定 86400\n * - paths 不传\n */\nasync function ensureAuthToken(): Promise<string> {\n const state = getState();\n if (state.authToken) return state.authToken;\n if (state.authTokenPromise) return await state.authTokenPromise;\n\n if (!state.publicKey) {\n throw new Error('缺少 publicKey:无法换取 token');\n }\n\n const p = (async () => {\n const resp = await requestApplyTokenViaPublicKey({\n durationSeconds: 86400,\n publicKey: state.publicKey\n });\n const token = extractTokenFromResponse(resp);\n if (!token) {\n throw new Error('获取 token 失败:响应中未找到 token 字段');\n }\n updateState({ authToken: token, authTokenPromise: null });\n return token;\n })().catch((err) => {\n updateState({ authTokenPromise: null });\n throw err;\n });\n\n updateState({ authTokenPromise: p });\n return await p;\n}\n\n/**\n * 组装通用 headers:\n * - 必带 COMMON_HEADERS\n * - 如果已配置 publicKey,则会自动 ensure token,并加 Authorization: Bearer xxx\n */\nasync function buildAuthedHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const state = getState();\n const headers: Record<string, string> = {\n ...COMMON_HEADERS,\n ...(extra || {})\n };\n\n // 有 publicKey 才强制走鉴权;否则保持兼容\n if (state.publicKey) {\n const token = await ensureAuthToken();\n headers['Authorization'] = normalizeBearerToken(token);\n }\n return headers;\n}\n\n/**\n * 从完整 URL 提取 origin(例如 https://example.com:443),失败返回 null。\n * 主要用于:从 ASR URL 推导 Rewrite URL 的域名。\n */\nfunction getOriginFromUrl(url?: string): string | null {\n if (!url) return null;\n try {\n return new URL(url).origin;\n } catch {\n return null;\n }\n}\n\n/**\n * 根据 ASR URL 推导重写接口 URL。\n *\n * 规则:\n * - 优先使用 asrUrl 的 origin(例如 asrUrl=https://a.com/api/v1/asr/... -> https://a.com/api/v1/asr/asr_input_rewrite)\n * - 如果 asrUrl 不可用,则 fallback 到 getDefaultAsrApiUrl('stream') 的 origin\n * - 如果两者都不可解析,则返回相对路径(由浏览器按当前域名解析)\n */\nexport function getRewriteApiUrlFromAsr(asrUrl?: string): string {\n return `https://staging.api.senseaudio.cn${REWRITE_API_PATH}`;\n}\n\n/**\n * 调用“重写接口”(选中文本 + 语音指令 => 改写结果)。\n *\n * @returns rewritten_text(空字符串表示接口正常返回但无结果)\n * @throws Error 请求失败或返回非 2xx\n */\nexport async function requestRewriteText(params: {\n originalText: string;\n rewriteInstruction: string;\n asrApi?: ASRApiConfig;\n model: string;\n targetLang: string;\n}): Promise<string> {\n const url = getRewriteApiUrlFromAsr();\n const headers = await buildAuthedHeaders({\n ...(params.asrApi?.headers || {}),\n accept: 'application/json',\n 'x-platform': 'WEB',\n 'x-version': '0.0.1',\n 'x-product': 'SenseType',\n 'Content-Type': 'application/x-www-form-urlencoded'\n });\n\n // 后端使用 form-urlencoded\n const normalizedTargetLang = normalizeTargetLang(params.targetLang);\n const form: Record<string, string> = {\n original_text: params.originalText,\n rewrite_instruction: params.rewriteInstruction,\n model: params.model\n };\n // None => 不传 target_lang,走后端默认语言\n if (normalizedTargetLang) {\n form.target_lang = normalizedTargetLang;\n }\n const body = new URLSearchParams(form).toString();\n\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n throw new Error(`重写接口失败: ${resp.status} ${resp.statusText}${text ? ` - ${text}` : ''}`);\n }\n\n // 兼容接口返回结构:{ result: { rewritten_text: string } }\n const data = await resp.json().catch(() => ({}));\n const rewritten = data?.result?.rewritten_text;\n return typeof rewritten === 'string' ? rewritten : '';\n}\n\n/**\n * 调用 ASR 接口:上传音频并返回识别文本。\n *\n * 说明:\n * - 这里不负责录音/编码(由 recognition.ts 负责)\n * - 只负责将 mp3 blob 以 multipart/form-data 形式上传\n * - stream 模式通常返回 text/plain\n *\n * @returns 识别文本(空字符串表示接口正常返回但无文本)\n * @throws Error 请求失败或解析失败\n */\nexport async function requestAsrTextFromAudio(params: {\n audioBlob: Blob;\n asrUrl: string;\n asrMode: AsrMode;\n headers?: Record<string, string>;\n model: string;\n targetLang: string;\n}): Promise<string> {\n const fileName = 'recording.mp3';\n const audioFile = new File([params.audioBlob], fileName, { type: 'audio/mpeg' });\n const formData = new FormData();\n formData.append('file', audioFile, fileName);\n formData.append('model', params.model);\n const normalizedTargetLang = normalizeTargetLang(params.targetLang);\n if (normalizedTargetLang) {\n formData.append('target_lang', normalizedTargetLang);\n }\n\n const headers = await buildAuthedHeaders({\n accept: '*/*',\n 'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8',\n 'Cache-Control': 'no-cache',\n 'x-platform': 'WEB',\n 'x-version': '0.0.1',\n 'x-product': 'SenseType',\n Pragma: 'no-cache',\n ...(params.headers || {})\n });\n // fetch + FormData 会自动设置 multipart boundary;手动设置反而可能导致 boundary 丢失\n delete headers['Content-Type'];\n\n const response = await fetch(params.asrUrl, {\n method: 'POST',\n headers,\n body: formData,\n mode: 'cors',\n credentials: 'omit',\n cache: 'no-cache'\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `API 请求失败: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ''}`\n );\n }\n\n const contentType = response.headers.get('content-type') || '';\n let finalText = '';\n\n // 仅保留流式接口:优先按 text/plain 读取;兼容少量返回 json 的情况\n if (contentType.includes('application/json')) {\n const result = await response.json().catch(() => ({}));\n const candidate = (result as any)?.result?.final_text ?? (result as any)?.final_text ?? '';\n finalText = typeof candidate === 'string' ? candidate.trim() : '';\n } else {\n finalText = (await response.text()).trim();\n }\n\n return finalText;\n}\n\n/**\n * 申请 token(通过 public_key)。\n *\n * 对应示例:\n * POST /v1/apikey/apply_token_via_public_key\n * Headers:\n * - x-platform: WEB\n * - x-version: v2.0\n * - x-product: SenseAudio\n * - Content-Type: application/json\n */\nexport async function requestApplyTokenViaPublicKey(params: {\n durationSeconds: number;\n paths?: string[];\n publicKey: string;\n /**\n * 可选:指定接口域名/前缀(例如 https://api.example.com)。\n * 不传则使用相对路径(由浏览器按当前域名解析)。\n */\n baseUrl?: string;\n /** 可选:额外 headers(会覆盖默认值) */\n headers?: Record<string, string>;\n}): Promise<unknown> {\n const path = `https://staging.auth.senseaudio.cn/v1/apikey/apply_token_via_public_key`;\n const url = params.baseUrl ? new URL(path, params.baseUrl).toString() : path;\n\n const headers: Record<string, string> = {\n ...COMMON_HEADERS,\n 'Content-Type': 'application/json',\n ...(params.headers || {})\n };\n\n const payload: Record<string, unknown> = {\n duration_seconds: params.durationSeconds,\n public_key: params.publicKey\n };\n if (params.paths && params.paths.length > 0) {\n payload.paths = params.paths;\n }\n const body = JSON.stringify(payload);\n\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body,\n // redirect: 'follow'\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => '');\n throw new Error(`apply_token_via_public_key 失败: ${resp.status} ${resp.statusText}${text ? ` - ${text}` : ''}`);\n }\n\n const contentType = resp.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return await resp.json().catch(() => ({}));\n }\n return await resp.text();\n}\n\n/**\n * 预取 token:用于 init 阶段提前触发一次换取,减少首次请求延迟。\n * 失败时不抛到 UI 层(调用方可以忽略),真正发请求时仍会 ensureAuthToken 并抛错。\n */\nexport async function prefetchAuthToken(): Promise<void> {\n const state = getState();\n if (!state.publicKey) return;\n if (state.authToken) return;\n await ensureAuthToken();\n}\n\n\n","// 语音识别功能\n\nimport { getState, updateState, AsrMode } from './state';\nimport { showStatusIndicator, hideStatusIndicator, startAudioAnalysis, stopAudioAnalysis, updateWaveBars, showToast } from './ui';\nimport { requestAsrTextFromAudio } from './api';\n\n// 动态加载 lamejs\nfunction loadLamejs(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof (window as any).lamejs !== 'undefined') {\n resolve();\n return;\n }\n \n if ((window as any).__lamejsLoading) {\n const checkInterval = setInterval(() => {\n if (typeof (window as any).lamejs !== 'undefined') {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n setTimeout(() => {\n clearInterval(checkInterval);\n reject(new Error('加载lamejs超时'));\n }, 10000);\n return;\n }\n \n (window as any).__lamejsLoading = true;\n const script = document.createElement('script');\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/lamejs/1.2.1/lame.min.js';\n script.async = true;\n \n script.onload = () => {\n (window as any).__lamejsLoading = false;\n if (typeof (window as any).lamejs !== 'undefined') {\n resolve();\n } else {\n reject(new Error('lamejs 加载失败'));\n }\n };\n \n script.onerror = () => {\n (window as any).__lamejsLoading = false;\n showToast('语音加载失败:网络错误', 'error');\n reject(new Error('lamejs 加载失败:网络错误'));\n };\n \n document.head.appendChild(script);\n });\n}\n\n// 转换为 MP3\nasync function convertToMp3(audioBlob: Blob): Promise<Blob> {\n return new Promise((resolve, reject) => {\n try {\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const reader = new FileReader();\n \n reader.onload = async (e) => {\n try {\n const audioBuffer = await audioContext.decodeAudioData(e.target?.result as ArrayBuffer);\n const samples = audioBuffer.getChannelData(0);\n const sampleRate = audioBuffer.sampleRate;\n \n let monoData = samples;\n if (audioBuffer.numberOfChannels > 1) {\n const channel2 = audioBuffer.getChannelData(1);\n monoData = new Float32Array(samples.length);\n for (let i = 0; i < samples.length; i++) {\n monoData[i] = (samples[i] + channel2[i]) / 2;\n }\n }\n \n const pcmData = new Int16Array(monoData.length);\n for (let i = 0; i < monoData.length; i++) {\n const s = Math.max(-1, Math.min(1, monoData[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n \n if (typeof (window as any).lamejs !== 'undefined') {\n const lamejs = (window as any).lamejs;\n const mp3encoder = new lamejs.Mp3Encoder(1, sampleRate, 128);\n const sampleBlockSize = 1152;\n const mp3Data: Int8Array[] = [];\n \n for (let i = 0; i < pcmData.length; i += sampleBlockSize) {\n const sampleChunk = pcmData.subarray(i, i + sampleBlockSize);\n const mp3buf = mp3encoder.encodeBuffer(sampleChunk);\n if (mp3buf.length > 0) {\n mp3Data.push(mp3buf);\n }\n }\n \n const mp3buf = mp3encoder.flush();\n if (mp3buf.length > 0) {\n mp3Data.push(mp3buf);\n }\n \n const blobParts: BlobPart[] = [];\n for (const arr of mp3Data) {\n const buffer = new ArrayBuffer(arr.byteLength);\n const view = new Uint8Array(buffer);\n view.set(new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength));\n blobParts.push(buffer);\n }\n resolve(new Blob(blobParts, { type: 'audio/mpeg' }));\n } else {\n reject(new Error('需要加载lamejs库'));\n }\n } catch (error) {\n reject(error);\n }\n };\n \n reader.onerror = reject;\n reader.readAsArrayBuffer(audioBlob);\n } catch (error) {\n reject(error);\n }\n });\n}\n\n// 发送音频到 API\nasync function sendAudioToApi(audioBlob: Blob) {\n const state = getState();\n const mode: AsrMode = state.asrApi?.mode || 'stream';\n \n if (!state.asrApi?.url) {\n state.onError?.('API 配置不存在');\n return;\n }\n \n try {\n const finalText = await requestAsrTextFromAudio({\n audioBlob,\n asrUrl: state.asrApi.url,\n asrMode: mode,\n headers: state.asrApi.headers,\n model: state.model,\n targetLang: state.targetLang\n });\n\n if (finalText) {\n updateState({\n recognizedText: (state.recognizedText ? state.recognizedText + ' ' : '') + finalText\n });\n state.onRecordingUpdate?.(state.recognizedText);\n } else {\n // 接口返回内容为空时显示警告\n showToast('未识别到信息', 'info');\n }\n \n if (!state.shouldContinueRecording()) {\n const textToReturn = state.recognizedText.trim();\n updateState({ recognizedText: '', interimText: '' });\n state.onRecordingEnd?.(textToReturn);\n }\n } catch (error: any) {\n hideStatusIndicator();\n state.onError?.(`API 请求失败: ${error.message || '未知错误'}`);\n if (!state.shouldContinueRecording()) {\n const textToReturn = state.recognizedText.trim();\n updateState({ recognizedText: '', interimText: '' });\n state.onRecordingEnd?.(textToReturn);\n }\n }\n}\n\n// 开始语音识别\nexport function startSpeechRecognition(lang: string = 'zh-CN') {\n const state = getState();\n \n if (state.isRecording) return;\n if (!state.asrApi?.url) {\n state.onError?.('API 配置不存在');\n return;\n }\n \n startApiRecognition(lang);\n}\n\nasync function startApiRecognition(lang: string) {\n const state = getState();\n \n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 256;\n analyser.smoothingTimeConstant = 0.4;\n analyser.minDecibels = -90;\n analyser.maxDecibels = -10;\n source.connect(analyser);\n \n updateState({ audioAnalyser: analyser, audioContext });\n \n const mediaRecorder = new MediaRecorder(stream, {\n mimeType: MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' :\n MediaRecorder.isTypeSupported('audio/webm;codecs=opus') ? 'audio/webm;codecs=opus' :\n MediaRecorder.isTypeSupported('audio/mp4') ? 'audio/mp4' :\n 'audio/webm'\n });\n \n updateState({ mediaRecorder, audioChunks: [], isRecording: true });\n \n mediaRecorder.ondataavailable = (event: BlobEvent) => {\n if (event.data.size > 0) {\n state.audioChunks.push(event.data);\n }\n };\n \n mediaRecorder.onstop = async () => {\n try {\n stopAudioAnalysis();\n \n if (state.audioContext) {\n state.audioContext.close().catch(console.error);\n updateState({ audioContext: null, audioAnalyser: null });\n }\n \n stream.getTracks().forEach(track => track.stop());\n \n if (state.audioChunks.length === 0) {\n updateState({ isRecording: false });\n state.onRecordingEnd?.('');\n return;\n }\n \n const originalBlob = new Blob(state.audioChunks, { type: mediaRecorder.mimeType });\n updateState({ audioChunks: [] });\n \n let audioBlob = originalBlob;\n if (!originalBlob.type.includes('mpeg') && !originalBlob.type.includes('mp3')) {\n if (typeof (window as any).lamejs === 'undefined') {\n state.onRecordingUpdate?.('正在加载MP3编码器...');\n try {\n await loadLamejs();\n } catch (loadError) {\n state.onError?.('无法加载MP3编码器');\n updateState({ isRecording: false });\n state.onRecordingEnd?.('');\n return;\n }\n }\n \n state.onRecordingUpdate?.('正在转换为MP3格式...');\n audioBlob = await convertToMp3(originalBlob);\n }\n \n await sendAudioToApi(audioBlob);\n \n if (state.shouldContinueRecording()) {\n startApiRecognition(lang);\n } else {\n updateState({ isRecording: false });\n }\n } catch (error: any) {\n updateState({ isRecording: false });\n hideStatusIndicator();\n state.onError?.('处理录音数据失败');\n state.onRecordingEnd?.('');\n }\n };\n \n mediaRecorder.start();\n state.onRecordingStart?.();\n state.onRecordingUpdate?.('正在录音...');\n \n showStatusIndicator('speaking');\n startAudioAnalysis(analyser);\n } catch (error: any) {\n updateState({ isRecording: false });\n stopAudioAnalysis();\n hideStatusIndicator();\n \n if (state.audioContext) {\n state.audioContext.close().catch(console.error);\n updateState({ audioContext: null, audioAnalyser: null });\n }\n \n const errorMsg = error.name === 'NotAllowedError' ? '麦克风权限被拒绝' :\n error.name === 'NotFoundError' ? '未找到麦克风设备' :\n '启动录音失败';\n state.onError?.(errorMsg);\n }\n}\n\n// 停止语音识别\nexport function stopSpeechRecognition() {\n const state = getState();\n \n stopAudioAnalysis();\n \n if (state.mediaRecorder && state.isRecording) {\n try {\n if (state.mediaRecorder.state === 'recording') {\n state.mediaRecorder.stop();\n } else {\n updateState({ isRecording: false });\n hideStatusIndicator();\n }\n } catch (e) {\n updateState({ isRecording: false });\n hideStatusIndicator();\n \n if (state.audioContext) {\n state.audioContext.close().catch(console.error);\n updateState({ audioContext: null, audioAnalyser: null });\n }\n \n if (state.mediaRecorder?.stream) {\n state.mediaRecorder.stream.getTracks().forEach((track: MediaStreamTrack) => track.stop());\n }\n }\n } else {\n hideStatusIndicator();\n }\n}\n\n// 设置回调\nexport function setSpeechRecognitionCallbacks(callbacks: {\n onStart?: () => void;\n onUpdate?: (text: string) => void;\n onEnd?: (finalText: string) => void;\n onError?: (error: string) => void;\n shouldContinue?: () => boolean;\n}) {\n updateState({\n onRecordingStart: callbacks.onStart || null,\n onRecordingUpdate: callbacks.onUpdate || null,\n onRecordingEnd: callbacks.onEnd || null,\n onError: callbacks.onError || null,\n shouldContinueRecording: callbacks.shouldContinue || (() => false)\n });\n}\n\n// 获取录音状态\nexport function getRecordingState() {\n const state = getState();\n return {\n isRecording: state.isRecording,\n recognizedText: state.recognizedText,\n interimText: state.interimText\n };\n}\n\n","// 文本输入功能\n\nimport { getState, updateState } from './state';\n\nexport function setCurrentInputElementForTextInput(element: HTMLElement | null) {\n updateState({ currentInputElement: element });\n}\n\nexport function insertTextToInput(text: string) {\n const state = getState();\n const element = state.currentInputElement;\n \n if (!element || !text) return;\n \n // 处理普通 input 和 textarea\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const start = element.selectionStart || 0;\n const end = element.selectionEnd || 0;\n const value = element.value;\n const newValue = value.substring(0, start) + text + value.substring(end);\n const newCursorPos = start + text.length;\n \n const reactValueTracker = (element as any)._valueTracker;\n const previousValue = value;\n \n // 触发 beforeInput 事件\n if (typeof InputEvent !== 'undefined') {\n const beforeInputEvent = new InputEvent('beforeinput', {\n bubbles: true,\n cancelable: true,\n inputType: 'insertText',\n data: text\n });\n if (!element.dispatchEvent(beforeInputEvent)) return;\n }\n \n // 获取原生 setter\n let nativeValueSetter: ((value: string) => void) | null = null;\n if (element instanceof HTMLInputElement) {\n nativeValueSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set || null;\n } else if (element instanceof HTMLTextAreaElement) {\n nativeValueSetter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set || null;\n }\n \n // 设置值\n if (nativeValueSetter) {\n nativeValueSetter.call(element, newValue);\n } else {\n element.value = newValue;\n }\n \n // 更新 React 值跟踪器为旧值,确保 onChange 触发\n if (reactValueTracker) {\n reactValueTracker.setValue(previousValue);\n }\n \n // 设置光标位置\n element.selectionStart = newCursorPos;\n element.selectionEnd = newCursorPos;\n \n // 触发事件\n const inputEvent = typeof InputEvent !== 'undefined'\n ? new InputEvent('input', { bubbles: true, cancelable: true, data: text, inputType: 'insertText' })\n : new Event('input', { bubbles: true, cancelable: true });\n element.dispatchEvent(inputEvent);\n \n // 事件触发后同步 React 跟踪器为最新值\n if (reactValueTracker) {\n reactValueTracker.setValue(newValue);\n }\n \n const changeEvent = new Event('change', { bubbles: true, cancelable: true });\n element.dispatchEvent(changeEvent);\n \n // 确保焦点\n if (document.activeElement !== element) {\n element.focus();\n }\n \n setTimeout(() => {\n if (element && (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n element.selectionStart = newCursorPos;\n element.selectionEnd = newCursorPos;\n }\n }, 0);\n }\n // 处理 contentEditable 元素\n else if (element.contentEditable === 'true') {\n const selection = window.getSelection();\n \n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(text);\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n const textNode = document.createTextNode(text);\n element.appendChild(textNode);\n const range = document.createRange();\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n \n const inputEvent = new Event('input', { bubbles: true, cancelable: true });\n element.dispatchEvent(inputEvent);\n \n const changeEvent = new Event('change', { bubbles: true, cancelable: true });\n element.dispatchEvent(changeEvent);\n \n if (document.activeElement !== element) {\n element.focus();\n }\n }\n}\n\n","// 事件处理\n\nimport { getState, updateState, ShortcutKeyConfig } from './state';\nimport { startSpeechRecognition, stopSpeechRecognition, setSpeechRecognitionCallbacks, getRecordingState } from './recognition';\nimport { showToast, showStatusIndicator, hideStatusIndicator, showRewriteResult, hideRewriteResult } from './ui';\nimport { insertTextToInput, setCurrentInputElementForTextInput } from './input';\nimport { requestRewriteText } from './api';\n\n// 长按阈值(毫秒)\nconst LONG_PRESS_DELAY = 200;\nlet longPressTimer: number | null = null;\nlet eventHandlersRegistered = false;\n\n// 获取当前选中的文本:仅使用全局选区,选中哪里取哪里,不回退输入框选区\nfunction getSelectedText(currentInput: HTMLElement | null): string {\n const selection = window.getSelection();\n return selection ? selection.toString() : '';\n}\n\n// 调用文本重写接口\nasync function rewriteSelectedText(originalText: string, rewriteInstruction: string) {\n const state = getState();\n\n try {\n const rewritten = await requestRewriteText({\n originalText,\n rewriteInstruction,\n asrApi: state.asrApi,\n model: state.model,\n targetLang: state.targetLang\n });\n\n // 重写接口完成后才隐藏 loading\n hideStatusIndicator();\n\n if (rewritten) {\n showRewriteResult(rewritten);\n } else {\n // 接口返回内容为空时显示警告\n showToast('未识别到信息', 'info');\n }\n } catch (error) {\n console.error('[SDK] 调用重写接口出错:', error);\n // 出错时也要隐藏 loading\n hideStatusIndicator();\n showToast('服务器请求超时', 'error');\n }\n}\n\n// 检查是否匹配快捷键\nfunction isShortcutKey(event: KeyboardEvent): boolean {\n const state = getState();\n const shortcut = state.shortcutKey;\n \n let keyMatches = false;\n\n // 统一处理左右修饰键:Alt / Ctrl / Shift 默认支持左右两边\n const isAltShortcut = shortcut.code === 'AltLeft' || shortcut.code === 'AltRight' || shortcut.key === 'Alt';\n const isCtrlShortcut = shortcut.code === 'ControlLeft' || shortcut.code === 'ControlRight' || shortcut.key === 'Control';\n const isShiftShortcut = shortcut.code === 'ShiftLeft' || shortcut.code === 'ShiftRight' || shortcut.key === 'Shift';\n const eventIsAlt = event.code === 'AltLeft' || event.code === 'AltRight' || event.key === 'Alt';\n const eventIsCtrl = event.code === 'ControlLeft' || event.code === 'ControlRight' || event.key === 'Control';\n const eventIsShift = event.code === 'ShiftLeft' || event.code === 'ShiftRight' || event.key === 'Shift';\n\n // 修饰键场景:左右都可触发\n if (isAltShortcut && eventIsAlt) {\n keyMatches = true;\n } else if (isCtrlShortcut && eventIsCtrl) {\n keyMatches = true;\n } else if (isShiftShortcut && eventIsShift) {\n keyMatches = true;\n } else {\n // 非修饰键按旧逻辑匹配 code/key + location\n if (shortcut.code) {\n if (event.code === shortcut.code) {\n keyMatches = shortcut.location !== undefined ? event.location === shortcut.location : true;\n }\n }\n \n if (!keyMatches && shortcut.key) {\n if (event.key === shortcut.key) {\n keyMatches = shortcut.location !== undefined ? event.location === shortcut.location : true;\n }\n }\n }\n \n if (!shortcut.code && !shortcut.key) return false;\n if (!keyMatches) return false;\n \n // 检查其他修饰键\n const isAltKey = isAltShortcut;\n const isCtrlKey = isCtrlShortcut;\n const isShiftKey = isShiftShortcut;\n \n if (isAltKey && (event.ctrlKey || event.shiftKey || event.metaKey)) return false;\n if (isCtrlKey && (event.altKey || event.shiftKey || event.metaKey)) return false;\n if (isShiftKey && (event.altKey || event.ctrlKey || event.metaKey)) return false;\n if (!isAltKey && !isCtrlKey && !isShiftKey && (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) return false;\n \n const isMatch = true;\n console.log('[SDK] 快捷键匹配成功:', {\n eventCode: event.code,\n eventKey: event.key,\n eventLocation: event.location,\n shortcutConfig: shortcut,\n isMatch\n });\n \n return isMatch;\n}\n\n// 设置快捷键(内部使用:当前不对外暴露)\nfunction setShortcutKey(config: ShortcutKeyConfig) {\n const newConfig: ShortcutKeyConfig = {};\n \n if (config.code !== undefined) newConfig.code = config.code;\n if (config.key !== undefined) newConfig.key = config.key;\n if (config.location !== undefined) newConfig.location = config.location;\n \n // 根据 code 推断 key 和 location\n if (newConfig.code && !newConfig.key && !newConfig.location) {\n const code = newConfig.code;\n if (code === 'AltLeft') {\n newConfig.key = 'Alt';\n newConfig.location = 1;\n } else if (code === 'AltRight') {\n newConfig.key = 'Alt';\n newConfig.location = 2;\n } else if (code === 'ControlLeft') {\n newConfig.key = 'Control';\n newConfig.location = 1;\n } else if (code === 'ControlRight') {\n newConfig.key = 'Control';\n newConfig.location = 2;\n } else if (code === 'ShiftLeft') {\n newConfig.key = 'Shift';\n newConfig.location = 1;\n } else if (code === 'ShiftRight') {\n newConfig.key = 'Shift';\n newConfig.location = 2;\n } else if (code === 'CapsLock') {\n newConfig.key = 'CapsLock';\n newConfig.location = 0;\n } else if (code === 'Space') {\n newConfig.key = ' ';\n newConfig.location = 0;\n } else if (code === 'Fn') {\n newConfig.key = 'Fn';\n newConfig.location = 0;\n }\n }\n \n updateState({ shortcutKey: newConfig });\n}\n\n// 设置识别语言(内部使用:当前不对外暴露)\nfunction setRecognitionLang(lang: string) {\n updateState({ recognitionLang: lang });\n}\n\n// 键盘按下\nfunction handleKeyDown(event: KeyboardEvent) {\n const state = getState();\n if (!isShortcutKey(event)) return;\n\n // 避免长按重复触发\n if (event.repeat) {\n event.preventDefault();\n return;\n }\n\n // 仅长按才开始录音:按下立即记录状态,超过阈值后再启动录音\n if (state.isKeyPressed) return;\n\n // 如果 RewriteResult 显示,先关闭它\n if (state.rewriteResultRoot) {\n hideRewriteResult();\n }\n\n const selectedText = getSelectedText(state.currentInputElement);\n const hasSelection = !!selectedText;\n const hasFocusedInput = !!state.currentInputElement && document.activeElement === state.currentInputElement;\n\n if (!hasSelection && !hasFocusedInput) {\n showToast('请先聚焦输入框或框选文本', 'info');\n return;\n }\n\n console.log('[SDK] 快捷键按下 - 等待长按开始录音', {\n eventCode: event.code,\n eventKey: event.key,\n currentInputElement: state.currentInputElement,\n hasSelection,\n hasFocusedInput\n });\n\n updateState({\n isKeyPressed: true,\n isRecordingStarting: true,\n isIndicatorShown: false,\n selectedText\n });\n event.preventDefault();\n\n hideStatusIndicator();\n\n // 设置长按启动定时器\n longPressTimer = window.setTimeout(() => {\n const currentState = getState();\n if (!currentState.isKeyPressed) return;\n updateState({ isRecordingStarting: false });\n startSpeechRecognition(currentState.recognitionLang);\n }, LONG_PRESS_DELAY);\n}\n\n// 键盘松开\nfunction handleKeyUp(event: KeyboardEvent) {\n const state = getState();\n if (!isShortcutKey(event)) return;\n\n event.preventDefault();\n\n // 取消长按启动定时器\n if (longPressTimer !== null) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n\n if (state.isRecording) {\n console.log('[SDK] 快捷键松开 - 停止录音', {\n eventCode: event.code,\n eventKey: event.key,\n isRecording: state.isRecording\n });\n showStatusIndicator('loading');\n stopSpeechRecognition();\n }\n\n updateState({\n isKeyPressed: false,\n isRecordingStarting: false,\n isIndicatorShown: false\n });\n}\n\n// 输入框聚焦\nfunction handleFocus(event: FocusEvent) {\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.contentEditable === 'true' ||\n (target instanceof HTMLInputElement) ||\n (target instanceof HTMLTextAreaElement)\n ) {\n const element = target as HTMLInputElement | HTMLTextAreaElement | HTMLElement;\n updateState({ currentInputElement: element });\n setCurrentInputElementForTextInput(element);\n }\n}\n\n// 输入框失焦\nfunction handleBlur(event: FocusEvent) {\n const state = getState();\n const { isRecording } = getRecordingState();\n if (isRecording) {\n stopSpeechRecognition();\n updateState({ isKeyPressed: false });\n hideStatusIndicator();\n }\n // 失焦后清理当前输入框引用,避免使用旧的选区\n updateState({ currentInputElement: null, selectedText: '' });\n setCurrentInputElementForTextInput(null);\n}\n\n// 初始化事件处理器\nexport function initEventHandlers() {\n console.log(123);\n \n const state = getState();\n\n // 避免重复注册(例如 publicKey 变更触发 reinit)\n if (eventHandlersRegistered) return;\n \n // 设置语音识别回调\n setSpeechRecognitionCallbacks({\n onStart: () => {\n if (state.isKeyPressed) {\n updateState({ isIndicatorShown: true });\n }\n },\n onUpdate: () => {\n // 文本更新时保持 speaking 状态\n },\n onEnd: (finalText: string) => {\n const currentState = getState();\n const selectedText = currentState.selectedText;\n\n updateState({\n isIndicatorShown: false,\n isRecordingStarting: false,\n isKeyPressed: false,\n selectedText: ''\n });\n \n if (finalText) {\n if (selectedText) {\n // 选中文本走重写接口,保持 loading 状态直到接口返回\n // 不在这里隐藏 loading,让 rewriteSelectedText 处理\n showStatusIndicator('loading');\n rewriteSelectedText(selectedText, finalText);\n } else {\n // 输入框聚焦场景,按原逻辑插入\n hideStatusIndicator();\n insertTextToInput(finalText);\n // showToast('语音输入完成', 'success');\n }\n } else {\n // 没有识别到文本,隐藏 loading\n hideStatusIndicator();\n }\n },\n onError: (error: string) => {\n updateState({ isIndicatorShown: false });\n console.log('error', error);\n showToast(`服务器连接超时`, 'error');\n hideStatusIndicator();\n },\n shouldContinue: () => false\n });\n \n // 添加事件监听\n console.log('[SDK] 注册事件监听器', {\n shortcutKey: state.shortcutKey,\n recognitionLang: state.recognitionLang\n });\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('keyup', handleKeyUp, true);\n document.addEventListener('focusin', handleFocus, true);\n document.addEventListener('focusout', handleBlur, true);\n eventHandlersRegistered = true;\n console.log('[SDK] 事件监听器注册完成');\n}\n\n// 卸载事件处理器(用于重新初始化,避免重复注册)\nexport function destroyEventHandlers() {\n if (!eventHandlersRegistered) return;\n\n // 清理长按定时器\n if (longPressTimer !== null) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n\n document.removeEventListener('keydown', handleKeyDown, true);\n document.removeEventListener('keyup', handleKeyUp, true);\n document.removeEventListener('focusin', handleFocus, true);\n document.removeEventListener('focusout', handleBlur, true);\n eventHandlersRegistered = false;\n}\n\n// 获取当前输入元素\nexport function getCurrentInputElement() {\n return getState().currentInputElement;\n}\n\n// 当前不对外暴露快捷键配置获取能力\n\n","// 核心功能:初始化和配置\n\nimport { getState, updateState, ShortcutKeyConfig, ASRApiConfig, getDefaultAsrApiUrl } from './state';\nimport { initEventHandlers, destroyEventHandlers } from './events';\nimport { prefetchAuthToken } from './api';\n\n// 确保样式在 DOM 准备好后注入\nfunction ensureStylesInjected() {\n if (typeof document === 'undefined') return;\n \n // 检查样式是否已经注入\n const existingStyles = document.querySelectorAll('style[data-sdk-styles]');\n if (existingStyles.length > 0) return;\n \n // 如果 document.head 还没准备好,等待\n if (!document.head) {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', ensureStylesInjected);\n return;\n } else {\n setTimeout(ensureStylesInjected, 0);\n return;\n }\n }\n \n // 样式应该已经由 rollup-plugin-postcss 注入,这里只是确保\n // 如果样式没有注入,尝试从全局变量获取并注入\n // 注意:这需要 rollup-plugin-postcss 生成的样式变量在全局作用域\n}\n\nexport function sense_ai_helper_sdk_voice_to_text(options?: {\n lang?: string;\n shortcutKey?: ShortcutKeyConfig;\n asrApi?: ASRApiConfig;\n publicKey?: string;\n targetLang?: string;\n}) {\n const state = getState();\n \n if (state.isInitialized) return;\n \n // 设置 API 配置\n updateState({\n asrApi: {\n url: options?.asrApi?.url || getDefaultAsrApiUrl('stream'),\n headers: options?.asrApi?.headers || {},\n mode: 'stream'\n }\n });\n \n // 设置识别语言\n if (options?.lang) {\n updateState({ recognitionLang: options.lang });\n }\n \n // 初始化鉴权与通用参数\n updateState({\n publicKey: options?.publicKey || '',\n targetLang: options?.targetLang || state.targetLang || 'None',\n model: 'sense-asr-deepthink',\n authToken: null,\n authTokenPromise: null\n });\n\n // 预取 token(不阻塞初始化;真正发请求时会 await)\n if (options?.publicKey) {\n prefetchAuthToken().catch(() => {\n // 这里不做 toast,交给实际请求时的错误处理\n });\n }\n\n // 设置快捷键\n if (options?.shortcutKey) {\n updateState({ shortcutKey: options.shortcutKey });\n }\n \n updateState({ isInitialized: true });\n \n // 确保样式已注入\n ensureStylesInjected();\n \n // 初始化事件处理器\n initEventHandlers();\n}\n\n/**\n * 重新初始化 SDK(用于 publicKey 变更等场景)。\n * - 会先卸载事件监听,避免重复注册\n * - 会复用当前 state 的配置作为默认值\n */\nexport function reinitInputListenerSDK(options?: {\n lang?: string;\n shortcutKey?: ShortcutKeyConfig;\n asrApi?: ASRApiConfig;\n publicKey?: string;\n targetLang?: string;\n}) {\n const state = getState();\n\n // 如果已初始化,先卸载监听避免重复\n if (state.isInitialized) {\n destroyEventHandlers();\n }\n\n updateState({ isInitialized: false });\n\n sense_ai_helper_sdk_voice_to_text({\n lang: options?.lang ?? state.recognitionLang,\n shortcutKey: options?.shortcutKey ?? state.shortcutKey,\n asrApi: options?.asrApi ?? state.asrApi,\n publicKey: options?.publicKey ?? state.publicKey,\n targetLang: options?.targetLang ?? state.targetLang\n });\n}\n\n/** 运行时修改 targetLang:直接替换即可 */\nexport function setTargetLang(targetLang: string) {\n updateState({ targetLang });\n}\n\n/**\n * 运行时修改 publicKey:需要重新初始化 SDK(并重新换取 token)。\n * 说明:会保留现有的 lang/shortcutKey/asrApi 配置。\n */\nexport function setPublicKey(publicKey: string) {\n reinitInputListenerSDK({ publicKey });\n // 预取 token(不阻塞)\n prefetchAuthToken().catch(() => {});\n}\n\n","// 输入框监听 SDK(对外只暴露 publicKey / targetLang)\n\nimport {\n sense_ai_helper_sdk_voice_to_text,\n setPublicKey as setPublicKeyInternal,\n setTargetLang as setTargetLangInternal\n} from '../utils/inputListener';\n\n// SDK 配置接口\nexport interface InputListenerOptions {\n enabled?: boolean;\n /** 用于换取 token */\n publicKey?: string;\n /** 后续请求参数 target_lang */\n targetLang?: string;\n}\n\n// 初始化输入框监听 SDK\nexport function initInputListenerSDK(options?: InputListenerOptions) {\n console.log('语音识别SDK初始化');\n \n if (options?.enabled === false) {\n return;\n }\n \n const convertedOptions = options\n ? {\n publicKey: options.publicKey,\n targetLang: options.targetLang\n }\n : undefined;\n \n // 等待 DOM 加载完成\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n sense_ai_helper_sdk_voice_to_text(convertedOptions);\n });\n } else {\n sense_ai_helper_sdk_voice_to_text(convertedOptions);\n }\n}\n\n// 运行时修改 publicKey:内部会触发重新初始化并重新换取 token\nexport function setPublicKey(publicKey: string) {\n setPublicKeyInternal(publicKey);\n}\n\n// 运行时修改 targetLang:直接替换即可\nexport function setTargetLang(targetLang: string) {\n setTargetLangInternal(targetLang);\n}\n\n// 命名导出\nexport const InputListener = {\n init: initInputListenerSDK,\n setPublicKey,\n setTargetLang\n};\n\n// 注意:不再在脚本加载/模块导入时自动初始化。\n// 如需启用,请由业务方显式调用 initInputListenerSDK() 或 InputListener.init()。\n","// 所有 SDK 的统一导出入口\n\nexport * from './inputListener';\n\n// 命名导出所有 SDK\nimport * as InputListenerSDK from './inputListener';\n\nexport const SDKs = {\n InputListener: InputListenerSDK,\n};\n\n","// 主入口文件 - 导出所有 SDK 模块\n\nexport * from './sdks';\n\n// 为了向后兼容,保留原有的 initSDK 函数\nimport { initInputListenerSDK } from './sdks/inputListener';\n\nexport interface SDKOptions {\n enabled?: boolean;\n /** 用于换取 token */\n publicKey?: string;\n /** 后续请求参数 target_lang */\n targetLang?: string;\n}\n\n// 初始化 SDK(向后兼容)\nexport function initSDK(options?: SDKOptions) {\n initInputListenerSDK(options);\n}\n\n// 注意:不再在脚本加载/模块导入时自动初始化。\n// 如需启用,请由业务方显式调用 initSDK()。\n"],"names":["getDefaultAsrApiUrl","mode","concat","getState","window","senseAiHelperSdk","inputListener","shortcutKey","key","recognitionLang","asrApi","url","headers","publicKey","targetLang","model","authToken","authTokenPromise","selectedText","currentInputElement","isKeyPressed","isRecordingStarting","isIndicatorShown","mediaRecorder","audioChunks","isRecording","recognizedText","interimText","audioContext","audioAnalyser","audioAnalysisFrameId","currentVolumes","statusIndicatorRoot","toastRoot","currentIndicatorStatus","undefined","isHidingIndicator","hideIndicatorTimer","isCreatingIndicator","rewriteResultRoot","onRecordingStart","onRecordingUpdate","onRecordingEnd","onError","shouldContinueRecording","isInitialized","updateState","updates","state","Object","assign","__assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","SuppressedError","defaultWaveBarConfig","barCount","maxBarHeight","minBarHeight","barWidth","gap","borderRadius","waveConfig","gradientStart","gradientMiddle","gradientEnd","interpolationFactor","staticWaveConfig","staticHeightRatio","WaveBars","_a","volumes","_b","isStatic","_c","className","_d","useState","Array","fill","barHeights","setBarHeights","useEffect","bar_1","heightRange_1","staticHeightRatio_1","heights","map","centerIndex","normalizedDistance","Math","abs","baseSymmetry","pow","symmetry","max","min","bar","animation","heightRange","prevHeights","prevHeight","rawVolume","distanceFromCenter","symmetricIndex","round","mixedVolume","normalizedVolume","sqrt","baseSymmetryFactor","symmetryFactor","newHeight","colors","React","styles","waveContainer","waveBarsContainer","height","index","isLast","waveBar","background","width","marginRight","StatusIndicator","status","isHiding","statusIndicator","hiding","loadingWithWave","filter","Boolean","join","id","loadingWithWaveContainer","xmlns","viewBox","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","x1","y1","x2","y2","gradientUnits","stopColor","offset","dotsContainer","from","dot","rotatingPoints","rotatingPoint","Toast","message","duration","onClose","timer","setTimeout","clearTimeout","toast","RewriteResult","text","onCopy","onClick","BundledReact","ReactDOM","globalReactDOM_1","createRoot","render","container","element","ReactDOMClient","globalReactDOMClient","BundledReactDOMClient","BundledReactDOM","getReactDOM","showStatusIndicator","updateStatusIndicatorVolumes","getElementById","initStatusIndicatorContainer","wrapper","position","bottom","left","transform","zIndex","pointerEvents","error","hideStatusIndicator","stopAudioAnalysis","startAudioAnalysis","analyserNode","bufferLength","frequencyBinCount","dataArray","Uint8Array","lastUpdateTime","frameId","requestAnimationFrame","updateWaveform","currentTime","getByteFrequencyData","logStart","logEnd","start","floor","end","sum","count","j","mixed","updateWaveBars","cancelAnimationFrame","showToast","initToastContainer","ToastElement","showRewriteResult","_this","initRewriteResultContainer","root","close","popup","navigator","clipboard","writeText","COMMON_HEADERS","normalizeTargetLang","ensureAuthToken","Error","requestApplyTokenViaPublicKey","durationSeconds","resp","token","data","trim","anyData","_i","candidates_1","access_token","c","extractTokenFromResponse","catch","err","buildAuthedHeaders","extra","test","normalizeBearerToken","requestRewriteText","params","accept","normalizedTargetLang","form","original_text","originalText","rewrite_instruction","rewriteInstruction","target_lang","URLSearchParams","toString","fetch","method","ok","statusText","json","rewritten","rewritten_text","requestAsrTextFromAudio","fileName","audioFile","File","audioBlob","formData","FormData","append","Pragma","asrUrl","credentials","cache","response","errorText","contentType","get","finalText","includes","candidate","final_text","path","baseUrl","URL","payload","duration_seconds","public_key","paths","JSON","stringify","prefetchAuthToken","convertToMp3","audioContext_1","AudioContext","webkitAudioContext","reader","FileReader","onload","decodeAudioData","target","audioBuffer","samples","getChannelData","sampleRate","monoData","numberOfChannels","channel2","Float32Array","pcmData","Int16Array","lamejs","mp3encoder","Mp3Encoder","mp3Data","sampleChunk","subarray","mp3buf_1","encodeBuffer","mp3buf","flush","blobParts","mp3Data_1","arr","buffer","ArrayBuffer","byteLength","set","byteOffset","Blob","error_1","onerror","readAsArrayBuffer","sendAudioToApi","_h","textToReturn","_e","_f","error_2","_g","startSpeechRecognition","lang","startApiRecognition","mediaDevices","getUserMedia","audio","stream_1","source","createMediaStreamSource","analyser","createAnalyser","fftSize","smoothingTimeConstant","minDecibels","maxDecibels","connect","mediaRecorder_1","MediaRecorder","mimeType","isTypeSupported","ondataavailable","event","size","onstop","console","getTracks","forEach","track","stop","originalBlob","__lamejsLoading","checkInterval_1","setInterval","clearInterval","script","src","async","errorMsg","error_3","name","stopSpeechRecognition","stream","setCurrentInputElementForTextInput","longPressTimer","eventHandlersRegistered","isShortcutKey","shortcut","keyMatches","isAltShortcut","code","isCtrlShortcut","isShiftShortcut","eventIsAlt","eventIsCtrl","eventIsShift","location","isAltKey","isCtrlKey","isShiftKey","ctrlKey","shiftKey","metaKey","altKey","handleKeyDown","repeat","preventDefault","hideRewriteResult","selection","getSelection","hasSelection","hasFocusedInput","activeElement","currentState","handleKeyUp","handleFocus","tagName","contentEditable","HTMLInputElement","HTMLTextAreaElement","handleBlur","initEventHandlers","callbacks","onStart","onUpdate","onEnd","rewriteSelectedText","selectionStart","selectionEnd","newValue","substring","newCursorPos_1","reactValueTracker","_valueTracker","previousValue","InputEvent","beforeInputEvent","bubbles","cancelable","inputType","dispatchEvent","nativeValueSetter","getOwnPropertyDescriptor","setValue","inputEvent","Event","changeEvent","focus","rangeCount","range","getRangeAt","deleteContents","textNode","insertNode","setStartAfter","setEndAfter","removeAllRanges","addRange","createRange","sel","insertTextToInput","shouldContinue","addEventListener","ensureStylesInjected","querySelectorAll","readyState","sense_ai_helper_sdk_voice_to_text","options","reinitInputListenerSDK","removeEventListener","initInputListenerSDK","enabled","convertedOptions","setPublicKey","setPublicKeyInternal","setTargetLang","setTargetLangInternal","InputListener","init","SDKs","initSDK"],"mappings":"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","x_google_ignoreList":[1,2]}
@@ -0,0 +1,5 @@
1
+ export * from './inputListener';
2
+ import * as InputListenerSDK from './inputListener';
3
+ export declare const SDKs: {
4
+ InputListener: typeof InputListenerSDK;
5
+ };
@@ -0,0 +1,15 @@
1
+ export interface InputListenerOptions {
2
+ enabled?: boolean;
3
+ /** 用于换取 token */
4
+ publicKey?: string;
5
+ /** 后续请求参数 target_lang */
6
+ targetLang?: string;
7
+ }
8
+ export declare function initInputListenerSDK(options?: InputListenerOptions): void;
9
+ export declare function setPublicKey(publicKey: string): void;
10
+ export declare function setTargetLang(targetLang: string): void;
11
+ export declare const InputListener: {
12
+ init: typeof initInputListenerSDK;
13
+ setPublicKey: typeof setPublicKey;
14
+ setTargetLang: typeof setTargetLang;
15
+ };