@rubytech/create-maxy-code 0.1.483 → 0.1.484

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 (103) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/package-lock.json +271 -1
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +28 -21
  4. package/payload/platform/plugins/docs/references/google-guide.md +27 -20
  5. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js +76 -2
  6. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-send.test.js.map +1 -1
  7. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +1 -0
  8. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  9. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +1 -0
  10. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  11. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.d.ts.map +1 -1
  12. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js +87 -6
  13. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-send.js.map +1 -1
  14. package/payload/platform/plugins/google/.claude-plugin/plugin.json +1 -1
  15. package/payload/platform/plugins/google/PLUGIN.md +20 -1
  16. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +29 -1
  17. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -1
  18. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.d.ts +2 -0
  19. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.d.ts.map +1 -0
  20. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.js +92 -0
  21. package/payload/platform/plugins/google/mcp/dist/__tests__/consent-open.test.js.map +1 -0
  22. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.d.ts +61 -0
  23. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.d.ts.map +1 -0
  24. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.js +184 -0
  25. package/payload/platform/plugins/google/mcp/dist/auth/consent-open.js.map +1 -0
  26. package/payload/platform/plugins/google/mcp/dist/index.js +65 -2
  27. package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -1
  28. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +14 -0
  29. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -1
  30. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +16 -0
  31. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -1
  32. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  33. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  34. package/payload/platform/services/claude-session-manager/dist/http-server.js +18 -1
  35. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  36. package/payload/platform/services/claude-session-manager/dist/index.js +8 -0
  37. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  38. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.d.ts +13 -0
  39. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.d.ts.map +1 -0
  40. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.js +149 -0
  41. package/payload/platform/services/claude-session-manager/dist/subagent-injection-tail.js.map +1 -0
  42. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  43. package/payload/platform/services/telegram-channel/dist/instructions.js +17 -2
  44. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  45. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  46. package/payload/platform/services/webchat-channel/dist/instructions.js +17 -2
  47. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  48. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  49. package/payload/platform/services/whatsapp-channel/dist/server.js +16 -2
  50. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  51. package/payload/server/public/activity.html +6 -6
  52. package/payload/server/public/assets/{AdminLoginScreens-Jw45pvb2.js → AdminLoginScreens-DF9S5Rca.js} +1 -1
  53. package/payload/server/public/assets/AdminShell-B0PNDCAb.js +2 -0
  54. package/payload/server/public/assets/{Checkbox-D7_S2EUI.js → Checkbox-s5X6dso4.js} +1 -1
  55. package/payload/server/public/assets/activity-BRBsaalV.js +1 -0
  56. package/payload/server/public/assets/admin-rScqRq-R.js +1 -0
  57. package/payload/server/public/assets/{bot-GC7iZjtW.js → bot-BVO9Uqr_.js} +1 -1
  58. package/payload/server/public/assets/{browser-BI-wi3CM.js → browser-BVW4FFii.js} +1 -1
  59. package/payload/server/public/assets/calendar-CWsD3uLk.js +1 -0
  60. package/payload/server/public/assets/chat-DKGREuIO.js +1 -0
  61. package/payload/server/public/assets/chevron-down-m581tl1J.js +1 -0
  62. package/payload/server/public/assets/chevron-left-BAY0xfmR.js +1 -0
  63. package/payload/server/public/assets/chevron-right-Dy_REdYZ.js +1 -0
  64. package/payload/server/public/assets/data-TOWuhMFb.js +1 -0
  65. package/payload/server/public/assets/{graph-Cl72j3UC.js → graph-BEGs_P2m.js} +3 -3
  66. package/payload/server/public/assets/{graph-labels-7p-mVi9M.js → graph-labels-Axa04w8A.js} +1 -1
  67. package/payload/server/public/assets/{maximize-2-HcfeeOdJ.js → maximize-2-yucCepu_.js} +1 -1
  68. package/payload/server/public/assets/operator-911z_Fy_.js +1 -0
  69. package/payload/server/public/assets/page-6CZ8R57f.js +1 -0
  70. package/payload/server/public/assets/{page-DPQS0X5M.js → page-CgSgj8Cy.js} +3 -3
  71. package/payload/server/public/assets/{public-DAn13pnw.js → public-BzwveFwz.js} +1 -1
  72. package/payload/server/public/assets/{rotate-ccw-CCbbX5ef.js → rotate-ccw-BH51cf2Q.js} +1 -1
  73. package/payload/server/public/assets/tasks-21egY7A6.js +1 -0
  74. package/payload/server/public/assets/{time-entry-format-C-By1MbO.js → time-entry-format-DPdGkp1C.js} +1 -1
  75. package/payload/server/public/assets/{triangle-alert-BDtoi5R0.js → triangle-alert-DO2rjjfV.js} +1 -1
  76. package/payload/server/public/assets/useCopyFeedback-HMSM7-Ir.js +1 -0
  77. package/payload/server/public/assets/useSubAccountSwitcher-2ojOOYNo.css +1 -0
  78. package/payload/server/public/assets/{useSubAccountSwitcher-sPN6lobE.js → useSubAccountSwitcher-DLvqvfoc.js} +1 -1
  79. package/payload/server/public/assets/{useVoiceRecorder-DOFBQ2gP.js → useVoiceRecorder-BcukQIza.js} +1 -1
  80. package/payload/server/public/browser.html +4 -4
  81. package/payload/server/public/calendar.html +6 -6
  82. package/payload/server/public/chat.html +13 -13
  83. package/payload/server/public/data.html +10 -10
  84. package/payload/server/public/graph.html +11 -11
  85. package/payload/server/public/index.html +16 -16
  86. package/payload/server/public/operator.html +15 -15
  87. package/payload/server/public/public.html +13 -13
  88. package/payload/server/public/tasks.html +6 -6
  89. package/payload/server/server.js +87 -0
  90. package/payload/server/public/assets/AdminShell-DR6AzflZ.js +0 -2
  91. package/payload/server/public/assets/activity-CKbv3zFM.js +0 -1
  92. package/payload/server/public/assets/admin-DXUspIjz.js +0 -1
  93. package/payload/server/public/assets/calendar-DXnv4F7l.js +0 -1
  94. package/payload/server/public/assets/chat-CAdgaPW1.js +0 -1
  95. package/payload/server/public/assets/chevron-down-BCLf1wKu.js +0 -1
  96. package/payload/server/public/assets/chevron-left-BNtL-CjS.js +0 -1
  97. package/payload/server/public/assets/chevron-right-Bu5hsjy5.js +0 -1
  98. package/payload/server/public/assets/data-D7cYlorm.js +0 -1
  99. package/payload/server/public/assets/operator-C0iaGPNT.js +0 -1
  100. package/payload/server/public/assets/page-DsV3rID5.js +0 -1
  101. package/payload/server/public/assets/tasks-_Ij9BdOE.js +0 -1
  102. package/payload/server/public/assets/useCopyFeedback-CfbJc9iN.js +0 -1
  103. package/payload/server/public/assets/useSubAccountSwitcher-5jQsc23X.css +0 -1
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-render-CrpAi4Ba.js","assets/preload-helper-CT1Z6Pdu.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./chunk-TPjIAO9U.js";import{D as t,H as n,L as r,M as i,m as a,n as o}from"./useSubAccountSwitcher-sPN6lobE.js";import{n as s,t as c}from"./maximize-2-HcfeeOdJ.js";import{n as l,t as u}from"./time-entry-format-C-By1MbO.js";import{t as d}from"./preload-helper-CT1Z6Pdu.js";var f=`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`,p=new Set(f.split(`,`).filter(e=>!e.startsWith(`.`))),m=50*1024*1024;function h(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var g=i(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),_=i(`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`}]]),v=i(`file-text`,[[`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 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),y=i(`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`}]]),b=i(`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`}]]),x=i(`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`}]]),S=i(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),C=e(n(),1),w=r();function T({children:e,tail:t=null,repinSignals:n}){let r=(0,C.useRef)(null),i=(0,C.useRef)(null),a=(0,C.useRef)(!0),[o,s]=(0,C.useState)(!0),c=(0,C.useRef)(0),l=(0,C.useRef)(0),u=()=>{let e=r.current;if(!e)return;let t=e.clientHeight,n=e.scrollHeight,i=t!==c.current||n!==l.current;if(c.current=t,l.current=n,i){a.current&&(e.scrollTop=e.scrollHeight);return}let o=n-e.scrollTop-t<=32;a.current=o,s(e=>e===o?e:o)},d=()=>{let e=r.current;e&&(e.scrollTop=e.scrollHeight,l.current=e.scrollHeight,c.current=e.clientHeight,a.current=!0,s(!0))},f=t!=null;return(0,C.useLayoutEffect)(()=>{let e=r.current;e&&a.current&&(e.scrollTop=e.scrollHeight),e&&(l.current=e.scrollHeight,c.current=e.clientHeight)},[...n,f]),(0,C.useLayoutEffect)(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>u());return r.current&&e.observe(r.current),i.current&&e.observe(i.current),()=>e.disconnect()},[]),(0,w.jsxs)(`div`,{className:`wa-reader`,children:[(0,w.jsx)(`div`,{className:`wa-reader-thread`,ref:r,onScroll:u,children:(0,w.jsxs)(`div`,{className:`wa-thread-scroll`,ref:i,children:[e,t]})}),!o&&(0,w.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:d,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var E={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.`},D={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 O(e,t=`admin`){return t===`public`?D[e]:E[e]}function k(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var A=56,j=5;function ee(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 te({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let i=(0,C.useRef)(null),a=(0,C.useRef)(null),o=(0,C.useRef)(!1),[s,c]=(0,C.useState)([]),[d,f]=(0,C.useState)(void 0),[p,m]=(0,C.useState)(!1),[h,g]=(0,C.useState)(0),[_,v]=(0,C.useState)(0);(0,C.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),f(r);let a=await s.decodeAudioData(await i.arrayBuffer());if(t)return;c(ee(a.getChannelData(0),A)),Number.isFinite(a.duration)&&a.duration>0&&v(a.duration)}catch{a()}finally{try{s.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let y=()=>{let e=i.current;e&&(p?e.pause():Promise.resolve(e.play()).catch(()=>{}))},b=e=>{let t=i.current;if(!t||!(_>0))return;let n=Math.min(_,Math.max(0,e));t.currentTime=n,g(n)},S=e=>{let t=a.current;if(!t||!(_>0))return;let n=t.getBoundingClientRect();b(Math.min(1,Math.max(0,(e-n.left)/n.width))*_)},T=e=>{S(e.clientX);let t=e=>S(e.clientX),n=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},E=e=>{if(!(_>0))return;let t=i.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:b(t+j),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:b(t-j),e.preventDefault();break;case`Home`:b(0),e.preventDefault();break;case`End`:b(_),e.preventDefault();break;default:break}},D=_>0?Math.min(1,h/_):0,O=Math.round(D*A),k=u(h>0?h:_);return(0,w.jsxs)(`div`,{className:`voice-note`,children:[(0,w.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${p?`Pause`:`Play`} ${t}`,onClick:y,children:p?(0,w.jsx)(x,{size:16,"aria-hidden":!0}):(0,w.jsx)(l,{size:16,"aria-hidden":!0})}),(0,w.jsx)(`div`,{ref:a,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:T,onKeyDown:E,children:(s.length?s:Array.from({length:A},()=>0)).map((e,t)=>(0,w.jsx)(`span`,{className:`voice-note-bar${t<O?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,w.jsx)(`span`,{className:`voice-note-time`,children:k}),(0,w.jsx)(`audio`,{ref:i,className:`voice-note-audio`,preload:`metadata`,src:d,"aria-label":t,onPlay:()=>m(!0),onPause:()=>m(!1),onEnded:()=>m(!1),onError:()=>r?.(),onLoadedMetadata:e=>{let t=e.currentTarget.duration;Number.isFinite(t)&&t>0&&v(t)},onTimeUpdate:e=>g(e.currentTarget.currentTime)})]})}var M=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,N=/\.pdf$/i;function ne(e,t){return(t?t.startsWith(`image/`):M.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:N.test(e))?`pdf`:`file`}function P(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 F(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function I(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 L({href:e,filename:t,label:n}){return(0,w.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0}),n]})}function R({href:e,filename:n,className:r,size:i=14,onClick:a}){return(0,w.jsx)(`a`,{className:r,href:e,download:n,"aria-label":`Download ${n}`,onClick:a,children:(0,w.jsx)(t,{size:i,"aria-hidden":!0})})}function re({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(!1),l=n==null?t:`${t} · ${I(n)}`;return s?(0,w.jsx)(L,{href:e,filename:t,label:l}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,w.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,w.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,w.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var ie=280,ae=360,oe=16;function z({src:e,filename:t,sizeBytes:n,onFail:r}){let[i,a]=(0,C.useState)(!1),[o,s]=(0,C.useState)(!1),l=(0,C.useRef)(null),u=n==null?t:`${t} · ${I(n)}`;return(0,C.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await d(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-CrpAi4Ba.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,ie,ae)}catch{t||(s(!0),r?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),o?(0,w.jsx)(L,{href:e,filename:t,label:u}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,w.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":t}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-download`}),(0,w.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${t}`,onClick:()=>a(!0),children:(0,w.jsx)(c,{size:14,"aria-hidden":!0})})]}),i&&(0,w.jsx)(se,{src:e,filename:t,label:u,onClose:()=>a(!1),onFail:r})]})}function se({src:e,filename:t,label:n,onClose:r,onFail:i}){let o=(0,C.useRef)(null),s=(0,C.useRef)(null),[c,l]=(0,C.useState)(null),[u,f]=(0,C.useState)(!1);return(0,C.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await d(async()=>{let{loadPdf:e}=await import(`./pdf-render-CrpAi4Ba.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||(f(!0),i?.(`render`))}})(),()=>{t=!0;try{s.current?.destroy()}catch{}}},[e]),(0,C.useEffect)(()=>{if(c==null)return;let e=o.current,t=s.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await d(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-CrpAi4Ba.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-oe*2,1);for(let e=0;e<i.length;e++){if(n)return;await r(t,e+1,i[e],a)}}catch{n||(f(!0),i?.(`render`))}})(),()=>{n=!0}},[c]),(0,w.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,w.jsx)(`div`,{ref:o,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,w.jsx)(L,{href:e,filename:t,label:n}):Array.from({length:c??0},(e,n)=>(0,w.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,w.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,w.jsx)(a,{size:20,"aria-hidden":!0})})]})}function ce({src:e,filename:t,onFail:n}){let[r,i]=(0,C.useState)(!1);return r?(0,w.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,w.jsx)(te,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function B({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=ne(e,n);(0,C.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,w.jsx)(re,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,w.jsx)(ce,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,w.jsx)(z,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${I(r)}`;return t?(0,w.jsx)(L,{href:t,filename:e,label:c}):(0,w.jsxs)(`p`,{className:`chat-doc`,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}function le(e,t,n,r=`/api/whatsapp-reader/stream`,i=e,a=!0){let[o,s]=(0,C.useState)([]),[c,l]=(0,C.useState)(`open`),[u,d]=(0,C.useState)(null),f=(0,C.useRef)([]);return(0,C.useEffect)(()=>{f.current=o},[o]),(0,C.useEffect)(()=>{s([]),f.current=[],d(null)},[i,t,n,r]),(0,C.useEffect)(()=>{if(l(`open`),!a)return;let i=f.current.slice(),o=i.map(V),c=0,u=i.length>0,p=`${r}?sessionId=${encodeURIComponent(e)}&projectDir=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,m=new EventSource(p);return m.onopen=()=>{console.info(`[admin-ui] wa-stream onopen sessionId=${e}`),l(`open`)},m.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(u){if(c<o.length&&V(t)===o[c]){c+=1;return}u=!1}s(e=>[...e,t])},m.addEventListener(`activity`,e=>{try{d(JSON.parse(e.data))}catch{}}),m.addEventListener(`activity-clear`,()=>d(null)),m.onerror=()=>{m.readyState===2&&(console.error(`[admin-ui] wa-stream onerror readyState=${m.readyState}`),l(`error`))},()=>m.close()},[e,t,n,r,i,a]),{turns:o,status:c,subagentActivity:u}}function V(e){return JSON.stringify(e)}function ue(e,t,n,r=!0){let[i,a]=(0,C.useState)([]),[o,s]=(0,C.useState)(`open`);return(0,C.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(`reaction`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>e.map(e=>e.kind===`whatsapp-persisted`&&e.msgKeyId===t.targetMsgKeyId?{...e,reactions:t.reactions}:e))}),o.onerror=()=>{o.readyState===2&&s(`error`)},()=>o.close()},[e,t,n,r]),{turns:i,status:o}}var H=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:H(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:H(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 fe(e,t,n=!0){let[r,i]=(0,C.useState)([]);return(0,C.useEffect)(()=>{if(!n||typeof fetch!=`function`)return;let r=!0,a=`/api/whatsapp-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 pe=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`whatsapp-persisted`]);function U(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function W(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var me=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],he=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function G(e){let t=String(e.getMonth()+1).padStart(2,`0`),n=String(e.getDate()).padStart(2,`0`);return`${e.getFullYear()}-${t}-${n}`}function K(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:G(t)}function ge(e,t=new Date){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=G(n);if(r===G(t))return`Today`;let i=new Date(t);return i.setDate(i.getDate()-1),r===G(i)?`Yesterday`:`${me[n.getDay()]} ${n.getDate()} ${he[n.getMonth()]} ${n.getFullYear()}`}function q(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function J({ts:e}){return(0,w.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,w.jsx)(`span`,{className:`day-divider-label`,children:ge(e)})})}function Y(){return(0,w.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,w.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function X({label:e,ts:t}){return(0,w.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,w.jsx)(`span`,{className:`wa-who`,children:e}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(t)})]})}function _e({turn:e}){let[t,n]=(0,C.useState)(!1),r=e.kind===`tool-result`,i=r?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,a=r?e.isError?`result (error)`:`result`:`↳ ${e.name}`,o=r?e.text:JSON.stringify(e.input,null,2);return(0,w.jsxs)(`div`,{className:i,children:[(0,w.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,w.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,w.jsx)(`span`,{className:`wa-who`,children:a}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(e.ts)})]}),t&&(0,w.jsx)(`pre`,{className:`wa-code`,children:o})]})}function Z({entry:e,sessionId:t,sessionKey:n}){let[r,i]=(0,C.useState)(!1),[a,o]=(0,C.useState)(null),s=()=>{let s=!r;if(i(s),s&&a===null&&typeof fetch==`function`){let r=`/api/whatsapp-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,w.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,w.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":r,onClick:s,children:[(0,w.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,w.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(e.ts)})]}),r&&(0,w.jsx)(`pre`,{className:`wa-code`,children:a??`Loading…`})]})}function ve(e){return`text`in e&&typeof e.text==`string`?e.text:``}function ye(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,w.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,w.jsx)(w.Fragment,{children:a})}var Q={onRender:({kind:e,mime:t,served:n})=>console.info(`[operator-ui] op=reader-attachment kind=${e} mime=${t??``} served=${n}`),onFail:({kind:e,mime:t,reason:n})=>console.info(`[operator-ui] op=reader-attachment-fail kind=${e} mime=${t??``} reason=${n}`)};function be(e,t,n){switch(e.kind){case`operator-inbound`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,w.jsx)(X,{label:`Operator${k(e.source)}`,ts:e.ts}),e.text&&(0,w.jsx)(`p`,{className:`wa-body`,children:e.text}),e.attachments&&e.attachments.length>0&&(0,w.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,w.jsx)(B,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:F(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))})]},t);case`operator-typed`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,w.jsx)(X,{label:`Operator (web)`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-text`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply-document`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsxs)(`p`,{className:`wa-doc`,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(W).join(`, `)]}),e.caption&&(0,w.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`agent-file`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=W(t),a=e.downloads?.[r];return(0,w.jsx)(B,{expandable:!0,filename:i,href:a?P(a,n.sessionId,n.sessionKey,N.test(i)?`inline`:void 0):void 0,telemetry:Q},r)}),e.caption&&(0,w.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`;return(0,w.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${r?` wa-op-manual`:``}`,children:[n.onReplyTo&&e.msgKeyId&&(0,w.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,w.jsx)(S,{size:14})}),n.showCopy&&e.text&&(0,w.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;o(t).then(e=>e?console.info(`[operator-ui] op=wa-copy len=${t.length} ok=true`):console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`))},children:(0,w.jsx)(s,{size:14})}),e.quoted&&(0,w.jsxs)(`div`,{className:`wa-quoted`,children:[(0,w.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,w.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,w.jsx)(X,{label:i,ts:e.ts}),e.text&&(0,w.jsx)(`p`,{className:`wa-body`,children:ye(e.text,n.highlight)}),e.attachments&&e.attachments.length>0&&(0,w.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,w.jsx)(B,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:F(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))}),e.reactions&&e.reactions.length>0&&(0,w.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,w.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,w.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,w.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,w.jsx)(`time`,{className:`wa-bubble-time`,children:U(e.ts)}),e.fromMe&&(0,w.jsx)(g,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,w.jsx)(Y,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,w.jsx)(_e,{turn:e},t);case`agent-error`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body wa-error-body`,children:O(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,w.jsx)(`pre`,{className:`wa-code`,children:e.raw})]},t)}}function $(e,t,n,r=`admin`,i,a,o){let s={sessionId:t,sessionKey:n,audience:r,highlight:i,onReplyTo:a,showCopy:o},c=[],l=null;return e.forEach((e,r)=>{let i=q(e),a=K(i);a!==null&&a!==l&&(c.push((0,w.jsx)(J,{ts:i},`day-${r}`)),l=a),c.push(e.kind===`turn`?be(e.turn,r,s):(0,w.jsx)(Z,{entry:e.entry,sessionId:t,sessionKey:n},r))}),c}function xe(e){return e.filter(e=>e.kind===`turn`&&pe.has(e.turn.kind))}var Se=(0,C.memo)(function({sessionId:e,projectDir:t,sessionKey:n,renderItems:r=$,clean:i,onToggleClean:a,forceDeliveredOnly:o=!1,streamEndpoint:s=`/api/whatsapp-reader/stream`,suppressDirectives:c=!1,tail:l=null,resetKey:u,onTurnsChange:d,onActivityChange:f,store:p,search:m,onReplyTo:h}){let g=!!p,_=le(e,t,n,s,u,!g),v=ue(p?.accountId??``,p?.remoteJid??``,n,g),{turns:y,status:b}=g?{turns:v.turns,status:v.status}:{turns:_.turns,status:_.status},x=g?null:_.subagentActivity;(0,C.useEffect)(()=>{f?.(x)},[x,f]),(0,C.useEffect)(()=>{d?.(y.length)},[y.length,d]);let S=de(y,fe(e,n,!c)),E=a==null?!1:!!i,D=o||E?xe(S):S,O=(m??``).trim().toLowerCase(),k=O.length>0,A=k?D.filter(e=>e.kind===`turn`&&ve(e.turn).toLowerCase().includes(O)):D,j=k?D.filter(e=>e.kind===`turn`).length:0;return(0,C.useEffect)(()=>{k&&console.info(`[operator-ui] op=wa-search q=${O} matches=${A.length} ofTurns=${j}`)},[O,k,A.length,j]),(0,w.jsxs)(T,{repinSignals:[y,E,k],tail:l,children:[b===`error`&&(0,w.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),!k&&y.length===0&&b===`open`&&(0,w.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),k&&A.length===0&&(0,w.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,m,`".`]}),g?$(A,e,n,`admin`,m,h,!0):r(D,e,n)]})});function Ce(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var we=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Te(){for(let e of we)if(MediaRecorder.isTypeSupported(e))return e;return``}function Ee(e){return e.split(`;`)[0]}async function De(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function Oe(e){let[t,n]=(0,C.useState)(`idle`),[r,i]=(0,C.useState)(0),[a,o]=(0,C.useState)(null),[s,c]=(0,C.useState)(null),l=(0,C.useRef)(null),u=(0,C.useRef)(null),d=(0,C.useRef)([]),f=(0,C.useRef)(``),p=(0,C.useRef)(null),m=(0,C.useRef)(0),h=(0,C.useRef)(0),g=(0,C.useRef)(null),_=(0,C.useRef)(null),v=(0,C.useRef)(0),y=(0,C.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,C.useEffect)(()=>y,[y]);let b=(0,C.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,C.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),S=(0,C.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()},[]),w=(0,C.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),T=e?.onResult,E=(0,C.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=Te();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(),T?.({ok:!0})}catch(e){y(),n(`error`),e instanceof DOMException?(T?.({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}`)):(T?.({ok:!1}),c(`Could not start recording.`))}}},[t,y,b,S,T]),D=(0,C.useCallback)(()=>{let e=l.current;e&&(t===`recording`&&e.state===`recording`?(e.pause(),x(),w(),n(`paused`)):t===`paused`&&e.state===`paused`&&(e.resume(),b(),S(),n(`recording`)))},[t,x,b,S,w]),O=(0,C.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),k=(0,C.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(),w(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Ee(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,O,x,w,y]);return(0,C.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:E,togglePause:D,discard:O,send:k}}export{_ as C,h as D,p as E,v as S,m as T,P as _,Z as a,b,W as c,q as d,B as f,F as g,N as h,J as i,K as l,M as m,Oe as n,Y as o,z as p,Ce as r,Se as s,De as t,U as u,O as v,f as w,y as x,x as y};
2
+ import{o as e}from"./chunk-TPjIAO9U.js";import{N as t,O as n,R as r,U as i,h as a,r as o}from"./useSubAccountSwitcher-DLvqvfoc.js";import{n as s,t as c}from"./maximize-2-yucCepu_.js";import{n as l,t as u}from"./time-entry-format-DPdGkp1C.js";import{t as d}from"./preload-helper-CT1Z6Pdu.js";var f=`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`,p=new Set(f.split(`,`).filter(e=>!e.startsWith(`.`))),m=50*1024*1024;function h(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var g=t(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),_=t(`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`}]]),v=t(`file-text`,[[`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 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),y=t(`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`}]]),b=t(`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`}]]),x=t(`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`}]]),S=t(`reply`,[[`path`,{d:`M20 18v-2a4 4 0 0 0-4-4H4`,key:`5vmcpk`}],[`path`,{d:`m9 17-5-5 5-5`,key:`nvlc11`}]]),C=e(i(),1),w=r();function T({children:e,tail:t=null,repinSignals:n}){let r=(0,C.useRef)(null),i=(0,C.useRef)(null),a=(0,C.useRef)(!0),[o,s]=(0,C.useState)(!0),c=(0,C.useRef)(0),l=(0,C.useRef)(0),u=()=>{let e=r.current;if(!e)return;let t=e.clientHeight,n=e.scrollHeight,i=t!==c.current||n!==l.current;if(c.current=t,l.current=n,i){a.current&&(e.scrollTop=e.scrollHeight);return}let o=n-e.scrollTop-t<=32;a.current=o,s(e=>e===o?e:o)},d=()=>{let e=r.current;e&&(e.scrollTop=e.scrollHeight,l.current=e.scrollHeight,c.current=e.clientHeight,a.current=!0,s(!0))},f=t!=null;return(0,C.useLayoutEffect)(()=>{let e=r.current;e&&a.current&&(e.scrollTop=e.scrollHeight),e&&(l.current=e.scrollHeight,c.current=e.clientHeight)},[...n,f]),(0,C.useLayoutEffect)(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>u());return r.current&&e.observe(r.current),i.current&&e.observe(i.current),()=>e.disconnect()},[]),(0,w.jsxs)(`div`,{className:`wa-reader`,children:[(0,w.jsx)(`div`,{className:`wa-reader-thread`,ref:r,onScroll:u,children:(0,w.jsxs)(`div`,{className:`wa-thread-scroll`,ref:i,children:[e,t]})}),!o&&(0,w.jsx)(`button`,{type:`button`,className:`wa-jump`,onClick:d,"aria-label":`Jump to latest message`,title:`Jump to latest message`,children:`↓`})]})}var E={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.`},D={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 O(e,t=`admin`){return t===`public`?D[e]:E[e]}function k(e){return e===`whatsapp`?` · via WhatsApp`:e===`webchat`?` · via web`:``}var A=56,j=5;function ee(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 te({src:e,filename:t,onDecodeFail:n,onMediaError:r}){let i=(0,C.useRef)(null),a=(0,C.useRef)(null),o=(0,C.useRef)(!1),[s,c]=(0,C.useState)([]),[d,f]=(0,C.useState)(void 0),[p,m]=(0,C.useState)(!1),[h,g]=(0,C.useState)(0),[_,v]=(0,C.useState)(0);(0,C.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),f(r);let a=await s.decodeAudioData(await i.arrayBuffer());if(t)return;c(ee(a.getChannelData(0),A)),Number.isFinite(a.duration)&&a.duration>0&&v(a.duration)}catch{a()}finally{try{s.close()}catch{}}})(),()=>{t=!0,r&&URL.revokeObjectURL(r)}},[e]);let y=()=>{let e=i.current;e&&(p?e.pause():Promise.resolve(e.play()).catch(()=>{}))},b=e=>{let t=i.current;if(!t||!(_>0))return;let n=Math.min(_,Math.max(0,e));t.currentTime=n,g(n)},S=e=>{let t=a.current;if(!t||!(_>0))return;let n=t.getBoundingClientRect();b(Math.min(1,Math.max(0,(e-n.left)/n.width))*_)},T=e=>{S(e.clientX);let t=e=>S(e.clientX),n=()=>{window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},E=e=>{if(!(_>0))return;let t=i.current?.currentTime??0;switch(e.key){case`ArrowRight`:case`ArrowUp`:b(t+j),e.preventDefault();break;case`ArrowLeft`:case`ArrowDown`:b(t-j),e.preventDefault();break;case`Home`:b(0),e.preventDefault();break;case`End`:b(_),e.preventDefault();break;default:break}},D=_>0?Math.min(1,h/_):0,O=Math.round(D*A),k=u(h>0?h:_);return(0,w.jsxs)(`div`,{className:`voice-note`,children:[(0,w.jsx)(`button`,{type:`button`,className:`voice-note-play`,"aria-label":`${p?`Pause`:`Play`} ${t}`,onClick:y,children:p?(0,w.jsx)(x,{size:16,"aria-hidden":!0}):(0,w.jsx)(l,{size:16,"aria-hidden":!0})}),(0,w.jsx)(`div`,{ref:a,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:T,onKeyDown:E,children:(s.length?s:Array.from({length:A},()=>0)).map((e,t)=>(0,w.jsx)(`span`,{className:`voice-note-bar${t<O?` is-played`:``}`,style:{height:`${Math.max(10,Math.round(e*100))}%`}},t))}),(0,w.jsx)(`span`,{className:`voice-note-time`,children:k}),(0,w.jsx)(`audio`,{ref:i,className:`voice-note-audio`,preload:`metadata`,src:d,"aria-label":t,onPlay:()=>m(!0),onPause:()=>m(!1),onEnded:()=>m(!1),onError:()=>r?.(),onLoadedMetadata:e=>{let t=e.currentTarget.duration;Number.isFinite(t)&&t>0&&v(t)},onTimeUpdate:e=>g(e.currentTarget.currentTime)})]})}var M=/\.(png|jpe?g|gif|webp|svg|bmp)$/i,N=/\.pdf$/i;function ne(e,t){return(t?t.startsWith(`image/`):M.test(e))?`image`:t&&t.startsWith(`audio/`)?`audio`:(t?t===`application/pdf`:N.test(e))?`pdf`:`file`}function P(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 F(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function I(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 L({href:e,filename:t,label:n}){return(0,w.jsxs)(`a`,{className:`chat-attachment-chip`,href:e,download:t,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0}),n]})}function R({href:e,filename:t,className:r,size:i=14,onClick:a}){return(0,w.jsx)(`a`,{className:r,href:e,download:t,"aria-label":`Download ${t}`,onClick:a,children:(0,w.jsx)(n,{size:i,"aria-hidden":!0})})}function re({src:e,filename:t,sizeBytes:n,expandable:r,onFail:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(!1),l=n==null?t:`${t} · ${I(n)}`;return s?(0,w.jsx)(L,{href:e,filename:t,label:l}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`span`,{className:`chat-attachment-image-wrap`,children:[(0,w.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:r?()=>o(!0):void 0,onError:()=>{c(!0),i?.(`fetch`)}}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-download`})]}),r&&a&&(0,w.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>o(!1),children:(0,w.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}var ie=280,ae=360,oe=16;function z({src:e,filename:t,sizeBytes:n,onFail:r}){let[i,a]=(0,C.useState)(!1),[o,s]=(0,C.useState)(!1),l=(0,C.useRef)(null),u=n==null?t:`${t} · ${I(n)}`;return(0,C.useEffect)(()=>{let t=!1,n=null;return(async()=>{try{let{loadPdf:r,renderPageToFit:i}=await d(async()=>{let{loadPdf:e,renderPageToFit:t}=await import(`./pdf-render-CrpAi4Ba.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,ie,ae)}catch{t||(s(!0),r?.(`render`))}})(),()=>{t=!0;try{n?.destroy()}catch{}}},[e]),o?(0,w.jsx)(L,{href:e,filename:t,label:u}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`chat-attachment-pdf`,children:[(0,w.jsx)(`canvas`,{ref:l,className:`chat-attachment-pdf-canvas`,"aria-label":t}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-download`}),(0,w.jsx)(`button`,{type:`button`,className:`chat-attachment-pdf-expand`,"aria-label":`Expand ${t}`,onClick:()=>a(!0),children:(0,w.jsx)(c,{size:14,"aria-hidden":!0})})]}),i&&(0,w.jsx)(se,{src:e,filename:t,label:u,onClose:()=>a(!1),onFail:r})]})}function se({src:e,filename:t,label:n,onClose:r,onFail:i}){let o=(0,C.useRef)(null),s=(0,C.useRef)(null),[c,l]=(0,C.useState)(null),[u,f]=(0,C.useState)(!1);return(0,C.useEffect)(()=>{let t=!1;return(async()=>{try{let{loadPdf:n}=await d(async()=>{let{loadPdf:e}=await import(`./pdf-render-CrpAi4Ba.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||(f(!0),i?.(`render`))}})(),()=>{t=!0;try{s.current?.destroy()}catch{}}},[e]),(0,C.useEffect)(()=>{if(c==null)return;let e=o.current,t=s.current;if(!e||!t)return;let n=!1;return(async()=>{try{let{renderPageToWidth:r}=await d(async()=>{let{renderPageToWidth:e}=await import(`./pdf-render-CrpAi4Ba.js`);return{renderPageToWidth:e}},__vite__mapDeps([0,1])),i=Array.from(e.querySelectorAll(`canvas.chat-attachment-overlay-page`)),a=Math.max(e.clientWidth-oe*2,1);for(let e=0;e<i.length;e++){if(n)return;await r(t,e+1,i[e],a)}}catch{n||(f(!0),i?.(`render`))}})(),()=>{n=!0}},[c]),(0,w.jsxs)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:r,children:[(0,w.jsx)(`div`,{ref:o,className:`chat-attachment-overlay-pdf`,onClick:e=>e.stopPropagation(),children:u?(0,w.jsx)(L,{href:e,filename:t,label:n}):Array.from({length:c??0},(e,n)=>(0,w.jsx)(`canvas`,{className:`chat-attachment-overlay-page`,"aria-label":`${t} page ${n+1}`},n))}),(0,w.jsx)(R,{href:e,filename:t,className:`chat-attachment-overlay-download`,size:20,onClick:e=>e.stopPropagation()}),(0,w.jsx)(`button`,{type:`button`,className:`chat-attachment-overlay-close`,"aria-label":`Close`,onClick:r,children:(0,w.jsx)(a,{size:20,"aria-hidden":!0})})]})}function ce({src:e,filename:t,onFail:n}){let[r,i]=(0,C.useState)(!1);return r?(0,w.jsx)(`audio`,{className:`chat-attachment-audio`,controls:!0,preload:`metadata`,src:e,"aria-label":t,onError:()=>n?.(`fetch`)}):(0,w.jsx)(te,{src:e,filename:t,onDecodeFail:()=>{i(!0),n?.(`render`)},onMediaError:()=>{i(!0),n?.(`fetch`)}})}function B({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i,telemetry:a}){let o=ne(e,n);(0,C.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,w.jsx)(re,{src:t,filename:e,sizeBytes:r,expandable:i,onFail:s});if(o===`audio`&&t)return(0,w.jsx)(ce,{src:t,filename:e,onFail:s});if(o===`pdf`&&t)return(0,w.jsx)(z,{src:t,filename:e,sizeBytes:r,onFail:s});let c=r==null?e:`${e} · ${I(r)}`;return t?(0,w.jsx)(L,{href:t,filename:e,label:c}):(0,w.jsxs)(`p`,{className:`chat-doc`,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,c]})}function le(e,t,n,r=`/api/whatsapp-reader/stream`,i=e,a=!0){let[o,s]=(0,C.useState)([]),[c,l]=(0,C.useState)(`open`),[u,d]=(0,C.useState)(null),f=(0,C.useRef)([]);return(0,C.useEffect)(()=>{f.current=o},[o]),(0,C.useEffect)(()=>{s([]),f.current=[],d(null)},[i,t,n,r]),(0,C.useEffect)(()=>{if(l(`open`),!a)return;let i=f.current.slice(),o=i.map(V),c=0,u=i.length>0,p=`${r}?sessionId=${encodeURIComponent(e)}&projectDir=${encodeURIComponent(t)}&session_key=${encodeURIComponent(n)}`,m=new EventSource(p);return m.onopen=()=>{console.info(`[admin-ui] wa-stream onopen sessionId=${e}`),l(`open`)},m.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(u){if(c<o.length&&V(t)===o[c]){c+=1;return}u=!1}s(e=>[...e,t])},m.addEventListener(`activity`,e=>{try{d(JSON.parse(e.data))}catch{}}),m.addEventListener(`activity-clear`,()=>d(null)),m.onerror=()=>{m.readyState===2&&(console.error(`[admin-ui] wa-stream onerror readyState=${m.readyState}`),l(`error`))},()=>m.close()},[e,t,n,r,i,a]),{turns:o,status:c,subagentActivity:u}}function V(e){return JSON.stringify(e)}function ue(e,t,n,r=!0){let[i,a]=(0,C.useState)([]),[o,s]=(0,C.useState)(`open`);return(0,C.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(`reaction`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}a(e=>e.map(e=>e.kind===`whatsapp-persisted`&&e.msgKeyId===t.targetMsgKeyId?{...e,reactions:t.reactions}:e))}),o.onerror=()=>{o.readyState===2&&s(`error`)},()=>o.close()},[e,t,n,r]),{turns:i,status:o}}var H=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:H(e.ts),sub:1,ins:r++,item:{kind:`turn`,turn:e,idx:t}})),t.forEach(e=>n.push({sort:H(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 fe(e,t,n=!0){let[r,i]=(0,C.useState)([]);return(0,C.useEffect)(()=>{if(!n||typeof fetch!=`function`)return;let r=!0,a=`/api/whatsapp-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 pe=new Set([`operator-inbound`,`operator-typed`,`agent-reply`,`agent-reply-document`,`agent-file`,`agent-error`,`agent-webchat-final`,`whatsapp-persisted`]);function U(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function W(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}var me=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],he=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function G(e){let t=String(e.getMonth()+1).padStart(2,`0`),n=String(e.getDate()).padStart(2,`0`);return`${e.getFullYear()}-${t}-${n}`}function K(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:G(t)}function ge(e,t=new Date){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=G(n);if(r===G(t))return`Today`;let i=new Date(t);return i.setDate(i.getDate()-1),r===G(i)?`Yesterday`:`${me[n.getDay()]} ${n.getDate()} ${he[n.getMonth()]} ${n.getFullYear()}`}function q(e){return e.kind===`turn`?e.turn.ts:e.entry.ts}function J({ts:e}){return(0,w.jsx)(`div`,{className:`day-divider`,role:`separator`,children:(0,w.jsx)(`span`,{className:`day-divider-label`,children:ge(e)})})}function Y(){return(0,w.jsx)(`div`,{className:`session-divider`,role:`separator`,children:(0,w.jsx)(`span`,{className:`session-divider-label`,children:`Conversation continued`})})}function X({label:e,ts:t}){return(0,w.jsxs)(`div`,{className:`wa-turn-head`,children:[(0,w.jsx)(`span`,{className:`wa-who`,children:e}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(t)})]})}function _e({turn:e}){let[t,n]=(0,C.useState)(!1),r=e.kind===`tool-result`,i=r?`wa-turn wa-turn-result${e.isError?` is-error`:``}`:`wa-turn wa-turn-tool`,a=r?e.isError?`result (error)`:`result`:`↳ ${e.name}`,o=r?e.text:JSON.stringify(e.input,null,2);return(0,w.jsxs)(`div`,{className:i,children:[(0,w.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,w.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,w.jsx)(`span`,{className:`wa-who`,children:a}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(e.ts)})]}),t&&(0,w.jsx)(`pre`,{className:`wa-code`,children:o})]})}function Z({entry:e,sessionId:t,sessionKey:n}){let[r,i]=(0,C.useState)(!1),[a,o]=(0,C.useState)(null),s=()=>{let s=!r;if(i(s),s&&a===null&&typeof fetch==`function`){let r=`/api/whatsapp-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,w.jsxs)(`div`,{className:`wa-turn wa-turn-directive`,children:[(0,w.jsxs)(`button`,{type:`button`,className:`wa-tool-toggle`,"aria-expanded":r,onClick:s,children:[(0,w.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,w.jsxs)(`span`,{className:`wa-who`,children:[`⚙ directive injected (`,e.len,` B)`]}),(0,w.jsx)(`time`,{className:`wa-time`,children:U(e.ts)})]}),r&&(0,w.jsx)(`pre`,{className:`wa-code`,children:a??`Loading…`})]})}function ve(e){return`text`in e&&typeof e.text==`string`?e.text:``}function ye(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,w.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,w.jsx)(w.Fragment,{children:a})}var Q={onRender:({kind:e,mime:t,served:n})=>console.info(`[operator-ui] op=reader-attachment kind=${e} mime=${t??``} served=${n}`),onFail:({kind:e,mime:t,reason:n})=>console.info(`[operator-ui] op=reader-attachment-fail kind=${e} mime=${t??``} reason=${n}`)};function be(e,t,n){switch(e.kind){case`operator-inbound`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-in`,children:[(0,w.jsx)(X,{label:`Operator${k(e.source)}`,ts:e.ts}),e.text&&(0,w.jsx)(`p`,{className:`wa-body`,children:e.text}),e.attachments&&e.attachments.length>0&&(0,w.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,w.jsx)(B,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:F(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))})]},t);case`operator-typed`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-in wa-turn-typed`,children:[(0,w.jsx)(X,{label:`Operator (web)`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-text`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-think`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body`,children:e.text})]},t);case`agent-reply-document`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsxs)(`p`,{className:`wa-doc`,children:[(0,w.jsx)(b,{size:14,"aria-hidden":!0,style:{verticalAlign:`text-bottom`}}),` `,`sent document(s): `,e.files.map(W).join(`, `)]}),e.caption&&(0,w.jsx)(`p`,{className:`wa-body`,children:e.caption})]},t);case`agent-file`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-out`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),e.files.map((t,r)=>{let i=W(t),a=e.downloads?.[r];return(0,w.jsx)(B,{expandable:!0,filename:i,href:a?P(a,n.sessionId,n.sessionKey,N.test(i)?`inline`:void 0):void 0,telemetry:Q},r)}),e.caption&&(0,w.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`;return(0,w.jsxs)(`div`,{className:`wa-turn ${e.fromMe?`wa-turn-out`:`wa-turn-in`}${r?` wa-op-manual`:``}`,children:[n.onReplyTo&&e.msgKeyId&&(0,w.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,w.jsx)(S,{size:14})}),n.showCopy&&e.text&&(0,w.jsx)(`button`,{type:`button`,className:`wa-bubble-copy`,"aria-label":`Copy this message`,onClick:()=>{let t=e.text;o(t).then(e=>e?console.info(`[operator-ui] op=wa-copy len=${t.length} ok=true`):console.warn(`[operator-ui] op=wa-copy-fail reason=clipboard-unavailable`))},children:(0,w.jsx)(s,{size:14})}),e.quoted&&(0,w.jsxs)(`div`,{className:`wa-quoted`,children:[(0,w.jsx)(`span`,{className:`wa-quoted-who`,children:e.quoted.fromMe?`You`:e.quoted.sender??`Contact`}),(0,w.jsx)(`span`,{className:`wa-quoted-body`,children:e.quoted.body||`Message`})]}),(0,w.jsx)(X,{label:i,ts:e.ts}),e.text&&(0,w.jsx)(`p`,{className:`wa-body`,children:ye(e.text,n.highlight)}),e.attachments&&e.attachments.length>0&&(0,w.jsx)(`div`,{className:`chat-attachment-list`,children:e.attachments.map((e,t)=>(0,w.jsx)(B,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:F(e.attachmentId,n.audience,n.sessionId,n.sessionKey),telemetry:Q},t))}),e.reactions&&e.reactions.length>0&&(0,w.jsx)(`div`,{className:`wa-reactions`,children:e.reactions.map((e,t)=>(0,w.jsx)(`span`,{className:`wa-reaction`,title:e.reactorName??void 0,children:e.emoji},t))}),(0,w.jsxs)(`span`,{className:`wa-bubble-meta`,children:[r&&(0,w.jsx)(`span`,{className:`wa-op-tag`,children:`You`}),(0,w.jsx)(`time`,{className:`wa-bubble-time`,children:U(e.ts)}),e.fromMe&&(0,w.jsx)(g,{size:14,className:`wa-bubble-tick`,"aria-hidden":!0})]})]},t)}case`session-continued`:return(0,w.jsx)(Y,{},t);case`harness-internal`:return null;case`tool-call`:case`tool-result`:return(0,w.jsx)(_e,{turn:e},t);case`agent-error`:return(0,w.jsxs)(`div`,{className:`wa-turn wa-turn-error`,role:`alert`,children:[(0,w.jsx)(X,{label:`Agent`,ts:e.ts}),(0,w.jsx)(`p`,{className:`wa-body wa-error-body`,children:O(e.code,`admin`)}),e.code===`agent_error`&&e.raw&&(0,w.jsx)(`pre`,{className:`wa-code`,children:e.raw})]},t)}}function $(e,t,n,r=`admin`,i,a,o){let s={sessionId:t,sessionKey:n,audience:r,highlight:i,onReplyTo:a,showCopy:o},c=[],l=null;return e.forEach((e,r)=>{let i=q(e),a=K(i);a!==null&&a!==l&&(c.push((0,w.jsx)(J,{ts:i},`day-${r}`)),l=a),c.push(e.kind===`turn`?be(e.turn,r,s):(0,w.jsx)(Z,{entry:e.entry,sessionId:t,sessionKey:n},r))}),c}function xe(e){return e.filter(e=>e.kind===`turn`&&pe.has(e.turn.kind))}var Se=(0,C.memo)(function({sessionId:e,projectDir:t,sessionKey:n,renderItems:r=$,clean:i,onToggleClean:a,forceDeliveredOnly:o=!1,streamEndpoint:s=`/api/whatsapp-reader/stream`,suppressDirectives:c=!1,tail:l=null,resetKey:u,onTurnsChange:d,onActivityChange:f,store:p,search:m,onReplyTo:h}){let g=!!p,_=le(e,t,n,s,u,!g),v=ue(p?.accountId??``,p?.remoteJid??``,n,g),{turns:y,status:b}=g?{turns:v.turns,status:v.status}:{turns:_.turns,status:_.status},x=g?null:_.subagentActivity;(0,C.useEffect)(()=>{f?.(x)},[x,f]),(0,C.useEffect)(()=>{d?.(y.length)},[y.length,d]);let S=de(y,fe(e,n,!c)),E=a==null?!1:!!i,D=o||E?xe(S):S,O=(m??``).trim().toLowerCase(),k=O.length>0,A=k?D.filter(e=>e.kind===`turn`&&ve(e.turn).toLowerCase().includes(O)):D,j=k?D.filter(e=>e.kind===`turn`).length:0;return(0,C.useEffect)(()=>{k&&console.info(`[operator-ui] op=wa-search q=${O} matches=${A.length} ofTurns=${j}`)},[O,k,A.length,j]),(0,w.jsxs)(T,{repinSignals:[y,E,k],tail:l,children:[b===`error`&&(0,w.jsx)(`div`,{className:`wa-reader-error`,children:`Stream disconnected.`}),!k&&y.length===0&&b===`open`&&(0,w.jsx)(`div`,{className:`wa-reader-placeholder`,children:`No messages in this conversation yet.`}),k&&A.length===0&&(0,w.jsxs)(`div`,{className:`wa-reader-placeholder`,children:[`No matches for "`,m,`".`]}),g?$(A,e,n,`admin`,m,h,!0):r(D,e,n)]})});function Ce(e,t){let n=e.split(`;`)[0].trim().toLowerCase();return t.has(n)}var we=[`audio/ogg;codecs=opus`,`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`];function Te(){for(let e of we)if(MediaRecorder.isTypeSupported(e))return e;return``}function Ee(e){return e.split(`;`)[0]}async function De(){return typeof navigator>`u`||!navigator.mediaDevices?.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}function Oe(e){let[t,n]=(0,C.useState)(`idle`),[r,i]=(0,C.useState)(0),[a,o]=(0,C.useState)(null),[s,c]=(0,C.useState)(null),l=(0,C.useRef)(null),u=(0,C.useRef)(null),d=(0,C.useRef)([]),f=(0,C.useRef)(``),p=(0,C.useRef)(null),m=(0,C.useRef)(0),h=(0,C.useRef)(0),g=(0,C.useRef)(null),_=(0,C.useRef)(null),v=(0,C.useRef)(0),y=(0,C.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,C.useEffect)(()=>y,[y]);let b=(0,C.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,C.useCallback)(()=>{p.current&&=(clearInterval(p.current),null);let e=Date.now()-m.current;h.current+=e},[]),S=(0,C.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()},[]),w=(0,C.useCallback)(()=>{v.current&&=(cancelAnimationFrame(v.current),0)},[]),T=e?.onResult,E=(0,C.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=Te();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(),T?.({ok:!0})}catch(e){y(),n(`error`),e instanceof DOMException?(T?.({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}`)):(T?.({ok:!1}),c(`Could not start recording.`))}}},[t,y,b,S,T]),D=(0,C.useCallback)(()=>{let e=l.current;e&&(t===`recording`&&e.state===`recording`?(e.pause(),x(),w(),n(`paused`)):t===`paused`&&e.state===`paused`&&(e.resume(),b(),S(),n(`recording`)))},[t,x,b,S,w]),O=(0,C.useCallback)(()=>{t!==`recording`&&t!==`paused`||(y(),n(`idle`),i(0),o(null))},[t,y]),k=(0,C.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(),w(),new Promise(t=>{e.onstop=()=>{let r=f.current||e.mimeType||`audio/webm`,a=new Blob(d.current,{type:Ee(r)});y(),n(`idle`),i(0),o(null),t(a.size>0?a:null)},e.stop()}))},[t,O,x,w,y]);return(0,C.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:E,togglePause:D,discard:O,send:k}}export{_ as C,h as D,p as E,v as S,m as T,P as _,Z as a,b,W as c,q as d,B as f,F as g,N as h,J as i,K as l,M as m,Oe as n,Y as o,z as p,Ce as r,Se as s,De as t,U as u,O as v,f as w,y as x,x as y};
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Browser — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/browser-BI-wi3CM.js"></script>
8
+ <script type="module" crossorigin src="/assets/browser-BVW4FFii.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
12
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
13
13
  <link rel="stylesheet" href="/brand-defaults.css">
