@bikdotai/bik-component-library 0.0.849-beta.2 → 0.0.849-beta.4

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 (37) 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 +5 -5
  4. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +7 -7
  6. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  7. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js +2 -2
  8. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  9. package/dist/cjs/components/agent-builder/components/VariableTriggerArea.js +9 -0
  10. package/dist/cjs/components/agent-builder/components/VariableTriggerArea.js.map +1 -0
  11. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
  12. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  13. package/dist/cjs/editor/extensions/mention/MentionDropdown.js +1 -1
  14. package/dist/cjs/editor/extensions/mention/MentionDropdown.js.map +1 -1
  15. package/dist/cjs/editor/extensions/mention/MentionExtension.js +1 -1
  16. package/dist/cjs/editor/extensions/mention/MentionExtension.js.map +1 -1
  17. package/dist/esm/components/agent-builder/components/ConfigToolPanel.d.ts +8 -0
  18. package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +151 -124
  19. package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
  20. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +90 -88
  21. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  22. package/dist/esm/components/agent-builder/components/RestApiToolPanel.d.ts +16 -0
  23. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +182 -138
  24. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  25. package/dist/esm/components/agent-builder/components/ToolInstructionsField.d.ts +9 -0
  26. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js +65 -47
  27. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  28. package/dist/esm/components/agent-builder/components/VariableTriggerArea.d.ts +36 -0
  29. package/dist/esm/components/agent-builder/components/VariableTriggerArea.js +94 -0
  30. package/dist/esm/components/agent-builder/components/VariableTriggerArea.js.map +1 -0
  31. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +93 -91
  32. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  33. package/dist/esm/editor/extensions/mention/MentionDropdown.js +19 -19
  34. package/dist/esm/editor/extensions/mention/MentionDropdown.js.map +1 -1
  35. package/dist/esm/editor/extensions/mention/MentionExtension.js +15 -15
  36. package/dist/esm/editor/extensions/mention/MentionExtension.js.map +1 -1
  37. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  import { jsxs as lt, Fragment as Kt, jsx as c } from "react/jsx-runtime";
2
2
  import { useState as r, useRef as h, useMemo as Nt, useCallback as a } from "react";
3
- import Dt from "styled-components";
3
+ import Gt from "styled-components";
4
4
  import { addUnique as at } from "../../../utils/arrayUtils.js";
5
- import { COLORS as F } from "../../../constants/Theme.js";
6
- import { AGENT_CHAR_LIMITS as Gt } from "../constants/charLimits.js";
7
- import { CONFIG_TOOL_SOURCES as Bt, ToolSource as p } from "../constants/tools.js";
5
+ import { COLORS as j } from "../../../constants/Theme.js";
6
+ import { AGENT_CHAR_LIMITS as Bt } from "../constants/charLimits.js";
7
+ import { CONFIG_TOOL_SOURCES as Dt, ToolSource as p } from "../constants/tools.js";
8
8
  import { buildAgentMentionItems as Pt, buildCustomToolMentionItems as zt, restApiMentionItem as Lt, configToolMentionItem as Ut, restApiToolName as Ht, configToolName as $t, toolSourceLabel as Ft } from "../utils/mentionSerialization.js";
9
- import { sourceIcon as j, SOURCE_ICONS as ct, renderSourceIcon as ut } from "../utils/sourceIcons.js";
9
+ import { sourceIcon as W, SOURCE_ICONS as ct, renderSourceIcon as ut } from "../utils/sourceIcons.js";
10
10
  import { buildToolActions as jt } from "../utils/toolActions.js";
11
11
  import { ConfigToolPanel as Wt } from "./ConfigToolPanel.js";
12
12
  import { DRAWER_BODY_STYLE as Yt, DRAWER_HEADER_STYLE as Xt, DrawerHeaderText as Zt } from "./DrawerHeaderText.js";
@@ -16,14 +16,14 @@ import { SelectableListSection as Jt } from "./SelectableListSection.js";
16
16
  import { SideModal as Qt } from "../../side-modal/SideModal.js";
