@rubytech/create-maxy-code 0.1.310 → 0.1.312
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.
- package/package.json +1 -1
- package/payload/platform/lib/graph-style/dist/index.d.ts +5 -2
- package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-style/dist/index.js +65 -2
- package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-style/src/__tests__/parity.test.ts +218 -0
- package/payload/platform/lib/graph-style/src/index.ts +53 -2
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +21 -3
- package/payload/platform/plugins/docs/references/admin-ui.md +20 -2
- package/payload/platform/scripts/check-no-esm-require.mjs +4 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +29 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +16 -2
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +10 -0
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +22 -2
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reseat-ledger.d.ts +49 -0
- package/payload/platform/services/claude-session-manager/dist/reseat-ledger.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/reseat-ledger.js +148 -0
- package/payload/platform/services/claude-session-manager/dist/reseat-ledger.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/scope-record.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/scope-record.js +35 -53
- package/payload/platform/services/claude-session-manager/dist/scope-record.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/sidecar-store.d.ts +45 -0
- package/payload/platform/services/claude-session-manager/dist/sidecar-store.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/sidecar-store.js +118 -0
- package/payload/platform/services/claude-session-manager/dist/sidecar-store.js.map +1 -0
- package/payload/server/public/assets/{AccessGate-BOqUU-za.js → AccessGate-Dh5A79FU.js} +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-WvRuaNIg.js → AdminLoginScreens-B8s2TbT7.js} +1 -1
- package/payload/server/public/assets/AdminShell-Cu1zlb6L.js +1 -0
- package/payload/server/public/assets/{Checkbox-DjM6aYP_.js → Checkbox-B_sOAyv1.js} +1 -1
- package/payload/server/public/assets/OperatorConversations-hm0Gpu_Q.js +1 -0
- package/payload/server/public/assets/{admin-XbVTsU2q.js → admin-gZEndvJT.js} +1 -1
- package/payload/server/public/assets/{audio-attachment-mime-CVxjPN8V.js → audio-attachment-mime-B0b89VnH.js} +1 -1
- package/payload/server/public/assets/brand-BcNavK6q.css +1 -0
- package/payload/server/public/assets/{browser-Ct5Kwlmk.js → browser-BUlB5_MD.js} +1 -1
- package/payload/server/public/assets/chat-BnceaVl7.js +1 -0
- package/payload/server/public/assets/data-3Nl3P5wt.js +1 -0
- package/payload/server/public/assets/{graph-DWT1rhy9.js → graph-DMCKpW6P.js} +2 -2
- package/payload/server/public/assets/graph-labels-AZLGoVy8.js +1 -0
- package/payload/server/public/assets/operator-BF4F7k23.js +1 -0
- package/payload/server/public/assets/page-DQUEst1o.js +1 -0
- package/payload/server/public/assets/{public-owWW-MIA.js → public-G_-UI9nB.js} +1 -1
- package/payload/server/public/assets/{public-next-ClQwtyeC.js → public-next-C8_nExQB.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-BZsJuUm-.js → useSelectionMode-Bf6Rt-sl.js} +1 -1
- package/payload/server/public/browser.html +6 -6
- package/payload/server/public/chat.html +8 -8
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +8 -8
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/operator.html +10 -10
- package/payload/server/public/public-next.html +9 -9
- package/payload/server/public/public.html +7 -7
- package/payload/server/server.js +1007 -458
- package/payload/server/public/assets/AdminShell-DHv6_SZ4.js +0 -1
- package/payload/server/public/assets/OperatorConversations-CDY0jUMb.js +0 -1
- package/payload/server/public/assets/brand-N-Hi3IPA.css +0 -1
- package/payload/server/public/assets/chat-CEde1CLX.js +0 -1
- package/payload/server/public/assets/data-TZOmA1Qg.js +0 -1
- package/payload/server/public/assets/graph-labels-OBadNo54.js +0 -1
- package/payload/server/public/assets/operator-BpzQ9Ezb.js +0 -1
- package/payload/server/public/assets/page-Dts8u8MD.js +0 -1
- /package/payload/server/public/assets/{brand-zL3tAdql.js → brand-BQ_u9UdS.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-CAM3fms7.js";import{c as t,o as n,u as r}from"./brand-zL3tAdql.js";import{S as i,_ as a,a as o,f as s,i as c,n as l,o as u,r as ee}from"./OperatorConversations-CDY0jUMb.js";import{n as te,r as ne,t as re}from"./admin-types-D2qTXuCg.js";import{a as d,i as ie,o as ae,r as f,s as p,t as m}from"./AdminShell-DHv6_SZ4.js";import{a as h,i as g,n as _,o as oe,r as se,t as ce}from"./audio-attachment-mime-CVxjPN8V.js";import{i as le}from"./useSelectionMode-BZsJuUm-.js";var v=t(`calendar-clock`,[[`path`,{d:`M16 14v2.2l1.6 1`,key:`fo4ql5`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`path`,{d:`M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5`,key:`1osxxc`}],[`path`,{d:`M3 10h5`,key:`r794hk`}],[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`circle`,{cx:`16`,cy:`16`,r:`6`,key:`qoo3c4`}]]),y=t(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),ue=t(`corner-down-left`,[[`path`,{d:`M20 4v7a4 4 0 0 1-4 4H4`,key:`6o5b7l`}],[`path`,{d:`m9 10-5 5 5 5`,key:`1kshq7`}]]),de=t(`graduation-cap`,[[`path`,{d:`M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z`,key:`j76jl0`}],[`path`,{d:`M22 10v6`,key:`1lu8f3`}],[`path`,{d:`M6 12.5V16a6 3 0 0 0 12 0v-3.5`,key:`1r8lef`}]]),fe=t(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),b=`claude-opus-4-8[1m]`,x=`claude-sonnet-4-6`,S=`claude-haiku-4-5`,C={[b]:`Opus 4.8 (1M context)`,[x]:`Sonnet 4.6`,[S]:`Haiku 4.5`};function pe(e){return C[e]??e}function me(e){return e.replace(/\[1m\]$/,``)}var w=e(r(),1),T=n();function E({turns:e}){let[t,n]=(0,w.useState)(!1),r=e.filter(e=>e.kind===`tool-call`).length,i=r>0?`Used ${r} tool${r===1?``:`s`}`:`${e.length} tool result${e.length===1?``:`s`}`;return(0,T.jsxs)(`div`,{className:`chat-toolrun`,children:[(0,T.jsxs)(`button`,{type:`button`,className:`chat-toolrun-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,T.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,T.jsx)(`span`,{className:`chat-toolrun-label`,children:i})]}),t&&e.map((e,t)=>(0,T.jsxs)(`div`,{className:`chat-toolrun-item`,children:[(0,T.jsx)(`span`,{className:`chat-toolrun-name`,children:e.kind===`tool-call`?`↳ ${e.name}`:e.isError?`result (error)`:`result`}),(0,T.jsx)(`pre`,{className:`wa-code`,children:e.kind===`tool-call`?JSON.stringify(e.input,null,2):e.text})]},t))]})}function D({turns:e}){let[t,n]=(0,w.useState)(!1);return(0,T.jsxs)(`div`,{className:`chat-thinking`,children:[(0,T.jsxs)(`button`,{type:`button`,className:`chat-thinking-toggle`,"aria-expanded":t,onClick:()=>n(e=>!e),children:[(0,T.jsx)(`span`,{className:`wa-chevron`,children:t?`▾`:`▸`}),(0,T.jsx)(`span`,{className:`chat-thinking-label`,children:`Thinking`})]}),t&&e.map((e,t)=>(0,T.jsx)(`div`,{className:`chat-thinking-item`,children:(0,T.jsx)(g,{content:e.text})},t))]})}function O(e,t,n){switch(e.kind){case`operator-inbound`:case`operator-typed`:return(0,T.jsxs)(`div`,{className:`chat-turn-op`,children:[e.kind===`operator-inbound`&&e.source&&(0,T.jsx)(`span`,{className:`chat-via`,children:o(e.source).replace(` · `,``)}),(0,T.jsx)(`p`,{className:`chat-op-body`,children:e.text})]},t);case`agent-reply`:return(0,T.jsx)(`div`,{className:`chat-prose`,children:(0,T.jsx)(g,{content:e.text})},t);case`agent-reply-document`:return(0,T.jsxs)(`div`,{className:`chat-prose`,children:[(0,T.jsxs)(`p`,{className:`chat-doc`,children:[`📎 sent document(s): `,e.files.map(c).join(`, `)]}),e.caption&&(0,T.jsx)(g,{content:e.caption})]},t);case`agent-error`:return(0,T.jsxs)(`div`,{className:`chat-agent-error`,role:`alert`,children:[(0,T.jsx)(`span`,{className:`chat-agent-error-msg`,children:u(e.code,n)}),n===`admin`&&e.code===`agent_error`&&e.raw&&(0,T.jsx)(`pre`,{className:`chat-agent-error-raw`,children:e.raw})]},t)}}function he(e,t,n,r=`admin`){let i=[],a=[],o=[],s=()=>{a.length!==0&&(i.push((0,T.jsx)(E,{turns:a},`tools-${i.length}`)),a=[])},c=()=>{o.length!==0&&(i.push((0,T.jsx)(D,{turns:o},`think-${i.length}`)),o=[])};return e.forEach((e,u)=>{if(e.kind===`turn`&&(e.turn.kind===`tool-call`||e.turn.kind===`tool-result`)){c(),a.push(e.turn);return}if(e.kind===`turn`&&e.turn.kind===`agent-text`){s(),o.push(e.turn);return}s(),c(),e.kind===`directive`?i.push((0,T.jsx)(l,{entry:e.entry,sessionId:t,sessionKey:n},u)):i.push(O(e.turn,u,r))}),s(),c(),i}var k=[b,x,S],A=[`low`,`medium`,`high`,`xhigh`],j={low:`Low`,medium:`Medium`,high:`High`,xhigh:`Highest`},ge=[{value:`default`,label:`Ask permissions`},{value:`acceptEdits`,label:`Accept edits`},{value:`plan`,label:`Plan mode`},{value:`auto`,label:`Auto mode`},{value:`bypassPermissions`,label:`Bypass permissions`}],_e=Object.fromEntries(ge.map(e=>[e.value,e.label])),ve=2500;function M(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{weekday:`short`,day:`numeric`,month:`short`,hour:`2-digit`,minute:`2-digit`})}function ye({cacheKey:e,userName:t}){let[n,r]=(0,w.useState)(null);(0,w.useEffect)(()=>{let t=!1;return fetch(`/api/webchat/greeting?session_key=${encodeURIComponent(e)}`).then(async e=>{let n=await e.json();if(!t){if(!e.ok||n.ok!==!0){console.warn(`[admin-ui] greeting-unavailable status=${e.status} ok=${String(n.ok)}`);return}r({events:n.events,tasks:n.tasks,specialists:n.specialists??[]})}}).catch(e=>{t||console.warn(`[admin-ui] greeting-unavailable error=${e instanceof Error?e.message:String(e)}`)}),()=>{t=!0}},[e]);let i=t?.trim().split(/\s+/)[0],a=n?n.tasks.total-n.tasks.items.length:0;return(0,T.jsxs)(`div`,{className:`webchat-greeting`,children:[(0,T.jsx)(`h2`,{className:`webchat-greeting-head`,children:i?`What's up next, ${i}?`:`What's up next?`}),n&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`events`,children:[(0,T.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,T.jsx)(v,{size:14}),` Upcoming schedule`]}),n.events.length===0?(0,T.jsx)(`p`,{className:`webchat-greeting-none`,children:`Nothing scheduled`}):n.events.map(e=>(0,T.jsxs)(`div`,{className:`webchat-greeting-row`,children:[(0,T.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),(0,T.jsx)(`span`,{className:`webchat-greeting-when`,children:M(e.at)})]},e.eventId))]}),(0,T.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`tasks`,children:[(0,T.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,T.jsx)(d,{size:14}),` Outstanding tasks`]}),n.tasks.items.length===0?(0,T.jsx)(`p`,{className:`webchat-greeting-none`,children:`No open tasks`}):(0,T.jsxs)(T.Fragment,{children:[n.tasks.items.map(e=>(0,T.jsxs)(`div`,{className:`webchat-greeting-row`,children:[(0,T.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),(0,T.jsx)(`span`,{className:`webchat-greeting-status`,children:e.status})]},e.taskId)),a>0&&(0,T.jsxs)(`p`,{className:`webchat-greeting-more`,children:[`+`,a,` more`]})]})]}),(0,T.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`specialists`,children:[(0,T.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,T.jsx)(f,{size:14}),` Your specialists`]}),n.specialists.length===0?(0,T.jsx)(`p`,{className:`webchat-greeting-none`,children:`No specialists installed`}):n.specialists.map((e,t)=>(0,T.jsxs)(`div`,{className:`webchat-greeting-row webchat-greeting-row-stacked`,children:[(0,T.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),e.summary&&(0,T.jsx)(`span`,{className:`webchat-greeting-summary`,children:e.summary})]},`${t}-${e.name}`))]})]})]})}function N(e,t){let n=(0,w.useRef)(null);return(0,w.useEffect)(()=>{if(!e)return;let r=e=>{n.current&&!n.current.contains(e.target)&&t(!1)},i=e=>{e.key===`Escape`&&t(!1)};return document.addEventListener(`mousedown`,r),window.addEventListener(`keydown`,i),()=>{document.removeEventListener(`mousedown`,r),window.removeEventListener(`keydown`,i)}},[e,t]),n}function be({kind:e,label:t,icon:n,options:r,selected:a,disabled:o,onPick:s}){let[c,l]=(0,w.useState)(!1);return(0,T.jsxs)(`div`,{className:`webchat-picker`,ref:N(c,l),children:[(0,T.jsx)(`button`,{type:`button`,className:`webchat-control webchat-picker-trigger`,"data-kind":e,disabled:o,"aria-haspopup":`listbox`,"aria-expanded":c,"aria-label":a?`${t}: ${a}`:t,title:`${t} — ${a??t} (applies to new sessions)`,onClick:()=>l(e=>!e),children:n}),c&&(0,T.jsx)(`div`,{className:`webchat-picker-panel`,role:`listbox`,children:r.map(t=>(0,T.jsxs)(`button`,{type:`button`,className:`webchat-picker-option`,"data-kind":e,"data-value":t.value,role:`option`,"aria-checked":t.value===a||t.label===a,onClick:()=>{s(t.value),l(!1)},children:[(0,T.jsx)(i,{size:12,className:`webchat-picker-check`}),t.label]},t.value))})]})}function xe({icon:e,value:t,index:n,disabled:r,onPick:i}){let[a,o]=(0,w.useState)(!1),s=N(a,o),c=j[t]??`Medium`;return(0,T.jsxs)(`div`,{className:`webchat-picker`,ref:s,children:[(0,T.jsx)(`button`,{type:`button`,className:`webchat-control webchat-picker-trigger`,"data-kind":`effort`,disabled:r,"aria-haspopup":`dialog`,"aria-expanded":a,"aria-label":`Thinking effort: ${c}`,title:`Thinking — ${c} (Faster ↔ Smarter, applies to new sessions)`,onClick:()=>o(e=>!e),children:e}),a&&(0,T.jsxs)(`div`,{className:`webchat-picker-panel webchat-effort-panel`,role:`dialog`,"aria-label":`Effort for new sessions`,children:[(0,T.jsxs)(`div`,{className:`webchat-effort-head`,children:[(0,T.jsxs)(`span`,{className:`webchat-effort-title`,children:[`Effort `,(0,T.jsx)(`strong`,{children:c})]}),(0,T.jsx)(`span`,{className:`webchat-effort-help`,title:`Higher effort spends more time reasoning before each reply.`,children:(0,T.jsx)(y,{size:13})})]}),(0,T.jsxs)(`div`,{className:`webchat-effort-ends`,children:[(0,T.jsx)(`span`,{children:`Faster`}),(0,T.jsx)(`span`,{children:`Smarter`})]}),(0,T.jsxs)(`div`,{className:`webchat-effort-track`,children:[(0,T.jsx)(`span`,{className:`webchat-effort-dots`,"aria-hidden":`true`,children:A.map((e,t)=>(0,T.jsx)(`span`,{className:`webchat-effort-dot`,"data-max":t===A.length-1},e))}),(0,T.jsx)(`input`,{type:`range`,className:`webchat-effort-slider`,"data-kind":`effort`,min:0,max:A.length-1,step:1,value:n,disabled:r,"aria-label":`Effort for new sessions`,onChange:e=>i(A[Number(e.target.value)])})]})]})]})}function P({cacheKey:e,userName:t,targetSessionId:n,variant:r=`admin`}){let i=r===`public`,[o,s]=(0,w.useState)(null),[c,l]=(0,w.useState)(null),[u,d]=(0,w.useState)(``),[f,p]=(0,w.useState)(!1),[m,g]=(0,w.useState)([]),[v,y]=(0,w.useState)(null),[b,x]=(0,w.useState)(!1),S=(0,w.useRef)(null),C=()=>Math.round((typeof window>`u`?900:window.innerHeight)/3),[E,D]=(0,w.useState)(null),O=(0,w.useRef)(null),j=(0,w.useRef)(null),M=(0,w.useCallback)(e=>{let t=j.current;t&&D(Math.min(C(),Math.max(44,t.startH+(t.startY-e.clientY))))},[]),N=(0,w.useCallback)(()=>{j.current=null,window.removeEventListener(`pointermove`,M),window.removeEventListener(`pointerup`,N)},[M]),P=(0,w.useCallback)(e=>{j.current={startY:e.clientY,startH:O.current?.offsetHeight??44},window.addEventListener(`pointermove`,M),window.addEventListener(`pointerup`,N),e.preventDefault()},[M,N]),F=(0,w.useCallback)(e=>{let t=E??O.current?.offsetHeight??44;e.key===`ArrowUp`?(e.preventDefault(),D(Math.min(C(),t+24))):e.key===`ArrowDown`&&(e.preventDefault(),D(Math.max(44,t-24)))},[E]),I=(0,w.useCallback)(e=>{y(null);let t=e.find(e=>!ce(e.type,ne));if(t){y(`Unsupported file type: "${t.type}". Supported: images, PDF, plain text, markdown, CSV, calendar, zip, voice notes.`);return}let n=e.find(e=>e.size>te);if(n){y(`"${n.name}" exceeds the 50 MB limit.`);return}g(t=>[...t,...e].slice(0,5))},[]),L=(0,w.useMemo)(()=>m.map(e=>e.type.startsWith(`image/`)?URL.createObjectURL(e):null),[m]);(0,w.useEffect)(()=>()=>{for(let e of L)e&&URL.revokeObjectURL(e)},[L]);let R=_(),z=R.state===`recording`||R.state===`paused`||R.state===`sending`,Se=(0,w.useCallback)(async()=>{let t=await R.send();if(!t)return;let r=t.type===`audio/ogg`?`.ogg`:t.type===`audio/mp4`?`.m4a`:`.webm`,a=new File([t],`voice-note${r}`,{type:t.type});if(f){g(e=>[...e,a].slice(0,5));return}p(!0);let o=new FormData;i?(o.append(`message`,``),o.append(`session_key`,c??``)):o.append(`text`,``),o.append(`attachments`,a),!i&&n&&o.append(`session`,n);try{let t=i?await fetch(`/api/chat`,{method:`POST`,body:o}):await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,body:o});t.ok||(console.error(`[admin-ui] webchat-send-failed kind=voice status=${t.status}`),g(e=>[...e,a].slice(0,5)),y(`Voice note failed to send. The recording is attached — press send to retry.`))}catch(e){console.error(`[admin-ui] webchat-send-failed kind=voice error=${e instanceof Error?e.message:String(e)}`),g(e=>[...e,a].slice(0,5)),y(`Voice note failed to send. The recording is attached — press send to retry.`)}finally{p(!1)}},[R,e,n,f,i,c]),B=(0,w.useRef)(!1);(0,w.useEffect)(()=>(B.current=!1,()=>{B.current=!0}),[]);let V=(0,w.useRef)(!1),H=(0,w.useCallback)(async()=>{if(V.current)return null;V.current=!0;try{if(i){let e=await fetch(`/api/public-reader/session`);if(!e.ok)return null;let t=await e.json();if(B.current)return null;l(t.sessionKey);let n={sessionId:t.sessionId??``,projectDir:t.projectDir};return s(n),n}let t=`session_key=${encodeURIComponent(e)}${n?`&session=${encodeURIComponent(n)}`:``}`,r=await fetch(`/api/webchat/session?${t}`);if(!r.ok)return null;let a=await r.json();return B.current||s(a),a}catch{return null}finally{V.current=!1}},[e,n,i]);(0,w.useEffect)(()=>{H();let e=setInterval(()=>{H()},ve);return()=>clearInterval(e)},[H]);let U=(0,w.useCallback)(async()=>{let t=u.trim();if(!(!t&&m.length===0||f)){p(!0);try{if(i){let e=c;if(!e){console.error(`[public-webchat] op=send-skip reason=no-key`);return}let n;if(m.length>0){let r=new FormData;r.append(`message`,t),r.append(`session_key`,e);for(let e of m)r.append(`attachments`,e);n=await fetch(`/api/chat`,{method:`POST`,body:r})}else n=await fetch(`/api/chat`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({message:t,session_key:e})});n.ok?(d(``),g([]),y(null)):console.error(`[public-webchat] op=send-failed status=${n.status}`);return}let r;if(m.length>0){let i=new FormData;i.append(`text`,t);for(let e of m)i.append(`attachments`,e);n&&i.append(`session`,n),r=await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,body:i})}else r=await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n?{text:t,session:n}:{text:t})});r.ok?(d(``),g([]),y(null)):r.status===409?console.error(`[admin-ui] webchat-send-refused reason=channel-conflict`):console.error(`[admin-ui] webchat-send-failed status=${r.status}`)}catch(e){console.error(`[admin-ui] webchat-send-failed error=${e instanceof Error?e.message:String(e)}`)}finally{p(!1)}}},[u,f,e,m,n,i,c]),Ce=(0,w.useCallback)(e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),U())},[U]),W=n?o?.channelBinding??null:null,we=(0,w.useRef)(!1);(0,w.useEffect)(()=>{!n||we.current||!o||(we.current=!0,console.warn(`[admin-ui] chat-session-target sessionId=${n} jsonl=${o.projectDir?`found`:`missing`} known=${o.known===!0}`))},[o,n]);let Te=(0,w.useRef)(!1);(0,w.useEffect)(()=>{n||Te.current||!o?.sessionId||(Te.current=!0,console.info(`[admin-ui] chat-session-resolve sessionId=${o.sessionId.slice(0,8)} source=canonical`))},[o,n]);let G=o?o.effectivePermissionMode??o.permissionMode??null:null,K=o?.model??null,Ee=o?.activity===`busy`,[q,De]=(0,w.useState)(null),[J,Oe]=(0,w.useState)(null),[Y,ke]=(0,w.useState)(null),[Ae,X]=(0,w.useState)(null),Z=(0,w.useCallback)(async(t,n)=>{let r=t===`model`?De:t===`effort`?Oe:ke;r(n),X(null);try{let i=await fetch(`/api/webchat/settings?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:t,value:n})});i.ok||(r(null),X(`Could not save ${t} (status ${i.status})`),console.error(`[admin-ui] webchat-settings-failed op=${t} status=${i.status}`))}catch(e){r(null),X(`Could not save ${t} (network error)`),console.error(`[admin-ui] webchat-settings-failed op=${t} error=${e instanceof Error?e.message:String(e)}`)}},[e]),Q=(0,w.useRef)(!1),je=(0,w.useCallback)(async t=>{if(o?.sessionId&&!Q.current){Q.current=!0,X(null);try{let n=await fetch(`/api/admin/session-reseat?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({fromSessionId:o.sessionId,model:t})});if(!n.ok){X(`Could not move this chat (status ${n.status})`),console.error(`[admin-ui] reseat-failed status=${n.status}`),Q.current=!1;return}let r=await n.json();r.target?window.location.href=r.target:Q.current=!1}catch(e){X(`Could not move this chat (network error)`),console.error(`[admin-ui] reseat-failed error=${e instanceof Error?e.message:String(e)}`),Q.current=!1}}},[e,o?.sessionId]);(0,w.useEffect)(()=>{q!==null&&o?.leverModel===q&&De(null),J!==null&&o?.leverEffort===J&&Oe(null),Y!==null&&o?.leverMode===Y&&ke(null)},[o,q,J,Y]);let $=q??o?.leverModel??K??``,Me=J??o?.leverEffort??``,Ne=Y??o?.leverMode??G??null,Pe=Math.max(0,A.indexOf(Me||`medium`)),Fe=$&&!k.includes($)?[...k,$]:k,Ie=(0,w.useRef)(!1);return(0,w.useEffect)(()=>{Ie.current||o?.projectDir&&o.activity==null&&G==null&&K==null&&(Ie.current=!0,console.warn(`[admin-ui] composer-indicators-unavailable sessionId=${o.sessionId} (manager meta unreadable or pre-activity)`))},[o,G,K]),(0,T.jsxs)(`div`,{className:`webchat-page`,children:[o?.projectDir?(0,T.jsx)(ee,{sessionId:o.sessionId,projectDir:o.projectDir,sessionKey:i?c??``:e,renderItems:i?(e,t,n)=>he(e,t,n,`public`):he,cleanViewToggle:r===`admin`,forceDeliveredOnly:r===`operator`||i,streamEndpoint:i?`/api/public-reader/stream`:`/api/whatsapp-reader/stream`,suppressDirectives:i},o.sessionId):o&&!i?!n||o.known?(0,T.jsx)(ye,{cacheKey:e,userName:t}):(0,T.jsx)(`div`,{className:`webchat-greeting`,children:(0,T.jsx)(`p`,{className:`webchat-greeting-none`,children:`No transcript found for this session.`})}):null,(0,T.jsx)(`div`,{className:`webchat-composer`,children:(0,T.jsxs)(`div`,{className:`webchat-composer-box${b?` drag-over`:``}`,onDragOver:e=>{e.preventDefault(),x(!0)},onDragLeave:()=>x(!1),onDrop:e=>{e.preventDefault(),x(!1),I([...e.dataTransfer.files])},children:[(0,T.jsx)(`input`,{ref:S,type:`file`,multiple:!0,accept:re,style:{display:`none`},onChange:e=>{e.target.files&&I([...e.target.files]),e.target.value=``}}),!z&&(0,T.jsx)(`div`,{className:`webchat-resize-handle`,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize input — drag up to enlarge`,tabIndex:0,onPointerDown:P,onKeyDown:F}),m.length>0&&(0,T.jsx)(`div`,{className:`attachment-strip`,children:m.map((e,t)=>(0,T.jsxs)(`div`,{className:`attachment-chip`,children:[L[t]?(0,T.jsx)(`img`,{src:L[t],alt:e.name,className:`attachment-chip-thumb`}):e.type.startsWith(`audio/`)?(0,T.jsx)(h,{size:14}):e.type===`application/pdf`?(0,T.jsx)(le,{size:14}):(0,T.jsx)(oe,{size:14}),(0,T.jsx)(`span`,{className:`attachment-chip-name`,children:e.name}),(0,T.jsx)(`button`,{type:`button`,className:`attachment-chip-remove`,onClick:()=>g(e=>e.filter((e,n)=>n!==t)),"aria-label":`Remove ${e.name}`,children:`×`})]},t))}),v&&(0,T.jsx)(`p`,{className:`attach-error`,children:v}),R.state===`error`&&R.errorMessage&&(0,T.jsxs)(`p`,{className:`voice-error`,role:`alert`,children:[(0,T.jsx)(h,{size:14}),R.errorMessage]}),z?(0,T.jsx)(`div`,{className:`webchat-input-row voice-active`,children:(0,T.jsx)(se,{state:R.state,elapsedSeconds:R.elapsedSeconds,waveform:R.waveform,onTogglePause:R.togglePause,onDiscard:R.discard,onSend:()=>void Se()})}):(0,T.jsxs)(`div`,{className:`webchat-input-row`,children:[(0,T.jsx)(`textarea`,{ref:O,className:`webchat-input`,value:u,placeholder:`Message your agent…`,rows:2,style:E==null?void 0:{height:`${E}px`},disabled:W!==null,onChange:e=>d(e.target.value),onKeyDown:Ce,onPaste:e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(!t)continue;let r=t.type.split(`/`)[1]?.replace(`jpeg`,`jpg`)||`png`;n.push(new File([t],`pasted-image-${Date.now()}.${r}`,{type:t.type}))}n.length>0&&I(n)}}),(0,T.jsx)(`button`,{type:`button`,className:`webchat-send`,onClick:()=>void U(),disabled:f||u.trim().length===0&&m.length===0||W!==null,"aria-label":`Send`,title:`Send`,children:(0,T.jsx)(ue,{size:16})})]}),W!==null&&(0,T.jsxs)(`p`,{className:`webchat-conflict-hint`,children:[`This session is bound to the `,W,` channel — message it there. The transcript stays readable here.`]}),(0,T.jsxs)(`div`,{className:`webchat-controls`,children:[(0,T.jsxs)(`div`,{className:`webchat-controls-left`,children:[(0,T.jsx)(`button`,{type:`button`,className:`webchat-control`,onClick:()=>S.current?.click(),disabled:W!==null,title:`Attach files`,"aria-label":`Attach`,children:(0,T.jsx)(ie,{size:14})}),(0,T.jsx)(`button`,{type:`button`,className:`webchat-control`,onClick:R.start,disabled:z||W!==null,title:`Record voice note`,"aria-label":`Voice input`,children:(0,T.jsx)(h,{size:14})})]}),!i&&(0,T.jsxs)(`div`,{className:`webchat-controls-right`,children:[Ae&&(0,T.jsx)(`span`,{className:`webchat-settings-error`,role:`alert`,children:Ae}),Ee&&(0,T.jsx)(a,{size:14,className:`spin webchat-busy`,"aria-label":`Agent is working`}),Ne&&(0,T.jsx)(be,{kind:`mode`,label:`Permission mode`,icon:(0,T.jsx)(fe,{size:14}),options:ge,selected:_e[Ne]??Ne,disabled:W!==null,onPick:e=>void Z(`mode`,e)}),(0,T.jsx)(be,{kind:`model`,label:`Model`,icon:(0,T.jsx)(ae,{size:14}),options:Fe.map(e=>({value:e,label:pe(e)})),selected:$?pe($):null,disabled:W!==null,onPick:e=>{o?.projectDir?(!K||me(e)!==me(K))&&je(e):Z(`model`,e)}}),(0,T.jsx)(xe,{icon:(0,T.jsx)(de,{size:14}),value:Me,index:Pe,disabled:W!==null,onPick:e=>void Z(`effort`,e)})]})]})]})})]})}function F({variant:e=`admin`}){let[t,n]=(0,w.useState)(null),[r]=(0,w.useState)(()=>{if(e===`operator`)return null;try{return new URLSearchParams(window.location.search).get(`session`)}catch{return null}}),[i,o]=(0,w.useState)(!1),[c,l]=(0,w.useState)(void 0),[u,ee]=(0,w.useState)(null),[te,ne]=(0,w.useState)(void 0),[re,d]=(0,w.useState)(null),[ie,ae]=(0,w.useState)(null);(0,w.useEffect)(()=>{let e=!1,t=null;try{t=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!t){n(null),o(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(t)}`).then(async r=>{if(!e){if(r.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`;return}if(r.ok)try{let e=await r.json();typeof e.businessName==`string`&&l(e.businessName),e.sessionId!==void 0&&ee(e.sessionId??null),ae(e.role??null),ne(e.userName===void 0?null:e.userName),d(e.avatar??null)}catch{}n(t),o(!0)}}).catch(()=>{e||(n(t),o(!0))}),()=>{e=!0}},[]);let f=(0,w.useRef)(!1);(0,w.useEffect)(()=>{e!==`operator`||!i||!t||f.current||(f.current=!0,console.info(`[operator-ui] op=mount surface=chat sessionId=${(u??``).slice(0,8)}`))},[e,i,t,u]);let h=(0,w.useCallback)(()=>{try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},[]),[g,_]=(0,w.useState)(!1),oe=(0,w.useCallback)(async()=>{_(!0);try{let e=await p();if(e){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`}return e}finally{_(!1)}},[]);return i?t?(0,T.jsx)(s,{cacheKey:t,surface:`chat`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=chat`);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},children:(0,T.jsx)(m,{cacheKey:t,businessName:c,variant:e,sessionId:u,onLogout:h,onDisconnect:oe,disconnecting:g,userName:te,userAvatar:re,role:ie,children:(0,T.jsx)(P,{cacheKey:t,userName:te??null,targetSessionId:r,variant:e})})}):(0,T.jsx)(`div`,{className:`data-page`,children:(0,T.jsxs)(`div`,{className:`data-empty`,children:[(0,T.jsx)(`p`,{children:`You are not signed in.`}),(0,T.jsxs)(`p`,{children:[`Open the `,(0,T.jsx)(`a`,{href:`/`,className:`data-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,T.jsx)(`div`,{className:`data-page`,children:(0,T.jsxs)(`div`,{className:`data-loading`,children:[(0,T.jsx)(a,{size:18,className:`spin`}),` Loading…`]})})}function I(){return(0,T.jsx)(F,{})}export{I as n,P as r,F as t};
|
|
File without changes
|