@piagent/platform 1.44.3 → 1.44.4

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 (83) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/README.vi.md +1 -1
  4. package/docs/command-reference-vietnamese.md +2 -2
  5. package/docs/distribution-standard.md +6 -6
  6. package/docs/en/windows.md +2 -0
  7. package/docs/herdr-workflow.md +13 -1
  8. package/docs/languages.json +4 -4
  9. package/docs/operator-manual-vietnamese.md +7 -7
  10. package/docs/publishing-for-teams.md +1 -0
  11. package/docs/quickstart-vietnamese.md +1 -1
  12. package/docs/release-install-policy.md +2 -2
  13. package/docs/team-onboarding.md +2 -2
  14. package/docs/vi/windows.md +2 -0
  15. package/docs-site/architecture.html +1 -1
  16. package/docs-site/assets/search-en.json +1 -1
  17. package/docs-site/assets/search-vi.json +1 -1
  18. package/docs-site/benchmark.html +1 -1
  19. package/docs-site/commands.html +1 -1
  20. package/docs-site/content/en/quickstart.html +1 -1
  21. package/docs-site/content/quickstart.html +1 -1
  22. package/docs-site/context-engine.html +1 -1
  23. package/docs-site/ecosystem.html +1 -1
  24. package/docs-site/en/architecture.html +1 -1
  25. package/docs-site/en/benchmark.html +1 -1
  26. package/docs-site/en/commands.html +1 -1
  27. package/docs-site/en/context-engine.html +1 -1
  28. package/docs-site/en/ecosystem.html +1 -1
  29. package/docs-site/en/index.html +9 -9
  30. package/docs-site/en/mcp-approval.html +1 -1
  31. package/docs-site/en/mcp-auth.html +1 -1
  32. package/docs-site/en/mcp-servers.html +1 -1
  33. package/docs-site/en/mcp.html +1 -1
  34. package/docs-site/en/permissions.html +1 -1
  35. package/docs-site/en/profiles.html +1 -1
  36. package/docs-site/en/quickstart.html +2 -2
  37. package/docs-site/en/runtime.html +1 -1
  38. package/docs-site/en/scope.html +1 -1
  39. package/docs-site/en/security.html +1 -1
  40. package/docs-site/en/team.html +1 -1
  41. package/docs-site/en/update.html +3 -3
  42. package/docs-site/en/whats-new.html +27 -16
  43. package/docs-site/en/windows.html +1 -1
  44. package/docs-site/en/workflows.html +1 -1
  45. package/docs-site/index.html +9 -9
  46. package/docs-site/mcp-approval.html +1 -1
  47. package/docs-site/mcp-auth.html +1 -1
  48. package/docs-site/mcp-servers.html +1 -1
  49. package/docs-site/mcp.html +1 -1
  50. package/docs-site/permissions.html +1 -1
  51. package/docs-site/profiles.html +1 -1
  52. package/docs-site/quickstart.html +2 -2
  53. package/docs-site/releases.json +31 -0
  54. package/docs-site/runtime.html +1 -1
  55. package/docs-site/scope.html +1 -1
  56. package/docs-site/security.html +1 -1
  57. package/docs-site/team.html +1 -1
  58. package/docs-site/update.html +3 -3
  59. package/docs-site/whats-new.html +27 -16
  60. package/docs-site/windows.html +1 -1
  61. package/docs-site/workflows.html +1 -1
  62. package/evals/private-holdout-v1/public-exposure.v2.json +2 -2
  63. package/package.json +1 -1
  64. package/packages/piagent-core/extensions/company-session-guard.ts +4 -2
  65. package/packages/piagent-core/managed/herdr-reporter.mjs +85 -0
  66. package/packages/piagent-core/managed/store.d.mts +1 -0
  67. package/packages/piagent-core/managed/store.mjs +13 -0
  68. package/packages/piagent-core/package.json +1 -1
  69. package/packages/piagent-webui/dist/client/assets/{App-DcaqK-_s.js → App-CiwY9VpU.js} +1 -1
  70. package/packages/piagent-webui/dist/client/assets/{GatewayApp-5DVdNIyr.js → GatewayApp-DrNJW3v_.js} +3 -3
  71. package/packages/piagent-webui/dist/client/assets/{InspectionApp-CBPHxuqj.js → InspectionApp-BBiwSaV0.js} +1 -1
  72. package/packages/piagent-webui/dist/client/assets/{SessionAgentWorkspace-DmD9Qt4f.js → SessionAgentWorkspace-DwyPebIX.js} +1 -1
  73. package/packages/piagent-webui/dist/client/assets/{SessionInspectorDrawer-CK5ujmH3.js → SessionInspectorDrawer-CpVzaf_G.js} +2 -2
  74. package/packages/piagent-webui/dist/client/assets/SettingsNavigation-C-tO5iXn.js +3 -0
  75. package/packages/piagent-webui/dist/client/assets/{SettingsPage-Dda8GW2a.js → SettingsPage-Ca-qRSZa.js} +1 -1
  76. package/packages/piagent-webui/dist/client/assets/{TerminalPanel-X2389XHl.js → TerminalPanel-B8j_r6-y.js} +1 -1
  77. package/packages/piagent-webui/dist/client/assets/{WorkspaceCodeEditor-Dt3dS_QG.js → WorkspaceCodeEditor-BDTPvq-0.js} +1 -1
  78. package/packages/piagent-webui/dist/client/assets/{WorkspaceExplorer-CBHwY4BN.js → WorkspaceExplorer-DVsNU0eu.js} +3 -3
  79. package/packages/piagent-webui/dist/client/assets/{index-BMQo9OEq.js → index-uhJMXxqD.js} +2 -2
  80. package/packages/piagent-webui/dist/client/index.html +1 -1
  81. package/packages/piagent-webui/shared/company-copy.ts +1 -0
  82. package/scripts/piagent-studio.mjs +16 -6
  83. package/packages/piagent-webui/dist/client/assets/SettingsNavigation-BnorH-l_.js +0 -3
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/WorkspaceCodeEditor-Dt3dS_QG.js","assets/rolldown-runtime-hePW80VL.js","assets/vendor-CSDKB7mU.js","assets/ui-preferences-0waeSO-S.js","assets/index-BMQo9OEq.js","assets/index-Dqb2hNan.css","assets/dist-D6i5SpQu.js"])))=>i.map(i=>d[i]);
2
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Bt as t,Ct as n,Dn as r,Fn as i,G as a,Ht as o,L as s,Lt as c,Pn as l,Pt as u,Rt as d,St as f,U as p,Ut as m,Vt as h,W as g,Wt as _,_t as v,qt as y,t as b,zt as ee}from"./vendor-CSDKB7mU.js";import{i as x,n as S}from"./ui-preferences-0waeSO-S.js";import{t as C}from"./index-BMQo9OEq.js";import{i as w,n as T,o as E}from"./bootstrap-CedkNtRG.js";import{G as te,h as D,lt as ne,m as O}from"./api-BQS4Dtrr.js";import{s as k}from"./workspace-navigation-DkVobhwg.js";import{r as A}from"./composer-drafts-BtMaVw8W.js";import{a as j,c as M,d as re,f as N,i as P,l as F,o as ie,s as I,t as ae,u as L}from"./LineReview-C_0ZpgCH.js";import{t as oe}from"./tab-close-ITV4Cf4X.js";import{a as se,i as R,n as z,t as B}from"./workspace-api-D8sJkiZB.js";var V=e(i(),1),H=r();function ce(e,t,r,i=[]){let{locale:a}=x(),[o,s]=(0,V.useState)(()=>M(e)),[c,l]=(0,V.useState)();(0,V.useEffect)(()=>{s(M(e)),l(void 0);let t=t=>{t.detail===e&&s(M(e))};return window.addEventListener(ie,t),()=>window.removeEventListener(ie,t)},[e]),(0,V.useEffect)(()=>l(void 0),[t]);let u=t=>{s(t),re(e,t)},d={locale:a,comments:o,editing:c?I(c.path,c.side,c.line):null,open:(e,t,n,r)=>l({path:e,line:n,code:r,side:t}),cancel:()=>l(void 0),save:t=>{c&&u(L(M(e),{...c,text:t})),l(void 0)},remove:t=>u(M(e).filter(e=>I(e.path,e.side,e.line)!==t))},f=new Map(r.split(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/WorkspaceCodeEditor-BDTPvq-0.js","assets/rolldown-runtime-hePW80VL.js","assets/vendor-CSDKB7mU.js","assets/ui-preferences-0waeSO-S.js","assets/index-uhJMXxqD.js","assets/index-Dqb2hNan.css","assets/dist-D6i5SpQu.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Bt as t,Ct as n,Dn as r,Fn as i,G as a,Ht as o,L as s,Lt as c,Pn as l,Pt as u,Rt as d,St as f,U as p,Ut as m,Vt as h,W as g,Wt as _,_t as v,qt as y,t as b,zt as ee}from"./vendor-CSDKB7mU.js";import{i as x,n as S}from"./ui-preferences-0waeSO-S.js";import{t as C}from"./index-uhJMXxqD.js";import{i as w,n as T,o as E}from"./bootstrap-CedkNtRG.js";import{G as te,h as D,lt as ne,m as O}from"./api-BQS4Dtrr.js";import{s as k}from"./workspace-navigation-DkVobhwg.js";import{r as A}from"./composer-drafts-BtMaVw8W.js";import{a as j,c as M,d as re,f as N,i as P,l as F,o as ie,s as I,t as ae,u as L}from"./LineReview-C_0ZpgCH.js";import{t as oe}from"./tab-close-ITV4Cf4X.js";import{a as se,i as R,n as z,t as B}from"./workspace-api-D8sJkiZB.js";var V=e(i(),1),H=r();function ce(e,t,r,i=[]){let{locale:a}=x(),[o,s]=(0,V.useState)(()=>M(e)),[c,l]=(0,V.useState)();(0,V.useEffect)(()=>{s(M(e)),l(void 0);let t=t=>{t.detail===e&&s(M(e))};return window.addEventListener(ie,t),()=>window.removeEventListener(ie,t)},[e]),(0,V.useEffect)(()=>l(void 0),[t]);let u=t=>{s(t),re(e,t)},d={locale:a,comments:o,editing:c?I(c.path,c.side,c.line):null,open:(e,t,n,r)=>l({path:e,line:n,code:r,side:t}),cancel:()=>l(void 0),save:t=>{c&&u(L(M(e),{...c,text:t})),l(void 0)},remove:t=>u(M(e).filter(e=>I(e.path,e.side,e.line)!==t))},f=new Map(r.split(`
3
3
  `).map((e,n)=>[I(t??``,`new`,n+1),e.slice(0,400)]));for(let e of i)for(let n of e.lines)n.oldLineNumber!==null&&f.set(I(t??``,`old`,n.oldLineNumber),n.text.slice(0,400));return{open:(e,n,r=`new`)=>{t&&l({path:t,line:e,code:n,side:r})},dialog:(0,H.jsxs)(n,{open:!!c,onClose:()=>l(void 0),fullWidth:!0,children:[(0,H.jsxs)(p,{children:[S(a,`Comment theo dòng`,`Line comment`),` · `,c?.path,`:`,c?.line]}),(0,H.jsx)(g,{children:(0,H.jsx)(j.Provider,{value:d,children:c&&(0,H.jsx)(P,{path:c.path,side:c.side,line:c.line})})})]}),bar:(0,H.jsx)(ae,{comments:o,lines:f,linesPath:t,locale:a,onClear:()=>u([]),onSend:()=>{let t=M(e);t.length&&A(e,F(t,a===`en`)),u([])}})}}var U=new Map;function le(e,r,i,s,l){let{locale:u}=x(),d=`${e}\0${r??``}`,f=`${d}\0${i}\0${s}`,m=(0,V.useRef)(f);m.current=f;let _=(0,V.useRef)(d);_.current=d;let v=(0,V.useRef)(!1),[y,b]=(0,V.useState)(!1),[ee,C]=(0,V.useState)(!1),[w,T]=(0,V.useState)(),[E,D]=(0,V.useState)(),[O,k]=(0,V.useState)(!1);(0,V.useEffect)(()=>{C(!1),T(void 0),D(void 0),k(U.has(d))},[d]);let A=async t=>{if(!(v.current||!s||!l||l.file.path!==r||l.file.currentDigest!==`sha256:${i}`)&&(C(!0),D(void 0),T(void 0),k(U.has(d)),!U.has(d))){v.current=!0,b(!0);try{let n=await te(e,l.file.fileRef,t);if(m.current!==f)return;if(n.state!==`ready`||!n.target||n.target.path!==r||n.target.fileRef!==l.file.fileRef||n.target.fileRevision!==l.file.fileRevision||!n.target.hunkRefs.some(e=>e===t))throw Error(`preview-unavailable`);T({value:n,scope:f})}catch{m.current===f&&D(S(u,`Chưa thể hoàn tác an toàn. Tải lại diff và thử lại.`,`Safe revert is unavailable. Refresh the diff and try again.`))}finally{v.current=!1,b(!1)}}},j=async()=>{if(!(v.current||!s||!U.has(d)&&(!w||w.scope!==f))){v.current=!0,b(!0),D(void 0);try{let t=U.get(d)??await N(w.value);if(m.current!==f)return;if(!U.has(d)&&U.size>=128){D(S(u,`Có quá nhiều lệnh chưa rõ kết quả. Kiểm tra lại các lệnh trước trước khi hoàn tác thêm.`,`Too many commands still need their results checked. Check earlier commands before reverting more.`));return}U.set(d,t),k(!0);let n=await ne(t,void 0,e);if(n.phase!==`uncertain`&&U.delete(d),_.current===d&&k(U.has(d)),window.dispatchEvent(new CustomEvent(`piagent-workspace-changed`,{detail:{sessionRef:e}})),m.current!==f)return;k(U.has(d)),n.phase===`settled`?(C(!1),T(void 0)):(n.phase===`rejected`&&T(void 0),D(n.phase===`uncertain`?S(u,`Chưa xác định được kết quả. Kiểm tra tệp; kiểm tra lại sẽ dùng đúng lệnh cũ.`,`The result is uncertain. Inspect the file; checking again uses the same command.`):S(u,`Tệp hoặc quyền đã thay đổi. Hãy đóng và xem preview mới.`,`The file or permission changed. Close this dialog and request a new preview.`)))}catch{m.current===f&&D(S(u,`Chưa nhận được kết quả. Kiểm tra lại dùng cùng lệnh, không tạo lần hoàn tác mới.`,`No result received. Checking again reuses the same command.`))}finally{v.current=!1,b(!1)}}},M=w&&w.scope!==f;return{request:A,dialog:(0,H.jsxs)(n,{open:ee,onClose:()=>{y||C(!1)},fullWidth:!0,maxWidth:`md`,children:[(0,H.jsx)(p,{children:S(u,`Hoàn tác thay đổi của agent`,`Revert agent changes`)}),(0,H.jsxs)(g,{children:[(0,H.jsx)(c,{children:r}),(0,H.jsx)(c,{children:S(u,`Các dòng dưới đây sẽ được hoàn tác. Git index được giữ nguyên.`,`The changes below will be reverted. The Git index is preserved.`)}),E&&(0,H.jsx)(o,{severity:`warning`,children:E}),M&&(0,H.jsx)(o,{severity:`warning`,children:S(u,`Nội dung editor đã đổi. Mở lại preview trước khi hoàn tác.`,`Editor contents changed. Open a new preview before reverting.`)}),O&&!w&&(0,H.jsx)(o,{severity:`info`,children:S(u,`Có lệnh chưa xác nhận kết quả cho tệp này.`,`A command for this file still needs its result confirmed.`)}),w?.value.preview?.hunks.map(e=>(0,H.jsxs)(h,{component:`pre`,sx:{whiteSpace:`pre-wrap`,overflowWrap:`anywhere`},children:[e.header,`
4
4
  `,e.lines.map(e=>`${e.marker}${e.text}`).join(`
5
- `)]},e.hunkRef))]}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{disabled:y,onClick:()=>C(!1),children:S(u,`Đóng`,`Close`)}),(0,H.jsx)(t,{color:`error`,disabled:y||!s||!O&&(!w||!!M),onClick:()=>void j(),children:O?S(u,`Kiểm tra lại`,`Check again`):S(u,`Xác nhận hoàn tác`,`Confirm revert`)})]})]}),hasPending:O,checkPending:()=>{k(U.has(d)),C(!0)}}}async function ue(e,t,n){let r=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/source-review${t?`/${encodeURIComponent(t)}`:``}`,{credentials:`same-origin`,headers:{Accept:`application/json`},signal:n});if(r.status===401&&E(),!r.ok)throw Error(`source-review-unavailable`);return r.json()}var W=(e,t)=>ue(e,void 0,t),G=(e,t,n)=>ue(e,t,n);function K(e,t,n,r,i){if(!e||!r||!n||e.file.path!==t||e.file.currentDigest!==`sha256:${n}`||e.availability.state!==`current`||e.truncation.truncated||e.redaction.applied)return[];let a=new Set(e.agentHunkRefs??[]);return e.hunks.filter(e=>a.has(e.hunkRef)&&!i.has(`${t}:${n}:${e.hunkRef}`))}var q=new Set,J=new Map,Y=new Set,X=`piagent.kept-hunks.`,de=`piagent.kept-hunks`;function fe(e){try{let t=JSON.parse(localStorage.getItem(X+e)??`[]`);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`).slice(-4096)):q}catch{return q}}function pe(e,t){try{let n=[...JSON.parse(localStorage.getItem(de)??`[]`).filter(t=>t!==e),e];for(let e of n.splice(0,Math.max(0,n.length-64)))localStorage.removeItem(X+e);localStorage.setItem(X+e,JSON.stringify([...t])),localStorage.setItem(de,JSON.stringify(n))}catch{}}var me=e=>(J.has(e)||J.set(e,fe(e)),J.get(e)??q);function he(e,t,n,r){let i=new Set([...me(e),`${t}:${n}:${r}`].slice(-4096));for(J.delete(e),J.set(e,i);J.size>64;)J.delete(J.keys().next().value);pe(e,i);for(let e of Y)e()}function ge(e){return(0,V.useSyncExternalStore)(e=>(Y.add(e),()=>{Y.delete(e)}),()=>me(e))}function _e(e,t,n){let[r,i]=(0,V.useState)(),a=ge(e),o=JSON.stringify(t.map(e=>e.file.path).sort());(0,V.useEffect)(()=>{let t=JSON.parse(o);if(!t.length){i(void 0);return}let n=new AbortController,r=!1,a=!1,s=async()=>{if(!n.signal.aborted){if(r){a=!0;return}r=!0;try{let r=await W(e,n.signal),a=new Map;for(let i of t){if(n.signal.aborted)return;let t=r.files.find(e=>e.path===i&&e.pathDisplay===`exact-safe`);if(t)try{a.set(i,await G(e,t.fileRef,n.signal))}catch{}}n.signal.aborted||i({session:e,diffs:a})}catch{n.signal.aborted||i(void 0)}finally{r=!1,a&&!n.signal.aborted&&(a=!1,s())}}};s();let c=window.setInterval(()=>void s(),3e3),l=t=>{t.detail?.sessionRef===e&&s()};return window.addEventListener(`piagent-workspace-saved`,l),window.addEventListener(`piagent-workspace-changed`,l),()=>{n.abort(),clearInterval(c),window.removeEventListener(`piagent-workspace-saved`,l),window.removeEventListener(`piagent-workspace-changed`,l)}},[e,o]);let s=r?.session===e?r.diffs:void 0,c=e=>K(s?.get(e.file.path),e.file.path,e.file.digest,!e.fresh&&!e.pending&&e.draft===(e.file.content??``),a),l=t.find(e=>e.file.path===n),u=l?c(l):[];return{diff:n?s?.get(n):void 0,hunks:u,counts:new Map(t.map(e=>[e.file.path,c(e).length])),keep:t=>{l?.file.digest&&u.some(e=>e.hunkRef===t)&&he(e,l.file.path,l.file.digest,t)}}}var Z=new Map,ve=new Set,ye={tabs:[]},Q=e=>e.fresh||e.draft!==(e.file.content??``);window.addEventListener(`beforeunload`,e=>{[...Z.values()].some(e=>e.tabs.some(Q))&&(e.preventDefault(),e.returnValue=``)});var be=e=>Z.get(e)??ye;function xe(e){let t=(0,V.useSyncExternalStore)(e=>(ve.add(e),()=>{ve.delete(e)}),()=>Z.get(e)??ye),n=t=>{Z.set(e,t(Z.get(e)??ye));for(let e of ve)e()};return{...t,update:n}}function Se(e,t,n){return e.file!==t||e.file.path!==n.path||e.pending||e.fresh||e.file.digest===n.digest&&e.file.protected===n.protected&&e.file.readOnly===n.readOnly?{tab:e}:e.draft===(e.file.content??``)?{tab:{...e,file:n,draft:n.content??``}}:{tab:e,conflict:n}}function Ce(e,t,n){let{update:r}=xe(e),i=(0,V.useRef)({update:r,conflict:n});i.current={update:r,conflict:n},(0,V.useEffect)(()=>{let n=new AbortController,r=new Map,a=!1,o=!1,s,c=async()=>{if(!(n.signal.aborted||t.current)){if(a){o=!0;return}a=!0;try{for(let a of be(e).tabs)if(!(a.fresh||a.pending||t.current))try{let o=await B(e,a.file.path,n.signal);if(n.signal.aborted||t.current)return;let s;if(i.current.update(e=>({...e,tabs:e.tabs.map(t=>{if(t.file.path!==a.file.path)return t;let n=Se(t,a.file,o);return n.conflict&&e.active===t.file.path&&(s=n.conflict),n.tab})})),s){let e=`${s.digest}:${s.protected}:${s.readOnly}`;r.get(s.path)!==e&&(r.set(s.path,e),i.current.conflict(s))}}catch{}}finally{a=!1,o&&!n.signal.aborted&&(o=!1,l())}}},l=()=>{s||=setTimeout(()=>{s=void 0,c()},100)},u=t=>{t.detail?.sessionRef===e&&l()};window.addEventListener(`piagent-workspace-changed`,u),window.addEventListener(`piagent-workspace-saved`,u);let d=setInterval(l,5e3);return l(),()=>{n.abort(),clearTimeout(s),clearInterval(d),window.removeEventListener(`piagent-workspace-changed`,u),window.removeEventListener(`piagent-workspace-saved`,u)}},[e,t])}var we=e=>`/api/v1/sessions/${encodeURIComponent(e)}/workspace/write`;function $(e){return Array.isArray(e)?`[${e.map($).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${$(t)}`).join(`,`)}}`:JSON.stringify(e)}async function Te(e,t){let n=await fetch(we(e),{credentials:`same-origin`,signal:t,headers:{Accept:`application/json`}});if(n.status===401&&E(),!n.ok)throw Error(`workspace-write-unavailable`);return await n.json()}async function Ee(e,t){let n=Date.now(),r=`workspace.write`,i=e.identity,a=e.revisions,o=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode($({action:r,identity:i,expectedRevisions:a,payload:t})));return{schemaVersion:1,version:`piagent-webui-workspace-write-v1`,messageType:`command`,action:r,identity:i,expectedRevisions:a,payload:t,commandId:crypto.randomUUID(),idempotencyKey:crypto.randomUUID(),requestedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),actionDigest:`sha256:${[...new Uint8Array(o)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}}async function De(e,t){let n=T();if(!n)throw Error(`workspace-write-unavailable`);let r=await w(we(e),{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"X-Piagent-CSRF":n},body:JSON.stringify(t)});if(r.status===401&&E(),!r.ok)throw Error(`workspace-write-unavailable`);let i=await r.json(),a=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t.idempotencyKey)),o=`sha256:${[...new Uint8Array(a)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`;if(i.schemaVersion!==1||i.version!==t.version||i.messageType!==`receipt`||i.path!==t.payload.path||i.commandId!==t.commandId||i.action!==t.action||i.actionDigest!==t.actionDigest||i.idempotencyKeyDigest!==o||$(i.identity)!==$(t.identity)||![`settled`,`rejected`,`uncertain`].includes(i.phase)||i.phase===`settled`&&(i.resultCode!==`saved`||!/^[a-f0-9]{64}$/.test(i.digest??``)))throw Error(`workspace-write-receipt-invalid`);return i}function Oe(e){let{locale:t}=x(),n=xe(e),[r,i]=(0,V.useState)(),[a,o]=(0,V.useState)(!1),s=(0,V.useRef)(!1),[c,l]=(0,V.useState)(),[u,d]=(0,V.useState)();Ce(e,s,d),(0,V.useEffect)(()=>{let t=new AbortController,n=!1,r=()=>{n||(n=!0,Te(e,t.signal).then(i).catch(()=>{t.signal.aborted||i(void 0)}).finally(()=>{n=!1}))};r();let a=window.setInterval(r,5e3);return()=>{t.abort(),clearInterval(a)}},[e]);let f=(e,t=1,r=!1)=>n.update(n=>({active:e.path,tabs:[...n.tabs.filter(t=>t.file.path!==e.path),{file:e,line:t,fresh:r,draft:e.content??``}]})),p=(e,t)=>n.update(n=>({...n,active:e,tabs:n.tabs.map(n=>n.file.path===e&&t!==void 0?{...n,line:t}:n)})),m=(e,t)=>n.update(n=>({...n,tabs:n.tabs.map(n=>n.file.path===e?{...n,draft:t}:n)})),h=r=>{let i=be(e).tabs.find(e=>e.file.path===r);i&&(Q(i)||i.pending)&&!window.confirm(S(t,`Bỏ thay đổi chưa lưu và đóng tệp?`,`Discard unsaved changes and close this file?`))||n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?e.tabs.find(e=>e.file.path!==r)?.file.path:e.active}))},g=async n=>{try{f(await B(e,n)),d(void 0),l(void 0)}catch{l(S(t,`Chưa tải lại được tệp. Bản sửa của bạn vẫn được giữ.`,`Could not reload the file. Your draft is preserved.`))}},_=async(r,a)=>{let c=be(e).tabs.find(e=>e.file.path===r);if(!(!c||s.current||!Q(c)&&!c.pending||c.file.protected||c.file.readOnly)&&!(a&&!window.confirm(S(t,`Ghi đè phiên bản trên đĩa bằng bản sửa của bạn?`,`Replace the version on disk with your draft?`)))){s.current=!0,o(!0),l(void 0);try{let o=await Te(e);if(i(o),!o.writable)throw Error(`read-only`);let s=a?.digest??(c.fresh?`absent`:c.file.digest);if(!s)throw Error(`unavailable`);let u=c.pending??await Ee(o,{path:r,content:c.draft,expectedDigest:s});n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:u}:e)}));let f=await De(e,u);if(f.phase===`uncertain`){l(S(t,`Chưa xác định được kết quả lưu. Tải lại để kiểm tra trước khi lưu tiếp.`,`The save result is uncertain. Reload to check before saving again.`));return}n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:void 0}:e)})),f.phase===`settled`&&f.resultCode===`saved`?(n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,fresh:!1,file:{...e.file,content:u.payload.content,digest:f.digest,revision:f.observedRevisionsAfter.workspaceRevision}}:e)})),d(void 0),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}}))):f.resultCode===`stale-content`||f.resultCode===`stale-revision`?d(await B(e,r)):l(S(t,`Chưa lưu được tệp. Kiểm tra quyền ghi và thử lại.`,`Could not save the file. Check write access and try again.`))}catch{l(S(t,`Chưa lưu được tệp. Bản sửa vẫn được giữ; thử lưu lại hoặc tải lại để kiểm tra.`,`Could not confirm the save. Your draft is preserved; retry the save or reload to check.`))}finally{s.current=!1,o(!1)}}},v=async(r,a)=>{let c=be(e).tabs.find(e=>e.file.path===r);if(s.current||c&&(Q(c)||c.pending))return l(S(t,`Lưu hoặc bỏ thay đổi trước khi đổi tên hay xóa tệp.`,`Save or discard your changes before renaming or deleting the file.`)),!1;s.current=!0,o(!0),l(void 0);try{let o=await Te(e);i(o);let s=c?.file.digest??(await B(e,r)).digest;if(!o.writable||!s)throw Error(`unavailable`);let u=await De(e,await Ee(o,a?{path:r,content:``,expectedDigest:s,operation:`rename`,destination:a}:{path:r,content:``,expectedDigest:s,operation:`delete`}));return u.phase===`settled`&&u.resultCode===`saved`?(n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?void 0:e.active})),a&&f(await B(e,a)),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}})),!0):(l(u.phase===`uncertain`?S(t,`Chưa xác định được kết quả. Tải lại danh sách tệp để kiểm tra.`,`The result is uncertain. Reload the file list to check.`):u.resultCode===`stale-content`?S(t,`Tệp đã thay đổi trên đĩa hoặc tên mới đã có. Tải lại rồi thử lại.`,`The file changed on disk or the new name exists. Reload and try again.`):S(t,`Không thực hiện được. Kiểm tra quyền ghi và tên tệp.`,`This could not be done. Check write access and the file name.`)),!1)}catch{return l(S(t,`Chưa xác nhận được thao tác. Tải lại danh sách tệp để kiểm tra.`,`Could not confirm the action. Reload the file list to check.`)),!1}finally{s.current=!1,o(!1)}};return{...n,authority:r,saving:a,message:c,conflict:u,setConflict:d,load:f,select:p,change:m,close:h,reload:g,save:_,move:v}}var ke=e(l(),1);function Ae({sessionRef:e,onOpen:n}){let{locale:r}=x(),[i,a]=(0,V.useState)(``),[s,l]=(0,V.useState)(),[u,d]=(0,V.useState)(!1),[p,m]=(0,V.useState)(!1);return(0,V.useEffect)(()=>{let t=new AbortController;if(l(void 0),m(!1),d(!1),!i.trim())return()=>t.abort();d(!0);let n=setTimeout(()=>{se(e,i,t.signal).then(e=>{t.signal.aborted||l(e)}).catch(()=>{t.signal.aborted||m(!0)}).finally(()=>{t.signal.aborted||d(!1)})},250);return()=>{clearTimeout(n),t.abort()}},[i,e]),(0,H.jsxs)(f,{spacing:1,sx:{p:1},children:[(0,H.jsx)(v,{size:`small`,label:S(r,`Tìm nội dung`,`Search contents`),value:i,onChange:e=>a(e.target.value),slotProps:{htmlInput:{maxLength:512}}}),u&&(0,H.jsx)(_,{size:18}),(p||s?.available===!1)&&(0,H.jsx)(o,{severity:`warning`,children:S(r,`Chưa tìm được nội dung trong project này.`,`Content search is unavailable for this project.`)}),s?.available&&s.backend===`fts`&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Tìm trong các tệp đã lập chỉ mục.`,`Searching indexed files.`)}),s?.matches.map(e=>(0,H.jsxs)(t,{onClick:()=>n(e.path,e.line),sx:{textTransform:`none`,display:`block`,textAlign:`left`,overflowWrap:`anywhere`},children:[(0,H.jsxs)(c,{variant:`caption`,component:`span`,children:[e.path,`:`,e.line,`:`,e.column]}),(0,H.jsx)(c,{variant:`body2`,component:`span`,sx:{display:`block`},children:e.preview})]},`${e.path}:${e.line}:${e.column}`)),s?.truncated&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Đã giới hạn kết quả. Hãy tìm cụ thể hơn.`,`Results were limited. Refine your search.`)}),s?.available&&!s.matches.length&&!s.truncated&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Không tìm thấy.`,`No matches.`)})]})}var je=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`ico`,`avif`]),Me=new Set([`pdf`,`docx`,`xlsx`,`xlsm`,`pptx`,`odt`,`ods`,`odp`,`rtf`]);function Ne(e){let t=e.split(`.`).at(-1)?.toLowerCase()??``;return je.has(t)?`image`:Me.has(t)?`document`:null}function Pe({sessionRef:e,path:t}){let{locale:n}=x(),r=Ne(t),[i,a]=(0,V.useState)({state:r?`loading`:`none`});return(0,V.useEffect)(()=>{if(!r){a({state:`none`});return}let n=new AbortController,i=n.signal;return a({state:`loading`}),(async()=>{if(r===`image`){let n=await z(e,t,i);return n.data&&n.mime?{state:`image`,src:`data:${n.mime};base64,${n.data}`}:{state:`none`}}let n=await D(e,i),a=new Set(n.roots.filter(e=>e.source===`project`).map(e=>e.rootRef)),o=n.documents.find(e=>a.has(e.rootRef)&&e.relativePath===t);if(!o)return{state:`none`};let s=await O(e,o.documentRef,i);return s.state===`ready`&&s.text!==null?{state:`document`,text:s.text,truncated:s.truncated}:{state:`none`}})().then(e=>{i.aborted||a(e)},()=>{i.aborted||a({state:`none`})}),()=>n.abort()},[e,t,r]),i.state===`loading`?(0,H.jsx)(_,{size:20,sx:{m:2}}):i.state===`image`?(0,H.jsx)(h,{sx:{flex:1,minHeight:0,overflow:`auto`,p:2,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,bgcolor:`action.hover`},children:(0,H.jsx)(h,{component:`img`,src:i.src,alt:t,sx:{maxWidth:`100%`,height:`auto`,boxShadow:1,bgcolor:`background.paper`}})}):i.state===`document`?(0,H.jsxs)(h,{sx:{flex:1,minHeight:0,overflow:`auto`,p:2},children:[(0,H.jsxs)(c,{variant:`caption`,color:`text.secondary`,children:[S(n,`Nội dung chữ của tài liệu (chỉ đọc)`,`The document's text (read-only)`),i.truncated?S(n,` · đã rút gọn`,` · truncated`):``]}),(0,H.jsx)(h,{component:`pre`,sx:{m:0,mt:1,whiteSpace:`pre-wrap`,overflowWrap:`anywhere`,fontFamily:`inherit`,fontSize:`.92rem`,lineHeight:1.6},children:i.text})]}):(0,H.jsx)(o,{severity:`info`,children:S(n,`Tệp nhị phân hoặc quá lớn để hiển thị.`,`This file is binary or too large to display.`)})}var Fe=y((0,H.jsx)(`path`,{d:`M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`}),`ChevronRight`),Ie=y((0,H.jsx)(`path`,{d:`M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z`}),`ExpandMore`),Le=y((0,H.jsx)(`path`,{d:`M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8zM6 20V4h7v5h5v11z`}),`InsertDriveFileOutlined`),Re=e=>e.split(`/`).slice(0,-1).map((e,t,n)=>n.slice(0,t+1).join(`/`));function ze({sessionRef:e,refresh:n,active:r,onOpen:i,onFolder:a}){let{locale:o}=x(),[l,d]=(0,V.useState)(()=>new Set([``])),[f,p]=(0,V.useState)(()=>new Map),[m,g]=(0,V.useState)(),v=(t,n)=>{p(e=>new Map(e).set(t,e.get(t)??`loading`)),R(e,t,n).then(e=>{n?.aborted||p(n=>new Map(n).set(t,e))}).catch(()=>{n?.aborted||p(e=>new Map(e).set(t,`error`))})};(0,V.useEffect)(()=>{p(new Map),d(new Set([``]))},[e]),(0,V.useEffect)(()=>{let e=new AbortController;for(let t of l)v(t,e.signal);return()=>e.abort()},[e,n]),(0,V.useEffect)(()=>{if(!r)return;let e=Re(r).filter(e=>!l.has(e));if(e.length){d(t=>new Set([...t,...e]));for(let t of e)f.has(t)||v(t)}},[r]);let y=e=>{if(g(e),a(e),l.has(e)){d(t=>{let n=new Set(t);return n.delete(e),n});return}d(t=>new Set(t).add(e)),(!f.has(e)||f.get(e)===`error`)&&v(e)},b=(e,n)=>{let a=f.get(e);return!a||a===`loading`?(0,H.jsx)(_,{size:14,sx:{ml:1.5+n*1.5,my:.5}}):a===`error`?(0,H.jsx)(c,{variant:`caption`,color:`warning.main`,sx:{pl:1.5+n*1.5},children:S(o,`Chưa đọc được thư mục này.`,`This folder could not be read.`)}):(0,H.jsxs)(H.Fragment,{children:[a.entries.map(e=>{let a=e.kind===`directory`,c=a&&l.has(e.path),d=a?m===e.path:r===e.path,f=a?(0,H.jsxs)(H.Fragment,{children:[c?(0,H.jsx)(Ie,{sx:{fontSize:16}}):(0,H.jsx)(Fe,{sx:{fontSize:16}}),c?(0,H.jsx)(s,{sx:{fontSize:16}}):(0,H.jsx)(u,{sx:{fontSize:16}})]}):(0,H.jsx)(Le,{sx:{fontSize:16,ml:`16px`}});return(0,H.jsxs)(h,{children:[(0,H.jsxs)(t,{fullWidth:!0,size:`small`,disabled:e.protected||e.kind===`symlink`||e.kind===`other`,"aria-label":e.protected?`${e.name} (${S(o,`được bảo vệ`,`protected`)})`:e.name,"aria-expanded":a?c:void 0,"aria-current":!a&&r===e.path?`true`:void 0,onClick:()=>a?y(e.path):(g(void 0),i(e.path)),sx:{justifyContent:`flex-start`,textTransform:`none`,gap:.5,minHeight:24,py:0,pl:.5+n*1.5,pr:1,color:`text.primary`,fontWeight:400,whiteSpace:`nowrap`,bgcolor:d?`action.selected`:void 0},children:[f,(0,H.jsxs)(h,{component:`span`,sx:{overflow:`hidden`,textOverflow:`ellipsis`},children:[e.name,e.protected?` 🔒`:``]})]}),c&&b(e.path,n+1)]},e.path)}),a.truncated&&(0,H.jsx)(c,{variant:`caption`,sx:{pl:1.5+n*1.5},children:S(o,`Danh sách đã được giới hạn.`,`Listing limit reached.`)})]})};return(0,H.jsx)(h,{role:`group`,"aria-label":S(o,`Cây thư mục`,`Folder tree`),sx:{py:.5},children:b(``,0)})}var Be=(0,V.lazy)(()=>C(()=>import(`./WorkspaceCodeEditor-Dt3dS_QG.js`),__vite__mapDeps([0,1,2,3,4,5,6])));function Ve({sessionRef:e,target:r,navigationHost:i,sidebarMode:s,onHide:l,fill:u}){let{locale:y}=x(),[C,w]=(0,V.useState)(`files`),[T,E]=(0,V.useState)(!1),[te,D]=(0,V.useState)(``),[ne,O]=(0,V.useState)(!1),[A,j]=(0,V.useState)(),[M,re]=(0,V.useState)(``),N=Oe(e),{tabs:P,active:F}=N,[ie,I]=(0,V.useState)(``),[ae,L]=(0,V.useState)(!1),[se,R]=(0,V.useState)(!1),z=(0,V.useRef)(null),[U,ue]=(0,V.useState)(0);(0,V.useEffect)(()=>{let t=t=>{t.detail?.sessionRef===e&&ue(e=>e+1)};return window.addEventListener(`piagent-workspace-saved`,t),()=>window.removeEventListener(`piagent-workspace-saved`,t)},[e]),(0,V.useEffect)(()=>()=>z.current?.abort(),[]);let W=async(t,n=1)=>{if(z.current?.abort(),R(!1),P.find(e=>e.file.path===t)){N.select(t,n);return}z.current?.abort();let r=new AbortController;z.current=r,R(!0),L(!1);try{let i=await B(e,t,r.signal);if(r.signal.aborted)return;if(i.protected){L(!0);return}N.load(i,n)}catch{r.signal.aborted||L(!0)}finally{r.signal.aborted||R(!1)}};(0,V.useEffect)(()=>{r&&W(r.path,r.line??1)},[r]),(0,V.useEffect)(()=>{s&&s!==`sessions`&&w(s)},[s]);let G=P.find(e=>e.file.path===F),K=G?.file,q=_e(e,P,F),J=le(e,K?.path,K?.digest??null,!!G&&!Q(G),q.diff),Y=ce(e,K?.path,G?.draft??``,q.hunks),X=P.find(e=>e.file.path===N.conflict?.path),de=(0,H.jsxs)(h,{component:`nav`,"aria-label":S(y,`Tệp dự án`,`Project files`),sx:{width:i?`100%`:{xs:136,sm:200},flexShrink:0,overflow:`auto`,borderRight:1,borderColor:`divider`},children:[!i&&(0,H.jsxs)(d,{value:C,onChange:(e,t)=>w(t),"aria-label":S(y,`Khám phá project`,`Explore project`),children:[(0,H.jsx)(ee,{value:`files`,label:S(y,`Tệp`,`Files`)}),(0,H.jsx)(ee,{value:`search`,label:S(y,`Tìm kiếm`,`Search`)})]}),C===`search`?(0,H.jsx)(Ae,{sessionRef:e,onOpen:(e,t)=>void W(e,t)}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(t,{disabled:!N.authority?.writable,onClick:()=>{D(ie?`${ie}/`:``),E(!0)},children:S(y,`Tệp mới`,`New file`)}),(0,H.jsx)(ze,{sessionRef:e,refresh:U,active:F,onOpen:e=>{I(e.split(`/`).slice(0,-1).join(`/`)),W(e)},onFolder:I})]})]});return(0,H.jsxs)(H.Fragment,{children:[J.dialog,Y.dialog,(0,H.jsxs)(f,{direction:`row`,sx:{height:u?`100%`:`calc(100vh - 150px)`,minHeight:u?160:320},children:[i?(0,ke.createPortal)(de,i):de,(0,H.jsxs)(h,{sx:{minWidth:0,flex:1,display:`flex`,flexDirection:`column`},children:[ae&&(0,H.jsx)(o,{severity:`warning`,children:S(y,`Chưa đọc được tệp hoặc thư mục này.`,`This file or folder could not be read.`)}),Y.bar,N.message&&(0,H.jsx)(o,{severity:`warning`,children:N.message}),N.authority?.agentRunning&&(0,H.jsx)(o,{severity:`info`,children:S(y,`Agent đang chạy và có thể sửa tệp này.`,`The agent is running and may change this file.`)}),(0,H.jsxs)(f,{direction:`row`,sx:{alignItems:`center`,borderBottom:1,borderColor:`divider`,minHeight:36},children:[(0,H.jsx)(d,{value:F??!1,onChange:(e,t)=>N.select(t),variant:`scrollable`,scrollButtons:`auto`,"aria-label":S(y,`Các tệp đang mở`,`Open files`),sx:{flex:1,minWidth:0,minHeight:36},children:P.map(e=>(0,H.jsx)(ee,{value:e.file.path,sx:{minHeight:36,py:0},"aria-label":`${e.file.path}${Q(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,label:oe(`${e.file.path}${Q(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,S(y,`Đóng ${e.file.path}`,`Close ${e.file.path}`),()=>N.close(e.file.path))},e.file.path))}),l&&(0,H.jsx)(m,{size:`small`,"aria-label":S(y,`Ẩn khung tệp`,`Hide files panel`),title:S(y,`Ẩn khung tệp (tệp đang mở vẫn giữ)`,`Hide files panel (open files are kept)`),onClick:l,children:(0,H.jsx)(b,{fontSize:`small`})})]}),se&&(0,H.jsx)(_,{size:20}),K&&(0,H.jsxs)(f,{direction:`row`,sx:{flexShrink:0,overflowX:`auto`,"& .MuiButton-root":{whiteSpace:`nowrap`,flexShrink:0}},children:[J.hasPending&&(0,H.jsx)(t,{onClick:J.checkPending,children:S(y,`Kiểm tra hoàn tác`,`Check revert`)}),(0,H.jsx)(t,{size:`small`,disabled:!N.authority?.writable||K.readOnly||!G||!Q(G)&&!G.pending||N.saving,onClick:()=>void N.save(K.path),children:S(y,`Lưu`,`Save`)}),(0,H.jsx)(t,{size:`small`,onClick:()=>N.close(K.path),children:S(y,`Đóng tệp`,`Close file`)}),(0,H.jsx)(t,{size:`small`,disabled:!N.authority?.writable||K.readOnly||!K.digest||N.saving,onClick:()=>{re(K.path),j(K.path)},children:S(y,`Đổi tên`,`Rename`)}),(0,H.jsx)(t,{size:`small`,color:`error`,disabled:!N.authority?.writable||K.readOnly||!K.digest||N.saving,onClick:()=>{window.confirm(S(y,`Xóa ${K.path}? Có thể khôi phục bằng Git nếu tệp đã commit.`,`Delete ${K.path}? Git can restore it if it was committed.`))&&N.move(K.path)},children:S(y,`Xóa`,`Delete`)}),(0,H.jsx)(t,{size:`small`,onClick:()=>{(!G||!Q(G)||window.confirm(S(y,`Bỏ thay đổi chưa lưu và tải lại?`,`Discard unsaved changes and reload?`)))&&N.reload(K.path)},children:S(y,`Tải lại`,`Reload`)})]}),K?.binary||K?.oversized?(0,H.jsx)(Pe,{sessionRef:e,path:K.path}):K?.content!==null&&K?.content!==void 0?(0,H.jsx)(h,{sx:{flex:1,minHeight:0},children:(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{onComment:Y.open,hunks:q.hunks,onKeep:q.keep,onRevert:N.authority?.writable?e=>void J.request(e):void 0,content:G?.draft??K.content,path:K.path,line:G?.line??1,readOnly:!N.authority?.writable||K.readOnly,onChange:e=>N.change(K.path,e),onSave:()=>void N.save(K.path)})})}):(0,H.jsx)(c,{sx:{p:2},children:S(y,`Chọn một tệp để mở.`,`Select a file to open.`)})]})]}),(0,H.jsxs)(n,{open:T,onClose:()=>E(!1),fullWidth:!0,children:[(0,H.jsx)(p,{children:S(y,`Tạo tệp mới`,`Create a new file`)}),(0,H.jsx)(g,{children:(0,H.jsx)(v,{autoFocus:!0,fullWidth:!0,label:S(y,`Đường dẫn trong project`,`Path in project`),value:te,onChange:e=>D(e.target.value)})}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>E(!1),children:S(y,`Hủy`,`Cancel`)}),(0,H.jsx)(t,{disabled:!k(te)||!N.authority?.writable,onClick:()=>{let e=k(te);!e||!N.authority||(P.some(t=>t.file.path===e.path)?N.select(e.path):N.load({schemaVersion:1,version:`piagent-webui-workspace-file-v1`,generatedAt:new Date().toISOString(),identity:N.authority.identity,path:e.path,language:`text`,protected:!1,readOnly:!1,binary:!1,oversized:!1,content:``,digest:null,revision:null},1,!0),E(!1))},children:S(y,`Tạo`,`Create`)})]})]}),(0,H.jsxs)(n,{open:!!A,onClose:()=>j(void 0),fullWidth:!0,children:[(0,H.jsx)(p,{children:S(y,`Đổi tên tệp`,`Rename file`)}),(0,H.jsx)(g,{children:(0,H.jsx)(v,{autoFocus:!0,fullWidth:!0,label:S(y,`Đường dẫn mới trong project`,`New path in project`),value:M,onChange:e=>re(e.target.value)})}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>j(void 0),children:S(y,`Hủy`,`Cancel`)}),(0,H.jsx)(t,{disabled:!k(M)||k(M)?.path===A||N.saving,onClick:()=>{let e=k(M);!e||!A||N.move(A,e.path).then(e=>{e&&j(void 0)})},children:S(y,`Đổi tên`,`Rename`)})]})]}),(0,H.jsxs)(n,{open:!!N.conflict,onClose:()=>{N.setConflict(void 0),O(!1)},fullWidth:!0,maxWidth:ne?`lg`:`sm`,children:[(0,H.jsx)(p,{children:S(y,`Tệp đã thay đổi trên đĩa`,`The file changed on disk`)}),(0,H.jsxs)(g,{children:[(0,H.jsx)(c,{children:N.conflict?.path}),(0,H.jsx)(c,{children:S(y,`Bản sửa của bạn vẫn được giữ. Chọn cách xử lý xung đột.`,`Your draft is preserved. Choose how to resolve the conflict.`)}),ne&&N.conflict&&X&&(0,H.jsxs)(f,{direction:`row`,spacing:1,children:[(0,H.jsxs)(h,{sx:{width:`50%`,height:360},children:[(0,H.jsx)(c,{children:S(y,`Trên đĩa`,`On disk`)}),(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{path:N.conflict.path,content:N.conflict.content??``})})]}),(0,H.jsxs)(h,{sx:{width:`50%`,height:360},children:[(0,H.jsx)(c,{children:S(y,`Bản sửa của bạn`,`Your draft`)}),(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{path:X.file.path,content:X.draft})})]})]})]}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>{N.setConflict(void 0),O(!1)},children:S(y,`Để sau`,`Later`)}),(0,H.jsx)(t,{onClick:()=>{N.conflict&&(N.load(N.conflict),N.setConflict(void 0),O(!1))},children:S(y,`Tải lại`,`Reload`)}),(0,H.jsx)(t,{onClick:()=>O(!0),children:S(y,`Xem khác biệt`,`Compare`)}),(0,H.jsx)(t,{disabled:N.saving||!N.conflict?.digest||N.conflict.protected||N.conflict.readOnly,onClick:()=>{N.conflict&&N.save(N.conflict.path,N.conflict)},children:S(y,`Ghi đè`,`Overwrite`)})]})]})]})}export{Ve as default};
5
+ `)]},e.hunkRef))]}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{disabled:y,onClick:()=>C(!1),children:S(u,`Đóng`,`Close`)}),(0,H.jsx)(t,{color:`error`,disabled:y||!s||!O&&(!w||!!M),onClick:()=>void j(),children:O?S(u,`Kiểm tra lại`,`Check again`):S(u,`Xác nhận hoàn tác`,`Confirm revert`)})]})]}),hasPending:O,checkPending:()=>{k(U.has(d)),C(!0)}}}async function ue(e,t,n){let r=await fetch(`/api/v1/sessions/${encodeURIComponent(e)}/source-review${t?`/${encodeURIComponent(t)}`:``}`,{credentials:`same-origin`,headers:{Accept:`application/json`},signal:n});if(r.status===401&&E(),!r.ok)throw Error(`source-review-unavailable`);return r.json()}var W=(e,t)=>ue(e,void 0,t),G=(e,t,n)=>ue(e,t,n);function K(e,t,n,r,i){if(!e||!r||!n||e.file.path!==t||e.file.currentDigest!==`sha256:${n}`||e.availability.state!==`current`||e.truncation.truncated||e.redaction.applied)return[];let a=new Set(e.agentHunkRefs??[]);return e.hunks.filter(e=>a.has(e.hunkRef)&&!i.has(`${t}:${n}:${e.hunkRef}`))}var q=new Set,J=new Map,Y=new Set,X=`piagent.kept-hunks.`,de=`piagent.kept-hunks`;function fe(e){try{let t=JSON.parse(localStorage.getItem(X+e)??`[]`);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`).slice(-4096)):q}catch{return q}}function pe(e,t){try{let n=[...JSON.parse(localStorage.getItem(de)??`[]`).filter(t=>t!==e),e];for(let e of n.splice(0,Math.max(0,n.length-64)))localStorage.removeItem(X+e);localStorage.setItem(X+e,JSON.stringify([...t])),localStorage.setItem(de,JSON.stringify(n))}catch{}}var me=e=>(J.has(e)||J.set(e,fe(e)),J.get(e)??q);function he(e,t,n,r){let i=new Set([...me(e),`${t}:${n}:${r}`].slice(-4096));for(J.delete(e),J.set(e,i);J.size>64;)J.delete(J.keys().next().value);pe(e,i);for(let e of Y)e()}function ge(e){return(0,V.useSyncExternalStore)(e=>(Y.add(e),()=>{Y.delete(e)}),()=>me(e))}function _e(e,t,n){let[r,i]=(0,V.useState)(),a=ge(e),o=JSON.stringify(t.map(e=>e.file.path).sort());(0,V.useEffect)(()=>{let t=JSON.parse(o);if(!t.length){i(void 0);return}let n=new AbortController,r=!1,a=!1,s=async()=>{if(!n.signal.aborted){if(r){a=!0;return}r=!0;try{let r=await W(e,n.signal),a=new Map;for(let i of t){if(n.signal.aborted)return;let t=r.files.find(e=>e.path===i&&e.pathDisplay===`exact-safe`);if(t)try{a.set(i,await G(e,t.fileRef,n.signal))}catch{}}n.signal.aborted||i({session:e,diffs:a})}catch{n.signal.aborted||i(void 0)}finally{r=!1,a&&!n.signal.aborted&&(a=!1,s())}}};s();let c=window.setInterval(()=>void s(),3e3),l=t=>{t.detail?.sessionRef===e&&s()};return window.addEventListener(`piagent-workspace-saved`,l),window.addEventListener(`piagent-workspace-changed`,l),()=>{n.abort(),clearInterval(c),window.removeEventListener(`piagent-workspace-saved`,l),window.removeEventListener(`piagent-workspace-changed`,l)}},[e,o]);let s=r?.session===e?r.diffs:void 0,c=e=>K(s?.get(e.file.path),e.file.path,e.file.digest,!e.fresh&&!e.pending&&e.draft===(e.file.content??``),a),l=t.find(e=>e.file.path===n),u=l?c(l):[];return{diff:n?s?.get(n):void 0,hunks:u,counts:new Map(t.map(e=>[e.file.path,c(e).length])),keep:t=>{l?.file.digest&&u.some(e=>e.hunkRef===t)&&he(e,l.file.path,l.file.digest,t)}}}var Z=new Map,ve=new Set,ye={tabs:[]},Q=e=>e.fresh||e.draft!==(e.file.content??``);window.addEventListener(`beforeunload`,e=>{[...Z.values()].some(e=>e.tabs.some(Q))&&(e.preventDefault(),e.returnValue=``)});var be=e=>Z.get(e)??ye;function xe(e){let t=(0,V.useSyncExternalStore)(e=>(ve.add(e),()=>{ve.delete(e)}),()=>Z.get(e)??ye),n=t=>{Z.set(e,t(Z.get(e)??ye));for(let e of ve)e()};return{...t,update:n}}function Se(e,t,n){return e.file!==t||e.file.path!==n.path||e.pending||e.fresh||e.file.digest===n.digest&&e.file.protected===n.protected&&e.file.readOnly===n.readOnly?{tab:e}:e.draft===(e.file.content??``)?{tab:{...e,file:n,draft:n.content??``}}:{tab:e,conflict:n}}function Ce(e,t,n){let{update:r}=xe(e),i=(0,V.useRef)({update:r,conflict:n});i.current={update:r,conflict:n},(0,V.useEffect)(()=>{let n=new AbortController,r=new Map,a=!1,o=!1,s,c=async()=>{if(!(n.signal.aborted||t.current)){if(a){o=!0;return}a=!0;try{for(let a of be(e).tabs)if(!(a.fresh||a.pending||t.current))try{let o=await B(e,a.file.path,n.signal);if(n.signal.aborted||t.current)return;let s;if(i.current.update(e=>({...e,tabs:e.tabs.map(t=>{if(t.file.path!==a.file.path)return t;let n=Se(t,a.file,o);return n.conflict&&e.active===t.file.path&&(s=n.conflict),n.tab})})),s){let e=`${s.digest}:${s.protected}:${s.readOnly}`;r.get(s.path)!==e&&(r.set(s.path,e),i.current.conflict(s))}}catch{}}finally{a=!1,o&&!n.signal.aborted&&(o=!1,l())}}},l=()=>{s||=setTimeout(()=>{s=void 0,c()},100)},u=t=>{t.detail?.sessionRef===e&&l()};window.addEventListener(`piagent-workspace-changed`,u),window.addEventListener(`piagent-workspace-saved`,u);let d=setInterval(l,5e3);return l(),()=>{n.abort(),clearTimeout(s),clearInterval(d),window.removeEventListener(`piagent-workspace-changed`,u),window.removeEventListener(`piagent-workspace-saved`,u)}},[e,t])}var we=e=>`/api/v1/sessions/${encodeURIComponent(e)}/workspace/write`;function $(e){return Array.isArray(e)?`[${e.map($).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${$(t)}`).join(`,`)}}`:JSON.stringify(e)}async function Te(e,t){let n=await fetch(we(e),{credentials:`same-origin`,signal:t,headers:{Accept:`application/json`}});if(n.status===401&&E(),!n.ok)throw Error(`workspace-write-unavailable`);return await n.json()}async function Ee(e,t){let n=Date.now(),r=`workspace.write`,i=e.identity,a=e.revisions,o=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode($({action:r,identity:i,expectedRevisions:a,payload:t})));return{schemaVersion:1,version:`piagent-webui-workspace-write-v1`,messageType:`command`,action:r,identity:i,expectedRevisions:a,payload:t,commandId:crypto.randomUUID(),idempotencyKey:crypto.randomUUID(),requestedAt:new Date(n).toISOString(),expiresAt:new Date(n+6e4).toISOString(),actionDigest:`sha256:${[...new Uint8Array(o)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}}async function De(e,t){let n=T();if(!n)throw Error(`workspace-write-unavailable`);let r=await w(we(e),{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"X-Piagent-CSRF":n},body:JSON.stringify(t)});if(r.status===401&&E(),!r.ok)throw Error(`workspace-write-unavailable`);let i=await r.json(),a=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(t.idempotencyKey)),o=`sha256:${[...new Uint8Array(a)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`;if(i.schemaVersion!==1||i.version!==t.version||i.messageType!==`receipt`||i.path!==t.payload.path||i.commandId!==t.commandId||i.action!==t.action||i.actionDigest!==t.actionDigest||i.idempotencyKeyDigest!==o||$(i.identity)!==$(t.identity)||![`settled`,`rejected`,`uncertain`].includes(i.phase)||i.phase===`settled`&&(i.resultCode!==`saved`||!/^[a-f0-9]{64}$/.test(i.digest??``)))throw Error(`workspace-write-receipt-invalid`);return i}function Oe(e){let{locale:t}=x(),n=xe(e),[r,i]=(0,V.useState)(),[a,o]=(0,V.useState)(!1),s=(0,V.useRef)(!1),[c,l]=(0,V.useState)(),[u,d]=(0,V.useState)();Ce(e,s,d),(0,V.useEffect)(()=>{let t=new AbortController,n=!1,r=()=>{n||(n=!0,Te(e,t.signal).then(i).catch(()=>{t.signal.aborted||i(void 0)}).finally(()=>{n=!1}))};r();let a=window.setInterval(r,5e3);return()=>{t.abort(),clearInterval(a)}},[e]);let f=(e,t=1,r=!1)=>n.update(n=>({active:e.path,tabs:[...n.tabs.filter(t=>t.file.path!==e.path),{file:e,line:t,fresh:r,draft:e.content??``}]})),p=(e,t)=>n.update(n=>({...n,active:e,tabs:n.tabs.map(n=>n.file.path===e&&t!==void 0?{...n,line:t}:n)})),m=(e,t)=>n.update(n=>({...n,tabs:n.tabs.map(n=>n.file.path===e?{...n,draft:t}:n)})),h=r=>{let i=be(e).tabs.find(e=>e.file.path===r);i&&(Q(i)||i.pending)&&!window.confirm(S(t,`Bỏ thay đổi chưa lưu và đóng tệp?`,`Discard unsaved changes and close this file?`))||n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?e.tabs.find(e=>e.file.path!==r)?.file.path:e.active}))},g=async n=>{try{f(await B(e,n)),d(void 0),l(void 0)}catch{l(S(t,`Chưa tải lại được tệp. Bản sửa của bạn vẫn được giữ.`,`Could not reload the file. Your draft is preserved.`))}},_=async(r,a)=>{let c=be(e).tabs.find(e=>e.file.path===r);if(!(!c||s.current||!Q(c)&&!c.pending||c.file.protected||c.file.readOnly)&&!(a&&!window.confirm(S(t,`Ghi đè phiên bản trên đĩa bằng bản sửa của bạn?`,`Replace the version on disk with your draft?`)))){s.current=!0,o(!0),l(void 0);try{let o=await Te(e);if(i(o),!o.writable)throw Error(`read-only`);let s=a?.digest??(c.fresh?`absent`:c.file.digest);if(!s)throw Error(`unavailable`);let u=c.pending??await Ee(o,{path:r,content:c.draft,expectedDigest:s});n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:u}:e)}));let f=await De(e,u);if(f.phase===`uncertain`){l(S(t,`Chưa xác định được kết quả lưu. Tải lại để kiểm tra trước khi lưu tiếp.`,`The save result is uncertain. Reload to check before saving again.`));return}n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,pending:void 0}:e)})),f.phase===`settled`&&f.resultCode===`saved`?(n.update(e=>({...e,tabs:e.tabs.map(e=>e.file.path===r?{...e,fresh:!1,file:{...e.file,content:u.payload.content,digest:f.digest,revision:f.observedRevisionsAfter.workspaceRevision}}:e)})),d(void 0),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}}))):f.resultCode===`stale-content`||f.resultCode===`stale-revision`?d(await B(e,r)):l(S(t,`Chưa lưu được tệp. Kiểm tra quyền ghi và thử lại.`,`Could not save the file. Check write access and try again.`))}catch{l(S(t,`Chưa lưu được tệp. Bản sửa vẫn được giữ; thử lưu lại hoặc tải lại để kiểm tra.`,`Could not confirm the save. Your draft is preserved; retry the save or reload to check.`))}finally{s.current=!1,o(!1)}}},v=async(r,a)=>{let c=be(e).tabs.find(e=>e.file.path===r);if(s.current||c&&(Q(c)||c.pending))return l(S(t,`Lưu hoặc bỏ thay đổi trước khi đổi tên hay xóa tệp.`,`Save or discard your changes before renaming or deleting the file.`)),!1;s.current=!0,o(!0),l(void 0);try{let o=await Te(e);i(o);let s=c?.file.digest??(await B(e,r)).digest;if(!o.writable||!s)throw Error(`unavailable`);let u=await De(e,await Ee(o,a?{path:r,content:``,expectedDigest:s,operation:`rename`,destination:a}:{path:r,content:``,expectedDigest:s,operation:`delete`}));return u.phase===`settled`&&u.resultCode===`saved`?(n.update(e=>({tabs:e.tabs.filter(e=>e.file.path!==r),active:e.active===r?void 0:e.active})),a&&f(await B(e,a)),window.dispatchEvent(new CustomEvent(`piagent-workspace-saved`,{detail:{sessionRef:e,path:r}})),!0):(l(u.phase===`uncertain`?S(t,`Chưa xác định được kết quả. Tải lại danh sách tệp để kiểm tra.`,`The result is uncertain. Reload the file list to check.`):u.resultCode===`stale-content`?S(t,`Tệp đã thay đổi trên đĩa hoặc tên mới đã có. Tải lại rồi thử lại.`,`The file changed on disk or the new name exists. Reload and try again.`):S(t,`Không thực hiện được. Kiểm tra quyền ghi và tên tệp.`,`This could not be done. Check write access and the file name.`)),!1)}catch{return l(S(t,`Chưa xác nhận được thao tác. Tải lại danh sách tệp để kiểm tra.`,`Could not confirm the action. Reload the file list to check.`)),!1}finally{s.current=!1,o(!1)}};return{...n,authority:r,saving:a,message:c,conflict:u,setConflict:d,load:f,select:p,change:m,close:h,reload:g,save:_,move:v}}var ke=e(l(),1);function Ae({sessionRef:e,onOpen:n}){let{locale:r}=x(),[i,a]=(0,V.useState)(``),[s,l]=(0,V.useState)(),[u,d]=(0,V.useState)(!1),[p,m]=(0,V.useState)(!1);return(0,V.useEffect)(()=>{let t=new AbortController;if(l(void 0),m(!1),d(!1),!i.trim())return()=>t.abort();d(!0);let n=setTimeout(()=>{se(e,i,t.signal).then(e=>{t.signal.aborted||l(e)}).catch(()=>{t.signal.aborted||m(!0)}).finally(()=>{t.signal.aborted||d(!1)})},250);return()=>{clearTimeout(n),t.abort()}},[i,e]),(0,H.jsxs)(f,{spacing:1,sx:{p:1},children:[(0,H.jsx)(v,{size:`small`,label:S(r,`Tìm nội dung`,`Search contents`),value:i,onChange:e=>a(e.target.value),slotProps:{htmlInput:{maxLength:512}}}),u&&(0,H.jsx)(_,{size:18}),(p||s?.available===!1)&&(0,H.jsx)(o,{severity:`warning`,children:S(r,`Chưa tìm được nội dung trong project này.`,`Content search is unavailable for this project.`)}),s?.available&&s.backend===`fts`&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Tìm trong các tệp đã lập chỉ mục.`,`Searching indexed files.`)}),s?.matches.map(e=>(0,H.jsxs)(t,{onClick:()=>n(e.path,e.line),sx:{textTransform:`none`,display:`block`,textAlign:`left`,overflowWrap:`anywhere`},children:[(0,H.jsxs)(c,{variant:`caption`,component:`span`,children:[e.path,`:`,e.line,`:`,e.column]}),(0,H.jsx)(c,{variant:`body2`,component:`span`,sx:{display:`block`},children:e.preview})]},`${e.path}:${e.line}:${e.column}`)),s?.truncated&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Đã giới hạn kết quả. Hãy tìm cụ thể hơn.`,`Results were limited. Refine your search.`)}),s?.available&&!s.matches.length&&!s.truncated&&(0,H.jsx)(c,{variant:`caption`,children:S(r,`Không tìm thấy.`,`No matches.`)})]})}var je=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`ico`,`avif`]),Me=new Set([`pdf`,`docx`,`xlsx`,`xlsm`,`pptx`,`odt`,`ods`,`odp`,`rtf`]);function Ne(e){let t=e.split(`.`).at(-1)?.toLowerCase()??``;return je.has(t)?`image`:Me.has(t)?`document`:null}function Pe({sessionRef:e,path:t}){let{locale:n}=x(),r=Ne(t),[i,a]=(0,V.useState)({state:r?`loading`:`none`});return(0,V.useEffect)(()=>{if(!r){a({state:`none`});return}let n=new AbortController,i=n.signal;return a({state:`loading`}),(async()=>{if(r===`image`){let n=await z(e,t,i);return n.data&&n.mime?{state:`image`,src:`data:${n.mime};base64,${n.data}`}:{state:`none`}}let n=await D(e,i),a=new Set(n.roots.filter(e=>e.source===`project`).map(e=>e.rootRef)),o=n.documents.find(e=>a.has(e.rootRef)&&e.relativePath===t);if(!o)return{state:`none`};let s=await O(e,o.documentRef,i);return s.state===`ready`&&s.text!==null?{state:`document`,text:s.text,truncated:s.truncated}:{state:`none`}})().then(e=>{i.aborted||a(e)},()=>{i.aborted||a({state:`none`})}),()=>n.abort()},[e,t,r]),i.state===`loading`?(0,H.jsx)(_,{size:20,sx:{m:2}}):i.state===`image`?(0,H.jsx)(h,{sx:{flex:1,minHeight:0,overflow:`auto`,p:2,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,bgcolor:`action.hover`},children:(0,H.jsx)(h,{component:`img`,src:i.src,alt:t,sx:{maxWidth:`100%`,height:`auto`,boxShadow:1,bgcolor:`background.paper`}})}):i.state===`document`?(0,H.jsxs)(h,{sx:{flex:1,minHeight:0,overflow:`auto`,p:2},children:[(0,H.jsxs)(c,{variant:`caption`,color:`text.secondary`,children:[S(n,`Nội dung chữ của tài liệu (chỉ đọc)`,`The document's text (read-only)`),i.truncated?S(n,` · đã rút gọn`,` · truncated`):``]}),(0,H.jsx)(h,{component:`pre`,sx:{m:0,mt:1,whiteSpace:`pre-wrap`,overflowWrap:`anywhere`,fontFamily:`inherit`,fontSize:`.92rem`,lineHeight:1.6},children:i.text})]}):(0,H.jsx)(o,{severity:`info`,children:S(n,`Tệp nhị phân hoặc quá lớn để hiển thị.`,`This file is binary or too large to display.`)})}var Fe=y((0,H.jsx)(`path`,{d:`M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`}),`ChevronRight`),Ie=y((0,H.jsx)(`path`,{d:`M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z`}),`ExpandMore`),Le=y((0,H.jsx)(`path`,{d:`M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8zM6 20V4h7v5h5v11z`}),`InsertDriveFileOutlined`),Re=e=>e.split(`/`).slice(0,-1).map((e,t,n)=>n.slice(0,t+1).join(`/`));function ze({sessionRef:e,refresh:n,active:r,onOpen:i,onFolder:a}){let{locale:o}=x(),[l,d]=(0,V.useState)(()=>new Set([``])),[f,p]=(0,V.useState)(()=>new Map),[m,g]=(0,V.useState)(),v=(t,n)=>{p(e=>new Map(e).set(t,e.get(t)??`loading`)),R(e,t,n).then(e=>{n?.aborted||p(n=>new Map(n).set(t,e))}).catch(()=>{n?.aborted||p(e=>new Map(e).set(t,`error`))})};(0,V.useEffect)(()=>{p(new Map),d(new Set([``]))},[e]),(0,V.useEffect)(()=>{let e=new AbortController;for(let t of l)v(t,e.signal);return()=>e.abort()},[e,n]),(0,V.useEffect)(()=>{if(!r)return;let e=Re(r).filter(e=>!l.has(e));if(e.length){d(t=>new Set([...t,...e]));for(let t of e)f.has(t)||v(t)}},[r]);let y=e=>{if(g(e),a(e),l.has(e)){d(t=>{let n=new Set(t);return n.delete(e),n});return}d(t=>new Set(t).add(e)),(!f.has(e)||f.get(e)===`error`)&&v(e)},b=(e,n)=>{let a=f.get(e);return!a||a===`loading`?(0,H.jsx)(_,{size:14,sx:{ml:1.5+n*1.5,my:.5}}):a===`error`?(0,H.jsx)(c,{variant:`caption`,color:`warning.main`,sx:{pl:1.5+n*1.5},children:S(o,`Chưa đọc được thư mục này.`,`This folder could not be read.`)}):(0,H.jsxs)(H.Fragment,{children:[a.entries.map(e=>{let a=e.kind===`directory`,c=a&&l.has(e.path),d=a?m===e.path:r===e.path,f=a?(0,H.jsxs)(H.Fragment,{children:[c?(0,H.jsx)(Ie,{sx:{fontSize:16}}):(0,H.jsx)(Fe,{sx:{fontSize:16}}),c?(0,H.jsx)(s,{sx:{fontSize:16}}):(0,H.jsx)(u,{sx:{fontSize:16}})]}):(0,H.jsx)(Le,{sx:{fontSize:16,ml:`16px`}});return(0,H.jsxs)(h,{children:[(0,H.jsxs)(t,{fullWidth:!0,size:`small`,disabled:e.protected||e.kind===`symlink`||e.kind===`other`,"aria-label":e.protected?`${e.name} (${S(o,`được bảo vệ`,`protected`)})`:e.name,"aria-expanded":a?c:void 0,"aria-current":!a&&r===e.path?`true`:void 0,onClick:()=>a?y(e.path):(g(void 0),i(e.path)),sx:{justifyContent:`flex-start`,textTransform:`none`,gap:.5,minHeight:24,py:0,pl:.5+n*1.5,pr:1,color:`text.primary`,fontWeight:400,whiteSpace:`nowrap`,bgcolor:d?`action.selected`:void 0},children:[f,(0,H.jsxs)(h,{component:`span`,sx:{overflow:`hidden`,textOverflow:`ellipsis`},children:[e.name,e.protected?` 🔒`:``]})]}),c&&b(e.path,n+1)]},e.path)}),a.truncated&&(0,H.jsx)(c,{variant:`caption`,sx:{pl:1.5+n*1.5},children:S(o,`Danh sách đã được giới hạn.`,`Listing limit reached.`)})]})};return(0,H.jsx)(h,{role:`group`,"aria-label":S(o,`Cây thư mục`,`Folder tree`),sx:{py:.5},children:b(``,0)})}var Be=(0,V.lazy)(()=>C(()=>import(`./WorkspaceCodeEditor-BDTPvq-0.js`),__vite__mapDeps([0,1,2,3,4,5,6])));function Ve({sessionRef:e,target:r,navigationHost:i,sidebarMode:s,onHide:l,fill:u}){let{locale:y}=x(),[C,w]=(0,V.useState)(`files`),[T,E]=(0,V.useState)(!1),[te,D]=(0,V.useState)(``),[ne,O]=(0,V.useState)(!1),[A,j]=(0,V.useState)(),[M,re]=(0,V.useState)(``),N=Oe(e),{tabs:P,active:F}=N,[ie,I]=(0,V.useState)(``),[ae,L]=(0,V.useState)(!1),[se,R]=(0,V.useState)(!1),z=(0,V.useRef)(null),[U,ue]=(0,V.useState)(0);(0,V.useEffect)(()=>{let t=t=>{t.detail?.sessionRef===e&&ue(e=>e+1)};return window.addEventListener(`piagent-workspace-saved`,t),()=>window.removeEventListener(`piagent-workspace-saved`,t)},[e]),(0,V.useEffect)(()=>()=>z.current?.abort(),[]);let W=async(t,n=1)=>{if(z.current?.abort(),R(!1),P.find(e=>e.file.path===t)){N.select(t,n);return}z.current?.abort();let r=new AbortController;z.current=r,R(!0),L(!1);try{let i=await B(e,t,r.signal);if(r.signal.aborted)return;if(i.protected){L(!0);return}N.load(i,n)}catch{r.signal.aborted||L(!0)}finally{r.signal.aborted||R(!1)}};(0,V.useEffect)(()=>{r&&W(r.path,r.line??1)},[r]),(0,V.useEffect)(()=>{s&&s!==`sessions`&&w(s)},[s]);let G=P.find(e=>e.file.path===F),K=G?.file,q=_e(e,P,F),J=le(e,K?.path,K?.digest??null,!!G&&!Q(G),q.diff),Y=ce(e,K?.path,G?.draft??``,q.hunks),X=P.find(e=>e.file.path===N.conflict?.path),de=(0,H.jsxs)(h,{component:`nav`,"aria-label":S(y,`Tệp dự án`,`Project files`),sx:{width:i?`100%`:{xs:136,sm:200},flexShrink:0,overflow:`auto`,borderRight:1,borderColor:`divider`},children:[!i&&(0,H.jsxs)(d,{value:C,onChange:(e,t)=>w(t),"aria-label":S(y,`Khám phá project`,`Explore project`),children:[(0,H.jsx)(ee,{value:`files`,label:S(y,`Tệp`,`Files`)}),(0,H.jsx)(ee,{value:`search`,label:S(y,`Tìm kiếm`,`Search`)})]}),C===`search`?(0,H.jsx)(Ae,{sessionRef:e,onOpen:(e,t)=>void W(e,t)}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(t,{disabled:!N.authority?.writable,onClick:()=>{D(ie?`${ie}/`:``),E(!0)},children:S(y,`Tệp mới`,`New file`)}),(0,H.jsx)(ze,{sessionRef:e,refresh:U,active:F,onOpen:e=>{I(e.split(`/`).slice(0,-1).join(`/`)),W(e)},onFolder:I})]})]});return(0,H.jsxs)(H.Fragment,{children:[J.dialog,Y.dialog,(0,H.jsxs)(f,{direction:`row`,sx:{height:u?`100%`:`calc(100vh - 150px)`,minHeight:u?160:320},children:[i?(0,ke.createPortal)(de,i):de,(0,H.jsxs)(h,{sx:{minWidth:0,flex:1,display:`flex`,flexDirection:`column`},children:[ae&&(0,H.jsx)(o,{severity:`warning`,children:S(y,`Chưa đọc được tệp hoặc thư mục này.`,`This file or folder could not be read.`)}),Y.bar,N.message&&(0,H.jsx)(o,{severity:`warning`,children:N.message}),N.authority?.agentRunning&&(0,H.jsx)(o,{severity:`info`,children:S(y,`Agent đang chạy và có thể sửa tệp này.`,`The agent is running and may change this file.`)}),(0,H.jsxs)(f,{direction:`row`,sx:{alignItems:`center`,borderBottom:1,borderColor:`divider`,minHeight:36},children:[(0,H.jsx)(d,{value:F??!1,onChange:(e,t)=>N.select(t),variant:`scrollable`,scrollButtons:`auto`,"aria-label":S(y,`Các tệp đang mở`,`Open files`),sx:{flex:1,minWidth:0,minHeight:36},children:P.map(e=>(0,H.jsx)(ee,{value:e.file.path,sx:{minHeight:36,py:0},"aria-label":`${e.file.path}${Q(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,label:oe(`${e.file.path}${Q(e)?` ●`:``}${q.counts.get(e.file.path)?` (${q.counts.get(e.file.path)})`:``}`,S(y,`Đóng ${e.file.path}`,`Close ${e.file.path}`),()=>N.close(e.file.path))},e.file.path))}),l&&(0,H.jsx)(m,{size:`small`,"aria-label":S(y,`Ẩn khung tệp`,`Hide files panel`),title:S(y,`Ẩn khung tệp (tệp đang mở vẫn giữ)`,`Hide files panel (open files are kept)`),onClick:l,children:(0,H.jsx)(b,{fontSize:`small`})})]}),se&&(0,H.jsx)(_,{size:20}),K&&(0,H.jsxs)(f,{direction:`row`,sx:{flexShrink:0,overflowX:`auto`,"& .MuiButton-root":{whiteSpace:`nowrap`,flexShrink:0}},children:[J.hasPending&&(0,H.jsx)(t,{onClick:J.checkPending,children:S(y,`Kiểm tra hoàn tác`,`Check revert`)}),(0,H.jsx)(t,{size:`small`,disabled:!N.authority?.writable||K.readOnly||!G||!Q(G)&&!G.pending||N.saving,onClick:()=>void N.save(K.path),children:S(y,`Lưu`,`Save`)}),(0,H.jsx)(t,{size:`small`,onClick:()=>N.close(K.path),children:S(y,`Đóng tệp`,`Close file`)}),(0,H.jsx)(t,{size:`small`,disabled:!N.authority?.writable||K.readOnly||!K.digest||N.saving,onClick:()=>{re(K.path),j(K.path)},children:S(y,`Đổi tên`,`Rename`)}),(0,H.jsx)(t,{size:`small`,color:`error`,disabled:!N.authority?.writable||K.readOnly||!K.digest||N.saving,onClick:()=>{window.confirm(S(y,`Xóa ${K.path}? Có thể khôi phục bằng Git nếu tệp đã commit.`,`Delete ${K.path}? Git can restore it if it was committed.`))&&N.move(K.path)},children:S(y,`Xóa`,`Delete`)}),(0,H.jsx)(t,{size:`small`,onClick:()=>{(!G||!Q(G)||window.confirm(S(y,`Bỏ thay đổi chưa lưu và tải lại?`,`Discard unsaved changes and reload?`)))&&N.reload(K.path)},children:S(y,`Tải lại`,`Reload`)})]}),K?.binary||K?.oversized?(0,H.jsx)(Pe,{sessionRef:e,path:K.path}):K?.content!==null&&K?.content!==void 0?(0,H.jsx)(h,{sx:{flex:1,minHeight:0},children:(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{onComment:Y.open,hunks:q.hunks,onKeep:q.keep,onRevert:N.authority?.writable?e=>void J.request(e):void 0,content:G?.draft??K.content,path:K.path,line:G?.line??1,readOnly:!N.authority?.writable||K.readOnly,onChange:e=>N.change(K.path,e),onSave:()=>void N.save(K.path)})})}):(0,H.jsx)(c,{sx:{p:2},children:S(y,`Chọn một tệp để mở.`,`Select a file to open.`)})]})]}),(0,H.jsxs)(n,{open:T,onClose:()=>E(!1),fullWidth:!0,children:[(0,H.jsx)(p,{children:S(y,`Tạo tệp mới`,`Create a new file`)}),(0,H.jsx)(g,{children:(0,H.jsx)(v,{autoFocus:!0,fullWidth:!0,label:S(y,`Đường dẫn trong project`,`Path in project`),value:te,onChange:e=>D(e.target.value)})}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>E(!1),children:S(y,`Hủy`,`Cancel`)}),(0,H.jsx)(t,{disabled:!k(te)||!N.authority?.writable,onClick:()=>{let e=k(te);!e||!N.authority||(P.some(t=>t.file.path===e.path)?N.select(e.path):N.load({schemaVersion:1,version:`piagent-webui-workspace-file-v1`,generatedAt:new Date().toISOString(),identity:N.authority.identity,path:e.path,language:`text`,protected:!1,readOnly:!1,binary:!1,oversized:!1,content:``,digest:null,revision:null},1,!0),E(!1))},children:S(y,`Tạo`,`Create`)})]})]}),(0,H.jsxs)(n,{open:!!A,onClose:()=>j(void 0),fullWidth:!0,children:[(0,H.jsx)(p,{children:S(y,`Đổi tên tệp`,`Rename file`)}),(0,H.jsx)(g,{children:(0,H.jsx)(v,{autoFocus:!0,fullWidth:!0,label:S(y,`Đường dẫn mới trong project`,`New path in project`),value:M,onChange:e=>re(e.target.value)})}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>j(void 0),children:S(y,`Hủy`,`Cancel`)}),(0,H.jsx)(t,{disabled:!k(M)||k(M)?.path===A||N.saving,onClick:()=>{let e=k(M);!e||!A||N.move(A,e.path).then(e=>{e&&j(void 0)})},children:S(y,`Đổi tên`,`Rename`)})]})]}),(0,H.jsxs)(n,{open:!!N.conflict,onClose:()=>{N.setConflict(void 0),O(!1)},fullWidth:!0,maxWidth:ne?`lg`:`sm`,children:[(0,H.jsx)(p,{children:S(y,`Tệp đã thay đổi trên đĩa`,`The file changed on disk`)}),(0,H.jsxs)(g,{children:[(0,H.jsx)(c,{children:N.conflict?.path}),(0,H.jsx)(c,{children:S(y,`Bản sửa của bạn vẫn được giữ. Chọn cách xử lý xung đột.`,`Your draft is preserved. Choose how to resolve the conflict.`)}),ne&&N.conflict&&X&&(0,H.jsxs)(f,{direction:`row`,spacing:1,children:[(0,H.jsxs)(h,{sx:{width:`50%`,height:360},children:[(0,H.jsx)(c,{children:S(y,`Trên đĩa`,`On disk`)}),(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{path:N.conflict.path,content:N.conflict.content??``})})]}),(0,H.jsxs)(h,{sx:{width:`50%`,height:360},children:[(0,H.jsx)(c,{children:S(y,`Bản sửa của bạn`,`Your draft`)}),(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(_,{size:20}),children:(0,H.jsx)(Be,{path:X.file.path,content:X.draft})})]})]})]}),(0,H.jsxs)(a,{children:[(0,H.jsx)(t,{onClick:()=>{N.setConflict(void 0),O(!1)},children:S(y,`Để sau`,`Later`)}),(0,H.jsx)(t,{onClick:()=>{N.conflict&&(N.load(N.conflict),N.setConflict(void 0),O(!1))},children:S(y,`Tải lại`,`Reload`)}),(0,H.jsx)(t,{onClick:()=>O(!0),children:S(y,`Xem khác biệt`,`Compare`)}),(0,H.jsx)(t,{disabled:N.saving||!N.conflict?.digest||N.conflict.protected||N.conflict.readOnly,onClick:()=>{N.conflict&&N.save(N.conflict.path,N.conflict)},children:S(y,`Ghi đè`,`Overwrite`)})]})]})]})}export{Ve as default};
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/InspectionApp-CBPHxuqj.js","assets/rolldown-runtime-hePW80VL.js","assets/vendor-CSDKB7mU.js","assets/bootstrap-CedkNtRG.js","assets/api-BQS4Dtrr.js","assets/latest-request-DXcYQW86.js","assets/App-DcaqK-_s.js","assets/ui-preferences-0waeSO-S.js","assets/ActivityPanel-DxQ3_dyT.js","assets/view-model-CWNiS4JN.js","assets/workspace-navigation-DkVobhwg.js","assets/transcript-view-model-Bq0nkxyu.js","assets/LineReview-C_0ZpgCH.js","assets/GatewayApp-5DVdNIyr.js","assets/SettingsNavigation-BnorH-l_.js","assets/composer-drafts-BtMaVw8W.js","assets/terminal-transport-Dk5pYNX5.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/InspectionApp-BBiwSaV0.js","assets/rolldown-runtime-hePW80VL.js","assets/vendor-CSDKB7mU.js","assets/bootstrap-CedkNtRG.js","assets/api-BQS4Dtrr.js","assets/latest-request-DXcYQW86.js","assets/App-CiwY9VpU.js","assets/ui-preferences-0waeSO-S.js","assets/ActivityPanel-DxQ3_dyT.js","assets/view-model-CWNiS4JN.js","assets/workspace-navigation-DkVobhwg.js","assets/transcript-view-model-Bq0nkxyu.js","assets/LineReview-C_0ZpgCH.js","assets/GatewayApp-DrNJW3v_.js","assets/SettingsNavigation-C-tO5iXn.js","assets/composer-drafts-BtMaVw8W.js","assets/terminal-transport-Dk5pYNX5.js"])))=>i.map(i=>d[i]);
2
2
  import{r as e,t}from"./rolldown-runtime-hePW80VL.js";import{Bt as n,Dn as r,En as i,Fn as a,Ht as o,Mn as s,Nn as c,On as l,Pn as u,Tn as d,Vt as f,_n as p,bn as m,dn as h,gn as g,hn as _,jn as v,on as y,pn as b,sn as x,un as S,wn as ee,yn as C}from"./vendor-CSDKB7mU.js";import{a as te,n as ne,o as re,s as ie,t as ae}from"./ui-preferences-0waeSO-S.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var oe=t((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0<n;){var r=n-1>>>1,a=e[r];if(0<i(a,t))e[r]=t,e[n]=a,n=r;else break a}}function n(e){return e.length===0?null:e[0]}function r(e){if(e.length===0)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;a:for(var r=0,a=e.length,o=a>>>1;r<o;){var s=2*(r+1)-1,c=e[s],l=s+1,u=e[l];if(0>i(c,n))l<a&&0>i(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(l<a&&0>i(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,ie());else{var t=n(l);t!==null&&se(x,t.startTime-e)}}}var S=!1,ee=-1,C=5,te=-1;function ne(){return g?!0:!(e.unstable_now()-te<C)}function re(){if(g=!1,S){var t=e.unstable_now();te=t;var i=!0;try{a:{m=!1,h&&(h=!1,v(ee),ee=-1),p=!0;var a=f;try{b:{for(b(t),d=n(c);d!==null&&!(d.expirationTime>t&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}}}finally{i?ie():S=!1}}}var ie;if(typeof y==`function`)ie=function(){y(re)};else if(typeof MessageChannel<`u`){var ae=new MessageChannel,oe=ae.port2;ae.port1.onmessage=re,ie=function(){oe.postMessage(null)}}else ie=function(){_(re,0)};function se(t,n){ee=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125<e?console.error(`forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported`):C=0<e?Math.floor(1e3/e):5},e.unstable_getCurrentPriorityLevel=function(){return f},e.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},e.unstable_requestPaint=function(){g=!0},e.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},e.unstable_scheduleCallback=function(r,i,a){var o=e.unstable_now();switch(typeof a==`object`&&a?(a=a.delay,a=typeof a==`number`&&0<a?o+a:o):a=o,r){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return s=a+s,r={id:u++,callback:i,priorityLevel:r,startTime:a,expirationTime:s,sortIndex:-1},a>o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(ee),ee=-1):h=!0,se(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,ie()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),se=t(((e,t)=>{t.exports=oe()})),ce=t((e=>{var t=se(),n=a(),r=u();function i(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function o(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function s(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function c(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function l(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function d(e){if(s(e)!==e)throw Error(i(188))}function f(e){var t=e.alternate;if(!t){if(t=s(e),t===null)throw Error(i(188));return t===e?e:null}for(var n=e,r=t;;){var a=n.return;if(a===null)break;var o=a.alternate;if(o===null){if(r=a.return,r!==null){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return d(a),e;if(o===r)return d(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var c=!1,l=a.child;l;){if(l===n){c=!0,n=a,r=o;break}if(l===r){c=!0,r=a,n=o;break}l=l.sibling}if(!c){for(l=o.child;l;){if(l===n){c=!0,n=o,r=a;break}if(l===r){c=!0,r=o,n=a;break}l=l.sibling}if(!c)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(n.tag!==3)throw Error(i(188));return n.stateNode.current===n?e:t}function p(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=p(e),t!==null)return t;e=e.sibling}return null}var m=Object.assign,h=Symbol.for(`react.element`),g=Symbol.for(`react.transitional.element`),_=Symbol.for(`react.portal`),v=Symbol.for(`react.fragment`),y=Symbol.for(`react.strict_mode`),b=Symbol.for(`react.profiler`),x=Symbol.for(`react.consumer`),S=Symbol.for(`react.context`),ee=Symbol.for(`react.forward_ref`),C=Symbol.for(`react.suspense`),te=Symbol.for(`react.suspense_list`),ne=Symbol.for(`react.memo`),re=Symbol.for(`react.lazy`),ie=Symbol.for(`react.activity`),ae=Symbol.for(`react.memo_cache_sentinel`),oe=Symbol.iterator;function ce(e){return typeof e!=`object`||!e?null:(e=oe&&e[oe]||e[`@@iterator`],typeof e==`function`?e:null)}var le=Symbol.for(`react.client.reference`);function w(e){if(e==null)return null;if(typeof e==`function`)return e.$$typeof===le?null:e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case v:return`Fragment`;case b:return`Profiler`;case y:return`StrictMode`;case C:return`Suspense`;case te:return`SuspenseList`;case ie:return`Activity`}if(typeof e==`object`)switch(e.$$typeof){case _:return`Portal`;case S:return e.displayName||`Context`;case x:return(e._context.displayName||`Context`)+`.Consumer`;case ee:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case ne:return t=e.displayName||null,t===null?w(e.type)||`Memo`:t;case re:t=e._payload,e=e._init;try{return w(e(t))}catch{}}return null}var ue=Array.isArray,T=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,E=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,D={pending:!1,data:null,method:null,action:null},de=[],fe=-1;function pe(e){return{current:e}}function O(e){0>fe||(e.current=de[fe],de[fe]=null,fe--)}function k(e,t){fe++,de[fe]=e.current,e.current=t}var me=pe(null),he=pe(null),ge=pe(null),_e=pe(null);function ve(e,t){switch(k(ge,t),k(he,e),k(me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}O(me),k(me,e)}function ye(){O(me),O(he),O(ge)}function be(e){e.memoizedState!==null&&k(_e,e);var t=me.current,n=Hd(t,e.type);t!==n&&(k(he,e),k(me,n))}function xe(e){he.current===e&&(O(me),O(he)),_e.current===e&&(O(_e),Qf._currentValue=D)}var Se,Ce;function we(e){if(Se===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Se=t&&t[1]||``,Ce=-1<e.stack.indexOf(`
3
3
  at`)?` (<anonymous>)`:-1<e.stack.indexOf(`@`)?`@unknown:0:0`:``}return`
4
4
  `+Se+e+Ce}var Te=!1;function Ee(e,t){if(!e||Te)return``;Te=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),typeof Reflect==`object`&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}e.call(n.prototype)}}else{try{throw Error()}catch(e){r=e}(n=e())&&typeof n.catch==`function`&&n.catch(function(){})}}catch(e){if(e&&r&&typeof e.stack==`string`)return[e.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName=`DetermineComponentFrameRoot`;var i=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,`name`);i&&i.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:`DetermineComponentFrameRoot`});var a=r.DetermineComponentFrameRoot(),o=a[0],s=a[1];if(o&&s){var c=o.split(`
@@ -34,4 +34,4 @@ try {
34
34
  if (colorScheme) {
35
35
  ${l}
36
36
  }
37
- } catch(e){}})();`}},`mui-color-scheme-init`)}function ye(){}var be=({key:e,storageWindow:t})=>(!t&&typeof window<`u`&&(t=window),{get(n){if(typeof window>`u`)return;if(!t)return n;let r;try{r=t.localStorage.getItem(e)}catch{}return r||n},set:n=>{if(t)try{t.localStorage.setItem(e,n)}catch{}},subscribe:n=>{if(!t)return ye;let r=t=>{let r=t.newValue;t.key===e&&n(r)};return t.addEventListener(`storage`,r),()=>{t.removeEventListener(`storage`,r)}}});function xe(){}function Se(e){if(typeof window<`u`&&typeof window.matchMedia==`function`&&e===`system`)return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function Ce(e,t){if(e.mode===`light`||e.mode===`system`&&e.systemMode===`light`)return t(`light`);if(e.mode===`dark`||e.mode===`system`&&e.systemMode===`dark`)return t(`dark`)}function we(e){return Ce(e,t=>{if(t===`light`)return e.lightColorScheme;if(t===`dark`)return e.darkColorScheme})}function Te(e){let{defaultMode:t=`light`,defaultLightColorScheme:n,defaultDarkColorScheme:r,supportedColorSchemes:i=[],modeStorageKey:a=he,colorSchemeStorageKey:o=ge,storageWindow:s=typeof window>`u`?void 0:window,storageManager:c=be,noSsr:l=!1}=e,u=i.join(`,`),d=i.length>1,f=w.useMemo(()=>c?.({key:a,storageWindow:s}),[c,a,s]),p=w.useMemo(()=>c?.({key:`${o}-light`,storageWindow:s}),[c,o,s]),m=w.useMemo(()=>c?.({key:`${o}-dark`,storageWindow:s}),[c,o,s]),[h,g]=w.useState(()=>{let e=f?.get(t)||t,i=p?.get(n)||n,a=m?.get(r)||r;return{mode:e,systemMode:Se(e),lightColorScheme:i,darkColorScheme:a}}),[_,v]=w.useState(l||!d);w.useEffect(()=>{v(!0)},[]);let y=we(h),b=w.useCallback(e=>{g(n=>{if(e===n.mode)return n;let r=e??t;return f?.set(r),{...n,mode:r,systemMode:Se(r)}})},[f,t]),x=w.useCallback(e=>{e?typeof e==`string`?e&&!u.includes(e)?console.error(`\`${e}\` does not exist in \`theme.colorSchemes\`.`):g(t=>{let n={...t};return Ce(t,t=>{t===`light`&&(p?.set(e),n.lightColorScheme=e),t===`dark`&&(m?.set(e),n.darkColorScheme=e)}),n}):g(t=>{let i={...t},a=e.light===null?n:e.light,o=e.dark===null?r:e.dark;return a&&(u.includes(a)?(i.lightColorScheme=a,p?.set(a)):console.error(`\`${a}\` does not exist in \`theme.colorSchemes\`.`)),o&&(u.includes(o)?(i.darkColorScheme=o,m?.set(o)):console.error(`\`${o}\` does not exist in \`theme.colorSchemes\`.`)),i}):g(e=>(p?.set(n),m?.set(r),{...e,lightColorScheme:n,darkColorScheme:r}))},[u,p,m,n,r]),S=w.useCallback(e=>{h.mode===`system`&&g(t=>{let n=e?.matches?`dark`:`light`;return t.systemMode===n?t:{...t,systemMode:n}})},[h.mode]),ee=w.useRef(S);return ee.current=S,w.useEffect(()=>{if(typeof window.matchMedia!=`function`||!d)return;let e=(...e)=>ee.current(...e),t=window.matchMedia(`(prefers-color-scheme: dark)`);return t.addListener(e),e(t),()=>{t.removeListener(e)}},[d]),w.useEffect(()=>{if(d){let e=f?.subscribe(e=>{(!e||[`light`,`dark`,`system`].includes(e))&&b(e||t)})||xe,n=p?.subscribe(e=>{(!e||u.match(e))&&x({light:e})})||xe,r=m?.subscribe(e=>{(!e||u.match(e))&&x({dark:e})})||xe;return()=>{e(),n(),r()}}},[x,b,u,t,s,d,f,p,m]),{...h,mode:_?h.mode:void 0,systemMode:_?h.systemMode:void 0,colorScheme:_?y:void 0,setMode:b,setColorScheme:x}}var Ee=`*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}`;function De(e){let{themeId:t,theme:n={},modeStorageKey:r=he,colorSchemeStorageKey:a=ge,disableTransitionOnChange:o=!1,defaultColorScheme:s,resolveTheme:c}=e,l={allColorSchemes:[],colorScheme:void 0,darkColorScheme:void 0,lightColorScheme:void 0,mode:void 0,setColorScheme:()=>{},setMode:()=>{},systemMode:void 0},u=w.createContext(void 0),d=()=>w.useContext(u)||l,f={},p={};function h(e){let{children:l,theme:d,modeStorageKey:h=r,colorSchemeStorageKey:g=a,disableTransitionOnChange:_=o,storageManager:v,storageWindow:y=typeof window>`u`?void 0:window,documentNode:b=typeof document>`u`?void 0:document,colorSchemeNode:x=typeof document>`u`?void 0:document.documentElement,disableNestedContext:S=!1,disableStyleSheetGeneration:ee=!1,defaultMode:C=`system`,forceThemeRerender:te=!1,noSsr:ne}=e,re=w.useRef(!1),ie=T(),ae=w.useContext(u),oe=!!ae&&!S,se=w.useMemo(()=>d||(typeof n==`function`?n():n),[d]),ce=se[t],le=ce||se,{colorSchemes:ue=f,components:E=p,cssVarPrefix:de}=le,fe=Object.keys(ue).filter(e=>!!ue[e]).join(`,`),pe=w.useMemo(()=>fe.split(`,`),[fe]),O=typeof s==`string`?s:s.light,k=typeof s==`string`?s:s.dark,{mode:he,setMode:ge,systemMode:_e,lightColorScheme:ve,darkColorScheme:ye,colorScheme:be,setColorScheme:xe}=Te({supportedColorSchemes:pe,defaultLightColorScheme:O,defaultDarkColorScheme:k,modeStorageKey:h,colorSchemeStorageKey:g,defaultMode:ue[O]&&ue[k]?C:ue[le.defaultColorScheme]?.palette?.mode||le.palette?.mode,storageManager:v,storageWindow:y,noSsr:ne}),Se=he,Ce=be;oe&&(Se=ae.mode,Ce=ae.colorScheme);let we=Ce||le.defaultColorScheme;le.vars&&!te&&(we=le.defaultColorScheme);let De=w.useMemo(()=>{let e=le.generateThemeVars?.()||le.vars,t={...le,components:E,colorSchemes:ue,cssVarPrefix:de,vars:e};if(typeof t.generateSpacing==`function`&&(t.spacing=t.generateSpacing()),we){let e=ue[we];e&&typeof e==`object`&&Object.keys(e).forEach(n=>{e[n]&&typeof e[n]==`object`?t[n]={...t[n],...e[n]}:t[n]=e[n]})}return c?c(t):t},[le,we,E,ue,de]),Oe=le.colorSchemeSelector;m(()=>{if(Ce&&x&&Oe&&Oe!==`media`){let e=Oe,t=Oe;if(e===`class`&&(t=`.%s`),e===`data`&&(t=`[data-%s]`),e?.startsWith(`data-`)&&!e.includes(`%s`)&&(t=`[${e}="%s"]`),t.startsWith(`.`))x.classList.remove(...pe.map(e=>t.substring(1).replace(`%s`,e))),x.classList.add(t.substring(1).replace(`%s`,Ce));else{let e=t.replace(`%s`,Ce).match(/\[([^\]]+)\]/);if(e){let[t,n]=e[1].split(`=`);n||pe.forEach(e=>{x.removeAttribute(t.replace(Ce,e))}),x.setAttribute(t,n?n.replace(/"|'/g,``):``)}else x.setAttribute(t,Ce)}}},[Ce,Oe,x,pe]),w.useEffect(()=>{let e;if(_&&re.current&&b){let t=b.createElement(`style`);t.appendChild(b.createTextNode(Ee)),b.head.appendChild(t),window.getComputedStyle(b.body),e=setTimeout(()=>{b.head.removeChild(t)},1)}return()=>{clearTimeout(e)}},[Ce,_,b]),w.useEffect(()=>(re.current=!0,()=>{re.current=!1}),[]);let ke=w.useMemo(()=>({allColorSchemes:pe,colorScheme:Ce,darkColorScheme:ye,lightColorScheme:ve,mode:Se,setColorScheme:xe,setMode:ge,systemMode:_e}),[pe,Ce,ye,ve,Se,xe,ge,_e,De.colorSchemeSelector]),Ae=!0;(ee||le.cssVariables===!1||oe&&ie?.cssVarPrefix===de)&&(Ae=!1);let je=(0,D.jsxs)(w.Fragment,{children:[(0,D.jsx)(me,{themeId:ce?t:void 0,theme:De,children:l}),Ae&&(0,D.jsx)(i,{styles:De.generateStyleSheets?.()||[]})]});return oe?je:(0,D.jsx)(u.Provider,{value:ke,children:je})}let g=typeof s==`string`?s:s.light,_=typeof s==`string`?s:s.dark;return{CssVarsProvider:h,useColorScheme:d,getInitColorSchemeScript:e=>ve({colorSchemeStorageKey:a,defaultLightColorScheme:g,defaultDarkColorScheme:_,modeStorageKey:r,...e})}}var Oe=typeof x({})==`function`,ke=(e,t)=>({WebkitFontSmoothing:`antialiased`,MozOsxFontSmoothing:`grayscale`,boxSizing:`border-box`,WebkitTextSizeAdjust:`100%`,...t&&!e.vars&&{colorScheme:e.palette.mode}}),Ae=e=>({color:(e.vars||e).palette.text.primary,...e.typography.body1,backgroundColor:(e.vars||e).palette.background.default,"@media print":{backgroundColor:(e.vars||e).palette.common.white}}),je=(e,t=!1)=>{let n={};t&&e.colorSchemes&&typeof e.getColorSchemeSelector==`function`&&Object.entries(e.colorSchemes).forEach(([t,r])=>{let i=e.getColorSchemeSelector(t);i.startsWith(`@`)?n[i]={":root":{colorScheme:r.palette?.mode}}:n[i.replace(/\s*&/,``)]={colorScheme:r.palette?.mode}});let r={html:ke(e,t),"*, *::before, *::after":{boxSizing:`inherit`},"strong, b":{fontWeight:e.typography.fontWeightBold},body:{margin:0,...Ae(e),"&::backdrop":{backgroundColor:(e.vars||e).palette.background.default}},...n},i=e.components?.MuiCssBaseline?.styleOverrides;return i&&(r=[r,i]),r},Me=`mui-ecs`,Ne=e=>{let t=je(e,!1),n=Array.isArray(t)?t[0]:t;return!e.vars&&n&&(n.html[`:root:has(${Me})`]={colorScheme:e.palette.mode}),e.colorSchemes&&Object.entries(e.colorSchemes).forEach(([t,r])=>{let i=e.getColorSchemeSelector(t);i.startsWith(`@`)?n[i]={[`:root:not(:has(.${Me}))`]:{colorScheme:r.palette?.mode}}:n[i.replace(/\s*&/,``)]={[`&:not(:has(.${Me}))`]:{colorScheme:r.palette?.mode}}}),t},Pe=x(Oe?({theme:e,enableColorScheme:t})=>je(e,t):({theme:e})=>Ne(e));function Fe(e){let{children:t,enableColorScheme:n=!1}=y({props:e,name:`MuiCssBaseline`});return(0,D.jsxs)(w.Fragment,{children:[Oe&&(0,D.jsx)(Pe,{enableColorScheme:n}),!Oe&&!n&&(0,D.jsx)(`span`,{className:Me,style:{display:`none`}}),t]})}function Ie({theme:e,...t}){let n=`$$material`in e?e[S]:void 0;return(0,D.jsx)(me,{...t,themeId:n?S:void 0,theme:n||e})}var Le={attribute:`data-mui-color-scheme`,colorSchemeStorageKey:`mui-color-scheme`,defaultLightColorScheme:`light`,defaultDarkColorScheme:`dark`,modeStorageKey:`mui-mode`},{CssVarsProvider:Re,useColorScheme:ze,getInitColorSchemeScript:Be}=De({themeId:S,theme:()=>h({cssVariables:!0}),colorSchemeStorageKey:Le.colorSchemeStorageKey,modeStorageKey:Le.modeStorageKey,defaultColorScheme:{light:Le.defaultLightColorScheme,dark:Le.defaultDarkColorScheme},resolveTheme:e=>{let t={...e,typography:b(e.palette,e.typography)};return t.unstable_sx=function(e){return l({sx:e,theme:this})},t}}),Ve=Re;function He({theme:e,...t}){let n=w.useMemo(()=>{if(typeof e==`function`)return e;let t=`$$material`in e?e[S]:e;return`colorSchemes`in t?null:`vars`in t?e:{...e,vars:null}},[e]);return n?(0,D.jsx)(Ie,{theme:n,...t}):(0,D.jsx)(Ve,{theme:e,...t})}var Ue=le(),We=class extends w.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){let{locale:e,children:t}=this.props;return this.state.failed?(0,D.jsxs)(f,{sx:{p:3},children:[(0,D.jsx)(o,{severity:`error`,children:ne(e,`Không tải được giao diện. Vui lòng tải lại để thử lại.`,`Could not load this view. Reload to try again.`)}),(0,D.jsx)(n,{onClick:()=>window.location.reload(),children:ne(e,`Tải lại trang`,`Reload page`)})]}):(0,D.jsx)(w.Suspense,{fallback:(0,D.jsx)(f,{role:`status`,sx:{p:3},children:ne(e,`Đang tải giao diện…`,`Loading view…`)}),children:t})}};function Ge(e){let t=e.mode===`dark`,n=e.mode,{primary:r,secondary:i,background:a,paper:o,text:s,muted:c,divider:l}=e,u=t?`0 16px 48px -12px ${C(`#000`,.7)}, 0 0 0 1px ${C(s,.06)}`:`0 16px 40px -16px ${C(`#1a1a2e`,.25)}, 0 0 0 1px ${C(s,.06)}`,d=`0 0 0 3px ${C(r,t?.28:.22)}`;return h({cssVariables:{cssVarPrefix:`piagent`},palette:{mode:n,primary:{main:r,contrastText:e.onPrimary},secondary:{main:i},success:{main:i},warning:{main:e.warning},error:{main:e.error},background:{default:a,paper:o},text:{primary:s,secondary:c,disabled:c},divider:l,action:{hover:C(s,.05),selected:C(s,.08),focus:C(r,.14)}},shape:{borderRadius:6},transitions:{duration:{shortest:120,shorter:160,short:180,standard:200,complex:260,enteringScreen:200,leavingScreen:160}},typography:{fontFamily:`system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, sans-serif`,fontSize:14,fontWeightRegular:400,fontWeightMedium:500,fontWeightBold:600,h1:{fontSize:`1.6rem`,fontWeight:650,letterSpacing:`-0.03em`,lineHeight:1.2},h2:{fontSize:`1.15rem`,fontWeight:600,letterSpacing:`-0.02em`},h3:{fontSize:`0.95rem`,fontWeight:600},body2:{fontSize:`0.8125rem`},button:{fontSize:`0.8125rem`,fontWeight:550,textTransform:`none`,letterSpacing:0},caption:{fontSize:`0.72rem`,letterSpacing:0},overline:{fontSize:`0.68rem`,fontWeight:600,letterSpacing:`0.08em`}},components:{MuiCssBaseline:{styleOverrides:{html:{backgroundColor:a,WebkitFontSmoothing:`antialiased`},body:{minWidth:320,minHeight:`100vh`,backgroundColor:a},"::selection":{backgroundColor:C(r,.28)},"*":{scrollbarWidth:`thin`,scrollbarColor:`${C(s,.18)} transparent`}}},MuiPaper:{defaultProps:{elevation:0},styleOverrides:{root:{backgroundImage:`none`}}},MuiButtonBase:{defaultProps:{disableRipple:!0}},MuiButton:{defaultProps:{disableElevation:!0},styleOverrides:{root:{minHeight:32,borderRadius:8,paddingInline:12,transition:`background-color .16s, border-color .16s, box-shadow .16s, color .16s`,"&.Mui-focusVisible":{boxShadow:d}},sizeSmall:{minHeight:28,paddingInline:10,fontSize:`0.78rem`},outlined:{borderColor:C(s,.14),"&:hover":{borderColor:C(s,.28),backgroundColor:C(s,.04)}},contained:{"&.MuiButton-colorPrimary:hover":{backgroundColor:C(r,.88),boxShadow:`0 0 0 3px ${C(r,.18)}`}},text:{"&:hover":{backgroundColor:C(s,.06)}}}},MuiIconButton:{styleOverrides:{root:{borderRadius:8,color:c,transition:`background-color .16s, color .16s`,"&:hover":{color:s,backgroundColor:C(s,.07)},"&.Mui-focusVisible":{boxShadow:d}},sizeSmall:{padding:5}}},MuiChip:{styleOverrides:{root:{height:24,borderRadius:999,fontWeight:500,fontSize:`0.75rem`},outlined:{borderColor:C(s,.14)},label:{paddingInline:9}}},MuiListItemButton:{styleOverrides:{root:{minHeight:36,margin:`1px 8px`,borderRadius:8,color:c,transition:`background-color .12s, color .12s`,"&:hover":{backgroundColor:C(s,.05),color:s},"&.Mui-selected":{color:s,backgroundColor:C(s,t?.08:.07)},"&.Mui-selected:hover":{backgroundColor:C(s,t?.11:.09)},"&.Mui-focusVisible":{boxShadow:d}}}},MuiTabs:{styleOverrides:{root:{minHeight:40},indicator:{height:2,borderRadius:2}}},MuiTab:{styleOverrides:{root:{minHeight:40,paddingInline:14,textTransform:`none`,fontWeight:550,fontSize:`0.8125rem`,color:c,"&.Mui-selected":{color:s}}}},MuiOutlinedInput:{styleOverrides:{root:{borderRadius:8,backgroundColor:C(s,t?.03:.02),transition:`box-shadow .16s`,"& .MuiOutlinedInput-notchedOutline":{borderColor:C(s,.12)},"&:hover .MuiOutlinedInput-notchedOutline":{borderColor:C(s,.24)},"&.Mui-focused":{boxShadow:d},"&.Mui-focused .MuiOutlinedInput-notchedOutline":{borderColor:r,borderWidth:1}}}},MuiTooltip:{defaultProps:{arrow:!1,enterDelay:350},styleOverrides:{tooltip:{fontSize:`0.75rem`,fontWeight:500,padding:`5px 9px`,borderRadius:6,color:t?s:`#fafafa`,backgroundColor:t?C(o,.98):`#1f1f24`,boxShadow:u}}},MuiMenu:{styleOverrides:{paper:{borderRadius:10,boxShadow:u,backgroundImage:`none`,marginTop:4},list:{padding:4}}},MuiPopover:{styleOverrides:{paper:{borderRadius:10,boxShadow:u}}},MuiMenuItem:{styleOverrides:{root:{minHeight:32,borderRadius:6,fontSize:`0.8125rem`,"&:hover":{backgroundColor:C(s,.06)},"&.Mui-selected":{backgroundColor:C(r,.12)}}}},MuiDialog:{styleOverrides:{paper:{borderRadius:14,boxShadow:u,backgroundImage:`none`}}},MuiBackdrop:{styleOverrides:{root:{backgroundColor:C(`#000`,t?.6:.32),backdropFilter:`blur(2px)`}}},MuiDrawer:{styleOverrides:{paper:{backgroundImage:`none`,backgroundColor:o}}},MuiAlert:{styleOverrides:{root:{borderRadius:10,border:`1px solid ${C(s,.1)}`,fontSize:`0.8125rem`,alignItems:`center`}}},MuiDivider:{styleOverrides:{root:{borderColor:l}}},MuiLinearProgress:{styleOverrides:{root:{borderRadius:999,height:4},bar:{borderRadius:999}}}}})}function Ke(e){for(let t of e??[]){let e=String(t).toLowerCase().split(`-`)[0];if(e===`vi`)return`vi`;if(e)return`en`}return`en`}var qe=`modulepreload`,Je=function(e){return`/`+e},Ye={},Xe=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Je(t,n),t=s(t),t in Ye)return;Ye[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:qe,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Ze=document.getElementById(`root`);if(!Ze)throw Error(`Piagent WebUI root is missing`);var Qe=document.querySelector(`meta[name="csp-nonce"]`)?.content,$e=c({key:`piagent-mui`,nonce:Qe&&!Qe.startsWith(`__PIAGENT_`)?Qe:void 0,prepend:!0}),et=(0,w.lazy)(()=>Xe(()=>import(`./InspectionApp-CBPHxuqj.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))),tt=(0,w.lazy)(()=>Xe(()=>import(`./GatewayApp-5DVdNIyr.js`),__vite__mapDeps([13,1,2,7,3,4,9,14,10,11,15,5,16])));function nt(e,t,n){try{let r=window.localStorage.getItem(e);return r&&t.includes(r)?r:n}catch{return n}}function rt(){let[e,t]=(0,w.useState)(()=>nt(`piagent-webui-locale`,[`vi`,`en`],Ke(window.navigator?.languages??[window.navigator?.language??``]))),[n,r]=(0,w.useState)(()=>nt(`piagent-webui-theme`,re.map(e=>e.id),``)||te[nt(`piagent-webui-color-mode`,[`light`,`dark`],window.matchMedia?.(`(prefers-color-scheme: light)`).matches?`light`:`dark`)]),i=ie(n)??ie(te.dark),a=i.mode,o=(0,w.useCallback)(e=>r(t=>ie(t)?.mode===e?t:te[e]),[]),s=(0,w.useMemo)(()=>Ge(i),[i]);(0,w.useEffect)(()=>{document.documentElement.lang=e,document.documentElement.dataset.piagentColorMode=a,document.documentElement.dataset.piagentTheme=i.id;try{window.localStorage.setItem(`piagent-webui-locale`,e),window.localStorage.setItem(`piagent-webui-color-mode`,a),window.localStorage.setItem(`piagent-webui-theme`,i.id)}catch{}},[a,e,i]);let c=(0,w.useMemo)(()=>({locale:e,colorMode:a,themeId:i.id,setLocale:t,setColorMode:o,setThemeId:r}),[a,e,i,o]),l=document.querySelector(`meta[name="piagent-webui-mode"]`)?.content;return(0,D.jsx)(ae,{value:c,children:(0,D.jsxs)(He,{theme:s,children:[(0,D.jsx)(Fe,{}),(0,D.jsx)(We,{locale:e,children:l===`gateway`?(0,D.jsx)(tt,{}):(0,D.jsx)(et,{})})]})})}(0,Ue.createRoot)(Ze).render((0,D.jsx)(w.StrictMode,{children:(0,D.jsx)(v,{value:$e,children:(0,D.jsx)(rt,{})})}));export{We as n,Xe as t};
37
+ } catch(e){}})();`}},`mui-color-scheme-init`)}function ye(){}var be=({key:e,storageWindow:t})=>(!t&&typeof window<`u`&&(t=window),{get(n){if(typeof window>`u`)return;if(!t)return n;let r;try{r=t.localStorage.getItem(e)}catch{}return r||n},set:n=>{if(t)try{t.localStorage.setItem(e,n)}catch{}},subscribe:n=>{if(!t)return ye;let r=t=>{let r=t.newValue;t.key===e&&n(r)};return t.addEventListener(`storage`,r),()=>{t.removeEventListener(`storage`,r)}}});function xe(){}function Se(e){if(typeof window<`u`&&typeof window.matchMedia==`function`&&e===`system`)return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function Ce(e,t){if(e.mode===`light`||e.mode===`system`&&e.systemMode===`light`)return t(`light`);if(e.mode===`dark`||e.mode===`system`&&e.systemMode===`dark`)return t(`dark`)}function we(e){return Ce(e,t=>{if(t===`light`)return e.lightColorScheme;if(t===`dark`)return e.darkColorScheme})}function Te(e){let{defaultMode:t=`light`,defaultLightColorScheme:n,defaultDarkColorScheme:r,supportedColorSchemes:i=[],modeStorageKey:a=he,colorSchemeStorageKey:o=ge,storageWindow:s=typeof window>`u`?void 0:window,storageManager:c=be,noSsr:l=!1}=e,u=i.join(`,`),d=i.length>1,f=w.useMemo(()=>c?.({key:a,storageWindow:s}),[c,a,s]),p=w.useMemo(()=>c?.({key:`${o}-light`,storageWindow:s}),[c,o,s]),m=w.useMemo(()=>c?.({key:`${o}-dark`,storageWindow:s}),[c,o,s]),[h,g]=w.useState(()=>{let e=f?.get(t)||t,i=p?.get(n)||n,a=m?.get(r)||r;return{mode:e,systemMode:Se(e),lightColorScheme:i,darkColorScheme:a}}),[_,v]=w.useState(l||!d);w.useEffect(()=>{v(!0)},[]);let y=we(h),b=w.useCallback(e=>{g(n=>{if(e===n.mode)return n;let r=e??t;return f?.set(r),{...n,mode:r,systemMode:Se(r)}})},[f,t]),x=w.useCallback(e=>{e?typeof e==`string`?e&&!u.includes(e)?console.error(`\`${e}\` does not exist in \`theme.colorSchemes\`.`):g(t=>{let n={...t};return Ce(t,t=>{t===`light`&&(p?.set(e),n.lightColorScheme=e),t===`dark`&&(m?.set(e),n.darkColorScheme=e)}),n}):g(t=>{let i={...t},a=e.light===null?n:e.light,o=e.dark===null?r:e.dark;return a&&(u.includes(a)?(i.lightColorScheme=a,p?.set(a)):console.error(`\`${a}\` does not exist in \`theme.colorSchemes\`.`)),o&&(u.includes(o)?(i.darkColorScheme=o,m?.set(o)):console.error(`\`${o}\` does not exist in \`theme.colorSchemes\`.`)),i}):g(e=>(p?.set(n),m?.set(r),{...e,lightColorScheme:n,darkColorScheme:r}))},[u,p,m,n,r]),S=w.useCallback(e=>{h.mode===`system`&&g(t=>{let n=e?.matches?`dark`:`light`;return t.systemMode===n?t:{...t,systemMode:n}})},[h.mode]),ee=w.useRef(S);return ee.current=S,w.useEffect(()=>{if(typeof window.matchMedia!=`function`||!d)return;let e=(...e)=>ee.current(...e),t=window.matchMedia(`(prefers-color-scheme: dark)`);return t.addListener(e),e(t),()=>{t.removeListener(e)}},[d]),w.useEffect(()=>{if(d){let e=f?.subscribe(e=>{(!e||[`light`,`dark`,`system`].includes(e))&&b(e||t)})||xe,n=p?.subscribe(e=>{(!e||u.match(e))&&x({light:e})})||xe,r=m?.subscribe(e=>{(!e||u.match(e))&&x({dark:e})})||xe;return()=>{e(),n(),r()}}},[x,b,u,t,s,d,f,p,m]),{...h,mode:_?h.mode:void 0,systemMode:_?h.systemMode:void 0,colorScheme:_?y:void 0,setMode:b,setColorScheme:x}}var Ee=`*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}`;function De(e){let{themeId:t,theme:n={},modeStorageKey:r=he,colorSchemeStorageKey:a=ge,disableTransitionOnChange:o=!1,defaultColorScheme:s,resolveTheme:c}=e,l={allColorSchemes:[],colorScheme:void 0,darkColorScheme:void 0,lightColorScheme:void 0,mode:void 0,setColorScheme:()=>{},setMode:()=>{},systemMode:void 0},u=w.createContext(void 0),d=()=>w.useContext(u)||l,f={},p={};function h(e){let{children:l,theme:d,modeStorageKey:h=r,colorSchemeStorageKey:g=a,disableTransitionOnChange:_=o,storageManager:v,storageWindow:y=typeof window>`u`?void 0:window,documentNode:b=typeof document>`u`?void 0:document,colorSchemeNode:x=typeof document>`u`?void 0:document.documentElement,disableNestedContext:S=!1,disableStyleSheetGeneration:ee=!1,defaultMode:C=`system`,forceThemeRerender:te=!1,noSsr:ne}=e,re=w.useRef(!1),ie=T(),ae=w.useContext(u),oe=!!ae&&!S,se=w.useMemo(()=>d||(typeof n==`function`?n():n),[d]),ce=se[t],le=ce||se,{colorSchemes:ue=f,components:E=p,cssVarPrefix:de}=le,fe=Object.keys(ue).filter(e=>!!ue[e]).join(`,`),pe=w.useMemo(()=>fe.split(`,`),[fe]),O=typeof s==`string`?s:s.light,k=typeof s==`string`?s:s.dark,{mode:he,setMode:ge,systemMode:_e,lightColorScheme:ve,darkColorScheme:ye,colorScheme:be,setColorScheme:xe}=Te({supportedColorSchemes:pe,defaultLightColorScheme:O,defaultDarkColorScheme:k,modeStorageKey:h,colorSchemeStorageKey:g,defaultMode:ue[O]&&ue[k]?C:ue[le.defaultColorScheme]?.palette?.mode||le.palette?.mode,storageManager:v,storageWindow:y,noSsr:ne}),Se=he,Ce=be;oe&&(Se=ae.mode,Ce=ae.colorScheme);let we=Ce||le.defaultColorScheme;le.vars&&!te&&(we=le.defaultColorScheme);let De=w.useMemo(()=>{let e=le.generateThemeVars?.()||le.vars,t={...le,components:E,colorSchemes:ue,cssVarPrefix:de,vars:e};if(typeof t.generateSpacing==`function`&&(t.spacing=t.generateSpacing()),we){let e=ue[we];e&&typeof e==`object`&&Object.keys(e).forEach(n=>{e[n]&&typeof e[n]==`object`?t[n]={...t[n],...e[n]}:t[n]=e[n]})}return c?c(t):t},[le,we,E,ue,de]),Oe=le.colorSchemeSelector;m(()=>{if(Ce&&x&&Oe&&Oe!==`media`){let e=Oe,t=Oe;if(e===`class`&&(t=`.%s`),e===`data`&&(t=`[data-%s]`),e?.startsWith(`data-`)&&!e.includes(`%s`)&&(t=`[${e}="%s"]`),t.startsWith(`.`))x.classList.remove(...pe.map(e=>t.substring(1).replace(`%s`,e))),x.classList.add(t.substring(1).replace(`%s`,Ce));else{let e=t.replace(`%s`,Ce).match(/\[([^\]]+)\]/);if(e){let[t,n]=e[1].split(`=`);n||pe.forEach(e=>{x.removeAttribute(t.replace(Ce,e))}),x.setAttribute(t,n?n.replace(/"|'/g,``):``)}else x.setAttribute(t,Ce)}}},[Ce,Oe,x,pe]),w.useEffect(()=>{let e;if(_&&re.current&&b){let t=b.createElement(`style`);t.appendChild(b.createTextNode(Ee)),b.head.appendChild(t),window.getComputedStyle(b.body),e=setTimeout(()=>{b.head.removeChild(t)},1)}return()=>{clearTimeout(e)}},[Ce,_,b]),w.useEffect(()=>(re.current=!0,()=>{re.current=!1}),[]);let ke=w.useMemo(()=>({allColorSchemes:pe,colorScheme:Ce,darkColorScheme:ye,lightColorScheme:ve,mode:Se,setColorScheme:xe,setMode:ge,systemMode:_e}),[pe,Ce,ye,ve,Se,xe,ge,_e,De.colorSchemeSelector]),Ae=!0;(ee||le.cssVariables===!1||oe&&ie?.cssVarPrefix===de)&&(Ae=!1);let je=(0,D.jsxs)(w.Fragment,{children:[(0,D.jsx)(me,{themeId:ce?t:void 0,theme:De,children:l}),Ae&&(0,D.jsx)(i,{styles:De.generateStyleSheets?.()||[]})]});return oe?je:(0,D.jsx)(u.Provider,{value:ke,children:je})}let g=typeof s==`string`?s:s.light,_=typeof s==`string`?s:s.dark;return{CssVarsProvider:h,useColorScheme:d,getInitColorSchemeScript:e=>ve({colorSchemeStorageKey:a,defaultLightColorScheme:g,defaultDarkColorScheme:_,modeStorageKey:r,...e})}}var Oe=typeof x({})==`function`,ke=(e,t)=>({WebkitFontSmoothing:`antialiased`,MozOsxFontSmoothing:`grayscale`,boxSizing:`border-box`,WebkitTextSizeAdjust:`100%`,...t&&!e.vars&&{colorScheme:e.palette.mode}}),Ae=e=>({color:(e.vars||e).palette.text.primary,...e.typography.body1,backgroundColor:(e.vars||e).palette.background.default,"@media print":{backgroundColor:(e.vars||e).palette.common.white}}),je=(e,t=!1)=>{let n={};t&&e.colorSchemes&&typeof e.getColorSchemeSelector==`function`&&Object.entries(e.colorSchemes).forEach(([t,r])=>{let i=e.getColorSchemeSelector(t);i.startsWith(`@`)?n[i]={":root":{colorScheme:r.palette?.mode}}:n[i.replace(/\s*&/,``)]={colorScheme:r.palette?.mode}});let r={html:ke(e,t),"*, *::before, *::after":{boxSizing:`inherit`},"strong, b":{fontWeight:e.typography.fontWeightBold},body:{margin:0,...Ae(e),"&::backdrop":{backgroundColor:(e.vars||e).palette.background.default}},...n},i=e.components?.MuiCssBaseline?.styleOverrides;return i&&(r=[r,i]),r},Me=`mui-ecs`,Ne=e=>{let t=je(e,!1),n=Array.isArray(t)?t[0]:t;return!e.vars&&n&&(n.html[`:root:has(${Me})`]={colorScheme:e.palette.mode}),e.colorSchemes&&Object.entries(e.colorSchemes).forEach(([t,r])=>{let i=e.getColorSchemeSelector(t);i.startsWith(`@`)?n[i]={[`:root:not(:has(.${Me}))`]:{colorScheme:r.palette?.mode}}:n[i.replace(/\s*&/,``)]={[`&:not(:has(.${Me}))`]:{colorScheme:r.palette?.mode}}}),t},Pe=x(Oe?({theme:e,enableColorScheme:t})=>je(e,t):({theme:e})=>Ne(e));function Fe(e){let{children:t,enableColorScheme:n=!1}=y({props:e,name:`MuiCssBaseline`});return(0,D.jsxs)(w.Fragment,{children:[Oe&&(0,D.jsx)(Pe,{enableColorScheme:n}),!Oe&&!n&&(0,D.jsx)(`span`,{className:Me,style:{display:`none`}}),t]})}function Ie({theme:e,...t}){let n=`$$material`in e?e[S]:void 0;return(0,D.jsx)(me,{...t,themeId:n?S:void 0,theme:n||e})}var Le={attribute:`data-mui-color-scheme`,colorSchemeStorageKey:`mui-color-scheme`,defaultLightColorScheme:`light`,defaultDarkColorScheme:`dark`,modeStorageKey:`mui-mode`},{CssVarsProvider:Re,useColorScheme:ze,getInitColorSchemeScript:Be}=De({themeId:S,theme:()=>h({cssVariables:!0}),colorSchemeStorageKey:Le.colorSchemeStorageKey,modeStorageKey:Le.modeStorageKey,defaultColorScheme:{light:Le.defaultLightColorScheme,dark:Le.defaultDarkColorScheme},resolveTheme:e=>{let t={...e,typography:b(e.palette,e.typography)};return t.unstable_sx=function(e){return l({sx:e,theme:this})},t}}),Ve=Re;function He({theme:e,...t}){let n=w.useMemo(()=>{if(typeof e==`function`)return e;let t=`$$material`in e?e[S]:e;return`colorSchemes`in t?null:`vars`in t?e:{...e,vars:null}},[e]);return n?(0,D.jsx)(Ie,{theme:n,...t}):(0,D.jsx)(Ve,{theme:e,...t})}var Ue=le(),We=class extends w.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){let{locale:e,children:t}=this.props;return this.state.failed?(0,D.jsxs)(f,{sx:{p:3},children:[(0,D.jsx)(o,{severity:`error`,children:ne(e,`Không tải được giao diện. Vui lòng tải lại để thử lại.`,`Could not load this view. Reload to try again.`)}),(0,D.jsx)(n,{onClick:()=>window.location.reload(),children:ne(e,`Tải lại trang`,`Reload page`)})]}):(0,D.jsx)(w.Suspense,{fallback:(0,D.jsx)(f,{role:`status`,sx:{p:3},children:ne(e,`Đang tải giao diện…`,`Loading view…`)}),children:t})}};function Ge(e){let t=e.mode===`dark`,n=e.mode,{primary:r,secondary:i,background:a,paper:o,text:s,muted:c,divider:l}=e,u=t?`0 16px 48px -12px ${C(`#000`,.7)}, 0 0 0 1px ${C(s,.06)}`:`0 16px 40px -16px ${C(`#1a1a2e`,.25)}, 0 0 0 1px ${C(s,.06)}`,d=`0 0 0 3px ${C(r,t?.28:.22)}`;return h({cssVariables:{cssVarPrefix:`piagent`},palette:{mode:n,primary:{main:r,contrastText:e.onPrimary},secondary:{main:i},success:{main:i},warning:{main:e.warning},error:{main:e.error},background:{default:a,paper:o},text:{primary:s,secondary:c,disabled:c},divider:l,action:{hover:C(s,.05),selected:C(s,.08),focus:C(r,.14)}},shape:{borderRadius:6},transitions:{duration:{shortest:120,shorter:160,short:180,standard:200,complex:260,enteringScreen:200,leavingScreen:160}},typography:{fontFamily:`system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, sans-serif`,fontSize:14,fontWeightRegular:400,fontWeightMedium:500,fontWeightBold:600,h1:{fontSize:`1.6rem`,fontWeight:650,letterSpacing:`-0.03em`,lineHeight:1.2},h2:{fontSize:`1.15rem`,fontWeight:600,letterSpacing:`-0.02em`},h3:{fontSize:`0.95rem`,fontWeight:600},body2:{fontSize:`0.8125rem`},button:{fontSize:`0.8125rem`,fontWeight:550,textTransform:`none`,letterSpacing:0},caption:{fontSize:`0.72rem`,letterSpacing:0},overline:{fontSize:`0.68rem`,fontWeight:600,letterSpacing:`0.08em`}},components:{MuiCssBaseline:{styleOverrides:{html:{backgroundColor:a,WebkitFontSmoothing:`antialiased`},body:{minWidth:320,minHeight:`100vh`,backgroundColor:a},"::selection":{backgroundColor:C(r,.28)},"*":{scrollbarWidth:`thin`,scrollbarColor:`${C(s,.18)} transparent`}}},MuiPaper:{defaultProps:{elevation:0},styleOverrides:{root:{backgroundImage:`none`}}},MuiButtonBase:{defaultProps:{disableRipple:!0}},MuiButton:{defaultProps:{disableElevation:!0},styleOverrides:{root:{minHeight:32,borderRadius:8,paddingInline:12,transition:`background-color .16s, border-color .16s, box-shadow .16s, color .16s`,"&.Mui-focusVisible":{boxShadow:d}},sizeSmall:{minHeight:28,paddingInline:10,fontSize:`0.78rem`},outlined:{borderColor:C(s,.14),"&:hover":{borderColor:C(s,.28),backgroundColor:C(s,.04)}},contained:{"&.MuiButton-colorPrimary:hover":{backgroundColor:C(r,.88),boxShadow:`0 0 0 3px ${C(r,.18)}`}},text:{"&:hover":{backgroundColor:C(s,.06)}}}},MuiIconButton:{styleOverrides:{root:{borderRadius:8,color:c,transition:`background-color .16s, color .16s`,"&:hover":{color:s,backgroundColor:C(s,.07)},"&.Mui-focusVisible":{boxShadow:d}},sizeSmall:{padding:5}}},MuiChip:{styleOverrides:{root:{height:24,borderRadius:999,fontWeight:500,fontSize:`0.75rem`},outlined:{borderColor:C(s,.14)},label:{paddingInline:9}}},MuiListItemButton:{styleOverrides:{root:{minHeight:36,margin:`1px 8px`,borderRadius:8,color:c,transition:`background-color .12s, color .12s`,"&:hover":{backgroundColor:C(s,.05),color:s},"&.Mui-selected":{color:s,backgroundColor:C(s,t?.08:.07)},"&.Mui-selected:hover":{backgroundColor:C(s,t?.11:.09)},"&.Mui-focusVisible":{boxShadow:d}}}},MuiTabs:{styleOverrides:{root:{minHeight:40},indicator:{height:2,borderRadius:2}}},MuiTab:{styleOverrides:{root:{minHeight:40,paddingInline:14,textTransform:`none`,fontWeight:550,fontSize:`0.8125rem`,color:c,"&.Mui-selected":{color:s}}}},MuiOutlinedInput:{styleOverrides:{root:{borderRadius:8,backgroundColor:C(s,t?.03:.02),transition:`box-shadow .16s`,"& .MuiOutlinedInput-notchedOutline":{borderColor:C(s,.12)},"&:hover .MuiOutlinedInput-notchedOutline":{borderColor:C(s,.24)},"&.Mui-focused":{boxShadow:d},"&.Mui-focused .MuiOutlinedInput-notchedOutline":{borderColor:r,borderWidth:1}}}},MuiTooltip:{defaultProps:{arrow:!1,enterDelay:350},styleOverrides:{tooltip:{fontSize:`0.75rem`,fontWeight:500,padding:`5px 9px`,borderRadius:6,color:t?s:`#fafafa`,backgroundColor:t?C(o,.98):`#1f1f24`,boxShadow:u}}},MuiMenu:{styleOverrides:{paper:{borderRadius:10,boxShadow:u,backgroundImage:`none`,marginTop:4},list:{padding:4}}},MuiPopover:{styleOverrides:{paper:{borderRadius:10,boxShadow:u}}},MuiMenuItem:{styleOverrides:{root:{minHeight:32,borderRadius:6,fontSize:`0.8125rem`,"&:hover":{backgroundColor:C(s,.06)},"&.Mui-selected":{backgroundColor:C(r,.12)}}}},MuiDialog:{styleOverrides:{paper:{borderRadius:14,boxShadow:u,backgroundImage:`none`}}},MuiBackdrop:{styleOverrides:{root:{backgroundColor:C(`#000`,t?.6:.32),backdropFilter:`blur(2px)`}}},MuiDrawer:{styleOverrides:{paper:{backgroundImage:`none`,backgroundColor:o}}},MuiAlert:{styleOverrides:{root:{borderRadius:10,border:`1px solid ${C(s,.1)}`,fontSize:`0.8125rem`,alignItems:`center`}}},MuiDivider:{styleOverrides:{root:{borderColor:l}}},MuiLinearProgress:{styleOverrides:{root:{borderRadius:999,height:4},bar:{borderRadius:999}}}}})}function Ke(e){for(let t of e??[]){let e=String(t).toLowerCase().split(`-`)[0];if(e===`vi`)return`vi`;if(e)return`en`}return`en`}var qe=`modulepreload`,Je=function(e){return`/`+e},Ye={},Xe=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Je(t,n),t=s(t),t in Ye)return;Ye[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:qe,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Ze=document.getElementById(`root`);if(!Ze)throw Error(`Piagent WebUI root is missing`);var Qe=document.querySelector(`meta[name="csp-nonce"]`)?.content,$e=c({key:`piagent-mui`,nonce:Qe&&!Qe.startsWith(`__PIAGENT_`)?Qe:void 0,prepend:!0}),et=(0,w.lazy)(()=>Xe(()=>import(`./InspectionApp-BBiwSaV0.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))),tt=(0,w.lazy)(()=>Xe(()=>import(`./GatewayApp-DrNJW3v_.js`),__vite__mapDeps([13,1,2,7,3,4,9,14,10,11,15,5,16])));function nt(e,t,n){try{let r=window.localStorage.getItem(e);return r&&t.includes(r)?r:n}catch{return n}}function rt(){let[e,t]=(0,w.useState)(()=>nt(`piagent-webui-locale`,[`vi`,`en`],Ke(window.navigator?.languages??[window.navigator?.language??``]))),[n,r]=(0,w.useState)(()=>nt(`piagent-webui-theme`,re.map(e=>e.id),``)||te[nt(`piagent-webui-color-mode`,[`light`,`dark`],window.matchMedia?.(`(prefers-color-scheme: light)`).matches?`light`:`dark`)]),i=ie(n)??ie(te.dark),a=i.mode,o=(0,w.useCallback)(e=>r(t=>ie(t)?.mode===e?t:te[e]),[]),s=(0,w.useMemo)(()=>Ge(i),[i]);(0,w.useEffect)(()=>{document.documentElement.lang=e,document.documentElement.dataset.piagentColorMode=a,document.documentElement.dataset.piagentTheme=i.id;try{window.localStorage.setItem(`piagent-webui-locale`,e),window.localStorage.setItem(`piagent-webui-color-mode`,a),window.localStorage.setItem(`piagent-webui-theme`,i.id)}catch{}},[a,e,i]);let c=(0,w.useMemo)(()=>({locale:e,colorMode:a,themeId:i.id,setLocale:t,setColorMode:o,setThemeId:r}),[a,e,i,o]),l=document.querySelector(`meta[name="piagent-webui-mode"]`)?.content;return(0,D.jsx)(ae,{value:c,children:(0,D.jsxs)(He,{theme:s,children:[(0,D.jsx)(Fe,{}),(0,D.jsx)(We,{locale:e,children:l===`gateway`?(0,D.jsx)(tt,{}):(0,D.jsx)(et,{})})]})})}(0,Ue.createRoot)(Ze).render((0,D.jsx)(w.StrictMode,{children:(0,D.jsx)(v,{value:$e,children:(0,D.jsx)(rt,{})})}));export{We as n,Xe as t};
@@ -7,7 +7,7 @@
7
7
  <meta name="csp-nonce" content="__PIAGENT_CSP_NONCE__" />
8
8
  <meta name="piagent-webui-mode" content="__PIAGENT_WEBUI_MODE__" />
9
9
  <title>Piagent WebUI</title>
10
- <script type="module" crossorigin src="/assets/index-BMQo9OEq.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-uhJMXxqD.js"></script>
11
11
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/vendor-CSDKB7mU.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/ui-preferences-0waeSO-S.js">
@@ -13,6 +13,7 @@ export const LAUNCH_REASONS: Record<string, [string, string]> = {
13
13
  "managed-profile-disconnected": ["Cấu hình Piagent đang thuộc key công ty đã ngắt kết nối. Nhập lại cấu hình cho Piagent trong Agent Watch (trên Windows: Kết nối Piagent trong WSL).", "The Piagent configuration belongs to a disconnected company key. Import it again in Agent Watch (on Windows: Connect Piagent in WSL)."],
14
14
  "managed-launch-binding-changed": ["Agent Watch hoặc Piagent vừa cập nhật. Nhập lại cấu hình cho Piagent trong Agent Watch (trên Windows: Kết nối Piagent trong WSL).", "Agent Watch or Piagent changed. Import the Piagent configuration again in Agent Watch (on Windows: Connect Piagent in WSL)."],
15
15
  "managed-project-contains-config": ["Không mở Piagent công ty ở thư mục này (thường là thư mục home ~) vì nó chứa cấu hình công ty. Vào thư mục dự án rồi chạy lại: cd ~/đường-dẫn-dự-án && piagent studio, hoặc piagent studio --project ~/đường-dẫn-dự-án.", "The company Piagent cannot open this folder (usually your home folder ~) because it holds the company configuration. Go to a project folder and run it again: cd ~/your-project && piagent studio, or piagent studio --project ~/your-project."],
16
+ "managed-session-outside-store": ["--session chỉ mở được cuộc trò chuyện công ty của chính bạn trên máy này. Mở piagent studio --project <thư mục dự án> rồi gõ /resume.", "--session only opens your own company conversations on this computer. Run piagent studio --project <project folder>, then /resume."],
16
17
  "managed-binding-update-pending": ["Agent Watch đang chạy nhưng chưa cập nhật cấu hình sau bản Piagent hoặc Agent Watch mới. Mở Agent Watch → Studio, bấm Áp dụng cho Piagent rồi mở lại.", "Agent Watch is running but has not updated the configuration after the Piagent or Agent Watch update yet. Open Agent Watch → Studio, apply for Piagent, then open it again."],
17
18
  "managed-binding-watch-not-running": ["Piagent hoặc Agent Watch vừa cập nhật nhưng Agent Watch không chạy nên chưa cập nhật cấu hình. Mở Agent Watch, chờ vài giây rồi mở lại.", "Piagent or Agent Watch was updated but Agent Watch is not running, so the configuration was not updated. Open Agent Watch, wait a few seconds, then open it again."],
18
19
  "managed-launch-version-mismatch": ["Agent Watch đang dùng một bản Piagent khác với dashboard này. Mở Agent Watch → Studio, bấm Áp dụng cho Piagent rồi kết nối lại.", "Agent Watch points at another Piagent install than this dashboard. Open Agent Watch → Studio, apply for Piagent, then connect again."],
@@ -6,7 +6,9 @@ import { createHash } from 'node:crypto';
6
6
  import { fileURLToPath, pathToFileURL } from 'node:url';
7
7
  import { ManagedBrokerClient } from '../packages/piagent-core/managed/broker-client.mjs';
8
8
  import { ManagedSession } from '../packages/piagent-core/managed/session.mjs';
9
- import { agentWatchDataDirectory, interopEnvironment, resolveStore, storedSlot } from '../packages/piagent-core/managed/store.mjs';
9
+ import { agentWatchDataDirectory, companySessionFile, interopEnvironment, resolveStore, storedSlot } from '../packages/piagent-core/managed/store.mjs';
10
+ import { companyHerdrExtension, herdrEnvironment } from '../packages/piagent-core/managed/herdr-reporter.mjs';
11
+ import { browserCommand } from '../packages/piagent-core/runtime/host/browser-opener.mjs';
10
12
  import { agentWatchRunning, awaitRebind, bindingMismatch, brokerUpdatedAfterBinding, installedAfterBinding } from '../packages/piagent-core/managed/binding-wait.mjs';
11
13
 
12
14
  const digest = file => createHash('sha256').update(fs.readFileSync(file)).digest('hex');
@@ -15,15 +17,19 @@ const digest = file => createHash('sha256').update(fs.readFileSync(file)).digest
15
17
  process.removeAllListeners('warning');
16
18
  process.on('warning', warning => { if (warning.name !== 'ExperimentalWarning') process.stderr.write(`${warning.name}: ${warning.message}\n`); });
17
19
  const args = process.argv.slice(2), flags = new Map();
18
- if (args.includes('--help')) { console.log('piagent studio [--web [--no-open] | --serve | --check | --doctor | --prompt <text> [--json] | --rpc] [--config <Agent Watch configuration>] [--project <folder>]\nDefaults: the configuration imported into ~/.pi/agent and the current project. Personal sessions remain under pi / piagent dashboard.\n--json with --prompt writes the event stream of `pi --mode json` (JSONL on stdout; failures on stderr, exit 1).\n--rpc speaks the protocol of `pi --mode rpc` on stdin/stdout for one company conversation (several messages, questions as extension UI requests).'); process.exit(0); }
20
+ if (args.includes('--help')) { console.log('piagent studio [--web [--no-open] | --serve | --check | --doctor | --prompt <text> [--json] | --rpc] [--config <Agent Watch configuration>] [--project <folder>] [--session <company conversation file>]\nDefaults: the configuration imported into ~/.pi/agent and the current project. Personal sessions remain under pi / piagent dashboard.\n--json with --prompt writes the event stream of `pi --mode json` (JSONL on stdout; failures on stderr, exit 1).\n--rpc speaks the protocol of `pi --mode rpc` on stdin/stdout for one company conversation (several messages, questions as extension UI requests).\n--session reopens one of your company conversations in the Terminal (Herdr restores panes with it).'); process.exit(0); }
19
21
  for (let i = 0; i < args.length; i++) {
20
22
  if (['--check', '--doctor', '--web', '--serve', '--no-open', '--json', '--rpc'].includes(args[i])) { flags.set(args[i], true); continue; }
21
- if (!['--config', '--project', '--prompt'].includes(args[i]) || flags.has(args[i]) || !args[i + 1]) throw Error('managed-launch-arguments');
23
+ if (!['--config', '--project', '--prompt', '--session'].includes(args[i]) || flags.has(args[i]) || !args[i + 1]) throw Error('managed-launch-arguments');
22
24
  flags.set(args[i], args[++i]);
23
25
  }
24
26
  if (flags.has('--json') && !flags.has('--prompt')) throw Error('managed-launch-arguments');
27
+ if (flags.has('--session') && ['--check', '--doctor', '--web', '--serve', '--prompt', '--rpc'].some((f) => flags.has(f))) throw Error('managed-launch-arguments');
25
28
  if (flags.has('--rpc') && ['--check', '--doctor', '--web', '--serve', '--prompt', '--json'].some((f) => flags.has(f))) throw Error('managed-launch-arguments');
26
29
  const home = os.homedir();
30
+ // Read before the environment is cleared: a Herdr pane's socket for the
31
+ // Terminal's reporter, and the PATH that finds the Windows browser from WSL.
32
+ const herdr = herdrEnvironment(), ambientPath = process.env.PATH;
27
33
  // Joining Agent Watch takes a few seconds; keys typed before the Terminal draws are lost, so say so.
28
34
  if (!['--check', '--prompt', '--serve', '--doctor', '--web', '--rpc'].some((f) => flags.has(f)) && process.stderr.isTTY) process.stderr.write('Piagent công ty: đang kết nối Agent Watch, chờ ô nhập hiện ra rồi gõ…\n');
29
35
  // Do this before importing the SDK: it must not discover personal keys, Node
@@ -122,7 +128,7 @@ try {
122
128
  if(!result.ok || !result.value?.launchUrl) throw Error('managed-web-launch-failed');
123
129
  result.value.launchUrl+=`&project=${encodeURIComponent(registered.value.projectRef)}`;
124
130
  process.stdout.write(`Agent Watch Auto: ${result.value.launchUrl}\n`);
125
- if(!flags.has('--no-open')){ const {spawn}=await import('node:child_process'); spawn('/usr/bin/open',[result.value.launchUrl],{stdio:'ignore',env:clean}).unref(); }
131
+ if(!flags.has('--no-open')){ const {spawn}=await import('node:child_process'); const opener=browserCommand(result.value.launchUrl,{environment:{...clean,PATH:ambientPath}}); if(opener) spawn(opener.command,opener.args,{stdio:'ignore',env:clean,...opener.options}).on('error',()=>{}).unref(); }
126
132
  }
127
133
  if(gateway){
128
134
  process.once('SIGINT',()=>void gateway.close());process.once('SIGTERM',()=>void gateway.close());
@@ -144,6 +150,8 @@ try {
144
150
  const packageRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
145
151
  const terminal = companyTerminalExtension({ managed: () => current, packageRoot, sdkRoot: config.sdk_root,
146
152
  bindingChanged: () => { try { return digest(config.entrypoint) !== config.entrypoint_sha256; } catch { return true; } } });
153
+ // Herdr shows the Terminal's state and reopens it after a restart; scripted runs have no pane to show.
154
+ const reportToHerdr = herdr && !['--check', '--prompt', '--rpc'].some((f) => flags.has(f));
147
155
  const factory = async ({ cwd, sessionManager }) => {
148
156
  let next;
149
157
  try { next = holdManagedSession(agentDir, sessionManager.getSessionFile()); }
@@ -152,12 +160,14 @@ try {
152
160
  // A conversation that enrolled again (key or harness changed) holds the live broker.
153
161
  if (current) { broker = current.broker; await current.session.abort(); await Promise.allSettled([...current.helpers.values()]); await broker.request('close'); current.session.dispose(); await current.boundary.dispose(); }
154
162
  current = await ManagedSession.create({ sdkRoot: config.sdk_root, cwd, origin: config.origin, broker, agentDir, sessionManager,
155
- protectedRoots: [configPath, agentDir], renewBroker: newBroker, bindingRevision, terminalExtensions: [terminal] });
163
+ protectedRoots: [configPath, agentDir], renewBroker: newBroker, bindingRevision, terminalExtensions: [terminal, ...(reportToHerdr ? [companyHerdrExtension(herdr)] : [])] });
156
164
  // The plan is drawn as a checklist here; Pi keeps this definition object.
157
165
  for (const [name, draw] of Object.entries(toolRenderers)) Object.assign(current.session.getToolDefinition(name) ?? {}, draw);
158
166
  return { session: current.session, extensionsResult: current.extensionsResult, services: current.services, diagnostics: [] };
159
167
  };
160
- const host = await api.createAgentSessionRuntime(factory, { cwd, agentDir, sessionManager: api.SessionManager.create(cwd, path.join(agentDir, 'sessions')) });
168
+ const sessions = path.join(agentDir, 'sessions'), reopen = flags.has('--session') ? companySessionFile(sessions, flags.get('--session')) : null;
169
+ if (flags.has('--session') && !reopen) process.stderr.write('Cuộc trò chuyện này chưa có tin nhắn nào được lưu; mở cuộc trò chuyện mới trong project.\n');
170
+ const host = await api.createAgentSessionRuntime(factory, { cwd, agentDir, sessionManager: reopen ? api.SessionManager.open(reopen, sessions, cwd) : api.SessionManager.create(cwd, sessions) });
161
171
  if (flags.get('--check')) console.log('agent-watch-auto: connected; native context; isolated tools; no inference sent.');
162
172
  else if (flags.has('--prompt')) {
163
173
  if (flags.has('--json')) {