agim-cli 1.2.2 → 1.2.18

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 (190) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +18 -5
  3. package/README.zh-CN.md +20 -7
  4. package/dist/cli.js +42 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/commands/builtin.d.ts.map +1 -1
  7. package/dist/core/commands/builtin.js +2 -0
  8. package/dist/core/commands/builtin.js.map +1 -1
  9. package/dist/core/commands/router.js +1 -1
  10. package/dist/core/commands/router.js.map +1 -1
  11. package/dist/core/commands/web.d.ts +3 -0
  12. package/dist/core/commands/web.d.ts.map +1 -0
  13. package/dist/core/commands/web.js +28 -0
  14. package/dist/core/commands/web.js.map +1 -0
  15. package/dist/core/intent.d.ts +11 -2
  16. package/dist/core/intent.d.ts.map +1 -1
  17. package/dist/core/intent.js +26 -4
  18. package/dist/core/intent.js.map +1 -1
  19. package/dist/core/memory.js.map +1 -1
  20. package/dist/core/render-router.d.ts.map +1 -1
  21. package/dist/core/render-router.js +3 -2
  22. package/dist/core/render-router.js.map +1 -1
  23. package/dist/core/router.d.ts.map +1 -1
  24. package/dist/core/router.js +8 -1
  25. package/dist/core/router.js.map +1 -1
  26. package/dist/core/types.d.ts +3 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -1
  29. package/dist/plugins/agents/acp/acp-client.js +7 -0
  30. package/dist/plugins/agents/acp/acp-client.js.map +1 -1
  31. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -1
  32. package/dist/plugins/agents/acp/discovery.js +4 -0
  33. package/dist/plugins/agents/acp/discovery.js.map +1 -1
  34. package/dist/plugins/agents/acp/url-guard.d.ts +44 -0
  35. package/dist/plugins/agents/acp/url-guard.d.ts.map +1 -0
  36. package/dist/plugins/agents/acp/url-guard.js +109 -0
  37. package/dist/plugins/agents/acp/url-guard.js.map +1 -0
  38. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
  39. package/dist/plugins/agents/opencode/serve-manager.js +129 -4
  40. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
  41. package/dist/web/env-mask.d.ts +21 -0
  42. package/dist/web/env-mask.d.ts.map +1 -0
  43. package/dist/web/env-mask.js +44 -0
  44. package/dist/web/env-mask.js.map +1 -0
  45. package/dist/web/public/assets/a2a-Dk2fSs33.js +7 -0
  46. package/dist/web/public/assets/a2a-Dk2fSs33.js.map +1 -0
  47. package/dist/web/public/assets/activity-eiIPshcV.js +7 -0
  48. package/dist/web/public/assets/activity-eiIPshcV.js.map +1 -0
  49. package/dist/web/public/assets/admins-DlbQYdW_.js +12 -0
  50. package/dist/web/public/assets/admins-DlbQYdW_.js.map +1 -0
  51. package/dist/web/public/assets/agents-BMI1WbZj.js +12 -0
  52. package/dist/web/public/assets/agents-BMI1WbZj.js.map +1 -0
  53. package/dist/web/public/assets/approvals-DlXS_sKD.js +10 -0
  54. package/dist/web/public/assets/approvals-DlXS_sKD.js.map +1 -0
  55. package/dist/web/public/assets/audit-C8I8xC_6.js +2 -0
  56. package/dist/web/public/assets/audit-C8I8xC_6.js.map +1 -0
  57. package/dist/web/public/assets/bgjobs-PFYinH7D.js +7 -0
  58. package/dist/web/public/assets/bgjobs-PFYinH7D.js.map +1 -0
  59. package/dist/web/public/assets/brain-DEEJttEL.js +7 -0
  60. package/dist/web/public/assets/brain-DEEJttEL.js.map +1 -0
  61. package/dist/web/public/assets/briefcase-BlMy8gI6.js +7 -0
  62. package/dist/web/public/assets/briefcase-BlMy8gI6.js.map +1 -0
  63. package/dist/web/public/assets/browser-ponyfill-BOcGq8h9.js +3 -0
  64. package/dist/web/public/assets/browser-ponyfill-BOcGq8h9.js.map +1 -0
  65. package/dist/web/public/assets/chevron-right-DmABPvoA.js +7 -0
  66. package/dist/web/public/assets/chevron-right-DmABPvoA.js.map +1 -0
  67. package/dist/web/public/assets/circle-check-C0Qpg1vL.js +7 -0
  68. package/dist/web/public/assets/circle-check-C0Qpg1vL.js.map +1 -0
  69. package/dist/web/public/assets/circle-check-big-C8LG3beV.js +7 -0
  70. package/dist/web/public/assets/circle-check-big-C8LG3beV.js.map +1 -0
  71. package/dist/web/public/assets/circle-x-D_cRHcHK.js +7 -0
  72. package/dist/web/public/assets/circle-x-D_cRHcHK.js.map +1 -0
  73. package/dist/web/public/assets/confirm-dialog-Baz_xFle.js +2 -0
  74. package/dist/web/public/assets/confirm-dialog-Baz_xFle.js.map +1 -0
  75. package/dist/web/public/assets/data-table--I_ktDF4.js +17 -0
  76. package/dist/web/public/assets/data-table--I_ktDF4.js.map +1 -0
  77. package/dist/web/public/assets/dialog-DZpoEskO.js +6 -0
  78. package/dist/web/public/assets/dialog-DZpoEskO.js.map +1 -0
  79. package/dist/web/public/assets/download-DbFGHwZ5.js +7 -0
  80. package/dist/web/public/assets/download-DbFGHwZ5.js.map +1 -0
  81. package/dist/web/public/assets/email-BB1Hq8eE.js +7 -0
  82. package/dist/web/public/assets/email-BB1Hq8eE.js.map +1 -0
  83. package/dist/web/public/assets/empty-state-DXNa90pP.js +2 -0
  84. package/dist/web/public/assets/empty-state-DXNa90pP.js.map +1 -0
  85. package/dist/web/public/assets/env-Bqrb9XkC.js +2 -0
  86. package/dist/web/public/assets/env-Bqrb9XkC.js.map +1 -0
  87. package/dist/web/public/assets/external-link-nhnJN0qg.js +7 -0
  88. package/dist/web/public/assets/external-link-nhnJN0qg.js.map +1 -0
  89. package/dist/web/public/assets/eye-IKkn_oUo.js +12 -0
  90. package/dist/web/public/assets/eye-IKkn_oUo.js.map +1 -0
  91. package/dist/web/public/assets/facts-C7Qy9vTw.js +2 -0
  92. package/dist/web/public/assets/facts-C7Qy9vTw.js.map +1 -0
  93. package/dist/web/public/assets/health-CMRdeNEW.js +2 -0
  94. package/dist/web/public/assets/health-CMRdeNEW.js.map +1 -0
  95. package/dist/web/public/assets/hot-Bh5Nrc7i.js +17 -0
  96. package/dist/web/public/assets/hot-Bh5Nrc7i.js.map +1 -0
  97. package/dist/web/public/assets/index-CpGWCLE5.js +166 -0
  98. package/dist/web/public/assets/index-CpGWCLE5.js.map +1 -0
  99. package/dist/web/public/assets/index-GpceOxum.css +1 -0
  100. package/dist/web/public/assets/installed-FYLkPij2.js +7 -0
  101. package/dist/web/public/assets/installed-FYLkPij2.js.map +1 -0
  102. package/dist/web/public/assets/jobs-BmqLUzHp.js +2 -0
  103. package/dist/web/public/assets/jobs-BmqLUzHp.js.map +1 -0
  104. package/dist/web/public/assets/layout-9Gp_myEd.js +2 -0
  105. package/dist/web/public/assets/layout-9Gp_myEd.js.map +1 -0
  106. package/dist/web/public/assets/layout-BZaHqf69.js +2 -0
  107. package/dist/web/public/assets/layout-BZaHqf69.js.map +1 -0
  108. package/dist/web/public/assets/layout-CXsUyEpG.js +2 -0
  109. package/dist/web/public/assets/layout-CXsUyEpG.js.map +1 -0
  110. package/dist/web/public/assets/layout-DFxtpNut.js +2 -0
  111. package/dist/web/public/assets/layout-DFxtpNut.js.map +1 -0
  112. package/dist/web/public/assets/layout-d8qxPKQk.js +2 -0
  113. package/dist/web/public/assets/layout-d8qxPKQk.js.map +1 -0
  114. package/dist/web/public/assets/loader-circle-JaKY-xMt.js +7 -0
  115. package/dist/web/public/assets/loader-circle-JaKY-xMt.js.map +1 -0
  116. package/dist/web/public/assets/map-pin-hFFSWZ3B.js +7 -0
  117. package/dist/web/public/assets/map-pin-hFFSWZ3B.js.map +1 -0
  118. package/dist/web/public/assets/memos-EhjMUvVZ.js +12 -0
  119. package/dist/web/public/assets/memos-EhjMUvVZ.js.map +1 -0
  120. package/dist/web/public/assets/messengers-BRV1IVGX.js +7 -0
  121. package/dist/web/public/assets/messengers-BRV1IVGX.js.map +1 -0
  122. package/dist/web/public/assets/network-DtCI2ZUU.js +7 -0
  123. package/dist/web/public/assets/network-DtCI2ZUU.js.map +1 -0
  124. package/dist/web/public/assets/outbox-CxUbMp6o.js +7 -0
  125. package/dist/web/public/assets/outbox-CxUbMp6o.js.map +1 -0
  126. package/dist/web/public/assets/pagination-CkZY8YNa.js +17 -0
  127. package/dist/web/public/assets/pagination-CkZY8YNa.js.map +1 -0
  128. package/dist/web/public/assets/persona-B6TFMSnI.js +2 -0
  129. package/dist/web/public/assets/persona-B6TFMSnI.js.map +1 -0
  130. package/dist/web/public/assets/play-BxRcWaH5.js +7 -0
  131. package/dist/web/public/assets/play-BxRcWaH5.js.map +1 -0
  132. package/dist/web/public/assets/policy-ndE1Y8zD.js +2 -0
  133. package/dist/web/public/assets/policy-ndE1Y8zD.js.map +1 -0
  134. package/dist/web/public/assets/react-C9F3QeMB.js +33 -0
  135. package/dist/web/public/assets/react-C9F3QeMB.js.map +1 -0
  136. package/dist/web/public/assets/refresh-ccw-Bx817_KW.js +7 -0
  137. package/dist/web/public/assets/refresh-ccw-Bx817_KW.js.map +1 -0
  138. package/dist/web/public/assets/reminders-XynkGQc5.js +17 -0
  139. package/dist/web/public/assets/reminders-XynkGQc5.js.map +1 -0
  140. package/dist/web/public/assets/save-CqMcATrh.js +7 -0
  141. package/dist/web/public/assets/save-CqMcATrh.js.map +1 -0
  142. package/dist/web/public/assets/schedules-VM02w_Om.js +7 -0
  143. package/dist/web/public/assets/schedules-VM02w_Om.js.map +1 -0
  144. package/dist/web/public/assets/search-Ba-e1t1P.js +7 -0
  145. package/dist/web/public/assets/search-Ba-e1t1P.js.map +1 -0
  146. package/dist/web/public/assets/service-C-wnwJ-b.js +7 -0
  147. package/dist/web/public/assets/service-C-wnwJ-b.js.map +1 -0
  148. package/dist/web/public/assets/status-badge-CsdJ6k8Q.js +2 -0
  149. package/dist/web/public/assets/status-badge-CsdJ6k8Q.js.map +1 -0
  150. package/dist/web/public/assets/subtasks-mGRKpF0G.js +7 -0
  151. package/dist/web/public/assets/subtasks-mGRKpF0G.js.map +1 -0
  152. package/dist/web/public/assets/table-vmLMgj6_.js +2 -0
  153. package/dist/web/public/assets/table-vmLMgj6_.js.map +1 -0
  154. package/dist/web/public/assets/topn-nu66Fotx.js +7 -0
  155. package/dist/web/public/assets/topn-nu66Fotx.js.map +1 -0
  156. package/dist/web/public/assets/trash-2-ZIitN_U3.js +7 -0
  157. package/dist/web/public/assets/trash-2-ZIitN_U3.js.map +1 -0
  158. package/dist/web/public/assets/use-event-stream-BGeFcayX.js +2 -0
  159. package/dist/web/public/assets/use-event-stream-BGeFcayX.js.map +1 -0
  160. package/dist/web/public/assets/use-memory-DgEqHEca.js +2 -0
  161. package/dist/web/public/assets/use-memory-DgEqHEca.js.map +1 -0
  162. package/dist/web/public/assets/use-observability-CQev_A8e.js +2 -0
  163. package/dist/web/public/assets/use-observability-CQev_A8e.js.map +1 -0
  164. package/dist/web/public/assets/use-settings-CU-UcrVD.js +2 -0
  165. package/dist/web/public/assets/use-settings-CU-UcrVD.js.map +1 -0
  166. package/dist/web/public/assets/use-skills-Dr77CXLA.js +2 -0
  167. package/dist/web/public/assets/use-skills-Dr77CXLA.js.map +1 -0
  168. package/dist/web/public/assets/use-workspace-PNv9Z4de.js +2 -0
  169. package/dist/web/public/assets/use-workspace-PNv9Z4de.js.map +1 -0
  170. package/dist/web/public/assets/useQuery-BTyugXYV.js +2 -0
  171. package/dist/web/public/assets/useQuery-BTyugXYV.js.map +1 -0
  172. package/dist/web/public/assets/vector-w-Ea3pg6.js +2 -0
  173. package/dist/web/public/assets/vector-w-Ea3pg6.js.map +1 -0
  174. package/dist/web/public/assets/viewer-DKA7QP9U.js +12 -0
  175. package/dist/web/public/assets/viewer-DKA7QP9U.js.map +1 -0
  176. package/dist/web/public/assets/workspace-DVLZca7t.js +17 -0
  177. package/dist/web/public/assets/workspace-DVLZca7t.js.map +1 -0
  178. package/dist/web/public/assets/workspaces-DYZsMmY-.js +7 -0
  179. package/dist/web/public/assets/workspaces-DYZsMmY-.js.map +1 -0
  180. package/dist/web/public/assets/x-Ru3rHT82.js +7 -0
  181. package/dist/web/public/assets/x-Ru3rHT82.js.map +1 -0
  182. package/dist/web/public/favicon.svg +4 -0
  183. package/dist/web/public/index.html +37 -928
  184. package/dist/web/public/manifest.webmanifest +19 -0
  185. package/dist/web/public/tasks.html +307 -5
  186. package/dist/web/public/vendor/chart.umd.min.js +20 -0
  187. package/dist/web/server.d.ts.map +1 -1
  188. package/dist/web/server.js +640 -60
  189. package/dist/web/server.js.map +1 -1
  190. package/package.json +4 -4