17
17
  import { Input as Vt } from "../../input/Input.js";
18
18
  import { Toaster as te } from "../../toaster/Toaster.js";
19
- const ee = 1e3, W = 1002, mt = (v, f) => {
20
- const s = v ?? [];
19
+ const ee = 1e3, Y = 1002, mt = (A, f) => {
20
+ const s = A ?? [];
21
21
  return s.some((u) => u.id === f.id) ? s.map((u) => u.id === f.id ? f : u) : [...s, f];
22
- }, pt = Dt.button`
22
+ }, pt = Gt.button`
23
23
  align-self: flex-start;
24
- border: 1px solid ${F.stroke.primary};
25
- color: ${F.content.primary};
26
- background: ${F.surface.standard};
24
+ border: 1px solid ${j.stroke.primary};
25
+ color: ${j.content.primary};
26
+ background: ${j.surface.standard};
27
27
  border-radius: 8px;
28
28
  padding: 6px 12px;
29
29
  font-size: 13px;
@@ -36,57 +36,57 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
36
36
  opacity: 0.6;
37
37
  }
38
38
  `, Ie = ({
39
- onClose: v,
39
+ onClose: A,
40
40
  onSave: f,
41
41
  availableTools: s,
42
42
  onImprove: u,
43
- onImproveToolInstructions: Y,
44
- configToolTemplates: X,
45
- title: Z = "Create sub-agent",
43
+ onImproveToolInstructions: X,
44
+ configToolTemplates: Z,
45
+ title: q = "Create sub-agent",
46
46
  initial: g,
47
- appLabel: q = "Manifest",
48
- charLimits: T = Gt,
49
- variablesData: J
47
+ appLabel: J = "Manifest",
48
+ charLimits: T = Bt,
49
+ variablesData: v
50
50
  }) => {
51
- const [M, ft] = r(g?.name ?? ""), [b, A] = r(g?.instructions ?? ""), [I, R] = r(g?.guardrail ?? ""), [w, _] = r(g?.tools ?? []), [m, O] = r(
51
+ const [w, ft] = r(g?.name ?? ""), [b, R] = r(g?.instructions ?? ""), [I, _] = r(g?.guardrail ?? ""), [O, k] = r(g?.tools ?? []), [m, K] = r(
52
52
  g?.configTools ?? []
53
- ), [d, K] = r(
53
+ ), [d, N] = r(
54
54
  g?.restApiTools ?? []
55
- ), [i, y] = r(null), k = h(0), [Q, V] = r(!1), [gt, N] = r(0), [yt, D] = r(0), [S, tt] = r(null), G = Nt(
55
+ ), [i, y] = r(null), E = h(0), [Q, V] = r(!1), [gt, G] = r(0), [yt, B] = r(0), [S, tt] = r(null), D = Nt(
56
56
  () => [
57
- ...Pt(s, [], q),
57
+ ...Pt(s, [], J),
58
58
  ...zt(m, d)
59
59
  ],
60
- [s, q, m, d]
61
- ), E = h({}), B = h("instructions"), ht = a((t) => {
62
- E.current.instructions = t ?? void 0;
60
+ [s, J, m, d]
61
+ ), M = h({}), P = h("instructions"), ht = a((t) => {
62
+ M.current.instructions = t ?? void 0;
63
63
  }, []), Tt = a((t) => {
64
- E.current.guardrail = t ?? void 0;
64
+ M.current.guardrail = t ?? void 0;
65
65
  }, []), bt = a(() => {
66
- B.current = "instructions";
66
+ P.current = "instructions";
67
67
  }, []), It = a(() => {
68
- B.current = "guardrail";
68
+ P.current = "guardrail";
69
69
  }, []), et = h(/* @__PURE__ */ new Set());
70
70
  et.current = new Set(
71
71
  [...m, ...d].map((t) => t.id)
72
72
  );
73
73
  const ot = a(
74
74
  (t, e) => {
75
- t === "tool" && !et.current.has(e) && _((o) => at(o, e));
75
+ t === "tool" && !et.current.has(e) && k((o) => at(o, e));
76
76
  },
77
77
  []
78
78
  ), C = a((t, e) => {
79
- (E.current[B.current] ?? E.current.instructions)?.("tool", t, e);
80
- }, []), P = a((t) => {
81
- k.current += 1, y({
82
- key: k.current,
79
+ (M.current[P.current] ?? M.current.instructions)?.("tool", t, e);
80
+ }, []), z = a((t) => {
81
+ E.current += 1, y({
82
+ key: E.current,
83
83
  kind: "restapi",
84
84
  initialRest: t
85
85
  });
86
- }, []), z = a(
86
+ }, []), L = a(
87
87
  (t, e) => {
88
- k.current += 1, y({
89
- key: k.current,
88
+ E.current += 1, y({
89
+ key: E.current,
90
90
  kind: "config",
91
91
  toolKey: t,
92
92
  initialConfig: e
@@ -95,64 +95,64 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
95
95
  []
96
96
  ), St = a(
97
97
  (t) => {
98
- const e = Bt[t];
99
- e ? z(e) : P();
98
+ const e = Dt[t];
99
+ e ? L(e) : z();
100
100
  },
101
- [z, P]
101
+ [L, z]
102
102
  ), Ct = a(
103
103
  (t) => {
104
104
  const e = !d.some((o) => o.id === t.id);
105
- K((o) => mt(o, t)), e && C(t.id, Lt(t).label), y(null);
105
+ N((o) => mt(o, t)), e && C(t.id, Lt(t).label), y(null);
106
106
  },
107
107
  [d, C]
108
108
  ), xt = a(
109
109
  (t) => {
110
110
  const e = !m.some((o) => o.id === t.id);
111
- O((o) => mt(o, t)), e && C(t.id, Ut(t).label), y(null);
111
+ K((o) => mt(o, t)), e && C(t.id, Ut(t).label), y(null);
112
112
  },
113
113
  [m, C]
114
- ), [L, U] = r(
114
+ ), [U, H] = r(
115
115
  null
116
- ), H = h(null), nt = h(0), vt = (t) => {
116
+ ), $ = h(null), nt = h(0), At = (t) => {
117
117
  const e = s.find((n) => n.tool_id === t)?.display_name ?? d.find((n) => n.id === t)?.name ?? "Tool", o = `{{tool:${t}}}`, l = (n) => n.split(o).join("");
118
- H.current = {
118
+ $.current = {
119
119
  instructions: b,
120
120
  guardrail: I,
121
- tools: w,
121
+ tools: O,
122
122
  configTools: m,
123
123
  restApiTools: d
124
- }, A((n) => l(n)), R((n) => l(n)), _((n) => n.filter((x) => x !== t)), O((n) => n.filter((x) => x.id !== t)), K((n) => n.filter((x) => x.id !== t)), N((n) => n + 1), D((n) => n + 1), nt.current += 1, U({ id: nt.current, message: `Tool "${e}" removed` });
125
- }, At = () => {
126
- const t = H.current;
127
- t && (A(t.instructions), R(t.guardrail), _(t.tools), O(t.configTools), K(t.restApiTools), N((e) => e + 1), D((e) => e + 1), H.current = null), U(null);
128
- }, st = M.trim().length > 0 && (b.trim().length > 0 || I.trim().length > 0), Rt = w.map((t) => {
124
+ }, R((n) => l(n)), _((n) => l(n)), k((n) => n.filter((x) => x !== t)), K((n) => n.filter((x) => x.id !== t)), N((n) => n.filter((x) => x.id !== t)), G((n) => n + 1), B((n) => n + 1), nt.current += 1, H({ id: nt.current, message: `Tool "${e}" removed` });
125
+ }, vt = () => {
126
+ const t = $.current;
127
+ t && (R(t.instructions), _(t.guardrail), k(t.tools), K(t.configTools), N(t.restApiTools), G((e) => e + 1), B((e) => e + 1), $.current = null), H(null);
128
+ }, st = w.trim().length > 0 && (b.trim().length > 0 || I.trim().length > 0), Rt = O.map((t) => {
129
129
  const e = s.find((o) => o.tool_id === t);
130
130
  return e ? {
131
131
  id: t,
132
132
  label: e.display_name,
133
- icon: j(e.source ?? p.Manifest)
133
+ icon: W(e.source ?? p.Manifest)
134
134
  } : null;
135
135
  }).filter((t) => t !== null), _t = d.map((t) => ({
136
136
  id: t.id,
137
137
  label: Ht(t),
138
138
  icon: ct[p.RestApi],
139
- onConfigure: () => P(t)
139
+ onConfigure: () => z(t)
140
140
  })), kt = m.map((t) => ({
141
141
  id: t.id,
142
142
  label: $t(t),
143
143
  icon: ct[t.tool_key === "send_slack_message" ? p.Slack : p.EmailHandover],
144
- onConfigure: () => z(t.tool_key, t)
144
+ onConfigure: () => L(t.tool_key, t)
145
145
  })), Et = [
146
146
  ...Rt,
147
147
  ..._t,
148
148
  ...kt
149
- ], $ = jt(
150
- X,
149
+ ], F = jt(
150
+ Z,
151
151
  St
152
- ), rt = i?.kind === "config" && i.toolKey ? X?.[i.toolKey] : void 0, Mt = s.map((t) => ({
152
+ ), rt = i?.kind === "config" && i.toolKey ? Z?.[i.toolKey] : void 0, Mt = s.map((t) => ({
153
153
  label: t.display_name,
154
154
  value: t.tool_id,
155
- leadingIcon: ut(j(t.source ?? p.Manifest)) ?? void 0
155
+ leadingIcon: ut(W(t.source ?? p.Manifest)) ?? void 0
156
156
  })), wt = (() => {
157
157
  const t = [], e = /* @__PURE__ */ new Map();
158
158
  return s.forEach((o) => {
@@ -160,7 +160,7 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
160
160
  e.has(l) || (e.set(l, []), t.push(l)), e.get(l)?.push({
161
161
  label: o.display_name,
162
162
  value: o.tool_id,
163
- leadingIcon: ut(j(o.source ?? p.Manifest)) ?? void 0
163
+ leadingIcon: ut(W(o.source ?? p.Manifest)) ?? void 0
164
164
  });
165
165
  }), t.map((o) => ({
166
166
  source: o,
@@ -171,10 +171,10 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
171
171
  if (!st || Q)
172
172
  return;
173
173
  const t = f({
174
- name: M.trim(),
174
+ name: w.trim(),
175
175
  instructions: b,
176
176
  guardrail: I,
177
- tools: w,
177
+ tools: O,
178
178
  configTools: m,
179
179
  restApiTools: d
180
180
  });
@@ -191,7 +191,7 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
191
191
  tt(t);
192
192
  try {
193
193
  const o = await u(t, t === "instructions" ? b : I);
194
- t === "instructions" ? (A(o), N((l) => l + 1)) : (R(o), D((l) => l + 1));
194
+ t === "instructions" ? (R(o), G((l) => l + 1)) : (_(o), B((l) => l + 1));
195
195
  } finally {
196
196
  tt(null);
197
197
  }
@@ -201,20 +201,20 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
201
201
  /* @__PURE__ */ lt(
202
202
  Qt,
203
203
  {
204
- header: Z,
204
+ header: q,
205
205
  closeOnEscapeKey: !1,
206
206
  zIndex: ee,
207
207
  headerCustomComponent: /* @__PURE__ */ c(
208
208
  Zt,
209
209
  {
210
- title: Z,
210
+ title: q,
211
211
  subtitle: "Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."
212
212
  }
213
213
  ),
214
214
  width: "421px",
215
215
  headerStyle: Xt,
216
216
  bodyStyle: Yt,
217
- onClose: v,
217
+ onClose: A,
218
218
  saveButtonProps: {
219
219
  "data-test": "subagent-save",
220
220
  buttonText: "Save",
@@ -229,7 +229,7 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
229
229
  buttonText: "Cancel",
230
230
  buttonType: "tertiaryGray",
231
231
  size: "small",
232
- onClick: v
232
+ onClick: A
233
233
  },
234
234
  children: [
235
235
  /* @__PURE__ */ c(
@@ -239,7 +239,7 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
239
239
  labelText: "Agent name",
240
240
  labelTextBold: !0,
241
241
  placeholder: "Enter agent name",
242
- value: M,
242
+ value: w,
243
243
  maxCharLimit: T.name,
244
244
  maxCharLimitPosition: "TOP",
245
245
  maxCharStyle: { fontSize: 12, lineHeight: "16px" },
@@ -252,15 +252,15 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
252
252
  "data-test": "subagent-instructions",
253
253
  label: "Instructions",
254
254
  value: b,
255
- onChange: A,
255
+ onChange: R,
256
256
  maxLength: T.instructions,
257
257
  placeholder: "Write the steps in plain English. Type @ to reference a tool.",
258
258
  minHeight: "160px",
259
259
  resetKey: `instr-${gt}`,
260
- mentionItems: G,
260
+ mentionItems: D,
261
261
  tools: s,
262
- toolActions: $,
263
- variablesData: J,
262
+ toolActions: F,
263
+ variablesData: v,
264
264
  onMentionSelect: ot,
265
265
  onFocus: bt,
266
266
  registerInsert: ht,
@@ -282,15 +282,15 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
282
282
  "data-test": "subagent-guardrail",
283
283
  label: "Guardrails",
284
284
  value: I,
285
- onChange: R,
285
+ onChange: _,
286
286
  maxLength: T.guardrail,
287
287
  placeholder: "e.g. Never discuss competitor pricing. Type @ to reference a tool.",
288
288
  minHeight: "160px",
289
289
  resetKey: `guard-${yt}`,
290
- mentionItems: G,
290
+ mentionItems: D,
291
291
  tools: s,
292
- toolActions: $,
293
- variablesData: J,
292
+ toolActions: F,
293
+ variablesData: v,
294
294
  onMentionSelect: ot,
295
295
  onFocus: It,
296
296
  registerInsert: Tt,
@@ -314,15 +314,15 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
314
314
  items: Et,
315
315
  addableOptions: Mt,
316
316
  sourceGroups: wt,
317
- mentionItems: G,
318
- actionSources: $,
317
+ mentionItems: D,
318
+ actionSources: F,
319
319
  emptyText: "No tools added yet.",
320
320
  pickerOpensUp: !0,
321
321
  onAdd: (t) => {
322
- C(t), _((e) => at(e, t));
322
+ C(t), k((e) => at(e, t));
323
323
  },
324
- onRemove: vt,
325
- confirmDelete: { noun: "tool", zIndex: W + 1 }
324
+ onRemove: At,
325
+ confirmDelete: { noun: "tool", zIndex: Y + 1 }
326
326
  }
327
327
  )
328
328
  ]
@@ -333,10 +333,11 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
333
333
  {
334
334
  initial: i.initialRest,
335
335
  charLimits: T,
336
- onImprove: Y,
336
+ variablesData: v,
337
+ onImprove: X,
337
338
  onClose: () => y(null),
338
339
  onSave: Ct,
339
- zIndex: W
340
+ zIndex: Y
340
341
  },
341
342
  i.key
342
343
  ),
@@ -347,17 +348,18 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
347
348
  template: rt,
348
349
  initial: i.initialConfig,
349
350
  charLimits: T,
350
- onImprove: Y,
351
+ variablesData: v,
352
+ onImprove: X,
351
353
  onClose: () => y(null),
352
354
  onSave: xt,
353
- zIndex: W
355
+ zIndex: Y
354
356
  },
355
357
  i.key
356
358
  ),
357
- L && /* @__PURE__ */ c(
359
+ U && /* @__PURE__ */ c(
358
360
  te,
359
361
  {
360
- text: L.message,
362
+ text: U.message,
361
363
  type: "info",
362
364
  position: "top-right",
363
365
  autoClose: 5e3,
@@ -365,11 +367,11 @@ const ee = 1e3, W = 1002, mt = (v, f) => {
365
367
  buttonProps: {
366
368
  buttonText: "Undo",
367
369
  showButton: !0,
368
- onButtonClick: () => (At(), {})
370
+ onButtonClick: () => (vt(), {})
369
371
  },
370
- onCloseToast: () => U(null)
372
+ onCloseToast: () => H(null)
371
373
  },
372
- L.id
374
+ U.id
373
375
  )
374
376
  ] });
375
377
  };
@@ -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 { CONFIG_TOOL_SOURCES, ToolSource } from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\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 = (kind: 'tool' | 'subagent', id: string, label?: string) => 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/** 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/** 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\ttitle = 'Create sub-agent',\n\tinitial,\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((id: string, label?: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id, label);\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) => {\n\t\t\tconst toolKey = CONFIG_TOOL_SOURCES[source];\n\t\t\tif (toolKey) {\n\t\t\t\topenConfigTool(toolKey);\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\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, restApiMentionItem(tool).label);\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(tool.id, configToolMentionItem(tool).label);\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 canSave =\n\t\tname.trim().length > 0 &&\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 }\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.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\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\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\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\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. Type @ to reference a tool.\"\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\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. Type @ to reference a tool.\"\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\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\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\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\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\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","title","initial","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","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","openRestApi","tool","openConfigTool","toolKey","openToolAction","source","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","t","restApiMentionItem","handleSaveConfigTool","configToolMentionItem","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","canSave","toolItems","sourceIcon","ToolSource","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","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 { CONFIG_TOOL_SOURCES, ToolSource } from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\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 = (kind: 'tool' | 'subagent', id: string, label?: string) => 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/** 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/** 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\ttitle = 'Create sub-agent',\n\tinitial,\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((id: string, label?: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id, label);\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) => {\n\t\t\tconst toolKey = CONFIG_TOOL_SOURCES[source];\n\t\t\tif (toolKey) {\n\t\t\t\topenConfigTool(toolKey);\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\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, restApiMentionItem(tool).label);\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(tool.id, configToolMentionItem(tool).label);\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 canSave =\n\t\tname.trim().length > 0 &&\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 }\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.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\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\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\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\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. Type @ to reference a tool.\"\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\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. Type @ to reference a tool.\"\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\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\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\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","title","initial","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","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","openRestApi","tool","openConfigTool","toolKey","openToolAction","source","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","t","restApiMentionItem","handleSaveConfigTool","configToolMentionItem","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","canSave","toolItems","sourceIcon","ToolSource","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","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,4 +1,5 @@
1
1
  import { default as React } from 'react';
2
+ import { VariableListInterfaceV3 } from '../../variable-picker-v3/model';
2
3
  import { RestApiToolConfig } from '../AgentBuilder.model';
3
4
  import { AgentCharLimits } from '../constants/charLimits';
4
5
  interface RestApiToolPanelProps {
@@ -14,7 +15,22 @@ interface RestApiToolPanelProps {
14
15
  zIndex?: number;
15
16
  /** Names of the OTHER tools — a new tool can't reuse one of these. */
16
17
  existingNames?: string[];
18
+ /**
19
+ * Variable catalog for the `@` trigger. When non-empty, `@` opens the
20
+ * variable picker directly in Instructions / Request URL / header values /
21
+ * Request / Response. Absent → the drawer behaves exactly as before.
22
+ */
23
+ variablesData?: VariableListInterfaceV3[];
17
24
  }
25
+ /**
26
+ * Keep the Request / Response bodies valid JSON: wrap the picked token in
27
+ * quotes (`"email": "{{variable:customer.email}}"`) — unless the `@` was typed
28
+ * inside a string literal already (odd number of unescaped `"` before it, e.g.
29
+ * `"Bearer @`), where the bare token interpolates into the existing string.
30
+ */
31
+ export declare const jsonQuoteToken: (token: string, ctx: {
32
+ textBefore: string;
33
+ }) => string;
18
34
  /**
19
35
  * Right-side drawer to configure a "Rest API" tool: the endpoint the agent can
20
36
  * call, plus a JSON request-body template and a sample response. Mount it fresh