@piagent/platform 1.43.4 → 1.43.5

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 (88) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/docs/command-reference-vietnamese.md +2 -2
  3. package/docs/distribution-standard.md +6 -6
  4. package/docs/operator-manual-vietnamese.md +7 -7
  5. package/docs/publishing-for-teams.md +1 -0
  6. package/docs/release-install-policy.md +2 -2
  7. package/docs/team-onboarding.md +2 -2
  8. package/docs-site/architecture.html +1 -1
  9. package/docs-site/assets/search-en.json +1 -1
  10. package/docs-site/assets/search-vi.json +1 -1
  11. package/docs-site/benchmark.html +1 -1
  12. package/docs-site/commands.html +1 -1
  13. package/docs-site/context-engine.html +1 -1
  14. package/docs-site/ecosystem.html +1 -1
  15. package/docs-site/en/architecture.html +1 -1
  16. package/docs-site/en/benchmark.html +1 -1
  17. package/docs-site/en/commands.html +1 -1
  18. package/docs-site/en/context-engine.html +1 -1
  19. package/docs-site/en/ecosystem.html +1 -1
  20. package/docs-site/en/index.html +9 -9
  21. package/docs-site/en/mcp-approval.html +1 -1
  22. package/docs-site/en/mcp-auth.html +1 -1
  23. package/docs-site/en/mcp-servers.html +1 -1
  24. package/docs-site/en/mcp.html +1 -1
  25. package/docs-site/en/permissions.html +1 -1
  26. package/docs-site/en/profiles.html +1 -1
  27. package/docs-site/en/quickstart.html +1 -1
  28. package/docs-site/en/runtime.html +1 -1
  29. package/docs-site/en/scope.html +1 -1
  30. package/docs-site/en/security.html +1 -1
  31. package/docs-site/en/team.html +1 -1
  32. package/docs-site/en/update.html +3 -3
  33. package/docs-site/en/whats-new.html +27 -15
  34. package/docs-site/en/windows.html +1 -1
  35. package/docs-site/en/workflows.html +1 -1
  36. package/docs-site/index.html +9 -9
  37. package/docs-site/mcp-approval.html +1 -1
  38. package/docs-site/mcp-auth.html +1 -1
  39. package/docs-site/mcp-servers.html +1 -1
  40. package/docs-site/mcp.html +1 -1
  41. package/docs-site/permissions.html +1 -1
  42. package/docs-site/profiles.html +1 -1
  43. package/docs-site/quickstart.html +1 -1
  44. package/docs-site/releases.json +36 -0
  45. package/docs-site/runtime.html +1 -1
  46. package/docs-site/scope.html +1 -1
  47. package/docs-site/security.html +1 -1
  48. package/docs-site/team.html +1 -1
  49. package/docs-site/update.html +3 -3
  50. package/docs-site/whats-new.html +27 -15
  51. package/docs-site/windows.html +1 -1
  52. package/docs-site/workflows.html +1 -1
  53. package/evals/private-holdout-v1/public-exposure.v2.json +1 -1
  54. package/package.json +1 -1
  55. package/packages/piagent-core/extensions/document-intake.ts +265 -19
  56. package/packages/piagent-core/managed/compaction.mjs +26 -0
  57. package/packages/piagent-core/managed/session.mjs +4 -4
  58. package/packages/piagent-core/package.json +1 -1
  59. package/packages/piagent-core/runtime/input/attachment-store.ts +10 -10
  60. package/packages/piagent-core/runtime/input/attachment-types.ts +18 -0
  61. package/packages/piagent-core/runtime/inspection/document-workspace-projection.ts +1 -1
  62. package/packages/piagent-webui/dist/client/assets/{ActivityPanel-DRAiHliI.js → ActivityPanel-CBbfhN-m.js} +1 -1
  63. package/packages/piagent-webui/dist/client/assets/App-CoOO2CWp.js +5 -0
  64. package/packages/piagent-webui/dist/client/assets/GatewayApp-Bwy6FBbW.js +97 -0
  65. package/packages/piagent-webui/dist/client/assets/{InspectionApp-C00GhY47.js → InspectionApp-po4KV8yJ.js} +1 -1
  66. package/packages/piagent-webui/dist/client/assets/{SessionAgentWorkspace-CBbWJmh7.js → SessionAgentWorkspace-Cl_esd_w.js} +1 -1
  67. package/packages/piagent-webui/dist/client/assets/{SessionInspectorDrawer-CMgkZoNX.js → SessionInspectorDrawer-BQziFUF-.js} +2 -2
  68. package/packages/piagent-webui/dist/client/assets/{SettingsNavigation-CM0s3QUC.js → SettingsNavigation-DzboWgoR.js} +1 -1
  69. package/packages/piagent-webui/dist/client/assets/SettingsPage-DX2QIvRC.js +1 -0
  70. package/packages/piagent-webui/dist/client/assets/{TerminalPanel-DNKKZsMX.js → TerminalPanel-3C3tq-a-.js} +1 -1
  71. package/packages/piagent-webui/dist/client/assets/{WorkspaceCodeEditor-DUffKV2S.js → WorkspaceCodeEditor-v1k4-GB9.js} +1 -1
  72. package/packages/piagent-webui/dist/client/assets/{WorkspaceExplorer-D5iHXMqE.js → WorkspaceExplorer-2QXtYcOx.js} +3 -3
  73. package/packages/piagent-webui/dist/client/assets/{api-BUjrtT1B.js → api-BQS4Dtrr.js} +1 -1
  74. package/packages/piagent-webui/dist/client/assets/{index-D6GtlEqC.js → index-DXXj1NQr.js} +2 -2
  75. package/packages/piagent-webui/dist/client/assets/transcript-view-model-BCyNr6KF.js +3 -0
  76. package/packages/piagent-webui/dist/client/index.html +1 -1
  77. package/packages/piagent-webui/extension/piagent-webui.ts +2 -0
  78. package/packages/piagent-webui/server/core-inspection-provider.ts +6 -1
  79. package/packages/piagent-webui/server/ipc-read-model-client.ts +1 -0
  80. package/packages/piagent-webui/server/read-model-provider.ts +1 -0
  81. package/packages/piagent-webui/server/read-only-router.ts +6 -0
  82. package/packages/piagent-webui/server/transcript-projection.ts +20 -4
  83. package/schemas/piagent-webui/attachment-v1.schema.json +8 -1
  84. package/schemas/piagent-webui/document-workspace-v1.schema.json +3 -3
  85. package/packages/piagent-webui/dist/client/assets/App-CarM9drO.js +0 -5
  86. package/packages/piagent-webui/dist/client/assets/GatewayApp-uqpLU6gs.js +0 -93
  87. package/packages/piagent-webui/dist/client/assets/SettingsPage-Cr6M2FVg.js +0 -1
  88. package/packages/piagent-webui/dist/client/assets/transcript-view-model-BNGQCkzY.js +0 -3
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Bt as t,Ct as n,Dn as r,E as i,G as a,I as o,In as s,It as c,K as l,O as u,St as d,U as f,Ut as p,W as m,Yt as h,_t as g,a as _,d as v,dt as y,i as b,nt as x,p as S,pt as C,q as w,qt as T,st as E,u as D,vt as O,wt as k,zt as A}from"./vendor-CA5pzJiI.js";import{i as j,n as M,o as N}from"./ui-preferences-Dy4qeODT.js";import{D as P,E as F,F as I,P as L,a as ee,c as te,dt as R,et as z}from"./api-BUjrtT1B.js";import{r as B}from"./view-model-CWNiS4JN.js";import{F as V,I as H,L as U,P as W,R as G,n as ne,t as re,x as ie}from"./SettingsNavigation-CM0s3QUC.js";var K=e(s(),1),q=r(),ae=T((0,q.jsx)(`path`,{d:`M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2M8.9 13.98l2.1 2.53 3.1-3.99c.2-.26.6-.26.8.01l3.51 4.68c.25.33.01.8-.4.8H6.02c-.42 0-.65-.48-.39-.81L8.12 14c.19-.26.57-.27.78-.02`}),`ImageRounded`),J=T((0,q.jsx)(`path`,{d:`M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2M9.29 16.29 5.7 12.7a.996.996 0 0 1 0-1.41c.39-.39 1.02-.39 1.41 0L10 14.17l6.88-6.88c.39-.39 1.02-.39 1.41 0s.39 1.02 0 1.41l-7.59 7.59c-.38.39-1.02.39-1.41 0`}),`CheckCircleRounded`);function oe({catalog:e,refresh:r}){let{locale:i}=j(),[o,s]=(0,K.useState)(),[u,p]=(0,K.useState)(``),[_,v]=(0,K.useState)(!1),[y,b]=(0,K.useState)(null);(0,K.useEffect)(()=>{if(!o||o.state!==`running`)return;let e=new AbortController,t=window.setTimeout(()=>{P(o.jobRef,e.signal).then(e=>{s(e),e.state===`completed`&&r()}).catch(()=>{e.signal.aborted||b(M(i,`Mất kết nối với luồng OAuth`,`OAuth flow disconnected`))})},750);return()=>{e.abort(),window.clearTimeout(t)}},[o?.jobRef,o?.generatedAt,o?.state,i]),(0,K.useEffect)(()=>p(``),[o?.prompt?.promptRef]);let S=async e=>{v(!0),b(null);try{s(await R(e))}catch{b(M(i,`Không thể bắt đầu OAuth`,`Could not start OAuth`))}finally{v(!1)}},C=async()=>{if(!(!o?.prompt||!u)){v(!0),b(null);try{s(await z(o.jobRef,o.prompt.promptRef,u))}catch{b(M(i,`Bước xác thực đã hết hạn`,`Authentication step expired`))}finally{v(!1)}}},w=async()=>{o?.state===`running`&&await ee(o.jobRef).catch(()=>void 0),s(void 0),b(null)},T=o?.events.slice(-4)??[];return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(t,{sx:{display:`grid`,gridTemplateColumns:{xs:`1fr`,lg:`repeat(2,minmax(0,1fr))`},gap:1},children:(e?.providers??[]).map(e=>(0,q.jsx)(h,{variant:`outlined`,sx:{p:1.75,borderRadius:1},children:(0,q.jsxs)(d,{direction:`row`,sx:{alignItems:`center`,gap:1.25},children:[(0,q.jsx)(G,{name:e.name,size:38}),(0,q.jsx)(c,{sx:{flex:1,fontWeight:650},children:e.name}),e.state===`connected`&&(0,q.jsx)(k,{size:`small`,color:`success`,variant:`outlined`,icon:(0,q.jsx)(J,{}),label:M(i,`Đã kết nối`,`Connected`)}),(0,q.jsx)(A,{size:`small`,variant:`outlined`,disabled:_,onClick:()=>void S(e.providerRef),children:e.state===`connected`?M(i,`Kết nối lại`,`Reconnect`):M(i,`Kết nối`,`Connect`)})]})},e.providerRef))}),e&&e.providers.length===0&&(0,q.jsx)(c,{color:`text.secondary`,children:M(i,`Pi chưa có provider OAuth`,`No OAuth providers available`)}),y&&!o&&(0,q.jsx)(c,{role:`status`,color:`error`,variant:`body2`,sx:{mt:1},children:y}),(0,q.jsxs)(n,{open:!!o,onClose:()=>void w(),fullWidth:!0,maxWidth:`xs`,children:[(0,q.jsx)(f,{children:o?.providerName??`OAuth`}),(0,q.jsx)(m,{children:(0,q.jsxs)(d,{spacing:1.25,sx:{pt:.5},children:[o?.state===`completed`&&(0,q.jsxs)(d,{direction:`row`,spacing:1,sx:{alignItems:`center`},children:[(0,q.jsx)(J,{color:`success`}),(0,q.jsx)(c,{children:M(i,`Đã kết nối`,`Connected`)})]}),T.map(e=>(0,q.jsxs)(t,{children:[e.message&&(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,children:e.message}),e.userCode&&(0,q.jsx)(c,{sx:{my:1,fontFamily:`monospace`,fontSize:`1.35rem`,fontWeight:650,letterSpacing:`.12em`},children:e.userCode}),e.url&&(0,q.jsx)(A,{component:`a`,href:e.url,target:`_blank`,rel:`noopener noreferrer`,variant:`outlined`,size:`small`,endIcon:(0,q.jsx)(l,{}),children:M(i,`Mở trang xác thực`,`Open authentication`)}),e.links.map(e=>(0,q.jsx)(A,{component:`a`,href:e.url,target:`_blank`,rel:`noopener noreferrer`,size:`small`,children:e.label??M(i,`Mở liên kết`,`Open link`)},e.url))]},e.sequence)),o?.prompt&&(0,q.jsxs)(t,{children:[(0,q.jsx)(c,{variant:`body2`,sx:{mb:1},children:o.prompt.message}),o.prompt.type===`select`?(0,q.jsx)(O,{fullWidth:!0,size:`small`,value:u,onChange:e=>p(e.target.value),children:o.prompt.options.map(e=>(0,q.jsx)(x,{value:e.id,children:e.label},e.id))}):(0,q.jsx)(g,{fullWidth:!0,size:`small`,value:u,placeholder:o.prompt.placeholder??void 0,onChange:e=>p(e.target.value)})]}),o&&[`failed`,`cancelled`].includes(o.state)&&(0,q.jsx)(c,{color:`error`,variant:`body2`,children:B(o.reasonCode??o.state,i)}),y&&(0,q.jsx)(c,{role:`status`,color:`error`,variant:`body2`,children:y})]})}),(0,q.jsxs)(a,{children:[(0,q.jsx)(A,{color:`inherit`,onClick:()=>void w(),children:o?.state===`running`?M(i,`Hủy`,`Cancel`):M(i,`Đóng`,`Close`)}),o?.prompt&&(0,q.jsx)(A,{variant:`contained`,disabled:_||!u,onClick:()=>void C(),children:M(i,`Tiếp tục`,`Continue`)})]})]})]})}var se=T((0,q.jsx)(`path`,{d:`M4 7v2c0 .55-.45 1-1 1s-1 .45-1 1v2c0 .55.45 1 1 1s1 .45 1 1v2c0 1.66 1.34 3 3 3h2c.55 0 1-.45 1-1s-.45-1-1-1H7c-.55 0-1-.45-1-1v-2c0-1.3-.84-2.42-2-2.83v-.34C5.16 11.42 6 10.3 6 9V7c0-.55.45-1 1-1h2c.55 0 1-.45 1-1s-.45-1-1-1H7C5.34 4 4 5.34 4 7m17 3c-.55 0-1-.45-1-1V7c0-1.66-1.34-3-3-3h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1 .45 1 1v2c0 1.3.84 2.42 2 2.83v.34c-1.16.41-2 1.52-2 2.83v2c0 .55-.45 1-1 1h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c1.66 0 3-1.34 3-3v-2c0-.55.45-1 1-1s1-.45 1-1v-2c0-.55-.45-1-1-1`}),`DataObjectRounded`),ce=T([(0,q.jsx)(`circle`,{cx:`10`,cy:`8`,r:`4`},`0`),(0,q.jsx)(`path`,{d:`M10.35 14.01C7.62 13.91 2 15.27 2 18v1c0 .55.45 1 1 1h8.54c-2.47-2.76-1.23-5.89-1.19-5.99m9.08 4.01c.47-.8.7-1.77.48-2.82-.34-1.64-1.72-2.95-3.38-3.16-2.63-.34-4.85 1.87-4.5 4.5.22 1.66 1.52 3.04 3.16 3.38 1.05.22 2.02-.01 2.82-.48l1.86 1.86c.39.39 1.02.39 1.41 0s.39-1.02 0-1.41zM16 18c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2`},`1`)],`PersonSearchRounded`),le=T((0,q.jsx)(`path`,{d:`M19.88 18.47c.48-.77.75-1.67.69-2.66-.13-2.15-1.84-3.97-3.97-4.2-2.72-.3-5.02 1.81-5.02 4.47 0 2.49 2.01 4.5 4.49 4.5.88 0 1.7-.26 2.39-.7l2.41 2.41c.39.39 1.03.39 1.42 0s.39-1.03 0-1.42zm-3.8.11c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5m-.36-8.5c-.74.02-1.45.18-2.1.45l-.55-.83-3.08 5.01c-.36.58-1.17.64-1.61.13l-2.12-2.47-3.06 4.9c-.31.49-.97.62-1.44.28-.42-.31-.54-.89-.26-1.34l3.78-6.05c.36-.57 1.17-.63 1.61-.12L9 12.5l3.18-5.17c.38-.62 1.28-.64 1.68-.03zm2.59.5c-.64-.28-1.33-.45-2.05-.49L20.8 2.9c.31-.49.97-.61 1.43-.27.43.31.54.9.26 1.34z`}),`QueryStatsRounded`);function Y({icon:e,title:n,detail:r,children:i}){return(0,q.jsxs)(h,{variant:`outlined`,sx:{p:2,borderRadius:1},children:[(0,q.jsxs)(d,{direction:`row`,spacing:1.25,sx:{alignItems:`flex-start`,mb:1.5},children:[(0,q.jsx)(t,{sx:{width:38,height:38,borderRadius:1,bgcolor:`action.selected`,display:`grid`,placeItems:`center`,flex:`0 0 auto`},children:e}),(0,q.jsxs)(t,{children:[(0,q.jsx)(c,{sx:{fontWeight:650},children:n}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,children:r})]})]}),i]})}function X({children:e}){return(0,q.jsx)(d,{direction:`row`,sx:{gap:.75,flexWrap:`wrap`},children:e})}function ue({session:e,options:n,connections:r,onCompleted:i}){let{locale:a}=j(),[o,s]=(0,K.useState)(!1),[l,u]=(0,K.useState)(),[f,m]=(0,K.useState)(null),[_,v]=(0,K.useState)(e?.sessionRevision??``),[b,T]=(0,K.useState)(null),[E,D]=(0,K.useState)(``),[N,P]=(0,K.useState)(``),[F,I]=(0,K.useState)(``),[L,ee]=(0,K.useState)(``);(0,K.useEffect)(()=>{v(e?.sessionRevision??``),u(void 0),m(null)},[e?.sessionRef]),(0,K.useEffect)(()=>{e?.sessionRevision&&v(e.sessionRevision)},[e?.sessionRevision]);let R=o||!e||!_||e.liveState===`running`||e.liveState===`waiting-approval`,z=n?.profiles??[],B=(0,K.useMemo)(()=>(r?.connections??[]).filter(e=>/^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/.test(e.name)),[r]),H=l?.outputs.find(e=>e.customType===`piagent-service-tier-receipt`)?.details,U=async(t,n=null,r=!1)=>{if(!(!e||!_)){s(!0),m(null);try{let a=await te({schemaVersion:1,version:`piagent-runtime-command-v1`,messageType:`command`,requestId:`runtime_${crypto.randomUUID().replaceAll(`-`,`_`)}`,sessionRef:e.sessionRef,expectedSessionRevision:_,action:t,argument:n,confirmed:r});u(a),a.sessionRevisionAfter&&v(a.sessionRevisionAfter),a.state!==`settled`&&m(a.reasonCode??a.resultCode),await i?.()}catch{m(M(a,`Gateway chưa thể chạy điều khiển này.`,`The Gateway could not run this control.`))}finally{s(!1)}}},W=(e,t,n,r)=>T({action:e,argument:t,title:n,description:r}),G={size:`small`,variant:`outlined`,disabled:R};return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(c,{component:`h1`,variant:`h1`,sx:{mb:.75},children:M(a,`Điều khiển project`,`Project controls`)}),(0,q.jsx)(c,{color:`text.secondary`,sx:{mb:2.5},children:M(a,`Cùng logic với Terminal: Web UI gửi đúng slash command vào Pi runtime. Các nút xem trạng thái không gọi model; thao tác ghi luôn hỏi xác nhận.`,`The same logic as Terminal: Web UI sends the exact slash command to the Pi runtime. Status controls do not call the model; writes always require confirmation.`)}),!e&&(0,q.jsx)(h,{variant:`outlined`,sx:{p:2,borderRadius:1,mb:2},children:(0,q.jsx)(c,{color:`text.secondary`,children:M(a,`Hãy chọn một cuộc trò chuyện để điều khiển project tương ứng.`,`Select a chat to control its project.`)})}),(0,q.jsxs)(t,{sx:{display:`grid`,gridTemplateColumns:{xs:`1fr`,lg:`repeat(2,minmax(0,1fr))`},gap:1.25},children:[(0,q.jsxs)(Y,{icon:(0,q.jsx)(le,{color:`primary`}),title:M(a,`Runtime & token`,`Runtime & tokens`),detail:M(a,`Tình trạng, inspector, lịch sử usage và preflight — 0 model token.`,`Status, inspector, usage history and preflight — zero model tokens.`),children:[(0,q.jsxs)(X,{children:[(0,q.jsx)(A,{...G,onClick:()=>void U(`runtime.status`),children:`Pi status`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`runtime.inspector`),children:`Inspector`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`orchestration.status`),children:`Orchestration`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`usage.live`),children:`Usage live`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`usage.history`),children:`History`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`usage.logs`),children:`Logs`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`usage.efficiency`),children:`Efficiency`})]}),(0,q.jsxs)(d,{direction:{xs:`column`,sm:`row`},sx:{mt:1,gap:.75},children:[(0,q.jsx)(g,{size:`small`,fullWidth:!0,label:M(a,`Mô tả tác vụ sắp chạy`,`Upcoming task`),value:F,onChange:e=>I(e.target.value),slotProps:{htmlInput:{maxLength:2048}}}),(0,q.jsx)(A,{...G,sx:{whiteSpace:`nowrap`},onClick:()=>void U(`usage.preflight`,F.trim()||null),children:`Preflight`})]})]}),(0,q.jsx)(Y,{icon:(0,q.jsx)(C,{color:`primary`}),title:M(a,`Fast mode`,`Fast mode`),detail:M(a,`Giữ nguyên model/thinking và yêu cầu OpenAI Codex dùng service tier Fast. Session trống mặc định tắt; cấu hình môi trường hoặc trạng thái đã lưu khi resume có thể ghi đè.`,`Keeps model/thinking unchanged and requests the OpenAI Codex Fast service tier. Blank sessions default to off; an environment override or restored resume state can take precedence.`),children:(0,q.jsxs)(X,{children:[(0,q.jsx)(A,{...G,onClick:()=>void U(`runtime.fast-status`),children:M(a,`Trạng thái`,`Status`)}),(0,q.jsx)(A,{...G,color:`primary`,onClick:()=>W(`runtime.fast-on`,null,M(a,`Bật Fast mode?`,`Enable Fast mode?`),M(a,`Các lượt model tiếp theo sẽ yêu cầu service tier Fast và có thể dùng quota hoặc chi phí provider khác. Model và thinking không đổi.`,`Future model turns will request the Fast service tier and may use provider quota or pricing differently. Model and thinking remain unchanged.`)),children:M(a,`Bật Fast`,`Enable Fast`)}),(0,q.jsx)(A,{...G,onClick:()=>W(`runtime.fast-off`,null,M(a,`Tắt Fast mode?`,`Disable Fast mode?`),M(a,`Piagent sẽ ngừng ép Fast từ lượt model tiếp theo; cấu hình tier của host/provider vẫn được giữ nguyên.`,`Piagent will stop forcing Fast on the next model turn; host/provider tier configuration still applies.`)),children:M(a,`Tắt Fast`,`Disable Fast`)})]})}),(0,q.jsxs)(Y,{icon:(0,q.jsx)(ce,{color:`primary`}),title:M(a,`Profile`,`Profile`),detail:M(a,`Xem và áp dụng profile dùng chung có kiểm soát. Muốn onboard project, hãy nhờ agent trong chat.`,`View and apply a controlled reusable profile. To onboard the project, ask the agent in chat.`),children:[(0,q.jsxs)(X,{children:[(0,q.jsx)(A,{...G,onClick:()=>void U(`profile.status`),children:M(a,`Profile hiện tại`,`Current profile`)}),(0,q.jsx)(A,{...G,onClick:()=>void U(`profile.options`),children:M(a,`Danh sách profile`,`Profile options`)}),(0,q.jsx)(A,{...G,onClick:()=>void U(`profile.tech-options`),children:M(a,`Tech theo vai trò`,`Tech options`)})]}),(0,q.jsxs)(d,{direction:{xs:`column`,sm:`row`},sx:{mt:1,gap:.75},children:[(0,q.jsx)(O,{size:`small`,fullWidth:!0,displayEmpty:!0,value:E,onChange:e=>D(e.target.value),disabled:R,renderValue:e=>e?z.find(t=>t.id===e)?.displayName??e:M(a,`Chọn profile…`,`Select profile…`),children:z.map(e=>(0,q.jsx)(x,{value:e.id,children:e.displayName},e.id))}),(0,q.jsx)(A,{...G,disabled:R||!E,sx:{whiteSpace:`nowrap`},onClick:()=>W(`profile.apply`,E,M(a,`Áp dụng profile?`,`Apply profile?`),M(a,`Piagent sẽ cập nhật policy profile của project. Có thể xem diff trong Source Changes sau khi chạy.`,`Piagent will update the project's profile policy. You can inspect the diff in Source Changes afterward.`)),children:M(a,`Áp dụng`,`Apply`)}),(0,q.jsx)(A,{...G,onClick:()=>W(`profile.auto`,null,M(a,`Tự nhận diện profile?`,`Auto-detect profile?`),M(a,`Piagent sẽ kiểm tra dấu hiệu công nghệ và ghi profile phù hợp vào project.`,`Piagent will inspect technology markers and write the matching project profile.`)),children:`Auto`})]})]}),(0,q.jsxs)(Y,{icon:(0,q.jsx)(se,{color:`primary`}),title:M(a,`Context engine`,`Context engine`),detail:M(a,`Tìm, đóng gói, đo tác động và rebuild context theo cùng policy Terminal.`,`Search, pack, measure impact and rebuild context under the same Terminal policy.`),children:[(0,q.jsxs)(X,{children:[(0,q.jsx)(A,{...G,onClick:()=>void U(`context.status`),children:`Index status`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`context.efficiency`),children:`Efficiency`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`context.impact`),children:`Impact`}),(0,q.jsx)(A,{...G,color:`warning`,onClick:()=>W(`context.rebuild`,null,M(a,`Rebuild context index?`,`Rebuild context index?`),M(a,`Thao tác này cập nhật index cục bộ của project và không gọi model.`,`This updates the project's local index and does not call the model.`)),children:`Rebuild`})]}),(0,q.jsxs)(d,{direction:{xs:`column`,sm:`row`},sx:{mt:1,gap:.75},children:[(0,q.jsx)(g,{size:`small`,fullWidth:!0,label:M(a,`Câu hỏi hoặc mục tiêu`,`Question or goal`),value:N,onChange:e=>P(e.target.value),slotProps:{htmlInput:{maxLength:2048}}}),(0,q.jsx)(A,{...G,disabled:R||!N.trim(),onClick:()=>void U(`context.search`,N.trim()),children:`Search`}),(0,q.jsx)(A,{...G,disabled:R||!N.trim(),onClick:()=>void U(`context.pack`,N.trim()),children:`Pack`}),(0,q.jsx)(A,{...G,color:`warning`,onClick:()=>W(`context.compact`,N.trim()||null,M(a,`Compact context bằng model?`,`Compact context with the model?`),M(a,`Đây là điều khiển duy nhất trong bảng có thể dùng model token. Piagent vẫn giữ model hiện tại.`,`This is the only control in this panel that may use model tokens. Piagent keeps the current model.`)),children:`Compact`})]})]}),(0,q.jsx)(Y,{icon:(0,q.jsx)(S,{color:`primary`}),title:M(a,`Memory`,`Memory`),detail:M(a,`Xem chế độ, phạm vi và policy ghi nhớ đang có hiệu lực.`,`Inspect the active memory mode, scope and write policy.`),children:(0,q.jsx)(X,{children:(0,q.jsx)(A,{...G,onClick:()=>void U(`memory.status`),children:M(a,`Kiểm tra memory`,`Check memory`)})})}),(0,q.jsxs)(Y,{icon:(0,q.jsx)(y,{color:`primary`}),title:M(a,`MCP governance`,`MCP governance`),detail:M(a,`Doctor, trust decision và reset dùng cùng registry với Terminal.`,`Doctor, trust decisions and reset use the same registry as Terminal.`),children:[(0,q.jsxs)(X,{children:[(0,q.jsx)(A,{...G,onClick:()=>void U(`mcp.status`),children:`MCP status`}),(0,q.jsx)(A,{...G,onClick:()=>void U(`mcp.doctor`),children:`Doctor`})]}),(0,q.jsxs)(d,{direction:{xs:`column`,sm:`row`},sx:{mt:1,gap:.75},children:[(0,q.jsx)(O,{size:`small`,fullWidth:!0,displayEmpty:!0,value:L,onChange:e=>ee(e.target.value),disabled:R,renderValue:e=>e||M(a,`Chọn MCP…`,`Select MCP…`),children:B.map(e=>(0,q.jsx)(x,{value:e.name,children:e.name},e.connectionRef))}),(0,q.jsx)(A,{...G,disabled:R||!L,onClick:()=>void U(`mcp.detail`,L),children:`Detail`}),(0,q.jsx)(A,{...G,disabled:R||!L,onClick:()=>W(`mcp.approve`,L,M(a,`Phê duyệt MCP?`,`Approve MCP?`),M(a,`Project sẽ tin cậy cấu hình MCP đã chọn.`,`The project will trust the selected MCP configuration.`)),children:`Approve`}),(0,q.jsx)(A,{...G,disabled:R||!L,color:`warning`,onClick:()=>W(`mcp.reject`,L,M(a,`Từ chối MCP?`,`Reject MCP?`),M(a,`Project sẽ ghi quyết định từ chối cho MCP đã chọn.`,`The project will record a rejection for the selected MCP.`)),children:`Reject`}),(0,q.jsx)(A,{...G,disabled:R||!L,color:`warning`,onClick:()=>W(`mcp.reset`,L,M(a,`Reset quyết định MCP?`,`Reset MCP decision?`),M(a,`Quyết định trust hiện tại của MCP sẽ được xóa để đánh giá lại.`,`The MCP's current trust decision will be cleared for reevaluation.`)),children:`Reset`})]})]})]}),(o||l||f)&&(0,q.jsx)(h,{"aria-live":`polite`,variant:`outlined`,sx:{mt:2,p:2,borderRadius:1},children:o?(0,q.jsxs)(d,{direction:`row`,spacing:1,sx:{alignItems:`center`},children:[(0,q.jsx)(p,{size:18}),(0,q.jsx)(c,{children:M(a,`Đang chạy trong Pi runtime…`,`Running in the Pi runtime…`)})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(d,{direction:`row`,sx:{alignItems:`center`,gap:1,flexWrap:`wrap`},children:[(0,q.jsx)(w,{color:l?.state===`settled`?`success`:`warning`}),(0,q.jsx)(c,{sx:{fontWeight:650},children:l?l.action:M(a,`Không hoàn tất`,`Not completed`)}),l&&(0,q.jsx)(k,{size:`small`,color:l.state===`settled`?`success`:`warning`,variant:`outlined`,label:l.resultCode}),(l?.effect===`read-only`||l?.effect===`session-setting`)&&(0,q.jsx)(k,{size:`small`,color:l.modelCallObserved?`warning`:`success`,variant:`outlined`,label:l.modelCallObserved?M(a,`Đã phát hiện model call`,`Model call detected`):`0 model token`})]}),H&&(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mt:1},children:M(a,`Fast: ${H.mode} · provider: ${H.provider??`unknown`} · ${H.reasonCode}`,`Fast: ${H.mode} · provider: ${H.provider??`unknown`} · ${H.reasonCode}`)}),f&&(0,q.jsx)(c,{color:`error`,variant:`body2`,sx:{mt:1},children:f}),l?.outputs.map((e,n)=>(0,q.jsx)(t,{component:`pre`,sx:{m:0,mt:1,p:1.25,borderRadius:1,bgcolor:`action.hover`,whiteSpace:`pre-wrap`,overflowWrap:`anywhere`,fontSize:12.5,maxHeight:260,overflow:`auto`},children:e.content},`${e.customType}-${n}`))]})}),(0,q.jsx)(V,{open:b!==null,title:b?.title??``,description:b?.description??``,cancelLabel:M(a,`Hủy`,`Cancel`),confirmLabel:M(a,`Xác nhận và chạy`,`Confirm and run`),onCancel:()=>T(null),onConfirm:()=>{let e=b;T(null),e&&U(e.action,e.argument,!0)}})]})}function Z(e,t){return e==null?`—`:new Intl.NumberFormat(t===`vi`?`vi-VN`:`en-US`).format(e)}function Q({children:e}){return(0,q.jsx)(c,{component:`h1`,variant:`h1`,sx:{mb:3},children:e})}function $({icon:e,title:n,detail:r,action:i}){return(0,q.jsxs)(d,{direction:{xs:`column`,sm:`row`},sx:{alignItems:{sm:`center`},justifyContent:`space-between`,gap:2,p:2.25},children:[(0,q.jsxs)(d,{direction:`row`,spacing:1.4,sx:{alignItems:`center`},children:[e,(0,q.jsxs)(t,{children:[(0,q.jsx)(c,{sx:{fontWeight:650},children:n}),r&&(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,children:r})]})]}),i]})}function de(){let{locale:e,colorMode:n,themeId:r,setLocale:i,setColorMode:a,setThemeId:o}=j();return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:M(e,`Giao diện`,`Appearance`)}),(0,q.jsxs)(h,{variant:`outlined`,sx:{borderRadius:1,overflow:`hidden`},children:[(0,q.jsx)($,{icon:(0,q.jsx)(u,{color:`primary`}),title:M(e,`Ngôn ngữ`,`Language`),detail:M(e,`Ngôn ngữ của giao diện. Agent trả lời theo ngôn ngữ bạn nhắn.`,`The interface language. The agent answers in the language you write.`),action:(0,q.jsxs)(D,{exclusive:!0,size:`small`,value:e,onChange:(e,t)=>t&&i(t),children:[(0,q.jsx)(v,{value:`vi`,children:`VI`}),(0,q.jsx)(v,{value:`en`,children:`EN`})]})}),(0,q.jsx)(E,{}),(0,q.jsx)($,{icon:n===`dark`?(0,q.jsx)(b,{color:`primary`}):(0,q.jsx)(_,{color:`primary`}),title:M(e,`Chủ đề`,`Theme`),detail:M(e,`Sáng hoặc tối, lưu trên trình duyệt này.`,`Light or dark, kept in this browser.`),action:(0,q.jsxs)(D,{exclusive:!0,size:`small`,value:n,onChange:(e,t)=>t&&a(t),children:[(0,q.jsx)(v,{value:`light`,children:M(e,`Sáng`,`Light`)}),(0,q.jsx)(v,{value:`dark`,children:M(e,`Tối`,`Dark`)})]})}),(0,q.jsx)(E,{}),(0,q.jsxs)(t,{sx:{p:2},children:[(0,q.jsx)(c,{sx:{fontWeight:600},children:M(e,`Chủ đề màu`,`Color theme`)}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mb:1.5},children:M(e,`Đổi màu giao diện, editor và terminal.`,`Colours for the interface, the editor and the terminal.`)}),(0,q.jsx)(t,{role:`radiogroup`,"aria-label":M(e,`Chủ đề màu`,`Color theme`),sx:{display:`grid`,gap:1,gridTemplateColumns:`repeat(auto-fill, minmax(150px, 1fr))`},children:N.map(e=>(0,q.jsxs)(t,{component:`button`,type:`button`,role:`radio`,"aria-checked":e.id===r,onClick:()=>o(e.id),sx:{textAlign:`left`,p:1,cursor:`pointer`,font:`inherit`,color:e.text,bgcolor:e.paper,borderRadius:`2px`,border:2,borderColor:e.id===r?`primary.main`:e.divider,outlineOffset:2},children:[(0,q.jsx)(t,{sx:{display:`flex`,gap:.5,mb:.75},children:[e.background,e.primary,e.secondary,e.syntax.keyword,e.syntax.string,e.warning].map((n,r)=>(0,q.jsx)(t,{"aria-hidden":!0,sx:{width:14,height:14,bgcolor:n,border:1,borderColor:e.divider}},r))}),(0,q.jsx)(t,{component:`span`,sx:{fontSize:13,fontWeight:500},children:e.label})]},e.id))})]})]})]})}function fe({options:e,snapshot:n,activeModel:r,observedProvider:a}){let{locale:o}=j(),s=e?.webSearch,l=n?.capabilities.capabilities.attachments,u=l?.status===`available`?l.kinds.some(e=>e===`image`):null,f=n?.session.model.state===`known`?n.session.model.value:null,p=f?f.inputCapabilities.some(e=>e===`image`):null,m=r?.imageInput??p??u,g=(r?.provider??a??null)===`openai-codex`,_=[{key:`search`,icon:(0,q.jsx)(i,{color:`primary`}),title:s?.route===`codex-first`?`Codex Web Search`:M(o,`Tìm kiếm web`,`Web search`),detail:s?.route===`codex-first`?M(o,`Dùng đăng nhập Codex của Pi; tự chuyển sang Exa khi Codex Search không khả dụng.`,`Uses Pi's Codex sign-in and falls back to Exa when Codex Search is unavailable.`):s?.state===`configured`?M(o,`Route tự động đang hoạt động; kết nối Codex để ưu tiên native Web Search.`,`Automatic routing is configured; connect Codex to prefer native Web Search.`):M(o,`Chưa tìm thấy tích hợp web search trong Pi runtime.`,`The Pi runtime web-search integration was not found.`),status:s?.route===`codex-first`?M(o,`Ưu tiên Codex`,`Codex first`):s?.state===`configured`?M(o,`Đã cấu hình`,`Configured`):M(o,`Chưa có`,`Unavailable`),ready:s?.state===`configured`},{key:`vision`,icon:(0,q.jsx)(ae,{color:`primary`}),title:g?`Codex Vision`:M(o,`Vision của model`,`Model vision`),detail:m===!0?M(o,`Ảnh đính kèm được gửi trực tiếp cho model của session hiện tại.`,`Image attachments are sent directly to the current session model.`):m===!1?M(o,`Model hiện tại chỉ nhận text; hãy chọn model hỗ trợ image input.`,`The current model is text-only; select a model that supports image input.`):M(o,`Runtime chưa công bố image-input capability của model hiện tại.`,`The runtime has not reported the current model's image-input capability.`),status:m===!0?M(o,`Đang dùng`,`Active`):m===!1?M(o,`Không hỗ trợ`,`Unsupported`):M(o,`Chưa rõ`,`Unknown`),ready:m===!0}];return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(c,{variant:`h2`,sx:{mt:3,mb:.5},children:M(o,`Tìm kiếm & hình ảnh`,`Search & vision`)}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mb:1.25},children:M(o,`Capability thực tế của Pi runtime và model đang chọn.`,`Capabilities reported by the Pi runtime and selected model.`)}),(0,q.jsx)(t,{sx:{display:`grid`,gridTemplateColumns:{xs:`1fr`,md:`repeat(2,minmax(0,1fr))`},gap:1},children:_.map(e=>(0,q.jsx)(h,{variant:`outlined`,sx:{p:1.75,borderRadius:1},children:(0,q.jsxs)(d,{direction:`row`,spacing:1.25,sx:{alignItems:`flex-start`},children:[(0,q.jsx)(t,{sx:{width:36,height:36,display:`grid`,placeItems:`center`,borderRadius:1,bgcolor:`action.selected`,flex:`0 0 auto`},children:e.icon}),(0,q.jsxs)(t,{sx:{flex:1,minWidth:0},children:[(0,q.jsx)(c,{sx:{fontWeight:650},children:e.title}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,children:e.detail})]}),(0,q.jsx)(k,{size:`small`,color:e.ready?`success`:`default`,variant:`outlined`,label:e.status})]})},e.key))})]})}function pe({options:e,auth:n,refreshAuth:r,session:i,snapshot:a,onSetModel:o,onSetThinking:s}){let{locale:l}=j(),[u,f]=(0,K.useState)(!1),[p,m]=(0,K.useState)(null),g=a?.session.model.state===`known`?a.session.model.value:null,_=(0,K.useMemo)(()=>{let t=new Map;for(let n of e?.models??[])t.set(n.provider,[...t.get(n.provider)??[],n]);return[...t.entries()]},[e]),v=g?.modelRef??``,y=e?.models.find(e=>e.modelRef===v),b=y?v:``,S=g?.displayName??i?.modelLabel??`—`,C=i?.managedThinkingLevels??y?.thinkingLevels??[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],w=async e=>{if(e){f(!0),m(null);try{await e()}catch{m(M(l,`Chưa thể áp dụng thay đổi`,`Could not apply this change`))}finally{f(!1)}}};return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:M(l,`Nhà cung cấp & model`,`Providers & models`)}),i&&(0,q.jsxs)(h,{variant:`outlined`,sx:{p:2.25,borderRadius:1,mb:2},children:[(0,q.jsxs)(d,{direction:`row`,spacing:1.25,sx:{alignItems:`center`,mb:2},children:[(0,q.jsx)(G,{name:g?.provider??i.modelLabel??`model`,size:38}),(0,q.jsxs)(t,{sx:{flex:1,minWidth:0},children:[(0,q.jsx)(c,{sx:{fontWeight:650},children:M(l,`Model của session hiện tại`,`Current session model`)}),(0,q.jsxs)(c,{variant:`body2`,color:`text.secondary`,noWrap:!0,children:[S,` · `,B(i.thinkingLevel,l)]})]}),(0,q.jsx)(k,{size:`small`,variant:`outlined`,label:M(l,`Đang dùng`,`In use`)})]}),(0,q.jsxs)(d,{direction:{xs:`column`,md:`row`},spacing:1.5,children:[(0,q.jsxs)(t,{sx:{flex:1},children:[(0,q.jsx)(c,{variant:`caption`,color:`text.secondary`,children:`Model`}),(0,q.jsx)(O,{fullWidth:!0,size:`small`,value:b,displayEmpty:!0,renderValue:t=>t?e?.models.find(e=>e.modelRef===t)?.displayName??S:S,disabled:u||!o||i.liveState===`running`,onChange:e=>void w(()=>o?.(e.target.value)??Promise.resolve()),sx:{mt:.5},children:(e?.models??[]).map(e=>(0,q.jsx)(x,{value:e.modelRef,children:e.displayName},e.modelRef))})]}),(0,q.jsxs)(t,{sx:{width:{md:220}},children:[(0,q.jsx)(c,{variant:`caption`,color:`text.secondary`,children:`Thinking`}),(0,q.jsx)(O,{fullWidth:!0,size:`small`,value:i.thinkingLevel===`unknown`?`off`:i.thinkingLevel,disabled:u||!s||i.liveState===`running`,onChange:e=>void w(()=>s?.(e.target.value)??Promise.resolve()),sx:{mt:.5},children:C.map(e=>(0,q.jsx)(x,{value:e,children:B(e,l)},e))})]})]}),p&&(0,q.jsx)(c,{role:`status`,color:`error`,variant:`caption`,sx:{mt:1},children:p})]}),(0,q.jsx)(fe,{options:e,snapshot:a,activeModel:y,observedProvider:g?.provider}),(0,q.jsx)(c,{variant:`h2`,sx:{mt:3,mb:.5},children:M(l,`Kết nối nhà cung cấp`,`Provider connections`)}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mb:1.25},children:M(l,`Kết nối tài khoản để mở khóa model tương ứng.`,`Connect an account to make its models available.`)}),(0,q.jsx)(oe,{catalog:n,refresh:r}),(0,q.jsx)(c,{variant:`h2`,sx:{mt:3,mb:.5},children:M(l,`Danh mục model`,`Model catalog`)}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mb:1.25},children:M(l,`Các model hiện có từ những provider đã xác thực.`,`Models currently available from authenticated providers.`)}),(0,q.jsx)(t,{sx:{display:`grid`,gridTemplateColumns:{xs:`1fr`,lg:`repeat(2,minmax(0,1fr))`},gap:1},children:_.map(([e,n])=>(0,q.jsxs)(h,{variant:`outlined`,sx:{p:1.5,borderRadius:1},children:[(0,q.jsxs)(d,{direction:`row`,sx:{alignItems:`center`,gap:1},children:[(0,q.jsx)(G,{name:e,size:32}),(0,q.jsxs)(t,{sx:{flex:1,minWidth:0},children:[(0,q.jsx)(c,{noWrap:!0,sx:{fontWeight:650,textTransform:`capitalize`},children:e}),(0,q.jsxs)(c,{variant:`body2`,color:`text.secondary`,children:[n.length,` model`]})]}),(0,q.jsx)(k,{size:`small`,color:`success`,variant:`outlined`,label:M(l,`Sẵn sàng`,`Ready`)})]}),(0,q.jsxs)(t,{sx:{display:`flex`,gap:.6,mt:1.25,flexWrap:`wrap`},children:[n.slice(0,6).map(e=>(0,q.jsx)(k,{size:`small`,variant:`outlined`,label:e.displayName},e.modelRef)),n.length>6&&(0,q.jsx)(k,{size:`small`,variant:`outlined`,label:`+${n.length-6}`})]})]},e))}),e&&_.length===0&&(0,q.jsx)(c,{color:`text.secondary`,children:M(l,`Chưa có model đã xác thực`,`No authenticated models`)})]})}function me({value:e,loading:n,sessionRef:r,onChanged:i}){let{locale:a}=j();return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:M(a,`MCP & kết nối`,`MCP & connections`)}),n?(0,q.jsx)(p,{size:22}):(0,q.jsxs)(d,{spacing:1,children:[(e?.connections??[]).map(e=>(0,q.jsx)(h,{variant:`outlined`,sx:{p:1.75,borderRadius:1},children:(0,q.jsxs)(d,{direction:`row`,sx:{alignItems:`center`,gap:1.25},children:[(0,q.jsx)(G,{name:e.name,size:38}),(0,q.jsxs)(t,{sx:{flex:1,minWidth:0},children:[(0,q.jsx)(c,{noWrap:!0,sx:{fontWeight:650},children:e.name}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,children:U(e,a)})]}),r?(0,q.jsx)(H,{sessionRef:r,connection:e,onChanged:i}):(0,q.jsx)(k,{size:`small`,variant:`outlined`,label:M(a,`Đã cấu hình`,`Configured`)})]})},e.connectionRef)),!e?.connections.length&&(0,q.jsx)(c,{color:`text.secondary`,children:M(a,`Chưa có MCP trong project này`,`No MCP configured for this project`)})]})]})}function he({snapshot:e,session:n,onSetPermission:r}){let{locale:i}=j(),a=e?.session.permissionProfile,[s,l]=(0,K.useState)(a?.state===`known`?a.value??null:null),[u,d]=(0,K.useState)(!1),[f,p]=(0,K.useState)(null),[m,g]=(0,K.useState)(null);(0,K.useEffect)(()=>{l(n?.managedPermission??(a?.state===`known`?a.value??null:null))},[n?.sessionRef,n?.managedPermission,a?.state,a?.value]);let _=async e=>{if(r){d(!0),p(null);try{await r(e),l(e)}catch{p(M(i,`Chưa thể đổi quyền lúc này`,`Could not change access right now`))}finally{d(!1)}}},v=e=>{if(e===`trusted-full-access`||e===`bypass`){g(e);return}_(e)},y=[{mode:`read-only`,detail:M(i,`Chỉ xem session, task và source; không thay đổi project.`,`Inspect the session, task, and source without changing the project.`)},{mode:`workspace-write`,detail:M(i,`Đọc, sửa file và chạy command trong project; thao tác nhạy cảm vẫn cần xác nhận.`,`Read and edit project files and run commands; sensitive actions still require confirmation.`)},{mode:`trusted-full-access`,detail:M(i,`Quyền rộng hơn trong runtime; xóa hoặc gửi dữ liệu ra ngoài vẫn cần xác nhận riêng.`,`Broader runtime access; deleting or sending data externally still requires separate confirmation.`)},...!n?.managed||n.managedBypass?[{mode:`bypass`,detail:W(i)}]:[]];return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:M(i,`Quyền truy cập`,`Access`)}),(0,q.jsx)(c,{variant:`h2`,sx:{mb:.5},children:M(i,`Hồ sơ quyền`,`Permission profile`)}),(0,q.jsx)(c,{variant:`body2`,color:`text.secondary`,sx:{mb:1.5},children:M(i,`Áp dụng cho session hiện tại.`,`Applies to the current session.`)}),(0,q.jsx)(h,{variant:`outlined`,sx:{borderRadius:1,overflow:`hidden`},children:y.map((e,a)=>(0,q.jsxs)(t,{children:[(0,q.jsx)($,{icon:(0,q.jsx)(o,{color:e.mode===`bypass`?`error`:e.mode===`trusted-full-access`?`warning`:`primary`}),title:B(e.mode,i),detail:e.detail,action:(0,q.jsx)(A,{size:`small`,variant:s===e.mode?`contained`:`outlined`,color:e.mode===`bypass`?`error`:e.mode===`trusted-full-access`?`warning`:`primary`,"aria-pressed":s===e.mode,disabled:u||!n||!r||n.liveState===`running`,onClick:()=>v(e.mode),children:B(e.mode,i)})}),a<y.length-1&&(0,q.jsx)(E,{})]},e.mode))}),f&&(0,q.jsx)(c,{role:`status`,color:`error`,variant:`caption`,sx:{mt:1},children:f}),(0,q.jsx)(V,{open:m!==null,title:m===`bypass`?M(i,`Bật Bypass?`,`Turn on Bypass?`):M(i,`Bật toàn quyền?`,`Enable full access?`),description:m===`bypass`?W(i):M(i,`Session này sẽ được phép đọc, sửa file và chạy command trong phạm vi runtime. Các thao tác xóa hoặc gửi dữ liệu ra ngoài vẫn cần xác nhận riêng.`,`This session will be allowed to read and edit files and run commands within the runtime. Destructive actions and external data transfers still require separate confirmation.`),cancelLabel:M(i,`Hủy`,`Cancel`),confirmLabel:m===`bypass`?M(i,`Bật Bypass`,`Turn on Bypass`):M(i,`Bật toàn quyền`,`Enable full access`),onCancel:()=>g(null),onConfirm:()=>{let e=m;g(null),e&&_(e)}})]})}function ge({session:e,snapshot:n}){let{locale:r}=j(),i=n?.usage.context??(e?{state:e.contextUsage.state,tokens:e.contextUsage.usedTokens,contextWindow:e.contextUsage.contextWindow,percent:e.contextUsage.ratio===null?null:e.contextUsage.ratio*100}:void 0),a=[[M(r,`Context`,`Context`),i?.percent==null?`—`:`${Math.round(i.percent)}%`],[`Tokens`,`${Z(i?.tokens,r)} / ${Z(i?.contextWindow,r)}`],[M(r,`Input`,`Input`),Z(n?.usage.sessionTotal.input,r)],[M(r,`Output`,`Output`),Z(n?.usage.sessionTotal.output,r)],[M(r,`Continuation`,`Continuation`),Z(n?.continuation.remaining,r)],[`Verifier`,n?.verification.state??`—`]];return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:M(r,`Usage & context`,`Usage & context`)}),(0,q.jsx)(t,{sx:{display:`grid`,gridTemplateColumns:{xs:`1fr`,sm:`repeat(2,minmax(0,1fr))`,lg:`repeat(3,minmax(0,1fr))`},gap:1},children:a.map(([e,t])=>(0,q.jsxs)(h,{variant:`outlined`,sx:{p:2,borderRadius:1},children:[(0,q.jsx)(c,{variant:`caption`,color:`text.secondary`,children:e}),(0,q.jsx)(c,{sx:{mt:.6,fontSize:`1.25rem`,fontWeight:650},children:t})]},e))})]})}function _e({capabilities:e,connection:n}){let{locale:r}=j(),i=[[`Gateway`,n],[`Mode`,e?.mode??`unknown`],[`Protocol`,e?.protocol.selected??`—`],[M(r,`Runtime`,`Runtime`),e?.capabilities.sessionRuntime.status??`unknown`]];return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Q,{children:`Piagent`}),(0,q.jsx)(h,{variant:`outlined`,sx:{borderRadius:1,overflow:`hidden`},children:i.map(([e,n],r)=>(0,q.jsxs)(t,{children:[(0,q.jsxs)(d,{direction:`row`,sx:{px:2.25,py:1.6,justifyContent:`space-between`,gap:2},children:[(0,q.jsx)(c,{color:`text.secondary`,children:e}),(0,q.jsx)(c,{sx:{fontWeight:650},children:String(n)})]}),r<i.length-1&&(0,q.jsx)(E,{})]},String(e)))})]})}function ve({section:e,onSection:n,onBack:r,session:i,snapshot:a,capabilities:o,connection:s,onSetModel:c,onSetThinking:l,onSetPermission:u,onRuntimeChanged:d}){let{locale:f}=j(),[p,m]=(0,K.useState)(),[h,g]=(0,K.useState)(),[_,v]=(0,K.useState)(),[y,b]=(0,K.useState)(!1);return(0,K.useEffect)(()=>{let e=new AbortController;return I(e.signal).then(m).catch(()=>void 0),()=>e.abort()},[]),(0,K.useEffect)(()=>{let e=new AbortController;return F(e.signal).then(g).catch(()=>void 0),()=>e.abort()},[]),(0,K.useEffect)(()=>{if(!i){v(void 0);return}let e=new AbortController;return b(!0),v(void 0),L(i.sessionRef,e.signal).then(v).catch(()=>void 0).finally(()=>{e.signal.aborted||b(!1)}),()=>e.abort()},[i?.sessionRef]),(0,q.jsxs)(t,{sx:{height:`100%`,minHeight:0,display:{sm:`grid`},gridTemplateColumns:{sm:`236px minmax(0,1fr)`},bgcolor:`background.default`},children:[(0,q.jsx)(re,{section:e,onSection:n,onBack:r}),(0,q.jsxs)(t,{component:`main`,sx:{width:`100%`,minHeight:0,overflowY:`auto`,px:{xs:2,sm:3,lg:5},py:{xs:3,md:4}},children:[e===`general`&&(0,q.jsx)(de,{}),e===`updates`&&(0,q.jsx)(ie,{}),e===`shortcuts`&&(0,q.jsx)(ne,{}),e===`models`&&(0,q.jsx)(pe,{options:p,auth:h,refreshAuth:async()=>{let[e,t]=await Promise.all([F(),I()]);g(e),m(t)},session:i,snapshot:a,onSetModel:c,onSetThinking:l}),e===`connections`&&(0,q.jsx)(me,{value:_,loading:y,sessionRef:i?.sessionRef,onChanged:async e=>{if(e){v(e);return}i&&v(await L(i.sessionRef).catch(()=>_))}}),e===`controls`&&(0,q.jsx)(ue,{session:i,options:p,connections:_,onCompleted:d}),e===`permissions`&&(0,q.jsx)(he,{snapshot:a,session:i,onSetPermission:u}),e===`usage`&&(0,q.jsx)(ge,{session:i,snapshot:a}),e===`about`&&(0,q.jsx)(_e,{capabilities:o,connection:s})]})]})}export{ve as SettingsPage};
@@ -1,3 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Dn as t,In as n}from"./vendor-CA5pzJiI.js";import{i as r,n as i}from"./ui-preferences-Dy4qeODT.js";import{d as a,j as o,s}from"./api-BUjrtT1B.js";import{r as c}from"./view-model-CWNiS4JN.js";function l(e){return Array.isArray(e)?`[${e.map(l).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${l(t)}`).join(`,`)}}`:JSON.stringify(e)}async function u(e){let t=new TextEncoder().encode(typeof e==`string`?e:l(e)),n=await crypto.subtle.digest(`SHA-256`,t);return`sha256:${[...new Uint8Array(n)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}async function d(e,t,n,r){let i=new Date,a=new Date(i.getTime()+3e5),o=r?.attachmentRefs??[],s={messageRequestId:r?.messageRequestId??`message-request.${crypto.randomUUID()}`,capabilityAction:n===`steer`?`interruptAndSend`:n===`hold`?`hold`:`send`,delivery:n,text:t,attachmentRefs:o,contentDigest:await u({attachmentRefs:o,text:t})},c={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},l={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:i.toISOString(),expiresAt:a.toISOString(),capabilityScope:`control.chat`,action:`chat.send`,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:c,payload:s};return l.actionDigest=await u({action:l.action,identity:l.identity,expectedRevisions:c,payload:s}),l}async function f(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5);return{schemaVersion:1,version:`piagent-webui-attachment-v1`,messageType:`stage-command`,commandId:`attachment-command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),identity:{...structuredClone(e.identity),toolCallId:null},expectedRuntimeRevision:e.revision.runtimeRevision,messageRequestId:t,file:n}}function p(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5);return{schemaVersion:1,version:`piagent-webui-attachment-v1`,messageType:`discard-command`,commandId:`attachment-command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),identity:{...structuredClone(e.identity),toolCallId:null},expectedRuntimeRevision:e.revision.runtimeRevision,messageRequestId:t,attachmentRef:n}}async function m(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},o={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.chat`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:a,payload:n};return o.actionDigest=await u({action:t,identity:o.identity,expectedRevisions:a,payload:n}),o}async function h(e,t){let n=[];return{queueItemRef:e,text:t,attachmentRefs:n,contentDigest:await u({attachmentRefs:n,text:t})}}async function g(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},o=t===`session-options.set-model`?{modelRef:n,effectScopeAcknowledged:`session-and-user-default`}:{thinkingLevel:n,effectScopeAcknowledged:`session-and-user-default`},s={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.sessionOptions`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:a,payload:o};return s.actionDigest=await u({action:t,identity:s.identity,expectedRevisions:a,payload:o}),s}async function _(e,t){let n=new Date,r=new Date(n.getTime()+3e5),i={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},a=t===`lifecycle.stop`?{requestedScope:`current-agent-operation`}:t===`lifecycle.pause`?{safePointPolicy:`after-current-atomic-unit`}:{},o={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:n.toISOString(),expiresAt:r.toISOString(),capabilityScope:`control.lifecycle`,action:t,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:i,payload:a};return o.actionDigest=await u({action:t,identity:o.identity,expectedRevisions:i,payload:a}),o}async function ee(e,t,n){let r=new Date,i=new Date(r.getTime()+3e5),a=n?.attachmentRefs??[],o={messageRequestId:n?.messageRequestId??`message-request.${crypto.randomUUID()}`,capabilityAction:`send`,delivery:`new-operation`,text:t,attachmentRefs:a,contentDigest:await u({attachmentRefs:a,text:t})},s={runtimeRevision:e.revision.runtimeRevision,taskRevision:e.revision.taskRevision,controlRevision:e.revision.controlRevision,workspaceRevision:e.revision.workspaceRevision,indexRevision:e.revision.indexRevision,approvalRevision:e.revision.approvalRevision,sessionOptionRevision:e.revision.sessionOptionRevision,queueRevision:e.revision.queueRevision,workspacePreimage:null,indexPreimage:null,patchPreimage:null},c={schemaVersion:1,version:`piagent-webui-control-v1`,messageType:`command`,commandId:`command.${crypto.randomUUID()}`,idempotencyKey:crypto.randomUUID(),requestedAt:r.toISOString(),expiresAt:i.toISOString(),capabilityScope:`control.resumeAndContinue`,action:`lifecycle.resume-and-continue`,actionDigest:``,identity:structuredClone(e.identity),expectedRevisions:s,payload:o};return c.actionDigest=await u({action:c.action,identity:c.identity,expectedRevisions:s,payload:o}),c}function v(e,t,n){return e===`vi`?t:n}var y={txt:`text/plain`,text:`text/plain`,md:`text/markdown`,markdown:`text/markdown`,csv:`text/csv`,tsv:`text/tab-separated-values`,json:`application/json`,yaml:`application/yaml`,yml:`application/yaml`,pdf:`application/pdf`,docx:`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,bmp:`image/bmp`},b={xls:`sheet`,xlsx:`sheet`,xlsm:`sheet`,numbers:`sheet`,ods:`sheet`,ppt:`slides`,pptx:`slides`,key:`slides`,odp:`slides`,doc:`word`,pages:`word`,odt:`word`,rtf:`word`,...Object.fromEntries(`zip.gz.tgz.bz2.xz.rar.7z.tar.jar.war.exe.dmg.pkg.msi.deb.rpm.apk.ipa.bin.so.dylib.dll.o.a.lib.class.pyc.wasm.node.iso.img.sqlite.sqlite3.db.mdb.mp3.mp4.m4a.m4v.mov.avi.mkv.wav.flac.ogg.webm.aac.woff.woff2.ttf.otf.eot.ico.icns.heic.heif.tif.tiff.psd.ai.sketch.fig.xd.avif.raw.cr2.nef.dng.blend.fbx.glb`.split(`.`).map(e=>[e,`binary`]))};function x(e){let t=e.lastIndexOf(`.`),n=t>0||t===0&&e.length>1?e.slice(t+1).toLowerCase():``,r=y[n];if(r)return{mime:r};let i=b[n];return i?{refused:i}:{mime:`text/plain`}}var S=new Set([`application/pdf`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`]);function C(e){return e>=1048576?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(+(e<10240))} KiB`}function te(e,t){let n=e.truncated?` · ${v(t,`đã cắt bớt`,`truncated`)}`:``;return e.kind===`image`?`${v(t,`Ảnh`,`Image`)} · ${C(e.sizeBytes)}`:e.kind===`document`?`${v(t,`Tài liệu`,`Document`)} · ${C(e.sourceBytes)} → ${C(e.sizeBytes)} ${v(t,`văn bản`,`text`)}${n}`:`File · ${C(e.sizeBytes)}${n}`}function ne(e){return e.has(`text/plain`)?``:[...e,...Object.entries(y).filter(([,t])=>e.has(t)).map(([e])=>`.${e}`)].join(`,`)}function re(e){return!!(e&&[...e.types].includes(`Files`))}function w(e,t){switch(e){case`sheet`:return v(t,`bảng tính chưa đọc trực tiếp được; hãy xuất sang .csv rồi đính kèm.`,`spreadsheets cannot be read directly; export to .csv and attach that.`);case`slides`:return v(t,`file trình chiếu chưa đọc trực tiếp được; hãy xuất sang .pdf rồi đính kèm.`,`slide decks cannot be read directly; export to .pdf and attach that.`);case`word`:return v(t,`định dạng này chưa đọc được; hãy lưu sang .docx, .pdf hoặc .txt.`,`this format cannot be read; save it as .docx, .pdf or .txt.`);default:return v(t,`file nhị phân không gửi vào chat được; hãy để file trong project để agent tự đọc bằng tool.`,`binary files cannot go into the chat; keep it in the project and the agent can use its tools on it.`)}}async function ie(e){let{snapshot:t,locale:n}=e,r=[...e.existing],i=null,a=Math.max(0,4-r.length);e.files.length>a&&(i=v(n,`Chỉ nhận tối đa 4 file mỗi tin nhắn; đã bỏ qua ${e.files.length-a} file.`,`At most 4 files per message; ${e.files.length-a} skipped.`));for(let o of[...e.files].slice(0,a)){let a=x(o.name);if(`refused`in a){i=`${o.name}: ${w(a.refused,n)}`;continue}let s=a.mime;if(!e.allowed.has(s)){i=`${o.name}: ${s===`application/pdf`?v(n,`host chưa cài pdftotext (poppler) nên chưa đọc được .pdf.`,`this host has no pdftotext (poppler), so .pdf cannot be read.`):v(n,`phiên Pi hiện tại không nhận loại file này.`,`the current Pi session does not accept this file type.`)}`;continue}let l=s.startsWith(`image/`)||S.has(s)?Math.min(t.capabilities.limits.maxAttachmentFileBytes,8388608):262144;if(o.size<1||o.size>l||r.reduce((e,t)=>e+t.sourceBytes,0)+o.size>t.capabilities.limits.maxAttachmentTotalBytes){i=`${o.name}: ${S.has(s)?v(n,`vượt giới hạn gửi trực tiếp ${C(l)}. Hãy đặt tài liệu lớn trong project rồi mở ở mục Tài liệu; Pi sẽ đọc theo phần thay vì nhét cả file vào chat.`,`exceeds the ${C(l)} direct-send limit. Put a large document in the project and open Documents; Pi can read it in parts instead of placing the whole file in chat.`):v(n,`vượt giới hạn đính kèm (tối đa ${C(l)}).`,`attachment limit exceeded (max ${C(l)}).`)}`;continue}let u=new Uint8Array(await o.arrayBuffer()),d=``;for(let e=0;e<u.length;e+=32768)d+=String.fromCharCode(...u.subarray(e,e+32768));let p=await e.stage(await f(t,e.messageRequestId,{displayName:o.name,declaredMimeType:s,dataBase64:btoa(d)}));if(p.resultCode!==`staged`||!(`attachment`in p)||!p.attachment){i=`${o.name}: ${c(p.error?.code??p.resultCode,n)}`;continue}r=[...r,p.attachment]}return{attachments:r,status:i}}async function ae(e){let t=await e.stage(p(e.snapshot,e.messageRequestId,e.attachmentRef));return t.messageType===`discard-receipt`&&t.resultCode===`discarded`?{discarded:!0,status:null}:{discarded:!1,status:`${v(e.locale,`Chưa thể bỏ file`,`Unable to remove file`)} · ${c(t.error?.code??t.resultCode,e.locale)}`}}var T=e(n(),1),E=(e,t,n)=>e===`vi`?t:n,D={"workspace-patch":[`Sửa trong project`,`Change in the project`],"external-provider-action":[`Tác động ra bên ngoài`,`Reaches outside this machine`]},O={"one-shell-command":[`Đúng một lệnh`,`This one command`],"network-command-once":[`Đúng một lệnh, có mạng`,`This one command, with network`],"docker-command-once":[`Đúng một lệnh, có mạng và Docker`,`This one command, with network and Docker`],"host-command-once":[`Đúng một lệnh, chạy trên máy bạn (ngoài sandbox)`,`This one command, on your machine (outside the sandbox)`],"start-docker-once":[`Mở Docker trên máy`,`Start Docker on this machine`],"one-external-action":[`Đúng một hành động`,`This one action`]},k={"Run this exact command once, after the guard checks the working tree again.":[`Chạy đúng lệnh này một lần, sau khi guard kiểm tra lại thư mục làm việc.`,``],"The command does not run; the agent is told you declined.":[`Lệnh không chạy; agent được báo là bạn đã từ chối.`,``],"Run this exact action once, after the guard checks its authority again.":[`Thực hiện đúng hành động này một lần, sau khi guard kiểm tra lại quyền.`,``],"The action does not run; nothing outside changes.":[`Hành động không chạy; không có gì bên ngoài bị thay đổi.`,``],"Run this exact command once, with internet access.":[`Chạy đúng lệnh này một lần, có mạng.`,``],"Run this exact command once, with internet access; a server it starts accepts connections while it runs.":[`Chạy đúng lệnh này một lần, có mạng; server mà lệnh mở nhận kết nối trong lúc chạy.`,``],"Run this exact command once, with internet access and the Docker engine; a container it starts can read folders Docker shares from this machine and may keep running.":[`Chạy đúng lệnh này một lần, có mạng và Docker; container mà lệnh tạo đọc được các thư mục Docker chia sẻ trên máy và có thể tiếp tục chạy.`,``],"Run this exact command once on this machine, outside the sandbox, as you: it can read and change your files and use your sign-ins.":[`Chạy đúng lệnh này một lần trên máy bạn, ngoài sandbox, bằng quyền của bạn: lệnh đọc/sửa được file và dùng được tài khoản đã đăng nhập trên máy.`,``],"Docker is not started; the agent is told you declined.":[`Không mở Docker; agent được báo là bạn đã từ chối.`,``]},A=(e,t,n)=>{let r=e[t];return r?E(n,r[0],r[1]||t):null};function j(e,t){return t===`vi`?e.split(`; `).map(e=>{let t=e.match(/^Confirmation required: the command runs (.+)$/);if(t)return`Lệnh có ${t[1]} nên cần bạn duyệt trước khi chạy.`;let n=e.match(/^External provider action (.+) requires confirmation$/);return n?`Hành động ra bên ngoài (${n[1]}) cần bạn duyệt.`:e}).join(` `):e}var M=(e,t)=>A(D,e.kind,t)??c(e.kind,t),N=(e,t)=>A(O,e.requestedScope,t)??c(e.requestedScope,t);function P(e,t){let n=t===`vi`?/^Start (.+) on this machine; it keeps running after the conversation\.$/.exec(e):null;return n?`Mở ${n[1]} trên máy; nó vẫn chạy sau cuộc trò chuyện.`:A(k,e,t)??e}function F(e,t){return{schemaVersion:1,version:`piagent-webui-approval-v1`,recordType:`decision`,approvalRef:e.approvalRef,decisionId:`decision.${crypto.randomUUID()}`,decisionToken:e.decisionToken,identity:structuredClone(e.identity),actionDigest:e.action.actionDigest,expectedRevisions:structuredClone(e.expectedRevisions),decision:t,reason:null,decidedAt:new Date().toISOString(),expiresAt:e.expiresAt,decisionSurface:`webui`,executor:`pi-guard`,directExecution:!1}}var I=t();function L({state:e,setState:t,refreshSnapshot:n,locale:r,asker:a}){let o=e.request;if(!o)return(0,I.jsx)(`article`,{className:`approval-card`,children:(0,I.jsx)(`p`,{children:e.error??i(r,`Đang tải yêu cầu phê duyệt…`,`Loading approval request…`)})});let l=o.action,u=Math.max(0,Math.ceil((Date.parse(o.expiresAt)-Date.now())/1e3)),d=async e=>{t({request:o,deciding:e});try{await s(F(o,e)),await n?.()}catch{t({request:o,error:i(r,`Yêu cầu đã hết hạn, thay đổi hoặc được trả lời ở terminal. Hãy tải trạng thái mới.`,`The request expired, changed, or was answered in the terminal. Refresh status.`)})}};return(0,I.jsxs)(`article`,{className:`approval-card risk-${l.riskClass}`,"aria-labelledby":`approval-${o.approvalRef}`,children:[(0,I.jsxs)(`header`,{children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`p`,{className:`section-kicker`,children:a?i(r,`${a} cần bạn duyệt`,`${a} needs your approval`):i(r,`Cần phê duyệt`,`Approval required`)}),(0,I.jsx)(`h2`,{id:`approval-${o.approvalRef}`,children:l.toolName})]}),(0,I.jsx)(`span`,{className:`approval-risk`,children:c(l.riskClass,r)})]}),(0,I.jsx)(`p`,{className:`approval-reason`,children:j(l.reason,r)}),l.commandPreview&&(0,I.jsx)(`pre`,{className:`approval-preview`,children:(0,I.jsx)(`code`,{children:l.commandPreview})}),!l.commandPreview&&l.parameterPreview&&l.parameterPreview!==`No additional parameters`&&(0,I.jsx)(`p`,{className:`approval-preview`,children:l.parameterPreview}),(0,I.jsxs)(`dl`,{className:`approval-facts`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`dt`,{children:i(r,`Hành động`,`Action`)}),(0,I.jsx)(`dd`,{children:M(l,r)})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`dt`,{children:i(r,`Phạm vi`,`Scope`)}),(0,I.jsx)(`dd`,{children:N(l,r)})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`dt`,{children:i(r,`Thư mục`,`Directory`)}),(0,I.jsx)(`dd`,{children:l.cwdDisplay??i(r,`Đã ẩn`,`Hidden`)})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`dt`,{children:i(r,`Hết hạn`,`Expires`)}),(0,I.jsxs)(`dd`,{children:[u,`s`]})]})]}),l.targetPaths.length>0&&(0,I.jsxs)(`div`,{className:`approval-targets`,children:[(0,I.jsx)(`strong`,{children:i(r,`Đích tác động`,`Targets`)}),(0,I.jsx)(`ul`,{children:l.targetPaths.map(e=>(0,I.jsx)(`li`,{children:e===`.`?i(r,`Cả thư mục project`,`The whole project folder`):e},e))})]}),(0,I.jsxs)(`div`,{className:`approval-consequences`,children:[(0,I.jsxs)(`p`,{children:[(0,I.jsx)(`strong`,{children:i(r,`Nếu cho phép:`,`If allowed:`)}),` `,P(l.consequences.allow,r)]}),(0,I.jsxs)(`p`,{children:[(0,I.jsx)(`strong`,{children:i(r,`Nếu từ chối:`,`If denied:`)}),` `,P(l.consequences.deny,r)]})]}),e.error&&(0,I.jsx)(`p`,{className:`form-error`,role:`alert`,children:e.error}),(0,I.jsxs)(`footer`,{children:[(0,I.jsx)(`button`,{type:`button`,className:`secondary-action`,disabled:!!e.deciding,onClick:()=>void d(`deny`),children:i(r,`Từ chối`,`Deny`)}),(0,I.jsx)(`button`,{type:`button`,className:`danger-action`,disabled:!!e.deciding,onClick:()=>void d(`allow`),children:e.deciding===`allow`?i(r,`Đang kiểm tra lại…`,`Rechecking…`):i(r,`Cho phép đúng 1 lần`,`Allow once`)})]})]})}function R(e,t,n){let r=(0,T.useMemo)(()=>e,[e.join(`\0`)]),[s,c]=(0,T.useState)({});return(0,T.useEffect)(()=>{let e=new AbortController;for(let s of r)(t?o(t,s,e.signal):a(s,e.signal)).then(e=>c(t=>({...t,[s]:{request:e}})),()=>c(e=>({...e,[s]:{error:i(n,`Không thể tải yêu cầu phê duyệt hiện tại.`,`Unable to load the current approval request.`)}})));return()=>e.abort()},[n,t,r]),{refs:r,states:s,set:(e,t)=>c(n=>({...n,[e]:t}))}}function z({approvalRefs:e,sessionRef:t,refreshSnapshot:n}){let{locale:a}=r(),{refs:o,states:s,set:c}=R(e,t,a);return o.length===0?null:(0,I.jsx)(`section`,{className:`approval-stack`,"aria-label":i(a,`Yêu cầu phê duyệt đang chờ`,`Pending approval requests`),"aria-live":`polite`,children:o.map(e=>(0,I.jsx)(L,{state:s[e]??{},setState:t=>c(e,t),refreshSnapshot:n,locale:a},e))})}function B({snapshot:e,refreshSnapshot:t}){let n=(0,T.useMemo)(()=>e.approvals.pending.map(e=>e.approvalRef),[e.approvals.pending]);return(0,I.jsx)(z,{approvalRefs:n,refreshSnapshot:t})}var V=16384,H=1e3;function U(e,t){let n=new Map;for(let r of[...t,...e])n.has(r.messageRef)||n.set(r.messageRef,r);return[...n.values()].slice(0,H)}function W(e){let t=new Map,n=new Map;for(let r of e.slice(-500)){let e=r.kind,i=r.payload??{},a=r.messageRef;if([`agent-operation.settled`,`session.replacement-pending`,`session.replacement-committed`,`session.shutdown`].includes(String(e))){t.clear(),n.clear();continue}if(e===`message.started`&&i.role===`assistant`&&typeof a==`string`)t.set(a,{messageRef:a,text:``,thinking:!1,truncated:!1});else if(e===`message.text-delta`&&typeof a==`string`&&typeof i.delta==`string`){let e=t.get(a);if(!e)continue;let n=`${e.text}${i.delta}`;t.set(a,{...e,text:n.slice(0,V),truncated:e.truncated||n.length>V})}else if(e===`message.thinking-state`&&typeof a==`string`){let e=t.get(a);if(!e)continue;t.set(a,{...e,thinking:i.state!==`completed`})}else[`message.completed`,`message.failed`].includes(String(e))&&typeof a==`string`&&t.delete(a);[`activity.started`,`activity.progress`,`activity.finished`,`activity.failed`,`activity.blocked`,`activity.aborted`].includes(String(e))&&typeof r.toolCallId==`string`&&typeof i.activityRef==`string`&&typeof i.toolName==`string`&&n.set(r.toolCallId,{toolCallId:r.toolCallId,activityRef:i.activityRef,toolName:i.toolName,state:String(i.state??`unknown`)})}return{assistants:[...t.values()].slice(-2),tools:[...n.values()].slice(-8)}}var G=/^(?:\p{White_Space}|\p{Cc}|\p{Default_Ignorable_Code_Point})$/u,K=/\u001b(?:\[[0-?]*[ -/]*[@-~]|[@-_])/g;function q(e){for(let t of e.replace(K,``))if(!G.test(t))return!0;return!1}function J(e,t,n){if(!n?.complete)return{key:`${e}:${t}:active`,completionKey:null,user:``,assistant:``,operationRef:null,messageRequestId:null,startedAt:null};let r=n.startedAt??null,i=n.messageRequestId??null,a=`${i??`unknown`}:${n.operationRef??`unknown`}:${r??`unknown`}:${n.user}:${n.assistant.length}`;return{key:`${e}:${t}:complete:${a}`,completionKey:a,user:n.user,assistant:n.assistant,operationRef:n.operationRef,messageRequestId:i,startedAt:r}}function oe(e){let t=/^\[Piagent completion gate: (CONTINUING|NOT APPROVED)\][\t ]*/i.exec(e);if(!t)return{text:e,completionGate:null};let n=t[1]?.toUpperCase()===`CONTINUING`?`continuing`:`not-approved`,r=e.indexOf(`
2
-
3
- `,t[0].length);return{text:r<0?``:e.slice(r+2).trimStart(),completionGate:n}}var se=new Set([`provider-auth-expired`,`provider-auth-required`,`provider-rate-limited`,`provider-unavailable`,`provider-response-failed`,`assistant-output-incomplete`]);function Y(e){let t=e.content.reasonCode;return e.role===`assistant`&&e.toolCalls.length===0&&e.content.state===`unavailable`&&t&&(se.has(t)||t.startsWith(`company-`))?t:null}function X(e){let t=oe(e);return t.completionGate===null&&q(t.text)?t.text:null}function Z(e,t){let n=e?.trim(),r=t.trim();return!!(n&&r&&(n===r||n.startsWith(`/`)&&n.endsWith(` ${r}`)))}function Q(e,t){if(e.agentOperationId&&t.operationRef&&e.agentOperationId!==t.operationRef)return!1;if(e.messageRequestId&&t.messageRequestId)return e.messageRequestId===t.messageRequestId;if(e.agentOperationId&&t.operationRef)return e.agentOperationId===t.operationRef;let n=Date.parse(e.recordedAt),r=Date.parse(t.startedAt??``);return Number.isFinite(n)&&Number.isFinite(r)&&n>=r}function $(e,t,n){let r=t.trim();if(!r)return-1;for(let t=e.length-1;t>=0;--t){let i=e[t];if(i?.role===`user`&&Z(i.content.text,r)&&Q(i,n))return t}return-1}function ce(e,t,n){return $(e,t,n)>=0}function le(e,t,n,r){let i=$(e,t,r);if(i<0)return!1;let a=X(n)?.trim()??``;if(!a)return!0;let o=e[i]?.messageRef??null;for(let t=i+1;t<e.length;t+=1){let n=e[t];if(n?.role===`user`)return!1;if(!(n?.role!==`assistant`&&n?.role!==`custom`||n.toolCalls.length>0)&&!(o&&n.parentMessageRef&&n.parentMessageRef!==o)&&X(n.content.text??``)?.trim()===a)return!0}return!1}function ue(e,t,n){let r=$(e,t,n);if(r<0)return!1;let i=e[r]?.messageRef??null;for(let t=r+1;t<e.length;t+=1){let n=e[t];if(n?.role===`user`)return!1;if(!(n?.role!==`assistant`&&n?.role!==`custom`||n.toolCalls.length>0)&&!(i&&n.parentMessageRef&&n.parentMessageRef!==i)&&(X(n.content.text??``)||Y(n)))return!0}return!1}function de(e){let t=[],n=new Map,r=new Set,i=null,a=!1,o=null;for(let s of e){if(s.role===`user`){n.clear(),r.add(s.messageRef),i=s.messageRef,t.push(s),a=!1,o=null;continue}if(s.role!==`assistant`&&s.role!==`custom`||(s.parentMessageRef?!r.has(s.parentMessageRef):i===null)||s.toolCalls.length>0)continue;if(Y(s)){if(a)continue;o?t[t.indexOf(o)]=s:t.push(s),o=s;continue}let e=X(s.content.text??``);if(!e)continue;a=!0,o&&=(t.splice(t.indexOf(o),1),null);let c=`${s.role}:${e.trim()}`,l=n.get(c);l===void 0?(n.set(c,t.length),t.push(s)):t[l]=s}return t}export{_ as C,h as D,g as E,d as S,ee as T,ae as _,le as a,w as b,X as c,L as d,B as f,x as g,te as h,ue as i,W as l,ne as m,de as n,ce as o,R as p,J as r,Z as s,Y as t,U as u,re as v,m as w,ie as x,C as y};