@burdenoff/microfe-botmanor 2026.1025.3 → 2026.1027.1

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.
@@ -7,17 +7,18 @@ import { Badge as ee, StatusBadge as te } from "../components/Badge.js";
7
7
  import { isNative as l, nativeImpact as ne, nativeNotify as u } from "../../utils/nativeBridge.js";
8
8
  import { EmptyState as re } from "../components/EmptyState.js";
9
9
  import { FormField as d, Input as f, Textarea as p } from "../components/Input.js";
10
- import { useCreatePolicy as ie, useDeletePolicy as ae, usePolicy as oe, useUpdatePolicy as se } from "../hooks/usePolicies.js";
11
- import { toUnion as m } from "../utils/unions.js";
10
+ import { useCreatePolicy as m, useDeletePolicy as ie, usePolicy as ae, useUpdatePolicy as oe } from "../hooks/usePolicies.js";
11
+ import { toUnion as h } from "../utils/unions.js";
12
12
  import "../hooks/index.js";
13
- import { useState as h } from "react";
14
- import { PagePurpose as ce } from "@burdenoff/fe-libs/ui";
15
- import { Fragment as le, jsx as g, jsxs as _ } from "react/jsx-runtime";
16
- import { useParams as ue } from "react-router";
17
- import { AlertTriangle as v, ArrowLeft as de, Clock as y, Database as b, DollarSign as x, Edit as fe, FileText as S, Power as pe, Save as C, Settings as me, Shield as w, Trash2 as T, Wrench as E } from "lucide-react";
18
- import { toast as D } from "sonner";
13
+ import { A2A_TRUST_LEVELS as se, CREATABLE_POLICY_TYPES as ce, EMPTY_POLICY_FORM as le, TOOL_RISK_LEVELS as ue, buildPolicyConfig as de, isCreatablePolicyType as fe, unenforcedConfigKeys as pe } from "../utils/policyConfig.js";
14
+ import { useState as g } from "react";
15
+ import { PagePurpose as me } from "@burdenoff/fe-libs/ui";
16
+ import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
17
+ import { useParams as he } from "react-router";
18
+ import { AlertTriangle as b, ArrowLeft as ge, Clock as x, Database as S, DollarSign as C, Edit as _e, FileText as w, Power as ve, Save as T, Settings as ye, Shield as E, Trash2 as D, Wrench as O } from "lucide-react";
19
+ import { toast as k } from "sonner";
19
20
  //#region src/botlit/pages/PolicyDetailPage.tsx
