@bikdotai/bik-component-library 0.0.875-beta.0 → 0.0.875-beta.2

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