14
14
  </head>
15
15
  <body>
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Calendar — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/calendar-DXnv4F7l.js"></script>
8
+ <script type="module" crossorigin src="/assets/calendar-CWsD3uLk.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
13
- <link rel="modulepreload" crossorigin href="/assets/chevron-right-Bu5hsjy5.js">
14
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/chevron-right-Dy_REdYZ.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
15
15
  <link rel="stylesheet" href="/brand-defaults.css">
16
16
  </head>
17
17
  <body>
@@ -5,21 +5,21 @@
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-CAdgaPW1.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-DKGREuIO.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CT1Z6Pdu.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DOFBQ2gP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-CfbJc9iN.js">
17
- <link rel="modulepreload" crossorigin href="/assets/bot-GC7iZjtW.js">
18
- <link rel="modulepreload" crossorigin href="/assets/chevron-down-BCLf1wKu.js">
19
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
20
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-CCbbX5ef.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-DPQS0X5M.js">
22
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BcukQIza.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-HMSM7-Ir.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/bot-BVO9Uqr_.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/chevron-down-m581tl1J.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BH51cf2Q.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-CgSgj8Cy.js">
22
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
25
25
  <body>
@@ -5,18 +5,18 @@
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-D7cYlorm.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-TOWuhMFb.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-7p-mVi9M.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Axa04w8A.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CT1Z6Pdu.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DOFBQ2gP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
17
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-BDtoi5R0.js">
18
- <link rel="modulepreload" crossorigin href="/assets/page-DsV3rID5.js">
19
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BcukQIza.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-DO2rjjfV.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/page-6CZ8R57f.js">
19
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
20
20
  <link rel="stylesheet" href="/brand-defaults.css">
