@rubytech/create-maxy-code 0.1.366 → 0.1.368

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 (49) hide show
  1. package/dist/index.js +18 -0
  2. package/package.json +1 -1
  3. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts.map +1 -1
  4. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js +5 -4
  5. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js.map +1 -1
  6. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-write-path-task802.test.js +62 -0
  7. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-write-path-task802.test.js.map +1 -1
  8. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts +22 -0
  9. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts.map +1 -1
  10. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js +5 -1
  11. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js.map +1 -1
  12. package/payload/platform/plugins/memory/mcp/dist/lib/schema-validator.d.ts.map +1 -1
  13. package/payload/platform/plugins/memory/mcp/dist/lib/schema-validator.js +16 -1
  14. package/payload/platform/plugins/memory/mcp/dist/lib/schema-validator.js.map +1 -1
  15. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts +5 -7
  16. package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts.map +1 -1
  17. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js +48 -32
  18. package/payload/platform/services/claude-session-manager/dist/stuck-turn.js.map +1 -1
  19. package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
  20. package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +73 -27
  21. package/payload/premium-plugins/writer-craft/PLUGIN.md +1 -1
  22. package/payload/premium-plugins/writer-craft/skills/voice-mirror/SKILL.md +2 -2
  23. package/payload/server/public/assets/{AdminLoginScreens-CDygow-0.js → AdminLoginScreens-B45MFjWG.js} +1 -1
  24. package/payload/server/public/assets/{AdminShell-BLZcGlev.js → AdminShell-CyZPfbzd.js} +1 -1
  25. package/payload/server/public/assets/{Checkbox-Do2GA1u4.js → Checkbox-BPYEJJPq.js} +1 -1
  26. package/payload/server/public/assets/OperatorConversations-Civ7TETM.css +1 -0
  27. package/payload/server/public/assets/{admin-CbWQcPL8.js → admin-DcuJ3_xm.js} +1 -1
  28. package/payload/server/public/assets/{browser-B0xLdNFF.js → browser-Be9LRtM2.js} +1 -1
  29. package/payload/server/public/assets/{calendar-mMg5VWd7.js → calendar-BeofvK7c.js} +1 -1
  30. package/payload/server/public/assets/chat-BWNFeIjw.js +1 -0
  31. package/payload/server/public/assets/{data-6qqDzoDY.js → data-lTmU53k6.js} +1 -1
  32. package/payload/server/public/assets/{graph-DWk0KW9T.js → graph-XYK2qT5D.js} +3 -3
  33. package/payload/server/public/assets/{graph-labels-ZGGfPS26.js → graph-labels-DNCXtQVn.js} +1 -1
  34. package/payload/server/public/assets/{operator-BxVL6eVL.js → operator-B3hpbhNo.js} +1 -1
  35. package/payload/server/public/assets/{page-Bm85-8yI.js → page-DFOoEKVK.js} +3 -3
  36. package/payload/server/public/assets/{public-B6NzFgcN.js → public-Bd_0QBGJ.js} +1 -1
  37. package/payload/server/public/assets/{rotate-ccw-cFVc5kyj.js → rotate-ccw-BxD1B_G-.js} +1 -1
  38. package/payload/server/public/browser.html +4 -4
  39. package/payload/server/public/calendar.html +4 -4
  40. package/payload/server/public/chat.html +6 -6
  41. package/payload/server/public/data.html +4 -4
  42. package/payload/server/public/graph.html +7 -7
  43. package/payload/server/public/index.html +6 -6
  44. package/payload/server/public/operator.html +8 -8
  45. package/payload/server/public/public.html +6 -6
  46. package/payload/server/server.js +50 -42
  47. package/payload/server/public/assets/OperatorConversations-CGwMH7na.css +0 -1
  48. package/payload/server/public/assets/chat-CUQgxmCr.js +0 -1
  49. /package/payload/server/public/assets/{OperatorConversations-JZG5tFTr.js → OperatorConversations-D_o_59Oc.js} +0 -0
