@uipath/apollo-react 6.62.0 → 6.63.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 (80) hide show
  1. package/dist/canvas/components/Guardrails/components/guardrail-evals-toggle.cjs +59 -0
  2. package/dist/canvas/components/Guardrails/components/guardrail-evals-toggle.d.ts +9 -0
  3. package/dist/canvas/components/Guardrails/components/guardrail-evals-toggle.d.ts.map +1 -0
  4. package/dist/canvas/components/Guardrails/components/guardrail-evals-toggle.js +25 -0
  5. package/dist/canvas/components/Guardrails/components/guardrail-name-fields.cjs +74 -0
  6. package/dist/canvas/components/Guardrails/components/guardrail-name-fields.d.ts +12 -0
  7. package/dist/canvas/components/Guardrails/components/guardrail-name-fields.d.ts.map +1 -0
  8. package/dist/canvas/components/Guardrails/components/guardrail-name-fields.js +40 -0
  9. package/dist/canvas/components/Guardrails/custom-builder-types.cjs +18 -0
  10. package/dist/canvas/components/Guardrails/custom-builder-types.d.ts +20 -0
  11. package/dist/canvas/components/Guardrails/custom-builder-types.d.ts.map +1 -0
  12. package/dist/canvas/components/Guardrails/custom-builder-types.js +0 -0
  13. package/dist/canvas/components/Guardrails/custom-builder-utils.cjs +89 -0
  14. package/dist/canvas/components/Guardrails/custom-builder-utils.d.ts +25 -0
  15. package/dist/canvas/components/Guardrails/custom-builder-utils.d.ts.map +1 -0
  16. package/dist/canvas/components/Guardrails/custom-builder-utils.js +49 -0
  17. package/dist/canvas/components/Guardrails/custom-guardrail-builder.cjs +273 -0
  18. package/dist/canvas/components/Guardrails/custom-guardrail-builder.d.ts +44 -0
  19. package/dist/canvas/components/Guardrails/custom-guardrail-builder.d.ts.map +1 -0
  20. package/dist/canvas/components/Guardrails/custom-guardrail-builder.js +239 -0
  21. package/dist/canvas/components/Guardrails/guardrail-builder.cjs +37 -85
  22. package/dist/canvas/components/Guardrails/guardrail-builder.d.ts.map +1 -1
  23. package/dist/canvas/components/Guardrails/guardrail-builder.js +38 -86
  24. package/dist/canvas/components/Guardrails/i18n.cjs +121 -17
  25. package/dist/canvas/components/Guardrails/i18n.d.ts +18 -0
  26. package/dist/canvas/components/Guardrails/i18n.d.ts.map +1 -1
  27. package/dist/canvas/components/Guardrails/i18n.js +103 -14
  28. package/dist/canvas/components/Guardrails/index.cjs +38 -9
  29. package/dist/canvas/components/Guardrails/index.d.ts +7 -2
  30. package/dist/canvas/components/Guardrails/index.d.ts.map +1 -1
  31. package/dist/canvas/components/Guardrails/index.js +4 -2
  32. package/dist/canvas/components/Guardrails/use-guardrail-form-errors.cjs +68 -0
  33. package/dist/canvas/components/Guardrails/use-guardrail-form-errors.d.ts +15 -0
  34. package/dist/canvas/components/Guardrails/use-guardrail-form-errors.d.ts.map +1 -0
  35. package/dist/canvas/components/Guardrails/use-guardrail-form-errors.js +34 -0
  36. package/dist/canvas/components/Guardrails/use-swallow-enter.cjs +51 -0
  37. package/dist/canvas/components/Guardrails/use-swallow-enter.d.ts +3 -0
  38. package/dist/canvas/components/Guardrails/use-swallow-enter.d.ts.map +1 -0
  39. package/dist/canvas/components/Guardrails/use-swallow-enter.js +17 -0
  40. package/dist/canvas/locales/de.cjs +1 -1
  41. package/dist/canvas/locales/de.d.ts.map +1 -1
  42. package/dist/canvas/locales/de.js +1 -1
  43. package/dist/canvas/locales/en.cjs +1 -1
  44. package/dist/canvas/locales/en.d.ts.map +1 -1
  45. package/dist/canvas/locales/en.js +1 -1
  46. package/dist/canvas/locales/es-MX.cjs +1 -1
  47. package/dist/canvas/locales/es-MX.d.ts.map +1 -1
  48. package/dist/canvas/locales/es-MX.js +1 -1
  49. package/dist/canvas/locales/es.cjs +1 -1
  50. package/dist/canvas/locales/es.d.ts.map +1 -1
  51. package/dist/canvas/locales/es.js +1 -1
  52. package/dist/canvas/locales/fr.cjs +1 -1
  53. package/dist/canvas/locales/fr.d.ts.map +1 -1
  54. package/dist/canvas/locales/fr.js +1 -1
  55. package/dist/canvas/locales/ja.cjs +1 -1
  56. package/dist/canvas/locales/ja.d.ts.map +1 -1
  57. package/dist/canvas/locales/ja.js +1 -1
  58. package/dist/canvas/locales/ko.cjs +1 -1
  59. package/dist/canvas/locales/ko.d.ts.map +1 -1
  60. package/dist/canvas/locales/ko.js +1 -1
  61. package/dist/canvas/locales/pt-BR.cjs +1 -1
  62. package/dist/canvas/locales/pt-BR.d.ts.map +1 -1
  63. package/dist/canvas/locales/pt-BR.js +1 -1
  64. package/dist/canvas/locales/pt.cjs +1 -1
  65. package/dist/canvas/locales/pt.d.ts.map +1 -1
  66. package/dist/canvas/locales/pt.js +1 -1
  67. package/dist/canvas/locales/ro.cjs +1 -1
  68. package/dist/canvas/locales/ro.d.ts.map +1 -1
  69. package/dist/canvas/locales/ro.js +1 -1
  70. package/dist/canvas/locales/tr.cjs +1 -1
  71. package/dist/canvas/locales/tr.d.ts.map +1 -1
  72. package/dist/canvas/locales/tr.js +1 -1
  73. package/dist/canvas/locales/zh-CN.cjs +1 -1
  74. package/dist/canvas/locales/zh-CN.d.ts.map +1 -1
  75. package/dist/canvas/locales/zh-CN.js +1 -1
  76. package/dist/canvas/locales/zh-TW.cjs +1 -1
  77. package/dist/canvas/locales/zh-TW.d.ts.map +1 -1
  78. package/dist/canvas/locales/zh-TW.js +1 -1
  79. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  80. package/package.json +2 -2
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ CustomGuardrailBuilder: ()=>CustomGuardrailBuilder
28
+ });
29
+ const jsx_runtime_namespaceObject = require("react/jsx-runtime");
30
+ const apollo_wind_namespaceObject = require("@uipath/apollo-wind");
31
+ const external_react_namespaceObject = require("react");
32
+ const guardrail_action_section_cjs_namespaceObject = require("./components/guardrail-action-section.cjs");
33
+ const guardrail_evals_toggle_cjs_namespaceObject = require("./components/guardrail-evals-toggle.cjs");
34
+ const guardrail_name_fields_cjs_namespaceObject = require("./components/guardrail-name-fields.cjs");
35
+ const mixed_scopes_banner_cjs_namespaceObject = require("./components/mixed-scopes-banner.cjs");
36
+ const external_custom_builder_utils_cjs_namespaceObject = require("./custom-builder-utils.cjs");
37
+ const external_guardrail_filter_field_selector_cjs_namespaceObject = require("./guardrail-filter-field-selector.cjs");
38
+ const external_guardrail_form_layout_cjs_namespaceObject = require("./guardrail-form-layout.cjs");
39
+ const external_guardrail_rules_section_cjs_namespaceObject = require("./guardrail-rules-section.cjs");
40
+ const external_i18n_cjs_namespaceObject = require("./i18n.cjs");
41
+ const external_use_guardrail_form_errors_cjs_namespaceObject = require("./use-guardrail-form-errors.cjs");
42
+ const external_use_swallow_enter_cjs_namespaceObject = require("./use-swallow-enter.cjs");
43
+ const CUSTOM_BUILDER_ERROR_MERGES = {
44
+ perRule: {
45
+ merge: (internal, host)=>Array.from({
46
+ length: Math.max(internal?.length ?? 0, host.length)
47
+ }, (_, index)=>{
48
+ const fromHost = host[index];
49
+ const own = internal?.[index];
50
+ if (!fromHost) return own;
51
+ return {
52
+ fields: fromHost.fields ?? own?.fields,
53
+ value: fromHost.value ?? own?.value
54
+ };
55
+ }),
56
+ hasMessage: (host)=>host.some((rule)=>rule?.fields !== void 0 || rule?.value !== void 0)
57
+ }
58
+ };
59
+ function CustomGuardrailBuilder({ open, guardrail, defaultName, existingNames, toolName, fields, filterFields, onSave, onCancel, onSaveAsNew, otherAppliedScopes = null, inline = false, hideHeader = false, dialogMaxWidth = 800, title, evalsTogglePlacement = 'form', renderRecipientSearch, renderStaticRecipient, renderAppPicker, escalateHelp, renderFieldSelector, selectionChips = false, confirmAlwaysEnforce, docsHref, onDocsLinkClick, errors: hostErrors, saveDisabled: hostSaveDisabled = false, labels: labelOverrides, className }) {
60
+ const labels = (0, external_i18n_cjs_namespaceObject.useCustomGuardrailBuilderLabels)(labelOverrides);
61
+ const uid = (0, external_react_namespaceObject.useId)();
62
+ const [formData, setFormData] = (0, external_react_namespaceObject.useState)(()=>{
63
+ const data = (0, external_custom_builder_utils_cjs_namespaceObject.initCustomGuardrailBuilderFormData)(guardrail, toolName);
64
+ if (!guardrail && defaultName) data.name = defaultName;
65
+ return data;
66
+ });
67
+ const rootRef = (0, external_react_namespaceObject.useRef)(null);
68
+ (0, external_use_swallow_enter_cjs_namespaceObject.useSwallowEnter)(rootRef);
69
+ const updateField = (0, external_react_namespaceObject.useCallback)((field, value)=>{
70
+ setFormData((prev)=>({
71
+ ...prev,
72
+ [field]: value
73
+ }));
74
+ }, []);
75
+ const handleActionChange = (0, external_react_namespaceObject.useCallback)((action)=>updateField('action', 'filter' === action.$actionType ? {
76
+ $actionType: 'filter',
77
+ fields: []
78
+ } : action), [
79
+ updateField
80
+ ]);
81
+ const handleRequestAlwaysEnforce = (0, external_react_namespaceObject.useCallback)((next)=>{
82
+ if (!confirmAlwaysEnforce) return;
83
+ const answer = confirmAlwaysEnforce();
84
+ if ('boolean' == typeof answer) {
85
+ if (answer) updateField('rules', next);
86
+ return;
87
+ }
88
+ answer.then((confirmed)=>{
89
+ if (confirmed) updateField('rules', next);
90
+ });
91
+ }, [
92
+ confirmAlwaysEnforce,
93
+ updateField
94
+ ]);
95
+ const guardrailResult = (0, external_react_namespaceObject.useMemo)(()=>({
96
+ id: formData.id,
97
+ $guardrailType: 'custom',
98
+ name: formData.name,
99
+ description: formData.description || void 0,
100
+ selector: formData.selector,
101
+ action: formData.action,
102
+ enabledForEvals: formData.enabledForEvals,
103
+ rules: formData.rules
104
+ }), [
105
+ formData
106
+ ]);
107
+ const internalErrors = (0, external_react_namespaceObject.useMemo)(()=>{
108
+ const failing = (0, external_custom_builder_utils_cjs_namespaceObject.getCustomGuardrailErrorFields)(formData, existingNames);
109
+ const e = {};
110
+ if (failing.name) e.name = 'required' === failing.name ? labels.nameRequiredError : labels.nameDuplicateError;
111
+ const [rulesField] = failing.rules;
112
+ if (rulesField) e.rules = ({
113
+ required: labels.rulesRequiredError,
114
+ alwaysCombined: labels.rulesAlwaysCombinedError,
115
+ invalidRules: labels.rulesInvalidError
116
+ })[rulesField];
117
+ if (failing.perRule.some((ruleFields)=>ruleFields.length > 0)) e.perRule = failing.perRule.map((ruleFields)=>0 === ruleFields.length ? void 0 : {
118
+ fields: ruleFields.includes('fields') ? labels.ruleFieldsRequiredError : void 0,
119
+ value: ruleFields.includes('value') ? labels.ruleValueRequiredError : void 0
120
+ });
121
+ for (const field of failing.action)e[field] = ({
122
+ blockReason: labels.blockReasonRequiredError,
123
+ filterFields: labels.filterFieldsRequiredError,
124
+ recipient: labels.recipientRequiredError,
125
+ actionApp: labels.actionAppRequiredError
126
+ })[field];
127
+ return e;
128
+ }, [
129
+ formData,
130
+ existingNames,
131
+ labels
132
+ ]);
133
+ const { displayErrors, isValid, revealErrors } = (0, external_use_guardrail_form_errors_cjs_namespaceObject.useGuardrailFormErrors)(internalErrors, hostErrors, CUSTOM_BUILDER_ERROR_MERGES);
134
+ const handleSave = (0, external_react_namespaceObject.useCallback)(()=>{
135
+ if (!isValid) return void revealErrors();
136
+ onSave(guardrailResult);
137
+ }, [
138
+ guardrailResult,
139
+ onSave,
140
+ isValid,
141
+ revealErrors
142
+ ]);
143
+ const handleSaveAsNew = (0, external_react_namespaceObject.useCallback)(()=>{
144
+ if (!onSaveAsNew) return;
145
+ if (!isValid) return void revealErrors();
146
+ onSaveAsNew(guardrailResult);
147
+ }, [
148
+ guardrailResult,
149
+ onSaveAsNew,
150
+ isValid,
151
+ revealErrors
152
+ ]);
153
+ const evalsToggle = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(guardrail_evals_toggle_cjs_namespaceObject.GuardrailEvalsToggle, {
154
+ idPrefix: `${uid}-custom`,
155
+ checked: formData.enabledForEvals,
156
+ onCheckedChange: (checked)=>updateField('enabledForEvals', checked),
157
+ labels: labels
158
+ });
159
+ const [docsBefore, docsAfter] = labels.helpDocs.split('{{docsLink}}');
160
+ const formBody = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
161
+ ref: rootRef,
162
+ "data-slot": "custom-guardrail-builder",
163
+ className: (0, apollo_wind_namespaceObject.cn)('space-y-4 py-4', className),
164
+ children: [
165
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("p", {
166
+ "data-slot": "custom-guardrail-builder-help",
167
+ className: "text-sm text-muted-foreground",
168
+ children: [
169
+ labels.helpText,
170
+ void 0 !== docsHref && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(jsx_runtime_namespaceObject.Fragment, {
171
+ children: [
172
+ ' ',
173
+ docsBefore,
174
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("a", {
175
+ href: docsHref,
176
+ target: "_blank",
177
+ rel: "noopener noreferrer",
178
+ className: "text-primary hover:underline",
179
+ onClick: onDocsLinkClick,
180
+ children: labels.docsLink
181
+ }),
182
+ docsAfter
183
+ ]
184
+ })
185
+ ]
186
+ }),
187
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(guardrail_name_fields_cjs_namespaceObject.GuardrailNameFields, {
188
+ idPrefix: `${uid}-custom`,
189
+ name: formData.name,
190
+ description: formData.description,
191
+ onNameChange: (name)=>updateField('name', name),
192
+ onDescriptionChange: (description)=>updateField("description", description),
193
+ nameError: displayErrors.name,
194
+ labels: labels
195
+ }),
196
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_guardrail_rules_section_cjs_namespaceObject.GuardrailRulesSection, {
197
+ rules: formData.rules,
198
+ onRulesChange: (rules)=>updateField('rules', rules),
199
+ fields: fields,
200
+ onRequestAlwaysEnforce: confirmAlwaysEnforce ? handleRequestAlwaysEnforce : void 0,
201
+ renderFieldSelector: renderFieldSelector,
202
+ selectionChips: selectionChips,
203
+ errors: {
204
+ rules: displayErrors.rules,
205
+ perRule: displayErrors.perRule
206
+ }
207
+ }),
208
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Separator, {}),
209
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
210
+ className: "space-y-3",
211
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(guardrail_action_section_cjs_namespaceObject.GuardrailActionSection, {
212
+ action: formData.action,
213
+ onActionChange: handleActionChange,
214
+ showFilter: true,
215
+ filterContent: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_guardrail_filter_field_selector_cjs_namespaceObject.GuardrailFilterFieldSelector, {
216
+ fields: filterFields,
217
+ value: 'filter' === formData.action.$actionType ? formData.action.fields : [],
218
+ onChange: (picked)=>updateField('action', {
219
+ $actionType: 'filter',
220
+ fields: picked
221
+ }),
222
+ error: displayErrors.filterFields,
223
+ selectionChips: selectionChips
224
+ }),
225
+ errors: {
226
+ blockReason: displayErrors.blockReason,
227
+ recipient: displayErrors.recipient,
228
+ actionApp: displayErrors.actionApp
229
+ },
230
+ renderRecipientSearch: renderRecipientSearch,
231
+ renderStaticRecipient: renderStaticRecipient,
232
+ renderAppPicker: renderAppPicker,
233
+ escalateHelp: escalateHelp
234
+ })
235
+ }),
236
+ 'form' === evalsTogglePlacement && evalsToggle,
237
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(mixed_scopes_banner_cjs_namespaceObject.MixedScopesBanner, {
238
+ otherAppliedScopes: otherAppliedScopes,
239
+ labels: labels
240
+ })
241
+ ]
242
+ });
243
+ const secondaryAction = onSaveAsNew ? {
244
+ label: labels.saveAsNew,
245
+ onClick: handleSaveAsNew,
246
+ disabled: hostSaveDisabled
247
+ } : void 0;
248
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_guardrail_form_layout_cjs_namespaceObject.GuardrailFormLayout, {
249
+ open: open,
250
+ title: title ?? (guardrail ? labels.editTitle : labels.addTitle),
251
+ onSave: handleSave,
252
+ onCancel: onCancel,
253
+ inline: inline,
254
+ hideHeader: hideHeader,
255
+ dialogMaxWidth: dialogMaxWidth,
256
+ secondaryAction: secondaryAction,
257
+ saveDisabled: hostSaveDisabled,
258
+ footerStart: 'footer' === evalsTogglePlacement ? evalsToggle : void 0,
259
+ labels: {
260
+ cancel: labels.cancel,
261
+ save: labels.save
262
+ },
263
+ children: formBody
264
+ });
265
+ }
266
+ CustomGuardrailBuilder.displayName = 'CustomGuardrailBuilder';
267
+ exports.CustomGuardrailBuilder = __webpack_exports__.CustomGuardrailBuilder;
268
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
269
+ "CustomGuardrailBuilder"
270
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
271
+ Object.defineProperty(exports, '__esModule', {
272
+ value: true
273
+ });
@@ -0,0 +1,44 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { GuardrailAppPickerContext, GuardrailRecipientSearchContext, GuardrailStaticRecipientContext } from './builder-types';
3
+ import type { CustomGuardrailBuilderErrors, CustomGuardrailBuilderValue } from './custom-builder-types';
4
+ import { type CustomGuardrailBuilderLabels } from './i18n';
5
+ import type { GuardrailFieldGroup, GuardrailRuleFieldSelectorRenderer, GuardrailRuleFields } from './rules-types';
6
+ export interface CustomGuardrailBuilderProps {
7
+ open: boolean;
8
+ guardrail?: CustomGuardrailBuilderValue;
9
+ defaultName?: string;
10
+ existingNames?: string[];
11
+ toolName?: string;
12
+ fields?: GuardrailRuleFields;
13
+ filterFields?: GuardrailFieldGroup | null;
14
+ onSave: (guardrail: CustomGuardrailBuilderValue) => void;
15
+ onCancel: () => void;
16
+ onSaveAsNew?: (guardrail: CustomGuardrailBuilderValue) => void;
17
+ otherAppliedScopes?: {
18
+ scopes: string[];
19
+ tools: string[];
20
+ } | null;
21
+ inline?: boolean;
22
+ hideHeader?: boolean;
23
+ dialogMaxWidth?: number;
24
+ title?: ReactNode;
25
+ evalsTogglePlacement?: 'form' | 'footer';
26
+ renderRecipientSearch?: (ctx: GuardrailRecipientSearchContext) => ReactNode;
27
+ renderStaticRecipient?: (ctx: GuardrailStaticRecipientContext) => ReactNode | undefined;
28
+ renderAppPicker?: (ctx: GuardrailAppPickerContext) => ReactNode;
29
+ escalateHelp?: ReactNode;
30
+ renderFieldSelector?: GuardrailRuleFieldSelectorRenderer;
31
+ selectionChips?: boolean;
32
+ confirmAlwaysEnforce?: () => boolean | Promise<boolean>;
33
+ docsHref?: string;
34
+ onDocsLinkClick?: () => void;
35
+ errors?: Partial<CustomGuardrailBuilderErrors>;
36
+ saveDisabled?: boolean;
37
+ labels?: Partial<CustomGuardrailBuilderLabels>;
38
+ className?: string;
39
+ }
40
+ export declare function CustomGuardrailBuilder({ open, guardrail, defaultName, existingNames, toolName, fields, filterFields, onSave, onCancel, onSaveAsNew, otherAppliedScopes, inline, hideHeader, dialogMaxWidth, title, evalsTogglePlacement, renderRecipientSearch, renderStaticRecipient, renderAppPicker, escalateHelp, renderFieldSelector, selectionChips, confirmAlwaysEnforce, docsHref, onDocsLinkClick, errors: hostErrors, saveDisabled: hostSaveDisabled, labels: labelOverrides, className, }: CustomGuardrailBuilderProps): import("react/jsx-runtime").JSX.Element;
41
+ export declare namespace CustomGuardrailBuilder {
42
+ var displayName: string;
43
+ }
44
+ //# sourceMappingURL=custom-guardrail-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-guardrail-builder.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Guardrails/custom-guardrail-builder.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAiD,MAAM,OAAO,CAAC;AACtF,OAAO,KAAK,EAEV,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,iBAAiB,CAAC;AAKzB,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,wBAAwB,CAAC;AAShC,OAAO,EAAE,KAAK,4BAA4B,EAAmC,MAAM,QAAQ,CAAC;AAC5F,OAAO,KAAK,EACV,mBAAmB,EAGnB,kCAAkC,EAClC,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAsBvB,MAAM,WAAW,2BAA2B;IAK1C,IAAI,EAAE,OAAO,CAAC;IAEd,SAAS,CAAC,EAAE,2BAA2B,CAAC;IAExC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAE7B,YAAY,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACzD,QAAQ,EAAE,MAAM,IAAI,CAAC;IAYrB,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAE/D,kBAAkB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,oBAAoB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzC,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,+BAA+B,KAAK,SAAS,CAAC;IAK5E,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,+BAA+B,KAAK,SAAS,GAAG,SAAS,CAAC;IACxF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,SAAS,CAAC;IAEhE,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB,mBAAmB,CAAC,EAAE,kCAAkC,CAAC;IAEzD,cAAc,CAAC,EAAE,OAAO,CAAC;IAKzB,oBAAoB,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAK7B,MAAM,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAK/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,SAAS,EACT,WAAW,EACX,aAAa,EACb,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,WAAW,EACX,kBAAyB,EACzB,MAAc,EACd,UAAkB,EAClB,cAAoB,EACpB,KAAK,EACL,oBAA6B,EAC7B,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAsB,EACtB,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAwB,EACtC,MAAM,EAAE,cAAc,EACtB,SAAS,GACV,EAAE,2BAA2B,2CAyP7B;yBAvRe,sBAAsB"}
@@ -0,0 +1,239 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Separator, cn } from "@uipath/apollo-wind";
3
+ import { useCallback, useId, useMemo, useRef, useState } from "react";
4
+ import { GuardrailActionSection } from "./components/guardrail-action-section.js";
5
+ import { GuardrailEvalsToggle } from "./components/guardrail-evals-toggle.js";
6
+ import { GuardrailNameFields } from "./components/guardrail-name-fields.js";
7
+ import { MixedScopesBanner } from "./components/mixed-scopes-banner.js";
8
+ import { getCustomGuardrailErrorFields, initCustomGuardrailBuilderFormData } from "./custom-builder-utils.js";
9
+ import { GuardrailFilterFieldSelector } from "./guardrail-filter-field-selector.js";
10
+ import { GuardrailFormLayout } from "./guardrail-form-layout.js";
11
+ import { GuardrailRulesSection } from "./guardrail-rules-section.js";
12
+ import { useCustomGuardrailBuilderLabels } from "./i18n.js";
13
+ import { useGuardrailFormErrors } from "./use-guardrail-form-errors.js";
14
+ import { useSwallowEnter } from "./use-swallow-enter.js";
15
+ const CUSTOM_BUILDER_ERROR_MERGES = {
16
+ perRule: {
17
+ merge: (internal, host)=>Array.from({
18
+ length: Math.max(internal?.length ?? 0, host.length)
19
+ }, (_, index)=>{
20
+ const fromHost = host[index];
21
+ const own = internal?.[index];
22
+ if (!fromHost) return own;
23
+ return {
24
+ fields: fromHost.fields ?? own?.fields,
25
+ value: fromHost.value ?? own?.value
26
+ };
27
+ }),
28
+ hasMessage: (host)=>host.some((rule)=>rule?.fields !== void 0 || rule?.value !== void 0)
29
+ }
30
+ };
31
+ function CustomGuardrailBuilder({ open, guardrail, defaultName, existingNames, toolName, fields, filterFields, onSave, onCancel, onSaveAsNew, otherAppliedScopes = null, inline = false, hideHeader = false, dialogMaxWidth = 800, title, evalsTogglePlacement = 'form', renderRecipientSearch, renderStaticRecipient, renderAppPicker, escalateHelp, renderFieldSelector, selectionChips = false, confirmAlwaysEnforce, docsHref, onDocsLinkClick, errors: hostErrors, saveDisabled: hostSaveDisabled = false, labels: labelOverrides, className }) {
32
+ const labels = useCustomGuardrailBuilderLabels(labelOverrides);
33
+ const uid = useId();
34
+ const [formData, setFormData] = useState(()=>{
35
+ const data = initCustomGuardrailBuilderFormData(guardrail, toolName);
36
+ if (!guardrail && defaultName) data.name = defaultName;
37
+ return data;
38
+ });
39
+ const rootRef = useRef(null);
40
+ useSwallowEnter(rootRef);
41
+ const updateField = useCallback((field, value)=>{
42
+ setFormData((prev)=>({
43
+ ...prev,
44
+ [field]: value
45
+ }));
46
+ }, []);
47
+ const handleActionChange = useCallback((action)=>updateField('action', 'filter' === action.$actionType ? {
48
+ $actionType: 'filter',
49
+ fields: []
50
+ } : action), [
51
+ updateField
52
+ ]);
53
+ const handleRequestAlwaysEnforce = useCallback((next)=>{
54
+ if (!confirmAlwaysEnforce) return;
55
+ const answer = confirmAlwaysEnforce();
56
+ if ('boolean' == typeof answer) {
57
+ if (answer) updateField('rules', next);
58
+ return;
59
+ }
60
+ answer.then((confirmed)=>{
61
+ if (confirmed) updateField('rules', next);
62
+ });
63
+ }, [
64
+ confirmAlwaysEnforce,
65
+ updateField
66
+ ]);
67
+ const guardrailResult = useMemo(()=>({
68
+ id: formData.id,
69
+ $guardrailType: 'custom',
70
+ name: formData.name,
71
+ description: formData.description || void 0,
72
+ selector: formData.selector,
73
+ action: formData.action,
74
+ enabledForEvals: formData.enabledForEvals,
75
+ rules: formData.rules
76
+ }), [
77
+ formData
78
+ ]);
79
+ const internalErrors = useMemo(()=>{
80
+ const failing = getCustomGuardrailErrorFields(formData, existingNames);
81
+ const e = {};
82
+ if (failing.name) e.name = 'required' === failing.name ? labels.nameRequiredError : labels.nameDuplicateError;
83
+ const [rulesField] = failing.rules;
84
+ if (rulesField) e.rules = ({
85
+ required: labels.rulesRequiredError,
86
+ alwaysCombined: labels.rulesAlwaysCombinedError,
87
+ invalidRules: labels.rulesInvalidError
88
+ })[rulesField];
89
+ if (failing.perRule.some((ruleFields)=>ruleFields.length > 0)) e.perRule = failing.perRule.map((ruleFields)=>0 === ruleFields.length ? void 0 : {
90
+ fields: ruleFields.includes('fields') ? labels.ruleFieldsRequiredError : void 0,
91
+ value: ruleFields.includes('value') ? labels.ruleValueRequiredError : void 0
92
+ });
93
+ for (const field of failing.action)e[field] = ({
94
+ blockReason: labels.blockReasonRequiredError,
95
+ filterFields: labels.filterFieldsRequiredError,
96
+ recipient: labels.recipientRequiredError,
97
+ actionApp: labels.actionAppRequiredError
98
+ })[field];
99
+ return e;
100
+ }, [
101
+ formData,
102
+ existingNames,
103
+ labels
104
+ ]);
105
+ const { displayErrors, isValid, revealErrors } = useGuardrailFormErrors(internalErrors, hostErrors, CUSTOM_BUILDER_ERROR_MERGES);
106
+ const handleSave = useCallback(()=>{
107
+ if (!isValid) return void revealErrors();
108
+ onSave(guardrailResult);
109
+ }, [
110
+ guardrailResult,
111
+ onSave,
112
+ isValid,
113
+ revealErrors
114
+ ]);
115
+ const handleSaveAsNew = useCallback(()=>{
116
+ if (!onSaveAsNew) return;
117
+ if (!isValid) return void revealErrors();
118
+ onSaveAsNew(guardrailResult);
119
+ }, [
120
+ guardrailResult,
121
+ onSaveAsNew,
122
+ isValid,
123
+ revealErrors
124
+ ]);
125
+ const evalsToggle = /*#__PURE__*/ jsx(GuardrailEvalsToggle, {
126
+ idPrefix: `${uid}-custom`,
127
+ checked: formData.enabledForEvals,
128
+ onCheckedChange: (checked)=>updateField('enabledForEvals', checked),
129
+ labels: labels
130
+ });
131
+ const [docsBefore, docsAfter] = labels.helpDocs.split('{{docsLink}}');
132
+ const formBody = /*#__PURE__*/ jsxs("div", {
133
+ ref: rootRef,
134
+ "data-slot": "custom-guardrail-builder",
135
+ className: cn('space-y-4 py-4', className),
136
+ children: [
137
+ /*#__PURE__*/ jsxs("p", {
138
+ "data-slot": "custom-guardrail-builder-help",
139
+ className: "text-sm text-muted-foreground",
140
+ children: [
141
+ labels.helpText,
142
+ void 0 !== docsHref && /*#__PURE__*/ jsxs(Fragment, {
143
+ children: [
144
+ ' ',
145
+ docsBefore,
146
+ /*#__PURE__*/ jsx("a", {
147
+ href: docsHref,
148
+ target: "_blank",
149
+ rel: "noopener noreferrer",
150
+ className: "text-primary hover:underline",
151
+ onClick: onDocsLinkClick,
152
+ children: labels.docsLink
153
+ }),
154
+ docsAfter
155
+ ]
156
+ })
157
+ ]
158
+ }),
159
+ /*#__PURE__*/ jsx(GuardrailNameFields, {
160
+ idPrefix: `${uid}-custom`,
161
+ name: formData.name,
162
+ description: formData.description,
163
+ onNameChange: (name)=>updateField('name', name),
164
+ onDescriptionChange: (description)=>updateField("description", description),
165
+ nameError: displayErrors.name,
166
+ labels: labels
167
+ }),
168
+ /*#__PURE__*/ jsx(GuardrailRulesSection, {
169
+ rules: formData.rules,
170
+ onRulesChange: (rules)=>updateField('rules', rules),
171
+ fields: fields,
172
+ onRequestAlwaysEnforce: confirmAlwaysEnforce ? handleRequestAlwaysEnforce : void 0,
173
+ renderFieldSelector: renderFieldSelector,
174
+ selectionChips: selectionChips,
175
+ errors: {
176
+ rules: displayErrors.rules,
177
+ perRule: displayErrors.perRule
178
+ }
179
+ }),
180
+ /*#__PURE__*/ jsx(Separator, {}),
181
+ /*#__PURE__*/ jsx("div", {
182
+ className: "space-y-3",
183
+ children: /*#__PURE__*/ jsx(GuardrailActionSection, {
184
+ action: formData.action,
185
+ onActionChange: handleActionChange,
186
+ showFilter: true,
187
+ filterContent: /*#__PURE__*/ jsx(GuardrailFilterFieldSelector, {
188
+ fields: filterFields,
189
+ value: 'filter' === formData.action.$actionType ? formData.action.fields : [],
190
+ onChange: (picked)=>updateField('action', {
191
+ $actionType: 'filter',
192
+ fields: picked
193
+ }),
194
+ error: displayErrors.filterFields,
195
+ selectionChips: selectionChips
196
+ }),
197
+ errors: {
198
+ blockReason: displayErrors.blockReason,
199
+ recipient: displayErrors.recipient,
200
+ actionApp: displayErrors.actionApp
201
+ },
202
+ renderRecipientSearch: renderRecipientSearch,
203
+ renderStaticRecipient: renderStaticRecipient,
204
+ renderAppPicker: renderAppPicker,
205
+ escalateHelp: escalateHelp
206
+ })
207
+ }),
208
+ 'form' === evalsTogglePlacement && evalsToggle,
209
+ /*#__PURE__*/ jsx(MixedScopesBanner, {
210
+ otherAppliedScopes: otherAppliedScopes,
211
+ labels: labels
212
+ })
213
+ ]
214
+ });
215
+ const secondaryAction = onSaveAsNew ? {
216
+ label: labels.saveAsNew,
217
+ onClick: handleSaveAsNew,
218
+ disabled: hostSaveDisabled
219
+ } : void 0;
220
+ return /*#__PURE__*/ jsx(GuardrailFormLayout, {
221
+ open: open,
222
+ title: title ?? (guardrail ? labels.editTitle : labels.addTitle),
223
+ onSave: handleSave,
224
+ onCancel: onCancel,
225
+ inline: inline,
226
+ hideHeader: hideHeader,
227
+ dialogMaxWidth: dialogMaxWidth,
228
+ secondaryAction: secondaryAction,
229
+ saveDisabled: hostSaveDisabled,
230
+ footerStart: 'footer' === evalsTogglePlacement ? evalsToggle : void 0,
231
+ labels: {
232
+ cancel: labels.cancel,
233
+ save: labels.save
234
+ },
235
+ children: formBody
236
+ });
237
+ }
238
+ CustomGuardrailBuilder.displayName = 'CustomGuardrailBuilder';
239
+ export { CustomGuardrailBuilder };