bazilion 0.12.2 → 0.14.0

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 (217) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +795 -240
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +4555 -1280
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/migrations/0001_init.sql +21 -0
  7. package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
  8. package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
  9. package/dist/web/client/assets/ConfirmDialog-CyL9A20V.js +1 -0
  10. package/dist/web/client/assets/FieldRow-D6REbYUa.js +1 -0
  11. package/dist/web/client/assets/Page-NV96O47A.js +1 -0
  12. package/dist/web/client/assets/ProductionTeamPolicyEditor-DBKnOezm.js +7 -0
  13. package/dist/web/client/assets/{ProfileCommunicationEditor-C43HvUe-.js → ProfileCommunicationEditor-4RK2laqO.js} +1 -1
  14. package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
  15. package/dist/web/client/assets/TeamTabs-CdtNEqt4.js +1 -0
  16. package/dist/web/client/assets/{TemplatesTabs-6Jd_xQj7.js → TemplatesTabs-CZyss2Y0.js} +1 -1
  17. package/dist/web/client/assets/UnsavedChangesGuard-CEoK-ZcN.js +1 -0
  18. package/dist/web/client/assets/_id-4ZS-w_Aj.js +1 -0
  19. package/dist/web/client/assets/{_id-AOAT0H_5.js → _id-DIqtdQij.js} +1 -1
  20. package/dist/web/client/assets/_id-DbcC2E7F.js +1 -0
  21. package/dist/web/client/assets/_id-f_r5M0p3.js +1 -0
  22. package/dist/web/client/assets/activity-CB9Ufth-.js +1 -0
  23. package/dist/web/client/assets/agents-D-JGXVg9.js +1 -0
  24. package/dist/web/client/assets/agents-DS2XafoA.js +1 -0
  25. package/dist/web/client/assets/approvals-Cke_mrJv.js +1 -0
  26. package/dist/web/client/assets/attention-PYwRM2wC.js +1 -0
  27. package/dist/web/client/assets/chevron-right-BG4OeFRQ.js +1 -0
  28. package/dist/web/client/assets/config-DF9Gqmfa.js +3 -0
  29. package/dist/web/client/assets/dm-sans-latin-400-normal-BwCSEQnW.woff +0 -0
  30. package/dist/web/client/assets/dm-sans-latin-400-normal-CW0RaeGs.woff2 +0 -0
  31. package/dist/web/client/assets/dm-sans-latin-500-normal-B9HHJjqV.woff2 +0 -0
  32. package/dist/web/client/assets/dm-sans-latin-500-normal-Dr3UlScf.woff +0 -0
  33. package/dist/web/client/assets/dm-sans-latin-600-normal-Aqo67rzb.woff2 +0 -0
  34. package/dist/web/client/assets/dm-sans-latin-600-normal-BmdmIIQ2.woff +0 -0
  35. package/dist/web/client/assets/dm-sans-latin-700-normal-CUSSCpQX.woff +0 -0
  36. package/dist/web/client/assets/dm-sans-latin-700-normal-DvUfVpUG.woff2 +0 -0
  37. package/dist/web/client/assets/dm-serif-display-latin-400-normal-C5_t9oOD.woff2 +0 -0
  38. package/dist/web/client/assets/dm-serif-display-latin-400-normal-_kVFYEpx.woff +0 -0
  39. package/dist/web/client/assets/{inbox-Bn1GbUsJ.js → inbox-DC_HdOfI.js} +1 -1
  40. package/dist/web/client/assets/index-Cofc7zhl.css +1 -0
  41. package/dist/web/client/assets/index-Cp6UHWr2.js +52 -0
  42. package/dist/web/client/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  43. package/dist/web/client/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  44. package/dist/web/client/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  45. package/dist/web/client/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  46. package/dist/web/client/assets/learning-BfrQ4YZY.js +1 -0
  47. package/dist/web/client/assets/login-D4n3AcBR.js +1 -0
  48. package/dist/web/client/assets/mcp-CnjQc_JJ.js +1 -0
  49. package/dist/web/client/assets/members-wxsVTJdW.js +1 -0
  50. package/dist/web/client/assets/memory-Du60O3pE.js +1 -0
  51. package/dist/web/client/assets/{policy-DaijITy7.js → policy-BOfnkJsL.js} +1 -1
  52. package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
  53. package/dist/web/client/assets/routes-B9CuhzUW.js +1 -0
  54. package/dist/web/client/assets/services-DyvqJqM2.js +1 -0
  55. package/dist/web/client/assets/skills-DQo7ioW7.js +1 -0
  56. package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
  57. package/dist/web/client/assets/{teams-D92R9Pb7.js → teams-DPggy97H.js} +1 -1
  58. package/dist/web/client/assets/teams-DdawcfNR.js +1 -0
  59. package/dist/web/client/assets/telegram-DcTeDpP5.js +1 -0
  60. package/dist/web/client/assets/tokens-CIEKwZXc.js +1 -0
  61. package/dist/web/client/assets/triggers-Bc2RrUPm.js +1 -0
  62. package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
  63. package/dist/web/client/assets/welcome-DlhNXUIa.js +1 -0
  64. package/dist/web/client/assets/wire-constants-BzdHSc6A.js +74 -0
  65. package/dist/web/client/assets/x-DAXGIe_Q.js +1 -0
  66. package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
  67. package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
  68. package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
  69. package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
  70. package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
  71. package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
  72. package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
  73. package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
  74. package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
  75. package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
  76. package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
  77. package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
  78. package/dist/web/server/assets/{_id-Dj1yZ3zJ.js → _id-BAA9KJBU.js} +4 -4
  79. package/dist/web/server/assets/{_id-LrvXU4Nr.js → _id-BM5m2FLT.js} +4 -4
  80. package/dist/web/server/assets/{_id-CwyGjJeP.js → _id-BYKpT2Tu.js} +4 -5
  81. package/dist/web/server/assets/{_id-BHYLL8M-.js → _id-BeKhPKw3.js} +350 -185
  82. package/dist/web/server/assets/{_id-C3HY4lWg.js → _id-BqWTB8Wl.js} +188 -86
  83. package/dist/web/server/assets/{_id-DinTp_7X.js → _id-BwvCtzlD.js} +3 -3
  84. package/dist/web/server/assets/{_id-D27T85mU.js → _id-DYU6uIBx.js} +4 -5
  85. package/dist/web/server/assets/{_id-IzadFZV9.js → _id-DvlDkk04.js} +4 -4
  86. package/dist/web/server/assets/{_id-BhOB8Umi.js → _id-DxCnEFpm.js} +4 -4
  87. package/dist/web/server/assets/{_id-tB47Vsfp.js → _id-HMy7jM3P.js} +3 -3
  88. package/dist/web/server/assets/{_id-D3Ap7zZA.js → _id-ndxFHx0t.js} +75 -71
  89. package/dist/web/server/assets/{_id-FcHdSocl.js → _id-sNu5aXZt.js} +5 -4
  90. package/dist/web/server/assets/{_tanstack-start-manifest_v-BGDBdnUs.js → _tanstack-start-manifest_v-C-OiOZeM.js} +118 -94
  91. package/dist/web/server/assets/{activity-DohitgwW.js → activity-9VP6QDTH.js} +3 -3
  92. package/dist/web/server/assets/{activity-BCI4mfNS.js → activity-BWv1goK6.js} +3 -3
  93. package/dist/web/server/assets/{activity-D9SMqBhy.js → activity-LjpblbDL.js} +3 -3
  94. package/dist/web/server/assets/{agents-C9xlWK0Z.js → agents-BDFGrU3o.js} +4 -4
  95. package/dist/web/server/assets/{agents-BY74v7fM.js → agents-BJAv919x.js} +3 -3
  96. package/dist/web/server/assets/{agents-BvttypqB.js → agents-CJk4pxKu.js} +3 -3
  97. package/dist/web/server/assets/{agents-CgZMHj80.js → agents-CYw1xHoY.js} +138 -16
  98. package/dist/web/server/assets/{agents-DZuFEj0D.js → agents-DfNKc_Q7.js} +52 -8
  99. package/dist/web/server/assets/{agents-BPKOshR5.js → agents-DjyQk94u.js} +4 -4
  100. package/dist/web/server/assets/{approvals-CWcFHlor.js → approvals-7JOoBchn.js} +3 -3
  101. package/dist/web/server/assets/{approvals-BGU-XGIO.js → approvals-BYi84gwl.js} +3 -3
  102. package/dist/web/server/assets/{approvals-DCaVw1Mz.js → approvals-Bz123liE.js} +59 -21
  103. package/dist/web/server/assets/{attention-BxkTf337.js → attention-B35JvhOL.js} +3 -3
  104. package/dist/web/server/assets/{attention-w21GQIGH.js → attention-C1pPWSXw.js} +3 -3
  105. package/dist/web/server/assets/{attention-CM-Ks1N9.js → attention-UhqPK_Ro.js} +3 -3
  106. package/dist/web/server/assets/{auth-byfSx6Ja.js → auth-7BHTH-KS.js} +5 -5
  107. package/dist/web/server/assets/{config-BDCJdtj2.js → config-BMiajTZP.js} +10 -5
  108. package/dist/web/server/assets/{config-1w2GiJUn.js → config-BlMkHStx.js} +3 -3
  109. package/dist/web/server/assets/config-ExacOzHX.js +958 -0
  110. package/dist/web/server/assets/{createServerRpc-pU-IQV2Y.js → createServerRpc-B7Yr1K8i.js} +1 -1
  111. package/dist/web/server/assets/{createSsrRpc-DFsIAfFd.js → createSsrRpc-6LHNEsSK.js} +1 -1
  112. package/dist/web/server/assets/{daemon-client-2NRMzlTr.js → daemon-client-CI5NHwNC.js} +16 -4
  113. package/dist/web/server/assets/{inbox-CzlKT9Wg.js → inbox-Dv55rGYq.js} +4 -4
  114. package/dist/web/server/assets/{inbox-BLUzA5sQ.js → inbox-RweGCV3D.js} +3 -3
  115. package/dist/web/server/assets/{inbox-ZvDNAjaM.js → inbox-cu3jLzNP.js} +4 -4
  116. package/dist/web/server/assets/{learning-B7PBkvER.js → learning-BaKM6qaw.js} +4 -4
  117. package/dist/web/server/assets/{learning-8zav4pIT.js → learning-C2upa1CE.js} +4 -4
  118. package/dist/web/server/assets/{learning-Cq7K2heb.js → learning-CbtNlqYo.js} +76 -23
  119. package/dist/web/server/assets/{login-CmWvxfTK.js → login-BNj3U6ok.js} +22 -12
  120. package/dist/web/server/assets/{login-Bx5LEyGP.js → login-Be8eP4Jp.js} +2 -2
  121. package/dist/web/server/assets/{mcp-DIWTogHM.js → mcp-B0goWO8Q.js} +3 -3
  122. package/dist/web/server/assets/{mcp-2pwT9HU8.js → mcp-BvnvlVFd.js} +3 -3
  123. package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
  124. package/dist/web/server/assets/members-BP3UTqu1.js +12 -0
  125. package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
  126. package/dist/web/server/assets/members-DiYtr-zm.js +12 -0
  127. package/dist/web/server/assets/{memory-Dngc13Nw.js → memory-BqV-Afy1.js} +4 -4
  128. package/dist/web/server/assets/{memory-a8Kz57Kh.js → memory-CkXUgf5s.js} +150 -48
  129. package/dist/web/server/assets/{memory-pZ4pZT7p.js → memory-DTFEmfF3.js} +4 -4
  130. package/dist/web/server/assets/{policy-Bb-vEgqg.js → policy-18fdTFO4.js} +3 -3
  131. package/dist/web/server/assets/{policy-C30AeFIb.js → policy-BddK4xom.js} +3 -3
  132. package/dist/web/server/assets/{policy-BcGELcc9.js → policy-Bvvav8fh.js} +4 -4
  133. package/dist/web/server/assets/public-origin-xV0lm0Ty.js +25 -0
  134. package/dist/web/server/assets/router-pjH2t8Rl.js +813 -0
  135. package/dist/web/server/assets/{routes-B6cMLIPk.js → routes-BgHisAxH.js} +22 -5
  136. package/dist/web/server/assets/{routes-BrA-U_Hm.js → routes-COtkyZG1.js} +5 -5
  137. package/dist/web/server/assets/{routes-C19CMLZt.js → routes-DAU2g7Uz.js} +4 -4
  138. package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
  139. package/dist/web/server/assets/{services-C4szdhPx.js → services-DgoU1udp.js} +3 -3
  140. package/dist/web/server/assets/{services-wG8I06oS.js → services-DozuJtzX.js} +3 -3
  141. package/dist/web/server/assets/{skills-BZdqiDig.js → skills-CYih9TJw.js} +47 -6
  142. package/dist/web/server/assets/{skills-a9VSWHWq.js → skills-DfGSJTCB.js} +3 -3
  143. package/dist/web/server/assets/{skills-C-UgkuCW.js → skills-Dw3cI3si.js} +3 -3
  144. package/dist/web/server/assets/start-D4Wq9iTa.js +70 -0
  145. package/dist/web/server/assets/{teams-OIkHuxy1.js → teams-BJuoNOTB.js} +3 -3
  146. package/dist/web/server/assets/{teams-CpQ0YgWf.js → teams-DF3RViAg.js} +3 -3
  147. package/dist/web/server/assets/{teams-DEpQR2QA.js → teams-DFnuc660.js} +3 -3
  148. package/dist/web/server/assets/{teams-DqfrEoH6.js → teams-DPnAX4wD.js} +4 -4
  149. package/dist/web/server/assets/{teams-jBtvnk59.js → teams-TV6nbEN_.js} +101 -10
  150. package/dist/web/server/assets/{teams-MjqgsmC3.js → teams-be05ci17.js} +3 -3
  151. package/dist/web/server/assets/{telegram-DNgCWebD.js → telegram-1AWL6lFw.js} +3 -3
  152. package/dist/web/server/assets/{telegram-XwyKSEtj.js → telegram-DbOFpTFm.js} +3 -3
  153. package/dist/web/server/assets/{telegram-CBF8SJzB.js → telegram-Dj4Wwhd6.js} +262 -43
  154. package/dist/web/server/assets/tokens-DDwtO15P.js +359 -0
  155. package/dist/web/server/assets/tokens-DjM8GsgS.js +19 -0
  156. package/dist/web/server/assets/{tokens-BnwFbV7T.js → tokens-_2hptHP6.js} +4 -4
  157. package/dist/web/server/assets/{triggers-BZPl5CHs.js → triggers-BvjYNmmY.js} +4 -4
  158. package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
  159. package/dist/web/server/assets/{triggers-D79NoSXk.js → triggers-Nezfw-Bd.js} +4 -4
  160. package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
  161. package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
  162. package/dist/web/server/server.js +29 -33
  163. package/dist/web-server.js +4 -0
  164. package/dist/web-server.js.map +1 -1
  165. package/dist/worker.js +1744 -362
  166. package/dist/worker.js.map +1 -1
  167. package/package.json +7 -6
  168. package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
  169. package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
  170. package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
  171. package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
  172. package/dist/web/client/assets/ProductionTeamPolicyEditor-CsWpTsy6.js +0 -7
  173. package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
  174. package/dist/web/client/assets/TeamTabs-DvqWieCq.js +0 -1
  175. package/dist/web/client/assets/_id-BUuz7Drv.js +0 -1
  176. package/dist/web/client/assets/_id-BegmVRmT.js +0 -1
  177. package/dist/web/client/assets/_id-BrA4Crh_.js +0 -1
  178. package/dist/web/client/assets/activity-n0Fw9_w3.js +0 -1
  179. package/dist/web/client/assets/agents-B33VQtbl.js +0 -1
  180. package/dist/web/client/assets/agents-C50pdxp7.js +0 -1
  181. package/dist/web/client/assets/approvals-DVW0hX8h.js +0 -1
  182. package/dist/web/client/assets/attention-B2490jcN.js +0 -1
  183. package/dist/web/client/assets/chevron-down-B0aNNOyn.js +0 -1
  184. package/dist/web/client/assets/config-CMMxxeX2.js +0 -3
  185. package/dist/web/client/assets/context-DcFzsfZ3.js +0 -1
  186. package/dist/web/client/assets/index-3nrK5iFr.js +0 -12
  187. package/dist/web/client/assets/learning-BUX1MFu2.js +0 -1
  188. package/dist/web/client/assets/login-CMWpGDKv.js +0 -1
  189. package/dist/web/client/assets/mcp-lZV08dqc.js +0 -1
  190. package/dist/web/client/assets/members-DAeaY2Cy.js +0 -1
  191. package/dist/web/client/assets/memory-HmMWxxdF.js +0 -1
  192. package/dist/web/client/assets/plus-CPzRJg1V.js +0 -1
  193. package/dist/web/client/assets/routes-BNk270AM.js +0 -1
  194. package/dist/web/client/assets/services-DtrpJrdo.js +0 -1
  195. package/dist/web/client/assets/skills-Cv93A3P3.js +0 -1
  196. package/dist/web/client/assets/styles-DMltY3su.css +0 -2
  197. package/dist/web/client/assets/teams-CCFnSNKi.js +0 -1
  198. package/dist/web/client/assets/telegram-BF1vdgDB.js +0 -1
  199. package/dist/web/client/assets/tokens-BXj6hWW-.js +0 -1
  200. package/dist/web/client/assets/triggers-NT24i4hZ.js +0 -1
  201. package/dist/web/client/assets/welcome-D0cy68eZ.js +0 -1
  202. package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
  203. package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
  204. package/dist/web/server/assets/config-BmixCpz-.js +0 -372
  205. package/dist/web/server/assets/context-B-XDf6Ym.js +0 -12
  206. package/dist/web/server/assets/context-BXGo5Vfi.js +0 -12
  207. package/dist/web/server/assets/context-DrkrIWun.js +0 -47
  208. package/dist/web/server/assets/mcp-BJjLIdP0.js +0 -261
  209. package/dist/web/server/assets/members-CCv17cjQ.js +0 -46
  210. package/dist/web/server/assets/members-CW5aBe81.js +0 -12
  211. package/dist/web/server/assets/members-VdPwD6CE.js +0 -12
  212. package/dist/web/server/assets/router-CIVjTgNp.js +0 -537
  213. package/dist/web/server/assets/services-B9yBWDX0.js +0 -79
  214. package/dist/web/server/assets/start-WH8WzTL_.js +0 -4
  215. package/dist/web/server/assets/tokens-DPDMSN5O.js +0 -12
  216. package/dist/web/server/assets/tokens-yyTSfBSN.js +0 -186
  217. package/dist/web/server/assets/triggers-CSNNzRIi.js +0 -216