@@ -1 +1 @@
1
- import{o as e}from"./chunk-CAM3fms7.js";import{H as t,W as n,w as r}from"./OperatorConversations-JZG5tFTr.js";import"./admin-types-DJoj6VJv.js";import{u as i}from"./AdminShell-BLZcGlev.js";import{a,i as o,o as s,r as c}from"./page-Bm85-8yI.js";var l=t(),u=e(n(),1),d=r();function f({gateState:e,setGateState:t,grantInfo:n,resolvedSlugRef:r}){let[a,o]=(0,u.useState)(``),[s,c]=(0,u.useState)(!1),[l,f]=(0,u.useState)(null);async function p(e){e.preventDefault();let n=a.trim().toLowerCase();if(!n){f(`Enter the email you were invited on.`);return}c(!0),f(null);try{let e=await fetch(`/api/access/request-magic-link`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({contactValue:n,agentSlug:r.current})});if(e.status===429){f((await e.json().catch(()=>({})))?.error||`Too many requests. Try again later.`);return}t(`request-sent`)}catch{f(`Could not reach the server. Check your connection and try again.`)}finally{c(!1)}}return(0,d.jsxs)(`div`,{className:`access-gate`,children:[e===`verifying`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`Verifying your link…`}),(0,d.jsx)(`p`,{children:`This takes a moment.`})]}),e===`verify-failed`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`That link did not work`}),(0,d.jsx)(`p`,{children:`It may have expired, already been used, or been for a different agent. You can request a fresh one below.`}),(0,d.jsx)(i,{onClick:()=>{t(`request-link`),f(null)},children:`Request a new link`})]}),e===`request-link`&&(0,d.jsxs)(`form`,{className:`access-gate-form`,onSubmit:p,children:[(0,d.jsx)(`h2`,{children:n?.displayName?`Welcome back, ${n.displayName}`:`Sign in`}),(0,d.jsx)(`p`,{children:`Enter the email you were invited on and we will send you a fresh link.`}),(0,d.jsx)(`label`,{htmlFor:`access-email`,children:`Email`}),(0,d.jsx)(`input`,{id:`access-email`,type:`email`,inputMode:`email`,autoComplete:`email`,value:a,onChange:e=>o(e.target.value),disabled:s}),l&&(0,d.jsx)(`p`,{className:`access-gate-error`,children:l}),(0,d.jsx)(i,{type:`submit`,disabled:s||!a.trim(),children:s?`Sending…`:`Send me a link`})]}),e===`request-sent`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`Check your email`}),(0,d.jsx)(`p`,{children:`If that address is on the invite list, a fresh link is on the way. It expires in 15 minutes.`}),(0,d.jsx)(i,{onClick:()=>{t(`request-link`),o(``),f(null)},children:`Try a different email`})]})]})}function p(){let[e,t]=(0,u.useState)(null),[n,r]=(0,u.useState)(null),[i,c]=(0,u.useState)(`loading`),[l,d]=(0,u.useState)(``),[f,p]=(0,u.useState)(null),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)(null),b=(0,u.useMemo)(()=>o(),[]),x=(0,u.useRef)(b||``),S=(0,u.useRef)(null),C=(0,u.useRef)(null),w=(0,u.useRef)(!1),T=(0,u.useRef)(null),[E,D]=(0,u.useState)(`request-link`),[O,k]=(0,u.useState)(null),A=(0,u.useRef)(null),j=(0,u.useRef)(null);(0,u.useEffect)(()=>{try{let e=sessionStorage.getItem(`maxy_session`);e&&(j.current=e)}catch{}},[]);let M=(0,u.useCallback)(e=>{S.current=e,t(e);try{sessionStorage.setItem(`maxy_session`,e)}catch{}c(`chat`)},[]),N=(0,u.useCallback)(()=>{S.current=null;try{sessionStorage.removeItem(`maxy_session`)}catch{}t(null),c(`auth-required`),D(`request-link`)},[]),P=(0,u.useCallback)(async e=>{D(`verifying`);try{let t=x.current,n=await fetch(`/api/access/verify-token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,agentSlug:t})});if(window.history.replaceState({},``,window.location.pathname),n.ok){let e=await n.json().catch(()=>({}));return e?.displayName&&k({displayName:e.displayName,contactValue:``,expiresAt:null,status:`active`}),!0}return D(`verify-failed`),!1}catch{return D(`verify-failed`),!1}},[]),F=(0,u.useCallback)(async()=>{if(S.current)return S.current;if(C.current)return C.current;let e=(async()=>{try{let e=j.current,n=await fetch(`/api/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({session_id:a(),...b?{agent:b}:{},...e?{session_key:e}:{}})});if(!n.ok){let e=await n.json().catch(()=>({error:``}));return s&&console.error(`[session] POST /api/session failed: ${n.status} ${n.statusText}`,e),n.status===404?r(e.error||`Agent not found`):n.status===503&&r(e.error||`Service unavailable`),null}let i=await n.json();if(i.auth_required){i.agent_id&&(x.current=i.agent_id),d(i.displayName||``),i.agentImage&&p(i.agentImage),i.agentImageShape&&h(i.agentImageShape),i.showAgentName&&_(i.showAgentName),i.branding&&y(i.branding),c(`auth-required`);let e=new URLSearchParams(window.location.search).get(`token`);return e?await P(e)&&window.location.reload():D(`request-link`),null}S.current=i.session_key,t(i.session_key),i.displayName&&d(i.displayName),i.agentImage&&p(i.agentImage),i.agentImageShape&&h(i.agentImageShape),i.showAgentName&&_(i.showAgentName),i.branding&&y(i.branding),c(`chat`),i.resumed&&i.messages&&(w.current=!0,T.current=i.messages);try{sessionStorage.setItem(`maxy_session`,i.session_key)}catch{}return i.session_key}catch(e){return s&&console.error(`[session] fetch /api/session threw:`,e),r(`Unable to connect. Please check your connection and try again.`),null}finally{C.current=null}})();return C.current=e,e},[b,P]);return{sessionId:e,cacheKeyRef:S,sessionError:n,pageState:i,setPageState:c,agentDisplayName:l,agentImage:f,agentImageShape:m,showAgentName:g,agentSlug:b,branding:v,resolvedSlugRef:x,ensureSession:F,startNewSession:(0,u.useCallback)(async()=>{S.current=null,C.current=null,j.current=null,w.current=!1,T.current=null,t(null),r(null);try{sessionStorage.removeItem(`maxy_session`)}catch{}await F()},[F]),enterChat:M,enterGate:N,resumedRef:w,resumeMessagesRef:T,gateState:E,setGateState:D,grantInfo:O,setGrantInfo:k,gateCacheKeyRef:A}}function m(){let{ensureSession:e,pageState:t,gateState:n,setGateState:r,grantInfo:i,resolvedSlugRef:a}=p();return(0,u.useEffect)(()=>{e()},[e]),t===`loading`?(0,d.jsx)(`div`,{className:`public-loading`,children:`Loading…`}):t===`auth-required`?(0,d.jsx)(f,{gateState:n,setGateState:r,grantInfo:i,resolvedSlugRef:a}):(0,d.jsx)(`div`,{className:`public-shell`,children:(0,d.jsx)(c,{cacheKey:``,variant:`public`})})}(0,l.createRoot)(document.getElementById(`root`)).render((0,d.jsx)(m,{}));
1
+ import{o as e}from"./chunk-CAM3fms7.js";import{H as t,W as n,w as r}from"./OperatorConversations-D_o_59Oc.js";import"./admin-types-DJoj6VJv.js";import{u as i}from"./AdminShell-CyZPfbzd.js";import{a,i as o,o as s,r as c}from"./page-DFOoEKVK.js";var l=t(),u=e(n(),1),d=r();function f({gateState:e,setGateState:t,grantInfo:n,resolvedSlugRef:r}){let[a,o]=(0,u.useState)(``),[s,c]=(0,u.useState)(!1),[l,f]=(0,u.useState)(null);async function p(e){e.preventDefault();let n=a.trim().toLowerCase();if(!n){f(`Enter the email you were invited on.`);return}c(!0),f(null);try{let e=await fetch(`/api/access/request-magic-link`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({contactValue:n,agentSlug:r.current})});if(e.status===429){f((await e.json().catch(()=>({})))?.error||`Too many requests. Try again later.`);return}t(`request-sent`)}catch{f(`Could not reach the server. Check your connection and try again.`)}finally{c(!1)}}return(0,d.jsxs)(`div`,{className:`access-gate`,children:[e===`verifying`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`Verifying your link…`}),(0,d.jsx)(`p`,{children:`This takes a moment.`})]}),e===`verify-failed`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`That link did not work`}),(0,d.jsx)(`p`,{children:`It may have expired, already been used, or been for a different agent. You can request a fresh one below.`}),(0,d.jsx)(i,{onClick:()=>{t(`request-link`),f(null)},children:`Request a new link`})]}),e===`request-link`&&(0,d.jsxs)(`form`,{className:`access-gate-form`,onSubmit:p,children:[(0,d.jsx)(`h2`,{children:n?.displayName?`Welcome back, ${n.displayName}`:`Sign in`}),(0,d.jsx)(`p`,{children:`Enter the email you were invited on and we will send you a fresh link.`}),(0,d.jsx)(`label`,{htmlFor:`access-email`,children:`Email`}),(0,d.jsx)(`input`,{id:`access-email`,type:`email`,inputMode:`email`,autoComplete:`email`,value:a,onChange:e=>o(e.target.value),disabled:s}),l&&(0,d.jsx)(`p`,{className:`access-gate-error`,children:l}),(0,d.jsx)(i,{type:`submit`,disabled:s||!a.trim(),children:s?`Sending…`:`Send me a link`})]}),e===`request-sent`&&(0,d.jsxs)(`div`,{className:`access-gate-message`,children:[(0,d.jsx)(`h2`,{children:`Check your email`}),(0,d.jsx)(`p`,{children:`If that address is on the invite list, a fresh link is on the way. It expires in 15 minutes.`}),(0,d.jsx)(i,{onClick:()=>{t(`request-link`),o(``),f(null)},children:`Try a different email`})]})]})}function p(){let[e,t]=(0,u.useState)(null),[n,r]=(0,u.useState)(null),[i,c]=(0,u.useState)(`loading`),[l,d]=(0,u.useState)(``),[f,p]=(0,u.useState)(null),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)(null),b=(0,u.useMemo)(()=>o(),[]),x=(0,u.useRef)(b||``),S=(0,u.useRef)(null),C=(0,u.useRef)(null),w=(0,u.useRef)(!1),T=(0,u.useRef)(null),[E,D]=(0,u.useState)(`request-link`),[O,k]=(0,u.useState)(null),A=(0,u.useRef)(null),j=(0,u.useRef)(null);(0,u.useEffect)(()=>{try{let e=sessionStorage.getItem(`maxy_session`);e&&(j.current=e)}catch{}},[]);let M=(0,u.useCallback)(e=>{S.current=e,t(e);try{sessionStorage.setItem(`maxy_session`,e)}catch{}c(`chat`)},[]),N=(0,u.useCallback)(()=>{S.current=null;try{sessionStorage.removeItem(`maxy_session`)}catch{}t(null),c(`auth-required`),D(`request-link`)},[]),P=(0,u.useCallback)(async e=>{D(`verifying`);try{let t=x.current,n=await fetch(`/api/access/verify-token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,agentSlug:t})});if(window.history.replaceState({},``,window.location.pathname),n.ok){let e=await n.json().catch(()=>({}));return e?.displayName&&k({displayName:e.displayName,contactValue:``,expiresAt:null,status:`active`}),!0}return D(`verify-failed`),!1}catch{return D(`verify-failed`),!1}},[]),F=(0,u.useCallback)(async()=>{if(S.current)return S.current;if(C.current)return C.current;let e=(async()=>{try{let e=j.current,n=await fetch(`/api/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({session_id:a(),...b?{agent:b}:{},...e?{session_key:e}:{}})});if(!n.ok){let e=await n.json().catch(()=>({error:``}));return s&&console.error(`[session] POST /api/session failed: ${n.status} ${n.statusText}`,e),n.status===404?r(e.error||`Agent not found`):n.status===503&&r(e.error||`Service unavailable`),null}let i=await n.json();if(i.auth_required){i.agent_id&&(x.current=i.agent_id),d(i.displayName||``),i.agentImage&&p(i.agentImage),i.agentImageShape&&h(i.agentImageShape),i.showAgentName&&_(i.showAgentName),i.branding&&y(i.branding),c(`auth-required`);let e=new URLSearchParams(window.location.search).get(`token`);return e?await P(e)&&window.location.reload():D(`request-link`),null}S.current=i.session_key,t(i.session_key),i.displayName&&d(i.displayName),i.agentImage&&p(i.agentImage),i.agentImageShape&&h(i.agentImageShape),i.showAgentName&&_(i.showAgentName),i.branding&&y(i.branding),c(`chat`),i.resumed&&i.messages&&(w.current=!0,T.current=i.messages);try{sessionStorage.setItem(`maxy_session`,i.session_key)}catch{}return i.session_key}catch(e){return s&&console.error(`[session] fetch /api/session threw:`,e),r(`Unable to connect. Please check your connection and try again.`),null}finally{C.current=null}})();return C.current=e,e},[b,P]);return{sessionId:e,cacheKeyRef:S,sessionError:n,pageState:i,setPageState:c,agentDisplayName:l,agentImage:f,agentImageShape:m,showAgentName:g,agentSlug:b,branding:v,resolvedSlugRef:x,ensureSession:F,startNewSession:(0,u.useCallback)(async()=>{S.current=null,C.current=null,j.current=null,w.current=!1,T.current=null,t(null),r(null);try{sessionStorage.removeItem(`maxy_session`)}catch{}await F()},[F]),enterChat:M,enterGate:N,resumedRef:w,resumeMessagesRef:T,gateState:E,setGateState:D,grantInfo:O,setGrantInfo:k,gateCacheKeyRef:A}}function m(){let{ensureSession:e,pageState:t,gateState:n,setGateState:r,grantInfo:i,resolvedSlugRef:a}=p();return(0,u.useEffect)(()=>{e()},[e]),t===`loading`?(0,d.jsx)(`div`,{className:`public-loading`,children:`Loading…`}):t===`auth-required`?(0,d.jsx)(f,{gateState:n,setGateState:r,grantInfo:i,resolvedSlugRef:a}):(0,d.jsx)(`div`,{className:`public-shell`,children:(0,d.jsx)(c,{cacheKey:``,variant:`public`})})}(0,l.createRoot)(document.getElementById(`root`)).render((0,d.jsx)(m,{}));
@@ -1 +1 @@
1
- import{z as e}from"./OperatorConversations-JZG5tFTr.js";var t=e(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]);export{t};
1
+ import{z as e}from"./OperatorConversations-D_o_59Oc.js";var t=e(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]);export{t};
@@ -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-B0xLdNFF.js"></script>
8
+ <script type="module" crossorigin src="/assets/browser-Be9LRtM2.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
12
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -5,11 +5,11 @@
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-mMg5VWd7.js"></script>
8
+ <script type="module" crossorigin src="/assets/calendar-BeofvK7c.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
12
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -5,15 +5,15 @@
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-CUQgxmCr.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-BWNFeIjw.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-DJoj6VJv.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CQ36nxok.js">
14
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-cFVc5kyj.js">
15
- <link rel="modulepreload" crossorigin href="/assets/page-Bm85-8yI.js">
16
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BxD1B_G-.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/page-DFOoEKVK.js">
16
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
17
17
  </head>