21
21
  </head>
22
22
  <body>
@@ -5,18 +5,18 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Graph — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/graph-Cl72j3UC.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-BEGs_P2m.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-7p-mVi9M.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-D7_S2EUI.js">
14
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-CfbJc9iN.js">
15
- <link rel="modulepreload" crossorigin href="/assets/chevron-down-BCLf1wKu.js">
16
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
17
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
18
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-CCbbX5ef.js">
19
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Axa04w8A.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-s5X6dso4.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-HMSM7-Ir.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/chevron-down-m581tl1J.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BH51cf2Q.js">
19
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
20
20
  <link rel="stylesheet" href="/brand-defaults.css">
21
21
  </head>
22
22
  <body>
@@ -5,24 +5,24 @@
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-DXUspIjz.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-rScqRq-R.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-7p-mVi9M.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Axa04w8A.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CT1Z6Pdu.js">
14
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
15
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DOFBQ2gP.js">
17
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-D7_S2EUI.js">
18
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Jw45pvb2.js">
19
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
20
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-BDtoi5R0.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-DsV3rID5.js">
22
- <link rel="modulepreload" crossorigin href="/assets/bot-GC7iZjtW.js">
23
- <link rel="modulepreload" crossorigin href="/assets/chevron-down-BCLf1wKu.js">
24
- <link rel="modulepreload" crossorigin href="/assets/chevron-right-Bu5hsjy5.js">
25
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BcukQIza.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-s5X6dso4.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DF9S5Rca.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-DO2rjjfV.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-6CZ8R57f.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/bot-BVO9Uqr_.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/chevron-down-m581tl1J.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/chevron-right-Dy_REdYZ.js">
25
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
26
26
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
27
27
  <link rel="stylesheet" href="/brand-defaults.css">