@@ -0,0 +1,99 @@
1
+ import { t as Button } from "./Button-Dsnw22OF.js";
2
+ import { useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Dialog } from "radix-ui";
5
+ //#region src/components/ConfirmDialog.tsx
6
+ var useBrowserLayoutEffect = typeof document === "undefined" ? useEffect : useLayoutEffect;
7
+ function getDialogFocusRestoreTarget(doc) {
8
+ const target = doc.activeElement;
9
+ if (!target || target === doc.body || target === doc.documentElement || !("focus" in target) || typeof target.focus !== "function") return null;
10
+ return target;
11
+ }
12
+ function restoreDialogFocus(target, doc) {
13
+ if (!target || !target.isConnected || target.ownerDocument !== doc) return;
14
+ target.focus({ preventScroll: true });
15
+ }
16
+ function ConfirmDialog({ open, title, description, confirmLabel, confirmVariant = "danger", onConfirm, onOpenChange }) {
17
+ const [busy, setBusy] = useState(false);
18
+ const [error, setError] = useState(null);
19
+ const focusRestoreTargetRef = useRef(null);
20
+ const wasOpenRef = useRef(false);
21
+ useBrowserLayoutEffect(() => {
22
+ if (open && !wasOpenRef.current) focusRestoreTargetRef.current = getDialogFocusRestoreTarget(document);
23
+ wasOpenRef.current = open;
24
+ }, [open]);
25
+ useEffect(() => {
26
+ if (!open) {
27
+ setBusy(false);
28
+ setError(null);
29
+ }
30
+ }, [open]);
31
+ async function confirm() {
32
+ setBusy(true);
33
+ setError(null);
34
+ try {
35
+ await onConfirm();
36
+ onOpenChange(false);
37
+ } catch (err) {
38
+ setError(err instanceof Error ? err.message : String(err));
39
+ setBusy(false);
40
+ }
41
+ }
42
+ return /* @__PURE__ */ jsx(Dialog.Root, {
43
+ open,
44
+ onOpenChange: (next) => {
45
+ if (!next && !busy) onOpenChange(false);
46
+ },
47
+ children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-chocolate/35 backdrop-blur-[2px] data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" }), /* @__PURE__ */ jsxs(Dialog.Content, {
48
+ className: "fixed left-1/2 top-1/2 z-50 grid w-[calc(100%-2rem)] max-w-md -translate-x-1/2 -translate-y-1/2 gap-4 rounded-[16px] border border-frost bg-snow p-5 text-chocolate shadow-baziu-lg outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
49
+ onCloseAutoFocus: (event) => {
50
+ event.preventDefault();
51
+ const target = focusRestoreTargetRef.current;
52
+ focusRestoreTargetRef.current = null;
53
+ restoreDialogFocus(target, document);
54
+ },
55
+ onEscapeKeyDown: (event) => {
56
+ if (busy) event.preventDefault();
57
+ },
58
+ onPointerDownOutside: (event) => {
59
+ if (busy) event.preventDefault();
60
+ },
61
+ children: [
62
+ /* @__PURE__ */ jsxs("div", {
63
+ className: "flex flex-col gap-2",
64
+ children: [/* @__PURE__ */ jsx(Dialog.Title, {
65
+ className: "font-serif text-xl text-chocolate",
66
+ children: title
67
+ }), /* @__PURE__ */ jsx(Dialog.Description, {
68
+ asChild: true,
69
+ children: /* @__PURE__ */ jsx("div", {
70
+ className: "text-sm leading-6 text-mocha",
71
+ children: description
72
+ })
73
+ })]
74
+ }),
75
+ error && /* @__PURE__ */ jsx("p", {
76
+ role: "alert",
77
+ className: "rounded-md bg-danger/10 px-3 py-2 text-sm text-danger",
78
+ children: error
79
+ }),
80
+ /* @__PURE__ */ jsxs("div", {
81
+ className: "flex flex-col-reverse gap-2 border-t border-frost pt-4 sm:flex-row sm:justify-end",
82
+ children: [/* @__PURE__ */ jsx(Button, {
83
+ variant: "ghost",
84
+ disabled: busy,
85
+ onClick: () => onOpenChange(false),
86
+ children: "cancel"
87
+ }), /* @__PURE__ */ jsx(Button, {
88
+ variant: confirmVariant,
89
+ disabled: busy,
90
+ onClick: () => void confirm(),
91
+ children: busy ? "working…" : confirmLabel
92
+ })]
93
+ })
94
+ ]
95
+ })] })
96
+ });
97
+ }
98
+ //#endregion
99
+ export { ConfirmDialog as t };
@@ -0,0 +1,160 @@
1
+ import { t as Button } from "./Button-Dsnw22OF.js";
2
+ import { t as ConfirmDialog } from "./ConfirmDialog-C-MPYYSU.js";
3
+ import { useId, useState } from "react";
4
+ import { useRouter } from "@tanstack/react-router";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/FieldRow.tsx
7
+ function FieldRow({ field }) {
8
+ const router = useRouter();
9
+ const inputId = useId();
10
+ const descriptionId = `${inputId}-description`;
11
+ const [value, setValue] = useState(field.kind === "config" ? field.value ?? "" : "");
12
+ const [busy, setBusy] = useState(false);
13
+ const [err, setErr] = useState(null);
14
+ const [savedAt, setSavedAt] = useState(null);
15
+ const [confirmRemove, setConfirmRemove] = useState(false);
16
+ const secretBlank = field.kind === "secret" && value.trim().length === 0;
17
+ async function save(e) {
18
+ e.preventDefault();
19
+ if (secretBlank) {
20
+ setErr(field.set ? "Paste a replacement value, or use remove credential to explicitly clear the stored secret." : "A secret value is required.");
21
+ return;
22
+ }
23
+ setBusy(true);
24
+ setErr(null);
25
+ try {
26
+ const res = await fetch(`/api/config/fields/${encodeURIComponent(field.envVar)}`, {
27
+ method: "PUT",
28
+ headers: { "content-type": "application/json" },
29
+ body: JSON.stringify({ value })
30
+ });
31
+ if (!res.ok) {
32
+ const j = await res.json().catch(() => ({}));
33
+ throw new Error(j.error ?? `${res.status} ${res.statusText}`);
34
+ }
35
+ setSavedAt(Date.now());
36
+ if (field.kind === "secret") setValue("");
37
+ await router.invalidate();
38
+ } catch (e) {
39
+ setErr(e.message);
40
+ } finally {
41
+ setBusy(false);
42
+ }
43
+ }
44
+ async function removeSecret() {
45
+ const res = await fetch(`/api/config/fields/${encodeURIComponent(field.envVar)}`, { method: "DELETE" });
46
+ if (!res.ok && res.status !== 204) {
47
+ const body = await res.json().catch(() => null);
48
+ throw new Error(body?.error ?? `${res.status} ${res.statusText}`);
49
+ }
50
+ setValue("");
51
+ setErr(null);
52
+ setSavedAt(Date.now());
53
+ await router.invalidate();
54
+ }
55
+ return /* @__PURE__ */ jsxs("form", {
56
+ onSubmit: save,
57
+ className: "grid grid-cols-1 gap-2 border-b py-3 last:border-0 md:grid-cols-[12rem_minmax(0,1fr)_auto_auto] md:items-center",
58
+ children: [
59
+ /* @__PURE__ */ jsxs("div", {
60
+ className: "min-w-0",
61
+ children: [
62
+ /* @__PURE__ */ jsx("label", {
63
+ htmlFor: inputId,
64
+ className: "text-sm font-medium text-foreground",
65
+ children: field.label
66
+ }),
67
+ field.description && /* @__PURE__ */ jsx("div", {
68
+ id: descriptionId,
69
+ className: "text-xs text-muted-foreground mt-0.5",
70
+ children: field.description
71
+ }),
72
+ /* @__PURE__ */ jsxs("details", {
73
+ className: "mt-1 text-xs text-muted-foreground",
74
+ children: [/* @__PURE__ */ jsx("summary", {
75
+ className: "cursor-pointer",
76
+ children: "Advanced identifier"
77
+ }), /* @__PURE__ */ jsx("code", {
78
+ className: "mt-1 inline-block break-all font-mono",
79
+ children: field.envVar
80
+ })]
81
+ })
82
+ ]
83
+ }),
84
+ /* @__PURE__ */ jsx("div", {
85
+ className: "min-w-0",
86
+ children: field.kind === "config" ? /* @__PURE__ */ jsx("input", {
87
+ id: inputId,
88
+ type: "text",
89
+ "aria-describedby": field.description ? descriptionId : void 0,
90
+ value,
91
+ onChange: (e) => setValue(e.target.value),
92
+ placeholder: field.placeholder ?? "",
93
+ className: "w-full rounded-md border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-ring/30"
94
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("input", {
95
+ id: inputId,
96
+ type: "password",
97
+ "aria-describedby": field.description ? descriptionId : void 0,
98
+ value,
99
+ onChange: (e) => setValue(e.target.value),
100
+ placeholder: field.set ? "(paste to replace stored value)" : field.placeholder ?? "paste key…",
101
+ autoComplete: "off",
102
+ className: "w-full rounded-md border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-ring/30"
103
+ }), field.set && /* @__PURE__ */ jsx("p", {
104
+ className: "mt-1 text-xs text-muted-foreground",
105
+ children: "Blank keeps the current credential. Removal is a separate explicit action."
106
+ })] })
107
+ }),
108
+ /* @__PURE__ */ jsxs("span", {
109
+ className: "text-xs",
110
+ children: [field.kind === "secret" && field.set && /* @__PURE__ */ jsx("span", {
111
+ className: "rounded-full bg-success/10 text-success px-1.5 py-0.5",
112
+ title: `preview: ${field.preview ?? ""}`,
113
+ children: "set"
114
+ }), savedAt && Date.now() - savedAt < 2e3 && /* @__PURE__ */ jsx("span", {
115
+ role: "status",
116
+ className: "text-success ml-2",
117
+ children: "saved ✓"
118
+ })]
119
+ }),
120
+ /* @__PURE__ */ jsxs("div", {
121
+ className: "flex flex-wrap gap-2 md:justify-self-end",
122
+ children: [/* @__PURE__ */ jsx(Button, {
123
+ variant: "ghost",
124
+ type: "submit",
125
+ disabled: busy || secretBlank,
126
+ className: "text-xs",
127
+ children: "save"
128
+ }), field.kind === "secret" && field.set && /* @__PURE__ */ jsx(Button, {
129
+ variant: "danger",
130
+ className: "text-xs",
131
+ onClick: () => setConfirmRemove(true),
132
+ children: "remove"
133
+ })]
134
+ }),
135
+ err && /* @__PURE__ */ jsx("p", {
136
+ role: "alert",
137
+ className: "text-xs text-danger md:col-span-4",
138
+ children: err
139
+ }),
140
+ /* @__PURE__ */ jsx(ConfirmDialog, {
141
+ open: confirmRemove,
142
+ title: `Remove ${field.label}?`,
143
+ description: /* @__PURE__ */ jsxs("p", { children: [
144
+ "This permanently deletes the stored ",
145
+ /* @__PURE__ */ jsx("code", {
146
+ className: "font-mono",
147
+ children: field.envVar
148
+ }),
149
+ " ",
150
+ "credential. Features that use it will fail until you save a replacement."
151
+ ] }),
152
+ confirmLabel: "remove stored credential",
153
+ onConfirm: removeSecret,
154
+ onOpenChange: setConfirmRemove
155
+ })
156
+ ]
157
+ });
158
+ }
159
+ //#endregion
160
+ export { FieldRow as t };
@@ -1,11 +1,5 @@
1
+ import { t as cn } from "./utils-C_uf36nf.js";
1
2
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { clsx } from "clsx";
3
- import { twMerge } from "tailwind-merge";
4
- //#region src/lib/utils.ts
5
- function cn(...inputs) {
6
- return twMerge(clsx(inputs));
7
- }
8
- //#endregion
9
3
  //#region src/components/Page.tsx