20
- var O = [
21
+ var be = [
21
22
  "CONTENT",
22
23
  "TOOL",
23
24
  "DATA",
@@ -25,23 +26,19 @@ var O = [
25
26
  "BUDGET",
26
27
  "RATE_LIMIT",
27
28
  "RETENTION"
28
- ], he = [
29
+ ], xe = [
29
30
  "PRIVATE",
30
31
  "WORKSPACE",
31
32
  "PUBLIC"
32
- ];
33
- function k(e) {
34
- return e.split(",").map((e) => e.trim()).filter(Boolean);
35
- }
36
- var A = ({ type: e }) => ({
37
- CONTENT: /* @__PURE__ */ g(v, { size: 18 }),
38
- TOOL: /* @__PURE__ */ g(E, { size: 18 }),
39
- DATA: /* @__PURE__ */ g(b, { size: 18 }),
40
- RESPONSE: /* @__PURE__ */ g(S, { size: 18 }),
41
- BUDGET: /* @__PURE__ */ g(x, { size: 18 }),
42
- RATE_LIMIT: /* @__PURE__ */ g(y, { size: 18 }),
43
- RETENTION: /* @__PURE__ */ g(T, { size: 18 })
44
- })[e] || /* @__PURE__ */ g(w, { size: 18 }), ge = {
33
+ ], A = "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm", j = ({ type: e }) => ({
34
+ CONTENT: /* @__PURE__ */ v(b, { size: 18 }),
35
+ TOOL: /* @__PURE__ */ v(O, { size: 18 }),
36
+ DATA: /* @__PURE__ */ v(S, { size: 18 }),
37
+ RESPONSE: /* @__PURE__ */ v(w, { size: 18 }),
38
+ BUDGET: /* @__PURE__ */ v(C, { size: 18 }),
39
+ RATE_LIMIT: /* @__PURE__ */ v(x, { size: 18 }),
40
+ RETENTION: /* @__PURE__ */ v(D, { size: 18 })
41
+ })[e] || /* @__PURE__ */ v(E, { size: 18 }), M = {
45
42
  CONTENT: "Content Policy",
46
43
  TOOL: "Tool Policy",
47
44
  DATA: "Data Policy",
@@ -49,262 +46,174 @@ var A = ({ type: e }) => ({
49
46
  BUDGET: "Budget Policy",
50
47
  RATE_LIMIT: "Rate Limit Policy",
51
48
  RETENTION: "Retention Policy"
52
- }, j = ({ isNew: b }) => {
53
- let { policyId: j } = ue(), { navigateTo: M } = e(), { data: N, loading: _e, refetch: P } = oe(b ? void 0 : j), { create: ve, loading: ye } = ie(), { update: F, loading: I } = se(), { remove: be, loading: xe } = ae(), [L, R] = h(!1), [Se, z] = h(!1), [B, V] = h({
49
+ }, N = ({ isNew: S }) => {
50
+ let { policyId: N } = he(), { navigateTo: P } = e(), { data: F, loading: Se, refetch: I } = ae(S ? void 0 : N), { create: Ce, loading: we } = m(), { update: L, loading: R } = oe(), { remove: Te, loading: Ee } = ie(), [z, B] = g(!1), [De, V] = g(!1), [H, U] = g({
54
51
  name: "",
55
52
  description: "",
56
53
  type: "CONTENT",
57
54
  visibility: "PRIVATE"
58
- }), [H, U] = h({
59
- jailbreakDetection: !0,
60
- piiDetection: !0,
61
- toxicityThreshold: .7,
62
- customPatterns: ""
63
- }), [W, G] = h({
64
- allowedTools: "",
65
- deniedTools: "",
66
- maxCallsPerExecution: 10,
67
- timeoutSeconds: 30
68
- }), [K, q] = h({
69
- maxTokensPerExecution: 1e4,
70
- maxCostPerExecution: 1,
71
- allowEscalation: !1,
72
- maxModelTier: "gpt-4"
73
- }), [J, Y] = h({
74
- requestsPerMinute: 60,
75
- requestsPerHour: 1e3,
76
- tokensPerMinute: 1e5,
77
- scope: "app"
78
- }), [X, Ce] = h({
79
- allowedModels: "",
80
- allowedProviders: ""
81
- }), [we, Te] = h(!1), [Z, Ee] = h({
82
- executionDataRetentionDays: 90,
83
- payloadSnapshotsEnabled: !0
84
- }), De = async () => {
85
- if (!B.name) return;
86
- let e;
87
- switch (B.type) {
88
- case "CONTENT":
89
- e = {
90
- jailbreakDetection: H.jailbreakDetection,
91
- piiDetection: H.piiDetection,
92
- toxicityThreshold: H.toxicityThreshold,
93
- customPatterns: H.customPatterns.split("\n").filter(Boolean)
94
- };
95
- break;
96
- case "TOOL":
97
- e = {
98
- allowedTools: W.allowedTools.split(",").map((e) => e.trim()).filter(Boolean),
99
- deniedTools: W.deniedTools.split(",").map((e) => e.trim()).filter(Boolean),
100
- limits: {
101
- maxCallsPerExecution: W.maxCallsPerExecution,
102
- timeoutSeconds: W.timeoutSeconds
103
- }
104
- };
105
- break;
106
- case "BUDGET":
107
- e = {
108
- maxTokensPerExecution: K.maxTokensPerExecution,
109
- maxCostPerExecution: K.maxCostPerExecution,
110
- modelEscalationConstraints: {
111
- allowEscalation: K.allowEscalation,
112
- maxModelTier: K.maxModelTier
113
- }
114
- };
115
- break;
116
- case "RATE_LIMIT":
117
- e = {
118
- limits: {
119
- requestsPerMinute: J.requestsPerMinute,
120
- requestsPerHour: J.requestsPerHour,
121
- tokensPerMinute: J.tokensPerMinute
122
- },
123
- scope: J.scope
124
- };
125
- break;
126
- case "RESPONSE": {
127
- let t = k(X.allowedModels), n = k(X.allowedProviders).map((e) => e.toUpperCase());
128
- e = {
129
- ...t.length > 0 ? { allowedModels: t } : {},
130
- ...n.length > 0 ? { allowedProviders: n } : {}
131
- };
132
- break;
55
+ }), [W, G] = g({
56
+ name: "",
57
+ description: "",
58
+ visibility: "PRIVATE"
59
+ }), [K, Oe] = g(le), [q, J] = g(null), Y = (e, t) => {
60
+ J(null), Oe((n) => ({
61
+ ...n,
62
+ [e]: {
63
+ ...n[e],
64
+ ...t
133
65
  }
134
- case "RETENTION":
135
- e = {
136
- executionDataRetentionDays: Z.executionDataRetentionDays,
137
- payloadSnapshotsEnabled: Z.payloadSnapshotsEnabled
138
- };
139
- break;
66
+ }));
67
+ }, [X, ke] = g(!1), Ae = async () => {
68
+ if (!H.name) return;
69
+ let e = de(H.type, K);
70
+ if (!e.ok) {
71
+ J(e.error), k.error(e.error);
72
+ return;
140
73
  }
141
74
  try {
142
- await ve({
143
- name: B.name,
144
- description: B.description,
145
- type: B.type,
146
- visibility: B.visibility,
147
- status: we ? "ACTIVE" : "DRAFT",
148
- config: e
75
+ await Ce({
76
+ name: H.name,
77
+ description: H.description,
78
+ type: H.type,
79
+ visibility: H.visibility,
80
+ status: X ? "ACTIVE" : "DRAFT",
81
+ config: e.config
149
82
  });
150
83
  } catch (e) {
151
- D.error(e instanceof Error ? e.message : "Failed to create policy");
84
+ k.error(e instanceof Error ? e.message : "Failed to create policy");
152
85
  return;
153
86
  }
154
- D.success(`Policy "${B.name}" created`), M("policies");
155
- }, Oe = async () => {
156
- if (!(!j || !B.name)) {
87
+ k.success(`Policy "${H.name}" created`), P("policies");
88
+ }, je = async () => {
89
+ if (!(!N || !W.name)) {
157
90
  try {
158
- await F({
159
- policyId: j,
91
+ await L({
92
+ policyId: N,
160
93
  input: {
161
- name: B.name,
162
- description: B.description,
163
- visibility: B.visibility
94
+ name: W.name,
95
+ description: W.description,
96
+ visibility: W.visibility
164
97
  }
165
98
  });
166
99
  } catch (e) {
167
- D.error(e instanceof Error ? e.message : "Failed to update policy");
100
+ k.error(e instanceof Error ? e.message : "Failed to update policy");
168
101
  return;
169
102
  }
170
- await P(), D.success("Policy updated"), R(!1);
103
+ await I(), k.success("Policy updated"), B(!1);
171
104
  }
172
- }, ke = async () => {
173
- if (j) try {
174
- await be(j), l() && u("success"), M("policies");
105
+ }, Me = async () => {
106
+ if (N) try {
107
+ await Te(N), l() && u("success"), P("policies");
175
108
  } catch (e) {
176
109
  throw l() && u("error"), e;
177
110
  }
178
- }, Q = N?.status === "ACTIVE", Ae = async () => {
179
- if (!j) return;
180
- let e = Q ? "DRAFT" : "ACTIVE";
111
+ }, Z = F?.status === "ACTIVE", Ne = async () => {
112
+ if (!N) return;
113
+ let e = Z ? "DRAFT" : "ACTIVE";
181
114
  try {
182
- await F({
183
- policyId: j,
115
+ await L({
116
+ policyId: N,
184
117
  input: { status: e }
185
118
  });
186
119
  } catch (e) {
187
- D.error(e instanceof Error ? e.message : "Failed to update policy");
120
+ k.error(e instanceof Error ? e.message : "Failed to update policy");
188
121
  return;
189
122
  }
190
- await P(), D.success(e === "ACTIVE" ? "Policy is now enforced" : "Policy is no longer enforced");
191
- }, je = () => {
192
- N && (V({
193
- name: N.name,
194
- description: N.description || "",
195
- type: m(N.type, O, "CONTENT"),
196
- visibility: m(N.visibility, he, "PRIVATE")
197
- }), R(!0));
123
+ await I(), k.success(e === "ACTIVE" ? "Policy is now enforced" : "Policy is no longer enforced");
124
+ }, Pe = () => {
125
+ F && (G({
126
+ name: F.name,
127
+ description: F.description || "",
128
+ visibility: h(F.visibility, xe, "PRIVATE")
129
+ }), B(!0));
198
130
  };
199
- if (b) return /* @__PURE__ */ g(n, {
131
+ if (S) return /* @__PURE__ */ v(n, {
200
132
  title: "Create Policy",
201
133
  description: "Define guardrails and constraints for your AI agents",
202
- actions: /* @__PURE__ */ _("div", {
134
+ actions: /* @__PURE__ */ y("div", {
203
135
  className: "flex gap-2",
204
- children: [/* @__PURE__ */ g(c, {
136
+ children: [/* @__PURE__ */ v(c, {
205
137
  variant: "outline",
206
- onClick: () => M("policies"),
138
+ onClick: () => P("policies"),
207
139
  children: "Cancel"
208
- }), /* @__PURE__ */ g(c, {
209
- leftIcon: /* @__PURE__ */ g(C, { size: 16 }),
210
- onClick: De,
211
- isLoading: ye,
212
- disabled: !B.name,
140
+ }), /* @__PURE__ */ v(c, {
141
+ leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
142
+ onClick: Ae,
143
+ isLoading: we,
144
+ disabled: !H.name,
213
145
  children: "Create"
214
146
  })]
215
147
  }),
216
- children: /* @__PURE__ */ _("div", {
148
+ children: /* @__PURE__ */ y("div", {
217
149
  className: "max-w-2xl space-y-6",
218
150
  children: [
219
- /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ g(s, { children: "Basic Information" }) }), /* @__PURE__ */ _(i, {
151
+ /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ v(o, { children: /* @__PURE__ */ v(s, { children: "Basic Information" }) }), /* @__PURE__ */ y(i, {
220
152
  className: "space-y-4",
221
153
  children: [
222
- /* @__PURE__ */ g(d, {
154
+ /* @__PURE__ */ v(d, {
223
155
  label: "Policy Name",
224
156
  required: !0,
225
- children: /* @__PURE__ */ g(f, {
157
+ children: /* @__PURE__ */ v(f, {
226
158
  placeholder: "e.g., Production Content Policy",
227
- value: B.name,
228
- onChange: (e) => V({
229
- ...B,
159
+ value: H.name,
160
+ onChange: (e) => U({
161
+ ...H,
230
162
  name: e.target.value
231
163
  })
232
164
  })
233
165
  }),
234
- /* @__PURE__ */ g(d, {
166
+ /* @__PURE__ */ v(d, {
235
167
  label: "Description",
236
- children: /* @__PURE__ */ g(p, {
168
+ children: /* @__PURE__ */ v(p, {
237
169
  placeholder: "What does this policy enforce?",
238
- value: B.description,
239
- onChange: (e) => V({
240
- ...B,
170
+ value: H.description,
171
+ onChange: (e) => U({
172
+ ...H,
241
173
  description: e.target.value
242
174
  }),
243
175
  rows: 3
244
176
  })
245
177
  }),
246
- /* @__PURE__ */ _("div", {
178
+ /* @__PURE__ */ y("div", {
247
179
  className: "grid grid-cols-2 gap-4",
248
- children: [/* @__PURE__ */ g(d, {
180
+ children: [/* @__PURE__ */ v(d, {
249
181
  label: "Policy Type",
250
182
  required: !0,
251
- children: /* @__PURE__ */ _("select", {
252
- className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
253
- value: B.type,
254
- onChange: (e) => V({
255
- ...B,
256
- type: e.target.value
257
- }),
258
- children: [
259
- /* @__PURE__ */ g("option", {
260
- value: "CONTENT",
261
- children: "Content Policy"
262
- }),
263
- /* @__PURE__ */ g("option", {
264
- value: "TOOL",
265
- children: "Tool Policy"
266
- }),
267
- /* @__PURE__ */ g("option", {
268
- value: "DATA",
269
- children: "Data Policy"
270
- }),
271
- /* @__PURE__ */ g("option", {
272
- value: "RESPONSE",
273
- children: "Response & Model Policy"
274
- }),
275
- /* @__PURE__ */ g("option", {
276
- value: "BUDGET",
277
- children: "Budget Policy"
278
- }),
279
- /* @__PURE__ */ g("option", {
280
- value: "RATE_LIMIT",
281
- children: "Rate Limit Policy"
282
- }),
283
- /* @__PURE__ */ g("option", {
284
- value: "RETENTION",
285
- children: "Retention Policy"
286
- })
287
- ]
183
+ children: /* @__PURE__ */ v("select", {
184
+ className: A,
185
+ value: H.type,
186
+ onChange: (e) => {
187
+ let t = e.target.value;
188
+ fe(t) && (J(null), U({
189
+ ...H,
190
+ type: t
191
+ }));
192
+ },
193
+ children: ce.map((e) => /* @__PURE__ */ v("option", {
194
+ value: e,
195
+ children: M[e]
196
+ }, e))
288
197
  })
289
- }), /* @__PURE__ */ g(d, {
198
+ }), /* @__PURE__ */ v(d, {
290
199
  label: "Visibility",
291
- children: /* @__PURE__ */ _("select", {
200
+ children: /* @__PURE__ */ y("select", {
292
201
  className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
293
- value: B.visibility,
294
- onChange: (e) => V({
295
- ...B,
202
+ value: H.visibility,
203
+ onChange: (e) => U({
204
+ ...H,
296
205
  visibility: e.target.value
297
206
  }),
298
207
  children: [
299
- /* @__PURE__ */ g("option", {
208
+ /* @__PURE__ */ v("option", {
300
209
  value: "PRIVATE",
301
210
  children: "Private"
302
211
  }),
303
- /* @__PURE__ */ g("option", {
212
+ /* @__PURE__ */ v("option", {
304
213
  value: "WORKSPACE",
305
214
  children: "Workspace"
306
215
  }),
307
- /* @__PURE__ */ g("option", {
216
+ /* @__PURE__ */ v("option", {
308
217
  value: "PUBLIC",
309
218
  children: "Public"
310
219
  })
@@ -314,628 +223,529 @@ var A = ({ type: e }) => ({
314
223
  })
315
224
  ]
316
225
  })] }),
317
- B.type === "CONTENT" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
226
+ H.type === "CONTENT" && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
318
227
  className: "flex items-center gap-2",
319
- children: [/* @__PURE__ */ g(v, { size: 18 }), "Content Policy Configuration"]
320
- }) }), /* @__PURE__ */ _(i, {
228
+ children: [/* @__PURE__ */ v(b, { size: 18 }), "Content Policy Configuration"]
229
+ }), /* @__PURE__ */ v(a, { children: "Checked against every message sent to an agent and every response it gives. A blocked message is refused; a blocked response is replaced with a refusal." })] }), /* @__PURE__ */ y(i, {
321
230
  className: "space-y-4",
322
231
  children: [
323
- /* @__PURE__ */ _("div", {
324
- className: "grid grid-cols-2 gap-4",
325
- children: [/* @__PURE__ */ _("div", {
326
- className: "flex items-center gap-2",
327
- children: [/* @__PURE__ */ g("input", {
328
- type: "checkbox",
329
- id: "jailbreak",
330
- checked: H.jailbreakDetection,
331
- onChange: (e) => U({
332
- ...H,
333
- jailbreakDetection: e.target.checked
334
- }),
335
- className: "h-4 w-4"
336
- }), /* @__PURE__ */ g("label", {
337
- htmlFor: "jailbreak",
338
- className: "text-sm",
339
- children: "Jailbreak Detection"
340
- })]
341
- }), /* @__PURE__ */ _("div", {
342
- className: "flex items-center gap-2",
343
- children: [/* @__PURE__ */ g("input", {
344
- type: "checkbox",
345
- id: "pii",
346
- checked: H.piiDetection,
347
- onChange: (e) => U({
348
- ...H,
349
- piiDetection: e.target.checked
350
- }),
351
- className: "h-4 w-4"
352
- }), /* @__PURE__ */ g("label", {
353
- htmlFor: "pii",
354
- className: "text-sm",
232
+ /* @__PURE__ */ y("div", {
233
+ className: "flex items-start gap-2",
234
+ children: [/* @__PURE__ */ v("input", {
235
+ type: "checkbox",
236
+ id: "pii",
237
+ checked: K.content.piiDetection,
238
+ onChange: (e) => Y("content", { piiDetection: e.target.checked }),
239
+ className: "mt-1 h-4 w-4"
240
+ }), /* @__PURE__ */ y("label", {
241
+ htmlFor: "pii",
242
+ className: "text-sm",
243
+ children: [/* @__PURE__ */ v("span", {
244
+ className: "font-medium",
355
245
  children: "PII Detection"
246
+ }), /* @__PURE__ */ v("span", {
247
+ className: "block text-text-secondary",
248
+ children: "Blocks text containing an email address, a US SSN or a card-number shaped digit run."
356
249
  })]
357
250
  })]
358
251
  }),
359
- /* @__PURE__ */ g(d, {
360
- label: "Toxicity Threshold",
361
- description: "0.0 to 1.0",
362
- children: /* @__PURE__ */ g(f, {
363
- type: "number",
364
- min: 0,
365
- max: 1,
366
- step: .1,
367
- value: H.toxicityThreshold,
368
- onChange: (e) => U({
369
- ...H,
370
- toxicityThreshold: parseFloat(e.target.value)
371
- })
252
+ /* @__PURE__ */ v(d, {
253
+ label: "Blocked Keywords",
254
+ description: "Comma-separated. Case-insensitive; any occurrence blocks the text.",
255
+ children: /* @__PURE__ */ v(f, {
256
+ placeholder: "e.g., internal-only, project-x",
257
+ value: K.content.blockedKeywords,
258
+ onChange: (e) => Y("content", { blockedKeywords: e.target.value })
372
259
  })
373
260
  }),
374
- /* @__PURE__ */ g(d, {
375
- label: "Custom Patterns",
376
- description: "One regex pattern per line",
377
- children: /* @__PURE__ */ g(p, {
378
- placeholder: "Enter custom patterns...",
379
- value: H.customPatterns,
380
- onChange: (e) => U({
381
- ...H,
382
- customPatterns: e.target.value
383
- }),
261
+ /* @__PURE__ */ v(d, {
262
+ label: "Blocked Patterns",
263
+ description: "One regular expression per line, matched case-insensitively.",
264
+ children: /* @__PURE__ */ v(p, {
265
+ placeholder: "e.g., \\bACME-\\d{6}\\b",
266
+ value: K.content.blockedPatterns,
267
+ onChange: (e) => Y("content", { blockedPatterns: e.target.value }),
384
268
  rows: 3
385
269
  })
386
270
  })
387
271
  ]
388
272
  })] }),
389
- B.type === "TOOL" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
273
+ H.type === "TOOL" && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
390
274
  className: "flex items-center gap-2",
391
- children: [/* @__PURE__ */ g(E, { size: 18 }), "Tool Policy Configuration"]
392
- }) }), /* @__PURE__ */ _(i, {
275
+ children: [/* @__PURE__ */ v(O, { size: 18 }), "Tool Policy Configuration"]
276
+ }), /* @__PURE__ */ v(a, { children: "Applies to MCP tool calls made by agents and through Call Tool, and to agent delegation. Leave a field empty to not restrict it." })] }), /* @__PURE__ */ y(i, {
393
277
  className: "space-y-4",
394
278
  children: [
395
- /* @__PURE__ */ g(d, {
279
+ /* @__PURE__ */ v(d, {
396
280
  label: "Allowed Tools",
397
- description: "Comma-separated tool IDs",
398
- children: /* @__PURE__ */ g(f, {
399
- placeholder: "e.g., search, read_file, web_browse",
400
- value: W.allowedTools,
401
- onChange: (e) => G({
402
- ...W,
403
- allowedTools: e.target.value
404
- })
281
+ description: "Comma-separated MCP tool names. End an entry with * to allow a prefix. Empty allows every tool.",
282
+ children: /* @__PURE__ */ v(f, {
283
+ placeholder: "e.g., search, read_*",
284
+ value: K.tool.allowedTools,
285
+ onChange: (e) => Y("tool", { allowedTools: e.target.value })
405
286
  })
406
287
  }),
407
- /* @__PURE__ */ g(d, {
288
+ /* @__PURE__ */ v(d, {
408
289
  label: "Denied Tools",
409
- description: "Comma-separated tool IDs",
410
- children: /* @__PURE__ */ g(f, {
411
- placeholder: "e.g., delete_file, execute_code",
412
- value: W.deniedTools,
413
- onChange: (e) => G({
414
- ...W,
415
- deniedTools: e.target.value
416
- })
290
+ description: "Comma-separated MCP tool names that may never run. A deny always wins.",
291
+ children: /* @__PURE__ */ v(f, {
292
+ placeholder: "e.g., delete_*, execute_code",
293
+ value: K.tool.deniedTools,
294
+ onChange: (e) => Y("tool", { deniedTools: e.target.value })
417
295
  })
418
296
  }),
419
- /* @__PURE__ */ _("div", {
420
- className: "grid grid-cols-2 gap-4",
421
- children: [/* @__PURE__ */ g(d, {
422
- label: "Max Calls Per Execution",
423
- children: /* @__PURE__ */ g(f, {
297
+ /* @__PURE__ */ y("div", {
298
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
299
+ children: [/* @__PURE__ */ v(d, {
300
+ label: "Max Tool Risk Level",
301
+ children: /* @__PURE__ */ y("select", {
302
+ className: A,
303
+ value: K.tool.maxToolRiskLevel,
304
+ onChange: (e) => Y("tool", { maxToolRiskLevel: e.target.value }),
305
+ children: [/* @__PURE__ */ v("option", {
306
+ value: "",
307
+ children: "Any risk level"
308
+ }), ue.map((e) => /* @__PURE__ */ y("option", {
309
+ value: e,
310
+ children: ["Up to ", e.toLowerCase()]
311
+ }, e))]
312
+ })
313
+ }), /* @__PURE__ */ v(d, {
314
+ label: "Minimum A2A Trust Level",
315
+ description: "For delegation to external registry agents.",
316
+ children: /* @__PURE__ */ y("select", {
317
+ className: A,
318
+ value: K.tool.a2aMinTrustLevel,
319
+ onChange: (e) => Y("tool", { a2aMinTrustLevel: e.target.value }),
320
+ children: [/* @__PURE__ */ v("option", {
321
+ value: "",
322
+ children: "Default (verified publisher)"
323
+ }), se.map((e) => /* @__PURE__ */ v("option", {
324
+ value: e,
325
+ children: e === "VERIFIED_PUBLISHER" ? "Verified publisher" : e.charAt(0) + e.slice(1).toLowerCase()
326
+ }, e))]
327
+ })
328
+ })]
329
+ }),
330
+ /* @__PURE__ */ y("div", {
331
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
332
+ children: [/* @__PURE__ */ v(d, {
333
+ label: "Max Tool Calls Per Execution",
334
+ description: "Tool calls allowed in one agent turn.",
335
+ children: /* @__PURE__ */ v(f, {
424
336
  type: "number",
425
337
  min: 1,
426
- value: W.maxCallsPerExecution,
427
- onChange: (e) => G({
428
- ...W,
429
- maxCallsPerExecution: parseInt(e.target.value)
430
- })
338
+ placeholder: "No limit",
339
+ value: K.tool.maxCallsPerExecution,
340
+ onChange: (e) => Y("tool", { maxCallsPerExecution: e.target.value })
431
341
  })
432
- }), /* @__PURE__ */ g(d, {
433
- label: "Timeout (seconds)",
434
- children: /* @__PURE__ */ g(f, {
342
+ }), /* @__PURE__ */ v(d, {
343
+ label: "Tool Call Timeout (seconds)",
344
+ description: "Can only shorten the platform's own timeout.",
345
+ children: /* @__PURE__ */ v(f, {
435
346
  type: "number",
436
347
  min: 1,
437
- value: W.timeoutSeconds,
438
- onChange: (e) => G({
439
- ...W,
440
- timeoutSeconds: parseInt(e.target.value)
441
- })
348
+ placeholder: "Platform default",
349
+ value: K.tool.timeoutSeconds,
350
+ onChange: (e) => Y("tool", { timeoutSeconds: e.target.value })
442
351
  })
443
352
  })]
444
353
  })
445
354
  ]
446
355
  })] }),
447
- B.type === "BUDGET" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
356
+ H.type === "BUDGET" && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
448
357
  className: "flex items-center gap-2",
449
- children: [/* @__PURE__ */ g(x, { size: 18 }), "Budget Policy Configuration"]
450
- }) }), /* @__PURE__ */ _(i, {
358
+ children: [/* @__PURE__ */ v(C, { size: 18 }), "Budget Policy Configuration"]
359
+ }), /* @__PURE__ */ v(a, { children: "Token budgets apply per agent. Leave a field empty to not restrict it." })] }), /* @__PURE__ */ v(i, {
451
360
  className: "space-y-4",
452
- children: [
453
- /* @__PURE__ */ _("div", {
454
- className: "grid grid-cols-2 gap-4",
455
- children: [/* @__PURE__ */ g(d, {
456
- label: "Max Tokens Per Execution",
457
- children: /* @__PURE__ */ g(f, {
458
- type: "number",
459
- min: 100,
460
- value: K.maxTokensPerExecution,
461
- onChange: (e) => q({
462
- ...K,
463
- maxTokensPerExecution: parseInt(e.target.value)
464
- })
465
- })
466
- }), /* @__PURE__ */ g(d, {
467
- label: "Max Cost Per Execution ($)",
468
- children: /* @__PURE__ */ g(f, {
469
- type: "number",
470
- min: .01,
471
- step: .01,
472
- value: K.maxCostPerExecution,
473
- onChange: (e) => q({
474
- ...K,
475
- maxCostPerExecution: parseFloat(e.target.value)
476
- })
477
- })
478
- })]
479
- }),
480
- /* @__PURE__ */ _("div", {
481
- className: "flex items-center gap-2",
482
- children: [/* @__PURE__ */ g("input", {
483
- type: "checkbox",
484
- id: "escalation",
485
- checked: K.allowEscalation,
486
- onChange: (e) => q({
487
- ...K,
488
- allowEscalation: e.target.checked
489
- }),
490
- className: "h-4 w-4"
491
- }), /* @__PURE__ */ g("label", {
492
- htmlFor: "escalation",
493
- className: "text-sm",
494
- children: "Allow Model Escalation"
495
- })]
496
- }),
497
- /* @__PURE__ */ g(d, {
498
- label: "Max Model Tier",
499
- children: /* @__PURE__ */ _("select", {
500
- className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
501
- value: K.maxModelTier,
502
- onChange: (e) => q({
503
- ...K,
504
- maxModelTier: e.target.value
505
- }),
506
- children: [
507
- /* @__PURE__ */ g("option", {
508
- value: "gpt-3.5-turbo",
509
- children: "GPT-3.5 Turbo"
510
- }),
511
- /* @__PURE__ */ g("option", {
512
- value: "gpt-4",
513
- children: "GPT-4"
514
- }),
515
- /* @__PURE__ */ g("option", {
516
- value: "gpt-4-turbo",
517
- children: "GPT-4 Turbo"
518
- }),
519
- /* @__PURE__ */ g("option", {
520
- value: "claude-3-sonnet",
521
- children: "Claude 3 Sonnet"
522
- }),
523
- /* @__PURE__ */ g("option", {
524
- value: "claude-3-opus",
525
- children: "Claude 3 Opus"
526
- })
527
- ]
361
+ children: /* @__PURE__ */ y("div", {
362
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
363
+ children: [/* @__PURE__ */ v(d, {
364
+ label: "Max Tokens Per Day",
365
+ description: "An agent that has used this many tokens today (UTC) is refused.",
366
+ children: /* @__PURE__ */ v(f, {
367
+ type: "number",
368
+ min: 1,
369
+ placeholder: "No limit",
370
+ value: K.budget.maxTokensPerDay,
371
+ onChange: (e) => Y("budget", { maxTokensPerDay: e.target.value })
528
372
  })
529
- })
530
- ]
373
+ }), /* @__PURE__ */ v(d, {
374
+ label: "Max Output Tokens Per Model Call",
375
+ description: "Lowers the agent's own max-tokens setting when it is higher.",
376
+ children: /* @__PURE__ */ v(f, {
377
+ type: "number",
378
+ min: 1,
379
+ placeholder: "No limit",
380
+ value: K.budget.maxTokensPerExecution,
381
+ onChange: (e) => Y("budget", { maxTokensPerExecution: e.target.value })
382
+ })
383
+ })]
384
+ })
531
385
  })] }),
532
- B.type === "RATE_LIMIT" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
386
+ H.type === "RATE_LIMIT" && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
533
387
  className: "flex items-center gap-2",
534
- children: [/* @__PURE__ */ g(y, { size: 18 }), "Rate Limit Configuration"]
535
- }) }), /* @__PURE__ */ _(i, {
388
+ children: [/* @__PURE__ */ v(x, { size: 18 }), "Rate Limit Configuration"]
389
+ }), /* @__PURE__ */ v(a, { children: "Every limit is counted per agent. Leave a field empty to not restrict it." })] }), /* @__PURE__ */ v(i, {
536
390
  className: "space-y-4",
537
- children: [/* @__PURE__ */ _("div", {
538
- className: "grid grid-cols-3 gap-4",
391
+ children: /* @__PURE__ */ y("div", {
392
+ className: "grid grid-cols-1 sm:grid-cols-3 gap-4",
539
393
  children: [
540
- /* @__PURE__ */ g(d, {
394
+ /* @__PURE__ */ v(d, {
541
395
  label: "Requests / Minute",
542
- children: /* @__PURE__ */ g(f, {
396
+ children: /* @__PURE__ */ v(f, {
543
397
  type: "number",
544
398
  min: 1,
545
- value: J.requestsPerMinute,
546
- onChange: (e) => Y({
547
- ...J,
548
- requestsPerMinute: parseInt(e.target.value)
549
- })
399
+ placeholder: "No limit",
400
+ value: K.rateLimit.requestsPerMinute,
401
+ onChange: (e) => Y("rateLimit", { requestsPerMinute: e.target.value })
550
402
  })
551
403
  }),
552
- /* @__PURE__ */ g(d, {
404
+ /* @__PURE__ */ v(d, {
553
405
  label: "Requests / Hour",
554
- children: /* @__PURE__ */ g(f, {
406
+ children: /* @__PURE__ */ v(f, {
555
407
  type: "number",
556
408
  min: 1,
557
- value: J.requestsPerHour,
558
- onChange: (e) => Y({
559
- ...J,
560
- requestsPerHour: parseInt(e.target.value)
561
- })
409
+ placeholder: "No limit",
410
+ value: K.rateLimit.requestsPerHour,
411
+ onChange: (e) => Y("rateLimit", { requestsPerHour: e.target.value })
562
412
  })
563
413
  }),
564
- /* @__PURE__ */ g(d, {
414
+ /* @__PURE__ */ v(d, {
565
415
  label: "Tokens / Minute",
566
- children: /* @__PURE__ */ g(f, {
416
+ children: /* @__PURE__ */ v(f, {
567
417
  type: "number",
568
418
  min: 1,
569
- value: J.tokensPerMinute,
570
- onChange: (e) => Y({
571
- ...J,
572
- tokensPerMinute: parseInt(e.target.value)
573
- })
419
+ placeholder: "No limit",
420
+ value: K.rateLimit.tokensPerMinute,
421
+ onChange: (e) => Y("rateLimit", { tokensPerMinute: e.target.value })
574
422
  })
575
423
  })
576
424
  ]
577
- }), /* @__PURE__ */ g(d, {
578
- label: "Scope",
579
- children: /* @__PURE__ */ _("select", {
580
- className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
581
- value: J.scope,
582
- onChange: (e) => Y({
583
- ...J,
584
- scope: e.target.value
585
- }),
586
- children: [
587
- /* @__PURE__ */ g("option", {
588
- value: "connector",
589
- children: "Per Connector"
590
- }),
591
- /* @__PURE__ */ g("option", {
592
- value: "app",
593
- children: "Per Bot"
594
- }),
595
- /* @__PURE__ */ g("option", {
596
- value: "agent",
597
- children: "Per Agent"
598
- }),
599
- /* @__PURE__ */ g("option", {
600
- value: "user_group",
601
- children: "Per User Group"
602
- })
603
- ]
604
- })
605
- })]
425
+ })
606
426
  })] }),
607
- B.type === "RESPONSE" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ _(o, { children: [/* @__PURE__ */ _(s, {
427
+ H.type === "RESPONSE" && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
608
428
  className: "flex items-center gap-2",
609
- children: [/* @__PURE__ */ g(S, { size: 18 }), "Model Usage Allowlist"]
610
- }), /* @__PURE__ */ g(a, { children: "Agents in this workspace may only answer with models that match every active model policy. Leave both fields empty to allow all models." })] }), /* @__PURE__ */ _(i, {
429
+ children: [/* @__PURE__ */ v(w, { size: 18 }), "Model Usage Allowlist"]
430
+ }), /* @__PURE__ */ v(a, { children: "Agents in this workspace may only answer with models that match every active model policy. Leave both fields empty to allow all models." })] }), /* @__PURE__ */ y(i, {
611
431
  className: "space-y-4",
612
- children: [/* @__PURE__ */ g(d, {
432
+ children: [/* @__PURE__ */ v(d, {
613
433
  label: "Allowed Models",
614
434
  description: "Comma-separated model IDs. End an entry with * to allow a prefix.",
615
- children: /* @__PURE__ */ g(f, {
435
+ children: /* @__PURE__ */ v(f, {
616
436
  placeholder: "e.g., gpt-4o-mini, anthropic.claude-*",
617
- value: X.allowedModels,
618
- onChange: (e) => Ce({
619
- ...X,
620
- allowedModels: e.target.value
621
- })
437
+ value: K.response.allowedModels,
438
+ onChange: (e) => Y("response", { allowedModels: e.target.value })
622
439
  })
623
- }), /* @__PURE__ */ g(d, {
440
+ }), /* @__PURE__ */ v(d, {
624
441
  label: "Allowed Providers",
625
442
  description: "Comma-separated provider types, e.g. OPENAI, ANTHROPIC, AWS_BEDROCK.",
626
- children: /* @__PURE__ */ g(f, {
443
+ children: /* @__PURE__ */ v(f, {
627
444
  placeholder: "e.g., AWS_BEDROCK, ANTHROPIC",
628
- value: X.allowedProviders,
629
- onChange: (e) => Ce({
630
- ...X,
631
- allowedProviders: e.target.value
632
- })
445
+ value: K.response.allowedProviders,
446
+ onChange: (e) => Y("response", { allowedProviders: e.target.value })
633
447
  })
634
448
  })]
635
449
  })] }),
636
- /* @__PURE__ */ g(r, { children: /* @__PURE__ */ g(i, {
450
+ q && /* @__PURE__ */ v("p", {
451
+ className: "text-sm text-status-error-text",
452
+ role: "alert",
453
+ children: q
454
+ }),
455
+ /* @__PURE__ */ v(r, { children: /* @__PURE__ */ v(i, {
637
456
  className: "pt-6",
638
- children: /* @__PURE__ */ _("div", {
457
+ children: /* @__PURE__ */ y("div", {
639
458
  className: "flex items-start gap-2",
640
- children: [/* @__PURE__ */ g("input", {
459
+ children: [/* @__PURE__ */ v("input", {
641
460
  type: "checkbox",
642
461
  id: "activate-on-create",
643
- checked: we,
644
- onChange: (e) => Te(e.target.checked),
462
+ checked: X,
463
+ onChange: (e) => ke(e.target.checked),
645
464
  className: "mt-1 h-4 w-4"
646
- }), /* @__PURE__ */ _("label", {
465
+ }), /* @__PURE__ */ y("label", {
647
466
  htmlFor: "activate-on-create",
648
467
  className: "text-sm",
649
- children: [/* @__PURE__ */ g("span", {
468
+ children: [/* @__PURE__ */ v("span", {
650
469
  className: "font-medium",
651
470
  children: "Enforce immediately"
652
- }), /* @__PURE__ */ g("span", {
471
+ }), /* @__PURE__ */ v("span", {
653
472
  className: "block text-text-secondary",
654
473
  children: "Only active policies are enforced. Leave unchecked to save this policy as a draft and activate it later."
655
474
  })]
656
475
  })]
657
476
  })
658
- }) }),
659
- B.type === "RETENTION" && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
660
- className: "flex items-center gap-2",
661
- children: [/* @__PURE__ */ g(T, { size: 18 }), "Retention Policy Configuration"]
662
- }) }), /* @__PURE__ */ _(i, {
663
- className: "space-y-4",
664
- children: [/* @__PURE__ */ g(d, {
665
- label: "Execution Data Retention (days)",
666
- children: /* @__PURE__ */ g(f, {
667
- type: "number",
668
- min: 1,
669
- value: Z.executionDataRetentionDays,
670
- onChange: (e) => Ee({
671
- ...Z,
672
- executionDataRetentionDays: parseInt(e.target.value)
673
- })
674
- })
675
- }), /* @__PURE__ */ _("div", {
676
- className: "flex items-center gap-2",
677
- children: [/* @__PURE__ */ g("input", {
678
- type: "checkbox",
679
- id: "snapshots",
680
- checked: Z.payloadSnapshotsEnabled,
681
- onChange: (e) => Ee({
682
- ...Z,
683
- payloadSnapshotsEnabled: e.target.checked
684
- }),
685
- className: "h-4 w-4"
686
- }), /* @__PURE__ */ g("label", {
687
- htmlFor: "snapshots",
688
- className: "text-sm",
689
- children: "Enable Payload Snapshots"
690
- })]
691
- })]
692
- })] })
477
+ }) })
693
478
  ]
694
479
  })
695
480
  });
696
- if (_e) return /* @__PURE__ */ g(n, {
481
+ if (Se) return /* @__PURE__ */ v(n, {
697
482
  title: "Loading...",
698
- children: /* @__PURE__ */ g("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
483
+ children: /* @__PURE__ */ v("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
699
484
  });
700
- if (!N) return /* @__PURE__ */ g(n, {
485
+ if (!F) return /* @__PURE__ */ v(n, {
701
486
  title: "Policy Not Found",
702
- children: /* @__PURE__ */ g(re, {
487
+ children: /* @__PURE__ */ v(re, {
703
488
  illustration: "empty-generic",
704
489
  title: "Policy Not Found",
705
490
  description: "This policy doesn't exist.",
706
- action: /* @__PURE__ */ g(c, {
707
- onClick: () => M("policies"),
491
+ action: /* @__PURE__ */ v(c, {
492
+ onClick: () => P("policies"),
708
493
  children: "Back to Policies"
709
494
  })
710
495
  })
711
496
  });
712
- let $ = m(N.type, O, "CONTENT");
713
- return /* @__PURE__ */ g(n, {
714
- title: /* @__PURE__ */ _("div", {
497
+ let Q = h(F.type, be, "CONTENT"), $ = pe(Q, F.config);
498
+ return /* @__PURE__ */ v(n, {
499
+ title: /* @__PURE__ */ y("div", {
715
500
  className: "flex items-center gap-3",
716
501
  children: [
717
- /* @__PURE__ */ g(c, {
502
+ /* @__PURE__ */ v(c, {
718
503
  variant: "ghost",
719
504
  size: "icon",
720
- onClick: () => M("policies"),
721
- children: /* @__PURE__ */ g(de, { size: 20 })
505
+ onClick: () => P("policies"),
506
+ children: /* @__PURE__ */ v(ge, { size: 20 })
722
507
  }),
723
- /* @__PURE__ */ g("div", {
508
+ /* @__PURE__ */ v("div", {
724
509
  className: "p-2 rounded-lg bg-action-primary-bg/10",
725
- children: /* @__PURE__ */ g(A, { type: $ })
510
+ children: /* @__PURE__ */ v(j, { type: Q })
726
511
  }),
727
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("div", {
512
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ y("div", {
728
513
  className: "flex items-center gap-2",
729
- children: [/* @__PURE__ */ g("span", { children: N.name }), /* @__PURE__ */ g(te, { status: N.status })]
730
- }), /* @__PURE__ */ g("p", {
514
+ children: [/* @__PURE__ */ v("span", { children: F.name }), /* @__PURE__ */ v(te, { status: F.status })]
515
+ }), /* @__PURE__ */ v("p", {
731
516
  className: "text-sm font-normal text-text-secondary",
732
- children: N.description
517
+ children: F.description
733
518
  })] })
734
519
  ]
735
520
  }),
736
- actions: /* @__PURE__ */ g("div", {
521
+ actions: /* @__PURE__ */ v("div", {
737
522
  className: "flex gap-2",
738
- children: L ? /* @__PURE__ */ _(le, { children: [/* @__PURE__ */ g(c, {
523
+ children: z ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(c, {
739
524
  variant: "outline",
740
- onClick: () => R(!1),
525
+ onClick: () => B(!1),
741
526
  children: "Cancel"
742
- }), /* @__PURE__ */ g(c, {
743
- leftIcon: /* @__PURE__ */ g(C, { size: 16 }),
744
- onClick: Oe,
745
- isLoading: I,
746
- disabled: !B.name,
527
+ }), /* @__PURE__ */ v(c, {
528
+ leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
529
+ onClick: je,
530
+ isLoading: R,
531
+ disabled: !W.name,
747
532
  children: "Save Changes"
748
- })] }) : /* @__PURE__ */ _(le, { children: [
749
- /* @__PURE__ */ g(c, {
750
- variant: Q ? "outline" : "default",
751
- leftIcon: /* @__PURE__ */ g(pe, { size: 16 }),
752
- onClick: () => void Ae(),
753
- isLoading: I,
754
- children: Q ? "Deactivate" : "Activate"
533
+ })] }) : /* @__PURE__ */ y(_, { children: [
534
+ /* @__PURE__ */ v(c, {
535
+ variant: Z ? "outline" : "default",
536
+ leftIcon: /* @__PURE__ */ v(ve, { size: 16 }),
537
+ onClick: () => void Ne(),
538
+ isLoading: R,
539
+ children: Z ? "Deactivate" : "Activate"
755
540
  }),
756
- /* @__PURE__ */ g(c, {
541
+ /* @__PURE__ */ v(c, {
757
542
  variant: "outline",
758
- leftIcon: /* @__PURE__ */ g(fe, { size: 16 }),
759
- onClick: je,
543
+ leftIcon: /* @__PURE__ */ v(_e, { size: 16 }),
544
+ onClick: Pe,
760
545
  children: "Edit"
761
546
  }),
762
- Se ? /* @__PURE__ */ _("div", {
547
+ De ? /* @__PURE__ */ y("div", {
763
548
  className: "flex gap-2",
764
- children: [/* @__PURE__ */ g(c, {
549
+ children: [/* @__PURE__ */ v(c, {
765
550
  variant: "outline",
766
551
  size: "sm",
767
- onClick: () => z(!1),
552
+ onClick: () => V(!1),
768
553
  children: "Cancel"
769
- }), /* @__PURE__ */ g(c, {
554
+ }), /* @__PURE__ */ v(c, {
770
555
  variant: "destructive",
771
556
  size: "sm",
772
557
  onClick: () => {
773
- ne("medium"), ke();
558
+ ne("medium"), Me();
774
559
  },
775
- isLoading: xe,
560
+ isLoading: Ee,
776
561
  children: "Confirm Delete"
777
562
  })]
778
- }) : /* @__PURE__ */ g(c, {
563
+ }) : /* @__PURE__ */ v(c, {
779
564
  variant: "destructive",
780
- leftIcon: /* @__PURE__ */ g(T, { size: 16 }),
781
- onClick: () => z(!0),
565
+ leftIcon: /* @__PURE__ */ v(D, { size: 16 }),
566
+ onClick: () => V(!0),
782
567
  children: "Delete"
783
568
  })
784
569
  ] })
785
570
  }),
786
- children: /* @__PURE__ */ _("div", {
571
+ children: /* @__PURE__ */ y("div", {
787
572
  className: "space-y-6",
788
573
  children: [
789
- /* @__PURE__ */ g(ce, {
790
- icon: /* @__PURE__ */ g(w, { size: 18 }),
574
+ /* @__PURE__ */ v(me, {
575
+ icon: /* @__PURE__ */ v(E, { size: 18 }),
791
576
  children: "This is a single guardrail and its rules. Review and tune exactly what it enforces — what content to block, which tools are allowed, the spend or rate limits it applies — then attach it to the agents and bots that should obey it. Policies are how you keep agents safe, compliant and within budget."
792
577
  }),
793
- L && /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ g(s, { children: "Edit Policy" }) }), /* @__PURE__ */ _(i, {
578
+ z && /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ v(o, { children: /* @__PURE__ */ v(s, { children: "Edit Policy" }) }), /* @__PURE__ */ y(i, {
794
579
  className: "space-y-4",
795
580
  children: [
796
- /* @__PURE__ */ g(d, {
581
+ /* @__PURE__ */ v(d, {
797
582
  label: "Policy Name",
798
583
  required: !0,
799
- children: /* @__PURE__ */ g(f, {
800
- value: B.name,
801
- onChange: (e) => V({
802
- ...B,
584
+ children: /* @__PURE__ */ v(f, {
585
+ value: W.name,
586
+ onChange: (e) => G({
587
+ ...W,
803
588
  name: e.target.value
804
589
  })
805
590
  })
806
591
  }),
807
- /* @__PURE__ */ g(d, {
592
+ /* @__PURE__ */ v(d, {
808
593
  label: "Description",
809
- children: /* @__PURE__ */ g(p, {
810
- value: B.description,
811
- onChange: (e) => V({
812
- ...B,
594
+ children: /* @__PURE__ */ v(p, {
595
+ value: W.description,
596
+ onChange: (e) => G({
597
+ ...W,
813
598
  description: e.target.value
814
599
  }),
815
600
  rows: 3
816
601
  })
817
602
  }),
818
- /* @__PURE__ */ g(d, {
603
+ /* @__PURE__ */ v(d, {
819
604
  label: "Visibility",
820
- children: /* @__PURE__ */ _("select", {
821
- className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
822
- value: B.visibility,
823
- onChange: (e) => V({
824
- ...B,
605
+ children: /* @__PURE__ */ y("select", {
606
+ className: A,
607
+ value: W.visibility,
608
+ onChange: (e) => G({
609
+ ...W,
825
610
  visibility: e.target.value
826
611
  }),
827
612
  children: [
828
- /* @__PURE__ */ g("option", {
613
+ /* @__PURE__ */ v("option", {
829
614
  value: "PRIVATE",
830
615
  children: "Private"
831
616
  }),
832
- /* @__PURE__ */ g("option", {
617
+ /* @__PURE__ */ v("option", {
833
618
  value: "WORKSPACE",
834
619
  children: "Workspace"
835
620
  }),
836
- /* @__PURE__ */ g("option", {
621
+ /* @__PURE__ */ v("option", {
837
622
  value: "PUBLIC",
838
623
  children: "Public"
839
624
  })
840
625
  ]
841
626
  })
842
627
  }),
843
- /* @__PURE__ */ g("p", {
628
+ /* @__PURE__ */ v("p", {
844
629
  className: "text-sm text-text-secondary",
845
630
  children: "Note: Policy type and configuration cannot be changed after creation."
846
631
  })
847
632
  ]
848
633
  })] }),
849
- /* @__PURE__ */ _("div", {
634
+ /* @__PURE__ */ y("div", {
850
635
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
851
636
  children: [
852
- /* @__PURE__ */ g(r, {
637
+ /* @__PURE__ */ v(r, {
853
638
  treatment: "glass",
854
639
  glow: !0,
855
- children: /* @__PURE__ */ _(i, {
640
+ children: /* @__PURE__ */ y(i, {
856
641
  className: "pt-6 text-center",
857
642
  children: [
858
- /* @__PURE__ */ g("div", {
643
+ /* @__PURE__ */ v("div", {
859
644
  className: "p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2",
860
- children: /* @__PURE__ */ g(A, { type: $ })
645
+ children: /* @__PURE__ */ v(j, { type: Q })
861
646
  }),
862
- /* @__PURE__ */ g("p", {
647
+ /* @__PURE__ */ v("p", {
863
648
  className: "text-lg font-bold",
864
- children: ge[$]
649
+ children: M[Q]
865
650
  }),
866
- /* @__PURE__ */ g("p", {
651
+ /* @__PURE__ */ v("p", {
867
652
  className: "text-sm text-text-secondary",
868
653
  children: "Policy Type"
869
654
  })
870
655
  ]
871
656
  })
872
657
  }),
873
- /* @__PURE__ */ g(r, { children: /* @__PURE__ */ _(i, {
658
+ /* @__PURE__ */ v(r, { children: /* @__PURE__ */ y(i, {
874
659
  className: "pt-6 text-center",
875
- children: [/* @__PURE__ */ g("p", {
660
+ children: [/* @__PURE__ */ v("p", {
876
661
  className: "text-3xl font-bold text-text-primary capitalize",
877
- children: N.visibility.toLowerCase()
878
- }), /* @__PURE__ */ g("p", {
662
+ children: F.visibility.toLowerCase()
663
+ }), /* @__PURE__ */ v("p", {
879
664
  className: "text-sm text-text-secondary",
880
665
  children: "Visibility"
881
666
  })]
882
667
  }) }),
883
- /* @__PURE__ */ g(r, { children: /* @__PURE__ */ _(i, {
668
+ /* @__PURE__ */ v(r, { children: /* @__PURE__ */ y(i, {
884
669
  className: "pt-6 text-center",
885
- children: [/* @__PURE__ */ g("p", {
670
+ children: [/* @__PURE__ */ v("p", {
886
671
  className: "text-3xl font-bold text-text-primary",
887
- children: N.revision
888
- }), /* @__PURE__ */ g("p", {
672
+ children: F.revision
673
+ }), /* @__PURE__ */ v("p", {
889
674
  className: "text-sm text-text-secondary",
890
675
  children: "Revision"
891
676
  })]
892
677
  }) }),
893
- /* @__PURE__ */ g(r, { children: /* @__PURE__ */ _(i, {
678
+ /* @__PURE__ */ v(r, { children: /* @__PURE__ */ y(i, {
894
679
  className: "pt-6 text-center",
895
- children: [/* @__PURE__ */ g("p", {
680
+ children: [/* @__PURE__ */ v("p", {
896
681
  className: "text-lg font-bold text-text-primary",
897
- children: t(N.updatedAt)
898
- }), /* @__PURE__ */ g("p", {
682
+ children: t(F.updatedAt)
683
+ }), /* @__PURE__ */ v("p", {
899
684
  className: "text-sm text-text-secondary",
900
685
  children: "Last Updated"
901
686
  })]
902
687
  }) })
903
688
  ]
904
689
  }),
905
- /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ _(o, { children: [/* @__PURE__ */ g(s, { children: "Configuration" }), /* @__PURE__ */ g(a, { children: "Current policy configuration" })] }), /* @__PURE__ */ g(i, { children: /* @__PURE__ */ g("div", {
906
- className: "p-4 bg-bg-sunken rounded-lg font-mono text-sm overflow-auto",
907
- children: /* @__PURE__ */ g("pre", { children: JSON.stringify(N.config, null, 2) })
908
- }) })] }),
909
- /* @__PURE__ */ _(r, { children: [/* @__PURE__ */ g(o, { children: /* @__PURE__ */ _(s, {
690
+ /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ v(s, { children: "Configuration" }), /* @__PURE__ */ v(a, { children: "Current policy configuration" })] }), /* @__PURE__ */ y(i, {
691
+ className: "space-y-4",
692
+ children: [$ === null ? /* @__PURE__ */ y("div", {
693
+ className: "flex items-start gap-2 p-3 bg-status-warning-bg-subtle rounded-lg text-sm",
694
+ "data-testid": "policy-not-enforced",
695
+ children: [/* @__PURE__ */ v(b, {
696
+ size: 16,
697
+ className: "mt-0.5 shrink-0 text-status-warning-text"
698
+ }), /* @__PURE__ */ y("p", { children: [M[Q], " settings are not enforced at runtime. This policy is kept for reference only and does not restrict any agent."] })]
699
+ }) : $.length > 0 ? /* @__PURE__ */ y("div", {
700
+ className: "flex items-start gap-2 p-3 bg-status-warning-bg-subtle rounded-lg text-sm",
701
+ "data-testid": "policy-ignored-keys",
702
+ children: [/* @__PURE__ */ v(b, {
703
+ size: 16,
704
+ className: "mt-0.5 shrink-0 text-status-warning-text"
705
+ }), /* @__PURE__ */ y("p", { children: [
706
+ "These settings are not enforced at runtime and have no effect:",
707
+ " ",
708
+ /* @__PURE__ */ v("span", {
709
+ className: "font-mono",
710
+ children: $.join(", ")
711
+ }),
712
+ ". Create a new policy to use the enforced settings."
713
+ ] })]
714
+ }) : null, /* @__PURE__ */ v("div", {
715
+ className: "p-4 bg-bg-sunken rounded-lg font-mono text-sm overflow-auto",
716
+ children: /* @__PURE__ */ v("pre", { children: JSON.stringify(F.config, null, 2) })
717
+ })]
718
+ })] }),
719
+ /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ v(o, { children: /* @__PURE__ */ y(s, {
910
720
  className: "flex items-center gap-2",
911
- children: [/* @__PURE__ */ g(me, { size: 18 }), "Metadata"]
912
- }) }), /* @__PURE__ */ g(i, { children: /* @__PURE__ */ _("div", {
721
+ children: [/* @__PURE__ */ v(ye, { size: 18 }), "Metadata"]
722
+ }) }), /* @__PURE__ */ v(i, { children: /* @__PURE__ */ y("div", {
913
723
  className: "grid grid-cols-2 md:grid-cols-4 gap-6 text-sm",
914
724
  children: [
915
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
725
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
916
726
  className: "text-text-secondary",
917
727
  children: "Created"
918
- }), /* @__PURE__ */ g("p", {
728
+ }), /* @__PURE__ */ v("p", {
919
729
  className: "font-medium",
920
- children: t(N.createdAt)
730
+ children: t(F.createdAt)
921
731
  })] }),
922
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
732
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
923
733
  className: "text-text-secondary",
924
734
  children: "Updated"
925
- }), /* @__PURE__ */ g("p", {
735
+ }), /* @__PURE__ */ v("p", {
926
736
  className: "font-medium",
927
- children: t(N.updatedAt)
737
+ children: t(F.updatedAt)
928
738
  })] }),
929
- /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
739
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
930
740
  className: "text-text-secondary",
931
741
  children: "Tags"
932
- }), /* @__PURE__ */ g("div", {
742
+ }), /* @__PURE__ */ v("div", {
933
743
  className: "flex gap-1",
934
- children: N.tags.length > 0 ? N.tags.map((e) => /* @__PURE__ */ g(ee, {
744
+ children: F.tags.length > 0 ? F.tags.map((e) => /* @__PURE__ */ v(ee, {
935
745
  variant: "secondary",
936
746
  className: "text-xs",
937
747
  children: e
938
- }, e)) : /* @__PURE__ */ g("span", {
748
+ }, e)) : /* @__PURE__ */ v("span", {
939
749
  className: "text-text-secondary",
940
750
  children: "None"
941
751
  })
@@ -947,6 +757,6 @@ var A = ({ type: e }) => ({
947
757
  });
948
758
  };
949
759
  //#endregion
950
- export { j as PolicyDetailPage };
760
+ export { N as PolicyDetailPage };
951
761
 
952
762
  //# sourceMappingURL=PolicyDetailPage.js.map