@@ -0,0 +1,12 @@
1
+ import{x as G,ac as L,Q as e,c as N,L as O,S as Z,l as X,m as Y,j as J,k as I,B as U,a2 as f,z as F,r as K,I as M}from"./index-CpGWCLE5.js";import{e as u}from"./react-C9F3QeMB.js";import{E as re}from"./empty-state-DXNa90pP.js";import{u as oe}from"./use-workspace-PNv9Z4de.js";import{b as de,m as me,k as xe,c as ue}from"./use-settings-CU-UcrVD.js";import{L as B}from"./loader-circle-JaKY-xMt.js";import{R as pe}from"./refresh-ccw-Bx817_KW.js";import{X as he}from"./x-Ru3rHT82.js";import{S as ge}from"./save-CqMcATrh.js";import{N as q}from"./network-DtCI2ZUU.js";import{S as H}from"./search-Ba-e1t1P.js";import{T as fe}from"./trash-2-ZIitN_U3.js";import"./useQuery-BTyugXYV.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const je=G("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/**
7
+ * @license lucide-react v0.469.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const be=G("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),W={"claude-code":{aliases:["cc","claude"],pkg:"@anthropic-ai/claude-code"},codex:{aliases:["cx"],pkg:"@openai/codex"},copilot:{aliases:["co"],pkg:"@github/copilot"},opencode:{aliases:["oc"],pkg:"opencode-ai"}},Q=Object.keys(W);function Ue(){const{t}=L(["settings","common"]),r=de(),s=oe(),i=me(),n=r.data,o=s.data??{},[d,m]=u.useState(null),[p,g]=u.useState(null),[S,j]=u.useState(null);u.useEffect(()=>{n&&d==null&&m(n.agents??[]),n&&p==null&&g(n.defaultAgent??""),n&&S==null&&j(n.acpAgents??[])},[n,d,p,S]);const h=d??n?.agents??[],b=p??n?.defaultAgent??"",k=S??n?.acpAgents??[],$=u.useMemo(()=>{if(!n)return!1;const c=h.length===(n.agents?.length??0)&&h.every(w=>n.agents?.includes(w)),v=b===(n.defaultAgent??""),y=we(k,n.acpAgents??[]);return!c||!v||!y},[n,h,b,k]),T=u.useMemo(()=>Q.filter(c=>h.includes(c)&&o[c]),[h,o]);function _(c,v){const y=v?Array.from(new Set([...h,c])):h.filter(w=>w!==c);m(y),!v&&c===b&&g("")}async function z(){if(n)try{await i.mutateAsync({...n,agents:h,defaultAgent:b||n.defaultAgent,acpAgents:k}),f.success(t("agents.toast.saved")),m(null),g(null),j(null)}catch(c){f.error(F(c,t).message)}}function C(){m(null),g(null),j(null)}function D(c){j(c)}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("agents.title")}),e.jsxs(N,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),s.refetch()},disabled:r.isFetching||s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[r.isFetching||s.isFetching?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(pe,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("agents.subtitle")})]}),r.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-col divide-y divide-border rounded-md border border-border bg-surface",children:Q.map(c=>{const v=W[c],y=!!o[c],w=h.includes(c);return e.jsx(Ne,{name:c,aliases:v.aliases,pkg:v.pkg,installed:y,enabled:w,onToggle:P=>_(c,P)},c)})}),e.jsxs("section",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsx(O,{htmlFor:"default-agent",className:"text-sm font-medium",children:t("agents.defaultAgent")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:t("agents.defaultAgentHint")}),e.jsxs(Z,{value:b||"__none__",onValueChange:c=>g(c==="__none__"?"":c),disabled:T.length===0,children:[e.jsx(X,{id:"default-agent",className:"mt-2 w-64",children:e.jsx(Y,{placeholder:t("agents.noEligible")})}),e.jsx(J,{children:T.length===0?e.jsx(I,{value:"__none__",disabled:!0,children:t("agents.noEligible")}):T.map(c=>e.jsx(I,{value:c,children:c},c))})]})]}),e.jsx(ke,{agents:k,onChange:D}),$&&e.jsxs("div",{className:"sticky bottom-0 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 shadow-md",children:[e.jsx(U,{variant:"info",children:t("agents.dirtyHint")}),e.jsxs(N,{variant:"secondary",size:"sm",onClick:C,disabled:i.isPending,children:[e.jsx(he,{className:"h-4 w-4"}),t("agents.discard")]}),e.jsxs(N,{size:"sm",onClick:()=>void z(),disabled:i.isPending,children:[i.isPending?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(ge,{className:"h-4 w-4"}),i.isPending?t("agents.saving"):t("agents.saveBtn")]})]})]})]})}function Ne({name:t,aliases:r,pkg:s,installed:i,enabled:n,onToggle:o}){const{t:d}=L("settings");return e.jsxs("div",{className:"flex items-start gap-3 px-3 py-3",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim",children:e.jsx(je,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t}),e.jsxs(U,{variant:i?"success":"outline",className:"text-[10px]",children:[e.jsx("span",{className:K("inline-block h-1.5 w-1.5 rounded-full",i?"bg-success":"bg-text-muted")}),d(i?"agents.online":"agents.offline")]})]}),e.jsxs("p",{className:"mt-0.5 text-xs text-text-dim",children:[e.jsxs("span",{className:"text-text-muted",children:[d("agents.aliasesLabel"),": "]}),e.jsx("span",{className:"font-mono",children:r.map(m=>`/${m}`).join(", ")})]}),!i&&e.jsx("p",{className:"mt-1 text-xs text-warning",children:d("agents.installHint",{pkg:s})})]}),e.jsx("input",{type:"checkbox",checked:n,onChange:m=>o(m.target.checked),className:"h-4 w-4 mt-2 accent-accent cursor-pointer"})]})}const ve=["none","apikey","bearer"],ye=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function we(t,r){if(t.length!==r.length)return!1;for(let s=0;s<t.length;s++){const i=t[s],n=r[s];if(i.name!==n.name||i.endpoint!==n.endpoint||(i.enabled??!0)!==(n.enabled??!0))return!1;const o=(i.aliases??[]).join(","),d=(n.aliases??[]).join(",");if(o!==d)return!1;const m=i.auth?.type??"none",p=n.auth?.type??"none";if(m!==p||(i.auth?.token??"")!==(n.auth?.token??""))return!1}return!0}function ke({agents:t,onChange:r}){const{t:s}=L(["settings","common"]),i=xe(),n=ue(),[o,d]=u.useState(""),[m,p]=u.useState(""),[g,S]=u.useState(""),[j,h]=u.useState("none"),[b,k]=u.useState(""),[$,T]=u.useState(!1),[_,z]=u.useState(""),C=o.trim(),D=C.length>0&&ye.test(C),c=t.some(a=>a.name===C),y=!(j!=="none")||b.trim().length>0,w=D&&g.trim().length>0&&y&&!c,P=g.trim().length>0&&y;function ee(){d(""),p(""),S(""),h("none"),k("")}function se(a){return a.split(",").map(l=>l.trim()).filter(Boolean)}function V(a,l){if(a==="none")return{type:"none"};const x=l.trim();return x?{type:a,token:x}:{type:a}}async function te(){if(!w)return;const a={name:C,endpoint:g.trim(),aliases:se(m),auth:V(j,b),enabled:!0};r([...t,a]),ee(),f.success(s("agents.acp.toast.staged"))}async function ae(){if(P)try{const a=await i.mutateAsync({endpoint:g.trim(),auth:V(j,b)});f.success(s("agents.acp.toast.testOk",{name:a.name}))}catch(a){f.error(F(a,s).message)}}async function ne(a){const l=t[a];if(l){if(l.auth?.type!=="none"&&l.auth?.token&&Se(l.auth.token)){f.error(s("agents.acp.toast.testMasked"));return}try{const x=await i.mutateAsync({endpoint:l.endpoint,auth:l.auth});f.success(s("agents.acp.toast.testOk",{name:x.name}))}catch(x){f.error(F(x,s).message)}}}function ce(a,l){const x=t.map((E,A)=>A===a?{...E,enabled:l}:E);r(x)}function ie(a){r(t.filter((l,x)=>x!==a))}async function le(){const a=_.trim();if(a)try{const l=await n.mutateAsync({baseUrl:a,register:!1}),x=new Set(t.map(A=>A.name)),E=l.agents.filter(A=>!x.has(A.name));if(E.length===0){f.info(s("agents.acp.toast.discoverEmpty"));return}r([...t,...E.map(A=>({...A,enabled:!0}))]),f.success(s("agents.acp.toast.discoverAdded",{count:E.length})),z(""),T(!1)}catch(l){f.error(F(l,s).message)}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(q,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("agents.acp.title")}),e.jsx(U,{variant:"outline",className:"text-[10px]",children:t.length}),e.jsxs(N,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>T(a=>!a),children:[e.jsx(H,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("agents.acp.discoverBtn")})]})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("agents.acp.subtitle")}),$&&e.jsxs("div",{className:"border-t border-border bg-surface-2 px-4 py-3",children:[e.jsx(O,{htmlFor:"acp-baseurl",className:"text-xs font-medium",children:s("agents.acp.baseUrl")}),e.jsx("p",{className:"mt-1 text-[11px] text-text-dim",children:s("agents.acp.baseUrlHint")}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsx(M,{id:"acp-baseurl",value:_,onChange:a=>z(a.target.value),placeholder:"https://agents.example.com",className:"flex-1 min-w-[200px] font-mono text-xs"}),e.jsxs(N,{variant:"secondary",size:"sm",onClick:()=>void le(),disabled:!_.trim()||n.isPending,children:[n.isPending?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"}),s("agents.acp.runDiscover")]})]})]}),t.length===0?e.jsx("div",{className:"px-4 py-6",children:e.jsx(re,{icon:e.jsx(q,{}),title:s("agents.acp.empty.title"),description:s("agents.acp.empty.description")})}):e.jsx("ul",{className:"divide-y divide-border",children:t.map((a,l)=>e.jsx(Ae,{agent:a,onToggle:x=>ce(l,x),onTest:()=>void ne(l),onRemove:()=>ie(l),testing:i.isPending},`${a.name}-${l}`))}),e.jsxs("div",{className:"border-t border-border px-4 py-3",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-text-dim",children:s("agents.acp.addTitle")}),e.jsxs("div",{className:"mt-2 grid grid-cols-1 gap-2 sm:grid-cols-2",children:[e.jsx(R,{label:s("agents.acp.name"),hint:s("agents.acp.nameHint"),children:e.jsx(M,{value:o,onChange:a=>d(a.target.value),placeholder:"my-agent","aria-invalid":o.length>0&&!D})}),e.jsx(R,{label:s("agents.acp.aliases"),hint:s("agents.acp.aliasesHint"),children:e.jsx(M,{value:m,onChange:a=>p(a.target.value),placeholder:"ma, agent1"})}),e.jsx(R,{label:s("agents.acp.endpoint"),hint:s("agents.acp.endpointHint"),children:e.jsx(M,{value:g,onChange:a=>S(a.target.value),placeholder:"https://example.com/agents/weather",className:"font-mono text-xs"})}),e.jsx(R,{label:s("agents.acp.authType"),children:e.jsxs(Z,{value:j,onValueChange:a=>h(a),children:[e.jsx(X,{children:e.jsx(Y,{})}),e.jsx(J,{children:ve.map(a=>e.jsx(I,{value:a,children:s(`agents.acp.auth.${a}`)},a))})]})}),j!=="none"&&e.jsx(R,{label:s("agents.acp.token"),className:"sm:col-span-2",children:e.jsx(M,{type:"password",value:b,onChange:a=>k(a.target.value),placeholder:s("agents.acp.tokenPlaceholder"),autoComplete:"new-password"})})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsxs(N,{variant:"secondary",size:"sm",onClick:()=>void ae(),disabled:!P||i.isPending,children:[i.isPending?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"}),s("agents.acp.testBtn")]}),e.jsxs(N,{size:"sm",onClick:()=>void te(),disabled:!w,children:[e.jsx(be,{className:"h-4 w-4"}),s("agents.acp.addBtn")]}),c&&e.jsx("span",{className:"self-center text-xs text-warning",children:s("agents.acp.dupName")})]})]})]})}function Ae({agent:t,onToggle:r,onTest:s,onRemove:i,testing:n}){const{t:o}=L("settings"),d=t.enabled!==!1,m=t.auth?.type??"none";return e.jsxs("li",{className:"flex flex-wrap items-center gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t.name}),e.jsx(U,{variant:"outline",className:"text-[10px] uppercase",children:o(`agents.acp.auth.${m}`)}),t.aliases&&t.aliases.length>0&&e.jsx("span",{className:"text-xs text-text-muted font-mono",children:t.aliases.map(p=>`/${p}`).join(", ")})]}),e.jsx("p",{className:"mt-0.5 truncate font-mono text-xs text-text-dim",title:t.endpoint,children:t.endpoint})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-text-dim",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:p=>r(p.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),o(d?"agents.acp.on":"agents.acp.off")]}),e.jsx(N,{variant:"ghost",size:"sm",onClick:s,disabled:n,"aria-label":o("agents.acp.testBtn"),children:n?e.jsx(B,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"})}),e.jsx(N,{variant:"ghost",size:"sm",onClick:i,"aria-label":o("agents.acp.removeBtn"),className:"text-danger hover:text-danger",children:e.jsx(fe,{className:"h-4 w-4"})})]})}function R({label:t,hint:r,className:s,children:i}){return e.jsxs("div",{className:K("flex flex-col gap-1",s),children:[e.jsx(O,{className:"text-xs font-medium",children:t}),i,r&&e.jsx("p",{className:"text-[11px] text-text-dim",children:r})]})}function Se(t){return/\*{3,}/.test(t)}export{Ue as default};
12
+ //# sourceMappingURL=agents-BMI1WbZj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-BMI1WbZj.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bot.js","../../node_modules/lucide-react/dist/esm/icons/plus.js","../../src/routes/settings/agents.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bot = createLucideIcon(\"Bot\", [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n]);\n\nexport { Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * /settings/agents — built-in adapters + remote (ACP) agents.\n *\n * Two cards on one page:\n * 1. Built-in adapters (claude-code / codex / copilot / opencode):\n * enable/disable + default-agent picker. Mirrors v1's \"Agents\".\n * 2. Remote (ACP) agents: name/endpoint/auth-type table + manual\n * add form. Mirrors v1's \"Remote Agents (ACP)\" card. Discover\n * via `<baseUrl>/.well-known/acp` is available as a secondary\n * bulk-import form.\n *\n * Both cards share one save bar — PUT /api/config writes `agents[]`,\n * `defaultAgent`, and `acpAgents[]` atomically so the default never\n * goes out of sync with the enabled list, and partial ACP edits\n * don't ship without the user's intent.\n *\n * Masked tokens: GET returns `ab****yz` for ACP auth.token; PUT\n * detects this pattern and preserves the on-disk value so we never\n * overwrite a real token with its mask. New tokens (typed into the\n * add form or \"edit\" inline) flow through verbatim.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n Bot, Loader2, Network, Plus, RefreshCcw, Save, Search, Trash2, X,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { useAgentsStatus } from '@/hooks/use-workspace'\nimport {\n useConfig,\n useDiscoverAcp,\n useTestAcp,\n useUpdateConfig,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\nimport type { ACPAgentConfig, ACPAuthConfig, ACPAuthType } from '@/types/api'\n\n/** Mirror of v1 settings.html:BUILTIN_AGENTS. Hardcoded because\n * backend doesn't expose this metadata yet; the table changes\n * rarely enough that copying it here is fine. */\nconst BUILTIN_AGENTS: Record<string, { aliases: string[]; pkg: string }> = {\n 'claude-code': { aliases: ['cc', 'claude'], pkg: '@anthropic-ai/claude-code' },\n 'codex': { aliases: ['cx'], pkg: '@openai/codex' },\n 'copilot': { aliases: ['co'], pkg: '@github/copilot' },\n 'opencode': { aliases: ['oc'], pkg: 'opencode-ai' },\n}\n\nconst AGENT_NAMES = Object.keys(BUILTIN_AGENTS)\n\nexport default function SettingsAgentsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const statusQuery = useAgentsStatus()\n const updateCfg = useUpdateConfig()\n\n const cfg = cfgQuery.data\n const status = statusQuery.data ?? {}\n\n /** Local draft so toggles + default-picker + ACP edits can stage\n * changes before a single Save. `null` means \"sync from cfg on\n * next paint\". */\n const [draftEnabled, setDraftEnabled] = useState<string[] | null>(null)\n const [draftDefault, setDraftDefault] = useState<string | null>(null)\n const [draftAcp, setDraftAcp] = useState<ACPAgentConfig[] | null>(null)\n\n useEffect(() => {\n if (cfg && draftEnabled == null) setDraftEnabled(cfg.agents ?? [])\n if (cfg && draftDefault == null) setDraftDefault(cfg.defaultAgent ?? '')\n if (cfg && draftAcp == null) setDraftAcp(cfg.acpAgents ?? [])\n }, [cfg, draftEnabled, draftDefault, draftAcp])\n\n const enabled = draftEnabled ?? cfg?.agents ?? []\n const defaultAgent = draftDefault ?? cfg?.defaultAgent ?? ''\n const acpAgents = draftAcp ?? cfg?.acpAgents ?? []\n\n const isDirty = useMemo(() => {\n if (!cfg) return false\n const enabledSame =\n enabled.length === (cfg.agents?.length ?? 0)\n && enabled.every((a) => cfg.agents?.includes(a))\n const defaultSame = defaultAgent === (cfg.defaultAgent ?? '')\n const acpSame = acpEqual(acpAgents, cfg.acpAgents ?? [])\n return !enabledSame || !defaultSame || !acpSame\n }, [cfg, enabled, defaultAgent, acpAgents])\n\n /** Eligible defaults = installed + enabled. Picker disables when\n * empty (no agent is both). */\n const eligibleDefaults = useMemo(\n () => AGENT_NAMES.filter((a) => enabled.includes(a) && status[a]),\n [enabled, status],\n )\n\n function toggleAgent(name: string, on: boolean): void {\n const next = on\n ? Array.from(new Set([...enabled, name]))\n : enabled.filter((a) => a !== name)\n setDraftEnabled(next)\n // If the default just got disabled, clear it so save doesn't\n // ship an inconsistent pair.\n if (!on && name === defaultAgent) setDraftDefault('')\n }\n\n async function onSave(): Promise<void> {\n if (!cfg) return\n try {\n await updateCfg.mutateAsync({\n ...cfg,\n agents: enabled,\n defaultAgent: defaultAgent || cfg.defaultAgent,\n acpAgents,\n })\n toast.success(t('agents.toast.saved'))\n // Reset drafts so the next paint reads from refreshed cfg.\n setDraftEnabled(null)\n setDraftDefault(null)\n setDraftAcp(null)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onDiscard(): void {\n setDraftEnabled(null)\n setDraftDefault(null)\n setDraftAcp(null)\n }\n\n function updateAcp(next: ACPAgentConfig[]): void {\n setDraftAcp(next)\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('agents.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void cfgQuery.refetch()\n void statusQuery.refetch()\n }}\n disabled={cfgQuery.isFetching || statusQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {(cfgQuery.isFetching || statusQuery.isFetching)\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('agents.subtitle')}</p>\n </header>\n\n {cfgQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n {/* Agent rows */}\n <div className=\"flex flex-col divide-y divide-border rounded-md border border-border bg-surface\">\n {AGENT_NAMES.map((name) => {\n const info = BUILTIN_AGENTS[name]!\n const installed = !!status[name]\n const isEnabled = enabled.includes(name)\n return (\n <AgentRow\n key={name}\n name={name}\n aliases={info.aliases}\n pkg={info.pkg}\n installed={installed}\n enabled={isEnabled}\n onToggle={(on) => toggleAgent(name, on)}\n />\n )\n })}\n </div>\n\n {/* Default agent picker */}\n <section className=\"rounded-md border border-border bg-surface p-4\">\n <Label htmlFor=\"default-agent\" className=\"text-sm font-medium\">\n {t('agents.defaultAgent')}\n </Label>\n <p className=\"mt-1 text-xs text-text-dim\">{t('agents.defaultAgentHint')}</p>\n <Select\n value={defaultAgent || '__none__'}\n onValueChange={(v) => setDraftDefault(v === '__none__' ? '' : v)}\n disabled={eligibleDefaults.length === 0}\n >\n <SelectTrigger id=\"default-agent\" className=\"mt-2 w-64\">\n <SelectValue placeholder={t('agents.noEligible')} />\n </SelectTrigger>\n <SelectContent>\n {eligibleDefaults.length === 0 ? (\n <SelectItem value=\"__none__\" disabled>{t('agents.noEligible')}</SelectItem>\n ) : (\n eligibleDefaults.map((a) => (\n <SelectItem key={a} value={a}>{a}</SelectItem>\n ))\n )}\n </SelectContent>\n </Select>\n </section>\n\n {/* Remote (ACP) agents */}\n <AcpCard\n agents={acpAgents}\n onChange={updateAcp}\n />\n\n {/* Save bar */}\n {isDirty && (\n <div className=\"sticky bottom-0 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 shadow-md\">\n <Badge variant=\"info\">{t('agents.dirtyHint')}</Badge>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('agents.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending}\n >\n {updateCfg.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('agents.saving') : t('agents.saveBtn')}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Row ─────────────── */\n\ninterface AgentRowProps {\n name: string\n aliases: string[]\n pkg: string\n installed: boolean\n enabled: boolean\n onToggle: (on: boolean) => void\n}\n\nfunction AgentRow({\n name, aliases, pkg, installed, enabled, onToggle,\n}: AgentRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"flex items-start gap-3 px-3 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim\">\n <Bot className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text\">{name}</span>\n <Badge variant={installed ? 'success' : 'outline'} className=\"text-[10px]\">\n <span className={cn(\n 'inline-block h-1.5 w-1.5 rounded-full',\n installed ? 'bg-success' : 'bg-text-muted',\n )} />\n {installed ? t('agents.online') : t('agents.offline')}\n </Badge>\n </div>\n <p className=\"mt-0.5 text-xs text-text-dim\">\n <span className=\"text-text-muted\">{t('agents.aliasesLabel')}: </span>\n <span className=\"font-mono\">{aliases.map((a) => `/${a}`).join(', ')}</span>\n </p>\n {!installed && (\n <p className=\"mt-1 text-xs text-warning\">\n {t('agents.installHint', { pkg })}\n </p>\n )}\n </div>\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 mt-2 accent-accent cursor-pointer\"\n />\n </div>\n )\n}\n\n/* ─────────────── Remote (ACP) ─────────────── */\n\nconst AUTH_TYPES: ACPAuthType[] = ['none', 'apikey', 'bearer']\nconst NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/\n\n/** Compare two ACP lists by value. Order matters because the backend\n * preserves index identity (`existing.acpAgents[i]`) when merging\n * masked tokens — reordering = mask drift risk. */\nfunction acpEqual(a: ACPAgentConfig[], b: ACPAgentConfig[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!\n const y = b[i]!\n if (x.name !== y.name) return false\n if (x.endpoint !== y.endpoint) return false\n if ((x.enabled ?? true) !== (y.enabled ?? true)) return false\n const xa = (x.aliases ?? []).join(',')\n const ya = (y.aliases ?? []).join(',')\n if (xa !== ya) return false\n const xat = x.auth?.type ?? 'none'\n const yat = y.auth?.type ?? 'none'\n if (xat !== yat) return false\n if ((x.auth?.token ?? '') !== (y.auth?.token ?? '')) return false\n }\n return true\n}\n\ninterface AcpCardProps {\n agents: ACPAgentConfig[]\n onChange: (next: ACPAgentConfig[]) => void\n}\n\nfunction AcpCard({ agents, onChange }: AcpCardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const testMut = useTestAcp()\n const discoverMut = useDiscoverAcp()\n\n // Add-form state. We keep the typed token in plain state so the\n // user can paste before save; the masked round-trip from backend\n // only matters for existing rows.\n const [name, setName] = useState('')\n const [aliasesText, setAliasesText] = useState('')\n const [endpoint, setEndpoint] = useState('')\n const [authType, setAuthType] = useState<ACPAuthType>('none')\n const [token, setToken] = useState('')\n\n // Bulk-discover sub-form state. Hidden behind a toggle so the\n // primary path (manual add) stays uncluttered.\n const [showDiscover, setShowDiscover] = useState(false)\n const [baseUrl, setBaseUrl] = useState('')\n\n const trimmedName = name.trim()\n const nameValid = trimmedName.length > 0 && NAME_RE.test(trimmedName)\n const dup = agents.some((a) => a.name === trimmedName)\n const tokenRequired = authType !== 'none'\n const tokenOk = !tokenRequired || token.trim().length > 0\n const canAdd = nameValid && endpoint.trim().length > 0 && tokenOk && !dup\n const canTestNew = endpoint.trim().length > 0 && tokenOk\n\n function clearForm(): void {\n setName('')\n setAliasesText('')\n setEndpoint('')\n setAuthType('none')\n setToken('')\n }\n\n function parseAliases(text: string): string[] {\n return text.split(',').map((s) => s.trim()).filter(Boolean)\n }\n\n function buildAuth(type: ACPAuthType, tok: string): ACPAuthConfig | undefined {\n if (type === 'none') return { type: 'none' }\n const trimmed = tok.trim()\n if (!trimmed) return { type } // no token yet; save will reject\n return { type, token: trimmed }\n }\n\n async function onAdd(): Promise<void> {\n if (!canAdd) return\n const next: ACPAgentConfig = {\n name: trimmedName,\n endpoint: endpoint.trim(),\n aliases: parseAliases(aliasesText),\n auth: buildAuth(authType, token),\n enabled: true,\n }\n onChange([...agents, next])\n clearForm()\n toast.success(t('agents.acp.toast.staged'))\n }\n\n async function onTestNew(): Promise<void> {\n if (!canTestNew) return\n try {\n const res = await testMut.mutateAsync({\n endpoint: endpoint.trim(),\n auth: buildAuth(authType, token),\n })\n toast.success(t('agents.acp.toast.testOk', { name: res.name }))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onTestRow(idx: number): Promise<void> {\n const a = agents[idx]\n if (!a) return\n // Masked tokens stay masked on the wire — backend's PUT mask-detect\n // is symmetric, but the test endpoint reads what we send. We can't\n // unmask client-side; warn the operator.\n if (a.auth?.type !== 'none' && a.auth?.token && isMaskedToken(a.auth.token)) {\n toast.error(t('agents.acp.toast.testMasked'))\n return\n }\n try {\n const res = await testMut.mutateAsync({\n endpoint: a.endpoint,\n auth: a.auth,\n })\n toast.success(t('agents.acp.toast.testOk', { name: res.name }))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n function onToggleRow(idx: number, on: boolean): void {\n const next = agents.map((a, i) => (i === idx ? { ...a, enabled: on } : a))\n onChange(next)\n }\n\n function onRemoveRow(idx: number): void {\n onChange(agents.filter((_, i) => i !== idx))\n }\n\n async function onDiscoverRun(): Promise<void> {\n const url = baseUrl.trim()\n if (!url) return\n try {\n const res = await discoverMut.mutateAsync({ baseUrl: url, register: false })\n // Stage new agents that aren't already in the list (by name).\n const existing = new Set(agents.map((a) => a.name))\n const incoming = res.agents.filter((a) => !existing.has(a.name))\n if (incoming.length === 0) {\n toast.info(t('agents.acp.toast.discoverEmpty'))\n return\n }\n onChange([...agents, ...incoming.map((a) => ({ ...a, enabled: true }))])\n toast.success(t('agents.acp.toast.discoverAdded', { count: incoming.length }))\n setBaseUrl('')\n setShowDiscover(false)\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Network className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('agents.acp.title')}</h2>\n <Badge variant=\"outline\" className=\"text-[10px]\">{agents.length}</Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => setShowDiscover((v) => !v)}\n >\n <Search className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('agents.acp.discoverBtn')}</span>\n </Button>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('agents.acp.subtitle')}</p>\n\n {/* Discover form (collapsed by default) */}\n {showDiscover && (\n <div className=\"border-t border-border bg-surface-2 px-4 py-3\">\n <Label htmlFor=\"acp-baseurl\" className=\"text-xs font-medium\">\n {t('agents.acp.baseUrl')}\n </Label>\n <p className=\"mt-1 text-[11px] text-text-dim\">{t('agents.acp.baseUrlHint')}</p>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <Input\n id=\"acp-baseurl\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://agents.example.com\"\n className=\"flex-1 min-w-[200px] font-mono text-xs\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onDiscoverRun()}\n disabled={!baseUrl.trim() || discoverMut.isPending}\n >\n {discoverMut.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Search className=\"h-4 w-4\" />}\n {t('agents.acp.runDiscover')}\n </Button>\n </div>\n </div>\n )}\n\n {/* Registered ACP agents */}\n {agents.length === 0 ? (\n <div className=\"px-4 py-6\">\n <EmptyState\n icon={<Network />}\n title={t('agents.acp.empty.title')}\n description={t('agents.acp.empty.description')}\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border\">\n {agents.map((a, i) => (\n <AcpRow\n key={`${a.name}-${i}`}\n agent={a}\n onToggle={(on) => onToggleRow(i, on)}\n onTest={() => void onTestRow(i)}\n onRemove={() => onRemoveRow(i)}\n testing={testMut.isPending}\n />\n ))}\n </ul>\n )}\n\n {/* Add-agent form */}\n <div className=\"border-t border-border px-4 py-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-text-dim\">\n {t('agents.acp.addTitle')}\n </h3>\n <div className=\"mt-2 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n <Field label={t('agents.acp.name')} hint={t('agents.acp.nameHint')}>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"my-agent\"\n aria-invalid={name.length > 0 && !nameValid}\n />\n </Field>\n <Field label={t('agents.acp.aliases')} hint={t('agents.acp.aliasesHint')}>\n <Input\n value={aliasesText}\n onChange={(e) => setAliasesText(e.target.value)}\n placeholder=\"ma, agent1\"\n />\n </Field>\n <Field label={t('agents.acp.endpoint')} hint={t('agents.acp.endpointHint')}>\n <Input\n value={endpoint}\n onChange={(e) => setEndpoint(e.target.value)}\n placeholder=\"https://example.com/agents/weather\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('agents.acp.authType')}>\n <Select value={authType} onValueChange={(v) => setAuthType(v as ACPAuthType)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {AUTH_TYPES.map((a) => (\n <SelectItem key={a} value={a}>{t(`agents.acp.auth.${a}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {authType !== 'none' && (\n <Field label={t('agents.acp.token')} className=\"sm:col-span-2\">\n <Input\n type=\"password\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder={t('agents.acp.tokenPlaceholder')}\n autoComplete=\"new-password\"\n />\n </Field>\n )}\n </div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTestNew()}\n disabled={!canTestNew || testMut.isPending}\n >\n {testMut.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Search className=\"h-4 w-4\" />}\n {t('agents.acp.testBtn')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onAdd()}\n disabled={!canAdd}\n >\n <Plus className=\"h-4 w-4\" />\n {t('agents.acp.addBtn')}\n </Button>\n {dup && (\n <span className=\"self-center text-xs text-warning\">\n {t('agents.acp.dupName')}\n </span>\n )}\n </div>\n </div>\n </section>\n )\n}\n\ninterface AcpRowProps {\n agent: ACPAgentConfig\n onToggle: (on: boolean) => void\n onTest: () => void\n onRemove: () => void\n testing: boolean\n}\n\nfunction AcpRow({ agent, onToggle, onTest, onRemove, testing }: AcpRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n const isOn = agent.enabled !== false\n const authType = agent.auth?.type ?? 'none'\n return (\n <li className=\"flex flex-wrap items-center gap-3 px-4 py-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text\">{agent.name}</span>\n <Badge variant=\"outline\" className=\"text-[10px] uppercase\">\n {t(`agents.acp.auth.${authType}`)}\n </Badge>\n {agent.aliases && agent.aliases.length > 0 && (\n <span className=\"text-xs text-text-muted font-mono\">\n {agent.aliases.map((a) => `/${a}`).join(', ')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 truncate font-mono text-xs text-text-dim\" title={agent.endpoint}>\n {agent.endpoint}\n </p>\n </div>\n <label className=\"flex items-center gap-1.5 text-xs text-text-dim\">\n <input\n type=\"checkbox\"\n checked={isOn}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n {isOn ? t('agents.acp.on') : t('agents.acp.off')}\n </label>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onTest}\n disabled={testing}\n aria-label={t('agents.acp.testBtn')}\n >\n {testing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Search className=\"h-4 w-4\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n aria-label={t('agents.acp.removeBtn')}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </li>\n )\n}\n\ninterface FieldProps {\n label: string\n hint?: string\n className?: string\n children: React.ReactNode\n}\n\nfunction Field({ label, hint, className, children }: FieldProps): JSX.Element {\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n\n/** Tokens look like `ab****yz` from the masked GET response. We\n * shouldn't send them back unchanged for test (the backend would\n * fail auth), and we shouldn't include them in the test mutation\n * body either. Treat any string with 3+ consecutive `*` as masked. */\nfunction isMaskedToken(s: string): boolean {\n return /\\*{3,}/.test(s)\n}\n"],"names":["Bot","createLucideIcon","Plus","BUILTIN_AGENTS","AGENT_NAMES","SettingsAgentsRoute","useTranslation","cfgQuery","useConfig","statusQuery","useAgentsStatus","updateCfg","useUpdateConfig","cfg","status","draftEnabled","setDraftEnabled","useState","draftDefault","setDraftDefault","draftAcp","setDraftAcp","useEffect","enabled","defaultAgent","acpAgents","isDirty","useMemo","enabledSame","a","defaultSame","acpSame","acpEqual","eligibleDefaults","toggleAgent","name","on","next","onSave","toast","err","describeError","onDiscard","updateAcp","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","info","installed","isEnabled","AgentRow","Label","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","AcpCard","Badge","X","Save","aliases","pkg","onToggle","t","cn","e","AUTH_TYPES","NAME_RE","b","i","x","y","xa","ya","xat","yat","agents","onChange","testMut","useTestAcp","discoverMut","useDiscoverAcp","setName","aliasesText","setAliasesText","endpoint","setEndpoint","authType","setAuthType","token","setToken","showDiscover","setShowDiscover","baseUrl","setBaseUrl","trimmedName","nameValid","dup","tokenOk","canAdd","canTestNew","clearForm","parseAliases","text","s","buildAuth","type","tok","trimmed","onAdd","onTestNew","res","onTestRow","idx","isMaskedToken","onToggleRow","onRemoveRow","_","onDiscoverRun","url","existing","incoming","Network","Search","Input","EmptyState","AcpRow","Field","agent","onTest","onRemove","testing","isOn","Trash2","label","hint","className","children"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,10 @@
1
+ import{x as T,ac as b,Q as e,B as j,p as k,r as m,c as p,C as E,aa as N,a9 as q,q as w,T as I,a2 as v,z as M}from"./index-CpGWCLE5.js";import{e as $}from"./react-C9F3QeMB.js";import{X as L}from"./x-Ru3rHT82.js";import{E as R}from"./empty-state-DXNa90pP.js";import{u as z}from"./useQuery-BTyugXYV.js";import{u as Q}from"./use-event-stream-BGeFcayX.js";import{L as K}from"./loader-circle-JaKY-xMt.js";import{R as O}from"./refresh-ccw-Bx817_KW.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const _=T("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);function B({approval:s,onResolve:t,busy:a=!1,className:l}){const{t:n}=b("approvals"),u=F(s.ageMs),o=D(s.input,12);return e.jsxs("div",{className:m("flex flex-col gap-3","rounded-md border bg-surface p-4",s.ageMs>9e4?"border-danger/60":"border-border",l),children:[e.jsxs("header",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:s.toolName}),e.jsx(j,{variant:"secondary",children:s.platform}),s.autoAllow&&e.jsx(j,{variant:"info",title:n("autoAllowedTitle"),children:n("autoAllowedTag")}),e.jsxs("span",{className:"ml-auto inline-flex items-center gap-1 text-xs text-text-dim",children:[s.ageMs>9e4&&e.jsx(k,{className:"h-3 w-3 text-danger"}),u]})]}),e.jsxs("div",{className:"flex flex-col gap-1 text-xs",children:[e.jsx("div",{className:"text-text-muted",children:n("threadLabel")}),e.jsx("code",{className:"rounded bg-surface-2 px-1.5 py-0.5 font-mono text-xs text-text-dim line-clamp-1",title:s.threadId,children:s.threadId})]}),e.jsx("pre",{className:m("max-h-48 overflow-auto rounded-md","bg-surface-2 px-2 py-2","font-mono text-xs leading-5 text-text-dim","whitespace-pre-wrap break-words"),children:o}),e.jsxs("footer",{className:"flex justify-end gap-2",children:[e.jsxs(p,{type:"button",variant:"destructive",size:"sm",disabled:a,onClick:()=>void t("deny"),children:[e.jsx(L,{className:"h-4 w-4"}),n("deny")]}),e.jsxs(p,{type:"button",size:"sm",disabled:a,onClick:()=>void t("allow"),children:[e.jsx(E,{className:"h-4 w-4"}),n("allow")]})]})]})}function F(s){if(s<1e3)return`${s}ms`;const t=Math.floor(s/1e3);if(t<60)return`${t}s`;const a=Math.floor(t/60);return a<60?`${a}m`:`${Math.floor(a/60)}h`}function D(s,t){let a;try{a=JSON.stringify(s,null,2)}catch{a=String(s)}const l=a.split(`
7
+ `);return l.length<=t?a:`${l.slice(0,t).join(`
8
+ `)}
9
+ … +${l.length-t} more`}const f={all:["approvals"],list:["approvals","list"]};function J(){return z({queryKey:f.list,queryFn:()=>w.listApprovals()})}function V(){const s=N();return()=>s.invalidateQueries({queryKey:f.all})}function P(){const s=N();return q({mutationFn:({reqId:t,body:a})=>w.resolveApproval(t,a),onSuccess:()=>s.invalidateQueries({queryKey:f.all})})}const U={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function le(){const{t:s}=b(["approvals","common"]),t=V(),{data:a,isLoading:l,isFetching:n,refetch:u}=J(),o=a?.pending??[],i=a?.metrics,h=Q({approval:()=>t()}),y=P(),[A,g]=$.useState(null);async function S(r,c){g(r);try{await y.mutateAsync({reqId:r,body:{behavior:c}}),v.success(s(c==="allow"?"toast.allowedShort":"toast.deniedShort"))}catch(d){const{message:C}=M(d,s);v.error(C)}finally{g(d=>d===r?null:d)}}return e.jsxs("div",{className:"flex min-h-dvh flex-col bg-bg",children:[e.jsx(I,{}),e.jsxs("main",{className:"mx-auto flex w-full max-w-5xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("pageTitle")}),e.jsx("span",{className:m("text-xs font-medium tabular-nums",U[h]),children:s(`live.${h}`)}),e.jsxs(p,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>u(),disabled:n,"aria-label":s("actions.refresh",{ns:"common"}),children:[n?e.jsx(K,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("subtitle")})]}),i&&e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[e.jsx(x,{label:s("stats.pending"),value:i.pending,tone:"info"}),e.jsx(x,{label:s("stats.totalAllowed"),value:i.totalAllowed,tone:"success"}),e.jsx(x,{label:s("stats.totalDenied"),value:i.totalDenied,tone:"danger"}),e.jsx(x,{label:s("stats.totalTimedOut"),value:i.totalTimedOut,tone:"warning"})]}),l?e.jsx(Y,{}):o.length===0?e.jsx(R,{icon:e.jsx(_,{}),title:s("empty.title"),description:s("empty.description")}):e.jsx("div",{className:"flex flex-col gap-3",children:o.map(r=>e.jsx(B,{approval:r,busy:A===r.reqId,onResolve:c=>S(r.reqId,c)},r.reqId))})]})]})}const X={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function x({label:s,value:t,tone:a}){return e.jsxs("div",{className:m("rounded-md border bg-surface px-3 py-2",X[a]),children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:s}),e.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:t})]})}function Y(){return e.jsx("div",{className:"flex flex-col gap-3",children:Array.from({length:2}).map((s,t)=>e.jsxs("div",{className:"flex flex-col gap-3 rounded-md border border-border bg-surface p-4",children:[e.jsx("div",{className:"h-4 w-1/3 rounded bg-surface-2 animate-pulse"}),e.jsx("div",{className:"h-3 w-1/2 rounded bg-surface-2 animate-pulse"}),e.jsx("div",{className:"h-24 w-full rounded bg-surface-2 animate-pulse"}),e.jsxs("div",{className:"ml-auto flex gap-2",children:[e.jsx("div",{className:"h-8 w-16 rounded bg-surface-2 animate-pulse"}),e.jsx("div",{className:"h-8 w-16 rounded bg-surface-2 animate-pulse"})]})]},`skel-${t}`))})}export{le as default};
10
+ //# sourceMappingURL=approvals-DlXS_sKD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-DlXS_sKD.js","sources":["../../node_modules/lucide-react/dist/esm/icons/shield-check.js","../../src/components/approvals/approval-card.tsx","../../src/hooks/use-approvals.ts","../../src/routes/approvals.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ShieldCheck = createLucideIcon(\"ShieldCheck\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/**\n * ApprovalCard — one HITL approval, rendered as a card.\n *\n * The /approvals route uses cards (not table rows) on purpose:\n * * approvals are time-sensitive and few — visual urgency matters\n * * each row's `input` is a free-form record that's hard to squeeze\n * into a single cell. The card body has room for a JSON preview.\n * * Allow / Deny are 1-click decisions; we want big tap targets\n * even on desktop, which doesn't fit cleanly into a TableCell.\n *\n * Layout:\n * ┌─ tool name · platform · age ─────────────────┐\n * │ thread id (monospaced) │\n * │ │\n * │ <pre>input json (truncated to ~12 lines)</pre>│\n * │ │\n * │ [ Deny ] [ Allow ] │\n * └──────────────────────────────────────────────┘\n *\n * The buttons are disabled while a resolution is in flight (so a\n * second click can't double-fire). Async failure surfaces via the\n * parent's toast; the card stays put.\n */\n\nimport { useTranslation } from 'react-i18next'\nimport { Check, X, AlertTriangle } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/utils'\nimport type { Approval, ApprovalBehavior } from '@/types/api'\n\nexport interface ApprovalCardProps {\n approval: Approval\n /** Async resolve callback. The card calls this with the behavior\n * + the current reqId; parent handles toast + mutation state.\n * The card disables its buttons while the promise is in flight. */\n onResolve: (behavior: ApprovalBehavior) => Promise<void> | void\n /** When true, both action buttons are disabled. Parent flips this\n * on while its mutation is in flight. */\n busy?: boolean\n /** Optional className for the outer card. */\n className?: string\n}\n\nexport function ApprovalCard({\n approval,\n onResolve,\n busy = false,\n className,\n}: ApprovalCardProps): JSX.Element {\n const { t } = useTranslation('approvals')\n\n const aged = formatAge(approval.ageMs)\n const inputPreview = previewJson(approval.input, 12)\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-3',\n 'rounded-md border bg-surface p-4',\n // Cards older than 90s carry a soft danger border to draw\n // the operator's eye to stale requests.\n approval.ageMs > 90_000 ? 'border-danger/60' : 'border-border',\n className,\n )}\n >\n <header className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text\">{approval.toolName}</span>\n <Badge variant=\"secondary\">{approval.platform}</Badge>\n {approval.autoAllow && (\n <Badge variant=\"info\" title={t('autoAllowedTitle')}>\n {t('autoAllowedTag')}\n </Badge>\n )}\n <span className=\"ml-auto inline-flex items-center gap-1 text-xs text-text-dim\">\n {approval.ageMs > 90_000 && <AlertTriangle className=\"h-3 w-3 text-danger\" />}\n {aged}\n </span>\n </header>\n\n <div className=\"flex flex-col gap-1 text-xs\">\n <div className=\"text-text-muted\">{t('threadLabel')}</div>\n <code\n className=\"rounded bg-surface-2 px-1.5 py-0.5 font-mono text-xs text-text-dim line-clamp-1\"\n title={approval.threadId}\n >\n {approval.threadId}\n </code>\n </div>\n\n <pre\n className={cn(\n 'max-h-48 overflow-auto rounded-md',\n 'bg-surface-2 px-2 py-2',\n 'font-mono text-xs leading-5 text-text-dim',\n 'whitespace-pre-wrap break-words',\n )}\n >\n {inputPreview}\n </pre>\n\n <footer className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n disabled={busy}\n onClick={() => void onResolve('deny')}\n >\n <X className=\"h-4 w-4\" />\n {t('deny')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={busy}\n onClick={() => void onResolve('allow')}\n >\n <Check className=\"h-4 w-4\" />\n {t('allow')}\n </Button>\n </footer>\n </div>\n )\n}\n\n/** Human-readable age string (\"12s\", \"4m\", \"2h\"). Tracks the\n * bus's ageMs at render time; SSE invalidation keeps it fresh. */\nfunction formatAge(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n const s = Math.floor(ms / 1000)\n if (s < 60) return `${s}s`\n const m = Math.floor(s / 60)\n if (m < 60) return `${m}m`\n const h = Math.floor(m / 60)\n return `${h}h`\n}\n\n/** Pretty-print the tool input JSON with a line cap. Falls back to\n * `String(value)` if JSON.stringify throws (e.g. circular). */\nfunction previewJson(value: unknown, maxLines: number): string {\n let text: string\n try {\n text = JSON.stringify(value, null, 2)\n } catch {\n text = String(value)\n }\n const lines = text.split('\\n')\n if (lines.length <= maxLines) return text\n return `${lines.slice(0, maxLines).join('\\n')}\\n… +${lines.length - maxLines} more`\n}\n","/**\n * useApprovals — react-query wrappers for the HITL approval queue.\n *\n * useApprovals() — list pending + bus metrics\n * useResolveApproval() — allow / deny a specific reqId\n *\n * SSE: the route subscribes to the `approval` SSE event and\n * invalidates this query on any phase change, so a `requested` from\n * another tab (or `resolved` we don't initiate) shows up live\n * without a poll.\n *\n * No background poll — approvals are short-lived, the SSE channel\n * is the live source, and the v1 admin's 3 s poll caused enough\n * jitter that we'd rather rely on SSE plus an explicit refresh\n * button.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListApprovalsResponse, ResolveApprovalBody, ResolveApprovalResponse } from '@/types/api'\n\nexport const approvalsKeys = {\n all: ['approvals'] as const,\n list: ['approvals', 'list'] as const,\n}\n\nexport function useApprovals() {\n return useQuery<ListApprovalsResponse>({\n queryKey: approvalsKeys.list,\n queryFn: () => api.listApprovals(),\n })\n}\n\nexport function useInvalidateApprovals() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: approvalsKeys.all })\n}\n\nexport function useResolveApproval() {\n const qc = useQueryClient()\n return useMutation<\n ResolveApprovalResponse,\n Error,\n { reqId: string; body: ResolveApprovalBody }\n >({\n mutationFn: ({ reqId, body }) => api.resolveApproval(reqId, body),\n onSuccess: () => qc.invalidateQueries({ queryKey: approvalsKeys.all }),\n })\n}\n","/**\n * /approvals — Human-in-the-loop tool approval queue.\n *\n * Cards (one per pending request) instead of a DataTable: approvals\n * are short-lived, time-sensitive, and each one wants a JSON-preview\n * block that doesn't fit cleanly in a row. Allow / Deny are 1-click\n * decisions — no ConfirmDialog (the user already weighed the call\n * when they clicked).\n *\n * SSE: the `approval` event invalidates the list on every requested /\n * resolved transition, so a request from another tab (or a backend\n * resolve we didn't initiate) flips off the screen instantly.\n *\n * KPI strip:\n * pending | totalAllowed | totalDenied | totalTimedOut\n *\n * Empty state is the desired steady-state — the friendly empty card\n * matches \"all caught up\", not \"broken\".\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, RefreshCcw, ShieldCheck } from 'lucide-react'\n\nimport { Topbar } from '@/components/shell/topbar'\nimport { Button } from '@/components/ui/button'\nimport { ApprovalCard } from '@/components/approvals/approval-card'\nimport { EmptyState } from '@/components/common/empty-state'\nimport {\n useApprovals,\n useInvalidateApprovals,\n useResolveApproval,\n} from '@/hooks/use-approvals'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport { describeError } from '@/lib/api/errors'\nimport type { ApprovalBehavior } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst LIVE_STATUS_CLASS: Record<SseStatus, string> = {\n connected: 'text-success',\n connecting: 'text-text-dim',\n reconnecting: 'text-warning',\n closed: 'text-text-muted',\n}\n\nexport default function ApprovalsRoute(): JSX.Element {\n const { t } = useTranslation(['approvals', 'common'])\n const invalidate = useInvalidateApprovals()\n\n const { data, isLoading, isFetching, refetch } = useApprovals()\n const pending = data?.pending ?? []\n const metrics = data?.metrics\n\n const live = useEventStream({\n approval: () => invalidate(),\n })\n\n const resolve = useResolveApproval()\n /** Tracks the reqId currently being resolved so the card can\n * disable its buttons. Multiple cards in flight is fine (we\n * bake one key per card), but each card stays inert until its\n * own promise lands. */\n const [resolvingId, setResolvingId] = useState<string | null>(null)\n\n async function onResolve(reqId: string, behavior: ApprovalBehavior): Promise<void> {\n setResolvingId(reqId)\n try {\n await resolve.mutateAsync({ reqId, body: { behavior } })\n toast.success(\n behavior === 'allow' ? t('toast.allowedShort') : t('toast.deniedShort'),\n )\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n } finally {\n setResolvingId((id) => (id === reqId ? null : id))\n }\n }\n\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n <main className=\"mx-auto flex w-full max-w-5xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('pageTitle')}</h1>\n <span className={cn('text-xs font-medium tabular-nums', LIVE_STATUS_CLASS[live])}>\n {t(`live.${live}`)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('subtitle')}</p>\n </header>\n\n {/* Metrics strip */}\n {metrics && (\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <StatCard label={t('stats.pending')} value={metrics.pending} tone=\"info\" />\n <StatCard label={t('stats.totalAllowed')} value={metrics.totalAllowed} tone=\"success\" />\n <StatCard label={t('stats.totalDenied')} value={metrics.totalDenied} tone=\"danger\" />\n <StatCard label={t('stats.totalTimedOut')} value={metrics.totalTimedOut} tone=\"warning\" />\n </div>\n )}\n\n {/* List */}\n {isLoading ? (\n <SkeletonList />\n ) : pending.length === 0 ? (\n <EmptyState\n icon={<ShieldCheck />}\n title={t('empty.title')}\n description={t('empty.description')}\n />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {pending.map((p) => (\n <ApprovalCard\n key={p.reqId}\n approval={p}\n busy={resolvingId === p.reqId}\n onResolve={(behavior) => onResolve(p.reqId, behavior)}\n />\n ))}\n </div>\n )}\n </main>\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction SkeletonList(): JSX.Element {\n return (\n <div className=\"flex flex-col gap-3\">\n {Array.from({ length: 2 }).map((_, i) => (\n <div\n key={`skel-${i}`}\n className=\"flex flex-col gap-3 rounded-md border border-border bg-surface p-4\"\n >\n <div className=\"h-4 w-1/3 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-3 w-1/2 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-24 w-full rounded bg-surface-2 animate-pulse\" />\n <div className=\"ml-auto flex gap-2\">\n <div className=\"h-8 w-16 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-8 w-16 rounded bg-surface-2 animate-pulse\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n"],"names":["ShieldCheck","createLucideIcon","ApprovalCard","approval","onResolve","busy","className","t","useTranslation","aged","formatAge","inputPreview","previewJson","jsxs","cn","jsx","Badge","AlertTriangle","Button","X","Check","ms","s","m","value","maxLines","text","lines","approvalsKeys","useApprovals","useQuery","api","useInvalidateApprovals","qc","useQueryClient","useResolveApproval","useMutation","reqId","body","LIVE_STATUS_CLASS","ApprovalsRoute","invalidate","data","isLoading","isFetching","refetch","pending","metrics","live","useEventStream","resolve","resolvingId","setResolvingId","useState","behavior","toast","err","message","describeError","id","Topbar","Loader2","RefreshCcw","StatCard","SkeletonList","EmptyState","p","TONE_STYLES","label","tone","_","i"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ import{ac as A,ab as O,Q as t,B as F,c as I,L as P,I as B,r as _}from"./index-CpGWCLE5.js";import{e as i}from"./react-C9F3QeMB.js";import{D as k}from"./data-table--I_ktDF4.js";import{E as U}from"./empty-state-DXNa90pP.js";import{u as $}from"./use-observability-CQev_A8e.js";import{L as q}from"./loader-circle-JaKY-xMt.js";import{R as z}from"./refresh-ccw-Bx817_KW.js";import{A as H}from"./activity-eiIPshcV.js";import"./table-vmLMgj6_.js";import"./useQuery-BTyugXYV.js";const Q=300;function st(){const{t:e}=A(["observability","common"]),[s,d]=O(),c=Math.max(1,Number(s.get("days"))||7),n=s.get("agent")??"",l=s.get("platform")??"",r=s.get("user")??"",o=s.get("intent")??"",[u,j]=i.useState(n),[x,b]=i.useState(l),[f,w]=i.useState(r),[h,C]=i.useState(o);i.useEffect(()=>{j(n)},[n]),i.useEffect(()=>{b(l)},[l]),i.useEffect(()=>{w(r)},[r]),i.useEffect(()=>{C(o)},[o]),i.useEffect(()=>{const a=window.setTimeout(()=>{R({agent:u||null,platform:x||null,user:f||null,intent:h||null})},Q);return()=>window.clearTimeout(a)},[u,x,f,h]);const E=i.useMemo(()=>({days:c,limit:200,...n?{agent:n}:{},...l?{platform:l}:{},...r?{user:r}:{},...o?{intent:o}:{}}),[c,n,l,r,o]),{data:v,isLoading:S,isFetching:y,refetch:M}=$(E),L=v?.invocations??[],p=v?.stats;function R(a){const g=new URLSearchParams(s);for(const[D,N]of Object.entries(a))N==null||N===""?g.delete(D):g.set(D,N);d(g,{replace:!0})}const T=i.useMemo(()=>[{id:"ts",header:e("audit.col.ts"),cell:a=>t.jsx("span",{className:"text-text-dim text-xs tabular-nums",children:G(a.ts)}),headClassName:"w-32"},{id:"agent",header:e("audit.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"platform",header:e("audit.col.platform"),cell:a=>t.jsx("span",{className:"text-text-dim",children:a.platform}),headClassName:"w-24",hideOnMobile:!0},{id:"user",header:e("audit.col.user"),cell:a=>t.jsx("span",{className:"font-mono text-xs text-text-dim line-clamp-1",children:a.user_id}),headClassName:"w-32",hideOnMobile:!0},{id:"intent",header:e("audit.col.intent"),cell:a=>t.jsx("span",{className:"text-text-dim line-clamp-1",children:a.intent||"—"}),asCardTitle:!0},{id:"duration",header:e("audit.col.duration"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:[Math.round(a.duration_ms),"ms"]}),headClassName:"w-20"},{id:"cost",header:e("audit.col.cost"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["$",a.cost.toFixed(4)]}),headClassName:"w-24",hideOnMobile:!0},{id:"outcome",header:e("audit.col.outcome"),cell:a=>t.jsx(F,{variant:a.success?"success":"danger",title:a.error??"",children:a.success?e("audit.outcome.ok"):e("audit.outcome.fail")}),headClassName:"w-20"}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsx("header",{className:"flex flex-col gap-1",children:t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("audit.title")}),t.jsxs(I,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>M(),disabled:y,"aria-label":e("actions.refresh",{ns:"common"}),children:[y?t.jsx(q,{className:"h-4 w-4 animate-spin"}):t.jsx(z,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]})}),p&&t.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-sm",children:[t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.total"),": ",t.jsx("span",{className:"tabular-nums font-medium text-text",children:p.total})]}),t.jsxs("span",{className:"text-text-dim",children:[e("audit.stats.totalCost"),": ",t.jsxs("span",{className:"tabular-nums font-medium text-text",children:["$",p.totalCost.toFixed(4)]})]})]}),t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(m,{id:"agent",label:e("audit.filter.agent"),value:u,onChange:j}),t.jsx(m,{id:"platform",label:e("audit.filter.platform"),value:x,onChange:b}),t.jsx(m,{id:"user",label:e("audit.filter.user"),value:f,onChange:w}),t.jsx(m,{id:"intent",label:e("audit.filter.intent"),value:h,onChange:C})]}),t.jsx(k,{columns:T,rows:L,getRowId:a=>String(a.id),loading:S,emptyState:t.jsx(U,{icon:t.jsx(H,{}),title:e("audit.empty.title"),description:e("audit.empty.description")})})]})}function m({id:e,label:s,value:d,onChange:c}){return t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx(P,{htmlFor:e,className:"text-xs text-text-dim",children:s}),t.jsx(B,{id:e,value:d,onChange:n=>c(n.target.value),className:_("h-9")})]})}function G(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return e}}export{st as default};
2
+ //# sourceMappingURL=audit-C8I8xC_6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-C8I8xC_6.js","sources":["../../src/routes/observability/audit.tsx"],"sourcesContent":["/**\n * /observability/audit — recent invocations timeline. URL state for\n * the four filter slots (agent / platform / user / intent) so deep-\n * linking works; layout's ?days= window applies too.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Activity, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useAudit } from '@/hooks/use-observability'\nimport type { InvocationRow, ListAuditQuery } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst SEARCH_DEBOUNCE_MS = 300\n\nexport default function ObservabilityAuditRoute(): JSX.Element {\n const { t } = useTranslation(['observability', 'common'])\n const [params, setParams] = useSearchParams()\n const days = Math.max(1, Number(params.get('days')) || 7)\n\n const agent = params.get('agent') ?? ''\n const platform = params.get('platform') ?? ''\n const user = params.get('user') ?? ''\n const intent = params.get('intent') ?? ''\n\n // Local drafts for the four free-text filter inputs — debounce so\n // typing doesn't fire one /api/audit per keystroke.\n const [agentDraft, setAgentDraft] = useState(agent)\n const [platformDraft, setPlatformDraft] = useState(platform)\n const [userDraft, setUserDraft] = useState(user)\n const [intentDraft, setIntentDraft] = useState(intent)\n\n useEffect(() => { setAgentDraft(agent) }, [agent])\n useEffect(() => { setPlatformDraft(platform) }, [platform])\n useEffect(() => { setUserDraft(user) }, [user])\n useEffect(() => { setIntentDraft(intent) }, [intent])\n\n useEffect(() => {\n const timer = window.setTimeout(() => {\n patchParams({\n agent: agentDraft || null,\n platform: platformDraft || null,\n user: userDraft || null,\n intent: intentDraft || null,\n })\n }, SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentDraft, platformDraft, userDraft, intentDraft])\n\n const query: ListAuditQuery = useMemo(\n () => ({\n days,\n limit: 200,\n ...(agent ? { agent } : {}),\n ...(platform ? { platform } : {}),\n ...(user ? { user } : {}),\n ...(intent ? { intent } : {}),\n }),\n [days, agent, platform, user, intent],\n )\n\n const { data, isLoading, isFetching, refetch } = useAudit(query)\n const rows = data?.invocations ?? []\n const stats = data?.stats\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: true })\n }\n\n const columns: DataTableColumn<InvocationRow>[] = useMemo(\n () => [\n {\n id: 'ts',\n header: t('audit.col.ts'),\n cell: (r) => <span className=\"text-text-dim text-xs tabular-nums\">{formatTime(r.ts)}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'agent',\n header: t('audit.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'platform',\n header: t('audit.col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'user',\n header: t('audit.col.user'),\n cell: (r) => <span className=\"font-mono text-xs text-text-dim line-clamp-1\">{r.user_id}</span>,\n headClassName: 'w-32',\n hideOnMobile: true,\n },\n {\n id: 'intent',\n header: t('audit.col.intent'),\n cell: (r) => <span className=\"text-text-dim line-clamp-1\">{r.intent || '—'}</span>,\n asCardTitle: true,\n },\n {\n id: 'duration',\n header: t('audit.col.duration'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{Math.round(r.duration_ms)}ms</span>,\n headClassName: 'w-20',\n },\n {\n id: 'cost',\n header: t('audit.col.cost'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">${r.cost.toFixed(4)}</span>,\n headClassName: 'w-24',\n hideOnMobile: true,\n },\n {\n id: 'outcome',\n header: t('audit.col.outcome'),\n cell: (r) => (\n <Badge variant={r.success ? 'success' : 'danger'} title={r.error ?? ''}>\n {r.success ? t('audit.outcome.ok') : t('audit.outcome.fail')}\n </Badge>\n ),\n headClassName: 'w-20',\n },\n ],\n [t],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('audit.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n </header>\n\n {stats && (\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span className=\"text-text-dim\">{t('audit.stats.total')}: <span className=\"tabular-nums font-medium text-text\">{stats.total}</span></span>\n <span className=\"text-text-dim\">{t('audit.stats.totalCost')}: <span className=\"tabular-nums font-medium text-text\">${stats.totalCost.toFixed(4)}</span></span>\n </div>\n )}\n\n {/* Filter row */}\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <FilterInput id=\"agent\" label={t('audit.filter.agent')} value={agentDraft} onChange={setAgentDraft} />\n <FilterInput id=\"platform\" label={t('audit.filter.platform')} value={platformDraft} onChange={setPlatformDraft} />\n <FilterInput id=\"user\" label={t('audit.filter.user')} value={userDraft} onChange={setUserDraft} />\n <FilterInput id=\"intent\" label={t('audit.filter.intent')} value={intentDraft} onChange={setIntentDraft} />\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Activity />}\n title={t('audit.empty.title')}\n description={t('audit.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface FilterInputProps {\n id: string\n label: string\n value: string\n onChange: (v: string) => void\n}\n\nfunction FilterInput({ id, label, value, onChange }: FilterInputProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cn('h-9')}\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["SEARCH_DEBOUNCE_MS","ObservabilityAuditRoute","t","useTranslation","params","setParams","useSearchParams","days","agent","platform","user","intent","agentDraft","setAgentDraft","useState","platformDraft","setPlatformDraft","userDraft","setUserDraft","intentDraft","setIntentDraft","useEffect","timer","patchParams","query","useMemo","data","isLoading","isFetching","refetch","useAudit","rows","stats","patch","next","k","v","columns","r","jsx","formatTime","jsxs","Badge","Button","Loader2","RefreshCcw","FilterInput","DataTable","EmptyState","Activity","id","label","value","onChange","Label","Input","e","cn","iso","d"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import{x as f,q as N,ac as y,ab as w,Q as t,c as _,S,l as C,m as v,j as I,k as d}from"./index-CpGWCLE5.js";import{e as m}from"./react-C9F3QeMB.js";import{D as T}from"./data-table--I_ktDF4.js";import{E as k}from"./empty-state-DXNa90pP.js";import{S as D}from"./status-badge-CsdJ6k8Q.js";import{u as R}from"./useQuery-BTyugXYV.js";import{L}from"./loader-circle-JaKY-xMt.js";import{R as B}from"./refresh-ccw-Bx817_KW.js";import"./table-vmLMgj6_.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const M=f("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]),q={all:["bgjobs"],list:s=>["bgjobs","list",s]};function A(s){return R({queryKey:q.list(s),queryFn:()=>N.listBgJobs(s),refetchInterval:5e3,refetchIntervalInBackground:!1})}function J(){const{t:s}=y(["tasks","common"]),[a,i]=w(),r=a.get("root")??null,{data:o,isLoading:x,isFetching:c,refetch:h}=A(r?{root:r}:{}),n=o?.roots??[],b=m.useMemo(()=>o?o.jobs?o.jobs:o.groups?o.groups.flatMap(e=>e.jobs):[]:[],[o]);function j(e){const l=new URLSearchParams(a);e?l.set("root",e):l.delete("root"),i(l,{replace:!0})}const g=m.useMemo(()=>[{id:"name",header:s("bgjobs.col.name"),cell:e=>t.jsx("span",{className:"font-medium",children:e.name}),asCardTitle:!0},{id:"status",header:s("bgjobs.col.status"),cell:e=>t.jsx(D,{status:e.status,children:e.status}),headClassName:"w-28"},{id:"root",header:s("bgjobs.col.root"),cell:e=>{const l=n.find(p=>p.id===e.rootId);return t.jsx("span",{className:"text-text-dim",title:l?.path??e.rootId,children:l?.label??e.rootId})},headClassName:"w-32"},{id:"pid",header:s("bgjobs.col.pid"),cell:e=>t.jsx("span",{className:"tabular-nums text-text-dim",children:e.pid??"—"}),headClassName:"w-20",hideOnMobile:!0},{id:"startedAt",header:s("bgjobs.col.startedAt"),cell:e=>t.jsx("span",{className:"text-text-dim",children:u(e.started_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"endedAt",header:s("bgjobs.col.endedAt"),cell:e=>t.jsx("span",{className:"text-text-dim",children:u(e.ended_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"exit",header:s("bgjobs.col.exit"),cell:e=>e.ended_at==null?t.jsx("span",{className:"text-text-muted",children:s("bgjobs.stillRunning")}):e.exit_code===0?t.jsx("span",{className:"text-success",children:s("bgjobs.exitOk")}):e.exit_code!=null?t.jsx("span",{className:"text-danger tabular-nums",children:e.exit_code}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"}],[s,n]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:s("bgjobs.title")}),t.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>h(),disabled:c,"aria-label":s("actions.refresh",{ns:"common"}),children:[c?t.jsx(L,{className:"h-4 w-4 animate-spin"}):t.jsx(B,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:s("bgjobs.subtitle")})]}),t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx("label",{className:"text-sm text-text-dim",htmlFor:"root-filter",children:s("bgjobs.filter.root")}),t.jsxs(S,{value:r??"__any__",onValueChange:e=>j(e==="__any__"?null:e),children:[t.jsx(C,{id:"root-filter",className:"w-[180px]",children:t.jsx(v,{})}),t.jsxs(I,{children:[t.jsx(d,{value:"__any__",children:s("bgjobs.filter.rootAny")}),n.map(e=>t.jsx(d,{value:e.id,children:e.label},e.id))]})]})]}),t.jsx(T,{columns:g,rows:b,getRowId:e=>`${e.rootId}:${e.id}`,loading:x,emptyState:t.jsx(k,{icon:t.jsx(M,{}),title:s("bgjobs.empty.title"),description:s("bgjobs.empty.description")})})]})}function u(s){if(s==null)return"—";try{const a=new Date(s);if(Number.isNaN(a.getTime()))return s;const i=new Date;return a.toDateString()===i.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return s}}export{J as default};
7
+ //# sourceMappingURL=bgjobs-PFYinH7D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bgjobs-PFYinH7D.js","sources":["../../node_modules/lucide-react/dist/esm/icons/terminal.js","../../src/hooks/use-bgjobs.ts","../../src/routes/tasks/bgjobs.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Terminal = createLucideIcon(\"Terminal\", [\n [\"polyline\", { points: \"4 17 10 11 4 5\", key: \"akl6gq\" }],\n [\"line\", { x1: \"12\", x2: \"20\", y1: \"19\", y2: \"19\", key: \"q2wloq\" }]\n]);\n\nexport { Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","/**\n * useBgjobs — react-query wrapper for /api/bgjobs.\n *\n * Bgjobs are a read-only window into the wrapper-managed bgjob\n * directories (Claude Code's ~/.claude/bgjobs/, opencode's\n * ~/.config/opencode/bgjobs/, codex's ~/.codex/bgjobs/, plus any\n * IMHUB_BGJOB_ROOTS custom paths). No SSE channel for bgjob events;\n * the page polls or refresh-on-demand.\n *\n * Response shape varies based on whether `root` is set — when no\n * root filter is applied the backend returns groups keyed by rootId.\n * The hook leaves that shape intact; flattening logic lives in the\n * route's `useMemo` so a future \"show per-root\" view can pivot\n * cheaply.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListBgjobsQuery, ListBgjobsResponse } from '@/types/api'\n\nexport const bgjobsKeys = {\n all: ['bgjobs'] as const,\n list: (q: ListBgjobsQuery) => ['bgjobs', 'list', q] as const,\n}\n\nexport function useBgjobs(query: ListBgjobsQuery) {\n return useQuery<ListBgjobsResponse>({\n queryKey: bgjobsKeys.list(query),\n queryFn: () => api.listBgJobs(query),\n // Bgjobs file scans are cheap (FS reads) but we don't want to\n // hammer when the user idles on the tab. Auto-refetch every 5s\n // while the tab is focused matches the v1 admin's behavior.\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useInvalidateBgjobs() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: bgjobsKeys.all })\n}\n","/**\n * /tasks/bgjobs — long-running scripts launched by agent wrappers\n * via their bgjob facility. Read-only; the wrapper is the source of\n * truth for writes (kill / restart).\n *\n * Response shape: when no `?root=` filter, backend returns\n * `{ roots, groups: [{ rootId, jobs }] }`; with a root filter,\n * `{ roots: [oneRoot], jobs }`. We flatten via useMemo so the\n * DataTable consumes one flat list regardless of mode.\n *\n * No SSE: bgjob events aren't on the event-bus. We rely on the 5s\n * react-query poll set in use-bgjobs.ts.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Loader2, RefreshCcw, Terminal } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useBgjobs } from '@/hooks/use-bgjobs'\nimport type { BgjobSummary } from '@/types/api'\n\nexport default function BgjobsRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const rootFilter = params.get('root') ?? null\n\n const { data, isLoading, isFetching, refetch } = useBgjobs(\n rootFilter ? { root: rootFilter } : {},\n )\n\n const roots = data?.roots ?? []\n const rows: BgjobSummary[] = useMemo(() => {\n if (!data) return []\n if (data.jobs) return data.jobs\n if (data.groups) return data.groups.flatMap((g) => g.jobs)\n return []\n }, [data])\n\n function setRoot(next: string | null): void {\n const p = new URLSearchParams(params)\n if (!next) p.delete('root')\n else p.set('root', next)\n setParams(p, { replace: true })\n }\n\n const columns: DataTableColumn<BgjobSummary>[] = useMemo(\n () => [\n {\n id: 'name',\n header: t('bgjobs.col.name'),\n cell: (r) => <span className=\"font-medium\">{r.name}</span>,\n asCardTitle: true,\n },\n {\n id: 'status',\n header: t('bgjobs.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'root',\n header: t('bgjobs.col.root'),\n cell: (r) => {\n const root = roots.find((rt) => rt.id === r.rootId)\n return (\n <span className=\"text-text-dim\" title={root?.path ?? r.rootId}>\n {root?.label ?? r.rootId}\n </span>\n )\n },\n headClassName: 'w-32',\n },\n {\n id: 'pid',\n header: t('bgjobs.col.pid'),\n cell: (r) => (\n <span className=\"tabular-nums text-text-dim\">{r.pid ?? '—'}</span>\n ),\n headClassName: 'w-20',\n hideOnMobile: true,\n },\n {\n id: 'startedAt',\n header: t('bgjobs.col.startedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.started_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'endedAt',\n header: t('bgjobs.col.endedAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.ended_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n {\n id: 'exit',\n header: t('bgjobs.col.exit'),\n cell: (r) => {\n if (r.ended_at == null) return <span className=\"text-text-muted\">{t('bgjobs.stillRunning')}</span>\n if (r.exit_code === 0) return <span className=\"text-success\">{t('bgjobs.exitOk')}</span>\n if (r.exit_code != null) return <span className=\"text-danger tabular-nums\">{r.exit_code}</span>\n return <span className=\"text-text-muted\">—</span>\n },\n headClassName: 'w-20',\n },\n ],\n [t, roots],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('bgjobs.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('bgjobs.subtitle')}</p>\n </header>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-sm text-text-dim\" htmlFor=\"root-filter\">\n {t('bgjobs.filter.root')}\n </label>\n <Select\n value={rootFilter ?? '__any__'}\n onValueChange={(v) => setRoot(v === '__any__' ? null : v)}\n >\n <SelectTrigger id=\"root-filter\" className=\"w-[180px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__any__\">{t('bgjobs.filter.rootAny')}</SelectItem>\n {roots.map((r) => (\n <SelectItem key={r.id} value={r.id}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => `${r.rootId}:${r.id}`}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<Terminal />}\n title={t('bgjobs.empty.title')}\n description={t('bgjobs.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n const now = new Date()\n const sameDay = d.toDateString() === now.toDateString()\n if (sameDay) {\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n }\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["Terminal","createLucideIcon","bgjobsKeys","q","useBgjobs","query","useQuery","api","BgjobsRoute","t","useTranslation","params","setParams","useSearchParams","rootFilter","data","isLoading","isFetching","refetch","roots","rows","useMemo","g","setRoot","next","p","columns","r","jsx","StatusBadge","root","rt","formatTime","jsxs","Button","Loader2","RefreshCcw","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","DataTable","EmptyState","iso","d","now"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as a}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const t=a("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);export{t as B};
7
+ //# sourceMappingURL=brain-DEEJttEL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-DEEJttEL.js","sources":["../../node_modules/lucide-react/dist/esm/icons/brain.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Brain = createLucideIcon(\"Brain\", [\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\",\n key: \"l5xja\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\",\n key: \"ep3f8r\"\n }\n ],\n [\"path\", { d: \"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\", key: \"1p4c4q\" }],\n [\"path\", { d: \"M17.599 6.5a3 3 0 0 0 .399-1.375\", key: \"tmeiqw\" }],\n [\"path\", { d: \"M6.003 5.125A3 3 0 0 0 6.401 6.5\", key: \"105sqy\" }],\n [\"path\", { d: \"M3.477 10.896a4 4 0 0 1 .585-.396\", key: \"ql3yin\" }],\n [\"path\", { d: \"M19.938 10.5a4 4 0 0 1 .585.396\", key: \"1qfode\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-1.967-.516\", key: \"2e4loj\" }],\n [\"path\", { d: \"M19.967 17.484A4 4 0 0 1 18 18\", key: \"159ez6\" }]\n]);\n\nexport { Brain as default };\n//# sourceMappingURL=brain.js.map\n"],"names":["Brain","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CACE,OACA,CACE,EAAG,uFACH,IAAK,OACX,CACA,EACE,CACE,OACA,CACE,EAAG,uFACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,mCAAoC,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,EAAG,oCAAqC,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAQ,CAAE,EAC3D,CAAC,OAAQ,CAAE,EAAG,iCAAkC,IAAK,QAAQ,CAAE,CACjE,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as e}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const a=e("Briefcase",[["path",{d:"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16",key:"jecpp"}],["rect",{width:"20",height:"14",x:"2",y:"6",rx:"2",key:"i6l2r4"}]]);export{a as B};
7
+ //# sourceMappingURL=briefcase-BlMy8gI6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefcase-BlMy8gI6.js","sources":["../../node_modules/lucide-react/dist/esm/icons/briefcase.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Briefcase = createLucideIcon(\"Briefcase\", [\n [\"path\", { d: \"M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\", key: \"jecpp\" }],\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"6\", rx: \"2\", key: \"i6l2r4\" }]\n]);\n\nexport { Briefcase as default };\n//# sourceMappingURL=briefcase.js.map\n"],"names":["Briefcase","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,OAAO,CAAE,EAC1E,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,CAChF,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,3 @@
1
+ import{g as V,d as A}from"./react-C9F3QeMB.js";function X(_,d){for(var b=0;b<d.length;b++){const y=d[b];if(typeof y!="string"&&!Array.isArray(y)){for(const l in y)if(l!=="default"&&!(l in _)){const p=Object.getOwnPropertyDescriptor(y,l);p&&Object.defineProperty(_,l,p.get?p:{enumerable:!0,get:()=>y[l]})}}}return Object.freeze(Object.defineProperty(_,Symbol.toStringTag,{value:"Module"}))}var x={exports:{}};(function(_,d){var b=typeof globalThis<"u"&&globalThis||typeof self<"u"&&self||typeof A<"u"&&A,y=function(){function p(){this.fetch=!1,this.DOMException=b.DOMException}return p.prototype=b,new p}();(function(p){(function(h){var a=typeof p<"u"&&p||typeof self<"u"&&self||typeof A<"u"&&A||{},u={searchParams:"URLSearchParams"in a,iterable:"Symbol"in a&&"iterator"in Symbol,blob:"FileReader"in a&&"Blob"in a&&function(){try{return new Blob,!0}catch{return!1}}(),formData:"FormData"in a,arrayBuffer:"ArrayBuffer"in a};function S(e){return e&&DataView.prototype.isPrototypeOf(e)}if(u.arrayBuffer)var F=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],C=ArrayBuffer.isView||function(e){return e&&F.indexOf(Object.prototype.toString.call(e))>-1};function v(e){if(typeof e!="string"&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(e)||e==="")throw new TypeError('Invalid character in header field name: "'+e+'"');return e.toLowerCase()}function E(e){return typeof e!="string"&&(e=String(e)),e}function T(e){var t={next:function(){var r=e.shift();return{done:r===void 0,value:r}}};return u.iterable&&(t[Symbol.iterator]=function(){return t}),t}function i(e){this.map={},e instanceof i?e.forEach(function(t,r){this.append(r,t)},this):Array.isArray(e)?e.forEach(function(t){if(t.length!=2)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}i.prototype.append=function(e,t){e=v(e),t=E(t);var r=this.map[e];this.map[e]=r?r+", "+t:t},i.prototype.delete=function(e){delete this.map[v(e)]},i.prototype.get=function(e){return e=v(e),this.has(e)?this.map[e]:null},i.prototype.has=function(e){return this.map.hasOwnProperty(v(e))},i.prototype.set=function(e,t){this.map[v(e)]=E(t)},i.prototype.forEach=function(e,t){for(var r in this.map)this.map.hasOwnProperty(r)&&e.call(t,this.map[r],r,this)},i.prototype.keys=function(){var e=[];return this.forEach(function(t,r){e.push(r)}),T(e)},i.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),T(e)},i.prototype.entries=function(){var e=[];return this.forEach(function(t,r){e.push([r,t])}),T(e)},u.iterable&&(i.prototype[Symbol.iterator]=i.prototype.entries);function B(e){if(!e._noBody){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}}function D(e){return new Promise(function(t,r){e.onload=function(){t(e.result)},e.onerror=function(){r(e.error)}})}function I(e){var t=new FileReader,r=D(t);return t.readAsArrayBuffer(e),r}function M(e){var t=new FileReader,r=D(t),n=/charset=([A-Za-z0-9_-]+)/.exec(e.type),s=n?n[1]:"utf-8";return t.readAsText(e,s),r}function q(e){for(var t=new Uint8Array(e),r=new Array(t.length),n=0;n<t.length;n++)r[n]=String.fromCharCode(t[n]);return r.join("")}function R(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function U(){return this.bodyUsed=!1,this._initBody=function(e){this.bodyUsed=this.bodyUsed,this._bodyInit=e,e?typeof e=="string"?this._bodyText=e:u.blob&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:u.formData&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:u.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():u.arrayBuffer&&u.blob&&S(e)?(this._bodyArrayBuffer=R(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):u.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(e)||C(e))?this._bodyArrayBuffer=R(e):this._bodyText=e=Object.prototype.toString.call(e):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||(typeof e=="string"?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):u.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},u.blob&&(this.blob=function(){var e=B(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var e=B(this);return e||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}else{if(u.blob)return this.blob().then(I);throw new Error("could not read as ArrayBuffer")}},this.text=function(){var e=B(this);if(e)return e;if(this._bodyBlob)return M(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(q(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},u.formData&&(this.formData=function(){return this.text().then(k)}),this.json=function(){return this.text().then(JSON.parse)},this}var L=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function N(e){var t=e.toUpperCase();return L.indexOf(t)>-1?t:e}function m(e,t){if(!(this instanceof m))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');t=t||{};var r=t.body;if(e instanceof m){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new i(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,!r&&e._bodyInit!=null&&(r=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",(t.headers||!this.headers)&&(this.headers=new i(t.headers)),this.method=N(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal||function(){if("AbortController"in a){var o=new AbortController;return o.signal}}(),this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&r)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(r),(this.method==="GET"||this.method==="HEAD")&&(t.cache==="no-store"||t.cache==="no-cache")){var n=/([?&])_=[^&]*/;if(n.test(this.url))this.url=this.url.replace(n,"$1_="+new Date().getTime());else{var s=/\?/;this.url+=(s.test(this.url)?"&":"?")+"_="+new Date().getTime()}}}m.prototype.clone=function(){return new m(this,{body:this._bodyInit})};function k(e){var t=new FormData;return e.trim().split("&").forEach(function(r){if(r){var n=r.split("="),s=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(s),decodeURIComponent(o))}}),t}function z(e){var t=new i,r=e.replace(/\r?\n[\t ]+/g," ");return r.split("\r").map(function(n){return n.indexOf(`
2
+ `)===0?n.substr(1,n.length):n}).forEach(function(n){var s=n.split(":"),o=s.shift().trim();if(o){var g=s.join(":").trim();try{t.append(o,g)}catch(P){console.warn("Response "+P.message)}}}),t}U.call(m.prototype);function c(e,t){if(!(this instanceof c))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(t||(t={}),this.type="default",this.status=t.status===void 0?200:t.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText===void 0?"":""+t.statusText,this.headers=new i(t.headers),this.url=t.url||"",this._initBody(e)}U.call(c.prototype),c.prototype.clone=function(){return new c(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new i(this.headers),url:this.url})},c.error=function(){var e=new c(null,{status:200,statusText:""});return e.ok=!1,e.status=0,e.type="error",e};var G=[301,302,303,307,308];c.redirect=function(e,t){if(G.indexOf(t)===-1)throw new RangeError("Invalid status code");return new c(null,{status:t,headers:{location:e}})},h.DOMException=a.DOMException;try{new h.DOMException}catch{h.DOMException=function(t,r){this.message=t,this.name=r;var n=Error(t);this.stack=n.stack},h.DOMException.prototype=Object.create(Error.prototype),h.DOMException.prototype.constructor=h.DOMException}function O(e,t){return new Promise(function(r,n){var s=new m(e,t);if(s.signal&&s.signal.aborted)return n(new h.DOMException("Aborted","AbortError"));var o=new XMLHttpRequest;function g(){o.abort()}o.onload=function(){var f={statusText:o.statusText,headers:z(o.getAllResponseHeaders()||"")};s.url.indexOf("file://")===0&&(o.status<200||o.status>599)?f.status=200:f.status=o.status,f.url="responseURL"in o?o.responseURL:f.headers.get("X-Request-URL");var w="response"in o?o.response:o.responseText;setTimeout(function(){r(new c(w,f))},0)},o.onerror=function(){setTimeout(function(){n(new TypeError("Network request failed"))},0)},o.ontimeout=function(){setTimeout(function(){n(new TypeError("Network request timed out"))},0)},o.onabort=function(){setTimeout(function(){n(new h.DOMException("Aborted","AbortError"))},0)};function P(f){try{return f===""&&a.location.href?a.location.href:f}catch{return f}}if(o.open(s.method,P(s.url),!0),s.credentials==="include"?o.withCredentials=!0:s.credentials==="omit"&&(o.withCredentials=!1),"responseType"in o&&(u.blob?o.responseType="blob":u.arrayBuffer&&(o.responseType="arraybuffer")),t&&typeof t.headers=="object"&&!(t.headers instanceof i||a.Headers&&t.headers instanceof a.Headers)){var j=[];Object.getOwnPropertyNames(t.headers).forEach(function(f){j.push(v(f)),o.setRequestHeader(f,E(t.headers[f]))}),s.headers.forEach(function(f,w){j.indexOf(w)===-1&&o.setRequestHeader(w,f)})}else s.headers.forEach(function(f,w){o.setRequestHeader(w,f)});s.signal&&(s.signal.addEventListener("abort",g),o.onreadystatechange=function(){o.readyState===4&&s.signal.removeEventListener("abort",g)}),o.send(typeof s._bodyInit>"u"?null:s._bodyInit)})}return O.polyfill=!0,a.fetch||(a.fetch=O,a.Headers=i,a.Request=m,a.Response=c),h.Headers=i,h.Request=m,h.Response=c,h.fetch=O,h})({})})(y),y.fetch.ponyfill=!0,delete y.fetch.polyfill;var l=b.fetch?b:y;d=l.fetch,d.default=l.fetch,d.fetch=l.fetch,d.Headers=l.Headers,d.Request=l.Request,d.Response=l.Response,_.exports=d})(x,x.exports);var H=x.exports;const $=V(H),Z=X({__proto__:null,default:$},[H]);export{Z as b};
3
+ //# sourceMappingURL=browser-ponyfill-BOcGq8h9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-ponyfill-BOcGq8h9.js","sources":["../../node_modules/cross-fetch/dist/browser-ponyfill.js"],"sourcesContent":["// Save global object in a variable\nvar __global__ =\n(typeof globalThis !== 'undefined' && globalThis) ||\n(typeof self !== 'undefined' && self) ||\n(typeof global !== 'undefined' && global);\n// Create an object that extends from __global__ without the fetch function\nvar __globalThis__ = (function () {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = __global__.DOMException\n}\nF.prototype = __global__; // Needed for feature detection on whatwg-fetch's code\nreturn new F();\n})();\n// Wraps whatwg-fetch with a function scope to hijack the global object\n// \"globalThis\" that's going to be patched\n(function(globalThis) {\n\nvar irrelevant = (function (exports) {\n\n /* eslint-disable no-prototype-builtins */\n var g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {};\n\n var support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type);\n var encoding = match ? match[1] : 'utf-8';\n reader.readAsText(blob, encoding);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed;\n this._bodyInit = body;\n if (!body) {\n this._noBody = true;\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this);\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n };\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/;\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/;\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n }\n }\n }\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n try {\n headers.append(key, value);\n } catch (error) {\n console.warn('Response ' + error.message);\n }\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 200, statusText: ''});\n response.ok = false;\n response.status = 0;\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = g.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n setTimeout(function() {\n resolve(new Response(body, options));\n }, 0);\n };\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'));\n }, 0);\n };\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'));\n }, 0);\n };\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n }, 0);\n };\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob';\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer';\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name));\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n });\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value);\n }\n });\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!g.fetch) {\n g.fetch = fetch;\n g.Headers = Headers;\n g.Request = Request;\n g.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n return exports;\n\n})({});\n})(__globalThis__);\n// This is a ponyfill, so...\n__globalThis__.fetch.ponyfill = true;\ndelete __globalThis__.fetch.polyfill;\n// Choose between native implementation (__global__) or custom implementation (__globalThis__)\nvar ctx = __global__.fetch ? __global__ : __globalThis__;\nexports = ctx.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = ctx.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = ctx.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = ctx.Headers\nexports.Request = ctx.Request\nexports.Response = ctx.Response\nmodule.exports = exports\n"],"names":["__global__","global","__globalThis__","F","globalThis","exports","g","support","isDataView","obj","viewClasses","isArrayBufferView","normalizeName","name","normalizeValue","value","iteratorFor","items","iterator","Headers","headers","header","oldValue","callback","thisArg","consumed","body","fileReaderReady","reader","resolve","reject","readBlobAsArrayBuffer","blob","promise","readBlobAsText","match","encoding","readArrayBufferAsText","buf","view","chars","i","bufferClone","Body","rejected","isConsumed","decode","methods","normalizeMethod","method","upcased","Request","input","options","ctrl","reParamSearch","reQueryString","form","bytes","split","parseHeaders","rawHeaders","preProcessedHeaders","line","parts","key","error","Response","bodyInit","response","redirectStatuses","url","status","message","fetch","init","request","xhr","abortXhr","fixUrl","names","ctx","module"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as t}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const h=t("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{h as C};
7
+ //# sourceMappingURL=chevron-right-DmABPvoA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chevron-right-DmABPvoA.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-right.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n"],"names":["ChevronRight","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as c}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const r=c("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);export{r as C};
7
+ //# sourceMappingURL=circle-check-C0Qpg1vL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-check-C0Qpg1vL.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n"],"names":["CircleCheck","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as e}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const t=e("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);export{t as C};
7
+ //# sourceMappingURL=circle-check-big-C8LG3beV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-check-big-C8LG3beV.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n"],"names":["CircleCheckBig","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAiBC,EAAiB,iBAAkB,CACxD,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,7 @@
1
+ import{x as c}from"./index-CpGWCLE5.js";/**
2
+ * @license lucide-react v0.469.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const r=c("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);export{r as C};
7
+ //# sourceMappingURL=circle-x-D_cRHcHK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-x-D_cRHcHK.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-x.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n"],"names":["CircleX","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAUC,EAAiB,UAAW,CAC1C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}