10
4
  var PAGE_SIZE_CLASS = {
11
5
  narrow: "max-w-3xl",
@@ -14,7 +8,7 @@ var PAGE_SIZE_CLASS = {
14
8
  };
15
9
  function PageShell({ size = "default", className, ...props }) {
16
10
  return /* @__PURE__ */ jsx("div", {
17
- className: cn("mx-auto w-full space-y-6", PAGE_SIZE_CLASS[size], className),
11
+ className: cn("mx-auto min-w-0 w-full space-y-6", PAGE_SIZE_CLASS[size], className),
18
12
  ...props
19
13
  });
20
14
  }
@@ -47,7 +41,7 @@ function PageHeader({ eyebrow, title, description, actions, className, ...props
47
41
  function SectionCard({ title, description, actions, children, className, ...props }) {
48
42
  const hasHeader = title || description || actions;
49
43
  return /* @__PURE__ */ jsxs("section", {
50
- className: cn("rounded-2xl border border-border bg-card p-5 text-card-foreground shadow-baziu-sm sm:p-6", className),
44
+ className: cn("min-w-0 rounded-2xl border border-border bg-card p-5 text-card-foreground shadow-baziu-sm sm:p-6", className),
51
45
  ...props,
52
46
  children: [hasHeader && /* @__PURE__ */ jsxs("div", {
53
47
  className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
@@ -108,4 +102,4 @@ function StatusBadge({ variant = "neutral", className, ...props }) {
108
102
  });
109
103
  }
110
104
  //#endregion
111
- export { StatusBadge as a, SectionCard as i, PageHeader as n, cn as o, PageShell as r, EmptyState as t };
105
+ export { StatusBadge as a, SectionCard as i, PageHeader as n, PageShell as r, EmptyState as t };
@@ -1,7 +1,9 @@
1
1
  import { t as Button } from "./Button-Dsnw22OF.js";
2
+ import { t as ConfirmDialog } from "./ConfirmDialog-C-MPYYSU.js";
3
+ import { t as UnsavedChangesGuard } from "./UnsavedChangesGuard-CiStXyBI.js";
2
4
  import { a as applyProfileDefaults, c as endpointFromKey, d as hasTeamPolicyEdge, f as isValidTeamPolicyConnection, i as addTeamPolicyEdge, l as endpointKey, n as OUTSIDE_GROUP_ENDPOINT, o as createPresetPolicy, p as removeTeamPolicyEdge, r as USER_ENDPOINT, s as endpointForMember, u as findTeamPolicyMember } from "./team-policy-vPG01onj.js";
3
5
  import { useEffect, useMemo, useState } from "react";
4
- import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
7
  import { AlertTriangle, Bot, Check, CircleAlert, CircleUserRound, Globe2, ListTree, Minus, Plus, Save, ShieldAlert, TableProperties, X } from "lucide-react";
6
8
  import { Background, BackgroundVariant, Controls, Handle, MarkerType, MiniMap, Position, ReactFlow, useNodesState } from "@xyflow/react";
7
9
  //#region src/lib/canonical-team.ts
@@ -465,7 +467,7 @@ function TeamPolicyMatrix({ teamPolicy, selectedId, onSelect, onToggle }) {
465
467
  className: `mx-auto flex h-9 w-9 items-center justify-center rounded-md border transition-colors ${allowed ? "border-sapphire bg-sapphire text-snow hover:bg-sapphire-deep" : "border-frost bg-ivory text-mocha-light hover:border-rose-baziu hover:text-rose-baziu"}`,
466
468
  children: allowed ? /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
467
469
  }) : /* @__PURE__ */ jsx("span", {
468
- className: "mx-auto flex h-9 w-9 items-center justify-center text-fawn",
470
+ className: "mx-auto flex h-9 w-9 items-center justify-center text-mocha-light",
469
471
  title: "Not a valid communication path",
470
472
  children: /* @__PURE__ */ jsx(Minus, { className: "h-4 w-4" })
471
473
  })
@@ -491,15 +493,8 @@ function ProductionTeamPolicyEditor({ source, profiles, initialUi }) {
491
493
  const [saving, setSaving] = useState(false);
492
494
  const [notice, setNotice] = useState(null);
493
495
  const [conflict, setConflict] = useState(null);
496
+ const [confirmDiscard, setConfirmDiscard] = useState(false);
494
497
  const dirty = !sameDocument(server, draft);
495
- useEffect(() => {
496
- const warn = (event) => {
497
- if (!dirty) return;
498
- event.preventDefault();
499
- };
500
- window.addEventListener("beforeunload", warn);
501
- return () => window.removeEventListener("beforeunload", warn);
502
- }, [dirty]);
503
498
  const mutateEdge = (from, to, allowed) => {
504
499
  if (!isValidTeamPolicyConnection(from, to)) return;
505
500
  setDraft((current) => ({
@@ -577,120 +572,142 @@ function ProductionTeamPolicyEditor({ source, profiles, initialUi }) {
577
572
  const selected = selectedId ? endpointFromKey(selectedId) : null;
578
573
  const selectedMember = selected ? draft.members.find((member) => endpointKey(endpointForMember(draft, member)) === selectedId) : void 0;
579
574
  const incomplete = new Set(draft.members.filter((member) => !profiles.some((profile) => profile.id === member.profileId)).map((member) => member.slotId));
580
- return /* @__PURE__ */ jsxs("section", {
581
- className: "overflow-hidden rounded-lg border border-frost bg-snow",
582
- "aria-label": "Production policy editor",
583
- children: [
584
- /* @__PURE__ */ jsxs("header", {
585
- className: "flex flex-wrap items-center gap-2 border-b border-frost bg-cream p-3",
586
- children: [
587
- /* @__PURE__ */ jsxs("div", {
588
- className: "mr-auto min-w-0",
589
- children: [/* @__PURE__ */ jsxs("div", {
590
- className: "flex items-center gap-2",
591
- children: [/* @__PURE__ */ jsx("h2", {
592
- className: "m-0 truncate text-lg",
593
- children: draft.name
594
- }), /* @__PURE__ */ jsx("span", {
595
- className: dirty ? "rounded bg-warning/10 px-2 py-0.5 text-xs text-warning" : "rounded bg-sapphire-glow px-2 py-0.5 text-xs text-sapphire-deep",
596
- children: dirty ? "Unsaved draft" : `Effective · revision ${revision}`
575
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
576
+ /* @__PURE__ */ jsx(UnsavedChangesGuard, {
577
+ when: dirty,
578
+ subject: "Team policy draft"
579
+ }),
580
+ /* @__PURE__ */ jsxs("section", {
581
+ className: "overflow-hidden rounded-lg border border-frost bg-snow",
582
+ "aria-label": "Production policy editor",
583
+ children: [
584
+ /* @__PURE__ */ jsxs("header", {
585
+ className: "flex flex-wrap items-center gap-2 border-b border-frost bg-cream p-3",
586
+ children: [
587
+ /* @__PURE__ */ jsxs("div", {
588
+ className: "mr-auto min-w-0",
589
+ children: [/* @__PURE__ */ jsxs("div", {
590
+ className: "flex items-center gap-2",
591
+ children: [/* @__PURE__ */ jsx("h2", {
592
+ className: "m-0 truncate text-lg",
593
+ children: draft.name
594
+ }), /* @__PURE__ */ jsx("span", {
595
+ className: dirty ? "rounded bg-warning/10 px-2 py-0.5 text-xs text-warning" : "rounded bg-sapphire-glow px-2 py-0.5 text-xs text-sapphire-deep",
596
+ children: dirty ? "Unsaved draft" : `Effective · revision ${revision}`
597
+ })]
598
+ }), /* @__PURE__ */ jsx("p", {
599
+ className: "muted m-0 text-xs",
600
+ children: source.kind === "template" ? "Stable Team slot policy" : "One effective live Team policy"
597
601
  })]
598
- }), /* @__PURE__ */ jsx("p", {
599
- className: "muted m-0 text-xs",
600
- children: source.kind === "template" ? "Stable Team slot policy" : "One effective live Team policy"
601
- })]
602
- }),
603
- /* @__PURE__ */ jsxs("div", {
604
- className: "flex rounded-md border border-frost bg-ivory p-0.5",
605
- "aria-label": "Policy projection",
606
- children: [/* @__PURE__ */ jsx(Projection, {
607
- active: view === "flow",
608
- label: "Flow",
609
- icon: /* @__PURE__ */ jsx(ListTree, { className: "h-4 w-4" }),
610
- onClick: () => setView("flow")
611
- }), /* @__PURE__ */ jsx(Projection, {
612
- active: view === "matrix",
613
- label: "Matrix",
614
- icon: /* @__PURE__ */ jsx(TableProperties, { className: "h-4 w-4" }),
615
- onClick: () => setView("matrix")
616
- })]
617
- }),
618
- /* @__PURE__ */ jsx(Button, {
619
- variant: "ghost",
620
- disabled: !dirty || saving,
621
- onClick: () => setDraft(server),
622
- children: "Discard"
623
- }),
624
- /* @__PURE__ */ jsxs(Button, {
625
- variant: "primary",
626
- disabled: !dirty || saving || source.kind === "template" && !!source.detail.template.deletedAt,
627
- onClick: save,
628
- children: [
629
- /* @__PURE__ */ jsx(Save, { className: "h-4 w-4" }),
630
- " ",
631
- saving ? "Saving…" : "Save effective policy"
632
- ]
633
- })
634
- ]
635
- }),
636
- notice && /* @__PURE__ */ jsx("div", {
637
- role: "status",
638
- className: "border-b border-frost bg-ivory px-4 py-2 text-sm",
639
- children: notice
640
- }),
641
- conflict && /* @__PURE__ */ jsx(ConflictBanner, {
642
- draft,
643
- server: conflict,
644
- onReload: () => {
645
- setDraft(conflict);
646
- setConflict(null);
647
- },
648
- onReapply: () => setConflict(null)
649
- }),
650
- /* @__PURE__ */ jsxs("div", {
651
- className: "grid min-h-[620px] grid-cols-1 lg:grid-cols-[minmax(0,1fr)_280px]",
652
- children: [/* @__PURE__ */ jsx("div", {
653
- className: "min-h-[480px] overflow-hidden",
654
- children: view === "flow" ? /* @__PURE__ */ jsx(TeamPolicyFlow, {
655
- teamPolicy: draft,
656
- selectedId,
657
- viewport,
658
- incompleteSlotIds: incomplete,
659
- simulatedPath: null,
660
- onSelect: setSelectedId,
661
- onConnect: (a, b) => mutateEdge(a, b, true),
662
- onRemoveEdge: (a, b) => mutateEdge(a, b, false),
663
- onMoveMember: (slotId, position) => setDraft((current) => ({
664
- ...current,
665
- members: current.members.map((m) => m.slotId === slotId ? {
666
- ...m,
667
- position
668
- } : m)
669
- })),
670
- onViewportChange: setViewport,
671
- onOpenMember: (member) => source.kind === "live" && member.agentId ? window.location.assign(`/agents/${encodeURIComponent(member.agentId)}?teamPolicy=${encodeURIComponent(source.teamId)}&view=${view}&selected=${encodeURIComponent(selectedId ?? "")}&vx=${viewport.x}&vy=${viewport.y}&vz=${viewport.zoom}`) : setSelectedId(endpointKey(endpointForMember(draft, member)))
672
- }) : /* @__PURE__ */ jsx(TeamPolicyMatrix, {
673
- teamPolicy: draft,
674
- selectedId,
675
- onSelect: setSelectedId,
676
- onToggle: mutateEdge
677
- })
678
- }), /* @__PURE__ */ jsx("aside", {
679
- className: "border-t border-frost p-4 lg:border-l lg:border-t-0",
680
- children: /* @__PURE__ */ jsx(Inspector, {
681
- document: draft,
682
- selected,
683
- selectedMember,
684
- profiles,
685
- source,
686
- onDraft: setDraft,
687
- onToggle: mutateEdge,
688
- onPosture: setEdgePosture
689
- })
690
- })]
691
- })
692
- ]
693
- });
602
+ }),
603
+ /* @__PURE__ */ jsxs("div", {
604
+ className: "flex rounded-md border border-frost bg-ivory p-0.5",
605
+ "aria-label": "Policy projection",
606
+ children: [/* @__PURE__ */ jsx(Projection, {
607
+ active: view === "flow",
608
+ label: "Flow",
609
+ icon: /* @__PURE__ */ jsx(ListTree, { className: "h-4 w-4" }),
610
+ onClick: () => setView("flow")
611
+ }), /* @__PURE__ */ jsx(Projection, {
612
+ active: view === "matrix",
613
+ label: "Matrix",
614
+ icon: /* @__PURE__ */ jsx(TableProperties, { className: "h-4 w-4" }),
615
+ onClick: () => setView("matrix")
616
+ })]
617
+ }),
618
+ /* @__PURE__ */ jsx(Button, {
619
+ variant: "ghost",
620
+ disabled: !dirty || saving,
621
+ onClick: () => setConfirmDiscard(true),
622
+ children: "Discard"
623
+ }),
624
+ /* @__PURE__ */ jsxs(Button, {
625
+ variant: "primary",
626
+ disabled: !dirty || saving || source.kind === "template" && !!source.detail.template.deletedAt,
627
+ onClick: save,
628
+ children: [
629
+ /* @__PURE__ */ jsx(Save, { className: "h-4 w-4" }),
630
+ " ",
631
+ saving ? "Saving…" : "Save effective policy"
632
+ ]
633
+ })
634
+ ]
635
+ }),
636
+ notice && /* @__PURE__ */ jsx("div", {
637
+ role: "status",
638
+ className: "border-b border-frost bg-ivory px-4 py-2 text-sm",
639
+ children: notice
640
+ }),
641
+ conflict && /* @__PURE__ */ jsx(ConflictBanner, {
642
+ draft,
643
+ server: conflict,
644
+ onReload: () => {
645
+ setDraft(conflict);
646
+ setConflict(null);
647
+ },
648
+ onReapply: () => setConflict(null)
649
+ }),
650
+ /* @__PURE__ */ jsxs("div", {
651
+ className: "grid min-h-[620px] grid-cols-1 lg:grid-cols-[minmax(0,1fr)_280px]",
652
+ children: [/* @__PURE__ */ jsx("div", {
653
+ className: "min-h-[480px] overflow-hidden",
654
+ children: view === "flow" ? /* @__PURE__ */ jsx(TeamPolicyFlow, {
655
+ teamPolicy: draft,
656
+ selectedId,
657
+ viewport,
658
+ incompleteSlotIds: incomplete,
659
+ simulatedPath: null,
660
+ onSelect: setSelectedId,
661
+ onConnect: (a, b) => mutateEdge(a, b, true),
662
+ onRemoveEdge: (a, b) => mutateEdge(a, b, false),
663
+ onMoveMember: (slotId, position) => setDraft((current) => ({
664
+ ...current,
665
+ members: current.members.map((m) => m.slotId === slotId ? {
666
+ ...m,
667
+ position
668
+ } : m)
669
+ })),
670
+ onViewportChange: setViewport,
671
+ onOpenMember: (member) => source.kind === "live" && member.agentId ? window.location.assign(`/agents/${encodeURIComponent(member.agentId)}?teamPolicy=${encodeURIComponent(source.teamId)}&view=${view}&selected=${encodeURIComponent(selectedId ?? "")}&vx=${viewport.x}&vy=${viewport.y}&vz=${viewport.zoom}`) : setSelectedId(endpointKey(endpointForMember(draft, member)))
672
+ }) : /* @__PURE__ */ jsx(TeamPolicyMatrix, {
673
+ teamPolicy: draft,
674
+ selectedId,
675
+ onSelect: setSelectedId,
676
+ onToggle: mutateEdge
677
+ })
678
+ }), /* @__PURE__ */ jsx("aside", {
679
+ className: "border-t border-frost p-4 lg:border-l lg:border-t-0",
680
+ children: /* @__PURE__ */ jsx(Inspector, {
681
+ document: draft,
682
+ selected,
683
+ selectedMember,
684
+ profiles,
685
+ source,
686
+ onDraft: setDraft,
687
+ onToggle: mutateEdge,
688
+ onPosture: setEdgePosture
689
+ })
690
+ })]
691
+ })
692
+ ]
693
+ }),
694
+ /* @__PURE__ */ jsx(ConfirmDialog, {
695
+ open: confirmDiscard,
696
+ title: "Discard this Team policy draft?",
697
+ description: /* @__PURE__ */ jsxs("p", { children: [
698
+ "This permanently discards every unsaved edge, posture, member, and layout change in the draft. Effective revision ",
699
+ revision,
700
+ " will remain unchanged."
701
+ ] }),
702
+ confirmLabel: "discard policy draft",
703
+ onConfirm: () => {
704
+ setDraft(server);
705
+ setConflict(null);
706
+ setNotice("Draft discarded. The effective policy was not changed.");
707
+ },
708
+ onOpenChange: setConfirmDiscard
709
+ })
710
+ ] });
694
711
  }
695
712
  function validSelection(document, selectedId) {
696
713
  if (!selectedId) return null;
@@ -1,8 +1,8 @@
1
- import { o as cn } from "./Page-LENulSXY.js";
1
+ import { t as cn } from "./utils-C_uf36nf.js";
2
2
  //#region src/components/SectionTabs.tsx
3
3
  var SECTION_TABS_CLASS = "mb-6 flex max-w-full gap-1 overflow-x-auto rounded-xl border border-border bg-muted/50 p-1";
4
4
  function sectionTabClass(active) {
5
- return cn("inline-flex items-center whitespace-nowrap rounded-lg border px-3 py-1.5 text-sm font-semibold transition-colors", active ? "border-border bg-card text-foreground shadow-baziu-sm" : "border-transparent text-muted-foreground hover:bg-card/70 hover:text-foreground");
5
+ return cn("inline-flex items-center whitespace-nowrap rounded-lg border px-2 py-1.5 text-xs font-semibold transition-colors sm:px-3 sm:text-sm", active ? "border-border bg-card text-foreground shadow-baziu-sm" : "border-transparent text-muted-foreground hover:bg-card/70 hover:text-foreground");
6
6
  }
7
7
  //#endregion
8
8
  export { sectionTabClass as n, SECTION_TABS_CLASS as t };