@bikdotai/bik-component-library 0.0.874 → 0.0.875-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/index.js +1 -1
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.d.ts +6 -0
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +143 -141
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +6 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +83 -81
- 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 +6 -0
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +50 -48
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/index.d.ts +18 -2
- 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/index.js +816 -772
- 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 ze, jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import { useState as i, useRef as C, useMemo as He, useCallback as a } from "react";
|
|
3
|
+
import $e 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 Fe } from "../constants/charLimits.js";
|
|
7
|
+
import { CONFIG_TOOL_SOURCES as Ye, ToolSource as g, CONFIG_TOOL_SOURCE_BY_KEY as je, INTEGRATIONS_LABEL as We, INTEGRATIONS_KEY as qe } from "../constants/tools.js";
|
|
8
|
+
import { buildAgentMentionItems as Xe, buildCustomToolMentionItems as Ze, restApiMentionItem as Je, configToolMentionItem as Qe, restApiToolName as Ve, configToolName as et, toolSourceLabel as tt } from "../utils/mentionSerialization.js";
|
|
9
|
+
import { partitionSources as ot } 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 nt } from "../utils/toolActions.js";
|
|
12
|
+
import { ConfigToolPanel as st } from "./ConfigToolPanel.js";
|
|
13
|
+
import { DRAWER_BODY_STYLE as rt, DRAWER_HEADER_STYLE as it, DrawerHeaderText as lt } 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 at } from "./RestApiToolPanel.js";
|
|
16
|
+
import { SelectableListSection as ct } from "./SelectableListSection.js";
|
|
17
|
+
import { SideModal as ut } from "../../side-modal/SideModal.js";
|
|
18
|
+
import { Input as dt } from "../../input/Input.js";
|
|
19
|
+
import { Toaster as mt } from "../../toaster/Toaster.js";
|
|
20
|
+
const pt = 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 = $e.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 mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
36
36
|
cursor: default;
|
|
37
37
|
opacity: 0.6;
|
|
38
38
|
}
|
|
39
|
-
`,
|
|
39
|
+
`, Mt = ({
|
|
40
40
|
onClose: w,
|
|
41
41
|
onSave: h,
|
|
42
42
|
availableTools: r,
|
|
@@ -49,26 +49,27 @@ const mt = 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
|
|
52
|
+
charLimits: A = Fe,
|
|
53
|
+
variablesData: E,
|
|
54
|
+
element: Ce
|
|
54
55
|
}) => {
|
|
55
|
-
const [D,
|
|
56
|
+
const [D, Se] = i(T?.name ?? ""), [v, O] = i(T?.instructions ?? ""), [x, k] = i(T?.guardrail ?? ""), [L, N] = i(T?.tools ?? []), [p, P] = i(
|
|
56
57
|
T?.configTools ?? []
|
|
57
58
|
), [d, U] = i(
|
|
58
59
|
T?.restApiTools ?? []
|
|
59
|
-
), [l, b] = i(null), M = C(0), [se, re] = i(!1), [
|
|
60
|
+
), [l, b] = i(null), M = C(0), [se, re] = i(!1), [Ae, z] = i(0), [ve, H] = i(0), [R, ie] = i(null), $ = He(
|
|
60
61
|
() => [
|
|
61
|
-
...
|
|
62
|
-
...
|
|
62
|
+
...Xe(r, [], I),
|
|
63
|
+
...Ze(p, d)
|
|
63
64
|
],
|
|
64
65
|
[r, I, p, d]
|
|
65
|
-
), K = C({}), F = C("instructions"),
|
|
66
|
+
), K = C({}), F = C("instructions"), xe = a((e) => {
|
|
66
67
|
K.current.instructions = e ?? void 0;
|
|
67
|
-
}, []),
|
|
68
|
+
}, []), Re = a((e) => {
|
|
68
69
|
K.current.guardrail = e ?? void 0;
|
|
69
|
-
}, []), Re = a(() => {
|
|
70
|
-
F.current = "instructions";
|
|
71
70
|
}, []), _e = a(() => {
|
|
71
|
+
F.current = "instructions";
|
|
72
|
+
}, []), we = a(() => {
|
|
72
73
|
F.current = "guardrail";
|
|
73
74
|
}, []), le = C(/* @__PURE__ */ new Set());
|
|
74
75
|
le.current = new Set(
|
|
@@ -100,35 +101,35 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
100
101
|
});
|
|
101
102
|
},
|
|
102
103
|
[]
|
|
103
|
-
),
|
|
104
|
+
), Ee = a(
|
|
104
105
|
(e, t) => {
|
|
105
|
-
const o = t ??
|
|
106
|
+
const o = t ?? Ye[e]?.[0];
|
|
106
107
|
o ? j(o) : Y();
|
|
107
108
|
},
|
|
108
109
|
[j, Y]
|
|
109
|
-
),
|
|
110
|
+
), Oe = a(
|
|
110
111
|
(e) => {
|
|
111
112
|
const t = !d.some((o) => o.id === e.id);
|
|
112
113
|
U((o) => Te(o, e)), t && _(
|
|
113
114
|
e.id,
|
|
114
|
-
|
|
115
|
+
Je(e).label,
|
|
115
116
|
g.RestApi
|
|
116
117
|
), b(null);
|
|
117
118
|
},
|
|
118
119
|
[d, _]
|
|
119
|
-
),
|
|
120
|
+
), ke = a(
|
|
120
121
|
(e) => {
|
|
121
122
|
const t = !p.some((o) => o.id === e.id);
|
|
122
123
|
P((o) => Te(o, e)), t && _(
|
|
123
124
|
e.id,
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
Qe(e).label,
|
|
126
|
+
je[e.tool_key]
|
|
126
127
|
), b(null);
|
|
127
128
|
},
|
|
128
129
|
[p, _]
|
|
129
130
|
), [W, q] = i(
|
|
130
131
|
null
|
|
131
|
-
), X = C(null), ce = C(0),
|
|
132
|
+
), X = C(null), ce = C(0), Ne = (e) => {
|
|
132
133
|
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("");
|
|
133
134
|
X.current = {
|
|
134
135
|
instructions: v,
|
|
@@ -137,12 +138,12 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
137
138
|
configTools: p,
|
|
138
139
|
restApiTools: d
|
|
139
140
|
}, 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` });
|
|
140
|
-
},
|
|
141
|
+
}, Me = () => {
|
|
141
142
|
const e = X.current;
|
|
142
143
|
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);
|
|
143
144
|
}, Z = D.trim(), J = Z.length > 0 && be.some(
|
|
144
145
|
(e) => e.trim().toLowerCase() === Z.toLowerCase()
|
|
145
|
-
), ue = Z.length > 0 && !J && (v.trim().length > 0 || x.trim().length > 0),
|
|
146
|
+
), ue = Z.length > 0 && !J && (v.trim().length > 0 || x.trim().length > 0), Ke = L.map((e) => {
|
|
146
147
|
const t = r.find((o) => o.tool_id === e);
|
|
147
148
|
return t ? {
|
|
148
149
|
id: e,
|
|
@@ -152,30 +153,30 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
152
153
|
// the main builder's Step 3 tool rows.
|
|
153
154
|
authRequired: t.auth_required
|
|
154
155
|
} : null;
|
|
155
|
-
}).filter((e) => e !== null),
|
|
156
|
+
}).filter((e) => e !== null), Be = d.map((e) => ({
|
|
156
157
|
id: e.id,
|
|
157
|
-
label:
|
|
158
|
+
label: Ve(e),
|
|
158
159
|
icon: ge[g.RestApi],
|
|
159
160
|
onConfigure: () => Y(e)
|
|
160
|
-
})),
|
|
161
|
+
})), Ge = p.map((e) => ({
|
|
161
162
|
id: e.id,
|
|
162
|
-
label:
|
|
163
|
+
label: et(e),
|
|
163
164
|
icon: ge[e.tool_key === "send_slack_message" ? g.Slack : g.EmailHandover],
|
|
164
165
|
onConfigure: () => j(e.tool_key, e)
|
|
165
|
-
})),
|
|
166
|
-
...Me,
|
|
166
|
+
})), De = [
|
|
167
167
|
...Ke,
|
|
168
|
-
...Be
|
|
169
|
-
|
|
168
|
+
...Be,
|
|
169
|
+
...Ge
|
|
170
|
+
], B = nt(
|
|
170
171
|
oe,
|
|
171
|
-
|
|
172
|
+
Ee,
|
|
172
173
|
y,
|
|
173
174
|
S
|
|
174
|
-
), de = l?.kind === "config" && l.toolKey ? oe?.[l.toolKey] : void 0,
|
|
175
|
+
), de = l?.kind === "config" && l.toolKey ? oe?.[l.toolKey] : void 0, Le = r.map((e) => ({
|
|
175
176
|
label: e.display_name,
|
|
176
177
|
value: e.tool_id,
|
|
177
178
|
leadingIcon: he(V(e.source ?? g.Manifest)) ?? void 0
|
|
178
|
-
})),
|
|
179
|
+
})), Pe = (() => {
|
|
179
180
|
const e = [], t = /* @__PURE__ */ new Map();
|
|
180
181
|
r.forEach((s) => {
|
|
181
182
|
const G = s.source ?? g.Manifest;
|
|
@@ -185,12 +186,12 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
185
186
|
leadingIcon: he(V(s.source ?? g.Manifest)) ?? void 0
|
|
186
187
|
});
|
|
187
188
|
});
|
|
188
|
-
const { outside: o, inside: m } =
|
|
189
|
+
const { outside: o, inside: m } = ot(
|
|
189
190
|
[...e, ...B.map((s) => s.source)],
|
|
190
191
|
y
|
|
191
192
|
), n = new Set(o), f = e.filter((s) => n.has(s)).map((s) => ({
|
|
192
193
|
source: s,
|
|
193
|
-
label:
|
|
194
|
+
label: tt(s, I),
|
|
194
195
|
options: t.get(s) ?? [],
|
|
195
196
|
// Reachable only when connected or ungated, so no connect flow needed —
|
|
196
197
|
// kept for the picker's own gating, which reads these groups.
|
|
@@ -198,13 +199,13 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
198
199
|
onConnect: () => S?.(s)
|
|
199
200
|
}));
|
|
200
201
|
return m.length > 0 && f.push({
|
|
201
|
-
source:
|
|
202
|
-
label:
|
|
202
|
+
source: qe,
|
|
203
|
+
label: We,
|
|
203
204
|
// No options of its own: clicking opens the picker at the umbrella,
|
|
204
205
|
// where each unconnected source offers "Connect".
|
|
205
206
|
options: []
|
|
206
207
|
}), f;
|
|
207
|
-
})(),
|
|
208
|
+
})(), Ue = async () => {
|
|
208
209
|
if (!ue || se)
|
|
209
210
|
return;
|
|
210
211
|
const e = h({
|
|
@@ -234,23 +235,24 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
234
235
|
}
|
|
235
236
|
}
|
|
236
237
|
};
|
|
237
|
-
return /* @__PURE__ */ pe(
|
|
238
|
+
return /* @__PURE__ */ pe(ze, { children: [
|
|
238
239
|
/* @__PURE__ */ pe(
|
|
239
|
-
|
|
240
|
+
ut,
|
|
240
241
|
{
|
|
241
242
|
header: ne,
|
|
242
243
|
closeOnEscapeKey: !1,
|
|
243
|
-
zIndex:
|
|
244
|
+
zIndex: pt,
|
|
245
|
+
element: Ce,
|
|
244
246
|
headerCustomComponent: /* @__PURE__ */ c(
|
|
245
|
-
|
|
247
|
+
lt,
|
|
246
248
|
{
|
|
247
249
|
title: ne,
|
|
248
250
|
subtitle: "Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."
|
|
249
251
|
}
|
|
250
252
|
),
|
|
251
253
|
width: "421px",
|
|
252
|
-
headerStyle:
|
|
253
|
-
bodyStyle:
|
|
254
|
+
headerStyle: it,
|
|
255
|
+
bodyStyle: rt,
|
|
254
256
|
onClose: w,
|
|
255
257
|
saveButtonProps: {
|
|
256
258
|
"data-test": "subagent-save",
|
|
@@ -259,7 +261,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
259
261
|
size: "small",
|
|
260
262
|
disabled: !ue,
|
|
261
263
|
isLoading: se,
|
|
262
|
-
onClick:
|
|
264
|
+
onClick: Ue
|
|
263
265
|
},
|
|
264
266
|
cancelButtonProps: {
|
|
265
267
|
"data-test": "subagent-cancel",
|
|
@@ -270,7 +272,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
270
272
|
},
|
|
271
273
|
children: [
|
|
272
274
|
/* @__PURE__ */ c(
|
|
273
|
-
|
|
275
|
+
dt,
|
|
274
276
|
{
|
|
275
277
|
"data-test": "subagent-name",
|
|
276
278
|
labelText: "Agent name",
|
|
@@ -282,7 +284,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
282
284
|
maxCharStyle: { fontSize: 12, lineHeight: "16px" },
|
|
283
285
|
state: J ? "invalid" : void 0,
|
|
284
286
|
errorMessage: J ? "A sub-agent with this name already exists" : void 0,
|
|
285
|
-
onChangeText:
|
|
287
|
+
onChangeText: Se
|
|
286
288
|
}
|
|
287
289
|
),
|
|
288
290
|
/* @__PURE__ */ c(
|
|
@@ -295,7 +297,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
295
297
|
maxLength: A.instructions,
|
|
296
298
|
placeholder: "Write the steps in plain English. The agent will follow them exactly. The more specific you are, the better it performs.",
|
|
297
299
|
minHeight: "160px",
|
|
298
|
-
resetKey: `instr-${
|
|
300
|
+
resetKey: `instr-${Ae}`,
|
|
299
301
|
mentionItems: $,
|
|
300
302
|
tools: r,
|
|
301
303
|
toolActions: B,
|
|
@@ -305,8 +307,8 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
305
307
|
appLabel: I,
|
|
306
308
|
onConnectIntegration: S,
|
|
307
309
|
onMentionSelect: ae,
|
|
308
|
-
onFocus:
|
|
309
|
-
registerInsert:
|
|
310
|
+
onFocus: _e,
|
|
311
|
+
registerInsert: xe,
|
|
310
312
|
action: u ? /* @__PURE__ */ c(
|
|
311
313
|
Ie,
|
|
312
314
|
{
|
|
@@ -329,7 +331,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
329
331
|
maxLength: A.guardrail,
|
|
330
332
|
placeholder: "e.g. Never discuss competitor pricing. Always stay within the cancellation policy. Do not process refunds above ₹10,000 without human approval.",
|
|
331
333
|
minHeight: "160px",
|
|
332
|
-
resetKey: `guard-${
|
|
334
|
+
resetKey: `guard-${ve}`,
|
|
333
335
|
mentionItems: $,
|
|
334
336
|
tools: r,
|
|
335
337
|
toolActions: B,
|
|
@@ -339,8 +341,8 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
339
341
|
appLabel: I,
|
|
340
342
|
onConnectIntegration: S,
|
|
341
343
|
onMentionSelect: ae,
|
|
342
|
-
onFocus:
|
|
343
|
-
registerInsert:
|
|
344
|
+
onFocus: we,
|
|
345
|
+
registerInsert: Re,
|
|
344
346
|
action: u ? /* @__PURE__ */ c(
|
|
345
347
|
Ie,
|
|
346
348
|
{
|
|
@@ -354,13 +356,13 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
354
356
|
}
|
|
355
357
|
),
|
|
356
358
|
/* @__PURE__ */ c(
|
|
357
|
-
|
|
359
|
+
ct,
|
|
358
360
|
{
|
|
359
361
|
title: "Tools this agent can use",
|
|
360
362
|
dataTestPrefix: "subagent-tools",
|
|
361
|
-
items:
|
|
362
|
-
addableOptions:
|
|
363
|
-
sourceGroups:
|
|
363
|
+
items: De,
|
|
364
|
+
addableOptions: Le,
|
|
365
|
+
sourceGroups: Pe,
|
|
364
366
|
integrationStatus: y,
|
|
365
367
|
onConnectIntegration: (e) => S?.(e),
|
|
366
368
|
mentionItems: $,
|
|
@@ -371,7 +373,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
371
373
|
onAdd: (e) => {
|
|
372
374
|
_(e), N((t) => fe(t, e));
|
|
373
375
|
},
|
|
374
|
-
onRemove:
|
|
376
|
+
onRemove: Ne,
|
|
375
377
|
confirmDelete: { noun: "tool", zIndex: ee + 1 }
|
|
376
378
|
}
|
|
377
379
|
)
|
|
@@ -379,20 +381,20 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
379
381
|
}
|
|
380
382
|
),
|
|
381
383
|
l?.kind === "restapi" && /* @__PURE__ */ c(
|
|
382
|
-
|
|
384
|
+
at,
|
|
383
385
|
{
|
|
384
386
|
initial: l.initialRest,
|
|
385
387
|
charLimits: A,
|
|
386
388
|
variablesData: E,
|
|
387
389
|
onImprove: te,
|
|
388
390
|
onClose: () => b(null),
|
|
389
|
-
onSave:
|
|
391
|
+
onSave: Oe,
|
|
390
392
|
zIndex: ee
|
|
391
393
|
},
|
|
392
394
|
l.key
|
|
393
395
|
),
|
|
394
396
|
l?.kind === "config" && l.toolKey && de && /* @__PURE__ */ c(
|
|
395
|
-
|
|
397
|
+
st,
|
|
396
398
|
{
|
|
397
399
|
toolKey: l.toolKey,
|
|
398
400
|
template: de,
|
|
@@ -401,13 +403,13 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
401
403
|
variablesData: E,
|
|
402
404
|
onImprove: te,
|
|
403
405
|
onClose: () => b(null),
|
|
404
|
-
onSave:
|
|
406
|
+
onSave: ke,
|
|
405
407
|
zIndex: ee
|
|
406
408
|
},
|
|
407
409
|
l.key
|
|
408
410
|
),
|
|
409
411
|
W && /* @__PURE__ */ c(
|
|
410
|
-
|
|
412
|
+
mt,
|
|
411
413
|
{
|
|
412
414
|
text: W.message,
|
|
413
415
|
type: "info",
|
|
@@ -417,7 +419,7 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
417
419
|
buttonProps: {
|
|
418
420
|
buttonText: "Undo",
|
|
419
421
|
showButton: !0,
|
|
420
|
-
onButtonClick: () => (
|
|
422
|
+
onButtonClick: () => (Me(), {})
|
|
421
423
|
},
|
|
422
424
|
onCloseToast: () => q(null)
|
|
423
425
|
},
|
|
@@ -426,6 +428,6 @@ const mt = 1e3, ee = 1002, Te = (w, h) => {
|
|
|
426
428
|
] });
|
|
427
429
|
};
|
|
428
430
|
export {
|
|
429
|
-
|
|
431
|
+
Mt as CreateSubAgentPanel
|
|
430
432
|
};
|
|
431
433
|
//# 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/** 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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"}
|
|
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/** 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}) => {\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\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","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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"}
|
|
@@ -7,10 +7,10 @@ import h from "styled-components";
|
|
|
7
7
|
import { TitleSmall as pe, BodySecondary as fe, BodyCaption as ge } from "../../TypographyStyle.js";
|
|
8
8
|
import { COLORS as o } from "../../../constants/Theme.js";
|
|
9
9
|
import { PickerType as be } from "../../variable-picker-v3/model.js";
|
|
10
|
-
import { CATEGORIES as me, INTEGRATIONS_KEY as k, toolSourceRank as xe, INTEGRATIONS_LABEL as Z,
|
|
10
|
+
import { CATEGORIES as me, INTEGRATIONS_KEY as k, toolSourceRank as xe, INTEGRATIONS_LABEL as Z, INTEGRATIONS_RANK as ke, isIntegrationSource as ve, CONFIG_TOOL_SOURCES as ye } from "../constants/tools.js";
|
|
11
11
|
import { toolSourceLabel as j } from "../utils/mentionSerialization.js";
|
|
12
12
|
import { partitionSources as we, isUnconnectedSource as Ie } from "../utils/sourceGrouping.js";
|
|
13
|
-
import {
|
|
13
|
+
import { sourceIcon as M, INTEGRATIONS_ICON as ee, renderSourceIcon as te } from "../utils/sourceIcons.js";
|
|
14
14
|
import { VariablePicker as Re } from "../../variable-picker-v3/VariablePicker.js";
|
|
15
15
|
import re from "../../../icons/Informational/Common UI/Shield.js";
|
|
16
16
|
const g = (c) => c.meta, A = (c) => g(c)?.plainLabel ?? c.label, Se = "__bik_create_subagent__", Ae = 5, nt = ({
|
|
@@ -133,7 +133,7 @@ const g = (c) => c.meta, A = (c) => g(c)?.plainLabel ?? c.label, Se = "__bik_cre
|
|
|
133
133
|
const X = m.filter(
|
|
134
134
|
(q) => (g(q)?.source ?? "other") === r
|
|
135
135
|
), ae = (_.get(r) ?? []).length;
|
|
136
|
-
if (X.length + ae === 1 && !(d === void 0 &&
|
|
136
|
+
if (X.length + ae === 1 && !(d === void 0 && ve(r))) {
|
|
137
137
|
const q = M(r) ?? d?.icon;
|
|
138
138
|
if (d)
|
|
139
139
|
return {
|
|
@@ -169,7 +169,7 @@ const g = (c) => c.meta, A = (c) => g(c)?.plainLabel ?? c.label, Se = "__bik_cre
|
|
|
169
169
|
(r) => ({ row: u(r), rank: xe(r) })
|
|
170
170
|
);
|
|
171
171
|
return J.length > 0 && Q.push({
|
|
172
|
-
rank:
|
|
172
|
+
rank: ke,
|
|
173
173
|
row: {
|
|
174
174
|
id: k,
|
|
175
175
|
label: Z,
|
|
@@ -187,7 +187,7 @@ const g = (c) => c.meta, A = (c) => g(c)?.plainLabel ?? c.label, Se = "__bik_cre
|
|
|
187
187
|
onActivate: () => E(t)
|
|
188
188
|
}));
|
|
189
189
|
return (_.get(i) ?? []).forEach((t) => {
|
|
190
|
-
const f = i in
|
|
190
|
+
const f = i in ye;
|
|
191
191
|
n.push({
|
|
192
192
|
// A source with several config tools gets one row each, so the key
|
|
193
193
|
// carries the tool it opens.
|