@bikdotai/bik-component-library 0.0.875-beta.2 → 0.0.875-beta.3
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/cjs/components/agent-builder/components/ConfigToolPanel.js +11 -11
- package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +2 -2
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +4 -4
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/utils/sourceIcons.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/OpennedDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuItem.js +27 -10
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuItem.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuList.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/MenuList.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/SelectAllMenu.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/menu/SelectAllMenu.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js.map +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/utils/iterationOnOptions.js +1 -1
- package/dist/cjs/components/dropdown/OpenedDropdown/utils/iterationOnOptions.js.map +1 -1
- package/dist/cjs/components/dropdown/hooks/useDropdown.js +1 -1
- package/dist/cjs/components/dropdown/hooks/useDropdown.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.d.ts +0 -12
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +145 -149
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +0 -12
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +82 -86
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionPicker.js +5 -5
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.d.ts +0 -12
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +48 -52
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/index.d.ts +2 -18
- package/dist/esm/components/agent-builder/utils/sourceIcons.js +43 -43
- package/dist/esm/components/agent-builder/utils/toolActions.js +3 -3
- package/dist/esm/components/dropdown/OpenedDropdown/components/OpennedDropdown.js +300 -278
- package/dist/esm/components/dropdown/OpenedDropdown/components/OpennedDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuItem.d.ts +8 -0
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuItem.js +170 -126
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuItem.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuList.d.ts +4 -0
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuList.js +144 -112
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/MenuList.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/SelectAllMenu.d.ts +1 -0
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/SelectAllMenu.js +32 -31
- package/dist/esm/components/dropdown/OpenedDropdown/components/menu/SelectAllMenu.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.d.ts +2 -0
- package/dist/esm/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js +54 -39
- package/dist/esm/components/dropdown/OpenedDropdown/components/multiSelect/MultiSelectDropdownBottomBar.js.map +1 -1
- package/dist/esm/components/dropdown/OpenedDropdown/utils/iterationOnOptions.d.ts +18 -16
- package/dist/esm/components/dropdown/OpenedDropdown/utils/iterationOnOptions.js +73 -27
- package/dist/esm/components/dropdown/OpenedDropdown/utils/iterationOnOptions.js.map +1 -1
- package/dist/esm/components/dropdown/hooks/useDropdown.d.ts +4 -17
- package/dist/esm/components/dropdown/hooks/useDropdown.js +176 -163
- package/dist/esm/components/dropdown/hooks/useDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/type.d.ts +22 -0
- package/dist/esm/index.js +772 -816
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { jsxs as pe, Fragment as
|
|
2
|
-
import { useState as i, useRef as C, useMemo as
|
|
3
|
-
import
|
|
1
|
+
import { jsxs as pe, Fragment as Ue, jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import { useState as i, useRef as C, useMemo as ze, useCallback as a } from "react";
|
|
3
|
+
import He from "styled-components";
|
|
4
4
|
import { addUnique as fe } from "../../../utils/arrayUtils.js";
|
|
5
5
|
import { COLORS as Q } from "../../../constants/Theme.js";
|
|
6
|
-
import { AGENT_CHAR_LIMITS as
|
|
7
|
-
import { CONFIG_TOOL_SOURCES as
|
|
8
|
-
import { buildAgentMentionItems as
|
|
9
|
-
import { partitionSources as
|
|
6
|
+
import { AGENT_CHAR_LIMITS as $e } from "../constants/charLimits.js";
|
|
7
|
+
import { CONFIG_TOOL_SOURCES as Fe, ToolSource as g, CONFIG_TOOL_SOURCE_BY_KEY as Ye, INTEGRATIONS_LABEL as je, INTEGRATIONS_KEY as We } from "../constants/tools.js";
|
|
8
|
+
import { buildAgentMentionItems as qe, buildCustomToolMentionItems as Xe, restApiMentionItem as Ze, configToolMentionItem as Je, restApiToolName as Qe, configToolName as Ve, toolSourceLabel as et } from "../utils/mentionSerialization.js";
|
|
9
|
+
import { partitionSources as tt } from "../utils/sourceGrouping.js";
|
|
10
10
|
import { sourceIcon as V, SOURCE_ICONS as ge, renderSourceIcon as he } from "../utils/sourceIcons.js";
|
|
11
|
-
import { buildToolActions as
|
|
12
|
-
import { ConfigToolPanel as
|
|
13
|
-
import { DRAWER_BODY_STYLE as
|
|
11
|
+
import { buildToolActions as ot } from "../utils/toolActions.js";
|
|
12
|
+
import { ConfigToolPanel as nt } from "./ConfigToolPanel.js";
|
|
13
|
+
import { DRAWER_BODY_STYLE as st, DRAWER_HEADER_STYLE as rt, DrawerHeaderText as it } from "./DrawerHeaderText.js";
|
|
14
14
|
import { MentionEditor as ye } from "./MentionEditor.js";
|
|
15
|
-
import { RestApiToolPanel as
|
|
16
|
-
import { SelectableListSection as
|
|
17
|
-
import { SideModal as
|
|
18
|
-
import { Input as
|
|
19
|
-
import { Toaster as
|
|
20
|
-
const
|
|
15
|
+
import { RestApiToolPanel as lt } from "./RestApiToolPanel.js";
|
|
16
|
+
import { SelectableListSection as at } from "./SelectableListSection.js";
|
|
17
|
+
import { SideModal as ct } from "../../side-modal/SideModal.js";
|
|
18
|
+
import { Input as ut } from "../../input/Input.js";
|
|
19
|
+
import { Toaster as dt } from "../../toaster/Toaster.js";
|
|
20
|
+
const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
21
21
|
const r = w ?? [];
|
|
22
22
|
return r.some((u) => u.id === h.id) ? r.map((u) => u.id === h.id ? h : u) : [...r, h];
|
|
23
|
-
}, Ie =
|
|
23
|
+
}, Ie = He.button`
|
|
24
24
|
align-self: flex-start;
|
|
25
25
|
border: 1px solid ${Q.stroke.primary};
|
|
26
26
|
color: ${Q.content.primary};
|
|
@@ -36,7 +36,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
36
36
|
cursor: default;
|
|
37
37
|
opacity: 0.6;
|
|
38
38
|
}
|
|
39
|
-
`,
|
|
39
|
+
`, Nt = ({
|
|
40
40
|
onClose: w,
|
|
41
41
|
onSave: h,
|
|
42
42
|
availableTools: r,
|
|
@@ -49,28 +49,26 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
49
49
|
initial: T,
|
|
50
50
|
existingNames: be = [],
|
|
51
51
|
appLabel: I = "Manifest",
|
|
52
|
-
charLimits: A =
|
|
53
|
-
variablesData: E
|
|
54
|
-
element: Ce,
|
|
55
|
-
footerDirection: Se
|
|
52
|
+
charLimits: A = $e,
|
|
53
|
+
variablesData: E
|
|
56
54
|
}) => {
|
|
57
|
-
const [D,
|
|
55
|
+
const [D, Ce] = i(T?.name ?? ""), [v, O] = i(T?.instructions ?? ""), [x, k] = i(T?.guardrail ?? ""), [L, N] = i(T?.tools ?? []), [p, P] = i(
|
|
58
56
|
T?.configTools ?? []
|
|
59
57
|
), [d, U] = i(
|
|
60
58
|
T?.restApiTools ?? []
|
|
61
|
-
), [l, b] = i(null), M = C(0), [se, re] = i(!1), [
|
|
59
|
+
), [l, b] = i(null), M = C(0), [se, re] = i(!1), [Se, z] = i(0), [Ae, H] = i(0), [R, ie] = i(null), $ = ze(
|
|
62
60
|
() => [
|
|
63
|
-
...
|
|
64
|
-
...
|
|
61
|
+
...qe(r, [], I),
|
|
62
|
+
...Xe(p, d)
|
|
65
63
|
],
|
|
66
64
|
[r, I, p, d]
|
|
67
|
-
), K = C({}), F = C("instructions"),
|
|
65
|
+
), K = C({}), F = C("instructions"), ve = a((e) => {
|
|
68
66
|
K.current.instructions = e ?? void 0;
|
|
69
|
-
}, []),
|
|
67
|
+
}, []), xe = a((e) => {
|
|
70
68
|
K.current.guardrail = e ?? void 0;
|
|
71
|
-
}, []),
|
|
69
|
+
}, []), Re = a(() => {
|
|
72
70
|
F.current = "instructions";
|
|
73
|
-
}, []),
|
|
71
|
+
}, []), _e = a(() => {
|
|
74
72
|
F.current = "guardrail";
|
|
75
73
|
}, []), le = C(/* @__PURE__ */ new Set());
|
|
76
74
|
le.current = new Set(
|
|
@@ -102,35 +100,35 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
102
100
|
});
|
|
103
101
|
},
|
|
104
102
|
[]
|
|
105
|
-
),
|
|
103
|
+
), we = a(
|
|
106
104
|
(e, t) => {
|
|
107
|
-
const o = t ??
|
|
105
|
+
const o = t ?? Fe[e]?.[0];
|
|
108
106
|
o ? j(o) : Y();
|
|
109
107
|
},
|
|
110
108
|
[j, Y]
|
|
111
|
-
),
|
|
109
|
+
), Ee = a(
|
|
112
110
|
(e) => {
|
|
113
111
|
const t = !d.some((o) => o.id === e.id);
|
|
114
112
|
U((o) => Te(o, e)), t && _(
|
|
115
113
|
e.id,
|
|
116
|
-
|
|
114
|
+
Ze(e).label,
|
|
117
115
|
g.RestApi
|
|
118
116
|
), b(null);
|
|
119
117
|
},
|
|
120
118
|
[d, _]
|
|
121
|
-
),
|
|
119
|
+
), Oe = a(
|
|
122
120
|
(e) => {
|
|
123
121
|
const t = !p.some((o) => o.id === e.id);
|
|
124
122
|
P((o) => Te(o, e)), t && _(
|
|
125
123
|
e.id,
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
Je(e).label,
|
|
125
|
+
Ye[e.tool_key]
|
|
128
126
|
), b(null);
|
|
129
127
|
},
|
|
130
128
|
[p, _]
|
|
131
129
|
), [W, q] = i(
|
|
132
130
|
null
|
|
133
|
-
), X = C(null), ce = C(0),
|
|
131
|
+
), X = C(null), ce = C(0), ke = (e) => {
|
|
134
132
|
const t = r.find((n) => n.tool_id === e)?.display_name ?? d.find((n) => n.id === e)?.name ?? "Tool", o = `{{tool:${e}}}`, m = (n) => n.split(o).join("");
|
|
135
133
|
X.current = {
|
|
136
134
|
instructions: v,
|
|
@@ -139,12 +137,12 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
139
137
|
configTools: p,
|
|
140
138
|
restApiTools: d
|
|
141
139
|
}, O((n) => m(n)), k((n) => m(n)), N((n) => n.filter((f) => f !== e)), P((n) => n.filter((f) => f.id !== e)), U((n) => n.filter((f) => f.id !== e)), z((n) => n + 1), H((n) => n + 1), ce.current += 1, q({ id: ce.current, message: `Tool "${t}" removed` });
|
|
142
|
-
},
|
|
140
|
+
}, Ne = () => {
|
|
143
141
|
const e = X.current;
|
|
144
142
|
e && (O(e.instructions), k(e.guardrail), N(e.tools), P(e.configTools), U(e.restApiTools), z((t) => t + 1), H((t) => t + 1), X.current = null), q(null);
|
|
145
143
|
}, Z = D.trim(), J = Z.length > 0 && be.some(
|
|
146
144
|
(e) => e.trim().toLowerCase() === Z.toLowerCase()
|
|
147
|
-
), ue = Z.length > 0 && !J && (v.trim().length > 0 || x.trim().length > 0),
|
|
145
|
+
), ue = Z.length > 0 && !J && (v.trim().length > 0 || x.trim().length > 0), Me = L.map((e) => {
|
|
148
146
|
const t = r.find((o) => o.tool_id === e);
|
|
149
147
|
return t ? {
|
|
150
148
|
id: e,
|
|
@@ -154,30 +152,30 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
154
152
|
// the main builder's Step 3 tool rows.
|
|
155
153
|
authRequired: t.auth_required
|
|
156
154
|
} : null;
|
|
157
|
-
}).filter((e) => e !== null),
|
|
155
|
+
}).filter((e) => e !== null), Ke = d.map((e) => ({
|
|
158
156
|
id: e.id,
|
|
159
|
-
label:
|
|
157
|
+
label: Qe(e),
|
|
160
158
|
icon: ge[g.RestApi],
|
|
161
159
|
onConfigure: () => Y(e)
|
|
162
|
-
})),
|
|
160
|
+
})), Be = p.map((e) => ({
|
|
163
161
|
id: e.id,
|
|
164
|
-
label:
|
|
162
|
+
label: Ve(e),
|
|
165
163
|
icon: ge[e.tool_key === "send_slack_message" ? g.Slack : g.EmailHandover],
|
|
166
164
|
onConfigure: () => j(e.tool_key, e)
|
|
167
|
-
})),
|
|
168
|
-
...
|
|
169
|
-
...
|
|
170
|
-
...
|
|
171
|
-
], B =
|
|
165
|
+
})), Ge = [
|
|
166
|
+
...Me,
|
|
167
|
+
...Ke,
|
|
168
|
+
...Be
|
|
169
|
+
], B = ot(
|
|
172
170
|
oe,
|
|
173
|
-
|
|
171
|
+
we,
|
|
174
172
|
y,
|
|
175
173
|
S
|
|
176
|
-
), de = l?.kind === "config" && l.toolKey ? oe?.[l.toolKey] : void 0,
|
|
174
|
+
), de = l?.kind === "config" && l.toolKey ? oe?.[l.toolKey] : void 0, De = r.map((e) => ({
|
|
177
175
|
label: e.display_name,
|
|
178
176
|
value: e.tool_id,
|
|
179
177
|
leadingIcon: he(V(e.source ?? g.Manifest)) ?? void 0
|
|
180
|
-
})),
|
|
178
|
+
})), Le = (() => {
|
|
181
179
|
const e = [], t = /* @__PURE__ */ new Map();
|
|
182
180
|
r.forEach((s) => {
|
|
183
181
|
const G = s.source ?? g.Manifest;
|
|
@@ -187,12 +185,12 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
187
185
|
leadingIcon: he(V(s.source ?? g.Manifest)) ?? void 0
|
|
188
186
|
});
|
|
189
187
|
});
|
|
190
|
-
const { outside: o, inside: m } =
|
|
188
|
+
const { outside: o, inside: m } = tt(
|
|
191
189
|
[...e, ...B.map((s) => s.source)],
|
|
192
190
|
y
|
|
193
191
|
), n = new Set(o), f = e.filter((s) => n.has(s)).map((s) => ({
|
|
194
192
|
source: s,
|
|
195
|
-
label:
|
|
193
|
+
label: et(s, I),
|
|
196
194
|
options: t.get(s) ?? [],
|
|
197
195
|
// Reachable only when connected or ungated, so no connect flow needed —
|
|
198
196
|
// kept for the picker's own gating, which reads these groups.
|
|
@@ -200,13 +198,13 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
200
198
|
onConnect: () => S?.(s)
|
|
201
199
|
}));
|
|
202
200
|
return m.length > 0 && f.push({
|
|
203
|
-
source:
|
|
204
|
-
label:
|
|
201
|
+
source: We,
|
|
202
|
+
label: je,
|
|
205
203
|
// No options of its own: clicking opens the picker at the umbrella,
|
|
206
204
|
// where each unconnected source offers "Connect".
|
|
207
205
|
options: []
|
|
208
206
|
}), f;
|
|
209
|
-
})(),
|
|
207
|
+
})(), Pe = async () => {
|
|
210
208
|
if (!ue || se)
|
|
211
209
|
return;
|
|
212
210
|
const e = h({
|
|
@@ -236,25 +234,23 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
236
234
|
}
|
|
237
235
|
}
|
|
238
236
|
};
|
|
239
|
-
return /* @__PURE__ */ pe(
|
|
237
|
+
return /* @__PURE__ */ pe(Ue, { children: [
|
|
240
238
|
/* @__PURE__ */ pe(
|
|
241
|
-
|
|
239
|
+
ct,
|
|
242
240
|
{
|
|
243
241
|
header: ne,
|
|
244
242
|
closeOnEscapeKey: !1,
|
|
245
|
-
zIndex:
|
|
246
|
-
element: Ce,
|
|
247
|
-
footerDirection: Se,
|
|
243
|
+
zIndex: mt,
|
|
248
244
|
headerCustomComponent: /* @__PURE__ */ c(
|
|
249
|
-
|
|
245
|
+
it,
|
|
250
246
|
{
|
|
251
247
|
title: ne,
|
|
252
248
|
subtitle: "Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."
|
|
253
249
|
}
|
|
254
250
|
),
|
|
255
251
|
width: "421px",
|
|
256
|
-
headerStyle:
|
|
257
|
-
bodyStyle:
|
|
252
|
+
headerStyle: rt,
|
|
253
|
+
bodyStyle: st,
|
|
258
254
|
onClose: w,
|
|
259
255
|
saveButtonProps: {
|
|
260
256
|
"data-test": "subagent-save",
|
|
@@ -263,7 +259,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
263
259
|
size: "small",
|
|
264
260
|
disabled: !ue,
|
|
265
261
|
isLoading: se,
|
|
266
|
-
onClick:
|
|
262
|
+
onClick: Pe
|
|
267
263
|
},
|
|
268
264
|
cancelButtonProps: {
|
|
269
265
|
"data-test": "subagent-cancel",
|
|
@@ -274,7 +270,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
274
270
|
},
|
|
275
271
|
children: [
|
|
276
272
|
/* @__PURE__ */ c(
|
|
277
|
-
|
|
273
|
+
ut,
|
|
278
274
|
{
|
|
279
275
|
"data-test": "subagent-name",
|
|
280
276
|
labelText: "Agent name",
|
|
@@ -286,7 +282,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
286
282
|
maxCharStyle: { fontSize: 12, lineHeight: "16px" },
|
|
287
283
|
state: J ? "invalid" : void 0,
|
|
288
284
|
errorMessage: J ? "A sub-agent with this name already exists" : void 0,
|
|
289
|
-
onChangeText:
|
|
285
|
+
onChangeText: Ce
|
|
290
286
|
}
|
|
291
287
|
),
|
|
292
288
|
/* @__PURE__ */ c(
|
|
@@ -299,7 +295,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
299
295
|
maxLength: A.instructions,
|
|
300
296
|
placeholder: "Write the steps in plain English. The agent will follow them exactly. The more specific you are, the better it performs.",
|
|
301
297
|
minHeight: "160px",
|
|
302
|
-
resetKey: `instr-${
|
|
298
|
+
resetKey: `instr-${Se}`,
|
|
303
299
|
mentionItems: $,
|
|
304
300
|
tools: r,
|
|
305
301
|
toolActions: B,
|
|
@@ -309,8 +305,8 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
309
305
|
appLabel: I,
|
|
310
306
|
onConnectIntegration: S,
|
|
311
307
|
onMentionSelect: ae,
|
|
312
|
-
onFocus:
|
|
313
|
-
registerInsert:
|
|
308
|
+
onFocus: Re,
|
|
309
|
+
registerInsert: ve,
|
|
314
310
|
action: u ? /* @__PURE__ */ c(
|
|
315
311
|
Ie,
|
|
316
312
|
{
|
|
@@ -333,7 +329,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
333
329
|
maxLength: A.guardrail,
|
|
334
330
|
placeholder: "e.g. Never discuss competitor pricing. Always stay within the cancellation policy. Do not process refunds above ₹10,000 without human approval.",
|
|
335
331
|
minHeight: "160px",
|
|
336
|
-
resetKey: `guard-${
|
|
332
|
+
resetKey: `guard-${Ae}`,
|
|
337
333
|
mentionItems: $,
|
|
338
334
|
tools: r,
|
|
339
335
|
toolActions: B,
|
|
@@ -343,8 +339,8 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
343
339
|
appLabel: I,
|
|
344
340
|
onConnectIntegration: S,
|
|
345
341
|
onMentionSelect: ae,
|
|
346
|
-
onFocus:
|
|
347
|
-
registerInsert:
|
|
342
|
+
onFocus: _e,
|
|
343
|
+
registerInsert: xe,
|
|
348
344
|
action: u ? /* @__PURE__ */ c(
|
|
349
345
|
Ie,
|
|
350
346
|
{
|
|
@@ -358,13 +354,13 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
358
354
|
}
|
|
359
355
|
),
|
|
360
356
|
/* @__PURE__ */ c(
|
|
361
|
-
|
|
357
|
+
at,
|
|
362
358
|
{
|
|
363
359
|
title: "Tools this agent can use",
|
|
364
360
|
dataTestPrefix: "subagent-tools",
|
|
365
|
-
items:
|
|
366
|
-
addableOptions:
|
|
367
|
-
sourceGroups:
|
|
361
|
+
items: Ge,
|
|
362
|
+
addableOptions: De,
|
|
363
|
+
sourceGroups: Le,
|
|
368
364
|
integrationStatus: y,
|
|
369
365
|
onConnectIntegration: (e) => S?.(e),
|
|
370
366
|
mentionItems: $,
|
|
@@ -375,7 +371,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
375
371
|
onAdd: (e) => {
|
|
376
372
|
_(e), N((t) => fe(t, e));
|
|
377
373
|
},
|
|
378
|
-
onRemove:
|
|
374
|
+
onRemove: ke,
|
|
379
375
|
confirmDelete: { noun: "tool", zIndex: ee + 1 }
|
|
380
376
|
}
|
|
381
377
|
)
|
|
@@ -383,20 +379,20 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
383
379
|
}
|
|
384
380
|
),
|
|
385
381
|
l?.kind === "restapi" && /* @__PURE__ */ c(
|
|
386
|
-
|
|
382
|
+
lt,
|
|
387
383
|
{
|
|
388
384
|
initial: l.initialRest,
|
|
389
385
|
charLimits: A,
|
|
390
386
|
variablesData: E,
|
|
391
387
|
onImprove: te,
|
|
392
388
|
onClose: () => b(null),
|
|
393
|
-
onSave:
|
|
389
|
+
onSave: Ee,
|
|
394
390
|
zIndex: ee
|
|
395
391
|
},
|
|
396
392
|
l.key
|
|
397
393
|
),
|
|
398
394
|
l?.kind === "config" && l.toolKey && de && /* @__PURE__ */ c(
|
|
399
|
-
|
|
395
|
+
nt,
|
|
400
396
|
{
|
|
401
397
|
toolKey: l.toolKey,
|
|
402
398
|
template: de,
|
|
@@ -405,13 +401,13 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
405
401
|
variablesData: E,
|
|
406
402
|
onImprove: te,
|
|
407
403
|
onClose: () => b(null),
|
|
408
|
-
onSave:
|
|
404
|
+
onSave: Oe,
|
|
409
405
|
zIndex: ee
|
|
410
406
|
},
|
|
411
407
|
l.key
|
|
412
408
|
),
|
|
413
409
|
W && /* @__PURE__ */ c(
|
|
414
|
-
|
|
410
|
+
dt,
|
|
415
411
|
{
|
|
416
412
|
text: W.message,
|
|
417
413
|
type: "info",
|
|
@@ -421,7 +417,7 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
421
417
|
buttonProps: {
|
|
422
418
|
buttonText: "Undo",
|
|
423
419
|
showButton: !0,
|
|
424
|
-
onButtonClick: () => (
|
|
420
|
+
onButtonClick: () => (Ne(), {})
|
|
425
421
|
},
|
|
426
422
|
onCloseToast: () => q(null)
|
|
427
423
|
},
|
|
@@ -430,6 +426,6 @@ const ft = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
430
426
|
] });
|
|
431
427
|
};
|
|
432
428
|
export {
|
|
433
|
-
|
|
429
|
+
Nt as CreateSubAgentPanel
|
|
434
430
|
};
|
|
435
431
|
//# sourceMappingURL=CreateSubAgentPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { SideModal } from '@src/components/side-modal';\nimport { Toaster } from '@src/components/toaster';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport type { VariableListInterfaceV3 } from '../../variable-picker-v3/model';\nimport {\n\tAgentTool,\n\tConfigToolConfig,\n\tConfigToolKey,\n\tParamsBlob,\n\tRestApiToolConfig,\n\tSubAgentDraft,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport {\n\tCONFIG_TOOL_SOURCE_BY_KEY,\n\tCONFIG_TOOL_SOURCES,\n\tINTEGRATIONS_KEY,\n\tINTEGRATIONS_LABEL,\n\tToolSource,\n} from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { partitionSources } from '../utils/sourceGrouping';\nimport {\n\trenderSourceIcon,\n\tSOURCE_ICONS,\n\tsourceIcon,\n} from '../utils/sourceIcons';\nimport { buildToolActions } from '../utils/toolActions';\nimport { ConfigToolPanel } from './ConfigToolPanel';\nimport {\n\tDRAWER_BODY_STYLE,\n\tDRAWER_HEADER_STYLE,\n\tDrawerHeaderText,\n} from './DrawerHeaderText';\nimport { MentionEditor } from './MentionEditor';\nimport { RestApiToolPanel } from './RestApiToolPanel';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\n/**\n * The sub-agent drawer sits above the main builder; its own tool drawers\n * (Rest API / email / Slack) stack one level higher so they open ON TOP of it\n * rather than behind (SideModal defaults to z-index 10).\n */\nconst SUBAGENT_ZINDEX = 1000;\nconst TOOL_DRAWER_ZINDEX = 1002;\n\n/** Upsert an item by id (replace when present, append otherwise). */\nconst upsertById = <T extends { id: string }>(\n\tlist: T[] | undefined,\n\titem: T,\n): T[] => {\n\tconst arr = list ?? [];\n\treturn arr.some((x) => x.id === item.id)\n\t\t? arr.map((x) => (x.id === item.id ? item : x))\n\t\t: [...arr, item];\n};\n\n/** Config-tool / Rest API drawer state; `key` remounts fresh per open. */\ninterface ToolDrawerState {\n\tkey: number;\n\tkind: 'restapi' | 'config';\n\ttoolKey?: ConfigToolKey;\n\tinitialRest?: RestApiToolConfig;\n\tinitialConfig?: ConfigToolConfig;\n}\n\n/** Inline \"Improve with AI\" action rendered below a mention editor. */\nconst ImproveButton = styled.button`\n\talign-self: flex-start;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tcolor: ${COLORS.content.primary};\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 6px 12px;\n\tfont-size: 13px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: 0.6;\n\t}\n`;\n\ntype InsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n\tsource?: string,\n) => void;\n\ninterface CreateSubAgentPanelProps {\n\tonClose: () => void;\n\t/** Persist the draft. The drawer shows a loader while the returned promise is pending. */\n\tonSave: (draft: SubAgentDraft) => void | Promise<void>;\n\tavailableTools: AgentTool[];\n\t/** Optional \"Improve with AI\" for instructions / guardrails. Omit to hide the buttons. */\n\tonImprove?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Optional \"Improve with AI\" for the Rest API / config-tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n\t/**\n\t * Backend templates (email / Slack) that drive the shared config-tool drawer.\n\t * Each present key enables its tool action in this drawer; absent → hidden.\n\t * Same prop the main builder gets — sub-agents can add the same tools.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/**\n\t * Per-source integration connection state (today: Slack). A source mapped to\n\t * `false` shows a \"Connect\" affordance instead of drilling into its tools —\n\t * same gating the main builder's Step 3 tool section gets.\n\t */\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\t/** Open the consumer's connect flow for an unconnected integration source. */\n\tonConnectIntegration?: (source: ToolSource) => void;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/**\n\t * Names of the other sub-agents already on this agent (exclude the one being\n\t * edited). Blocks saving a duplicate name — the LLM references sub-agents by it.\n\t */\n\texistingNames?: string[];\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n\t/**\n\t * Portal target for the drawer, passed straight to {@link SideModal}\n\t * (default `document.body`). Lets a host render it into its own positioned\n\t * slot rather than as a viewport overlay.\n\t */\n\telement?: Element | DocumentFragment;\n\t/**\n\t * Footer button order, passed straight to {@link SideModal} (default\n\t * `'row'`). Hosts that show this drawer beside their own footer can set\n\t * `'row-reverse'` to line the Cancel / Save order up with it.\n\t */\n\tfooterDirection?: 'row' | 'row-reverse';\n\t/** Variable catalog for the editors' `@` picker \"Variables\" view. */\n\tvariablesData?: VariableListInterfaceV3[];\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\tonImproveToolInstructions,\n\tconfigToolTemplates,\n\tintegrationStatus,\n\tonConnectIntegration,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\texistingNames = [],\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n\tvariablesData,\n\telement,\n\tfooterDirection,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\t// Inline-configured tools owned by this sub-agent (same drawers as the main\n\t// agent). Local to the drawer; flow to the consumer via the saved draft.\n\tconst [configTools, setConfigTools] = useState<ConfigToolConfig[]>(\n\t\tinitial?.configTools ?? [],\n\t);\n\tconst [restApiTools, setRestApiTools] = useState<RestApiToolConfig[]>(\n\t\tinitial?.restApiTools ?? [],\n\t);\n\tconst [toolDrawer, setToolDrawer] = useState<ToolDrawerState | null>(null);\n\tconst toolDrawerKeyRef = useRef(0);\n\tconst [saving, setSaving] = useState(false);\n\t// Bumped to remount a field after its text is replaced (e.g. by Improve).\n\tconst [instrKey, setInstrKey] = useState(0);\n\tconst [guardKey, setGuardKey] = useState(0);\n\tconst [improving, setImproving] = useState<\n\t\t'instructions' | 'guardrail' | null\n\t>(null);\n\n\t// Tools-only mention list (sub-agents can't reference other sub-agents), PLUS\n\t// this drawer's inline custom tools so their `{{tool:<id>}}` tokens rehydrate\n\t// as chips on remount (they aren't in `availableTools`).\n\tconst mentionItems = useMemo(\n\t\t() => [\n\t\t\t...buildAgentMentionItems(availableTools, [], appLabel),\n\t\t\t...buildCustomToolMentionItems(configTools, restApiTools),\n\t\t],\n\t\t[availableTools, appLabel, configTools, restApiTools],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\t// Latest custom-tool ids, readable from the mount-captured `@` onSelect handler\n\t// (BikEditor captures it once) — mirrors the context's valueRef trick.\n\tconst customToolIdsRef = useRef<Set<string>>(new Set());\n\tcustomToolIdsRef.current = new Set(\n\t\t[...configTools, ...restApiTools].map((t) => t.id),\n\t);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Only catalog tool ids belong in `tools`; custom tools (Rest API / email /\n\t\t\t// Slack) track themselves on their own lists. Picking an existing custom\n\t\t\t// tool from `@` must not leak its id in as a bogus native ref.\n\t\t\tif (kind === 'tool' && !customToolIdsRef.current.has(id)) {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback(\n\t\t(id: string, label?: string, source?: string) => {\n\t\t\tconst target =\n\t\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\t\tinsertersRef.current.instructions;\n\t\t\ttarget?.('tool', id, label, source);\n\t\t},\n\t\t[],\n\t);\n\n\t// Rest API (bespoke) + shared config-tool (email / Slack) drawers, same as the\n\t// main builder's Step 3 — here backed by the drawer's local state.\n\t// ponytail: mirrors Step3HowItResponds; kept local rather than sharing a hook\n\t// because Step3 is context-backed and this drawer is local-state.\n\tconst openRestApi = useCallback((tool?: RestApiToolConfig) => {\n\t\ttoolDrawerKeyRef.current += 1;\n\t\tsetToolDrawer({\n\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\tkind: 'restapi',\n\t\t\tinitialRest: tool,\n\t\t});\n\t}, []);\n\tconst openConfigTool = useCallback(\n\t\t(toolKey: ConfigToolKey, tool?: ConfigToolConfig) => {\n\t\t\ttoolDrawerKeyRef.current += 1;\n\t\t\tsetToolDrawer({\n\t\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\t\tkind: 'config',\n\t\t\t\ttoolKey,\n\t\t\t\tinitialConfig: tool,\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\tconst openToolAction = useCallback(\n\t\t(source: ToolSource, toolKey?: ConfigToolKey) => {\n\t\t\tconst key = toolKey ?? CONFIG_TOOL_SOURCES[source]?.[0];\n\t\t\tif (key) {\n\t\t\t\topenConfigTool(key);\n\t\t\t} else {\n\t\t\t\topenRestApi();\n\t\t\t}\n\t\t},\n\t\t[openConfigTool, openRestApi],\n\t);\n\tconst handleSaveRestApi = useCallback(\n\t\t(tool: RestApiToolConfig) => {\n\t\t\tconst isNew = !restApiTools.some((t) => t.id === tool.id);\n\t\t\tsetRestApiTools((prev) => upsertById(prev, tool));\n\t\t\t// Drop a reference chip at the cursor on creation (edits keep the chip).\n\t\t\t// Pass the source so the fresh chip shows its icon (not yet in the list).\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(\n\t\t\t\t\ttool.id,\n\t\t\t\t\trestApiMentionItem(tool).label,\n\t\t\t\t\tToolSource.RestApi,\n\t\t\t\t);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[restApiTools, insertToolAtCursor],\n\t);\n\tconst handleSaveConfigTool = useCallback(\n\t\t(tool: ConfigToolConfig) => {\n\t\t\tconst isNew = !configTools.some((t) => t.id === tool.id);\n\t\t\tsetConfigTools((prev) => upsertById(prev, tool));\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(\n\t\t\t\t\ttool.id,\n\t\t\t\t\tconfigToolMentionItem(tool).label,\n\t\t\t\t\tCONFIG_TOOL_SOURCE_BY_KEY[tool.tool_key],\n\t\t\t\t);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[configTools, insertToolAtCursor],\n\t);\n\n\t// Local undo toast for tool removal (drawer state isn't in AgentValue).\n\tconst [undo, setUndo] = useState<{ id: number; message: string } | null>(\n\t\tnull,\n\t);\n\tconst undoSnapshotRef = useRef<{\n\t\tinstructions: string;\n\t\tguardrail: string;\n\t\ttools: string[];\n\t\tconfigTools: ConfigToolConfig[];\n\t\trestApiTools: RestApiToolConfig[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\t// Remove ANY tool by id: strip its `{{tool:<id>}}` tokens, remount the fields,\n\t// and drop it from whichever list holds it (catalog `tools` or an inline\n\t// custom-tool list). One undo restores all of it.\n\tconst removeTool = (id: string) => {\n\t\tconst label =\n\t\t\tavailableTools.find((t) => t.tool_id === id)?.display_name ??\n\t\t\trestApiTools.find((t) => t.id === id)?.name ??\n\t\t\t'Tool';\n\t\t// The token stores the tool id (a tool's id is its tool_id).\n\t\tconst token = `{{tool:${id}}}`;\n\t\tconst strip = (text: string) => text.split(token).join('');\n\t\tundoSnapshotRef.current = {\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t};\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetConfigTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetRestApiTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({ id: undoIdRef.current, message: `Tool \"${label}\" removed` });\n\t};\n\n\tconst undoRemove = () => {\n\t\tconst snap = undoSnapshotRef.current;\n\t\tif (snap) {\n\t\t\tsetInstructions(snap.instructions);\n\t\t\tsetGuardrail(snap.guardrail);\n\t\t\tsetTools(snap.tools);\n\t\t\tsetConfigTools(snap.configTools);\n\t\t\tsetRestApiTools(snap.restApiTools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst nameTrimmed = name.trim();\n\t// Case-insensitive: two sub-agents on the same agent can't share a name (the\n\t// LLM references them by it) — mirrors the Rest API tool-name check.\n\tconst isDuplicateName =\n\t\tnameTrimmed.length > 0 &&\n\t\texistingNames.some(\n\t\t\t(n) => n.trim().toLowerCase() === nameTrimmed.toLowerCase(),\n\t\t);\n\tconst canSave =\n\t\tnameTrimmed.length > 0 &&\n\t\t!isDuplicateName &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: sourceIcon(tool.source ?? ToolSource.Manifest),\n\t\t\t\t\t\t// Shield flags a tool that needs customer verification, same as\n\t\t\t\t\t\t// the main builder's Step 3 tool rows.\n\t\t\t\t\t\tauthRequired: tool.auth_required,\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Inline-configured tools (Rest API + email / Slack) render as rows in the same\n\t// list, each with its own Configure (edit) action that reopens its drawer.\n\tconst restApiItems: SelectableItem[] = restApiTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: restApiToolName(t),\n\t\ticon: SOURCE_ICONS[ToolSource.RestApi],\n\t\tonConfigure: () => openRestApi(t),\n\t}));\n\tconst configToolItems: SelectableItem[] = configTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: configToolName(t),\n\t\ticon: SOURCE_ICONS[\n\t\t\tt.tool_key === 'send_slack_message'\n\t\t\t\t? ToolSource.Slack\n\t\t\t\t: ToolSource.EmailHandover\n\t\t],\n\t\tonConfigure: () => openConfigTool(t.tool_key, t),\n\t}));\n\tconst allToolItems: SelectableItem[] = [\n\t\t...toolItems,\n\t\t...restApiItems,\n\t\t...configToolItems,\n\t];\n\n\t// Built-in tool actions (Rest API / email / Slack); the shared email / Slack\n\t// forms appear only when their backend template was provided. Integration\n\t// state drives the \"Connect\" affordance, same as the main builder's Step 3.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\n\t\tintegrationStatus,\n\t\tonConnectIntegration,\n\t);\n\n\tconst openConfigTemplate =\n\t\ttoolDrawer?.kind === 'config' && toolDrawer.toolKey\n\t\t\t? configToolTemplates?.[toolDrawer.toolKey]\n\t\t\t: undefined;\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\tundefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? ToolSource.Manifest;\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\t\t\tundefined,\n\t\t\t});\n\t\t});\n\t\t// Same rule as the `@` picker: a source the store hasn't connected doesn't\n\t\t// get its own button — they all collapse into one \"Integrations\" button that\n\t\t// opens the picker on that group (SelectableListSection deep-links a source\n\t\t// button straight into the picker, and the umbrella key works like any other\n\t\t// source there). Action sources join the split too: Slack has no catalog\n\t\t// tools of its own, so without them an unconnected Slack would have nowhere\n\t\t// to live.\n\t\tconst { outside, inside } = partitionSources(\n\t\t\t[...order, ...toolActionSources.map((a) => a.source)],\n\t\t\tintegrationStatus,\n\t\t);\n\t\tconst shownOutside = new Set(outside);\n\t\tconst groups: SourceGroup[] = order\n\t\t\t.filter((src) => shownOutside.has(src))\n\t\t\t.map((src) => ({\n\t\t\t\tsource: src,\n\t\t\t\tlabel: toolSourceLabel(src, appLabel),\n\t\t\t\toptions: bySource.get(src) ?? [],\n\t\t\t\t// Reachable only when connected or ungated, so no connect flow needed —\n\t\t\t\t// kept for the picker's own gating, which reads these groups.\n\t\t\t\tconnected: integrationStatus?.[src as ToolSource],\n\t\t\t\tonConnect: () => onConnectIntegration?.(src as ToolSource),\n\t\t\t}));\n\t\tif (inside.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tsource: INTEGRATIONS_KEY,\n\t\t\t\tlabel: INTEGRATIONS_LABEL,\n\t\t\t\t// No options of its own: clicking opens the picker at the umbrella,\n\t\t\t\t// where each unconnected source offers \"Connect\".\n\t\t\t\toptions: [],\n\t\t\t});\n\t\t}\n\t\treturn groups;\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t});\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleImprove = async (kind: 'instructions' | 'guardrail') => {\n\t\tif (!onImprove || improving) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(kind);\n\t\ttry {\n\t\t\tconst current = kind === 'instructions' ? instructions : guardrail;\n\t\t\tconst improved = await onImprove(kind, current);\n\t\t\tif (kind === 'instructions') {\n\t\t\t\tsetInstructions(improved);\n\t\t\t\tsetInstrKey((k) => k + 1);\n\t\t\t} else {\n\t\t\t\tsetGuardrail(improved);\n\t\t\t\tsetGuardKey((k) => k + 1);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetImproving(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SideModal\n\t\t\t\theader={title}\n\t\t\t\tcloseOnEscapeKey={false}\n\t\t\t\tzIndex={SUBAGENT_ZINDEX}\n\t\t\t\telement={element}\n\t\t\t\tfooterDirection={footerDirection}\n\t\t\t\theaderCustomComponent={\n\t\t\t\t\t<DrawerHeaderText\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tsubtitle=\"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them.\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\twidth=\"421px\"\n\t\t\t\theaderStyle={DRAWER_HEADER_STYLE}\n\t\t\t\tbodyStyle={DRAWER_BODY_STYLE}\n\t\t\t\tonClose={onClose}\n\t\t\t\tsaveButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-save',\n\t\t\t\t\tbuttonText: 'Save',\n\t\t\t\t\tbuttonType: 'primary',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tdisabled: !canSave,\n\t\t\t\t\tisLoading: saving,\n\t\t\t\t\tonClick: handleSave,\n\t\t\t\t}}\n\t\t\t\tcancelButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-cancel',\n\t\t\t\t\tbuttonText: 'Cancel',\n\t\t\t\t\tbuttonType: 'tertiaryGray',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\tlabelTextBold\n\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\tvalue={name}\n\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\tstate={isDuplicateName ? 'invalid' : undefined}\n\t\t\t\t\terrorMessage={\n\t\t\t\t\t\tisDuplicateName\n\t\t\t\t\t\t\t? 'A sub-agent with this name already exists'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tonChangeText={setName}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\tvalue={instructions}\n\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\tplaceholder=\"Write the steps in plain English. The agent will follow them exactly. The more specific you are, the better it performs.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-instructions\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('instructions')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'instructions'\n\t\t\t\t\t\t\t\t\t? 'Improving…'\n\t\t\t\t\t\t\t\t\t: 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Always stay within the cancellation policy. Do not process refunds above ₹10,000 without human approval.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-guardrail\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('guardrail')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'guardrail' ? 'Improving…' : 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<SelectableListSection\n\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\titems={allToolItems}\n\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tonConnectIntegration={(source) =>\n\t\t\t\t\t\tonConnectIntegration?.(source as ToolSource)\n\t\t\t\t\t}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tpickerOpensUp\n\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\tconfirmDelete={{ noun: 'tool', zIndex: TOOL_DRAWER_ZINDEX + 1 }}\n\t\t\t\t/>\n\t\t\t</SideModal>\n\n\t\t\t{toolDrawer?.kind === 'restapi' && (\n\t\t\t\t<RestApiToolPanel\n\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\tinitial={toolDrawer.initialRest}\n\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\tonSave={handleSaveRestApi}\n\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{toolDrawer?.kind === 'config' &&\n\t\t\t\ttoolDrawer.toolKey &&\n\t\t\t\topenConfigTemplate && (\n\t\t\t\t\t<ConfigToolPanel\n\t\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\t\ttoolKey={toolDrawer.toolKey}\n\t\t\t\t\t\ttemplate={openConfigTemplate}\n\t\t\t\t\t\tinitial={toolDrawer.initialConfig}\n\t\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\t\tonSave={handleSaveConfigTool}\n\t\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t{undo && (\n\t\t\t\t<Toaster\n\t\t\t\t\tkey={undo.id}\n\t\t\t\t\ttext={undo.message}\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tposition=\"top-right\"\n\t\t\t\t\tautoClose={5000}\n\t\t\t\t\thideCloseButton\n\t\t\t\t\tbuttonProps={{\n\t\t\t\t\t\tbuttonText: 'Undo',\n\t\t\t\t\t\tshowButton: true,\n\t\t\t\t\t\tonButtonClick: () => {\n\t\t\t\t\t\t\tundoRemove();\n\t\t\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonCloseToast={() => setUndo(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n"],"names":["SUBAGENT_ZINDEX","TOOL_DRAWER_ZINDEX","upsertById","list","item","arr","x","ImproveButton","styled","COLORS","CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","onImproveToolInstructions","configToolTemplates","integrationStatus","onConnectIntegration","title","initial","existingNames","appLabel","charLimits","AGENT_CHAR_LIMITS","variablesData","element","footerDirection","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","configTools","setConfigTools","restApiTools","setRestApiTools","toolDrawer","setToolDrawer","toolDrawerKeyRef","useRef","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","buildCustomToolMentionItems","insertersRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","customToolIdsRef","t","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","source","openRestApi","tool","openConfigTool","toolKey","openToolAction","key","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","restApiMentionItem","ToolSource","handleSaveConfigTool","configToolMentionItem","CONFIG_TOOL_SOURCE_BY_KEY","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","nameTrimmed","isDuplicateName","n","canSave","toolItems","sourceIcon","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","outside","inside","partitionSources","a","shownOutside","groups","toolSourceLabel","INTEGRATIONS_KEY","INTEGRATIONS_LABEL","handleSave","result","handleImprove","improved","jsxs","Fragment","SideModal","jsx","DrawerHeaderText","DRAWER_HEADER_STYLE","DRAWER_BODY_STYLE","Input","MentionEditor","SelectableListSection","RestApiToolPanel","ConfigToolPanel","Toaster"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { SideModal } from '@src/components/side-modal';\nimport { Toaster } from '@src/components/toaster';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport type { VariableListInterfaceV3 } from '../../variable-picker-v3/model';\nimport {\n\tAgentTool,\n\tConfigToolConfig,\n\tConfigToolKey,\n\tParamsBlob,\n\tRestApiToolConfig,\n\tSubAgentDraft,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport {\n\tCONFIG_TOOL_SOURCE_BY_KEY,\n\tCONFIG_TOOL_SOURCES,\n\tINTEGRATIONS_KEY,\n\tINTEGRATIONS_LABEL,\n\tToolSource,\n} from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { partitionSources } from '../utils/sourceGrouping';\nimport {\n\trenderSourceIcon,\n\tSOURCE_ICONS,\n\tsourceIcon,\n} from '../utils/sourceIcons';\nimport { buildToolActions } from '../utils/toolActions';\nimport { ConfigToolPanel } from './ConfigToolPanel';\nimport {\n\tDRAWER_BODY_STYLE,\n\tDRAWER_HEADER_STYLE,\n\tDrawerHeaderText,\n} from './DrawerHeaderText';\nimport { MentionEditor } from './MentionEditor';\nimport { RestApiToolPanel } from './RestApiToolPanel';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\n/**\n * The sub-agent drawer sits above the main builder; its own tool drawers\n * (Rest API / email / Slack) stack one level higher so they open ON TOP of it\n * rather than behind (SideModal defaults to z-index 10).\n */\nconst SUBAGENT_ZINDEX = 1000;\nconst TOOL_DRAWER_ZINDEX = 1002;\n\n/** Upsert an item by id (replace when present, append otherwise). */\nconst upsertById = <T extends { id: string }>(\n\tlist: T[] | undefined,\n\titem: T,\n): T[] => {\n\tconst arr = list ?? [];\n\treturn arr.some((x) => x.id === item.id)\n\t\t? arr.map((x) => (x.id === item.id ? item : x))\n\t\t: [...arr, item];\n};\n\n/** Config-tool / Rest API drawer state; `key` remounts fresh per open. */\ninterface ToolDrawerState {\n\tkey: number;\n\tkind: 'restapi' | 'config';\n\ttoolKey?: ConfigToolKey;\n\tinitialRest?: RestApiToolConfig;\n\tinitialConfig?: ConfigToolConfig;\n}\n\n/** Inline \"Improve with AI\" action rendered below a mention editor. */\nconst ImproveButton = styled.button`\n\talign-self: flex-start;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tcolor: ${COLORS.content.primary};\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 6px 12px;\n\tfont-size: 13px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: 0.6;\n\t}\n`;\n\ntype InsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n\tsource?: string,\n) => void;\n\ninterface CreateSubAgentPanelProps {\n\tonClose: () => void;\n\t/** Persist the draft. The drawer shows a loader while the returned promise is pending. */\n\tonSave: (draft: SubAgentDraft) => void | Promise<void>;\n\tavailableTools: AgentTool[];\n\t/** Optional \"Improve with AI\" for instructions / guardrails. Omit to hide the buttons. */\n\tonImprove?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Optional \"Improve with AI\" for the Rest API / config-tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n\t/**\n\t * Backend templates (email / Slack) that drive the shared config-tool drawer.\n\t * Each present key enables its tool action in this drawer; absent → hidden.\n\t * Same prop the main builder gets — sub-agents can add the same tools.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/**\n\t * Per-source integration connection state (today: Slack). A source mapped to\n\t * `false` shows a \"Connect\" affordance instead of drilling into its tools —\n\t * same gating the main builder's Step 3 tool section gets.\n\t */\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\t/** Open the consumer's connect flow for an unconnected integration source. */\n\tonConnectIntegration?: (source: ToolSource) => void;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/**\n\t * Names of the other sub-agents already on this agent (exclude the one being\n\t * edited). Blocks saving a duplicate name — the LLM references sub-agents by it.\n\t */\n\texistingNames?: string[];\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n\t/** Variable catalog for the editors' `@` picker \"Variables\" view. */\n\tvariablesData?: VariableListInterfaceV3[];\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\tonImproveToolInstructions,\n\tconfigToolTemplates,\n\tintegrationStatus,\n\tonConnectIntegration,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\texistingNames = [],\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n\tvariablesData,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\t// Inline-configured tools owned by this sub-agent (same drawers as the main\n\t// agent). Local to the drawer; flow to the consumer via the saved draft.\n\tconst [configTools, setConfigTools] = useState<ConfigToolConfig[]>(\n\t\tinitial?.configTools ?? [],\n\t);\n\tconst [restApiTools, setRestApiTools] = useState<RestApiToolConfig[]>(\n\t\tinitial?.restApiTools ?? [],\n\t);\n\tconst [toolDrawer, setToolDrawer] = useState<ToolDrawerState | null>(null);\n\tconst toolDrawerKeyRef = useRef(0);\n\tconst [saving, setSaving] = useState(false);\n\t// Bumped to remount a field after its text is replaced (e.g. by Improve).\n\tconst [instrKey, setInstrKey] = useState(0);\n\tconst [guardKey, setGuardKey] = useState(0);\n\tconst [improving, setImproving] = useState<\n\t\t'instructions' | 'guardrail' | null\n\t>(null);\n\n\t// Tools-only mention list (sub-agents can't reference other sub-agents), PLUS\n\t// this drawer's inline custom tools so their `{{tool:<id>}}` tokens rehydrate\n\t// as chips on remount (they aren't in `availableTools`).\n\tconst mentionItems = useMemo(\n\t\t() => [\n\t\t\t...buildAgentMentionItems(availableTools, [], appLabel),\n\t\t\t...buildCustomToolMentionItems(configTools, restApiTools),\n\t\t],\n\t\t[availableTools, appLabel, configTools, restApiTools],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\t// Latest custom-tool ids, readable from the mount-captured `@` onSelect handler\n\t// (BikEditor captures it once) — mirrors the context's valueRef trick.\n\tconst customToolIdsRef = useRef<Set<string>>(new Set());\n\tcustomToolIdsRef.current = new Set(\n\t\t[...configTools, ...restApiTools].map((t) => t.id),\n\t);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Only catalog tool ids belong in `tools`; custom tools (Rest API / email /\n\t\t\t// Slack) track themselves on their own lists. Picking an existing custom\n\t\t\t// tool from `@` must not leak its id in as a bogus native ref.\n\t\t\tif (kind === 'tool' && !customToolIdsRef.current.has(id)) {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback(\n\t\t(id: string, label?: string, source?: string) => {\n\t\t\tconst target =\n\t\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\t\tinsertersRef.current.instructions;\n\t\t\ttarget?.('tool', id, label, source);\n\t\t},\n\t\t[],\n\t);\n\n\t// Rest API (bespoke) + shared config-tool (email / Slack) drawers, same as the\n\t// main builder's Step 3 — here backed by the drawer's local state.\n\t// ponytail: mirrors Step3HowItResponds; kept local rather than sharing a hook\n\t// because Step3 is context-backed and this drawer is local-state.\n\tconst openRestApi = useCallback((tool?: RestApiToolConfig) => {\n\t\ttoolDrawerKeyRef.current += 1;\n\t\tsetToolDrawer({\n\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\tkind: 'restapi',\n\t\t\tinitialRest: tool,\n\t\t});\n\t}, []);\n\tconst openConfigTool = useCallback(\n\t\t(toolKey: ConfigToolKey, tool?: ConfigToolConfig) => {\n\t\t\ttoolDrawerKeyRef.current += 1;\n\t\t\tsetToolDrawer({\n\t\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\t\tkind: 'config',\n\t\t\t\ttoolKey,\n\t\t\t\tinitialConfig: tool,\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\tconst openToolAction = useCallback(\n\t\t(source: ToolSource, toolKey?: ConfigToolKey) => {\n\t\t\tconst key = toolKey ?? CONFIG_TOOL_SOURCES[source]?.[0];\n\t\t\tif (key) {\n\t\t\t\topenConfigTool(key);\n\t\t\t} else {\n\t\t\t\topenRestApi();\n\t\t\t}\n\t\t},\n\t\t[openConfigTool, openRestApi],\n\t);\n\tconst handleSaveRestApi = useCallback(\n\t\t(tool: RestApiToolConfig) => {\n\t\t\tconst isNew = !restApiTools.some((t) => t.id === tool.id);\n\t\t\tsetRestApiTools((prev) => upsertById(prev, tool));\n\t\t\t// Drop a reference chip at the cursor on creation (edits keep the chip).\n\t\t\t// Pass the source so the fresh chip shows its icon (not yet in the list).\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(\n\t\t\t\t\ttool.id,\n\t\t\t\t\trestApiMentionItem(tool).label,\n\t\t\t\t\tToolSource.RestApi,\n\t\t\t\t);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[restApiTools, insertToolAtCursor],\n\t);\n\tconst handleSaveConfigTool = useCallback(\n\t\t(tool: ConfigToolConfig) => {\n\t\t\tconst isNew = !configTools.some((t) => t.id === tool.id);\n\t\t\tsetConfigTools((prev) => upsertById(prev, tool));\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(\n\t\t\t\t\ttool.id,\n\t\t\t\t\tconfigToolMentionItem(tool).label,\n\t\t\t\t\tCONFIG_TOOL_SOURCE_BY_KEY[tool.tool_key],\n\t\t\t\t);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[configTools, insertToolAtCursor],\n\t);\n\n\t// Local undo toast for tool removal (drawer state isn't in AgentValue).\n\tconst [undo, setUndo] = useState<{ id: number; message: string } | null>(\n\t\tnull,\n\t);\n\tconst undoSnapshotRef = useRef<{\n\t\tinstructions: string;\n\t\tguardrail: string;\n\t\ttools: string[];\n\t\tconfigTools: ConfigToolConfig[];\n\t\trestApiTools: RestApiToolConfig[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\t// Remove ANY tool by id: strip its `{{tool:<id>}}` tokens, remount the fields,\n\t// and drop it from whichever list holds it (catalog `tools` or an inline\n\t// custom-tool list). One undo restores all of it.\n\tconst removeTool = (id: string) => {\n\t\tconst label =\n\t\t\tavailableTools.find((t) => t.tool_id === id)?.display_name ??\n\t\t\trestApiTools.find((t) => t.id === id)?.name ??\n\t\t\t'Tool';\n\t\t// The token stores the tool id (a tool's id is its tool_id).\n\t\tconst token = `{{tool:${id}}}`;\n\t\tconst strip = (text: string) => text.split(token).join('');\n\t\tundoSnapshotRef.current = {\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t};\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetConfigTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetRestApiTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({ id: undoIdRef.current, message: `Tool \"${label}\" removed` });\n\t};\n\n\tconst undoRemove = () => {\n\t\tconst snap = undoSnapshotRef.current;\n\t\tif (snap) {\n\t\t\tsetInstructions(snap.instructions);\n\t\t\tsetGuardrail(snap.guardrail);\n\t\t\tsetTools(snap.tools);\n\t\t\tsetConfigTools(snap.configTools);\n\t\t\tsetRestApiTools(snap.restApiTools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst nameTrimmed = name.trim();\n\t// Case-insensitive: two sub-agents on the same agent can't share a name (the\n\t// LLM references them by it) — mirrors the Rest API tool-name check.\n\tconst isDuplicateName =\n\t\tnameTrimmed.length > 0 &&\n\t\texistingNames.some(\n\t\t\t(n) => n.trim().toLowerCase() === nameTrimmed.toLowerCase(),\n\t\t);\n\tconst canSave =\n\t\tnameTrimmed.length > 0 &&\n\t\t!isDuplicateName &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: sourceIcon(tool.source ?? ToolSource.Manifest),\n\t\t\t\t\t\t// Shield flags a tool that needs customer verification, same as\n\t\t\t\t\t\t// the main builder's Step 3 tool rows.\n\t\t\t\t\t\tauthRequired: tool.auth_required,\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Inline-configured tools (Rest API + email / Slack) render as rows in the same\n\t// list, each with its own Configure (edit) action that reopens its drawer.\n\tconst restApiItems: SelectableItem[] = restApiTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: restApiToolName(t),\n\t\ticon: SOURCE_ICONS[ToolSource.RestApi],\n\t\tonConfigure: () => openRestApi(t),\n\t}));\n\tconst configToolItems: SelectableItem[] = configTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: configToolName(t),\n\t\ticon: SOURCE_ICONS[\n\t\t\tt.tool_key === 'send_slack_message'\n\t\t\t\t? ToolSource.Slack\n\t\t\t\t: ToolSource.EmailHandover\n\t\t],\n\t\tonConfigure: () => openConfigTool(t.tool_key, t),\n\t}));\n\tconst allToolItems: SelectableItem[] = [\n\t\t...toolItems,\n\t\t...restApiItems,\n\t\t...configToolItems,\n\t];\n\n\t// Built-in tool actions (Rest API / email / Slack); the shared email / Slack\n\t// forms appear only when their backend template was provided. Integration\n\t// state drives the \"Connect\" affordance, same as the main builder's Step 3.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\n\t\tintegrationStatus,\n\t\tonConnectIntegration,\n\t);\n\n\tconst openConfigTemplate =\n\t\ttoolDrawer?.kind === 'config' && toolDrawer.toolKey\n\t\t\t? configToolTemplates?.[toolDrawer.toolKey]\n\t\t\t: undefined;\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\tundefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? ToolSource.Manifest;\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\t\t\tundefined,\n\t\t\t});\n\t\t});\n\t\t// Same rule as the `@` picker: a source the store hasn't connected doesn't\n\t\t// get its own button — they all collapse into one \"Integrations\" button that\n\t\t// opens the picker on that group (SelectableListSection deep-links a source\n\t\t// button straight into the picker, and the umbrella key works like any other\n\t\t// source there). Action sources join the split too: Slack has no catalog\n\t\t// tools of its own, so without them an unconnected Slack would have nowhere\n\t\t// to live.\n\t\tconst { outside, inside } = partitionSources(\n\t\t\t[...order, ...toolActionSources.map((a) => a.source)],\n\t\t\tintegrationStatus,\n\t\t);\n\t\tconst shownOutside = new Set(outside);\n\t\tconst groups: SourceGroup[] = order\n\t\t\t.filter((src) => shownOutside.has(src))\n\t\t\t.map((src) => ({\n\t\t\t\tsource: src,\n\t\t\t\tlabel: toolSourceLabel(src, appLabel),\n\t\t\t\toptions: bySource.get(src) ?? [],\n\t\t\t\t// Reachable only when connected or ungated, so no connect flow needed —\n\t\t\t\t// kept for the picker's own gating, which reads these groups.\n\t\t\t\tconnected: integrationStatus?.[src as ToolSource],\n\t\t\t\tonConnect: () => onConnectIntegration?.(src as ToolSource),\n\t\t\t}));\n\t\tif (inside.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tsource: INTEGRATIONS_KEY,\n\t\t\t\tlabel: INTEGRATIONS_LABEL,\n\t\t\t\t// No options of its own: clicking opens the picker at the umbrella,\n\t\t\t\t// where each unconnected source offers \"Connect\".\n\t\t\t\toptions: [],\n\t\t\t});\n\t\t}\n\t\treturn groups;\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t});\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleImprove = async (kind: 'instructions' | 'guardrail') => {\n\t\tif (!onImprove || improving) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(kind);\n\t\ttry {\n\t\t\tconst current = kind === 'instructions' ? instructions : guardrail;\n\t\t\tconst improved = await onImprove(kind, current);\n\t\t\tif (kind === 'instructions') {\n\t\t\t\tsetInstructions(improved);\n\t\t\t\tsetInstrKey((k) => k + 1);\n\t\t\t} else {\n\t\t\t\tsetGuardrail(improved);\n\t\t\t\tsetGuardKey((k) => k + 1);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetImproving(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SideModal\n\t\t\t\theader={title}\n\t\t\t\tcloseOnEscapeKey={false}\n\t\t\t\tzIndex={SUBAGENT_ZINDEX}\n\t\t\t\theaderCustomComponent={\n\t\t\t\t\t<DrawerHeaderText\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tsubtitle=\"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them.\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\twidth=\"421px\"\n\t\t\t\theaderStyle={DRAWER_HEADER_STYLE}\n\t\t\t\tbodyStyle={DRAWER_BODY_STYLE}\n\t\t\t\tonClose={onClose}\n\t\t\t\tsaveButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-save',\n\t\t\t\t\tbuttonText: 'Save',\n\t\t\t\t\tbuttonType: 'primary',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tdisabled: !canSave,\n\t\t\t\t\tisLoading: saving,\n\t\t\t\t\tonClick: handleSave,\n\t\t\t\t}}\n\t\t\t\tcancelButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-cancel',\n\t\t\t\t\tbuttonText: 'Cancel',\n\t\t\t\t\tbuttonType: 'tertiaryGray',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\tlabelTextBold\n\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\tvalue={name}\n\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\tstate={isDuplicateName ? 'invalid' : undefined}\n\t\t\t\t\terrorMessage={\n\t\t\t\t\t\tisDuplicateName\n\t\t\t\t\t\t\t? 'A sub-agent with this name already exists'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tonChangeText={setName}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\tvalue={instructions}\n\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\tplaceholder=\"Write the steps in plain English. The agent will follow them exactly. The more specific you are, the better it performs.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-instructions\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('instructions')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'instructions'\n\t\t\t\t\t\t\t\t\t? 'Improving…'\n\t\t\t\t\t\t\t\t\t: 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Always stay within the cancellation policy. Do not process refunds above ₹10,000 without human approval.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-guardrail\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('guardrail')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'guardrail' ? 'Improving…' : 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<SelectableListSection\n\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\titems={allToolItems}\n\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\tonConnectIntegration={(source) =>\n\t\t\t\t\t\tonConnectIntegration?.(source as ToolSource)\n\t\t\t\t\t}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\tappLabel={appLabel}\n\t\t\t\t\tpickerOpensUp\n\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\tconfirmDelete={{ noun: 'tool', zIndex: TOOL_DRAWER_ZINDEX + 1 }}\n\t\t\t\t/>\n\t\t\t</SideModal>\n\n\t\t\t{toolDrawer?.kind === 'restapi' && (\n\t\t\t\t<RestApiToolPanel\n\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\tinitial={toolDrawer.initialRest}\n\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\tonSave={handleSaveRestApi}\n\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{toolDrawer?.kind === 'config' &&\n\t\t\t\ttoolDrawer.toolKey &&\n\t\t\t\topenConfigTemplate && (\n\t\t\t\t\t<ConfigToolPanel\n\t\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\t\ttoolKey={toolDrawer.toolKey}\n\t\t\t\t\t\ttemplate={openConfigTemplate}\n\t\t\t\t\t\tinitial={toolDrawer.initialConfig}\n\t\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\t\tonSave={handleSaveConfigTool}\n\t\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t{undo && (\n\t\t\t\t<Toaster\n\t\t\t\t\tkey={undo.id}\n\t\t\t\t\ttext={undo.message}\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tposition=\"top-right\"\n\t\t\t\t\tautoClose={5000}\n\t\t\t\t\thideCloseButton\n\t\t\t\t\tbuttonProps={{\n\t\t\t\t\t\tbuttonText: 'Undo',\n\t\t\t\t\t\tshowButton: true,\n\t\t\t\t\t\tonButtonClick: () => {\n\t\t\t\t\t\t\tundoRemove();\n\t\t\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonCloseToast={() => setUndo(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n"],"names":["SUBAGENT_ZINDEX","TOOL_DRAWER_ZINDEX","upsertById","list","item","arr","x","ImproveButton","styled","COLORS","CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","onImproveToolInstructions","configToolTemplates","integrationStatus","onConnectIntegration","title","initial","existingNames","appLabel","charLimits","AGENT_CHAR_LIMITS","variablesData","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","configTools","setConfigTools","restApiTools","setRestApiTools","toolDrawer","setToolDrawer","toolDrawerKeyRef","useRef","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","buildCustomToolMentionItems","insertersRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","customToolIdsRef","t","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","source","openRestApi","tool","openConfigTool","toolKey","openToolAction","key","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","restApiMentionItem","ToolSource","handleSaveConfigTool","configToolMentionItem","CONFIG_TOOL_SOURCE_BY_KEY","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","nameTrimmed","isDuplicateName","n","canSave","toolItems","sourceIcon","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","outside","inside","partitionSources","a","shownOutside","groups","toolSourceLabel","INTEGRATIONS_KEY","INTEGRATIONS_LABEL","handleSave","result","handleImprove","improved","jsxs","Fragment","SideModal","jsx","DrawerHeaderText","DRAWER_HEADER_STYLE","DRAWER_BODY_STYLE","Input","MentionEditor","SelectableListSection","RestApiToolPanel","ConfigToolPanel","Toaster"],"mappings":"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"}
|