offset++] = channelData[i]; if (this._offset >= BUFFER_SIZE) { this.port.postMessage(this._buffer.slice()); this._offset = 0; } } return true; } } registerProcessor('meeting-audio-processor', MeetingAudioProcessor); `],{type:"application/javascript"}),u=URL.createObjectURL(d);try{await o.audioWorklet.addModule(u)}finally{URL.revokeObjectURL(u)}if(r)return void o.close();let h=new AudioWorkletNode(o,"meeting-audio-processor");c.connect(h),h.connect(o.destination),h.port.onmessage=e=>{let t=(e=>{let t=new Int16Array(e.length);for(let r=0;r{let t="",r=new Uint8Array(e),a=r.byteLength;for(let e=0;e{h.port.close(),h.disconnect(),c.disconnect(),s?.disconnect(),l?.disconnect(),o.close(),a.current=null}})().catch(e=>{e7.warn("[useGeminiTranscription]","Audio worklet setup failed",e)}),()=>{r=!0,n?.()}},[e,t,g]),{transcript:i,isTranscribing:l,clearTranscript:p}})({microphoneStream:"dictation"===c?A:null,systemAudioStream:"dictation"===c?F:null});(({microphoneStream:e,screenStream:t})=>{let r=(0,ee.useRef)(null),a=(0,ee.useRef)([]),n=(0,ee.useRef)(!1),o=(0,ee.useRef)(null),i=(0,ee.useRef)(null),s=(0,ee.useRef)(!1),l=(0,ee.useRef)(null),c=(0,ex.d4)($.ZT),d=(0,ex.d4)($.jV),u=(0,ee.useMemo)(()=>{let e;if(!c)return null;let t=(0,e8.hf)(c);if(!t)return null;let r=!!(0,m.qN)(Q.J.location.href).local_gemini||(0,e3.A)(),a=r?"localhost:8080":(0,e4.zT)();return e=d&&c&&c!==d?`${d}/${c}`:d||c,`${r?"ws":"wss"}://${a}/cache/${e}/exp/ailive?flannel=true&token=${t}`},[c,d]),h=(0,ee.useRef)(()=>{}),p=(0,ee.useCallback)(()=>{if(n.current||0===a.current.length)return;n.current=!0;let e=((e,t=e5,r=16,a=1)=>{let n=mergeUint8Arrays(e),o=n.length,i=a*r/8,s=new ArrayBuffer(44),l=new DataView(s),writeString=(e,t)=>{for(let r=0;r{URL.revokeObjectURL(r),n.current=!1,h.current()},t.onerror=()=>{e6.warn("[useGeminiLiveSession]","Audio playback error"),URL.revokeObjectURL(r),n.current=!1,h.current()},t.play().catch(e=>{e6.warn("[useGeminiLiveSession]","Failed to play audio",e),URL.revokeObjectURL(r),n.current=!1,h.current()})},[]);(0,ee.useEffect)(()=>{h.current=p},[p]);let f=(0,ee.useCallback)(e=>{let t;if(!e||!e.data)return;try{t=JSON.parse(e.data)}catch{return}if(!t?.serverContent)return;let{serverContent:r}=t;if(r.interrupted){a.current=[],o.current&&(o.current.pause(),o.current.currentTime=0),n.current=!1;return}if(r.turnComplete)return;let i=r.modelTurn?.parts?.[0]?.inlineData;if(i?.mimeType?.startsWith("audio/pcm")&&i.data){let e=(e=>{let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e{if(!u)return void e6.warn("[useGeminiLiveSession]","No WebSocket URL available, cannot connect");if(r.current)return void e6.info("[useGeminiLiveSession]","WebSocket already exists, skipping connect");e6.info("[useGeminiLiveSession]","Connecting to",`${u.split("token=")[0]}token=REDACTED`),s.current=!1;try{let e=new WebSocket(u);r.current=e,e.onopen=()=>{e6.info("[useGeminiLiveSession]","WebSocket connected")},e.onmessage=f,e.onerror=e=>{e6.warn("[useGeminiLiveSession]","Connection error",e)},e.onclose=t=>{e6.warn("[useGeminiLiveSession]",`WebSocket closed: code=${t.code} reason="${t.reason}" wasClean=${t.wasClean}`),r.current===e&&(r.current=null,a.current=[],n.current=!1),!s.current&&u&&(e6.info("[useGeminiLiveSession]","Unexpected close, reconnecting in 2s"),l.current=setTimeout(()=>{l.current=null,g()},2e3))}}catch(e){e6.warn("[useGeminiLiveSession]","Failed to connect",e)}},[u,f]),w=(0,ee.useCallback)(()=>{s.current=!0,l.current&&(clearTimeout(l.current),l.current=null),r.current&&(e6.info("[useGeminiLiveSession]","Disconnecting WebSocket"),r.current.close(),r.current=null),o.current&&(o.current.pause(),o.current=null),a.current=[],n.current=!1,i.current&&(i.current.close(),i.current=null)},[]),y=(0,ee.useCallback)(e=>{let t=r.current;if(t?.readyState===WebSocket.OPEN){if(t.bufferedAmount>2097152)return;let r=(e=>{try{return JSON.stringify({realtimeInput:{mediaChunks:[{data:e,mimeType:"audio/pcm"}]}})}catch(e){return e6.warn("[useGeminiLiveSession]","Could not create audio content",e),""}})(e);if(!r)return;try{let e=JSON.parse(r),t=Object.keys(e),a=e[t[0]]?.mediaChunks?.[0]?.mimeType||"",n=e[t[0]]?.mediaChunks?.[0]?.data?.length||0;if("realtimeInput"===t[0]&&a.startsWith("audio/")){if(0===n)return void e6.warn("[useGeminiLiveSession]","Empty audio chunk, skipping")}else e6.warn("[useGeminiLiveSession]",`Unexpected WS message: keys=${t.join(",")} mimeType=${a}`)}catch{}t.send(r)}},[]),b=(0,ee.useCallback)(e=>{let t=r.current;if(t?.readyState===WebSocket.OPEN){if(t.bufferedAmount>2097152)return;t.send((e=>{try{return JSON.stringify({realtimeInput:{mediaChunks:[{data:e,mimeType:"image/jpeg"}]}})}catch(e){return e6.warn("[useGeminiLiveSession]","Could not create image content",e),""}})(e))}},[]);(0,ee.useEffect)(()=>{let r=e||t;e6.info("[useGeminiLiveSession]",`Stream state changed: mic=${!!e} screen=${!!t} wsUrl=${!!u}`),r&&u?g():r||w()},[e,t,u,g,w]),(0,ee.useEffect)(()=>()=>{w()},[]),(0,ee.useEffect)(()=>{if(!e)return;let t=!1,r=null;return(async()=>{let a=new AudioContext({sampleRate:e5});i.current=a;let n=a.createMediaStreamSource(e);if(t)return void a.close();let o=new Blob([` const BUFFER_SIZE = 4096; class LiveAudioProcessor extends AudioWorkletProcessor { constructor() { super(); this._buffer = new Float32Array(BUFFER_SIZE); this._offset = 0; } process(inputs) { const input = inputs[0]; if (!input || !input[0]) return true; const channelData = input[0]; for (let i = 0; i < channelData.length; i++) { this._buffer[this._offset++] = channelData[i]; if (this._offset >= BUFFER_SIZE) { this.port.postMessage(this._buffer.slice()); this._offset = 0; } } return true; } } registerProcessor('live-audio-processor', LiveAudioProcessor); `],{type:"application/javascript"}),s=URL.createObjectURL(o);try{await a.audioWorklet.addModule(s)}finally{URL.revokeObjectURL(s)}if(t)return void a.close();let l=new AudioWorkletNode(a,"live-audio-processor");n.connect(l),l.connect(a.destination),l.port.onmessage=e=>{y((e=>{let t="",r=new Uint8Array(e),a=r.byteLength;for(let e=0;e{let t=new Int16Array(e.length);for(let r=0;r{l.port.close(),l.disconnect(),n.disconnect(),a.close(),i.current=null}})().catch(e=>{e6.warn("[useGeminiLiveSession]","Audio worklet setup failed",e)}),()=>{t=!0,r?.()}},[e,y]),(0,ee.useEffect)(()=>{if(!t)return;let e=Q.J.document.createElement("video");e.srcObject=t,e.play();let r=Q.J.document.createElement("canvas"),a=r.getContext("2d"),n=setInterval(()=>{if(!a)return;let n=t.getVideoTracks()[0];n&&"live"===n.readyState&&0!==e.videoWidth&&0!==e.videoHeight&&(r.width=e.videoWidth,r.height=e.videoHeight,a.drawImage(e,0,0,r.width,r.height),b(r.toDataURL("image/jpeg").split(";base64,")[1]))},1e3);return()=>{clearInterval(n),e.srcObject=null}},[t,b])})({microphoneStream:D,screenStream:I}),(0,ee.useEffect)(()=>{if(!g.current||!T||"live"===c)return;let e=U.length;if(e>u.current){let t=U.slice(u.current),r=g.current.getText?.()||"";(""===r||r.endsWith(" "))&&(t=t.trimStart()),g.current.setText?.(r+t),u.current=e}},[U,c,T]),(0,ee.useEffect)(()=>{T||(u.current=0)},[T]),(0,ee.useEffect)(()=>{let e="dictation"===c&&T;e&&!L?N().catch(()=>{}):!e&&L&&P()},[c,T,L,N,P]),(0,ee.useEffect)(()=>{V(),u.current=0,"dictation"===c&&!h.current&&g.current&&g.current.setText?.(""),h.current=!1},[c,V]),(0,ee.useEffect)(()=>(r((0,ef.xM)({channelId:"",threadTs:null})),()=>{r((0,ef.xM)({channelId:"",threadTs:null}))}),[r]);let G=(0,ee.useCallback)(e=>{if("Escape"===e.key){let e=t?.deref();e&&!e.closed&&e.close()}},[t]);(0,tT.M)("keydown",G,{element:t?.deref()?.document,isEnabled:!f&&!!t}),(0,ee.useEffect)(()=>{let e=t?.deref();if(!e)return;let handleBlur=()=>{w&&g.current?.blur?.()};return e.addEventListener("blur",handleBlur),()=>{e.removeEventListener("blur",handleBlur)}},[t,w]);let K=(0,ee.useCallback)(()=>{y(!0),e?.(!0)},[e]),q=(0,ee.useCallback)(()=>{y(!1),e?.(!1)},[e]),j=(0,ee.useCallback)(async e=>{let r=t?.deref();if(!r)return;let a=await captureScreen({win:r,screen:e});a.success?await S(a.blob):l(a.error)},[t,S]),Z=(0,ee.useCallback)(()=>{l("permission-denied")},[]),z=(0,ee.useCallback)(async(e,t,a)=>{try{let o=await r((0,em.Z)({memberId:"USLACKBOT",shouldNavigateToChannel:!1,reason:"operator-window-conversation"})),s=o?.id;if(!s)return void i(!1);n(s);let l=await r((0,ep.Ay)({channelId:s,delta:e,draftId:b,fileIds:t,pendingFileIds:a,viewContext:eh.Y.SLACKBOT_AI_CONVERSATION})),c=l?.ts;c&&await r((0,ef.xM)({channelId:s,threadTs:c})),i(!1)}catch(e){tM.error("handleSendMessage failed to start Slackbot conversation",e),i(!1)}},[r,b]),J=(0,ee.useCallback)(()=>{if(!g.current)return!1;let e=g.current.getContents?.();return!!e&&(i(!0),z(new ec.Ru(e.contents),_,k),!1)},[z,_,k]),H=(0,ee.useCallback)(()=>l(null),[]);if(f&&a&&p)return ee.createElement("div",{className:ts().contentContainer},ee.createElement("div",{className:ts().threadContainer},ee.createElement(t_.A,{key:`operator-threads-${a}-${p}`,serializationKey:`operator-threads-${a}-${p}`,channelId:a,threadTs:p,viewContext:eh.Y.SLACKBOT_AI_CONVERSATION,gravityLayout:!0,startAtTop:!1,hideHeader:!0,isQuipCommentThread:!0})));let Y=s&&ee.createElement(e1.Ay,{level:e1.A_.warning,showCloseButton:!0,onClose:H},s?"permission-denied"===s?(0,tk.xj)():x?tI.t("Failed to capture screenshot. Please try again."):"Failed to capture screenshot. Please try again.":null);return ee.createElement("div",{className:ts().contentContainer},Y,ee.createElement(ScreenshotCaptureOverlay,{windowRef:t,onDragStart:hideOperator,onCaptureComplete:S,onDismiss:showOperator,isEnabled:!f&&!o}),ee.createElement("div",{className:ts().inputWrapper},ee.createElement(tx.A,{ref:g,channelId:a,draft:o?void 0:v,viewContext:eh.Y.SLACKBOT_AI_CONVERSATION,placeholder:x?tI.t("Ask or search anything"):"Ask or search anything",sendMessage:J,enableEmojiButton:!1,enableMentionButton:!1,enableComposerButton:!1,enableSlashCommandsButton:!1,enableSendButton:!0,enableFileButton:!1,maxLines:8,useWysiwyg:!1,focusOnMount:!0,autocompleteProps:{onOpen:K,onClose:q}}),o&&ee.createElement("div",{className:ts().spinner},ee.createElement(e2.A,{size:"medium"})),!o&&ee.createElement("div",{className:ts().toolsContainer},ee.createElement(tc,{microphoneOn:T,microphoneFailed:R,startMicrophone:E,stopMicrophone:O,microphoneStream:A,mode:c,onModeChange:d}),ee.createElement(tC.A,{screenCaptureOn:M,startScreenCapture:W,stopScreenCapture:B,clogButton:e0.A}),ee.createElement(tw,{onScreenSelected:j,onPermissionDenied:Z}))))});tW.displayName="OperatorContent";var tB=r(0xa6f3163b),tL=r(0x2501a2cee),tF=r(0x24aac3ef),tN=r.n(tF);let tP=new eo.Ay("operator"),tD=ee.memo(({onClose:e})=>{let t=(0,ex.d4)(e=>"on"===(0,eT._Z)(e,"desktop_command_center"));return ee.createElement("div",{className:tN().headerContainer},ee.createElement("div",{className:tN().headerLogo},ee.createElement(tL.Ah,{name:"slack-logo",size:"16"})),ee.createElement("div",{className:tN().headerActions},ee.createElement(tB.A,{htmlType:"button",onClick:e,className:tN().headerActionButton,"aria-label":t?tP.t("Close"):"Close"},ee.createElement(tL.Ah,{name:"close"}))))});tD.displayName="OperatorHeader";let tU="operator-window-id";var t$=r(0xd66cda03),tV=r(0xa69165cb),tG=r(0x1f57aea47),tK=r(0x1b712feab),tq=r(0x1ebac3ac1),tj=r(0x19bbcf8d7),tZ=r.n(tj);let tz=ee.memo(()=>{let{windowRef:e,windowToken:t,windowId:r}=(0,ee.useContext)(ea._0),a=(0,en.wA)(),n="dark"===(0,t$.cw)(eF.to),o=(0,tV.A)(),[i,s]=(0,ee.useState)(!1),l=(0,ex.d4)(e=>(0,tG.oY)(e,r)),c=(0,ex.d4)(e=>(0,tq.K)(e,r)),d=l||c||i,u=(0,ee.useRef)(null);(0,ee.useEffect)(()=>{if(!t)return;let e=Math.round(550*o),r=Math.round(700*o),a=u.current;a&&a.width===e&&a.height===r||(u.current={width:e,height:r},a&&(0,C.qL1)(t,e,r))},[t,o]),(0,ee.useEffect)(()=>{let t=e?.deref()?.document?.querySelector("body");t&&(n?t.classList.add(er.RD):t.classList.remove(er.RD))},[e,n]),(0,ee.useEffect)(()=>{let n=e?.deref();if(!n)return;let handleBlur=()=>{r&&a((0,tK.E)({windowId:r})),(0,eX.K7)(),t&&(0,C.nnC)(t,!1)},handleFocus=()=>{(0,k.uF)()&&t&&(0,C.CRO)(t,!0,"floating")};return n.addEventListener("blur",handleBlur),n.addEventListener("focus",handleFocus),()=>{n.removeEventListener("blur",handleBlur),n.removeEventListener("focus",handleFocus)}},[e,r,t,a]);let h=(0,ee.useCallback)(r=>{if(!t||!e)return;let a=e.deref();if(!a)return;let n=a.document.querySelector(`.${tZ().container}`);if(!n)return;let o=n.contains(r.target),i=r.target,s=i?.closest?.(".c-popover, .c-popover__content")!==null;o||d||s?(0,C.nnC)(t,!1):(0,C.nnC)(t,!0,{forward:!0})},[t,e,d]);(0,tT.M)("mousemove",h,{element:e?.deref()?.document,isEnabled:!!e});let p=(0,ee.useCallback)(()=>{let t=e?.deref();t&&!t.closed&&t.close()},[e]);return ee.createElement("div",{className:tZ().container},ee.createElement(tD,{onClose:p}),ee.createElement(tW,{setIsPopoverOpen:s}))});tz.displayName="Operator";var tJ=r(0x235124cc7);let tH=(0,g.getGenericLogger)(),tY=new eo.Ay("command-center");async function createOperator(e){try{let t=(0,ed.ZF)(tU);t?.childWindowRef&&!t.childWindowRef.closed&&t.childWindowRef.close(),resetOperatorState();let r=await calcTopRightPosition(),a=(0,C.xhB)(),n=Math.round(550*a),o=Math.round(700*a),s=Math.round(700*a);await (0,i.Qw)(e,(0,tJ.A)({element:ee.createElement(tz,null),uniqueWindowId:tU,windowFeatures:{width:n,height:o,maxWidth:s,maxHeight:o,x:r.x,y:r.y,frame:!1,transparent:!0,skipTaskbar:!0,type:"panel",hasShadow:!1,acceptFirstMouse:!1,roundedCorners:!0,resizable:!0,title:tY.t("Slack Operator")},onCleanup:()=>{resetOperatorState(),(0,i.Qw)(e,(0,ej.lM)({windowId:tU}))}}));let l=(0,ed.ZF)(tU);return l?.childWindowTokenRef&&(eQ=l.childWindowTokenRef,await (0,C.CRO)(l.childWindowTokenRef,!0,"floating")),eY=!0,tU}catch(e){throw tH.error("createOperatorWindow","Failed to create operator window",e),e}}async function calcTopRightPosition(){let e=Math.round(550*(0,C.xhB)());try{let t=await (0,C.Bs9)(),r=t?await (0,C.hZp)(t):(await (0,C.zxd)())[0];if(r)return{x:Math.round(r.bounds.x+r.bounds.width-e-10),y:Math.round(r.bounds.y+10)};return{x:0,y:0}}catch(e){return tH.warn("calcTopRightPosition","Failed to calculate position",e),{x:0,y:0}}}createOperator.displayName="createOperator";let tQ=(0,g.getGenericLogger)(),tX=new eo.Ay("command-center");async function window_utils_createOperator(e){try{let t=(0,ed.ZF)(tU);t?.childWindowRef&&!t.childWindowRef.closed&&t.childWindowRef.close(),resetOperatorState();let r=await window_utils_calcTopRightPosition(),a=(0,C.xhB)(),n=Math.round(550*a),o=Math.round(700*a),s=Math.round(700*a);await (0,i.Qw)(e,(0,tJ.A)({element:ee.createElement(tz,null),uniqueWindowId:tU,windowFeatures:{width:n,height:o,maxWidth:s,maxHeight:o,x:r.x,y:r.y,frame:!1,transparent:!0,skipTaskbar:!0,type:"panel",hasShadow:!1,acceptFirstMouse:!1,roundedCorners:!0,resizable:!0,title:tX.t("Slack Operator")},onCleanup:()=>{resetOperatorState(),(0,i.Qw)(e,(0,ej.lM)({windowId:tU}))}}));let l=(0,ed.ZF)(tU);return l?.childWindowTokenRef&&(eQ=l.childWindowTokenRef,await (0,C.CRO)(l.childWindowTokenRef,!0,"floating")),eY=!0,tU}catch(e){throw tQ.error("createOperatorWindow","Failed to create operator window",e),e}}async function window_utils_calcTopRightPosition(){let e=Math.round(550*(0,C.xhB)());try{let t=await (0,C.Bs9)(),r=t?await (0,C.hZp)(t):(await (0,C.zxd)())[0];if(r)return{x:Math.round(r.bounds.x+r.bounds.width-e-10),y:Math.round(r.bounds.y+10)};return{x:0,y:0}}catch(e){return tQ.warn("calcTopRightPosition","Failed to calculate position",e),{x:0,y:0}}}window_utils_createOperator.displayName="createOperator";var t0=r(0xb9374f6a),t1=r(0x147d8a1cf);let t2=(0,g.getGenericLogger)(),registerCommandCenterShortcut=async()=>{try{let e=(0,o.en)(),t=e?.getState(),r=(0,n.getFocusedWorkspace)?.(t);if(!r)return;let a=(0,i.oK)(r),s=a?.getState();if(!s||!(0,t1.S)(s))return;let handler=async()=>{let e=(0,o.en)(),t=e?.getState(),r=(0,n.getFocusedWorkspace)?.(t);if(!r)return;let a=(0,i.oK)(r),s=a?.getState();if(!s||!(0,t1.S)(s))return;let l=Q.J?.location?.search??"",c=Object.fromEntries(new URLSearchParams(l)),d=c?.entry||"slackbot-mini";if("omniswitcher"===d){let e=(0,ed.ZF)(X.oW);e?.childWindowRef?e.childWindowRef.close():await createCommandCenterWindow(X.g.Floating,X.Py.Omniswitcher,r)}else"slackbot"===d?null!==eQ?await toggleOperatorVisibility():await createOperator(r):"slackbot-mini"===d&&(null!==eQ?await toggleOperatorVisibility():await window_utils_createOperator(r))};(0,C.zin)(t0.Sr.DESKTOP_COMMAND_CENTER,handler),(0,C.wzE)(t0.Sr.DESKTOP_COMMAND_CENTER,!0)}catch(e){t2.warn("Failed to register command center shortcut",e)}};var t8=r(0x9c472b09),t4=r(0xcc2cce7f),t3=r(0x1750c1ced);function reportLongTailTeamUsage(){if(!(0,t3.VA)())return;let e=(0,q.W6)("recentlyUsedTeamIds")||[];if(e?.length<=10)return;let t=e.slice(10),r=(0,t4.A)();t.forEach(e=>{let t=r[e];if(!t)return;let a=t.mostRecentlyUsedDate;if(!a)return;let n=(0,t8.A)(new Date,new Date(a));(0,B.Cy)({teamOrEnterpriseId:e}).store("least_recently_used_workspaces_last_use",n)})}var t6=r(0xe874a88a),t5=r(0x2047dec93),t7=r(0x4f6e90b4),t9=r(0x45a2e30),re=r(0x1bd185e94),rt=r(0x1354f2d83);let rr=(0,g.getGenericLogger)();function fetchMemoryStats(e){return fetchMemoryStatsV5(e)}let ra="workingSetSize";function fetchMemoryStatsV5(e){let t=(0,C.vkf)();return t?t.then(t=>{let r={},a=t.processMetrics;if(!a||0===a.length)return rr.warn("STATS",`No memory stats collected getAppMetricsV2:${a}`,{subtype:"stats_no_memory"}),r;if(navigator&&navigator.hardwareConcurrency){let t=(0,t5.A)(a,({cpu:e})=>e.percentCPUUsage*navigator.hardwareConcurrency);r[`cpu_v5_app_${e}_teams`]=(0,t9.GB)(t,2)}return a.forEach(({type:t,memory:a})=>{if(ra in a){let n=`memory_v5_app_mb_${e}_teams_${t.toLowerCase()}_process`;n in r||(r[n]=0),r[n]+=Math.round((0,re.UK)(a[ra]))}}),r[`memory_v5_app_mb_${e}_teams`]=(0,rt.mw)(a,ra),addJSHeapMetrics(r,5,e),r}).catch(e=>(rr.error("STATS",`getAppMetricsV2 failed: ${e.message}`),{})):(rr.warn("STATS","getAppMetricsV2 not available",{subtype:"stats_no_memory"}),Promise.resolve({}))}function addJSHeapMetrics(e,t,r){Q.J.performance&&Q.J.performance.memory&&(e[`heap_v${t}_used_mb_${r}_teams`]=(0,re.hZ)(Q.J.performance.memory.usedJSHeapSize),e[`heap_v${t}_total_mb_${r}_teams`]=(0,re.hZ)(Q.J.performance.memory.totalJSHeapSize))}function storeSSBMemoryStatsOnAnInterval(){if(!(0,k.y3)())return t6.S.resolve();let e=(0,B.rh)(),t=(0,v.F)(),r=t.createMetricsTrace({label:"ssb-memory-stats"});function fetchStatsAndBeacon(){let a=(0,o.Ry)(),i=(0,n.getBootedWorkspaces)(a),s=i?i.length:0;return fetchMemoryStats(s).then(a=>a?(Object.keys(a).forEach(t=>{e.store(t,a[t],{allow_negative:-1!==t.indexOf("delta")}),r.store({name:t.replace(/_\d+?_teams/,""),value:a[t]}).addTags({num_teams:s})}),t.reportTrace(r),a):null)}return setInterval(()=>fetchStatsAndBeacon(),36e5+Math.floor(6e5*Math.random())),setTimeout(()=>fetchStatsAndBeacon(),18e4),t6.S.resolve()}(0,t7.ul)("ssbMetrics",{fetchMemoryStatsV5});var rn=r(0x1c4066c5c),ro=r(0x22562bec6),ri=r(0x19efc8b50),rs=r(0x1914b45dc),rl=r(0x22480f425),rc=r(0x78b6120c),rd=r(0x21d52e266);let ru="service_worker_install";async function maybeFetchNewServiceWorker({shouldFetchNewServiceWorker:e,recommendedBuildVersion:t}){if(!e||!(0,rd.G)())return(0,h.pq)(rn.S8,"No need to install new service worker"),!1;let r=await (0,rc.G9)(),a=(0,v.F)(),n=a.createTrace({traceName:`mvp:${ru}`,tags:{recommended_build_version:t,latest_cached_build_version:r},samplingOptions:{sampleType:_.nl.ALWAYS}});return t===r?(n.startSpan(`mvp:${ru}:prevent`,{tags:{reason:"already_on_recommended_version"}}).close(),a.reportTrace(n),(0,h.pq)(rn.S8,"Preventing service worker fetch because we already have the latest cached build"),!1):(n.startSpan(`mvp:${ru}:allow`,{tags:{reason:"should_reload"}}).close(),a.reportTrace(n),(0,rc.DB)(),!0)}var rh=r(0x209e067d1),rp=r(0x7b0b485),rm=r(0xe822f938);function isClientActive(){let e=(0,o.Ry)();return!!((0,rm.OD)(e)||(0,rh.A)()&&(0,rp.Ak)(e))}var rf=r(0x12c5e193e),rg=r(0x11d0b0bd1),rw=r(0x192f113bc);function waitForHuddleToEnd(){return(0,rw.A)().waitForHuddleToEnd()}var ry=r(0x12c8f2e51);let rb=!1;function isVersionStale(e){let t=(0,ri.P2)();return!!t&&parseInt(t,10)this.checkForMinVersionBumpAndMaybeReload(),e),this.initDebugger()}async checkForMinVersionBumpAndMaybeReload(){let e=this.logger;this.lastPollTs=Date.now(),e.info("Checking to see if we should reload"),this.tracer.createAndReportSpan({name:"mvp_check"});try{let t=await this.checkForMinVersionBump({reason:"polling",shouldCheckForNewServiceWorker:!0});if(!t)return void e.info("Missing client.shouldReload response. No need to reload");let{client_min_version:r,should_reload:a,reason:n,recommended_build_version:o,build_manifest_last_modified:i,should_fetch_new_service_worker:s}=t;if(this.maybeStartTrace(r),this.maybeStartPreventReloadSpan(r),!a){e.info("No need to reload"),this.tracer.createAndReportSpan({name:"mvp_shouldreload_prevent_api",options:{tags:{reason:n}}}),this.maybeIncrementPreventReloadReason(r,n),maybeFetchNewServiceWorker({shouldFetchNewServiceWorker:s,recommendedBuildVersion:o});return}if(!(0,rf.RY)(o)){this.tracer.createAndReportSpan({name:"mvp_shouldreload_prevent_client",options:{tags:{reason:"client"}}}),this.maybeIncrementPreventReloadReason(r,"client");return}this.maybeClosePreventReloadSpan(),e.info("Time to reload! Waiting until the client is online and unfocused."),this.isSafeToReloadRightNow()?this.tracer.createAndReportSpan({name:"mvp_shouldreload_immediate"}):(this.tracer.createAndReportSpan({name:"mvp_shouldreload_will_defer"}),this.isClientOnline()||this.tracer.createAndReportSpan({name:"mvp_shouldreload_will_defer_offline"}),this.maybeStartAwaitSafeTimeToReloadSpan(),await this.awaitSafeTimeForReload(),this.maybeCloseAwaitSafeTimeToReloadSpan());let l="client.shouldReload told us to reload earlier; we are now unfocused and online";e.info(l),this.maybeCloseAndReportTrace();try{this.beforeReloadCallback()}catch(e){this.logger.error("MinVersionPoll: beforeReloadCallback failed with error",e)}(0,rg.As)({reason:l,reasonKey:"client_should_reload:min_version_poll",recommendedBuildVersion:o,buildManifestLastModified:i})}catch(t){e.error("client.shouldReload check failed",t)}}async awaitSafeTimeForReload(e=0){let t=this.logger;return this.maybeIncrementRetryAttempts(e),t6.S.all([this.awaitOnline(),this.awaitBlur()]).tap(()=>{t.info("Online and unfocused, will wait 20000ms to reload")}).delay(2e4).then(()=>this.isSafeToReloadRightNow()?(this.tracer.createAndReportSpan({name:"mvp_shouldreload_did_defer"}),!0):(t.info("Waited 20000 ms but now it is no longer safe to reload. Trying again..."),t.info(`Online: ${this.isClientOnline()}; Inactive: ${!isClientActive()||this.hasWaitedTooLongForBlur}; Retry attempts: ${e}`),this.awaitSafeTimeForReload(e+1)))}isSafeToReloadRightNow(){return this.isClientOnline()&&(!isClientActive()||this.hasWaitedTooLongForBlur)}async awaitBlur(){if(!isClientActive()||this.hasWaitedTooLongForBlur)return;let e=this.logger;this.awaitBlurPromise||(this.awaitBlurPromise=t6.S.delay(108e5).then(()=>{e.info("Waited the max 10800000ms for a blur event"),this.tracer.createAndReportSpan({name:"mvp_shouldreload_waited_too_long_for_blur"}),this.hasWaitedTooLongForBlur=!0})),this.maybeStartAwaitBlurSpan();let t=(0,o.en)(),r=t.getState(),a=[];return(0,rm.OD)(r)&&(e.info("Waiting for blur event to reload"),a.push(t.dispatch((0,ry.H)()))),(0,rh.A)()&&(0,rp.Ak)(r)&&(e.info("Waiting for huddle to end to reload"),a.push(waitForHuddleToEnd())),Promise.race([Promise.all(a),this.awaitBlurPromise]).then(()=>{this.maybeCloseAwaitBlurSpan()})}async awaitOnline(){return!!this.isClientOnline()||(this.logger.info("Waiting to come back online to reload"),this.maybeStartAwaitOnlineSpan(),(0,ro.A)("online").tap(()=>{this.maybeCloseAwaitOnlineSpan()}))}initDebugger(){(0,t7.ul)("minVersionPoll",{checkAndMaybeReloadNow:()=>this.checkForMinVersionBumpAndMaybeReload(),checkNow:()=>this.checkForMinVersionBump({reason:"slackdebug"}),getLastPollTime:()=>this.lastPollTs,timer:this.pollTimer})}maybeStartTrace(e=0){try{if(!isVersionStale(e)||this.trace)return;let t={client_min_version:e,last_poll_ts:this.lastPollTs,method:"client.shouldReload",reason:"polling",metric_version:1},r=1e3*e,a=this.getLastSocketConnection(),n=Math.max(r,a);this.rootSpan=this.tracer.createSpan({name:"mvb:stale",options:{startTime:n,tags:t},samplingOptions:{sampleType:_.nl.SESSION,sampleRate:.1}});let o=this.tracer.createSpan({name:"mvb:prev_poll_interval",options:{startTime:n,tags:t,traceId:this.rootSpan?.getTraceId(),parentSpanId:this.rootSpan?.getId()}});o.close(),this.tracer.reportSpans([o]),this.trace=this.tracer.createTrace({traceName:"mvb:check",traceId:this.rootSpan?.getTraceId(),parentSpanId:this.rootSpan?.getId(),tags:t})}catch{}}maybeStartPreventReloadSpan(e=0){try{if(!this.trace||!isVersionStale(e)||this.preventSpan)return;this.preventSpan=this.trace.startSpan("mvb:prevent")}catch{}}maybeClosePreventReloadSpan(){try{if(!this.trace||!this.preventSpan)return;this.preventSpan.close(),this.preventSpan=null}catch{}}maybeIncrementPreventReloadReason(e=0,t){try{if(!this.trace||!isVersionStale(e)||!this.preventSpan)return;let r=`reason:${t||"unknown"}`,a=this.preventSpan.getTag(r)||0;this.preventSpan.setTag(r,a+1)}catch{}}maybeStartAwaitSafeTimeToReloadSpan(){try{if(!this.trace||this.awaitSafeTimeForReloadSpan)return;this.awaitSafeTimeForReloadSpan=this.trace.startSpan("mvb:defer",{tags:{is_online:this.isClientOnline(),is_blurred:!isClientActive(),has_waited_too_long_for_blur:this.hasWaitedTooLongForBlur}})}catch{}}maybeCloseAwaitSafeTimeToReloadSpan(){try{if(!this.trace||!this.awaitSafeTimeForReloadSpan)return;this.awaitSafeTimeForReloadSpan.close(),this.awaitSafeTimeForReloadSpan=null}catch{}}maybeStartAwaitOnlineSpan(){try{if(!this.trace||this.awaitOnlineSpan)return;this.awaitOnlineSpan=this.trace.startSpan("mvb:defer:await_online",{parentSpanId:this.awaitSafeTimeForReloadSpan?.getId()}),this.maybeIncrementAwaitOnlineAttempts()}catch{}}maybeCloseAwaitOnlineSpan(){try{if(!this.trace||!this.awaitOnlineSpan)return;this.awaitOnlineSpan.close(),this.awaitOnlineSpan=null}catch{}}maybeStartAwaitBlurSpan(){try{if(!this.trace||this.awaitBlurSpan)return;this.awaitBlurSpan=this.trace.startSpan("mvb:defer:await_blur",{parentSpanId:this.awaitSafeTimeForReloadSpan?.getId()}),this.maybeIncrementAwaitBlurAttempts()}catch{}}maybeCloseAwaitBlurSpan(){try{if(!this.trace||!this.awaitBlurSpan)return;this.awaitBlurSpan.addTags({is_blurred:!isClientActive(),has_waited_too_long_for_blur:this.hasWaitedTooLongForBlur}),this.awaitBlurSpan.close(),this.awaitBlurSpan=null}catch{}}maybeIncrementRetryAttempts(e){try{if(!this.trace||!this.awaitSafeTimeForReloadSpan)return;this.awaitSafeTimeForReloadSpan.setTag("total_retry_attempts",e)}catch{}}maybeIncrementAwaitOnlineAttempts(){try{if(!this.trace||!this.awaitSafeTimeForReloadSpan)return;let e="await_online_attempts",t=this.awaitSafeTimeForReloadSpan.getTag(e)||0;this.awaitSafeTimeForReloadSpan.setTag(e,t+1)}catch{}}maybeIncrementAwaitBlurAttempts(){try{if(!this.trace||!this.awaitSafeTimeForReloadSpan)return;let e="await_blur_attempts",t=this.awaitSafeTimeForReloadSpan.getTag(e)||0;this.awaitSafeTimeForReloadSpan.setTag(e,t+1)}catch{}}maybeCloseAndReportTrace(){try{if(!this.trace||!this.trace||!this.rootSpan)return;this.rootSpan?.close(),this.tracer.reportTrace(this.trace),this.tracer.reportSpans([this.rootSpan]),this.trace=null,this.rootSpan=null}catch{}}testOnlyReset(){if(!(0,rl.A)()&&!(0,rs.A)())throw Error("MinVersionPoll.reset should only be called in test files!");clearInterval(this.pollTimer),this.pollTimer=null,this.awaitBlurPromise&&(this.awaitBlurPromise.cancel(),this.awaitBlurPromise=null),this.lastPollTs=null,this.hasWaitedTooLongForBlur=!1}};Object.defineProperty({forceStartMinVersionPollInTests:rb},"forceStartMinVersionPollInTests",{get:()=>rb,set:e=>{rb=e}});var rS=r(0x7adbadbb),rv=r(0x17a41206b);let r_=new eo.Ay("min-version-poll"),rk=!1;function registerMinVersionPoll(){if(rk)return void(0,h.pq)("MinVersionPoll can\u2019t be started more than once!");let e=(0,o.en)();new MinVersionPoll({isClientOnline:()=>!!(0,rv.Pb)(e.getState()),checkForMinVersionBump:rn.aT,getLastSocketConnection:()=>(0,rv.cf)(e.getState())??0,beforeReloadCallback:()=>{notifyAboutReloadAccessibly()}}).start(),rk=!0,(0,B.rh)().count("mvp_start_2")}function notifyAboutReloadAccessibly(){if(!(0,rh.A)())return;let e=(0,o.en)(),t=(0,n.getFocusedWorkspace)(e.getState());(0,i.oK)(t).dispatch((0,rS.rl)({message:r_.t("Reloading Slack\u2026"),assertive:!0}))}var rC=r(0xa69aaeeb);function setUpSquirrelMacDirectContentsWrite(){if(!(0,k.y3)()||!(0,k.cX)())return;let e=(0,rC._)("squirrel_mac_direct_contents_write","on");C.Ez7.isAvailable()?((0,h.pq)("BOOT",`Setting Squirrel Mac Direct Contents Write = ${e?"enabled":"disabled"}`),(0,C.Ez7)(e)):(0,h.pq)("BOOT","setSquirrelMacDirectContentsWriteEnabled not available")}var rx=r(0xcc110d9),rT=r(0x8c8bafa3);function setUpSSBInstanceCookie(){(0,C.g9M)()&&(0,rx.n0)("ssb_instance_id",(0,C.sST)(),3650,`.${(0,rT.qF)()}`)}function describeClasses(e){let t="";for(let r=0;r ${t}`;return t}function enrichCoepReports(){if(!("ReportingObserver"in window))return;let e=(0,p.Cu)()?`https://${(0,rT.Sw)()}/events/report`:`https://${(0,rT.c5)()}/events/report`;try{new window.ReportingObserver(t=>{let r=[];for(let e of t)if("coep"===e.type&&e.body){let t=e.body.toJSON(),{blockedURL:a,destination:n}=t;if("image"===n&&a){let n=document.querySelector(`img[src=${CSS.escape(a)}]`);if(n){t.html=n.outerHTML;try{t.domLocation=describeDomLocation(n)}catch(e){t.domLocationError=(0,T.u1)(e)}r.push({type:"coep-enriched",url:e.url,body:t})}}}r.length&&fetch(e,{method:"POST",body:JSON.stringify(r)})},{buffered:!0}).observe()}catch(e){(0,h.R8)("BOOT","Error creating ReportingObserver",e)}}var rA=r(0x9f4ba4e7),rR=r(0xe180a236),rE=r(0x178533105),rO=r(0x1130a8ca8),rM=r(0xe684f705),rI=r(0x2365edf4c);function storeReduxStoreStatsOnAnInterval(){let e="store_metrics_v3";function fetchStatsAndBeacon(){let t=(0,o.Ry)(),r=(0,n.getBootedWorkspaces)(t);r&&r.forEach(t=>{let r=(0,i.$D)(t);if(!r)return;let a=(0,c.E)({state:r}),n=a.createMetricsTrace({label:e}),o=n.startSpan(`${e}:size_compute_time`),s=(0,rR.A)(r.files);n.store({name:`${e}:files:count`,value:s});let l=(0,rR.A)((0,rO.xH)((0,rM.Zo)(r)));n.store({name:`${e}:members:count`,value:l});let d=(0,rR.A)((0,rO.xH)(r.channels));n.store({name:`${e}:channels:count`,value:d});let u=(0,rE.A)((0,rO.xH)((0,rI.e)(r)),(e,t)=>e+(0,rR.A)((0,rO.xH)(t)),0);n.store({name:`${e}:messages:count`,value:u}),n.store({name:`${e}:total:count`,value:s+l+d+u}),o.close(),a.reportTrace(n)})}setInterval(()=>fetchStatsAndBeacon(),36e5+Math.floor(6e5*Math.random()))}function register(e){e.hooks.bootComplete.tap("Begin min version polling",async({contextualInfo:e})=>(registerMinVersionPoll(),{contextualInfo:e})),e.hooks.bootComplete.tap("Prepare to record SSB memory usage stats on an interval",async({contextualInfo:e})=>(storeSSBMemoryStatsOnAnInterval(),{contextualInfo:e})),e.hooks.bootComplete.tap("Prepare to record Redux store size stats on an interval",async({contextualInfo:e})=>(storeReduxStoreStatsOnAnInterval(),{contextualInfo:e})),e.hooks.bootComplete.tap("Update accessibility preferences",async({contextualInfo:e})=>(updateA11yPreferences(),{contextualInfo:e})),e.hooks.bootComplete.tap("Set clogging interval",async({contextualInfo:e})=>(updateCloggingInterval(),{contextualInfo:e})),e.hooks.bootComplete.tap("Clogs if the users client does not have push notifications enabled",async({contextualInfo:e})=>(maybeClogNotificationPermission(),{contextualInfo:e})),e.hooks.bootComplete.tap("Set-up a cookie with the SSB instance ID to send along with API requests",async({contextualInfo:e})=>(setUpSSBInstanceCookie(),{contextualInfo:e})),e.hooks.bootComplete.tap("Register the service worker",async({contextualInfo:e})=>((0,k.pc)()?(0,rc.Lz)():(0,h.pq)("BOOT","Service Worker unavailable; Skipping registration."),{contextualInfo:e})),e.hooks.bootComplete.tap("Clear unwanted params from URL",async({contextualInfo:e})=>(clearReloadURLState(),{contextualInfo:e})),e.hooks.bootComplete.tap("Clean up old persisted data for expired teams",async({contextualInfo:e})=>(await cleanUpOldPersistedData(),{contextualInfo:e})),e.hooks.bootComplete.tap("Persist data for all booted teams",async({contextualInfo:e})=>(persistNewData(),{contextualInfo:e})),e.hooks.bootComplete.tap("Enable the direct-contents-write feature of Squirrel.Mac on Mac SSB",async({contextualInfo:e})=>(setUpSquirrelMacDirectContentsWrite(),{contextualInfo:e})),e.hooks.bootComplete.tap("Collect data on how long it's been since people have used their least active teams",async({contextualInfo:e})=>(reportLongTailTeamUsage(),{contextualInfo:e})),e.hooks.bootComplete.tap("Mark the client boot as complete",async({contextualInfo:e})=>(markBootComplete(),{contextualInfo:e})),e.hooks.bootComplete.tap("(Desktop only) Signal to desktop that all teams have booted",async({contextualInfo:e})=>(maybeSignalBootedToDesktop(),{contextualInfo:e})),e.hooks.bootComplete.tap("(Desktop only) Register command center keyboard shortcut",async({contextualInfo:e})=>(registerCommandCenterShortcut(),{contextualInfo:e})),e.hooks.bootComplete.tap("Preload quip assets",async({contextualInfo:e})=>(initPreloadQuip(),{contextualInfo:e})),e.hooks.bootComplete.tap("Maybe show Day 1 creator welcome modal",async({contextualInfo:e})=>(maybeShowDay1CreatorWelcomeModalAtBoot(),{contextualInfo:e})),e.hooks.bootComplete.tap("Collect client metrics on an interval",async({contextualInfo:e})=>(reportClientMetrics(),{contextualInfo:e})),e.hooks.bootComplete.tap("Record a count of booted teams",async({contextualInfo:e})=>(beaconWorkspacesCount(),{contextualInfo:e})),e.hooks.bootComplete.tap("Install a ReportingObserver to enrich COEP reports",async({contextualInfo:e})=>(enrichCoepReports(),{contextualInfo:e})),e.hooks.bootComplete.tap("Report dogfood metrics",async({contextualInfo:e})=>(setupDesktopDogfoodMetricReporter(),{contextualInfo:e})),e.hooks.bootComplete.tap("Collect PerformanceResourceTiming data",async({contextualInfo:e})=>{let t=await e.isBootingWarm;return(0,rA.U)(e.getTraceMeta().getTracer(),{bootType:t?"warm":"cold"}),{contextualInfo:e}}),e.hooks.bootComplete.tap("Maybe sync workspace switcher icons if out of sync",async({contextualInfo:e})=>(maybeSyncWorkspaceIcons(),{contextualInfo:e}))}}}]); //# sourceMappingURL=https://slack.com/source-maps/bv1-13/gantry-v2-async-client-boot-deferred.1a797c8ce43d4e765a5f.min.js.mapØA —Eoúô