@rubytech/create-realagent-code 0.1.611 → 0.1.613

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +22 -10
  3. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +9 -0
  4. package/payload/platform/plugins/docs/references/telegram-guide.md +21 -9
  5. package/payload/server/public/assets/{AdminLoginScreens-Bjsr45ed.js → AdminLoginScreens-BiHOXO0Y.js} +1 -1
  6. package/payload/server/public/assets/AdminLoginScreens-BiHOXO0Y.js.br +0 -0
  7. package/payload/server/public/assets/AdminLoginScreens-BiHOXO0Y.js.gz +0 -0
  8. package/payload/server/public/assets/{admin-B2IkUoSc.js → admin-Bs6cPAbz.js} +1 -1
  9. package/payload/server/public/assets/admin-Bs6cPAbz.js.br +0 -0
  10. package/payload/server/public/assets/admin-Bs6cPAbz.js.gz +0 -0
  11. package/payload/server/public/assets/chat-UvZFrM0K.js +1 -0
  12. package/payload/server/public/assets/chat-UvZFrM0K.js.br +3 -0
  13. package/payload/server/public/assets/chat-UvZFrM0K.js.gz +0 -0
  14. package/payload/server/public/assets/data-BBEjTZO8.js +1 -0
  15. package/payload/server/public/assets/data-BBEjTZO8.js.br +1 -0
  16. package/payload/server/public/assets/data-BBEjTZO8.js.gz +0 -0
  17. package/payload/server/public/assets/{operator-CO5ma-ky.js → operator-DxwbldCs.js} +1 -1
  18. package/payload/server/public/assets/operator-DxwbldCs.js.br +0 -0
  19. package/payload/server/public/assets/operator-DxwbldCs.js.gz +0 -0
  20. package/payload/server/public/assets/{page-CdRrpkky.js → page-BF6bGLX_.js} +1 -1
  21. package/payload/server/public/assets/page-BF6bGLX_.js.br +0 -0
  22. package/payload/server/public/assets/page-BF6bGLX_.js.gz +0 -0
  23. package/payload/server/public/assets/{page-BBRWbFzG.js → page-Bkl56P8R.js} +1 -1
  24. package/payload/server/public/assets/page-Bkl56P8R.js.br +0 -0
  25. package/payload/server/public/assets/page-Bkl56P8R.js.gz +0 -0
  26. package/payload/server/public/assets/{public-2mLo4k7L.js → public-D6YxlJcZ.js} +1 -1
  27. package/payload/server/public/assets/public-D6YxlJcZ.js.br +0 -0
  28. package/payload/server/public/assets/public-D6YxlJcZ.js.gz +0 -0
  29. package/payload/server/public/assets/useVoiceRecorder-Cvu4TePf.js +2 -0
  30. package/payload/server/public/assets/useVoiceRecorder-Cvu4TePf.js.br +0 -0
  31. package/payload/server/public/assets/useVoiceRecorder-Cvu4TePf.js.gz +0 -0
  32. package/payload/server/public/chat.html +3 -3
  33. package/payload/server/public/data.html +3 -3
  34. package/payload/server/public/index.html +4 -4
  35. package/payload/server/public/operator.html +4 -4
  36. package/payload/server/public/public.html +3 -3
  37. package/payload/server/server.js +141 -104
  38. package/payload/server/public/assets/AdminLoginScreens-Bjsr45ed.js.br +0 -0
  39. package/payload/server/public/assets/AdminLoginScreens-Bjsr45ed.js.gz +0 -0
  40. package/payload/server/public/assets/admin-B2IkUoSc.js.br +0 -0
  41. package/payload/server/public/assets/admin-B2IkUoSc.js.gz +0 -0
  42. package/payload/server/public/assets/chat-fP4sE4pU.js +0 -1
  43. package/payload/server/public/assets/chat-fP4sE4pU.js.br +0 -2
  44. package/payload/server/public/assets/chat-fP4sE4pU.js.gz +0 -0
  45. package/payload/server/public/assets/data-DKz9_73S.js +0 -1
  46. package/payload/server/public/assets/data-DKz9_73S.js.br +0 -1
  47. package/payload/server/public/assets/data-DKz9_73S.js.gz +0 -0
  48. package/payload/server/public/assets/operator-CO5ma-ky.js.br +0 -0
  49. package/payload/server/public/assets/operator-CO5ma-ky.js.gz +0 -0
  50. package/payload/server/public/assets/page-BBRWbFzG.js.br +0 -0
  51. package/payload/server/public/assets/page-BBRWbFzG.js.gz +0 -0
  52. package/payload/server/public/assets/page-CdRrpkky.js.br +0 -0
  53. package/payload/server/public/assets/page-CdRrpkky.js.gz +0 -0
  54. package/payload/server/public/assets/public-2mLo4k7L.js.br +0 -0
  55. package/payload/server/public/assets/public-2mLo4k7L.js.gz +0 -0
  56. package/payload/server/public/assets/useVoiceRecorder-D7_wLtrS.js +0 -2
  57. package/payload/server/public/assets/useVoiceRecorder-D7_wLtrS.js.br +0 -0
  58. package/payload/server/public/assets/useVoiceRecorder-D7_wLtrS.js.gz +0 -0
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-render-B5af7vu1.js","assets/preload-helper-eAV8hweq.js"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./chunk-BycB0eMI.js";import{i as t,t as n}from"./jsx-runtime-BY35JYDT.js";import{C as r,E as i,G as a,I as o,Q as s,X as c,_ as l,a as u,d,k as f,l as p,o as m,rt as h,s as g,u as _}from"./useMediaQuery-e4ciNiuO.js";import{n as v,t as y}from"./copy-Dnw0TkVh.js";import{t as b}from"./play-eeQX0FtC.js";import{t as x}from"./preload-helper-eAV8hweq.js";var S=`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.oasis.opendocument.text,text/rtf,application/rtf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/vnd.oasis.opendocument.spreadsheet,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-powerpoint,application/vnd.oasis.opendocument.presentation,audio/ogg,audio/opus,audio/mp4,audio/x-m4a,audio/mpeg,audio/webm,audio/wav,video/mp4,.docx,.odt,.rtf,.xlsx,.xls,.ods,.pptx,.ppt,.odp,.opus,.ogg,.m4a,.mp4,.mp3,.wav,.webm`,C=new Set(S.split(`,`).filter(e=>!e.startsWith(`.`))),w=50*1024*1024;function T(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var E=h(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),D=h(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),O=h(`mic`,[[`path`,{d:`M12 19v3`,key:`npa21l`}],[`path`,{d:`M19 10v2a7 7 0 0 1-14 0v-2`,key:`1vc78b`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`13`,rx:`3`,key:`s6n7sd`}]]),k=h(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),A=h(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),j=h(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),M=h(`user`,[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`,key:`975kel`}],[`circle`,{cx:`12`,cy:`7`,r:`4`,key:`17ys0d`}]]),N=e(t(),1),P=n(),F=200;function ee({children:e,tail:t=null,repinSignals:n,onReachTop:r,prependToken:i=0}){let a=(0,N.useRef)(null),o=(0,N.useRef)(null),s=(0,N.useRef)(!0),[c,l]=(0,N.useState)(!0),u=(0,N.useRef)(0),d=(0,N.useRef)(0),f=(0,N.useRef)(!1),p=(0,N.useRef)(r);p.current=r;let m=()=>{let e=a.current;if(!e)return;let t=e.clientHeight,n=e.scrollHeight,r=t!==u.current||n!==d.current;if(u.current=t,d.current=n,r){s.current&&(e.scrollTop=e.scrollHeight);return}let i=n-e.scrollTop-t<=32;s.current=i,l(e=>e===i?e:i);let o=e.scrollTop<=F;o&&!f.current&&p.current?.(),f.current=o},h=()=>{let e=a.current;e&&(e.scrollTop=e.scrollHeight,d.current=e.scrollHeight,u.current=e.clientHeight,s.current=!0,l(!0))},g=t!=null;return(0,N.useLayoutEffect)(()=>{let e=a.current;if(!e||i===0)return;let t=e.scrollHeight-d.current;t>0&&(e.scrollTop+=t),d.current=e.scrollHeight},[i]),(0,N.useLayoutEffect)(()=>{let e=a.current;e&&s.current&&(e.scrollTop=e.scrollHeight),e&&(d.current=e.scrollHeight,u.current=e.clientHeight)},[...n,g]),(0,N.useLayoutEffect)(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>m());return a.current&&e.observe(a.current),o.current&&e.observe(o.current),()=>e.disconnect()},[]),(0,P.jsxs)(`div`,{className:`wa-reader`,children:[(0,P.jsx)(`div`,{className:`wa-reader-thread`,ref:a,onScroll:m,children:(0,P.jsxs)(`div`,{className:`wa-thread-scroll`,ref:o,children:[e,t]})}),!c&&(0,P.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:h,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var I={auth_expired:`Your session has expired. Please sign in again.`,claude_down:`Claude is currently experiencing an outage. Please try again in a few minutes.`,claude_overloaded:`Claude is overloaded right now. Please try again shortly.`,model_unavailable:`The selected model is currently unavailable. Switch to a different model from the model picker to continue.`,agent_error:`Something went wrong. Please try again.`},te={auth_expired:`I'm not available right now. Please try again later.`,claude_down:`I'm not available right now. Please try again later.`,claude_overloaded:`I'm not available right now. Please try again shortly.`,model_unavailable:`I'm not available right now. Please try again later.`,agent_error:`I'm not available right now. Please try again later.`};function L(e,t=`admin`){return t===`public`?te[e]:I[e]}var R=new Set([`mcp__telegram__telegram-card`,`mcp__plugin_telegram_telegram__telegram-card`]),ne=new Set([`mcp__telegram__telegram-media-send`,`mcp__plugin_telegram_telegram__telegram-media-send`]),re=new Set([`mcp__telegram__telegram-ask`,`mcp__plugin_telegram_telegram__telegram-ask`]),ie=new Set([`mcp__telegram__telegram-api`,`mcp__plugin_telegram_telegram__telegram-api`]);new Set([...R,...ne,...re,...ie]);function ae(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var oe=56,se=5;function ce(e,t){let n=Math.max(1,Math.floor(e.length/t)),r=[],i=0;for(let a=0;a<t;a++){let t=a*n,o=0,s=0;for(let r=t;r<t+n&&r<e.length;r++)o+=e[r]*e[r],s++;let c=s>0?Math.sqrt(o/s):0;r.push(c),c>i&&(i=c)}return i>0?r.map(e=>e/i):r}function le({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let i=(0,N.useRef)(null),a=(0,N.useRef)(null),o=(0,N.useRef)(!1),[s,c]=(0,N.useState)([]),[l,u]=(0,N.useState)(void 0),[f,p]=(0,N.useState)(!1),[m,h]=(0,N.useState)(0),[g,_]=(0,N.useState)(0);(0,N.useEffect)(()=>{let t=!1,r=null,i=window.AudioContext??window.webkitAudioContext,a=()=>{t||o.current||(o.current=!0,n())};if(!i){a();return}let s=new i;return(async()=>{try{let n=await fetch(e);if(!n.ok)throw Error(`audio fetch ${n.status}`);let i=await n.blob();if(t)return;r=URL.createObjectURL(i),u(r);let a=await s.decodeAudioData(await i.arrayBuffer());if(t)return;c(ce(a.getChannelData(0),oe)),Number.isFinite(a.duration)&&a.duration>0&&_(a.duration)}catch{a()}finally{try{s.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let v=()=>{let e=i.current;e&&(f?e.pause():Promise.resolve(e.play()).catch(()=>{}))},y=e=>{let t=i.current;if(!t||!(g>0))return;let n=Math.min(g,Math.max(0,e));t.currentTime=n,h(n)},x=e=>{let t=a.current;if(!t||!(g>0))return;let n=t.getBoundingClientRect();y(Math.min(1,Math.max(0,(e-n.left)/n.width))*g)},S=e=>{x(e.clientX);let t=e=>x(e.clientX),n=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},C=e=>{if(!(g>0))return;let t=i.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:y(t+se),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:y(t-se),e.preventDefault();break;case`Home`:y(0),e.preventDefault();break;case`End`:y(g),e.preventDefault();break;default:break}},w=g>0?Math.min(1,m/g):0,T=Math.round(w*oe),E=d(m>0?m:g);return(0,P.jsxs)(`div`,{className:`voice-note`,children:[(0,P.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${f?`Pause`:`Play`} ${t}`,onClick:v,children:f?(0,P.jsx)(A,{size:16,"aria-hidden":!0}):(0,P.jsx)(b,{size:16,"aria-hidden":!0})}),(0,P.jsx)(`div`,{ref:a,className:`voice-note-bars`,role:`slider`,tabIndex:0,"aria-label":`Seek ${t}`,"aria-valuemin":0,"aria-valuemax":Math.round(g),"aria-valuenow":Math.round(m),onMouseDown:S,onKeyDown:C,children:(s.length?s:Array.from({length:oe},()=>0)).map((e,t)=>(0,P.jsx)(`span`,{className:`voice-note-bar${t<T?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,P.jsx)(`span`,{className:`voice-note-time`,children:E}),(0,P.jsx)(`audio`,{ref:i,className:`voice-note-audio`,preload:`metadata`,src:l,"aria-label":t,onPlay:()=>p(!0),onPause:()=>p(!1),onEnded:()=>p(!1),onError:()=>r?.(),onLoadedMetadata:e=>{let t=e.currentTarget.duration;Number.isFinite(t)&&t>0&&_(t)},onTimeUpdate:e=>h(e.currentTarget.currentTime)})]})}var ue=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,de=/\.pdf$/i;function fe(e,t){return(t?t.startsWith(`image/`):ue.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:de.test(e))?`pdf`:`file`}function pe(e,t,n,r){let i=encodeURIComponent(e.path),a=encodeURIComponent(n),o=r?`&disposition=${r}`:``;return e.root===`scratchpad`?`/api/admin/files/download?path=${i}&root=scratchpad&sessionId=${encodeURIComponent(t)}&session_key=${a}${o}`:`/api/admin/files/download?path=${i}&root=data&session_key=${a}${o}`}function z(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function me(e,t,n){return`/api/admin/session-upload?session_key=${encodeURIComponent(n)}&session_id=${encodeURIComponent(e)}&file=${encodeURIComponent(t)}`}function he(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t<10?t.toFixed(1):Math.round(t)} KB`;let n=t/1024;return`${n<10?n.toFixed(1):Math.round(n)} MB`}function B({href:e,filename:t,label:n}){return(0,P.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,P.jsx)(k,{size:14,"aria-hidden":!0}),n]})}function ge({href:e,filename:t,className:n,size:r=14,onClick:i}){return(0,P.jsx)(`a`,{className:n,href:e,download:t,"aria-label":`Download ${t}`,onClick:i,children:(0,P.jsx)(c,{size:r,"aria-hidden":!0})})}function _e({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1),l=n==null?t:`${t} · ${he(n)}`;return s?(0,P.jsx)(B,{href:e,filename:t,label:l}):(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,P.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,P.jsx)(ge,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,P.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,P.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var ve=280,ye=360,be=16;function xe({src:e,filename:t,sizeBytes:n,onFail:r}){let[i,o]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1),l=(0,N.useRef)(null),u=n==null?t:`${t} · ${he(n)}`;return(0,N.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await x(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-B5af7vu1.js`);return{loadPdf:e,renderPageToFit:t}},__vite__mapDeps([0,1])),a=await r(e);n=a;let o=l.current;if(t||!o)return;await i(a,1,o,ve,ye)}catch{t||(c(!0),r?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),s?(0,P.jsx)(B,{href:e,filename:t,label:u}):(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,P.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":t}),(0,P.jsx)(ge,{href:e,filename:t,className:`chat-attachment-download`}),(0,P.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${t}`,onClick:()=>o(!0),children:(0,P.jsx)(a,{size:14,"aria-hidden":!0})})]}),i&&(0,P.jsx)(Se,{src:e,filename:t,label:u,onClose:()=>o(!1),onFail:r})]})}function Se({src:e,filename:t,label:n,onClose:r,onFail:i}){let a=(0,N.useRef)(null),s=(0,N.useRef)(null),[c,l]=(0,N.useState)(null),[u,d]=(0,N.useState)(!1);return(0,N.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await x(async()=>{let{loadPdf:e}=await import(`./pdf-render-B5af7vu1.js`);return{loadPdf:e}},__vite__mapDeps([0,1])),r=await n(e);if(t){try{r.destroy()}catch{}return}s.current=r,l(r.numPages)}catch{t||(d(!0),i?.(`render`))}})(),()=>{t=!0;try{s.current?.destroy()}catch{}}},[e]),(0,N.useEffect)(()=>{if(c==null)return;let e=a.current,t=s.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await x(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-B5af7vu1.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-be*2,1);for(let e=0;e<i.length;e++){if(n)return;await r(t,e+1,i[e],a)}}catch{n||(d(!0),i?.(`render`))}})(),()=>{n=!0}},[c]),(0,P.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,P.jsx)(`div`,{ref:a,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,P.jsx)(B,{href:e,filename:t,label:n}):Array.from({length:c??0},(e,n)=>(0,P.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,P.jsx)(ge,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,P.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,P.jsx)(o,{size:20,"aria-hidden":!0})})]})}function Ce({src:e,filename:t,onFail:n}){let[r,i]=(0,N.useState)(!1);return r?(0,P.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,P.jsx)(le,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function V({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=fe(e,n);(0,N.useEffect)(()=>{a?.onRender?.({kind:o,mime:n,served:!!t})},[]);let s=a?.onFail?e=>a.onFail({kind:o===`pdf`?`pdf`:o===`audio`?`audio`:`image`,mime:n,reason:e}):void 0;if(o===`image`&&t)return(0,P.jsx)(_e,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,P.jsx)(Ce,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,P.jsx)(xe,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${he(r)}`;return t?(0,P.jsx)(B,{href:t,filename:e,label:c}):(0,P.jsxs)(`p`,{className:`chat-doc`,children:[(0,P.jsx)(k,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}var we=1,Te=8;function Ee(e){let t=parseFloat(e.lineHeight);return Number.isFinite(t)&&t>0?t:0}function De(e){let t=parseFloat(e.getPropertyValue(`--clamp-rows`));return Number.isFinite(t)&&t>0?t:Te}function Oe(e,t){let n=Ee(t);return n===0?e.scrollHeight-e.clientHeight>we:e.scrollHeight>De(t)*n+we}var ke=(0,N.createContext)(null),Ae=(0,N.createContext)(null);function je({children:e}){let[t,n]=(0,N.useState)(null);return(0,P.jsx)(ke.Provider,{value:n,children:(0,P.jsx)(Ae.Provider,{value:t,children:e})})}function Me({expanded:e,bodyId:t,onToggle:n,className:r}){return(0,P.jsxs)(`button`,{type:`button`,className:r,"aria-expanded":e,"aria-controls":t,onClick:n,children:[e?`Show less`:`Show more…`,e?(0,P.jsx)(v,{size:13,"aria-hidden":!0}):(0,P.jsx)(s,{size:13,"aria-hidden":!0})]})}function Ne(){let e=(0,N.useContext)(Ae);return!e||!e.over?null:(0,P.jsx)(Me,{...e,className:`msg-clamp-toggle msg-clamp-toggle--foot`})}function H({identity:e,surface:t,forceExpanded:n,children:r}){let i=(0,N.useRef)(null),[a,o]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1);(0,N.useLayoutEffect)(()=>{o(!!n)},[e,n]);let l=(0,N.useCallback)(()=>{let e=i.current;e&&c(Oe(e,getComputedStyle(e)))},[]);(0,N.useLayoutEffect)(()=>{l();let e=i.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>l());return t.observe(e),()=>t.disconnect()},[l,e]);let u=(0,N.useCallback)(()=>{let n=i.current,r=n?.closest(`.wa-reader-thread`),s=r?.scrollTop??0,c=n?Ee(getComputedStyle(n)):0,l=n&&c>0?Math.round(n.scrollHeight/c):0,u=a?`collapsed`:`expanded`;o(!a),g(u),requestAnimationFrame(()=>{let n=r?.scrollTop??0;m({id:e,surface:t,to:u,rows:l,scrollDelta:Math.round(n-s)})})},[a,e,t]),d=a?`expanded`:s?`clamped`:`fits`,f=`msg-clamp-${e}`,p=(0,N.useContext)(ke);return(0,N.useEffect)(()=>{if(p)return p({over:s,expanded:a,bodyId:f,onToggle:u}),()=>p(null)},[p,s,a,f,u]),(0,P.jsxs)(`div`,{className:`msg-clamp`,"data-clamp-surface":t,"data-clamp-state":d,children:[(0,P.jsx)(`div`,{id:f,ref:i,className:a?`msg-clamp-body`:`msg-clamp-body is-clamped`,children:r}),s&&!p&&(0,P.jsx)(Me,{over:s,expanded:a,bodyId:f,onToggle:u,className:`msg-clamp-toggle`})]})}function U(e,t){return(e+180)/360*2**t}function W(e,t){return(1-Math.asinh(Math.tan(e*Math.PI/180))/Math.PI)/2*2**t}function Pe(e,t,n){return`https://tile.openstreetmap.org/${e}/${t}/${n}.png`}function Fe(e,t,n){let r=2**n,i=Math.round(e)-1,a=(i%r+r)%r,o=Math.min(Math.max(Math.round(t)-1,0),r-2);return{tiles:[{x:a,y:o},{x:(a+1)%r,y:o},{x:a,y:o+1},{x:(a+1)%r,y:o+1}].map(e=>({...e,url:Pe(n,e.x,e.y)})),offsetX:e*256-i*256,offsetY:t*256-o*256}}function Ie(e,t,n=16){return Fe(U(t,n),W(e,n),n)}function Le(e,t,n,r,i){let a=2**n,o=Math.min(Math.ceil(r/256)+1,a),s=Math.min(Math.ceil(i/256)+1,a),c=Math.round(e-o/2),l=Math.min(Math.max(Math.round(t-s/2),0),Math.max(a-s,0)),u=[];for(let e=0;e<s;e++)for(let t=0;t<o;t++){let r=((c+t)%a+a)%a,i=l+e;i<0||i>=a||u.push({x:r,y:i,url:Pe(n,r,i)})}return{tiles:u,cols:o,rows:s,offsetX:(e-c)*256,offsetY:(t-l)*256}}function Re(e){let t=[];for(let n of e){let e=t[t.length-1],r=e===void 0?0:Math.round((e-n)/360);t.push(r===0?n:n+r*360)}return t}function ze(e,t,n){let r=Re(e.map(e=>e.lon)),i=1;for(let a=16;a>=1;a--){let o=r.map(e=>U(e,a)*256),s=e.map(e=>W(e.lat,a)*256);if(Math.max(...o)-Math.min(...o)<=t&&Math.max(...s)-Math.min(...s)<=n){i=a;break}}let a=r.map(e=>U(e,i)),o=e.map(e=>W(e.lat,i)),s=(Math.min(...a)+Math.max(...a))/2,c=(Math.min(...o)+Math.max(...o))/2,l=Fe(s,c,i);return{zoom:i,...l,cxf:s,cyf:c,points:a.map((e,t)=>({x:l.offsetX+(e-s)*256,y:l.offsetY+(o[t]-c)*256}))}}function Be(e){return ze(e,240,160)}function Ve(e,t,n){let r=2**e.zoom,i=((e.cxf-t/256)%r+r)%r,a=Math.min(Math.max(e.cyf-n/256,0),r);return{...e,cxf:i,cyf:a}}function G(e,t,n,r){let i=Math.min(Math.max(e.zoom+t,1),19);if(i===e.zoom)return e;let a=2**(i-e.zoom),o=2**i;return{cxf:(((e.cxf+n/256)*a-n/256)%o+o)%o,cyf:Math.min(Math.max((e.cyf+r/256)*a-r/256,0),o),zoom:i}}var K=0,He=0,Ue=0,We=0,Ge=0,Ke=0,qe=0,Je=0,q=0,Ye=``,Xe=0;function Ze(){return{modalsLive:K,opens:He,tileRequests:We,tileErrors:Ge,gestures:Ke,viewChanges:qe,points:Je,zoomMax:q,mapKey:Ye,ageMs:Xe===0?0:Date.now()-Xe}}function Qe(e,t){let n=e.tileErrors>0?`tiles`:e.zoomMax>19?`zoom`:e.tileRequests>500?`budget`:e.gestures>0&&e.viewChanges===0?`inert`:e.modalsLive>0&&t>e.points?`stale`:null;return n?`[operator-ui] op=map-modal-alarm reason=${n} mapKey=${e.mapKey} zoom=${e.zoomMax} tiles=${e.tileRequests} tileErrors=${e.tileErrors} gestures=${e.gestures} viewChanges=${e.viewChanges} modalPoints=${e.points} transcriptPoints=${t} ageMs=${e.ageMs}`:null}function $e(e,t){return t.get(e.replace(/:\d+$/,``))??0}function et(e){let t=Qe(Ze(),e);t&&console.warn(t)}function tt({points:e,msgKeyId:t,formatTime:n,onClose:i}){let{zone:a}=r(),o=(0,N.useRef)(null),s=(0,N.useRef)(null),[c,l]=(0,N.useState)(null),[u,d]=(0,N.useState)(null),[f,p]=(0,N.useState)(null),[m]=(0,N.useState)(()=>++Ue),h=c?.w??640,g=c?.h??480,_=e.length,v=e[_-1],y=f?.zoom??u??ze(e,h,g).zoom,b=f===null,x=f??{cxf:U(v.lon,y),cyf:W(v.lat,y),zoom:y},S=(0,N.useRef)(x);S.current=x;let C=Le(x.cxf,x.cyf,x.zoom,h,g),w=e.map(e=>({x:C.offsetX+(U(e.lon,x.zoom)-x.cxf)*256,y:C.offsetY+(W(e.lat,x.zoom)-x.cyf)*256}));(0,N.useLayoutEffect)(()=>{let e=o.current;if(!e)return;let t=()=>l({w:e.clientWidth||640,h:e.clientHeight||480});return t(),window.addEventListener(`resize`,t),()=>window.removeEventListener(`resize`,t)},[]),(0,N.useLayoutEffect)(()=>{c&&u===null&&d(ze(e,c.w,c.h).zoom)},[c,u,e]);let T=(0,N.useRef)(new Set),E=(0,N.useRef)(e.length);E.current=e.length;let D=()=>{let e=window.setTimeout(()=>{T.current.delete(e),et(E.current)},250);T.current.add(e)};(0,N.useEffect)(()=>{let e=T.current;return()=>{for(let t of e)window.clearTimeout(t);e.clear()}},[]),(0,N.useEffect)(()=>(He+=1,K+=1,We=0,Ke=0,qe=0,q=0,Ye=`${t??`nokey`}:${m}`,()=>{--K,Je=0}),[t,m]),(0,N.useEffect)(()=>{let e=s.current?.getAttribute(`points`)??``;Je=e===``?_===1?1:0:e.trim().split(/\s+/).length,Xe=v.ts?new Date(v.ts).getTime():0}),(0,N.useEffect)(()=>{We+=C.tiles.length,q=Math.max(q,x.zoom)},[C.tiles.map(e=>e.url).join(`|`)]);let O=(0,N.useRef)(``);(0,N.useEffect)(()=>{let t=`${x.cxf}:${x.cyf}:${x.zoom}`;O.current!==``&&O.current!==t&&(qe+=1),O.current=t,et(e.length)}),(0,N.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]);let k=e=>{let t=o.current?.getBoundingClientRect();return t?{px:e.clientX-(t.left+t.width/2),py:e.clientY-(t.top+t.height/2)}:{px:0,py:0}},A=(e,t)=>{t===e||t.cxf===e.cxf&&t.cyf===e.cyf&&t.zoom===e.zoom||(Ke+=1,p(t),D())},j=(0,N.useRef)(new Map),M=(0,N.useRef)(null),F=e=>{j.current.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=e.currentTarget;if(typeof t.setPointerCapture==`function`&&t.setPointerCapture(e.pointerId),j.current.size===2){let[e,t]=[...j.current.values()];M.current=Math.hypot(e.x-t.x,e.y-t.y)}},ee=e=>{let t=j.current.get(e.pointerId);if(!t)return;if(j.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),j.current.size>=2){let[e,t]=[...j.current.values()],n=Math.hypot(e.x-t.x,e.y-t.y),r=M.current;if(!r||n===0)return;let i=k({clientX:(e.x+t.x)/2,clientY:(e.y+t.y)/2});n/r>=2?(M.current=n,A(S.current,G(S.current,1,i.px,i.py))):n/r<=.5&&(M.current=n,A(S.current,G(S.current,-1,i.px,i.py)));return}let n=e.clientX-t.x,r=e.clientY-t.y;n===0&&r===0||A(S.current,Ve(S.current,n,r))},I=e=>{j.current.delete(e.pointerId),j.current.size<2&&(M.current=null)},te=e=>{let{px:t,py:n}=k(e);A(S.current,G(S.current,1,t,n))};(0,N.useEffect)(()=>{let e=o.current;if(!e)return;let t=e=>{e.preventDefault();let{px:t,py:n}=k(e);A(S.current,G(S.current,e.deltaY<0?1:-1,t,n))};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[_]);let L=n?n(v.ts,a):``,R=v.ts?Math.max(0,Math.floor((Date.now()-new Date(v.ts).getTime())/6e4)):null,ne=R===null?``:R===0?` · just now`:` · ${R} min ago`;return(0,P.jsx)(`div`,{className:`wa-map-modal`,onClick:e=>{e.target===e.currentTarget&&i()},children:(0,P.jsxs)(`div`,{className:`wa-map-modal-panel`,role:`dialog`,"aria-modal":`true`,"aria-label":`Location map`,children:[(0,P.jsxs)(`div`,{className:`wa-map-modal-head`,children:[(0,P.jsxs)(`span`,{className:`wa-map-modal-title`,children:[L?`Latest fix ${L}`:`${v.lat},${v.lon}`,ne]}),_>1&&(0,P.jsxs)(`span`,{className:`wa-map-modal-count`,children:[_,` updates`]}),!b&&(0,P.jsx)(`button`,{type:`button`,className:`wa-map-modal-btn`,onClick:()=>p(null),children:`Follow`}),(0,P.jsx)(`button`,{type:`button`,className:`wa-map-modal-close`,"aria-label":`Close map`,onClick:i,children:`×`})]}),(0,P.jsx)(`div`,{className:`wa-map-modal-area`,ref:o,onPointerDown:F,onPointerMove:ee,onPointerUp:I,onPointerCancel:I,onDoubleClick:te,children:(0,P.jsxs)(`div`,{className:`wa-map-modal-block`,style:{left:`calc(50% - ${C.offsetX}px)`,top:`calc(50% - ${C.offsetY}px)`,width:C.cols*256,height:C.rows*256,gridTemplateColumns:`repeat(${C.cols}, 256px)`},children:[C.tiles.map(e=>(0,P.jsx)(`img`,{className:`wa-map-tile`,src:e.url,alt:``,width:256,height:256,draggable:!1,onError:()=>{Ge+=1,et(_)}},e.url)),_>1&&(0,P.jsxs)(`svg`,{className:`wa-map-track`,width:C.cols*256,height:C.rows*256,"aria-hidden":!0,children:[(0,P.jsx)(`polyline`,{ref:s,points:w.map(e=>`${e.x},${e.y}`).join(` `)}),(0,P.jsx)(`circle`,{className:`wa-map-track-start`,cx:w[0].x,cy:w[0].y,r:5}),(0,P.jsx)(`circle`,{className:`wa-map-track-now`,cx:w[_-1].x,cy:w[_-1].y,r:6})]}),_===1&&(0,P.jsx)(`span`,{className:`wa-map-modal-pin`,style:{left:w[0].x,top:w[0].y},"aria-hidden":!0})]})}),(0,P.jsxs)(`div`,{className:`wa-map-modal-foot`,children:[(0,P.jsx)(`span`,{className:`wa-map-credit`,children:`© OpenStreetMap contributors`}),(0,P.jsx)(`a`,{className:`wa-map-modal-osm`,href:`https://www.openstreetmap.org/?mlat=${v.lat}&mlon=${v.lon}#map=${x.zoom}/${v.lat}/${v.lon}`,target:`_blank`,rel:`noopener noreferrer`,children:`Open in OpenStreetMap`})]})]})})}var nt=/^-?\d+(\.\d+)?,-?\d+(\.\d+)?$/,rt=/^\[(?:live )?location: (.+)\]$/;function it(e){let t=rt.exec(e.trim());if(!t)return{kind:`none`};let n=t[1].split(` — `),r=n[n.length-1].trim();if(!nt.test(r))return{kind:`label-only`};let[i,a]=r.split(`,`),o=Number(i),s=Number(a);return!Number.isFinite(o)||!Number.isFinite(s)?{kind:`reject`,reason:`nan`,raw:r}:o<-90||o>90||s<-180||s>180?{kind:`reject`,reason:`range`,raw:r}:`${o},${s}`===r?{kind:`point`,lat:o,lon:s}:{kind:`reject`,reason:`roundtrip`,raw:r}}var at=/^\[live location: .+\]$/;function ot(e){let t=new Map;e.forEach((e,n)=>{if(e.kind!==`turn`)return;let r=e.turn;if(r.kind!==`telegram-persisted`||!at.test(r.text.trim()))return;let i=it(r.text);if(i.kind!==`point`)return;let a=r.messageId.replace(/:edit:[^:]*$/,``),o=t.get(a)??[];o.push({index:n,point:{lat:i.lat,lon:i.lon,ts:r.ts}}),t.set(a,o)});let n=new Map;for(let e of t.values())if(!(e.length<2)){n.set(e[0].index,{role:`head`,points:e.map(e=>e.point)});for(let t of e.slice(1))n.set(t.index,{role:`member`})}return n}var st=0,ct=0,lt=0,ut=0;function dt(){return{maps:st,tracks:ct,trackPoints:lt,tileErrors:ut}}function ft({lat:e,lon:t,msgKeyId:n,ts:r,formatTime:i}){let{tiles:a,offsetX:o,offsetY:s}=Ie(e,t),[c,l]=(0,N.useState)(!1);return(0,N.useEffect)(()=>(st+=1,()=>{--st}),[]),(0,P.jsxs)(P.Fragment,{children:[c&&(0,P.jsx)(tt,{points:[{lat:e,lon:t,ts:r??null}],msgKeyId:n,formatTime:i,onClose:()=>l(!1)}),(0,P.jsx)(`button`,{type:`button`,className:`wa-map wa-map-open`,"aria-label":`Open map`,onClick:()=>l(!0),style:{width:240,height:160},children:(0,P.jsxs)(`span`,{className:`wa-map-viewport`,children:[(0,P.jsx)(`span`,{className:`wa-map-block`,style:{left:`calc(50% - ${o}px)`,top:`calc(50% - ${s}px)`},children:a.map(e=>(0,P.jsx)(`img`,{className:`wa-map-tile`,src:e.url,alt:``,width:256,height:256,loading:`lazy`,onError:()=>{ut+=1}},e.url))}),(0,P.jsx)(`span`,{className:`wa-map-pin`,"aria-hidden":!0}),(0,P.jsx)(`span`,{className:`wa-map-credit`,children:`© OpenStreetMap contributors`})]})})]})}function pt({points:e,formatTime:t,msgKeyId:n}){let{zone:i}=r(),a=Be(e),o=e.length,[s,c]=(0,N.useState)(!1);(0,N.useEffect)(()=>(ct+=1,lt+=o,()=>{--ct,lt-=o}),[o]);let l=e[o-1],u=a.points[0],d=a.points[o-1],f=t(e[0].ts,i),p=t(l.ts,i);return(0,P.jsxs)(P.Fragment,{children:[s&&(0,P.jsx)(tt,{points:e,msgKeyId:n,formatTime:t,onClose:()=>c(!1)}),(0,P.jsx)(`button`,{type:`button`,className:`wa-map wa-map-open`,"aria-label":`Open map`,onClick:()=>c(!0),style:{width:240,height:160},children:(0,P.jsxs)(`span`,{className:`wa-map-viewport`,children:[(0,P.jsxs)(`span`,{className:`wa-map-block`,style:{left:`calc(50% - ${a.offsetX}px)`,top:`calc(50% - ${a.offsetY}px)`},children:[a.tiles.map(e=>(0,P.jsx)(`img`,{className:`wa-map-tile`,src:e.url,alt:``,width:256,height:256,loading:`lazy`,onError:()=>{ut+=1}},e.url)),(0,P.jsxs)(`svg`,{className:`wa-map-track`,width:256*2,height:256*2,"aria-hidden":!0,children:[(0,P.jsx)(`polyline`,{points:a.points.map(e=>`${e.x},${e.y}`).join(` `)}),(0,P.jsx)(`circle`,{className:`wa-map-track-start`,cx:u.x,cy:u.y,r:4}),(0,P.jsx)(`circle`,{className:`wa-map-track-now`,cx:d.x,cy:d.y,r:5})]})]}),(0,P.jsx)(`span`,{className:`wa-map-credit`,children:`© OpenStreetMap contributors`})]})}),(0,P.jsxs)(`span`,{className:`wa-map-track-caption`,children:[o,` updates · `,f,` to `,p]})]})}function J({text:e,body:t,msgKeyId:n,ts:r,formatTime:i,forceExpanded:a}){let o=it(e);return(0,P.jsxs)(P.Fragment,{children:[o.kind===`point`&&(0,P.jsx)(ft,{lat:o.lat,lon:o.lon,msgKeyId:n,ts:r,formatTime:i}),(0,P.jsx)(H,{identity:u(n,r,e),surface:`wa`,forceExpanded:a,children:(0,P.jsx)(`p`,{className:`wa-body`,children:t})})]})}function mt(e){let t=0,n=0,r=0,i=0;for(let a of e){let e=a.kind===`turn`?a.turn:null,o=e&&`text`in e&&typeof e.text==`string`?e.text:``;if(o===``)continue;t+=1;let s=it(o);s.kind!==`none`&&(n+=1,s.kind===`point`?r+=1:s.kind===`reject`&&(i+=1))}return{bodies:t,withLabel:n,parsed:r,rejected:i}}function ht(e,t){let{maps:n,tracks:r,trackPoints:i,tileErrors:a}=t;return e.rejected>0||e.parsed>n+i||r===0&&i>0?`[operator-ui] op=location-census-alarm bodies=${e.bodies} withLabel=${e.withLabel} parsed=${e.parsed} rejected=${e.rejected} maps=${n} tracks=${r} trackPoints=${i} tileErrors=${a}`:null}var gt=20;function _t(e){let t=e.replace(/\/(store-)?stream$/,(e,t)=>t?`/store-backfill`:`/backfill`);return t===e?``:t}function vt(e,...t){let[n,r,i,a,o]=t,[s,c]=(0,N.useState)([]),[l,u]=(0,N.useState)(null),[d,f]=(0,N.useState)(!1),[p,m]=(0,N.useState)(0),h=(0,N.useRef)(!1);(0,N.useEffect)(()=>{c([]),u(null),f(!1),m(0),h.current=!1},[a,n,r,i,e]);let g=(0,N.useCallback)(e=>u(e),[]),_=(0,N.useCallback)(()=>{!e||l===null||l<=0||h.current||(h.current=!0,f(!0),(async()=>{let t=l,a=[],s=0;try{for(;t>0&&a.length===0&&s<gt;){s+=1;let c=await fetch(`${e}?${bt(e,n,r,i,t,o)}`);if(!c.ok)break;let l=await c.json();if(!Array.isArray(l.turns))break;a.unshift(...l.turns);let u=l.reachedStart?0:l.from;if(!l.reachedStart&&u>=t){yt(e,t,l.from);break}t=u}}catch{}finally{a.length>0&&(c(e=>[...a,...e]),m(e=>e+1)),u(t),h.current=!1,f(!1)}})())},[e,n,r,i,l]);return{turns:s,hasOlder:l!==null&&l>0,loadingOlder:d,prependCount:p,loadOlder:_,setTurns:c,onWindow:g}}function yt(e,t,n){let r=e.endsWith(`/store-backfill`)?`store`:e.includes(`/public-reader/`)?`public`:`session`;try{fetch(`/api/_client-error`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`event`,source:`reader-backfill`,op:`backfill-no-advance`,reader:r,before:t,from:n}),keepalive:!0}).catch(()=>{})}catch{}}function bt(e,t,n,r,i,a=`remoteJid`){let o=e.endsWith(`/store-backfill`);return new URLSearchParams(o?{accountId:t,[a]:n,session_key:r,before:String(i)}:{sessionId:t,projectDir:n,session_key:r,before:String(i)}).toString()}function xt(e,t,n,r=`/api/session-reader/stream`,i=e,a=!0){let[o,s]=(0,N.useState)([]),[c,l]=(0,N.useState)(`open`),[u,d]=(0,N.useState)(null),f=vt(_t(r),e,t,n,i),{onWindow:p}=f,m=(0,N.useRef)([]);return(0,N.useEffect)(()=>{m.current=o},[o]),(0,N.useEffect)(()=>{s([]),m.current=[],d(null)},[i,t,n,r]),(0,N.useEffect)(()=>{if(l(`open`),!a)return;let i=m.current.slice(),o=i.map(St),c=0,u=i.length>0,f=`${r}?sessionId=${encodeURIComponent(e)}&projectDir=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,h=new EventSource(f);return h.onopen=()=>{l(`open`)},h.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(u){if(c<o.length&&St(t)===o[c]){c+=1;return}u=!1}s(e=>[...e,t])},h.addEventListener(`activity`,e=>{try{d(JSON.parse(e.data))}catch{}}),h.addEventListener(`activity-clear`,()=>d(null)),h.addEventListener(`window`,e=>{try{let t=JSON.parse(e.data);typeof t.from==`number`&&p(t.from)}catch{}}),h.onerror=()=>{h.readyState===2&&(console.error(`[admin-ui] wa-stream onerror readyState=${h.readyState}`),l(`error`))},()=>h.close()},[e,t,n,r,i,a,p]),{turns:(0,N.useMemo)(()=>[...f.turns,...o],[f.turns,o]),status:c,subagentActivity:u,hasOlder:f.hasOlder,loadingOlder:f.loadingOlder,prependCount:f.prependCount,loadOlder:f.loadOlder}}function St(e){return JSON.stringify(e)}function Ct(e,t,n,r,i,a=!0){let[o,s]=(0,N.useState)([]),[c,l]=(0,N.useState)(`open`),u=vt(`${e}/store-backfill`,n,r,i,`${n}|${r}`,t),{onWindow:d,setTurns:f}=u;return(0,N.useEffect)(()=>{if(s([]),l(`open`),!a||!n||!r)return;let o=`${e}/store-stream?accountId=${encodeURIComponent(n)}&${t}=${encodeURIComponent(r)}&session_key=${encodeURIComponent(i)}`,c=new EventSource(o);return c.onopen=()=>l(`open`),c.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}s(e=>[...e,t])},c.addEventListener(`window`,e=>{try{let t=JSON.parse(e.data);typeof t.from==`number`&&d(t.from)}catch{}}),c.addEventListener(`reaction`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}let n=e=>e.map(e=>e.kind===`whatsapp-persisted`&&e.msgKeyId===t.targetMsgKeyId?{...e,reactions:t.reactions}:e);s(n),f(n)}),c.addEventListener(`update`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}let n=e=>e.map(e=>e.kind===`telegram-persisted`&&e.messageId===t.targetMessageId?{...e,...t.attachments?{attachments:t.attachments}:{},...t.text===void 0?{}:{text:t.text}}:e);s(n),f(n)}),c.onerror=()=>{c.readyState===2&&l(`error`)},()=>c.close()},[e,t,n,r,i,a,d,f]),{turns:(0,N.useMemo)(()=>[...u.turns,...o].sort((e,t)=>String(e.ts??``).localeCompare(String(t.ts??``))),[u.turns,o]),status:c,hasOlder:u.hasOlder,loadingOlder:u.loadingOlder,prependCount:u.prependCount,loadOlder:u.loadOlder}}var wt=e=>{if(!e)return 1/0;let t=new Date(e).getTime();return Number.isNaN(t)?1/0:t};function Tt(e,t){let n=[],r=0;return e.forEach((e,t)=>n.push({sort:wt(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:wt(e.ts),sub:0,ins:r++,item:{kind:`directive`,entry:e}})),n.sort((e,t)=>e.sort===t.sort?e.sort===1/0?e.ins-t.ins:e.sub-t.sub||e.ins-t.ins:e.sort<t.sort?-1:1).map(e=>e.item)}function Et(e,t,n=!0){let[r,i]=(0,N.useState)([]);return(0,N.useEffect)(()=>{if(!n||typeof fetch!=`function`)return;let r=!0,a=`/api/session-reader/directives?sessionId=${encodeURIComponent(e)}&session_key=${encodeURIComponent(t)}`;return fetch(a).then(e=>e.ok?e.json():{entries:[]}).then(e=>{r&&i(Array.isArray(e.entries)?e.entries:[])}).catch(()=>{r&&i([])}),()=>{r=!1}},[e,t,n]),r}var Dt=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`agent-send-party`,`whatsapp-persisted`,`telegram-persisted`,`telegram-card`,`telegram-send`]);function Ot({accountId:e,jid:t,sessionKey:n,className:r=`wa-web-avatar`,size:i=20}){let[a,o]=(0,N.useState)(null);if(!t||a===t)return(0,P.jsx)(`span`,{className:r,"aria-hidden":!0,children:(0,P.jsx)(M,{size:i})});let s=`/api/whatsapp-reader/avatar?session_key=${encodeURIComponent(n)}&accountId=${encodeURIComponent(e)}&jid=${encodeURIComponent(t)}`;return(0,P.jsx)(`span`,{className:r,"aria-hidden":!0,children:(0,P.jsx)(`img`,{className:`wa-avatar-img`,src:s,alt:``,onError:()=>o(t)})})}function Y(e,t){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=f(n,t);return`${String(r.hh).padStart(2,`0`)}:${String(r.mm).padStart(2,`0`)}`}function kt(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var At=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],jt=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function Mt(e,t){if(!e)return null;let n=new Date(e);return Number.isNaN(n.getTime())?null:i(n,t)}function Nt(e,t,n=new Date){if(!e)return``;let r=new Date(e);if(Number.isNaN(r.getTime()))return``;let a=i(r,t);if(a===i(n,t))return`Today`;let o=f(n,t);if(a===i(new Date(Date.UTC(o.y,o.m-1,o.d)-864e5),`UTC`))return`Yesterday`;let s=f(r,t);return`${At[new Date(Date.UTC(s.y,s.m-1,s.d)).getUTCDay()]} ${s.d} ${jt[s.m-1]} ${s.y}`}function Pt(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function Ft({ts:e,prevTs:t=null}){let{zone:n}=r(),i=Mt(e,n);return i===null||t!==null&&Mt(t,n)===i?null:(0,P.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,P.jsx)(`span`,{className:`day-divider-label`,children:Nt(e,n)})})}function It({ts:e,className:t}){let{zone:n}=r();return(0,P.jsx)(`time`,{className:t,children:Y(e,n)})}function Lt(){return(0,P.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,P.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function Rt({outcome:e}){return(0,P.jsx)(`span`,{className:e===`failed`?`tg-send-status tg-send-failed`:`tg-send-status`,children:e})}function X({label:e,ts:t,colour:n}){let{zone:i}=r();return(0,P.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,P.jsx)(`span`,{className:`wa-who`,style:n?{color:n}:void 0,children:e}),(0,P.jsx)(`time`,{className:`wa-time`,children:Y(t,i)})]})}function zt({turn:e}){let[t,n]=(0,N.useState)(!1),{zone:i}=r(),a=e.kind===`tool-result`,o=a?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,s=a?e.isError?`result (error)`:`result`:`↳ ${e.name}`,c=a?e.text:JSON.stringify(e.input,null,2);return(0,P.jsxs)(`div`,{className:o,children:[(0,P.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,P.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,P.jsx)(`span`,{className:`wa-who`,children:s}),(0,P.jsx)(`time`,{className:`wa-time`,children:Y(e.ts,i)})]}),t&&(0,P.jsx)(`pre`,{className:`wa-code`,children:c})]})}function Bt({entry:e,sessionId:t,sessionKey:n}){let[i,a]=(0,N.useState)(!1),[o,s]=(0,N.useState)(null),{zone:c}=r(),l=()=>{let r=!i;if(a(r),r&&o===null&&typeof fetch==`function`){let r=`/api/session-reader/directive?sessionId=${encodeURIComponent(t)}&name=${encodeURIComponent(e.name)}&session_key=${encodeURIComponent(n)}`;fetch(r).then(e=>e.ok?e.text():`(directive unavailable)`).then(s).catch(()=>s(`(directive unavailable)`))}};return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,P.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":i,onClick:l,children:[(0,P.jsx)(`span`,{className:`wa-chevron`,children:i?`▾`:`▸`}),(0,P.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,P.jsx)(`time`,{className:`wa-time`,children:Y(e.ts,c)})]}),i&&(0,P.jsx)(`pre`,{className:`wa-code`,children:o??`Loading…`})]})}function Vt(e){return`text`in e&&typeof e.text==`string`?e.text:``}function Ht(e,t){let n=(t??``).trim();return n?e.toLowerCase().includes(n.toLowerCase()):!1}function Z(e,t){let n=(t??``).trim();if(!n)return e;let r=e.toLowerCase(),i=n.toLowerCase(),a=[],o=0,s=0;for(;;){let t=r.indexOf(i,o);if(t===-1){a.push(e.slice(o));break}t>o&&a.push(e.slice(o,t)),a.push((0,P.jsx)(`mark`,{className:`wa-search-hit`,children:e.slice(t,t+i.length)},s++)),o=t+i.length}return a.length===1?a[0]:(0,P.jsx)(P.Fragment,{children:a})}var Q={onFail:({kind:e,mime:t,reason:n})=>console.warn(`[operator-ui] op=reader-attachment-fail kind=${e} mime=${t??``} reason=${n}`)};function Ut(e,t,n,r){switch(e.kind){case`operator-inbound`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,P.jsx)(X,{label:`Operator${ae(e.source)}`,ts:e.ts}),e.text&&(0,P.jsx)(J,{text:e.text,body:e.text,ts:e.ts,formatTime:Y}),e.attachments&&e.attachments.length>0&&(0,P.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,P.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:z(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))})]},t);case`operator-typed`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,P.jsx)(X,{label:`Operator (web)`,ts:e.ts}),(0,P.jsx)(J,{text:e.text,body:e.text,ts:e.ts,formatTime:Y})]},t);case`agent-text`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,P.jsx)(X,{label:`Agent`,ts:e.ts}),(0,P.jsx)(J,{text:e.text,body:e.text,ts:e.ts,formatTime:Y})]},t);case`agent-reply`:case`agent-webchat-final`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Agent`,ts:e.ts}),(0,P.jsx)(J,{text:e.text,body:e.text,ts:e.ts,formatTime:Y})]},t);case`agent-send-party`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Agent to ${e.phone}`,ts:e.ts}),(0,P.jsx)(J,{text:e.text,body:e.text,ts:e.ts,formatTime:Y})]},t);case`agent-reply-document`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Agent`,ts:e.ts}),(0,P.jsxs)(`p`,{className:`wa-doc`,children:[(0,P.jsx)(k,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(kt).join(`, `)]}),e.caption&&(0,P.jsx)(H,{identity:u(e.ts,e.caption),surface:`wa`,children:(0,P.jsx)(`p`,{className:`wa-body`,children:e.caption})})]},t);case`agent-file`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=kt(t),a=e.downloads?.[r];return(0,P.jsx)(V,{expandable:!0,filename:i,href:a?pe(a,n.sessionId,n.sessionKey,de.test(i)?`inline`:void 0):void 0,telemetry:Q},r)}),e.caption&&(0,P.jsx)(H,{identity:u(e.ts,e.caption),surface:`wa`,children:(0,P.jsx)(`p`,{className:`wa-body`,children:e.caption})})]},t);case`telegram-card`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Telegram to ${e.chatId}`,ts:e.ts}),(0,P.jsx)(H,{identity:u(e.ts,e.chatId,e.text),surface:`wa`,children:(0,P.jsx)(`p`,{className:`wa-body`,children:e.text})}),e.buttons.length>0&&(0,P.jsx)(`div`,{className:`tg-card-buttons`,children:e.buttons.map((e,t)=>(0,P.jsx)(`span`,{className:`tg-card-btn`,children:e.text},t))}),(0,P.jsx)(Rt,{outcome:e.outcome})]},t);case`telegram-send`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,P.jsx)(X,{label:`Telegram ${e.label} to ${e.chatId}`,ts:e.ts}),e.text.length>0&&(0,P.jsx)(H,{identity:u(e.ts,e.chatId,e.text),surface:`wa`,children:(0,P.jsx)(`p`,{className:`wa-body`,children:e.text})}),(0,P.jsx)(Rt,{outcome:e.outcome})]},t);case`telegram-persisted`:{let i=e.origin===`operator-manual`,a=e.fromMe?i?`You`:`Sent`:e.senderName??`Contact`,o=e.deleted===!0;return(0,P.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${i?` wa-op-manual`:``}${o?` wa-turn-deleted`:``}`,children:[(0,P.jsx)(X,{label:a,ts:e.ts}),o&&(0,P.jsx)(`span`,{className:`wa-deleted-tag`,children:`deleted`}),e.text&&r?.role===`head`&&(0,P.jsx)(pt,{points:r.points,formatTime:Y,msgKeyId:e.messageId}),e.text&&r&&(0,P.jsx)(H,{identity:u(e.messageId,e.ts,e.text),surface:`wa`,forceExpanded:Ht(e.text,n.highlight),children:(0,P.jsx)(`p`,{className:`wa-body`,children:Z(e.text,n.highlight)})}),e.text&&!r&&(0,P.jsx)(J,{text:e.text,body:Z(e.text,n.highlight),forceExpanded:Ht(e.text,n.highlight),msgKeyId:e.messageId,ts:e.ts,formatTime:Y}),e.buttons&&e.buttons.length>0&&(0,P.jsx)(`div`,{className:`tg-card-buttons`,children:e.buttons.map((e,t)=>(0,P.jsx)(`span`,{className:`tg-card-btn`,children:e.text},t))}),e.attachments&&e.attachments.length>0&&(0,P.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,P.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:z(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))}),(0,P.jsxs)(`span`,{className:`wa-bubble-meta`,children:[i&&(0,P.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,P.jsx)(It,{ts:e.ts,className:`wa-bubble-time`})]})]},t)}case`whatsapp-persisted`:{let r=e.origin===`operator-manual`,i=e.fromMe?r?`You`:`Sent`:e.senderName??`Contact`,a=n.groupThread&&!e.fromMe&&n.storeAccountId&&e.senderJid&&l(e.senderJid)?e.senderJid:null;return(0,P.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${r?` wa-op-manual`:``}${a?` wa-turn-has-avatar`:``}`,children:[a&&(0,P.jsx)(Ot,{accountId:n.storeAccountId,jid:a,sessionKey:n.sessionKey,className:`wa-bubble-avatar`,size:14}),n.onReplyTo&&e.msgKeyId&&(0,P.jsx)(`button`,{type:`button`,className:`wa-bubble-reply`,"aria-label":`Reply to this message`,onClick:()=>n.onReplyTo({msgKeyId:e.msgKeyId,body:e.text,senderName:e.senderName,fromMe:e.fromMe}),children:(0,P.jsx)(j,{size:14})}),n.showCopy&&e.text&&(0,P.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;_(t).then(e=>{e||console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`)})},children:(0,P.jsx)(y,{size:14})}),e.quoted&&(0,P.jsxs)(`div`,{className:`wa-quoted`,children:[(0,P.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,P.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,P.jsx)(X,{label:i,ts:e.ts,colour:n.groupThread&&!e.fromMe?p(e.senderTelephone||e.senderName||``):void 0}),e.text&&(0,P.jsx)(J,{text:e.text,body:Z(e.text,n.highlight),forceExpanded:Ht(e.text,n.highlight),msgKeyId:e.msgKeyId??void 0,ts:e.ts,formatTime:Y}),e.attachments&&e.attachments.length>0&&(0,P.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,P.jsx)(V,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:z(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))}),e.reactions&&e.reactions.length>0&&(0,P.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,P.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,P.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,P.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,P.jsx)(It,{ts:e.ts,className:`wa-bubble-time`}),e.fromMe&&(0,P.jsx)(E,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,P.jsx)(Lt,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,P.jsx)(zt,{turn:e},t);case`agent-error`:return(0,P.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,P.jsx)(X,{label:`Agent`,ts:e.ts}),(0,P.jsx)(`p`,{className:`wa-body wa-error-body`,children:L(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,P.jsx)(`pre`,{className:`wa-code`,children:e.raw})]},t)}}function $(e,t,n,r=`admin`,i,a,o,s,c){let l={sessionId:t,sessionKey:n,audience:r,highlight:i,onReplyTo:a,showCopy:o,groupThread:s,storeAccountId:c},u=ot(e),d=[],f=null;return e.forEach((e,r)=>{let i=Pt(e);i!==null&&!Number.isNaN(new Date(i).getTime())&&(d.push((0,P.jsx)(Ft,{ts:i,prevTs:f},`day-${r}`)),f=i),d.push(e.kind===`turn`?Ut(e.turn,r,l,u.get(r)):(0,P.jsx)(Bt,{entry:e.entry,sessionId:t,sessionKey:n},r))}),d}function Wt(e){return e.filter(e=>e.kind===`turn`&&Dt.has(e.turn.kind)&&!(e.turn.kind===`operator-inbound`&&e.turn.scheduled))}function Gt(e,t,n){return t===0||n>0?null:`[operator-ui] op=store-turns-unpainted channel=${e} received=${t} painted=${n}`}function Kt(e,t){return e===0||t>0?null:`[operator-ui] op=reader-turns-unpainted source=session received=${e} painted=${t}`}var qt=(0,N.memo)(function({sessionId:e,projectDir:t,sessionKey:n,renderItems:r=$,clean:i,onToggleClean:a,forceDeliveredOnly:o=!1,streamEndpoint:s=`/api/session-reader/stream`,suppressDirectives:c=!1,tail:l=null,resetKey:u,onTurnsChange:d,onActivityChange:f,store:m,search:h,onReplyTo:g,groupThread:_=!1}){let v=!!m,y=xt(e,t,n,s,u,!v),b=m?.channel===`telegram`?`/api/telegram-reader`:`/api/whatsapp-reader`,x=m?.channel===`telegram`?`channelKey`:`remoteJid`,S=m?m.channel===`telegram`?m.channelKey:m.remoteJid:``,C=Ct(b,x,m?.accountId??``,S,n,v),{turns:w,status:T}=v?{turns:C.turns,status:C.status}:{turns:y.turns,status:y.status},E=v?C:y,D=v?null:y.subagentActivity;(0,N.useEffect)(()=>{f?.(D)},[D,f]),(0,N.useEffect)(()=>{d?.(w.length)},[w.length,d]);let O=Tt(w,Et(e,n,!c)),k=a==null?!1:!!i,A=o||k?Wt(O):O,j=(h??``).trim().toLowerCase(),M=j.length>0,F=M?A.filter(e=>e.kind===`turn`&&Vt(e.turn).toLowerCase().includes(j)):A;(0,N.useEffect)(()=>{if(!_||!v)return;let e=w.filter(e=>e.kind===`whatsapp-persisted`&&!e.fromMe);if(e.length===0)return;let t=new Set(e.map(e=>e.senderTelephone||e.senderName||``));new Set(Array.from(t,e=>p(e))),new Set(e.filter(e=>!e.senderTelephone).map(e=>e.senderName??``)).size},[_,v,w,S]),(0,N.useEffect)(()=>{let e=v?F:r===$?A:null;if(!e)return;let t=mt(e);if(t.bodies===0)return;let n=ht(t,dt());n&&console.warn(n);let i=Ze();if(i.modalsLive>0){let t=new Map,n=ot(e);e.forEach((e,r)=>{let i=n.get(r);if(!i||i.role!==`head`)return;let a=e.kind===`turn`?e.turn:null;a&&`messageId`in a&&typeof a.messageId==`string`&&t.set(a.messageId,i.points.length)});let r=Qe(i,$e(i.mapKey,t));r&&console.warn(r)}},[v,F,A,r]);let I=m?.channel;return(0,N.useEffect)(()=>{if(!v||!I)return;let e=Gt(I,w.length,A.length);e&&console.warn(e)},[v,I,w.length,A.length]),(0,N.useEffect)(()=>{if(v||!o||r!==$)return;let e=Kt(w.length,A.length);e&&console.warn(e)},[v,o,r,w.length,A.length]),(0,P.jsxs)(ee,{repinSignals:[w,k,M],tail:l,onReachTop:E.hasOlder&&!M?E.loadOlder:void 0,prependToken:E.prependCount,children:[T===`error`&&(0,P.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),E.loadingOlder&&(0,P.jsx)(`div`,{className:`wa-reader-placeholder`,children:`Loading earlier messages…`}),!M&&w.length===0&&T===`open`&&(0,P.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),M&&F.length===0&&(0,P.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,h,`".`]}),v?$(F,e,n,`admin`,h,g,!0,_,m?.accountId):r(A,e,n)]})});function Jt(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var Yt=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Xt(){for(let e of Yt)if(MediaRecorder.isTypeSupported(e))return e;return``}function Zt(e){return e.split(`;`)[0]}async function Qt(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function $t(e){let[t,n]=(0,N.useState)(`idle`),[r,i]=(0,N.useState)(0),[a,o]=(0,N.useState)(null),[s,c]=(0,N.useState)(null),l=(0,N.useRef)(null),u=(0,N.useRef)(null),d=(0,N.useRef)([]),f=(0,N.useRef)(``),p=(0,N.useRef)(null),m=(0,N.useRef)(0),h=(0,N.useRef)(0),g=(0,N.useRef)(null),_=(0,N.useRef)(null),v=(0,N.useRef)(0),y=(0,N.useCallback)(()=>{if(p.current&&=(clearInterval(p.current),null),v.current&&=(cancelAnimationFrame(v.current),0),l.current&&l.current.state!==`inactive`)try{l.current.stop()}catch{}l.current=null,d.current=[],u.current&&=(u.current.getTracks().forEach(e=>e.stop()),null),g.current&&(g.current.close().catch(()=>{}),g.current=null,_.current=null),h.current=0,m.current=0},[]);(0,N.useEffect)(()=>y,[y]);let b=(0,N.useCallback)(()=>{m.current=Date.now(),p.current=setInterval(()=>{let e=Date.now()-m.current,t=h.current+e;i(Math.floor(t/1e3))},200)},[]),x=(0,N.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),S=(0,N.useCallback)(()=>{let e=_.current;if(!e)return;let t=new Uint8Array(e.frequencyBinCount),n=()=>{e.getByteTimeDomainData(t),o(new Uint8Array(t)),v.current=requestAnimationFrame(n)};n()},[]),C=(0,N.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),w=e?.onResult,T=(0,N.useCallback)(async e=>{if(!(t!==`idle`&&t!==`error`)){if(c(null),typeof window<`u`&&!window.isSecureContext){n(`error`),c(`Voice recording requires a secure connection (HTTPS). Use your tunnel URL for voice notes.`);return}if(typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia){n(`error`),c(`Voice recording is not supported in this browser.`);return}if(typeof MediaRecorder>`u`){n(`error`),c(`Voice recording is not supported in this browser.`);return}try{let t=e?{audio:{deviceId:{exact:e}}}:{audio:!0},r;try{r=await navigator.mediaDevices.getUserMedia(t)}catch(t){let n=t?.name;if(e&&(n===`OverconstrainedError`||n===`NotFoundError`))r=await navigator.mediaDevices.getUserMedia({audio:!0});else throw t}u.current=r;let a=new AudioContext;g.current=a;let s=a.createMediaStreamSource(r),c=a.createAnalyser();c.fftSize=256,s.connect(c),_.current=c;let p=Xt();f.current=p;let m=new MediaRecorder(r,p?{mimeType:p}:void 0);l.current=m,d.current=[],m.ondataavailable=e=>{e.data.size>0&&d.current.push(e.data)},r.getAudioTracks()[0]?.addEventListener(`ended`,()=>{y(),n(`idle`),i(0),o(null)}),m.start(1e3),n(`recording`),i(0),b(),S(),w?.({ok:!0})}catch(e){y(),n(`error`),e instanceof DOMException?(w?.({ok:!1,name:e.name,message:e.message}),e.name===`NotAllowedError`?c(`Microphone access was denied. Check your browser permissions to enable voice recording.`):e.name===`NotFoundError`?c(`No microphone found. Connect a microphone to use voice recording.`):e.name===`NotReadableError`?c(`The microphone could not be started even though access was granted. The browser reported: ${e.message} (${e.name}).`):c(`Microphone error (${e.name}): ${e.message}`)):(w?.({ok:!1}),c(`Could not start recording.`))}}},[t,y,b,S,w]),E=(0,N.useCallback)(()=>{let e=l.current;e&&(t===`recording`&&e.state===`recording`?(e.pause(),x(),C(),n(`paused`)):t===`paused`&&e.state===`paused`&&(e.resume(),b(),S(),n(`recording`)))},[t,x,b,S,C]),D=(0,N.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),O=(0,N.useCallback)(async()=>{if(t!==`recording`&&t!==`paused`)return null;let e=l.current;if(!e)return null;let r=t===`recording`?Date.now()-m.current:0;return h.current+r<1e3?(D(),null):(n(`sending`),x(),C(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Zt(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,D,x,C,y]);return(0,N.useEffect)(()=>{if(t!==`error`)return;let e=setTimeout(()=>{n(`idle`),c(null)},8e3);return()=>clearTimeout(e)},[t]),{state:t,elapsedSeconds:r,waveform:a,errorMessage:s,start:T,togglePause:E,discard:D,send:O}}export{D as A,me as C,A as D,j as E,w as M,C as N,k as O,T as P,pe as S,M as T,V as _,Bt as a,de as b,qt as c,Y as d,Pt as f,H as g,Ne as h,Ft as i,S as j,O as k,kt as l,je as m,$t as n,Lt as o,Ot as p,Jt as r,Rt as s,Qt as t,Mt as u,xe as v,L as w,z as x,ue as y};
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Chat — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/chat-fP4sE4pU.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-UvZFrM0K.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BY35JYDT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-e4ciNiuO.js">
@@ -13,13 +13,13 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-eAV8hweq.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/copy-Dnw0TkVh.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/play-eeQX0FtC.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-D7_wLtrS.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-Cvu4TePf.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-1MKNUzp3.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-D3_hiHLC.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVZAL3Er.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D-2d4YGp.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/wrench-BI28h1JF.js">
22
- <link rel="modulepreload" crossorigin href="/assets/page-BBRWbFzG.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/page-Bkl56P8R.js">
23
23
  <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-dao9WPN0.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Data — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/data-DKz9_73S.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-BBEjTZO8.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BY35JYDT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-e4ciNiuO.js">
@@ -13,12 +13,12 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-eAV8hweq.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/copy-Dnw0TkVh.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/play-eeQX0FtC.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-D7_wLtrS.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-Cvu4TePf.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/file-download-B7zwa78w.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-D3_hiHLC.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVZAL3Er.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/triangle-alert-C_68TrTq.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-CdRrpkky.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-BF6bGLX_.js">
22
22
  <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-dao9WPN0.css">
23
23
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
24
24
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-B2IkUoSc.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-Bs6cPAbz.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BY35JYDT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-e4ciNiuO.js">
@@ -14,13 +14,13 @@
14
14
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-eAV8hweq.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/copy-Dnw0TkVh.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/play-eeQX0FtC.js">
17
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-D7_wLtrS.js">
18
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Bjsr45ed.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-Cvu4TePf.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BiHOXO0Y.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/file-download-B7zwa78w.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-D3_hiHLC.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVZAL3Er.js">
22
22
  <link rel="modulepreload" crossorigin href="/assets/triangle-alert-C_68TrTq.js">
23
- <link rel="modulepreload" crossorigin href="/assets/page-CdRrpkky.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/page-BF6bGLX_.js">
24
24
  <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-dao9WPN0.css">
25
25
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
26
26
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Operator — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/operator-CO5ma-ky.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-DxwbldCs.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BY35JYDT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-e4ciNiuO.js">
@@ -13,14 +13,14 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-eAV8hweq.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/copy-Dnw0TkVh.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/play-eeQX0FtC.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-D7_wLtrS.js">
17
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Bjsr45ed.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-Cvu4TePf.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BiHOXO0Y.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-1MKNUzp3.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-D3_hiHLC.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVZAL3Er.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D-2d4YGp.js">
22
22
  <link rel="modulepreload" crossorigin href="/assets/wrench-BI28h1JF.js">
23
- <link rel="modulepreload" crossorigin href="/assets/page-BBRWbFzG.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/page-Bkl56P8R.js">
24
24
  <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-dao9WPN0.css">
25
25
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
26
26
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-2mLo4k7L.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-D6YxlJcZ.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BY35JYDT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-e4ciNiuO.js">
@@ -13,13 +13,13 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-eAV8hweq.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/copy-Dnw0TkVh.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/play-eeQX0FtC.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-D7_wLtrS.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-Cvu4TePf.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-1MKNUzp3.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-D3_hiHLC.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVZAL3Er.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-D-2d4YGp.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/wrench-BI28h1JF.js">
22
- <link rel="modulepreload" crossorigin href="/assets/page-BBRWbFzG.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/page-Bkl56P8R.js">
23
23
  <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-dao9WPN0.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -6248,6 +6248,82 @@ function parseTelegramChannelKey(key2) {
6248
6248
  return { botId, senderId: rest, business: false };
6249
6249
  }
6250
6250
 
6251
+ // app/lib/telegram/access-control.ts
6252
+ function checkTelegramAccess(params) {
6253
+ const { senderId, entry: entry3, chatId, chatType } = params;
6254
+ const isGroup = chatType === "group" || chatType === "supergroup";
6255
+ const isChannel = chatType === "channel";
6256
+ if (isChannel && entry3.role !== "public") {
6257
+ return {
6258
+ allowed: false,
6259
+ reason: entry3.role === "admin" ? "admin-entry-no-channels" : entry3.role === "specialist" ? "specialist-entry-no-channels" : "unbound-entry-no-channels",
6260
+ agentType: entry3.role === "admin" ? "admin" : entry3.role === "specialist" ? "specialist" : "public"
6261
+ };
6262
+ }
6263
+ if (isGroup && entry3.role !== "public") {
6264
+ return {
6265
+ allowed: false,
6266
+ reason: entry3.role === "admin" ? "admin-entry-no-groups" : entry3.role === "specialist" ? "specialist-entry-no-groups" : "unbound-entry-no-groups",
6267
+ agentType: entry3.role === "admin" ? "admin" : entry3.role === "specialist" ? "specialist" : "public"
6268
+ };
6269
+ }
6270
+ if (entry3.role === "admin") {
6271
+ const adminUsers = entry3.adminUsers ?? [];
6272
+ if (adminUsers.includes(senderId)) {
6273
+ return { allowed: true, reason: "admin-binding", agentType: "admin" };
6274
+ }
6275
+ return { allowed: false, reason: "not-admin-user", agentType: "admin" };
6276
+ }
6277
+ if (isGroup && entry3.role === "public") {
6278
+ const groupPolicy = entry3.groupPolicy ?? "disabled";
6279
+ if (groupPolicy === "allowlist") {
6280
+ const allowGroups = entry3.allowGroups ?? [];
6281
+ if (allowGroups.includes(chatId)) {
6282
+ return { allowed: true, reason: "group-allowlist-match", agentType: "public" };
6283
+ }
6284
+ return { allowed: false, reason: "not-in-allowGroups", agentType: "public" };
6285
+ }
6286
+ return { allowed: false, reason: "group-policy-disabled", agentType: "public" };
6287
+ }
6288
+ if (isChannel && entry3.role === "public") {
6289
+ const channelPolicy = entry3.channelPolicy ?? "disabled";
6290
+ if (channelPolicy === "allowlist") {
6291
+ const allowChannels = entry3.allowChannels ?? [];
6292
+ if (allowChannels.includes(chatId)) {
6293
+ return { allowed: true, reason: "channel-allowlist-match", agentType: "public" };
6294
+ }
6295
+ return { allowed: false, reason: "not-in-allowChannels", agentType: "public" };
6296
+ }
6297
+ return { allowed: false, reason: "channel-policy-disabled", agentType: "public" };
6298
+ }
6299
+ if (entry3.role === "unbound") {
6300
+ return { allowed: false, reason: "bot-unbound", agentType: "public" };
6301
+ }
6302
+ if (entry3.role === "specialist") {
6303
+ const allowFrom = entry3.allowFrom ?? [];
6304
+ if (allowFrom.includes(senderId)) {
6305
+ return { allowed: true, reason: "specialist-allowlist-match", agentType: "specialist" };
6306
+ }
6307
+ return { allowed: false, reason: "not-in-allowlist", agentType: "specialist" };
6308
+ }
6309
+ const policy = entry3.dmPolicy ?? "disabled";
6310
+ switch (policy) {
6311
+ case "open":
6312
+ return { allowed: true, reason: "dm-policy-open", agentType: "public" };
6313
+ case "allowlist": {
6314
+ const allowFrom = entry3.allowFrom ?? [];
6315
+ if (allowFrom.includes(senderId)) {
6316
+ return { allowed: true, reason: "allowlist-match", agentType: "public" };
6317
+ }
6318
+ return { allowed: false, reason: "not-in-allowlist", agentType: "public" };
6319
+ }
6320
+ case "disabled":
6321
+ return { allowed: false, reason: "dm-policy-disabled", agentType: "public" };
6322
+ default:
6323
+ return { allowed: false, reason: "unknown-dm-policy", agentType: "public" };
6324
+ }
6325
+ }
6326
+
6251
6327
  // app/lib/telegram/chat-send-policy.ts
6252
6328
  var BROADCAST_PREFIX = "-100";
6253
6329
  function checkTelegramChatSend(params) {
@@ -6263,6 +6339,21 @@ function chatSendAllowlists(entry3) {
6263
6339
  if (!entry3 || entry3.role !== "public") return { allowChannels: [], allowGroups: [] };
6264
6340
  return { allowChannels: entry3.allowChannels ?? [], allowGroups: entry3.allowGroups ?? [] };
6265
6341
  }
6342
+ function checkTelegramOutboundTarget(params) {
6343
+ const { chatId, entry: entry3 } = params;
6344
+ if (String(chatId).startsWith(BROADCAST_PREFIX)) {
6345
+ const lists = chatSendAllowlists(entry3);
6346
+ const verdict2 = checkTelegramChatSend({
6347
+ chatId,
6348
+ allowChannels: lists.allowChannels,
6349
+ allowGroups: lists.allowGroups
6350
+ });
6351
+ return { allowed: verdict2.allowed, reason: verdict2.reason, kind: "broadcast" };
6352
+ }
6353
+ const kind = chatId < 0 ? "group" : "private";
6354
+ const verdict = checkTelegramAccess({ senderId: chatId, entry: entry3, chatId, chatType: kind });
6355
+ return { allowed: verdict.allowed, reason: verdict.reason, kind };
6356
+ }
6266
6357
 
6267
6358
  // app/lib/channel-pty-bridge/admin-session-id.ts
6268
6359
  import { createHash } from "crypto";
@@ -7732,13 +7823,24 @@ function createOperatorInjectRoutes(deps) {
7732
7823
  const { accountId, accountDir, entry: entry3 } = resolved;
7733
7824
  const role = entry3.role;
7734
7825
  const agent = agentOf(entry3);
7735
- if (role !== "public") {
7736
- report({ botId, chatId, sessionId: "none", role, agent, accepted: false, reason: "not-public-bot" });
7826
+ if (role === "admin") {
7827
+ report({ botId, chatId, sessionId: "none", role, agent, accepted: false, reason: "admin-bot" });
7737
7828
  return c.json(
7738
7829
  {
7739
7830
  ok: false,
7740
- error: "not-public-bot",
7741
- detail: `Bot ${botId} is a ${role} bot, not a public one. Only a public agent's conversation with a visitor can be instructed this way.`
7831
+ error: "admin-bot",
7832
+ detail: `Bot ${botId} is this account's admin bot. Its chat is your own conversation with the agent, so there is nothing to instruct.`
7833
+ },
7834
+ 403
7835
+ );
7836
+ }
7837
+ if (role === "unbound") {
7838
+ report({ botId, chatId, sessionId: "none", role, agent, accepted: false, reason: "unbound-bot" });
7839
+ return c.json(
7840
+ {
7841
+ ok: false,
7842
+ error: "unbound-bot",
7843
+ detail: `Bot ${botId} is not bound to an agent or a specialist card, so it answers nobody. Bind it before instructing it.`
7742
7844
  },
7743
7845
  403
7744
7846
  );
@@ -7771,30 +7873,18 @@ function createOperatorInjectRoutes(deps) {
7771
7873
  403
7772
7874
  );
7773
7875
  }
7774
- const lists = chatSendAllowlists(entry3);
7775
- const verdict = checkTelegramChatSend({
7776
- chatId: Number(chatId),
7777
- allowChannels: lists.allowChannels,
7778
- allowGroups: lists.allowGroups
7779
- });
7876
+ const verdict = checkTelegramOutboundTarget({ chatId: Number(chatId), entry: entry3 });
7780
7877
  console.error(
7781
7878
  `[telegram-outbound] op=channel-send botId=${logValue2(botId)} chatId=${logValue2(chatId)} allowed=${verdict.allowed ? "yes" : "no"} reason=${verdict.reason} messageId=none`
7782
7879
  );
7783
7880
  if (!verdict.allowed) {
7784
- report({
7785
- botId,
7786
- chatId,
7787
- sessionId: "none",
7788
- role,
7789
- agent,
7790
- accepted: false,
7791
- reason: "chat-not-allowlisted"
7792
- });
7881
+ const outcome = verdict.kind === "broadcast" ? "chat-not-allowlisted" : "chat-not-permitted";
7882
+ report({ botId, chatId, sessionId: "none", role, agent, accepted: false, reason: outcome });
7793
7883
  return c.json(
7794
7884
  {
7795
7885
  ok: false,
7796
- error: "chat-not-allowlisted",
7797
- detail: `Chat ${chatId} is a broadcast channel that bot ${botId} does not allowlist, so nothing was sent.`
7886
+ error: outcome,
7887
+ detail: verdict.kind === "broadcast" ? `Chat ${chatId} is a broadcast channel that bot ${botId} does not allowlist, so nothing was sent.` : `Bot ${botId} may not talk to chat ${chatId} (${verdict.reason}), so nothing was sent. It would refuse that chat's own messages too.`
7798
7888
  },
7799
7889
  403
7800
7890
  );
@@ -7823,13 +7913,22 @@ function createOperatorInjectRoutes(deps) {
7823
7913
  accountDir,
7824
7914
  botId,
7825
7915
  botToken: entry3.token,
7826
- agentSlug: entry3.agent,
7916
+ // Task 2773 — `entryAgentSlug`, not `entry.agent`: a specialist entry
7917
+ // carries a card name and no `agent` field at all, so the property read
7918
+ // is `undefined` there. The webhook resolves the same way
7919
+ // (`routes/telegram.ts`), so both doors name the spawn's agent from one
7920
+ // definition.
7921
+ agentSlug: entryAgentSlug(entry3),
7827
7922
  senderId: chatId,
7828
7923
  conversationSubject: chatId,
7829
7924
  businessChatId: null,
7830
- role: "public",
7925
+ // Task 2773 — the entry's OWN role, replacing a hardcoded 'public'. This
7926
+ // picks the session derivation in `sessionIdFor` and the framing in the
7927
+ // channel server; a value disagreeing with the registry would land the
7928
+ // instruction in a session the counterparty's real messages never reach.
7929
+ role,
7831
7930
  personId: null,
7832
- specialist: null,
7931
+ specialist: entry3.role === "specialist" ? entry3.specialist : null,
7833
7932
  chatId,
7834
7933
  text: instruction,
7835
7934
  // An instruction carries no file by construction: there is no message to
@@ -15516,11 +15615,19 @@ async function recordManualSendContext(input, deps) {
15516
15615
  mechanism,
15517
15616
  reason
15518
15617
  });
15519
- if (input.entry.role !== "public") return refuse2("not-public-bot");
15618
+ if (input.entry.role === "admin") return refuse2("admin-bot");
15619
+ if (input.entry.role === "unbound") return refuse2("unbound-bot");
15520
15620
  const businessKey = telegramBusinessChannelKey(input.botId, String(input.chatId));
15521
15621
  if (deps.newestInboundTelegramDate(input.accountId, businessKey) !== null) {
15522
15622
  return refuse2("business-chat");
15523
15623
  }
15624
+ const target = checkTelegramOutboundTarget({ chatId: input.chatId, entry: input.entry });
15625
+ if (!target.allowed) {
15626
+ deps.log(
15627
+ `[telegram-manual-send] op=target-refused botId=${input.botId} chatId=${input.chatId} kind=${target.kind} reason=${target.reason}`
15628
+ );
15629
+ return refuse2("chat-not-permitted");
15630
+ }
15524
15631
  const projectDir = deps.findSessionProjectDir(input.sessionId);
15525
15632
  if (projectDir === null) return refuse2("no-transcript");
15526
15633
  const live = deps.isLive(input.channelKey);
@@ -15541,16 +15648,22 @@ async function recordManualSendContext(input, deps) {
15541
15648
  accountDir: input.accountDir,
15542
15649
  botId: input.botId,
15543
15650
  botToken: input.entry.token,
15544
- agentSlug: input.entry.agent,
15651
+ // Task 2773 — `entryAgentSlug`, not `entry.agent`: a specialist entry has
15652
+ // no `agent` field, so the property read is `undefined` there.
15653
+ agentSlug: entryAgentSlug(input.entry),
15545
15654
  senderId: input.senderId,
15546
15655
  // The route admits only a private chat, where the conversation's subject IS
15547
15656
  // the sender. Passed explicitly so the gateway's key and its session id are
15548
15657
  // derived from the same value the store row already carries.
15549
15658
  conversationSubject: input.senderId,
15550
15659
  businessChatId: null,
15551
- role: "public",
15660
+ // Task 2773 — the entry's OWN role, replacing a hardcoded 'public'. It
15661
+ // picks the session derivation in `sessionIdFor`, which for a specialist is
15662
+ // `telegramAdminSessionId` — the same value the caller already derived for
15663
+ // `input.sessionId`.
15664
+ role: input.entry.role,
15552
15665
  personId: null,
15553
- specialist: null,
15666
+ specialist: input.entry.role === "specialist" ? input.entry.specialist : null,
15554
15667
  chatId: String(input.chatId),
15555
15668
  text: input.text,
15556
15669
  // No file by construction: this is text the operator typed into the send
@@ -18842,82 +18955,6 @@ async function setManagedBotAccessSettings(managingBotToken, userId, isAccessRes
18842
18955
  return r.ok ? { ok: true } : { ok: false, error: r.error };
18843
18956
  }
18844
18957
 
18845
- // app/lib/telegram/access-control.ts
18846
- function checkTelegramAccess(params) {
18847
- const { senderId, entry: entry3, chatId, chatType } = params;
18848
- const isGroup = chatType === "group" || chatType === "supergroup";
18849
- const isChannel = chatType === "channel";
18850
- if (isChannel && entry3.role !== "public") {
18851
- return {
18852
- allowed: false,
18853
- reason: entry3.role === "admin" ? "admin-entry-no-channels" : entry3.role === "specialist" ? "specialist-entry-no-channels" : "unbound-entry-no-channels",
18854
- agentType: entry3.role === "admin" ? "admin" : entry3.role === "specialist" ? "specialist" : "public"
18855
- };
18856
- }
18857
- if (isGroup && entry3.role !== "public") {
18858
- return {
18859
- allowed: false,
18860
- reason: entry3.role === "admin" ? "admin-entry-no-groups" : entry3.role === "specialist" ? "specialist-entry-no-groups" : "unbound-entry-no-groups",
18861
- agentType: entry3.role === "admin" ? "admin" : entry3.role === "specialist" ? "specialist" : "public"
18862
- };
18863
- }
18864
- if (entry3.role === "admin") {
18865
- const adminUsers = entry3.adminUsers ?? [];
18866
- if (adminUsers.includes(senderId)) {
18867
- return { allowed: true, reason: "admin-binding", agentType: "admin" };
18868
- }
18869
- return { allowed: false, reason: "not-admin-user", agentType: "admin" };
18870
- }
18871
- if (isGroup && entry3.role === "public") {
18872
- const groupPolicy = entry3.groupPolicy ?? "disabled";
18873
- if (groupPolicy === "allowlist") {
18874
- const allowGroups = entry3.allowGroups ?? [];
18875
- if (allowGroups.includes(chatId)) {
18876
- return { allowed: true, reason: "group-allowlist-match", agentType: "public" };
18877
- }
18878
- return { allowed: false, reason: "not-in-allowGroups", agentType: "public" };
18879
- }
18880
- return { allowed: false, reason: "group-policy-disabled", agentType: "public" };
18881
- }
18882
- if (isChannel && entry3.role === "public") {
18883
- const channelPolicy = entry3.channelPolicy ?? "disabled";
18884
- if (channelPolicy === "allowlist") {
18885
- const allowChannels = entry3.allowChannels ?? [];
18886
- if (allowChannels.includes(chatId)) {
18887
- return { allowed: true, reason: "channel-allowlist-match", agentType: "public" };
18888
- }
18889
- return { allowed: false, reason: "not-in-allowChannels", agentType: "public" };
18890
- }
18891
- return { allowed: false, reason: "channel-policy-disabled", agentType: "public" };
18892
- }
18893
- if (entry3.role === "unbound") {
18894
- return { allowed: false, reason: "bot-unbound", agentType: "public" };
18895
- }
18896
- if (entry3.role === "specialist") {
18897
- const allowFrom = entry3.allowFrom ?? [];
18898
- if (allowFrom.includes(senderId)) {
18899
- return { allowed: true, reason: "specialist-allowlist-match", agentType: "specialist" };
18900
- }
18901
- return { allowed: false, reason: "not-in-allowlist", agentType: "specialist" };
18902
- }
18903
- const policy = entry3.dmPolicy ?? "disabled";
18904
- switch (policy) {
18905
- case "open":
18906
- return { allowed: true, reason: "dm-policy-open", agentType: "public" };
18907
- case "allowlist": {
18908
- const allowFrom = entry3.allowFrom ?? [];
18909
- if (allowFrom.includes(senderId)) {
18910
- return { allowed: true, reason: "allowlist-match", agentType: "public" };
18911
- }
18912
- return { allowed: false, reason: "not-in-allowlist", agentType: "public" };
18913
- }
18914
- case "disabled":
18915
- return { allowed: false, reason: "dm-policy-disabled", agentType: "public" };
18916
- default:
18917
- return { allowed: false, reason: "unknown-dm-policy", agentType: "public" };
18918
- }
18919
- }
18920
-
18921
18958
  // app/lib/telegram/managed-bot.ts
18922
18959
  function parseManagedBotUpdate(u) {
18923
18960
  const id = u?.bot?.id;
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-BY35JYDT.js";import"./useMediaQuery-e4ciNiuO.js";import"./useVoiceRecorder-D7_wLtrS.js";import"./AdminShell-Dm_nY4jF.js";import{n}from"./page-BBRWbFzG.js";import"./useCopyFeedback-1MKNUzp3.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1,2 +0,0 @@
1
- =`�o�Fݟ �8��0�/f ���&SE�ļR�-Q b�CȰ2�z�����(irIW��j=z��4�couf;@`��Γ��i)F��A�� ƊY��k�hw0���6os}��a�������, W0�/��uN����9g�O��S�s}����R��Y<�6�}踍���
2
- �q]ϛ��qZ��Ӎ�q��
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-BY35JYDT.js";import"./useMediaQuery-e4ciNiuO.js";import"./useVoiceRecorder-D7_wLtrS.js";import{t as n}from"./page-CdRrpkky.js";import"./graph-labels-BTFUSc63.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- @�j[�2�[x3M��-���.�.�@��ݔFa��tMgh��W�t���L��0����TU/.�� ʋ�}��^�Ç �d� "1Y��B�S.JpMq8�C���U��N��, '?��֕����%��ev/K��ʋ����:Mnlv���2� Q��V�x��,�Qڵ,��TL]JE�b�n��`