28
28
  </head>
@@ -5,23 +5,23 @@
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-C0iaGPNT.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-911z_Fy_.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CT1Z6Pdu.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DOFBQ2gP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-D7_S2EUI.js">
17
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-Jw45pvb2.js">
18
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-CfbJc9iN.js">
19
- <link rel="modulepreload" crossorigin href="/assets/bot-GC7iZjtW.js">
20
- <link rel="modulepreload" crossorigin href="/assets/chevron-down-BCLf1wKu.js">
21
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
22
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-CCbbX5ef.js">
23
- <link rel="modulepreload" crossorigin href="/assets/page-DPQS0X5M.js">
24
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BcukQIza.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-s5X6dso4.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DF9S5Rca.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-HMSM7-Ir.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/bot-BVO9Uqr_.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/chevron-down-m581tl1J.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BH51cf2Q.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/page-CgSgj8Cy.js">
24
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
25
25
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
26
26
  <link rel="stylesheet" href="/brand-defaults.css">
27
27
  </head>
@@ -5,21 +5,21 @@
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-DAn13pnw.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-BzwveFwz.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CT1Z6Pdu.js">
13
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
14
- <link rel="modulepreload" crossorigin href="/assets/maximize-2-HcfeeOdJ.js">
15
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DOFBQ2gP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-CfbJc9iN.js">
17
- <link rel="modulepreload" crossorigin href="/assets/bot-GC7iZjtW.js">
18
- <link rel="modulepreload" crossorigin href="/assets/chevron-down-BCLf1wKu.js">
19
- <link rel="modulepreload" crossorigin href="/assets/chevron-left-BNtL-CjS.js">
20
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-CCbbX5ef.js">
21
- <link rel="modulepreload" crossorigin href="/assets/page-DPQS0X5M.js">
22
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/maximize-2-yucCepu_.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BcukQIza.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/useCopyFeedback-HMSM7-Ir.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/bot-BVO9Uqr_.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/chevron-down-m581tl1J.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/chevron-left-BAY0xfmR.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BH51cf2Q.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/page-CgSgj8Cy.js">
22
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
23
23
  <link rel="stylesheet" href="/brand-defaults.css">
