bazilion 0.13.0 → 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.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +25 -5
- package/dist/daemon.js.map +1 -1
- package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
- package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
- package/dist/web/client/assets/ConfirmDialog-CyL9A20V.js +1 -0
- package/dist/web/client/assets/FieldRow-D6REbYUa.js +1 -0
- package/dist/web/client/assets/Page-NV96O47A.js +1 -0
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DBKnOezm.js +7 -0
- package/dist/web/client/assets/{ProfileCommunicationEditor-BcSf2Hao.js → ProfileCommunicationEditor-4RK2laqO.js} +1 -1
- package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
- package/dist/web/client/assets/TeamTabs-CdtNEqt4.js +1 -0
- package/dist/web/client/assets/{TemplatesTabs-CyDVzrOl.js → TemplatesTabs-CZyss2Y0.js} +1 -1
- package/dist/web/client/assets/UnsavedChangesGuard-CEoK-ZcN.js +1 -0
- package/dist/web/client/assets/_id-4ZS-w_Aj.js +1 -0
- package/dist/web/client/assets/{_id-DWTMH7Eb.js → _id-DIqtdQij.js} +1 -1
- package/dist/web/client/assets/_id-DbcC2E7F.js +1 -0
- package/dist/web/client/assets/_id-f_r5M0p3.js +1 -0
- package/dist/web/client/assets/activity-CB9Ufth-.js +1 -0
- package/dist/web/client/assets/agents-D-JGXVg9.js +1 -0
- package/dist/web/client/assets/agents-DS2XafoA.js +1 -0
- package/dist/web/client/assets/approvals-Cke_mrJv.js +1 -0
- package/dist/web/client/assets/attention-PYwRM2wC.js +1 -0
- package/dist/web/client/assets/chevron-right-BG4OeFRQ.js +1 -0
- package/dist/web/client/assets/config-DF9Gqmfa.js +3 -0
- package/dist/web/client/assets/{inbox-D2NypLee.js → inbox-DC_HdOfI.js} +1 -1
- package/dist/web/client/assets/index-Cp6UHWr2.js +52 -0
- package/dist/web/client/assets/learning-BfrQ4YZY.js +1 -0
- package/dist/web/client/assets/login-D4n3AcBR.js +1 -0
- package/dist/web/client/assets/mcp-CnjQc_JJ.js +1 -0
- package/dist/web/client/assets/members-wxsVTJdW.js +1 -0
- package/dist/web/client/assets/memory-Du60O3pE.js +1 -0
- package/dist/web/client/assets/{policy-CHM95pMU.js → policy-BOfnkJsL.js} +1 -1
- package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
- package/dist/web/client/assets/routes-B9CuhzUW.js +1 -0
- package/dist/web/client/assets/services-DyvqJqM2.js +1 -0
- package/dist/web/client/assets/skills-DQo7ioW7.js +1 -0
- package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
- package/dist/web/client/assets/{teams-Dm_huGxn.js → teams-DPggy97H.js} +1 -1
- package/dist/web/client/assets/teams-DdawcfNR.js +1 -0
- package/dist/web/client/assets/telegram-DcTeDpP5.js +1 -0
- package/dist/web/client/assets/tokens-CIEKwZXc.js +1 -0
- package/dist/web/client/assets/triggers-Bc2RrUPm.js +1 -0
- package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
- package/dist/web/client/assets/welcome-DlhNXUIa.js +1 -0
- package/dist/web/client/assets/wire-constants-BzdHSc6A.js +74 -0
- package/dist/web/client/assets/x-DAXGIe_Q.js +1 -0
- package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
- package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
- package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
- package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
- package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
- package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
- package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
- package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
- package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
- package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
- package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
- package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
- package/dist/web/server/assets/{_id-xTD_6ApX.js → _id-BAA9KJBU.js} +1 -1
- package/dist/web/server/assets/{_id-BQ2zoMiR.js → _id-BM5m2FLT.js} +4 -4
- package/dist/web/server/assets/{_id-BENqNBfK.js → _id-BYKpT2Tu.js} +1 -2
- package/dist/web/server/assets/{_id-BreRHYV2.js → _id-BeKhPKw3.js} +350 -185
- package/dist/web/server/assets/{_id-CPIXIqyO.js → _id-BqWTB8Wl.js} +188 -86
- package/dist/web/server/assets/{_id-DkrNqqTw.js → _id-BwvCtzlD.js} +1 -1
- package/dist/web/server/assets/{_id-BZWunvy7.js → _id-DYU6uIBx.js} +0 -1
- package/dist/web/server/assets/{_id-BFELaMIN.js → _id-ndxFHx0t.js} +75 -71
- package/dist/web/server/assets/{_id-CvYqVJPU.js → _id-sNu5aXZt.js} +2 -1
- package/dist/web/server/assets/{_tanstack-start-manifest_v-COkJjXt_.js → _tanstack-start-manifest_v-C-OiOZeM.js} +110 -87
- package/dist/web/server/assets/{activity-B6N1T_5N.js → activity-BWv1goK6.js} +3 -3
- package/dist/web/server/assets/{activity-BazZNfvf.js → activity-LjpblbDL.js} +1 -1
- package/dist/web/server/assets/{agents-BpSeOA30.js → agents-BDFGrU3o.js} +1 -1
- package/dist/web/server/assets/{agents-DY630p6x.js → agents-CJk4pxKu.js} +1 -1
- package/dist/web/server/assets/{agents-wSYNPuyK.js → agents-CYw1xHoY.js} +138 -16
- package/dist/web/server/assets/{agents-DfoLnTyD.js → agents-DfNKc_Q7.js} +52 -8
- package/dist/web/server/assets/{approvals-BkUGmYU9.js → approvals-7JOoBchn.js} +1 -1
- package/dist/web/server/assets/{approvals-BYajNOdE.js → approvals-Bz123liE.js} +59 -21
- package/dist/web/server/assets/{attention-Bw_wiiqI.js → attention-B35JvhOL.js} +1 -1
- package/dist/web/server/assets/{attention-Z3bGuxOD.js → attention-C1pPWSXw.js} +3 -3
- package/dist/web/server/assets/{config-wYtIhkRm.js → config-BlMkHStx.js} +1 -1
- package/dist/web/server/assets/config-ExacOzHX.js +958 -0
- package/dist/web/server/assets/{inbox-DTTfSuGU.js → inbox-RweGCV3D.js} +3 -3
- package/dist/web/server/assets/{inbox-0iiSg-Y1.js → inbox-cu3jLzNP.js} +1 -1
- package/dist/web/server/assets/{learning-DpyLNVe8.js → learning-BaKM6qaw.js} +1 -1
- package/dist/web/server/assets/{learning-fG8316uc.js → learning-CbtNlqYo.js} +76 -23
- package/dist/web/server/assets/{login-D_GDeTrB.js → login-BNj3U6ok.js} +21 -11
- package/dist/web/server/assets/{login-CrFVVUaE.js → login-Be8eP4Jp.js} +2 -2
- package/dist/web/server/assets/{mcp-BQtp2T87.js → mcp-B0goWO8Q.js} +1 -1
- package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
- package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
- package/dist/web/server/assets/{members-DXu2oAS_.js → members-DiYtr-zm.js} +1 -1
- package/dist/web/server/assets/{memory-C6fX_FKI.js → memory-CkXUgf5s.js} +150 -48
- package/dist/web/server/assets/{memory-Iq2M0-Yc.js → memory-DTFEmfF3.js} +1 -1
- package/dist/web/server/assets/{policy-D7kj3Cy7.js → policy-BddK4xom.js} +1 -1
- package/dist/web/server/assets/{policy-Bg6u-rTq.js → policy-Bvvav8fh.js} +4 -4
- package/dist/web/server/assets/{router-D-6TzLRZ.js → router-pjH2t8Rl.js} +345 -172
- package/dist/web/server/assets/{routes-CiPfEldd.js → routes-BgHisAxH.js} +22 -5
- package/dist/web/server/assets/{routes-CNRzy79H.js → routes-COtkyZG1.js} +1 -1
- package/dist/web/server/assets/{routes-D933ngZS.js → routes-DAU2g7Uz.js} +1 -1
- package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
- package/dist/web/server/assets/{services-OB4LAr2A.js → services-DgoU1udp.js} +1 -1
- package/dist/web/server/assets/{skills-Babb9jsQ.js → skills-CYih9TJw.js} +47 -6
- package/dist/web/server/assets/{skills-D5DQL8bM.js → skills-Dw3cI3si.js} +1 -1
- package/dist/web/server/assets/{start-uKQNK6if.js → start-D4Wq9iTa.js} +1 -1
- package/dist/web/server/assets/{teams-Dz6ZEMRo.js → teams-BJuoNOTB.js} +1 -1
- package/dist/web/server/assets/{teams-Bk6ZT0MD.js → teams-DF3RViAg.js} +3 -3
- package/dist/web/server/assets/{teams-DqC4wZxu.js → teams-DFnuc660.js} +1 -1
- package/dist/web/server/assets/{teams-Cc2Czynq.js → teams-TV6nbEN_.js} +101 -10
- package/dist/web/server/assets/{telegram-J4T0XhwQ.js → telegram-DbOFpTFm.js} +1 -1
- package/dist/web/server/assets/{telegram-DUbDIVGX.js → telegram-Dj4Wwhd6.js} +147 -47
- package/dist/web/server/assets/{tokens-CJM_0NDa.js → tokens-DDwtO15P.js} +88 -19
- package/dist/web/server/assets/{tokens-DO5BzNOn.js → tokens-_2hptHP6.js} +1 -1
- package/dist/web/server/assets/{triggers-BdBx-HwR.js → triggers-BvjYNmmY.js} +1 -1
- package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
- package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
- package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
- package/dist/web/server/server.js +5 -9
- package/package.json +3 -3
- package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
- package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
- package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
- package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DdpYInwV.js +0 -7
- package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
- package/dist/web/client/assets/TeamTabs-Bk89JfN7.js +0 -1
- package/dist/web/client/assets/_id-CAJTTnee.js +0 -1
- package/dist/web/client/assets/_id-CN6jPaBu.js +0 -1
- package/dist/web/client/assets/_id-DGwJqqDc.js +0 -1
- package/dist/web/client/assets/activity-DK_M0-bn.js +0 -1
- package/dist/web/client/assets/agents-B-i5pASm.js +0 -1
- package/dist/web/client/assets/agents-n8U7qNxw.js +0 -1
- package/dist/web/client/assets/approvals-CmVxCy0Z.js +0 -1
- package/dist/web/client/assets/attention-F0lUQCWE.js +0 -1
- package/dist/web/client/assets/chevron-down-OndG7r1U.js +0 -1
- package/dist/web/client/assets/config-DuApZ9xS.js +0 -3
- package/dist/web/client/assets/context-C1sMnW6K.js +0 -1
- package/dist/web/client/assets/index-B3vdrEEg.js +0 -12
- package/dist/web/client/assets/learning-zYDCfVxT.js +0 -1
- package/dist/web/client/assets/login-B1Un51Zx.js +0 -1
- package/dist/web/client/assets/mcp-DSVmJBdv.js +0 -1
- package/dist/web/client/assets/members-Pl7hXJcN.js +0 -1
- package/dist/web/client/assets/memory-Co3BEaAq.js +0 -1
- package/dist/web/client/assets/plus-Dor-_wmL.js +0 -1
- package/dist/web/client/assets/routes-D29qjwG0.js +0 -1
- package/dist/web/client/assets/services-CCQ_6YWQ.js +0 -1
- package/dist/web/client/assets/skills-3xAIvzvP.js +0 -1
- package/dist/web/client/assets/styles-D6RPN7RK.css +0 -2
- package/dist/web/client/assets/teams-UGLyjHYj.js +0 -1
- package/dist/web/client/assets/telegram-3KvrJVO6.js +0 -1
- package/dist/web/client/assets/tokens-DUSFmV5_.js +0 -1
- package/dist/web/client/assets/triggers-DlQ2KF1h.js +0 -1
- package/dist/web/client/assets/welcome-DkP8qzK1.js +0 -1
- package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
- package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
- package/dist/web/server/assets/config-DGzM28F_.js +0 -554
- package/dist/web/server/assets/context-BkDDwbby.js +0 -12
- package/dist/web/server/assets/context-DMc0KyHh.js +0 -12
- package/dist/web/server/assets/context-poimKI7w.js +0 -47
- package/dist/web/server/assets/mcp-DlgXUcAS.js +0 -261
- package/dist/web/server/assets/members-CteHKPSF.js +0 -46
- package/dist/web/server/assets/services-DJRA1A0-.js +0 -79
- package/dist/web/server/assets/triggers-B87fycBl.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,
|
|
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-
|
|
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(
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
className:
|
|
596
|
-
children:
|
|
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
|
-
}),
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
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 {
|
|
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-
|
|
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 };
|