18
18
  <body>
19
19
  <div id="root"></div>
@@ -5,11 +5,11 @@
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-6qqDzoDY.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-lTmU53k6.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-ZGGfPS26.js">
12
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-DNCXtQVn.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -5,14 +5,14 @@
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-DWk0KW9T.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-XYK2qT5D.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-ZGGfPS26.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-Do2GA1u4.js">
14
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-cFVc5kyj.js">
15
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-DNCXtQVn.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-BPYEJJPq.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BxD1B_G-.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -5,14 +5,14 @@
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-CbWQcPL8.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-DcuJ3_xm.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-DJoj6VJv.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-Do2GA1u4.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-CDygow-0.js">
15
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-BPYEJJPq.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B45MFjWG.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
16
16
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
17
17
  <link rel="stylesheet" href="/brand-defaults.css">
18
18
  </head>
@@ -5,17 +5,17 @@
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-BxVL6eVL.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-B3hpbhNo.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-DJoj6VJv.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-Do2GA1u4.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-CDygow-0.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-BPYEJJPq.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-B45MFjWG.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CQ36nxok.js">
16
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-cFVc5kyj.js">
17
- <link rel="modulepreload" crossorigin href="/assets/page-Bm85-8yI.js">
18
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
16
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BxD1B_G-.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/page-DFOoEKVK.js">
18
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
19
19
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
20
20
  </head>