24
24
  </head>
25
25
  <body class="public-surface">
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Tasks — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/tasks-_Ij9BdOE.js"></script>
8
+ <script type="module" crossorigin src="/assets/tasks-21egY7A6.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-sPN6lobE.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DR6AzflZ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/time-entry-format-C-By1MbO.js">
13
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-CCbbX5ef.js">
14
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-5jQsc23X.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DLvqvfoc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-B0PNDCAb.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/time-entry-format-DPdGkp1C.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BH51cf2Q.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-2ojOOYNo.css">
15
15
  <link rel="stylesheet" href="/brand-defaults.css">
16
16
  </head>
17
17
  <body>
@@ -11232,6 +11232,93 @@ app5.get("/conversations", requireAdminSession, async (c) => {
11232
11232
  );
11233
11233
  return c.json({ conversations: [...sessionConversations, ...allStoreRows] });
11234
11234
  });
11235
+ function tagAndMergeInstallConversations(perAccount) {
11236
+ const all = [];
11237
+ for (const { isHouse, rows } of perAccount) {
11238
+ for (const r of rows) all.push({ ...r, isHouse });
11239
+ }
11240
+ return all.sort((x, y) => (y.lastMessageAt ?? "").localeCompare(x.lastMessageAt ?? ""));
11241
+ }
11242
+ app5.get("/conversations-all", requireAdminSession, async (c) => {
11243
+ const cacheKey = c.var.cacheKey;
11244
+ const caller2 = getAccountIdForSession(cacheKey) ?? null;
11245
+ let houseId = null;
11246
+ try {
11247
+ houseId = resolveHouseOrSoleAccountId(ACCOUNTS_DIR);
11248
+ } catch {
11249
+ houseId = null;
11250
+ }
11251
+ if (!caller2 || !houseId || caller2 !== houseId) {
11252
+ console.log(`[wa-reader] op=conversations-all-gate decision=deny caller=${caller2?.slice(0, 8) ?? "null"} house=${houseId?.slice(0, 8) ?? "null"}`);
11253
+ return c.json({ error: "house-only" }, 403);
11254
+ }
11255
+ const cfg = claudeConfigDir();
11256
+ if (!cfg) return c.json({ conversations: [] });
11257
+ const projectsRoot = join19(cfg, "projects");
11258
+ const userTitles = loadUserTitles(ACCOUNTS_DIR ?? null);
11259
+ const validAccounts = listValidAccounts();
11260
+ const validIds = new Set(validAccounts.map((a) => a.accountId));
11261
+ const houseIds = new Set(validAccounts.filter((a) => a.config.role === "house").map((a) => a.accountId));
11262
+ const rawByAccount = /* @__PURE__ */ new Map();
11263
+ for (const { path: path3 } of enumerateJsonls(projectsRoot)) {
11264
+ const sessionId = basename4(path3).replace(/\.jsonl$/, "");
11265
+ const projectDir = dirname5(path3);
11266
+ const meta = readSidecarMeta(join19(projectDir, `${sessionId}.meta.json`));
11267
+ if (!isReaderChannelSession(meta.role, meta.channel)) continue;
11268
+ if (meta.accountId === null || !validIds.has(meta.accountId)) continue;
11269
+ let body = "";
11270
+ try {
11271
+ body = readFileSync19(path3, "utf8");
11272
+ } catch {
11273
+ }
11274
+ const { title } = resolveTitle(body, sessionId, userTitles);
11275
+ const turns = parseTranscript(body.split("\n"));
11276
+ const row = {
11277
+ sessionId,
11278
+ projectDir,
11279
+ title,
11280
+ startedAt: meta.startedAt ?? "",
11281
+ role: meta.role,
11282
+ channel: meta.channel,
11283
+ senderId: meta.senderId,
11284
+ lastMessageAt: lastTurnTs(turns),
11285
+ modelGated: isModelGated(turns),
11286
+ model: lastAssistantModel(body)
11287
+ };
11288
+ const list = rawByAccount.get(meta.accountId) ?? [];
11289
+ list.push(row);
11290
+ rawByAccount.set(meta.accountId, list);
11291
+ }
11292
+ let users = [];
11293
+ try {
11294
+ users = readUsersFile(USERS_FILE) ?? [];
11295
+ } catch (err) {
11296
+ console.error(`[wa-reader] op=users-file-unreadable reason=${err instanceof Error ? err.message : String(err)}`);
11297
+ users = [];
11298
+ }
11299
+ const perAccount = [];
11300
+ for (const account of validAccounts) {
11301
+ const isHouse = houseIds.has(account.accountId);
11302
+ const sessionRows = selectReaderChannelSessions(rawByAccount.get(account.accountId) ?? []).filter((r) => r.channel !== "whatsapp");
11303
+ const admins = account.config.admins ?? [];
11304
+ const distinct = [...new Set(sessionRows.map((r) => r.senderId).filter((s) => !!s))];
11305
+ const resolved = await resolveOperatorNamesBySender(users, admins, distinct);
11306
+ const nameBySender = /* @__PURE__ */ new Map();
11307
+ for (const senderId of distinct) nameBySender.set(senderId, resolved.get(senderId)?.name ?? null);
11308
+ const named = sessionRows.map((r) => ({
11309
+ ...r,
11310
+ operatorName: r.senderId ? nameBySender.get(r.senderId) ?? null : null
11311
+ }));
11312
+ const storeRows = buildStoreConversationRows(account.accountId, readConversationSummaries(account.accountId));
11313
+ perAccount.push({ isHouse, rows: [...named, ...storeRows] });
11314
+ }
11315
+ const conversations = tagAndMergeInstallConversations(perAccount);
11316
+ const houseRows = conversations.filter((r) => r.isHouse).length;
11317
+ console.log(
11318
+ `[wa-reader] op=conversations-all accounts=${validAccounts.length} rows=${conversations.length} house=${houseRows} sub=${conversations.length - houseRows}`
11319
+ );
11320
+ return c.json({ conversations });
11321
+ });
11235
11322
  function readFrom(path3, from) {
11236
11323
  const end = statSync7(path3).size;
11237
11324
  if (end <= from) return { buf: Buffer.alloc(0), end: from };