@rubytech/create-maxy-code 0.1.557 → 0.1.558

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 (72) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/PLUGIN.md +2 -1
  3. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts +1 -1
  4. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts.map +1 -1
  5. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js +7 -0
  6. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js.map +1 -1
  7. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +43 -1
  8. package/payload/platform/plugins/admin/skills/video-production/SKILL.md +106 -0
  9. package/payload/platform/plugins/admin/skills/video-production/__tests__/registration.sh +54 -0
  10. package/payload/platform/plugins/admin/skills/video-production/references/reel-authoring.md +83 -0
  11. package/payload/platform/plugins/admin/skills/video-production/render.mjs +429 -0
  12. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  13. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  14. package/payload/platform/plugins/docs/references/video-production.md +37 -0
  15. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  16. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +32 -0
  17. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  18. package/payload/platform/templates/specialists/agents/content-producer.md +8 -0
  19. package/payload/server/public/assets/{AdminLoginScreens-DrF7rAcb.js → AdminLoginScreens-BUv_EOfw.js} +1 -1
  20. package/payload/server/public/assets/AdminLoginScreens-BUv_EOfw.js.br +0 -0
  21. package/payload/server/public/assets/AdminLoginScreens-BUv_EOfw.js.gz +0 -0
  22. package/payload/server/public/assets/{admin-CCB9k3GB.js → admin-BUor8KRy.js} +1 -1
  23. package/payload/server/public/assets/admin-BUor8KRy.js.br +0 -0
  24. package/payload/server/public/assets/admin-BUor8KRy.js.gz +0 -0
  25. package/payload/server/public/assets/chat-D7LjNerV.js +1 -0
  26. package/payload/server/public/assets/chat-D7LjNerV.js.br +0 -0
  27. package/payload/server/public/assets/chat-D7LjNerV.js.gz +0 -0
  28. package/payload/server/public/assets/data-BU60tJiv.js +1 -0
  29. package/payload/server/public/assets/data-BU60tJiv.js.br +0 -0
  30. package/payload/server/public/assets/data-BU60tJiv.js.gz +0 -0
  31. package/payload/server/public/assets/{operator-B0oOVB8R.js → operator-t15ZvJER.js} +1 -1
  32. package/payload/server/public/assets/operator-t15ZvJER.js.br +0 -0
  33. package/payload/server/public/assets/operator-t15ZvJER.js.gz +0 -0
  34. package/payload/server/public/assets/{page-DrbfHSQ9.js → page-CogD1Hho.js} +1 -1
  35. package/payload/server/public/assets/page-CogD1Hho.js.br +0 -0
  36. package/payload/server/public/assets/page-CogD1Hho.js.gz +0 -0
  37. package/payload/server/public/assets/{page-Dfce3YQd.js → page-DcKH1PVD.js} +1 -1
  38. package/payload/server/public/assets/page-DcKH1PVD.js.br +0 -0
  39. package/payload/server/public/assets/page-DcKH1PVD.js.gz +0 -0
  40. package/payload/server/public/assets/{public-DJwMfl-4.js → public-UlLvs9vV.js} +1 -1
  41. package/payload/server/public/assets/public-UlLvs9vV.js.br +0 -0
  42. package/payload/server/public/assets/public-UlLvs9vV.js.gz +0 -0
  43. package/payload/server/public/assets/useVoiceRecorder-q9U5ahfg.js +2 -0
  44. package/payload/server/public/assets/useVoiceRecorder-q9U5ahfg.js.br +0 -0
  45. package/payload/server/public/assets/useVoiceRecorder-q9U5ahfg.js.gz +0 -0
  46. package/payload/server/public/chat.html +3 -3
  47. package/payload/server/public/data.html +3 -3
  48. package/payload/server/public/index.html +4 -4
  49. package/payload/server/public/operator.html +4 -4
  50. package/payload/server/public/public.html +3 -3
  51. package/payload/server/server.js +93 -42
  52. package/payload/server/public/assets/AdminLoginScreens-DrF7rAcb.js.br +0 -0
  53. package/payload/server/public/assets/AdminLoginScreens-DrF7rAcb.js.gz +0 -0
  54. package/payload/server/public/assets/admin-CCB9k3GB.js.br +0 -0
  55. package/payload/server/public/assets/admin-CCB9k3GB.js.gz +0 -0
  56. package/payload/server/public/assets/chat-BgOUm7r1.js +0 -1
  57. package/payload/server/public/assets/chat-BgOUm7r1.js.br +0 -0
  58. package/payload/server/public/assets/chat-BgOUm7r1.js.gz +0 -0
  59. package/payload/server/public/assets/data-YEC6LkxI.js +0 -1
  60. package/payload/server/public/assets/data-YEC6LkxI.js.br +0 -0
  61. package/payload/server/public/assets/data-YEC6LkxI.js.gz +0 -0
  62. package/payload/server/public/assets/operator-B0oOVB8R.js.br +0 -0
  63. package/payload/server/public/assets/operator-B0oOVB8R.js.gz +0 -0
  64. package/payload/server/public/assets/page-Dfce3YQd.js.br +0 -0
  65. package/payload/server/public/assets/page-Dfce3YQd.js.gz +0 -0
  66. package/payload/server/public/assets/page-DrbfHSQ9.js.br +0 -0
  67. package/payload/server/public/assets/page-DrbfHSQ9.js.gz +0 -0
  68. package/payload/server/public/assets/public-DJwMfl-4.js.br +0 -0
  69. package/payload/server/public/assets/public-DJwMfl-4.js.gz +0 -0
  70. package/payload/server/public/assets/useVoiceRecorder-9qVOHhkb.js +0 -2
  71. package/payload/server/public/assets/useVoiceRecorder-9qVOHhkb.js.br +0 -0
  72. package/payload/server/public/assets/useVoiceRecorder-9qVOHhkb.js.gz +0 -0
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-render-Bwg_xv1L.js","assets/preload-helper-BJ2zoBc3.js"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./chunk-CltuBf4Z.js";import{B as t,G as n,Z as r,a as i,ct as a,d as o,i as s,j as c,nt as l,v as u,w as d,x as f}from"./useMediaQuery-DIm6yGOl.js";import{t as p}from"./copy-CG2tAK16.js";import{t as m}from"./play-Bankj0zU.js";import{t as h}from"./preload-helper-BJ2zoBc3.js";var g=`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`,_=new Set(g.split(`,`).filter(e=>!e.startsWith(`.`))),v=50*1024*1024;function y(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var b=r(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),x=r(`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`}]]),S=r(`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`}]]),C=r(`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`}]]),w=r(`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`}]]),T=r(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),E=r(`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`}]]),D=e(a(),1),O=l(),k=200;function ee({children:e,tail:t=null,repinSignals:n,onReachTop:r,prependToken:i=0}){let a=(0,D.useRef)(null),o=(0,D.useRef)(null),s=(0,D.useRef)(!0),[c,l]=(0,D.useState)(!0),u=(0,D.useRef)(0),d=(0,D.useRef)(0),f=(0,D.useRef)(!1),p=(0,D.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<=k;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,D.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,D.useLayoutEffect)(()=>{let e=a.current;e&&s.current&&(e.scrollTop=e.scrollHeight),e&&(d.current=e.scrollHeight,u.current=e.clientHeight)},[...n,g]),(0,D.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,O.jsxs)(`div`,{className:`wa-reader`,children:[(0,O.jsx)(`div`,{className:`wa-reader-thread`,ref:a,onScroll:m,children:(0,O.jsxs)(`div`,{className:`wa-thread-scroll`,ref:o,children:[e,t]})}),!c&&(0,O.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:h,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var A={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.`},j={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 M(e,t=`admin`){return t===`public`?j[e]:A[e]}function te(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var N=56,P=5;function ne(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 re({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let a=(0,D.useRef)(null),o=(0,D.useRef)(null),s=(0,D.useRef)(!1),[c,l]=(0,D.useState)([]),[u,d]=(0,D.useState)(void 0),[f,p]=(0,D.useState)(!1),[h,g]=(0,D.useState)(0),[_,v]=(0,D.useState)(0);(0,D.useEffect)(()=>{let t=!1,r=null,i=window.AudioContext??window.webkitAudioContext,a=()=>{t||s.current||(s.current=!0,n())};if(!i){a();return}let o=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),d(r);let a=await o.decodeAudioData(await i.arrayBuffer());if(t)return;l(ne(a.getChannelData(0),N)),Number.isFinite(a.duration)&&a.duration>0&&v(a.duration)}catch{a()}finally{try{o.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let y=()=>{let e=a.current;e&&(f?e.pause():Promise.resolve(e.play()).catch(()=>{}))},b=e=>{let t=a.current;if(!t||!(_>0))return;let n=Math.min(_,Math.max(0,e));t.currentTime=n,g(n)},x=e=>{let t=o.current;if(!t||!(_>0))return;let n=t.getBoundingClientRect();b(Math.min(1,Math.max(0,(e-n.left)/n.width))*_)},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(!(_>0))return;let t=a.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:b(t+P),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:b(t-P),e.preventDefault();break;case`Home`:b(0),e.preventDefault();break;case`End`:b(_),e.preventDefault();break;default:break}},T=_>0?Math.min(1,h/_):0,E=Math.round(T*N),k=i(h>0?h:_);return(0,O.jsxs)(`div`,{className:`voice-note`,children:[(0,O.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${f?`Pause`:`Play`} ${t}`,onClick:y,children:f?(0,O.jsx)(w,{size:16,"aria-hidden":!0}):(0,O.jsx)(m,{size:16,"aria-hidden":!0})}),(0,O.jsx)(`div`,{ref:o,className:`voice-note-bars`,role:`slider`,tabIndex:0,"aria-label":`Seek ${t}`,"aria-valuemin":0,"aria-valuemax":Math.round(_),"aria-valuenow":Math.round(h),onMouseDown:S,onKeyDown:C,children:(c.length?c:Array.from({length:N},()=>0)).map((e,t)=>(0,O.jsx)(`span`,{className:`voice-note-bar${t<E?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,O.jsx)(`span`,{className:`voice-note-time`,children:k}),(0,O.jsx)(`audio`,{ref:a,className:`voice-note-audio`,preload:`metadata`,src:u,"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&&v(t)},onTimeUpdate:e=>g(e.currentTarget.currentTime)})]})}var F=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,I=/\.pdf$/i;function ie(e,t){return(t?t.startsWith(`image/`):F.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:I.test(e))?`pdf`:`file`}function ae(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 L(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function oe(e,t,n){return`/api/admin/session-upload?session_key=${encodeURIComponent(n)}&session_id=${encodeURIComponent(e)}&file=${encodeURIComponent(t)}`}function R(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 z({href:e,filename:t,label:n}){return(0,O.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,O.jsx)(C,{size:14,"aria-hidden":!0}),n]})}function B({href:e,filename:t,className:r,size:i=14,onClick:a}){return(0,O.jsx)(`a`,{className:r,href:e,download:t,"aria-label":`Download ${t}`,onClick:a,children:(0,O.jsx)(n,{size:i,"aria-hidden":!0})})}function se({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,D.useState)(!1),[s,c]=(0,D.useState)(!1),l=n==null?t:`${t} · ${R(n)}`;return s?(0,O.jsx)(z,{href:e,filename:t,label:l}):(0,O.jsxs)(O.Fragment,{children:[(0,O.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,O.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,O.jsx)(B,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,O.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,O.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var ce=280,le=360,ue=16;function V({src:e,filename:n,sizeBytes:r,onFail:i}){let[a,o]=(0,D.useState)(!1),[s,c]=(0,D.useState)(!1),l=(0,D.useRef)(null),u=r==null?n:`${n} · ${R(r)}`;return(0,D.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await h(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-Bwg_xv1L.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,ce,le)}catch{t||(c(!0),i?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),s?(0,O.jsx)(z,{href:e,filename:n,label:u}):(0,O.jsxs)(O.Fragment,{children:[(0,O.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,O.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":n}),(0,O.jsx)(B,{href:e,filename:n,className:`chat-attachment-download`}),(0,O.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${n}`,onClick:()=>o(!0),children:(0,O.jsx)(t,{size:14,"aria-hidden":!0})})]}),a&&(0,O.jsx)(de,{src:e,filename:n,label:u,onClose:()=>o(!1),onFail:i})]})}function de({src:e,filename:t,label:n,onClose:r,onFail:i}){let a=(0,D.useRef)(null),o=(0,D.useRef)(null),[s,l]=(0,D.useState)(null),[u,d]=(0,D.useState)(!1);return(0,D.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await h(async()=>{let{loadPdf:e}=await import(`./pdf-render-Bwg_xv1L.js`);return{loadPdf:e}},__vite__mapDeps([0,1])),r=await n(e);if(t){try{r.destroy()}catch{}return}o.current=r,l(r.numPages)}catch{t||(d(!0),i?.(`render`))}})(),()=>{t=!0;try{o.current?.destroy()}catch{}}},[e]),(0,D.useEffect)(()=>{if(s==null)return;let e=a.current,t=o.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await h(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-Bwg_xv1L.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-ue*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}},[s]),(0,O.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,O.jsx)(`div`,{ref:a,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,O.jsx)(z,{href:e,filename:t,label:n}):Array.from({length:s??0},(e,n)=>(0,O.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,O.jsx)(B,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,O.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,O.jsx)(c,{size:20,"aria-hidden":!0})})]})}function fe({src:e,filename:t,onFail:n}){let[r,i]=(0,D.useState)(!1);return r?(0,O.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,O.jsx)(re,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function H({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=ie(e,n);(0,D.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,O.jsx)(se,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,O.jsx)(fe,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,O.jsx)(V,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${R(r)}`;return t?(0,O.jsx)(z,{href:t,filename:e,label:c}):(0,O.jsxs)(`p`,{className:`chat-doc`,children:[(0,O.jsx)(C,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}var pe=/^-?\d+(\.\d+)?,-?\d+(\.\d+)?$/,me=/^\[(?:live )?location: (.+)\]$/;function U(e){let t=me.exec(e.trim());if(!t)return{kind:`none`};let n=t[1].split(` — `),r=n[n.length-1].trim();if(!pe.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}}function he(e,t,n=16){let r=2**n,i=(t+180)/360*r,a=(1-Math.asinh(Math.tan(e*Math.PI/180))/Math.PI)/2*r,o=Math.round(i)-1,s=(o%r+r)%r,c=Math.min(Math.max(Math.round(a)-1,0),r-2);return{tiles:[{x:s,y:c},{x:(s+1)%r,y:c},{x:s,y:c+1},{x:(s+1)%r,y:c+1}].map(e=>({...e,url:`https://tile.openstreetmap.org/${n}/${e.x}/${e.y}.png`})),offsetX:i*256-o*256,offsetY:a*256-c*256}}var W=0,G=0;function ge(){return{maps:W,tileErrors:G}}function _e({lat:e,lon:t,msgKeyId:n}){let{tiles:r,offsetX:i,offsetY:a}=he(e,t);return(0,D.useEffect)(()=>(W+=1,()=>{--W}),[]),(0,O.jsx)(`a`,{className:`wa-map`,href:`https://www.openstreetmap.org/?mlat=${e}&mlon=${t}#map=16/${e}/${t}`,target:`_blank`,rel:`noopener noreferrer`,style:{width:240,height:160},children:(0,O.jsxs)(`span`,{className:`wa-map-viewport`,children:[(0,O.jsx)(`span`,{className:`wa-map-block`,style:{left:`calc(50% - ${i}px)`,top:`calc(50% - ${a}px)`},children:r.map(e=>(0,O.jsx)(`img`,{className:`wa-map-tile`,src:e.url,alt:``,width:256,height:256,loading:`lazy`,onError:()=>{G+=1}},e.url))}),(0,O.jsx)(`span`,{className:`wa-map-pin`,"aria-hidden":!0}),(0,O.jsx)(`span`,{className:`wa-map-credit`,children:`© OpenStreetMap contributors`})]})})}function K({text:e,body:t,msgKeyId:n}){let r=U(e);return(0,O.jsxs)(O.Fragment,{children:[r.kind===`point`&&(0,O.jsx)(_e,{lat:r.lat,lon:r.lon,msgKeyId:n}),(0,O.jsx)(`p`,{className:`wa-body`,children:t})]})}function ve(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=U(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}}var ye=20;function be(e){let t=e.replace(/\/(store-)?stream$/,(e,t)=>t?`/store-backfill`:`/backfill`);return t===e?``:t}function q(e,...t){let[n,r,i,a]=t,[o,s]=(0,D.useState)([]),[c,l]=(0,D.useState)(null),[u,d]=(0,D.useState)(!1),[f,p]=(0,D.useState)(0),m=(0,D.useRef)(!1);(0,D.useEffect)(()=>{s([]),l(null),d(!1),p(0),m.current=!1},[a,n,r,i,e]);let h=(0,D.useCallback)(e=>l(e),[]),g=(0,D.useCallback)(()=>{!e||c===null||c<=0||m.current||(m.current=!0,d(!0),(async()=>{let t=c,a=[],o=0;try{for(;t>0&&a.length===0&&o<ye;){o+=1;let s=await fetch(`${e}?${Se(e,n,r,i,t)}`);if(!s.ok)break;let c=await s.json();if(!Array.isArray(c.turns))break;a.unshift(...c.turns);let l=c.reachedStart?0:c.from;if(!c.reachedStart&&l>=t){xe(e,t,c.from);break}t=l}}catch{}finally{a.length>0&&(s(e=>[...a,...e]),p(e=>e+1)),l(t),m.current=!1,d(!1)}})())},[e,n,r,i,c]);return{turns:o,hasOlder:c!==null&&c>0,loadingOlder:u,prependCount:f,loadOlder:g,setTurns:s,onWindow:h}}function xe(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 Se(e,t,n,r,i){let a=e.endsWith(`/store-backfill`);return new URLSearchParams(a?{accountId:t,remoteJid:n,session_key:r,before:String(i)}:{sessionId:t,projectDir:n,session_key:r,before:String(i)}).toString()}function Ce(e,t,n,r=`/api/session-reader/stream`,i=e,a=!0){let[o,s]=(0,D.useState)([]),[c,l]=(0,D.useState)(`open`),[u,d]=(0,D.useState)(null),f=q(be(r),e,t,n,i),{onWindow:p}=f,m=(0,D.useRef)([]);return(0,D.useEffect)(()=>{m.current=o},[o]),(0,D.useEffect)(()=>{s([]),m.current=[],d(null)},[i,t,n,r]),(0,D.useEffect)(()=>{if(l(`open`),!a)return;let i=m.current.slice(),o=i.map(we),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&&we(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,D.useMemo)(()=>[...f.turns,...o],[f.turns,o]),status:c,subagentActivity:u,hasOlder:f.hasOlder,loadingOlder:f.loadingOlder,prependCount:f.prependCount,loadOlder:f.loadOlder}}function we(e){return JSON.stringify(e)}function Te(e,t,n,r=!0){let[i,a]=(0,D.useState)([]),[o,s]=(0,D.useState)(`open`),c=q(`/api/whatsapp-reader/store-backfill`,e,t,n,`${e}|${t}`),{onWindow:l,setTurns:u}=c;return(0,D.useEffect)(()=>{if(a([]),s(`open`),!r||!e||!t)return;let i=`/api/whatsapp-reader/store-stream?accountId=${encodeURIComponent(e)}&remoteJid=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,o=new EventSource(i);return o.onopen=()=>s(`open`),o.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>[...e,t])},o.addEventListener(`window`,e=>{try{let t=JSON.parse(e.data);typeof t.from==`number`&&l(t.from)}catch{}}),o.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);a(n),u(n)}),o.onerror=()=>{o.readyState===2&&s(`error`)},()=>o.close()},[e,t,n,r,l,u]),{turns:(0,D.useMemo)(()=>[...c.turns,...i].sort((e,t)=>String(e.ts??``).localeCompare(String(t.ts??``))),[c.turns,i]),status:o,hasOlder:c.hasOlder,loadingOlder:c.loadingOlder,prependCount:c.prependCount,loadOlder:c.loadOlder}}var Ee=e=>{if(!e)return 1/0;let t=new Date(e).getTime();return Number.isNaN(t)?1/0:t};function De(e,t){let n=[],r=0;return e.forEach((e,t)=>n.push({sort:Ee(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:Ee(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 Oe(e,t,n=!0){let[r,i]=(0,D.useState)([]);return(0,D.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 ke=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`agent-send-party`,`whatsapp-persisted`]),Ae=[`#c2185b`,`#7b1fa2`,`#512da8`,`#303f9f`,`#1976d2`,`#0288d1`,`#0097a7`,`#00796b`,`#388e3c`,`#689f38`,`#af6c00`,`#e64a19`,`#5d4037`,`#455a64`,`#d81b60`,`#8e24aa`,`#3949ab`,`#039be5`,`#00897b`,`#6d4c41`];function je(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}function Me(e){return Ae[je(e)%Ae.length]}function Ne({accountId:e,jid:t,sessionKey:n,className:r=`wa-web-avatar`,size:i=20}){let[a,o]=(0,D.useState)(null);if(!t||a===t)return(0,O.jsx)(`span`,{className:r,"aria-hidden":!0,children:(0,O.jsx)(E,{size:i})});let s=`/api/whatsapp-reader/avatar?session_key=${encodeURIComponent(n)}&accountId=${encodeURIComponent(e)}&jid=${encodeURIComponent(t)}`;return(0,O.jsx)(`span`,{className:r,"aria-hidden":!0,children:(0,O.jsx)(`img`,{className:`wa-avatar-img`,src:s,alt:``,onError:()=>o(t)})})}function J(e,t){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=d(n,t);return`${String(r.hh).padStart(2,`0`)}:${String(r.mm).padStart(2,`0`)}`}function Y(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var Pe=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],Fe=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function X(e,t){if(!e)return null;let n=new Date(e);return Number.isNaN(n.getTime())?null:f(n,t)}function Ie(e,t,n=new Date){if(!e)return``;let r=new Date(e);if(Number.isNaN(r.getTime()))return``;let i=f(r,t);if(i===f(n,t))return`Today`;let a=d(n,t);if(i===f(new Date(Date.UTC(a.y,a.m-1,a.d)-864e5),`UTC`))return`Yesterday`;let o=d(r,t);return`${Pe[new Date(Date.UTC(o.y,o.m-1,o.d)).getUTCDay()]} ${o.d} ${Fe[o.m-1]} ${o.y}`}function Le(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function Re({ts:e,prevTs:t=null}){let{zone:n}=u(),r=X(e,n);return r===null||t!==null&&X(t,n)===r?null:(0,O.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,O.jsx)(`span`,{className:`day-divider-label`,children:Ie(e,n)})})}function ze({ts:e,className:t}){let{zone:n}=u();return(0,O.jsx)(`time`,{className:t,children:J(e,n)})}function Be(){return(0,O.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,O.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function Z({label:e,ts:t,colour:n}){let{zone:r}=u();return(0,O.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,O.jsx)(`span`,{className:`wa-who`,style:n?{color:n}:void 0,children:e}),(0,O.jsx)(`time`,{className:`wa-time`,children:J(t,r)})]})}function Ve({turn:e}){let[t,n]=(0,D.useState)(!1),{zone:r}=u(),i=e.kind===`tool-result`,a=i?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,o=i?e.isError?`result (error)`:`result`:`↳ ${e.name}`,s=i?e.text:JSON.stringify(e.input,null,2);return(0,O.jsxs)(`div`,{className:a,children:[(0,O.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,O.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,O.jsx)(`span`,{className:`wa-who`,children:o}),(0,O.jsx)(`time`,{className:`wa-time`,children:J(e.ts,r)})]}),t&&(0,O.jsx)(`pre`,{className:`wa-code`,children:s})]})}function He({entry:e,sessionId:t,sessionKey:n}){let[r,i]=(0,D.useState)(!1),[a,o]=(0,D.useState)(null),{zone:s}=u(),c=()=>{let s=!r;if(i(s),s&&a===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(o).catch(()=>o(`(directive unavailable)`))}};return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,O.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":r,onClick:c,children:[(0,O.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,O.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,O.jsx)(`time`,{className:`wa-time`,children:J(e.ts,s)})]}),r&&(0,O.jsx)(`pre`,{className:`wa-code`,children:a??`Loading…`})]})}function Ue(e){return`text`in e&&typeof e.text==`string`?e.text:``}function We(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,O.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,O.jsx)(O.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 Ge(e,t,n){switch(e.kind){case`operator-inbound`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,O.jsx)(Z,{label:`Operator${te(e.source)}`,ts:e.ts}),e.text&&(0,O.jsx)(K,{text:e.text,body:e.text}),e.attachments&&e.attachments.length>0&&(0,O.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,O.jsx)(H,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:L(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))})]},t);case`operator-typed`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,O.jsx)(Z,{label:`Operator (web)`,ts:e.ts}),(0,O.jsx)(K,{text:e.text,body:e.text})]},t);case`agent-text`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,O.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,O.jsx)(K,{text:e.text,body:e.text})]},t);case`agent-reply`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,O.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,O.jsx)(K,{text:e.text,body:e.text})]},t);case`agent-send-party`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,O.jsx)(Z,{label:`Agent to ${e.phone}`,ts:e.ts}),(0,O.jsx)(K,{text:e.text,body:e.text})]},t);case`agent-reply-document`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,O.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,O.jsxs)(`p`,{className:`wa-doc`,children:[(0,O.jsx)(C,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(Y).join(`, `)]}),e.caption&&(0,O.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`agent-file`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,O.jsx)(Z,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=Y(t),a=e.downloads?.[r];return(0,O.jsx)(H,{expandable:!0,filename:i,href:a?ae(a,n.sessionId,n.sessionKey,I.test(i)?`inline`:void 0):void 0,telemetry:Q},r)}),e.caption&&(0,O.jsx)(`p`,{className:`wa-body`,children:e.caption})]},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&&o(e.senderJid)?e.senderJid:null;return(0,O.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,O.jsx)(Ne,{accountId:n.storeAccountId,jid:a,sessionKey:n.sessionKey,className:`wa-bubble-avatar`,size:14}),n.onReplyTo&&e.msgKeyId&&(0,O.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,O.jsx)(T,{size:14})}),n.showCopy&&e.text&&(0,O.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;s(t).then(e=>{e||console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`)})},children:(0,O.jsx)(p,{size:14})}),e.quoted&&(0,O.jsxs)(`div`,{className:`wa-quoted`,children:[(0,O.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,O.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,O.jsx)(Z,{label:i,ts:e.ts,colour:n.groupThread&&!e.fromMe?Me(e.senderTelephone||e.senderName||``):void 0}),e.text&&(0,O.jsx)(K,{text:e.text,body:We(e.text,n.highlight),msgKeyId:e.msgKeyId??void 0}),e.attachments&&e.attachments.length>0&&(0,O.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,O.jsx)(H,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:L(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))}),e.reactions&&e.reactions.length>0&&(0,O.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,O.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,O.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,O.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,O.jsx)(ze,{ts:e.ts,className:`wa-bubble-time`}),e.fromMe&&(0,O.jsx)(b,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,O.jsx)(Be,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,O.jsx)(Ve,{turn:e},t);case`agent-error`:return(0,O.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,O.jsx)(Z,{label:`Agent`,ts:e.ts}),(0,O.jsx)(`p`,{className:`wa-body wa-error-body`,children:M(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,O.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=[],d=null;return e.forEach((e,r)=>{let i=Le(e);i!==null&&!Number.isNaN(new Date(i).getTime())&&(u.push((0,O.jsx)(Re,{ts:i,prevTs:d},`day-${r}`)),d=i),u.push(e.kind===`turn`?Ge(e.turn,r,l):(0,O.jsx)(He,{entry:e.entry,sessionId:t,sessionKey:n},r))}),u}function Ke(e){return e.filter(e=>e.kind===`turn`&&ke.has(e.turn.kind)&&!(e.turn.kind===`operator-inbound`&&e.turn.scheduled))}var qe=(0,D.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:p,search:m,onReplyTo:h,groupThread:g=!1}){let _=!!p,v=Ce(e,t,n,s,u,!_),y=Te(p?.accountId??``,p?.remoteJid??``,n,_),{turns:b,status:x}=_?{turns:y.turns,status:y.status}:{turns:v.turns,status:v.status},S=_?y:v,C=_?null:v.subagentActivity;(0,D.useEffect)(()=>{f?.(C)},[C,f]),(0,D.useEffect)(()=>{d?.(b.length)},[b.length,d]);let w=De(b,Oe(e,n,!c)),T=a==null?!1:!!i,E=o||T?Ke(w):w,k=(m??``).trim().toLowerCase(),A=k.length>0,j=A?E.filter(e=>e.kind===`turn`&&Ue(e.turn).toLowerCase().includes(k)):E;return(0,D.useEffect)(()=>{if(!g||!_)return;let e=b.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=>Me(e))),new Set(e.filter(e=>!e.senderTelephone).map(e=>e.senderName??``)).size},[g,_,b,p?.remoteJid]),(0,D.useEffect)(()=>{let e=_?j:r===$?E:null;if(!e||ve(e).bodies===0)return;let{maps:t,tileErrors:n}=ge()},[_,j,E,r]),(0,O.jsxs)(ee,{repinSignals:[b,T,A],tail:l,onReachTop:S.hasOlder&&!A?S.loadOlder:void 0,prependToken:S.prependCount,children:[x===`error`&&(0,O.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),S.loadingOlder&&(0,O.jsx)(`div`,{className:`wa-reader-placeholder`,children:`Loading earlier messages…`}),!A&&b.length===0&&x===`open`&&(0,O.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),A&&j.length===0&&(0,O.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,m,`".`]}),_?$(j,e,n,`admin`,m,h,!0,g,p?.accountId):r(E,e,n)]})});function Je(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var Ye=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Xe(){for(let e of Ye)if(MediaRecorder.isTypeSupported(e))return e;return``}function Ze(e){return e.split(`;`)[0]}async function Qe(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function $e(e){let[t,n]=(0,D.useState)(`idle`),[r,i]=(0,D.useState)(0),[a,o]=(0,D.useState)(null),[s,c]=(0,D.useState)(null),l=(0,D.useRef)(null),u=(0,D.useRef)(null),d=(0,D.useRef)([]),f=(0,D.useRef)(``),p=(0,D.useRef)(null),m=(0,D.useRef)(0),h=(0,D.useRef)(0),g=(0,D.useRef)(null),_=(0,D.useRef)(null),v=(0,D.useRef)(0),y=(0,D.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,D.useEffect)(()=>y,[y]);let b=(0,D.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,D.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),S=(0,D.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,D.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),w=e?.onResult,T=(0,D.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=Xe();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,D.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]),O=(0,D.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),k=(0,D.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?(O(),null):(n(`sending`),x(),C(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Ze(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,O,x,C,y]);return(0,D.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:O,send:k}}export{y as A,w as C,g as D,x as E,v as O,T as S,S as T,L as _,He as a,M as b,Y as c,Le as d,Ne as f,I as g,F as h,Re as i,_ as k,X as l,V as m,$e as n,Be as o,H as p,Je as r,qe as s,Qe as t,J as u,ae as v,C as w,E as x,oe as y};
@@ -5,20 +5,20 @@
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-BgOUm7r1.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-D7LjNerV.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DIm6yGOl.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/AdminShell-BVKfxSgh.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BJ2zoBc3.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/copy-CG2tAK16.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/play-Bankj0zU.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-9qVOHhkb.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-q9U5ahfg.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Ae_va0Ps.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-CGsW9Vsp.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/file-text-47cIljhV.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-Dbj7NrEB.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/wrench-BmXV4Tmh.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-Dfce3YQd.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-DcKH1PVD.js">
22
22
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-HRgPNA8l.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
@@ -5,19 +5,19 @@
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-YEC6LkxI.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-BU60tJiv.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DIm6yGOl.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/graph-labels-Byp2RkVg.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BJ2zoBc3.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/copy-CG2tAK16.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/play-Bankj0zU.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-9qVOHhkb.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-q9U5ahfg.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/file-download-DiQesOd2.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-CGsW9Vsp.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/file-text-47cIljhV.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/triangle-alert-D7zwttJW.js">
20
- <link rel="modulepreload" crossorigin href="/assets/page-DrbfHSQ9.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/page-CogD1Hho.js">
21
21
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-HRgPNA8l.css">
22
22
  <link rel="stylesheet" href="/brand-defaults.css">
23
23
  </head>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-CCB9k3GB.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-BUor8KRy.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DIm6yGOl.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/graph-labels-Byp2RkVg.js">
@@ -13,13 +13,13 @@
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BJ2zoBc3.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/copy-CG2tAK16.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/play-Bankj0zU.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-9qVOHhkb.js">
17
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DrF7rAcb.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-q9U5ahfg.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BUv_EOfw.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/file-download-DiQesOd2.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-CGsW9Vsp.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/file-text-47cIljhV.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/triangle-alert-D7zwttJW.js">
22
- <link rel="modulepreload" crossorigin href="/assets/page-DrbfHSQ9.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/page-CogD1Hho.js">
23
23
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-HRgPNA8l.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -5,21 +5,21 @@
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-B0oOVB8R.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-t15ZvJER.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DIm6yGOl.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/AdminShell-BVKfxSgh.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BJ2zoBc3.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/copy-CG2tAK16.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/play-Bankj0zU.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-9qVOHhkb.js">
16
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DrF7rAcb.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-q9U5ahfg.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BUv_EOfw.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Ae_va0Ps.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-CGsW9Vsp.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/file-text-47cIljhV.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-Dbj7NrEB.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/wrench-BmXV4Tmh.js">
22
- <link rel="modulepreload" crossorigin href="/assets/page-Dfce3YQd.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/page-DcKH1PVD.js">
23
23
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-HRgPNA8l.css">
24
24
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
25
25
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -5,20 +5,20 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-DJwMfl-4.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-UlLvs9vV.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CltuBf4Z.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DIm6yGOl.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/AdminShell-BVKfxSgh.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BJ2zoBc3.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/copy-CG2tAK16.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/play-Bankj0zU.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-9qVOHhkb.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-q9U5ahfg.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-Ae_va0Ps.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/chevron-left-CGsW9Vsp.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/file-text-47cIljhV.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-Dbj7NrEB.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/wrench-BmXV4Tmh.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-Dfce3YQd.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-DcKH1PVD.js">
22
22
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-HRgPNA8l.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
@@ -1839,7 +1839,7 @@ var require_dist6 = __commonJS({
1839
1839
  import { readFileSync as readFileSync48, existsSync as existsSync52, watchFile, readdirSync as readdirSync30, statSync as statSync28 } from "fs";
1840
1840
  import { spawn as spawn3 } from "child_process";
1841
1841
  import { createHash as createHash7 } from "crypto";
1842
- import { resolve as resolve45, join as join57, basename as basename18 } from "path";
1842
+ import { resolve as resolve45, join as join57, basename as basename17 } from "path";
1843
1843
  import { homedir as homedir4 } from "os";
1844
1844
 
1845
1845
  // server/lib/route-cache-watchers.ts
@@ -2954,6 +2954,27 @@ function alignToRow(path, rawFrom, fileEnd) {
2954
2954
  if (nl === -1) return { from: rawFrom, aligned: false };
2955
2955
  return { from: rawFrom + nl + 1, aligned: true };
2956
2956
  }
2957
+ function backfillRangeStart(path, to, budget = TAIL_WINDOW_BYTES) {
2958
+ const rawFrom = Math.max(0, to - budget);
2959
+ if (rawFrom <= 0) return { from: 0, aligned: true };
2960
+ const span = Math.min(rawFrom, ALIGN_SCAN_MAX_BYTES);
2961
+ const start = rawFrom - span;
2962
+ let buf;
2963
+ try {
2964
+ buf = Buffer.alloc(span);
2965
+ const fd = openSync(path, "r");
2966
+ try {
2967
+ readSync(fd, buf, 0, span, start);
2968
+ } finally {
2969
+ closeSync(fd);
2970
+ }
2971
+ } catch {
2972
+ return { from: rawFrom, aligned: false };
2973
+ }
2974
+ const nl = buf.lastIndexOf(10);
2975
+ if (nl === -1) return start === 0 ? { from: 0, aligned: true } : { from: rawFrom, aligned: false };
2976
+ return { from: start + nl + 1, aligned: true };
2977
+ }
2957
2978
 
2958
2979
  // server/lib/turn-ctx-seed.ts
2959
2980
  import { openSync as openSync2, readSync as readSync2, closeSync as closeSync2 } from "fs";
@@ -3008,12 +3029,12 @@ function addBounded(set, id) {
3008
3029
  }
3009
3030
  set.add(id);
3010
3031
  }
3011
- function noteWindowedOpen(connId, windowed) {
3032
+ function noteWindowedOpen(transcriptId, windowed) {
3012
3033
  if (!windowed) return;
3013
- addBounded(windowedOpens, connId);
3034
+ addBounded(windowedOpens, transcriptId);
3014
3035
  }
3015
- function noteBackfill(connId) {
3016
- addBounded(sawBackfill, connId);
3036
+ function noteBackfill(transcriptId) {
3037
+ addBounded(sawBackfill, transcriptId);
3017
3038
  }
3018
3039
  function censusSnapshot() {
3019
3040
  let withBackfill = 0;
@@ -3041,6 +3062,14 @@ function fixtureBody() {
3041
3062
  message: { role: "assistant", content: [{ type: "text", text: `audit-${i}-${"x".repeat(400)}` }] }
3042
3063
  })
3043
3064
  );
3065
+ if (i === Math.floor(FIXTURE_ROWS / 2)) {
3066
+ rows.push(
3067
+ JSON.stringify({
3068
+ type: "assistant",
3069
+ message: { role: "assistant", content: [{ type: "text", text: `audit-fat-${"F".repeat(FIXTURE_BUDGET * 2)}` }] }
3070
+ })
3071
+ );
3072
+ }
3044
3073
  }
3045
3074
  return rows.join("\n") + "\n";
3046
3075
  }
@@ -3063,14 +3092,17 @@ function runReaderWindowAudit() {
3063
3092
  const older = [];
3064
3093
  let before = windowFrom;
3065
3094
  let guard = 0;
3095
+ let walkTerminated = true;
3066
3096
  while (before > 0) {
3067
- const rawFrom = tailWindowStart(before, FIXTURE_BUDGET);
3068
- const { from } = alignToRow(path, rawFrom, before);
3097
+ const { from } = backfillRangeStart(path, before, FIXTURE_BUDGET);
3069
3098
  const ctx = {};
3070
3099
  if (from > 0) seedTurnCtx(path, from, ctx);
3071
3100
  older.unshift(...parseTranscript(readRange(path, from, before).toString("utf8").split("\n"), /* @__PURE__ */ new Map(), ctx));
3072
3101
  before = from;
3073
- if (++guard > 1e3) break;
3102
+ if (++guard > 1e3) {
3103
+ walkTerminated = false;
3104
+ break;
3105
+ }
3074
3106
  }
3075
3107
  const assembled = older.concat(windowTurns);
3076
3108
  const assembledKeys = assembled.map(key);
@@ -3080,7 +3112,7 @@ function runReaderWindowAudit() {
3080
3112
  const gaps = fullKeys.filter((k) => !assembledSet.has(k)).length;
3081
3113
  const ordered = assembledKeys.length === fullKeys.length && assembledKeys.every((k, i) => k === fullKeys[i]);
3082
3114
  console.log(
3083
- `${TAG3} op=window-continuity fixture=synthetic full=${full.length} assembled=${assembled.length} duplicates=${duplicates} gaps=${gaps} ordered=${ordered}`
3115
+ `${TAG3} op=window-continuity fixture=synthetic full=${full.length} assembled=${assembled.length} duplicates=${duplicates} gaps=${gaps} ordered=${ordered} walkTerminated=${walkTerminated}`
3084
3116
  );
3085
3117
  const windowRef = parseTranscript(readRange(path, windowFrom, fileEnd).toString("utf8").split("\n"));
3086
3118
  const mismatched = windowTurns.reduce(
@@ -3090,8 +3122,8 @@ function runReaderWindowAudit() {
3090
3122
  console.log(
3091
3123
  `${TAG3} op=window-kinds fixture=synthetic windowTurns=${windowTurns.length} mismatched=${mismatched}`
3092
3124
  );
3093
- const ok2 = duplicates === 0 && gaps === 0 && ordered && mismatched === 0;
3094
- return `continuity=${ok2 ? "ok" : "FAILED"} full=${full.length} assembled=${assembled.length} reach=${census.withBackfill}/${census.windowed}`;
3125
+ const ok2 = duplicates === 0 && gaps === 0 && ordered && walkTerminated && mismatched === 0;
3126
+ return `continuity=${ok2 ? "ok" : "FAILED"} full=${full.length} assembled=${assembled.length} walk=${walkTerminated ? "ok" : "STUCK"} reach=${census.withBackfill}/${census.windowed}`;
3095
3127
  } catch (err) {
3096
3128
  const reason = err instanceof Error ? err.message : String(err);
3097
3129
  console.error(`${TAG3} op=audit-failed reason=${reason.slice(0, 120)}`);
@@ -4581,11 +4613,11 @@ function findExistingJsonlForSessionId(claudeConfigDir2, sessionId) {
4581
4613
  } catch {
4582
4614
  return null;
4583
4615
  }
4584
- const basename19 = `${sessionId}.jsonl`;
4616
+ const basename18 = `${sessionId}.jsonl`;
4585
4617
  for (const slug of slugs) {
4586
- const live = join8(projectsRoot, slug, basename19);
4618
+ const live = join8(projectsRoot, slug, basename18);
4587
4619
  if (existsSync3(live)) return live;
4588
- const archived = join8(projectsRoot, slug, "archive", basename19);
4620
+ const archived = join8(projectsRoot, slug, "archive", basename18);
4589
4621
  if (existsSync3(archived)) return archived;
4590
4622
  }
4591
4623
  return null;
@@ -4783,6 +4815,7 @@ async function resolveOperatorNamesBySender(users, admins, senderIds) {
4783
4815
 
4784
4816
  // server/routes/admin/sidebar-sessions.ts
4785
4817
  var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl$/i;
4818
+ var SIDECAR_META_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.meta\.json$/i;
4786
4819
  function lastAssistantModel(body) {
4787
4820
  const lines = body.split("\n");
4788
4821
  for (let i = lines.length - 1; i >= 0; i--) {
@@ -4835,7 +4868,7 @@ function findSessionProjectDir(sessionId) {
4835
4868
  const jsonlPath = findExistingJsonlForSessionId(cfg, sessionId);
4836
4869
  return jsonlPath ? dirname(jsonlPath) : null;
4837
4870
  }
4838
- function enumerateJsonlsWithSkips(projectsRoot) {
4871
+ function enumerateJsonlsWithSkips(projectsRoot, fileRe = SESSION_ID_RE) {
4839
4872
  const out = [];
4840
4873
  let skipped = 0;
4841
4874
  let slugs;
@@ -4857,7 +4890,7 @@ function enumerateJsonlsWithSkips(projectsRoot) {
4857
4890
  continue;
4858
4891
  }
4859
4892
  for (const entry of entries2) {
4860
- if (entry.isFile() && SESSION_ID_RE.test(entry.name)) {
4893
+ if (entry.isFile() && fileRe.test(entry.name)) {
4861
4894
  out.push({ path: join10(slugDir, entry.name), isSubagent: false, archived: false });
4862
4895
  } else if (entry.isDirectory() && entry.name === "subagents") {
4863
4896
  const subDir = join10(slugDir, entry.name);
@@ -4871,7 +4904,7 @@ function enumerateJsonlsWithSkips(projectsRoot) {
4871
4904
  continue;
4872
4905
  }
4873
4906
  for (const sub of subEntries) {
4874
- if (sub.isFile() && SESSION_ID_RE.test(sub.name)) {
4907
+ if (sub.isFile() && fileRe.test(sub.name)) {
4875
4908
  out.push({ path: join10(subDir, sub.name), isSubagent: true, archived: false });
4876
4909
  }
4877
4910
  }
@@ -4887,7 +4920,7 @@ function enumerateJsonlsWithSkips(projectsRoot) {
4887
4920
  continue;
4888
4921
  }
4889
4922
  for (const arc of archiveEntries) {
4890
- if (arc.isFile() && SESSION_ID_RE.test(arc.name)) {
4923
+ if (arc.isFile() && fileRe.test(arc.name)) {
4891
4924
  out.push({ path: join10(archiveDir, arc.name), isSubagent: false, archived: true });
4892
4925
  }
4893
4926
  }
@@ -4899,6 +4932,9 @@ function enumerateJsonlsWithSkips(projectsRoot) {
4899
4932
  function enumerateJsonls(projectsRoot) {
4900
4933
  return enumerateJsonlsWithSkips(projectsRoot).files;
4901
4934
  }
4935
+ function enumerateSessionSidecars(projectsRoot) {
4936
+ return enumerateJsonlsWithSkips(projectsRoot, SIDECAR_META_RE).files;
4937
+ }
4902
4938
  async function fetchLiveSessions() {
4903
4939
  const out = /* @__PURE__ */ new Map();
4904
4940
  let port2;
@@ -10651,8 +10687,7 @@ app5.get("/store-backfill", requireAdminSession, (c) => {
10651
10687
  console.log(`[wa-reader] op=store-backfill remoteJid=${remoteJid} from=0 to=0 turns=0 bytes=0 reachedStart=true`);
10652
10688
  return c.json({ turns: [], from: 0, reachedStart: true });
10653
10689
  }
10654
- const rawFrom = tailWindowStart(to, TAIL_WINDOW_BYTES);
10655
- const { from, aligned } = alignToRow(file, rawFrom, to);
10690
+ const { from, aligned } = backfillRangeStart(file, to, TAIL_WINDOW_BYTES);
10656
10691
  const records = [];
10657
10692
  const reactionRecords = [];
10658
10693
  let reactionScanBytes = 0;
@@ -10708,6 +10743,7 @@ app5.get("/store-backfill", requireAdminSession, (c) => {
10708
10743
  const fold = foldReactions(reactionRecords);
10709
10744
  const turns = records.map((m) => toTurn(m, fold.get(m.msgKeyId)));
10710
10745
  const reachedStart = from === 0;
10746
+ noteBackfill(remoteJid.slice(0, 12));
10711
10747
  console.log(
10712
10748
  `[wa-reader] op=store-backfill remoteJid=${remoteJid} from=${from} to=${to} turns=${turns.length} bytes=${to - from} aligned=${aligned} reactionScanBytes=${reactionScanBytes} quoteResolved=${q2.found.size} quoteMissing=${wanted.size - q2.found.size} quoteCapped=${q2.capped} reachedStart=${reachedStart}`
10713
10749
  );
@@ -10775,6 +10811,7 @@ data: ${JSON.stringify(payload)}
10775
10811
  if (offset === 0) {
10776
10812
  const rawFrom = tailWindowStart(fileEnd0, TAIL_WINDOW_BYTES);
10777
10813
  const { from: alignedFrom, aligned } = alignToRow(file, rawFrom, fileEnd0);
10814
+ noteWindowedOpen(remoteJid.slice(0, 12), alignedFrom > 0);
10778
10815
  controller.enqueue(
10779
10816
  encoder.encode(`event: window
10780
10817
  data: ${JSON.stringify({ from: alignedFrom, fileEnd: fileEnd0 })}
@@ -11409,7 +11446,7 @@ data: ${JSON.stringify({ from: alignedFrom, fileEnd: fileEnd0 })}
11409
11446
 
11410
11447
  `)
11411
11448
  );
11412
- noteWindowedOpen(connId, windowed);
11449
+ noteWindowedOpen(sessionId.slice(0, 8), windowed);
11413
11450
  try {
11414
11451
  const { buf, end } = readFrom(jsonlPath, alignedFrom);
11415
11452
  offset = end;
@@ -11524,8 +11561,7 @@ app6.get("/backfill", requireAdminSession, (c) => {
11524
11561
  console.log(`[wa-stream] op=backfill conn=${connId} from=0 to=0 turns=0 bytes=0 reachedStart=true`);
11525
11562
  return c.json({ turns: [], from: 0, reachedStart: true });
11526
11563
  }
11527
- const rawFrom = tailWindowStart(to, TAIL_WINDOW_BYTES);
11528
- const { from, aligned } = alignToRow(jsonlPath, rawFrom, to);
11564
+ const { from, aligned } = backfillRangeStart(jsonlPath, to, TAIL_WINDOW_BYTES);
11529
11565
  const turnCtx = {};
11530
11566
  if (from > 0) seedTurnCtx(jsonlPath, from, turnCtx);
11531
11567
  let turns;
@@ -11539,7 +11575,7 @@ app6.get("/backfill", requireAdminSession, (c) => {
11539
11575
  return c.json({ error: "read-failed" }, 500);
11540
11576
  }
11541
11577
  const reachedStart = from === 0;
11542
- noteBackfill(connId);
11578
+ noteBackfill(sessionId.slice(0, 8));
11543
11579
  console.log(
11544
11580
  `[wa-stream] op=backfill conn=${connId} from=${from} to=${to} turns=${turns.length} bytes=${to - from} aligned=${aligned} reachedStart=${reachedStart}`
11545
11581
  );
@@ -12207,8 +12243,7 @@ app8.get("/backfill", (c) => {
12207
12243
  console.log(`${TAG19} op=backfill key=${senderShort} from=0 to=0 turns=0 bytes=0 reachedStart=true`);
12208
12244
  return c.json({ turns: [], from: 0, reachedStart: true });
12209
12245
  }
12210
- const rawFrom = tailWindowStart(to, TAIL_WINDOW_BYTES);
12211
- const { from, aligned } = alignToRow(jsonlPath, rawFrom, to);
12246
+ const { from, aligned } = backfillRangeStart(jsonlPath, to, TAIL_WINDOW_BYTES);
12212
12247
  const turnCtx = {};
12213
12248
  if (from > 0) seedTurnCtx(jsonlPath, from, turnCtx);
12214
12249
  let turns;
@@ -12226,6 +12261,7 @@ app8.get("/backfill", (c) => {
12226
12261
  return c.json({ error: "read-failed" }, 500);
12227
12262
  }
12228
12263
  const reachedStart = from === 0;
12264
+ noteBackfill(sessionId.slice(0, 8));
12229
12265
  console.log(
12230
12266
  `${TAG19} op=backfill key=${senderShort} from=${from} to=${to} turns=${turns.length} bytes=${to - from} dropped=${dropped} aligned=${aligned} reachedStart=${reachedStart}`
12231
12267
  );
@@ -12288,6 +12324,7 @@ data: ${JSON.stringify(turn)}
12288
12324
  console.log(
12289
12325
  `${TAG19} op=window key=${senderShort} fileBytes=${fileEnd0} budget=${TAIL_WINDOW_BYTES} rawFrom=${rawFrom} alignedFrom=${alignedFrom} aligned=${aligned} source=${windowed ? "windowed" : "full"}`
12290
12326
  );
12327
+ noteWindowedOpen(sessionId.slice(0, 8), windowed);
12291
12328
  const backlogCtx = {};
12292
12329
  if (windowed) {
12293
12330
  const seed = seedTurnCtx(jsonlPath, alignedFrom, backlogCtx);
@@ -32402,7 +32439,7 @@ function runPublicAddressCollisionAudit(deps) {
32402
32439
 
32403
32440
  // server/telegram-audit.ts
32404
32441
  import { statSync as statSync26 } from "fs";
32405
- import { basename as basename17, dirname as dirname17, join as join55 } from "path";
32442
+ import { join as join55 } from "path";
32406
32443
  function buildTelegramAuditLines(input) {
32407
32444
  const lines = [];
32408
32445
  const entries2 = input.accounts.flatMap(
@@ -32429,22 +32466,30 @@ function buildTelegramAuditLines(input) {
32429
32466
  if (!known.has(botId)) lines.push(`[telegram-audit] op=secret-orphan botId=${botId} side=file`);
32430
32467
  }
32431
32468
  for (const { accountId, entry } of entries2) {
32432
- const last = input.lastInboundByBot(entry.id);
32433
- const age = last === null ? "never" : String(input.now - last);
32469
+ const last = input.lastActivityByBot(entry.id);
32470
+ const spawnAge = last === null ? "never" : String(input.now - last.spawnMs);
32471
+ const turnAge = last === null || last.turnMs === null ? "never" : String(input.now - last.turnMs);
32434
32472
  const agent = entry.role === "admin" ? "admin" : entry.agent;
32435
32473
  const secretFile = input.secretFileExists(entry.id) ? "present" : "absent";
32436
32474
  lines.push(
32437
- `[telegram-audit] op=configured botId=${entry.id} accountId=${accountId} agent=${agent} secretFile=${secretFile} lastInboundAgeMs=${age}`
32475
+ `[telegram-audit] op=configured botId=${entry.id} accountId=${accountId} agent=${agent} secretFile=${secretFile} lastSpawnAgeMs=${spawnAge} lastTurnAgeMs=${turnAge}`
32438
32476
  );
32439
32477
  }
32440
32478
  return lines;
32441
32479
  }
32442
32480
  function newestTelegramSessionByBot() {
32443
32481
  const out = /* @__PURE__ */ new Map();
32444
- for (const { botId, mtime } of walkTelegramSidecars()) {
32482
+ for (const { botId, spawnMs, turnMs } of walkTelegramSidecars()) {
32445
32483
  if (botId === null) continue;
32446
32484
  const prev = out.get(botId);
32447
- if (prev === void 0 || mtime > prev) out.set(botId, mtime);
32485
+ if (prev === void 0) {
32486
+ out.set(botId, { spawnMs, turnMs });
32487
+ continue;
32488
+ }
32489
+ out.set(botId, {
32490
+ spawnMs: Math.max(prev.spawnMs, spawnMs),
32491
+ turnMs: prev.turnMs === null ? turnMs : turnMs === null ? prev.turnMs : Math.max(prev.turnMs, turnMs)
32492
+ });
32448
32493
  }
32449
32494
  return out;
32450
32495
  }
@@ -32459,27 +32504,33 @@ function* walkTelegramSidecars() {
32459
32504
  const cfg = claudeConfigDir();
32460
32505
  if (!cfg) return;
32461
32506
  const projectsRoot = join55(cfg, "projects");
32462
- for (const { path } of enumerateJsonls(projectsRoot)) {
32463
- const sessionId = basename17(path).replace(/\.jsonl$/, "");
32464
- const meta = readSidecarMeta(join55(dirname17(path), `${sessionId}.meta.json`));
32507
+ for (const { path } of enumerateSessionSidecars(projectsRoot)) {
32508
+ const meta = readSidecarMeta(path);
32465
32509
  if (meta.channel !== "telegram" || !meta.accountId) continue;
32466
- let mtime;
32510
+ let spawnMs;
32467
32511
  try {
32468
- mtime = statSync26(path).mtimeMs;
32512
+ spawnMs = statSync26(path).mtimeMs;
32469
32513
  } catch {
32470
32514
  continue;
32471
32515
  }
32516
+ let turnMs;
32517
+ try {
32518
+ turnMs = statSync26(path.replace(/\.meta\.json$/, ".jsonl")).mtimeMs;
32519
+ } catch {
32520
+ turnMs = null;
32521
+ }
32472
32522
  yield {
32473
32523
  accountId: meta.accountId,
32474
32524
  botId: parseTelegramChannelKey(meta.senderId ?? "")?.botId ?? null,
32475
- mtime
32525
+ spawnMs,
32526
+ turnMs
32476
32527
  };
32477
32528
  }
32478
32529
  }
32479
32530
 
32480
32531
  // server/telegram-migrate.ts
32481
32532
  import { readFileSync as readFileSync45, writeFileSync as writeFileSync18, existsSync as existsSync49, renameSync as renameSync11, mkdirSync as mkdirSync10 } from "fs";
32482
- import { dirname as dirname18, join as join56 } from "path";
32533
+ import { dirname as dirname17, join as join56 } from "path";
32483
32534
  function migrateTelegramTwoSlot(input) {
32484
32535
  const out = [];
32485
32536
  for (const account of input.accounts) {
@@ -32540,7 +32591,7 @@ function migrateTelegramTwoSlot(input) {
32540
32591
  }
32541
32592
  function moveSecret(from, to) {
32542
32593
  if (!existsSync49(from)) return;
32543
- mkdirSync10(dirname18(to), { recursive: true, mode: 448 });
32594
+ mkdirSync10(dirname17(to), { recursive: true, mode: 448 });
32544
32595
  renameSync11(from, to);
32545
32596
  }
32546
32597
 
@@ -34388,7 +34439,7 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
34388
34439
  secretFileExists: (botId) => existsSync52(secretPath(botId)),
34389
34440
  agentActive: isActiveAgentSlug,
34390
34441
  secretFilesOnDisk,
34391
- lastInboundByBot: (botId) => lastByBot.get(botId) ?? null,
34442
+ lastActivityByBot: (botId) => lastByBot.get(botId) ?? null,
34392
34443
  now: Date.now()
34393
34444
  });
34394
34445
  for (const line of lines) console.error(line);
@@ -34887,7 +34938,7 @@ try {
34887
34938
  } catch (err) {
34888
34939
  console.error(`[graph-health] account-enumeration unavailable reason=${err instanceof Error ? err.message : String(err)}`);
34889
34940
  }
34890
- var configDirForWhatsApp = basename18(MAXY_DIR) || ".maxy";
34941
+ var configDirForWhatsApp = basename17(MAXY_DIR) || ".maxy";
34891
34942
  var bootAccount = resolveAccount();
34892
34943
  if (bootAccount) {
34893
34944
  migrateRemovedConfigKeys(bootAccount.accountDir);
@@ -1 +0,0 @@
1
- import{nt as e,ot as t}from"./useMediaQuery-DIm6yGOl.js";import"./useVoiceRecorder-9qVOHhkb.js";import"./AdminShell-BVKfxSgh.js";import{n}from"./page-Dfce3YQd.js";import"./useCopyFeedback-Ae_va0Ps.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- import{nt as e,ot as t}from"./useMediaQuery-DIm6yGOl.js";import"./useVoiceRecorder-9qVOHhkb.js";import{t as n}from"./page-DrbfHSQ9.js";import"./graph-labels-Byp2RkVg.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));