21
21
  <body>
@@ -5,15 +5,15 @@
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-B6NzFgcN.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-Bd_0QBGJ.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-JZG5tFTr.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BLZcGlev.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-D_o_59Oc.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CyZPfbzd.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-DJoj6VJv.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-CQ36nxok.js">
14
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-cFVc5kyj.js">
15
- <link rel="modulepreload" crossorigin href="/assets/page-Bm85-8yI.js">
16
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-CGwMH7na.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-BxD1B_G-.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/page-DFOoEKVK.js">
16
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-Civ7TETM.css">
17
17
  <link rel="stylesheet" href="/brand-defaults.css">
18
18
  </head>
19
19
  <body class="public-surface">
@@ -5060,14 +5060,25 @@ var SUPPORTED_MIME_TYPES = /* @__PURE__ */ new Set([
5060
5060
  "text/html",
5061
5061
  "text/calendar",
5062
5062
  "application/zip",
5063
- "application/x-zip-compressed"
5063
+ "application/x-zip-compressed",
5064
+ // Task 1240 — voice recordings persist as playable clips in the admin bubble.
5065
+ // These match AUDIO_MIME_TYPES in app/lib/stt/audio-mime.ts exactly.
5066
+ "audio/ogg",
5067
+ "audio/opus",
5068
+ "audio/webm",
5069
+ "audio/mp4",
5070
+ "audio/x-m4a",
5071
+ "audio/mpeg",
5072
+ "audio/wav",
5073
+ "video/mp4"
5064
5074
  ]);
5065
5075
  var MAX_FILE_SIZE_BYTES = 50 * 1024 * 1024;
5066
5076
  var MAX_FILES_PER_MESSAGE = 5;
5067
5077
  var MAX_DATA_UPLOAD_BYTES = 2 * 1024 * 1024 * 1024;
5068
5078
  var MAX_ZIP_UNCOMPRESSED_BYTES = 100 * 1024 * 1024;
5069
5079
  function assertSupportedMime(mimeType) {
5070
- if (!SUPPORTED_MIME_TYPES.has(mimeType)) {
5080
+ const bare = mimeType.split(";")[0].trim().toLowerCase();
5081
+ if (!SUPPORTED_MIME_TYPES.has(bare)) {
5071
5082
  throw new Error(
5072
5083
  `Unsupported file type: "${mimeType}". Supported types: ${[...SUPPORTED_MIME_TYPES].join(", ")}.`
5073
5084
  );
@@ -7314,6 +7325,11 @@ var SOURCE_MAP = {
7314
7325
  webchat: "webchat",
7315
7326
  "webchat-channel": "webchat"
7316
7327
  };
7328
+ function isScheduleSource(text) {
7329
+ const m = text.match(CHANNEL_WRAPPER2);
7330
+ if (!m) return false;
7331
+ return m[1].match(SOURCE_ATTR2)?.[1] === "schedule";
7332
+ }
7317
7333
  function unwrapChannel(text) {
7318
7334
  const m = text.match(CHANNEL_WRAPPER2);
7319
7335
  if (!m) return { text };
@@ -7458,7 +7474,7 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
7458
7474
  }
7459
7475
  if (row.type === "queue-operation" && row.operation === "enqueue") {
7460
7476
  const content = asString(row.content);
7461
- if (content !== null && CHANNEL_WRAPPER2.test(content)) {
7477
+ if (content !== null && CHANNEL_WRAPPER2.test(content) && !isScheduleSource(content)) {
7462
7478
  const u = unwrapChannel(content);
7463
7479
  out.push(operatorInboundTurn(u, ts));
7464
7480
  queuedPendingSuppress.set(u.text, (queuedPendingSuppress.get(u.text) ?? 0) + 1);
@@ -7468,7 +7484,7 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
7468
7484
  if (row.type === "attachment") {
7469
7485
  const att = row.attachment;
7470
7486
  const isChannelQueued = att?.type === "queued_command" && att.isMeta === true && typeof att.origin === "object" && att.origin !== null && att.origin.kind === "channel" && typeof att.prompt === "string";
7471
- if (isChannelQueued) {
7487
+ if (isChannelQueued && !isScheduleSource(att.prompt)) {
7472
7488
  renderOrSuppressChannelInbound(unwrapChannel(att.prompt), ts, out, queuedPendingSuppress);
7473
7489
  }
7474
7490
  continue;
@@ -7489,7 +7505,9 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
7489
7505
  // enqueue row AND this row both render and every channel message doubles.
7490
7506
  CHANNEL_WRAPPER2.test(text);
7491
7507
  if (isChannel) {
7492
- renderOrSuppressChannelInbound(unwrapChannel(text), ts, out, queuedPendingSuppress);
7508
+ if (!isScheduleSource(text)) {
7509
+ renderOrSuppressChannelInbound(unwrapChannel(text), ts, out, queuedPendingSuppress);
7510
+ }
7493
7511
  } else {
7494
7512
  out.push({ kind: "operator-typed", text, ts });
7495
7513
  }
@@ -8849,20 +8867,6 @@ function createWebchatRoutes(deps) {
8849
8867
  }
8850
8868
  const audioFile = files.find((f) => isAudioMime(f.type));
8851
8869
  const regularFiles = files.filter((f) => !isAudioMime(f.type));
8852
- if (audioFile) {
8853
- if (audioFile.size > MAX_FILE_SIZE_BYTES) {
8854
- console.error(`[webchat:inbound] op=send-refused kind=voice reason=oversize bytes=${audioFile.size}`);
8855
- return c.json({ error: "Recording too long. Try a shorter voice note." }, 422);
8856
- }
8857
- const result = await transcribeVoiceNote(audioFile, "admin");
8858
- if (!result.ok) {
8859
- console.error(`[webchat:inbound] op=send-refused kind=voice reason=stt-failed detail=${result.error}`);
8860
- return c.json({ error: result.error }, 422);
8861
- }
8862
- text = text.length > 0 ? `${text}
8863
-
8864
- ${result.result.text}` : result.result.text;
8865
- }
8866
8870
  for (const file of regularFiles) {
8867
8871
  try {
8868
8872
  assertSupportedMime(file.type);
@@ -8876,6 +8880,27 @@ ${result.result.text}` : result.result.text;
8876
8880
  }
8877
8881
  }
8878
8882
  const stored = [];
8883
+ if (audioFile) {
8884
+ if (audioFile.size > MAX_FILE_SIZE_BYTES) {
8885
+ console.error(`[webchat:inbound] op=send-refused kind=voice reason=oversize bytes=${audioFile.size}`);
8886
+ return c.json({ error: "Recording too long. Try a shorter voice note." }, 422);
8887
+ }
8888
+ try {
8889
+ stored.push(await storeAttachment(accountId, audioFile));
8890
+ } catch (err) {
8891
+ const detail = err instanceof Error ? err.message : String(err);
8892
+ console.error(`[webchat:inbound] op=send-refused kind=voice reason=audio-store-failed detail=${detail}`);
8893
+ return c.json({ error: "failed to store voice recording" }, 500);
8894
+ }
8895
+ const result = await transcribeVoiceNote(audioFile, "admin");
8896
+ if (result.ok) {
8897
+ text = text.length > 0 ? `${text}
8898
+
8899
+ ${result.result.text}` : result.result.text;
8900
+ } else {
8901
+ console.error(`[webchat:inbound] op=stt-failed kind=voice detail=${result.error}`);
8902
+ }
8903
+ }
8879
8904
  try {
8880
8905
  for (const file of regularFiles) {
8881
8906
  stored.push(await storeAttachment(accountId, file));
@@ -14733,10 +14758,6 @@ async function handleDefault(c, accountId) {
14733
14758
  return handleDefaultTopLevel(c, accountId, { includeTrashed, includeAgentActions });
14734
14759
  }
14735
14760
  const agentActionLabels = includeAgentActions ? [] : [...AGENT_ACTION_LABELS];
14736
- const rawChannel = c.req.query("channel") ?? "";
14737
- const channel = rawChannel.split(",").map((s) => s.trim()).filter(Boolean);
14738
- const rawMessageSublabel = c.req.query("messageSublabel") ?? "";
14739
- const messageSublabel = rawMessageSublabel.split(",").map((s) => s.trim()).filter(Boolean);
14740
14761
  if (labels.length === 0) {
14741
14762
  console.error(
14742
14763
  `[graph-page] load rejected reason=missing-filter account=${accountId} labels=`
@@ -14768,7 +14789,7 @@ async function handleDefault(c, accountId) {
14768
14789
  try {
14769
14790
  const countCypher = includeTrashed ? DEFAULT_COUNT_CYPHER_INCLUDE_TRASHED : DEFAULT_COUNT_CYPHER;
14770
14791
  const fetchCypher = includeTrashed ? DEFAULT_FETCH_CYPHER_INCLUDE_TRASHED : DEFAULT_FETCH_CYPHER;
14771
- const cypherParams = { accountId, labels, agentActionLabels, channel, messageSublabel };
14792
+ const cypherParams = { accountId, labels, agentActionLabels };
14772
14793
  const result = await session.executeRead(async (tx) => {
14773
14794
  const countResult = await tx.run(countCypher, cypherParams);
14774
14795
  const matchedRaw = countResult.records[0]?.get("matched");
@@ -14800,10 +14821,8 @@ async function handleDefault(c, accountId) {
14800
14821
  const nodes = result.rawNodes.map((n) => pruneNode(n, warnedClasses, conversationWarnings));
14801
14822
  const edges = result.rawEdges.filter((e) => e && e.id != null).map((e) => pruneEdge(e, warnedClasses));
14802
14823
  const trashedSuffix = includeTrashed ? " includeTrashed=1" : "";
14803
- const channelSuffix = channel.length > 0 ? ` channel=${channel.join(",")}` : "";
14804
- const sublabelSuffix = messageSublabel.length > 0 ? ` messageSublabel=${messageSublabel.join(",")}` : "";
14805
14824
  console.error(
14806
- `[graph-page] load mode=default account=${accountId} agentActions=${includeAgentActions} labels=${labels.join(",")}${trashedSuffix}${channelSuffix}${sublabelSuffix} nodes=${nodes.length} edges=${edges.length} ms=${elapsed}`
14825
+ `[graph-page] load mode=default account=${accountId} agentActions=${includeAgentActions} labels=${labels.join(",")}${trashedSuffix} nodes=${nodes.length} edges=${edges.length} ms=${elapsed}`
14807
14826
  );
14808
14827
  return c.json({ nodes, edges });
14809
14828
  } catch (err) {
@@ -14831,8 +14850,6 @@ async function handleDefaultTopLevel(c, accountId, flags) {
14831
14850
  accountId,
14832
14851
  labels,
14833
14852
  agentActionLabels,
14834
- channel: [],
14835
- messageSublabel: [],
14836
14853
  topLevelLimit: neo4j2.int(TOP_LEVEL_LIMIT)
14837
14854
  };
14838
14855
  const result = await session.executeRead(async (tx) => {
@@ -15001,22 +15018,13 @@ async function handleNeighbourhood(c, accountId) {
15001
15018
  }
15002
15019
  }
15003
15020
  }
15004
- var SUBFACET_PREDICATE = `
15005
- AND (size($channel) = 0
15006
- OR NOT any(lbl IN labels(n) WHERE lbl IN ['Conversation','AdminConversation','PublicConversation'])
15007
- OR n.channel IS NULL
15008
- OR n.channel IN $channel)
15009
- AND (size($messageSublabel) = 0
15010
- OR NOT any(lbl IN labels(n) WHERE lbl IN ['Message','UserMessage','AssistantMessage','WhatsAppMessage'])
15011
- OR any(lbl IN labels(n) WHERE lbl IN $messageSublabel))
15012
- `;
15013
15021
  var DEFAULT_COUNT_CYPHER = `
15014
15022
  MATCH (n)
15015
15023
  WHERE n.accountId = $accountId
15016
15024
  AND any(lbl IN labels(n) WHERE lbl IN $labels)
15017
15025
  AND NOT any(lbl IN labels(n) WHERE lbl IN $agentActionLabels)
15018
15026
  AND NOT n:Trashed
15019
- AND n.deletedAt IS NULL${SUBFACET_PREDICATE}
15027
+ AND n.deletedAt IS NULL
15020
15028
  RETURN count(n) AS matched
15021
15029
  `;
15022
15030
  var CONVERSATION_PROPS_PROJECTION = `CASE
@@ -15030,7 +15038,7 @@ var DEFAULT_FETCH_CYPHER = `
15030
15038
  AND any(lbl IN labels(n) WHERE lbl IN $labels)
15031
15039
  AND NOT any(lbl IN labels(n) WHERE lbl IN $agentActionLabels)
15032
15040
  AND NOT n:Trashed
15033
- AND n.deletedAt IS NULL${SUBFACET_PREDICATE}
15041
+ AND n.deletedAt IS NULL
15034
15042
  WITH collect(n) AS nodes, collect(elementId(n)) AS nodeIds
15035
15043
  UNWIND nodes AS n
15036
15044
  OPTIONAL MATCH (n)-[r]-(m)
@@ -15052,7 +15060,7 @@ var DEFAULT_COUNT_CYPHER_INCLUDE_TRASHED = `
15052
15060
  WHERE n.accountId = $accountId
15053
15061
  AND any(lbl IN labels(n) WHERE lbl IN $labels)
15054
15062
  AND NOT any(lbl IN labels(n) WHERE lbl IN $agentActionLabels)
15055
- AND n.deletedAt IS NULL${SUBFACET_PREDICATE}
15063
+ AND n.deletedAt IS NULL
15056
15064
  RETURN count(n) AS matched
15057
15065
  `;
15058
15066
  var DEFAULT_FETCH_CYPHER_INCLUDE_TRASHED = `
@@ -15060,7 +15068,7 @@ var DEFAULT_FETCH_CYPHER_INCLUDE_TRASHED = `
15060
15068
  WHERE n.accountId = $accountId
15061
15069
  AND any(lbl IN labels(n) WHERE lbl IN $labels)
15062
15070
  AND NOT any(lbl IN labels(n) WHERE lbl IN $agentActionLabels)
15063
- AND n.deletedAt IS NULL${SUBFACET_PREDICATE}
15071
+ AND n.deletedAt IS NULL
15064
15072
  WITH collect(n) AS nodes, collect(elementId(n)) AS nodeIds
15065
15073
  UNWIND nodes AS n
15066
15074
  OPTIONAL MATCH (n)-[r]-(m)