@bikdotai/bik-component-library 0.0.852 → 0.0.853

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 (79) hide show
  1. package/dist/cjs/components/agent-builder/AgentBuilder.js +1 -1
  2. package/dist/cjs/components/agent-builder/AgentBuilder.js.map +1 -1
  3. package/dist/cjs/components/agent-builder/components/AgentBuilderFooter.js +1 -1
  4. package/dist/cjs/components/agent-builder/components/AgentBuilderFooter.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/AgentBuilderTopBar.js +1 -1
  6. package/dist/cjs/components/agent-builder/components/AgentBuilderTopBar.js.map +1 -1
  7. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +5 -5
  8. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  9. package/dist/cjs/components/agent-builder/components/GoLiveModal.js +1 -1
  10. package/dist/cjs/components/agent-builder/components/GoLiveModal.js.map +1 -1
  11. package/dist/cjs/components/agent-builder/components/MentionPicker.js +24 -24
  12. package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
  13. package/dist/cjs/components/agent-builder/components/RequireVerificationModal.js +1 -1
  14. package/dist/cjs/components/agent-builder/components/RequireVerificationModal.js.map +1 -1
  15. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +2 -2
  16. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  17. package/dist/cjs/components/agent-builder/components/SelectableListSection.js +1 -1
  18. package/dist/cjs/components/agent-builder/components/SelectableListSection.js.map +1 -1
  19. package/dist/cjs/components/agent-builder/constants/tools.js +1 -1
  20. package/dist/cjs/components/agent-builder/constants/tools.js.map +1 -1
  21. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
  22. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  23. package/dist/cjs/components/agent-builder/utils/sourceIcons.js +1 -1
  24. package/dist/cjs/components/agent-builder/utils/sourceIcons.js.map +1 -1
  25. package/dist/cjs/components/agent-listing/AgentTableRow.js +1 -1
  26. package/dist/cjs/components/agent-listing/AgentTableRow.js.map +1 -1
  27. package/dist/cjs/components/agent-listing/AiAgentsEmptyState.js +1 -1
  28. package/dist/cjs/components/agent-listing/AiAgentsEmptyState.js.map +1 -1
  29. package/dist/cjs/components/zeroState/ZeroState.js +3 -3
  30. package/dist/cjs/components/zeroState/ZeroState.js.map +1 -1
  31. package/dist/cjs/editor/BikEditor.js +1 -1
  32. package/dist/cjs/editor/BikEditor.js.map +1 -1
  33. package/dist/cjs/editor/BikEditor.styles.js +22 -16
  34. package/dist/cjs/editor/BikEditor.styles.js.map +1 -1
  35. package/dist/cjs/editor/extensions/jsonHighlight/JsonHighlightExtension.js +3 -3
  36. package/dist/cjs/editor/extensions/jsonHighlight/JsonHighlightExtension.js.map +1 -1
  37. package/dist/esm/components/agent-builder/AgentBuilder.js +146 -136
  38. package/dist/esm/components/agent-builder/AgentBuilder.js.map +1 -1
  39. package/dist/esm/components/agent-builder/AgentBuilder.model.d.ts +7 -2
  40. package/dist/esm/components/agent-builder/components/AgentBuilderFooter.d.ts +2 -0
  41. package/dist/esm/components/agent-builder/components/AgentBuilderFooter.js +29 -26
  42. package/dist/esm/components/agent-builder/components/AgentBuilderFooter.js.map +1 -1
  43. package/dist/esm/components/agent-builder/components/AgentBuilderTopBar.js +30 -29
  44. package/dist/esm/components/agent-builder/components/AgentBuilderTopBar.js.map +1 -1
  45. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +9 -0
  46. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +199 -184
  47. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  48. package/dist/esm/components/agent-builder/components/GoLiveModal.js +11 -13
  49. package/dist/esm/components/agent-builder/components/GoLiveModal.js.map +1 -1
  50. package/dist/esm/components/agent-builder/components/MentionPicker.js +174 -150
  51. package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
  52. package/dist/esm/components/agent-builder/components/RequireVerificationModal.js +8 -8
  53. package/dist/esm/components/agent-builder/components/RequireVerificationModal.js.map +1 -1
  54. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +54 -51
  55. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  56. package/dist/esm/components/agent-builder/components/SelectableListSection.js +73 -69
  57. package/dist/esm/components/agent-builder/components/SelectableListSection.js.map +1 -1
  58. package/dist/esm/components/agent-builder/constants/tools.d.ts +20 -0
  59. package/dist/esm/components/agent-builder/constants/tools.js +34 -23
  60. package/dist/esm/components/agent-builder/constants/tools.js.map +1 -1
  61. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +270 -255
  62. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  63. package/dist/esm/components/agent-builder/utils/sourceIcons.d.ts +6 -6
  64. package/dist/esm/components/agent-builder/utils/sourceIcons.js +21 -19
  65. package/dist/esm/components/agent-builder/utils/sourceIcons.js.map +1 -1
  66. package/dist/esm/components/agent-listing/AgentTableRow.js +26 -23
  67. package/dist/esm/components/agent-listing/AgentTableRow.js.map +1 -1
  68. package/dist/esm/components/agent-listing/AiAgentsEmptyState.js +3 -2
  69. package/dist/esm/components/agent-listing/AiAgentsEmptyState.js.map +1 -1
  70. package/dist/esm/components/zeroState/ZeroState.d.ts +2 -0
  71. package/dist/esm/components/zeroState/ZeroState.js +18 -17
  72. package/dist/esm/components/zeroState/ZeroState.js.map +1 -1
  73. package/dist/esm/editor/BikEditor.js +236 -223
  74. package/dist/esm/editor/BikEditor.js.map +1 -1
  75. package/dist/esm/editor/BikEditor.styles.js +18 -12
  76. package/dist/esm/editor/BikEditor.styles.js.map +1 -1
  77. package/dist/esm/editor/extensions/jsonHighlight/JsonHighlightExtension.js +62 -60
  78. package/dist/esm/editor/extensions/jsonHighlight/JsonHighlightExtension.js.map +1 -1
  79. package/package.json +1 -1
@@ -3,11 +3,11 @@ import ie from "../../../assets/icons/delete.svg.js";
3
3
  import de from "../../../assets/icons/edit.svg.js";
4
4
  import Q from "../../../assets/icons/plus.svg.js";
5
5
  import { useState as m, useRef as U, useEffect as se } from "react";
6
- import R from "styled-components";
7
- import { TitleSmall as ae, BodyCaption as $, BodySecondary as A } from "../../TypographyStyle.js";
6
+ import I from "styled-components";
7
+ import { TitleSmall as ae, BodyCaption as $, BodySecondary as R } from "../../TypographyStyle.js";
8
8
  import { COLORS as d } from "../../../constants/Theme.js";
9
9
  import { SideSection as ue, SideSectionHeader as he, AddIconButton as fe, SourceButtonRow as pe, SourceButton as X, SelectableRow as me, RowLabel as Se, RowText as be, RowActions as ve, RowMenuButton as Y, RowActionDivider as ye } from "../AgentBuilder.styled.js";
10
- import { renderSourceIcon as I, sourceIcon as we } from "../utils/sourceIcons.js";
10
+ import { renderSourceIcon as D, sourceIcon as we } from "../utils/sourceIcons.js";
11
11
  import { MentionPicker as $e } from "./MentionPicker.js";
12
12
  import { Dropdown as Z } from "../../dropdown/Dropdown.js";
13
13
  import { unwrapDropdownValue as P } from "../../dropdown/utils.js";
@@ -17,64 +17,68 @@ import { Tooltip as g } from "../../tooltips/Tooltip.js";
17
17
  import ke from "../../../icons/Informational/Common UI/Shield.js";
18
18
  const G = "__bik_create_new__", Je = ({
19
19
  title: s,
20
- helper: D,
20
+ helper: _,
21
21
  items: u,
22
22
  addableOptions: S,
23
23
  onAdd: b,
24
- onRemove: _,
25
- dataTestPrefix: l,
24
+ onRemove: L,
25
+ dataTestPrefix: r,
26
26
  emptyText: O,
27
- createOption: r,
28
- onConfigure: L,
27
+ createOption: t,
28
+ onConfigure: B,
29
29
  sourceGroups: h,
30
- mentionItems: B,
30
+ mentionItems: C,
31
31
  actionSources: v,
32
32
  confirmDelete: p,
33
33
  pickerOpensUp: z
34
34
  }) => {
35
- const [f, t] = m(!1), [x, C] = m(null), [H, M] = m(null), [ee, k] = m(null), y = !!h && h.length > 0, E = h?.find((e) => e.source === ee), c = B !== void 0, j = U(null), q = U(null), [w, W] = m(null);
35
+ const [f, l] = m(!1), [x, k] = m(null), [H, M] = m(null), [ee, E] = m(null), y = !!h && h.length > 0, A = h?.find((e) => e.source === ee), c = C !== void 0, j = U(null), q = U(null), [w, W] = m(null);
36
36
  se(() => {
37
37
  if (!c || !f)
38
38
  return;
39
39
  const e = (a) => {
40
40
  const V = a.target;
41
- !j.current?.contains(V) && !q.current?.contains(V) && t(!1);
41
+ !j.current?.contains(V) && !q.current?.contains(V) && l(!1);
42
42
  }, o = (a) => {
43
- a.key === "Escape" && t(!1);
43
+ a.key === "Escape" && l(!1);
44
44
  };
45
45
  return document.addEventListener("mousedown", e), document.addEventListener("keydown", o), () => {
46
46
  document.removeEventListener("mousedown", e), document.removeEventListener("keydown", o);
47
47
  };
48
48
  }, [c, f]);
49
- const ne = y ? c || u.length > 0 : c || S.length > 0 || !!r && u.length > 0, oe = u.length === 0 && !!r && !y && !c, F = !!v && v.length > 0, te = (y || F) && u.length === 0, le = () => {
49
+ const ne = y ? c || u.length > 0 : c || S.length > 0 || !!t && u.length > 0, oe = u.length === 0 && !!t && !y && !c, F = !!v && v.length > 0, te = (y || F) && u.length === 0, le = () => {
50
50
  if (c) {
51
- W(null), t((e) => !e);
51
+ if ((C?.length ?? 0) === 0 && t) {
52
+ t.onSelect();
53
+ return;
54
+ }
55
+ W(null), l((e) => !e);
52
56
  return;
53
57
  }
54
58
  if (y) {
55
- k(null), t((e) => !e);
59
+ E(null), l((e) => !e);
56
60
  return;
57
61
  }
58
- if (S.length === 0 && r) {
59
- r.onSelect();
62
+ if (S.length === 0 && t) {
63
+ t.onSelect();
60
64
  return;
61
65
  }
62
- t((e) => !e);
66
+ l((e) => !e);
63
67
  }, re = (e, o) => {
64
68
  if (H)
65
69
  return;
66
70
  const a = o();
67
71
  a && typeof a.then == "function" && (M(e), a.finally(() => M(null)));
68
72
  }, ce = () => u.map((e) => {
69
- const o = e.onConfigure ?? (L ? () => L(e.id) : void 0);
73
+ const o = e.onConfigure ?? (B ? () => B(e.id) : void 0);
70
74
  return /* @__PURE__ */ i(
71
75
  me,
72
76
  {
73
- "data-test": `${l}-row-${e.id}`,
77
+ "data-test": `${r}-row-${e.id}`,
74
78
  children: [
75
- I(e.icon),
79
+ D(e.icon),
76
80
  /* @__PURE__ */ i(Se, { children: [
77
- /* @__PURE__ */ n(g, { body: e.label, placement: "top", children: /* @__PURE__ */ n(be, { children: /* @__PURE__ */ n(A, { numberOfLines: 1, color: d.content.primary, children: e.label }) }) }),
81
+ /* @__PURE__ */ n(g, { body: e.label, placement: "top", children: /* @__PURE__ */ n(be, { children: /* @__PURE__ */ n(R, { numberOfLines: 1, color: d.content.primary, children: e.label }) }) }),
78
82
  e.authRequired && // Order tools touch customer-private data — the shield flags that
79
83
  // this agent must verify the customer before the tool can run.
80
84
  /* @__PURE__ */ n(
@@ -85,7 +89,7 @@ const G = "__bik_create_new__", Je = ({
85
89
  children: /* @__PURE__ */ n(
86
90
  "span",
87
91
  {
88
- "data-test": `${l}-auth-${e.id}`,
92
+ "data-test": `${r}-auth-${e.id}`,
89
93
  style: { display: "inline-flex", flexShrink: 0 },
90
94
  children: /* @__PURE__ */ n(ke, { size: 16 })
91
95
  }
@@ -99,7 +103,7 @@ const G = "__bik_create_new__", Je = ({
99
103
  /* @__PURE__ */ n(g, { body: "Edit", placement: "top", children: /* @__PURE__ */ n(
100
104
  Y,
101
105
  {
102
- "data-test": `${l}-edit-${e.id}`,
106
+ "data-test": `${r}-edit-${e.id}`,
103
107
  "aria-label": `Edit ${e.label}`,
104
108
  disabled: H !== null,
105
109
  onClick: () => re(e.id, o),
@@ -117,9 +121,9 @@ const G = "__bik_create_new__", Je = ({
117
121
  /* @__PURE__ */ n(g, { body: "Delete", placement: "top", children: /* @__PURE__ */ n(
118
122
  Y,
119
123
  {
120
- "data-test": `${l}-delete-${e.id}`,
124
+ "data-test": `${r}-delete-${e.id}`,
121
125
  "aria-label": `Delete ${e.label}`,
122
- onClick: () => p ? C(e.id) : _(e.id),
126
+ onClick: () => p ? k(e.id) : L(e.id),
123
127
  children: /* @__PURE__ */ n(
124
128
  ie,
125
129
  {
@@ -135,12 +139,12 @@ const G = "__bik_create_new__", Je = ({
135
139
  },
136
140
  e.id
137
141
  );
138
- }), K = r ? [
142
+ }), K = t ? [
139
143
  ...S,
140
144
  {
141
- label: r.label,
145
+ label: t.label,
142
146
  value: G,
143
- searchKey: r.label,
147
+ searchKey: t.label,
144
148
  customComponent: /* @__PURE__ */ n(
145
149
  "div",
146
150
  {
@@ -152,35 +156,35 @@ const G = "__bik_create_new__", Je = ({
152
156
  fontSize: 14,
153
157
  fontWeight: 600
154
158
  },
155
- children: r.label
159
+ children: t.label
156
160
  }
157
161
  )
158
162
  }
159
163
  ] : S, N = c ? /* @__PURE__ */ n(
160
164
  $e,
161
165
  {
162
- items: B ?? [],
166
+ items: C ?? [],
163
167
  query: "",
164
168
  activeIndex: 0,
165
169
  initialSource: w ?? void 0,
166
170
  onSelect: (e) => {
167
- t(!1), b(String(e.id));
171
+ l(!1), b(String(e.id));
168
172
  },
169
- onClose: () => t(!1),
170
- onCreateSubAgent: r ? () => {
171
- t(!1), r.onSelect();
173
+ onClose: () => l(!1),
174
+ onCreateSubAgent: t ? () => {
175
+ l(!1), t.onSelect();
172
176
  } : void 0,
173
177
  toolActions: F ? v?.map((e) => ({
174
178
  ...e,
175
179
  onSelect: () => {
176
- t(!1), e.onSelect();
180
+ l(!1), e.onSelect();
177
181
  }
178
182
  })) : void 0,
179
183
  integrationStatus: Object.fromEntries(
180
184
  (h ?? []).filter((e) => e.connected !== void 0).map((e) => [e.source, e.connected])
181
185
  ),
182
186
  onConnectIntegration: (e) => {
183
- t(!1), h?.find((o) => o.source === e)?.onConnect?.();
187
+ l(!1), h?.find((o) => o.source === e)?.onConnect?.();
184
188
  }
185
189
  },
186
190
  w ?? "__root__"
@@ -192,7 +196,7 @@ const G = "__bik_create_new__", Je = ({
192
196
  /* @__PURE__ */ n(
193
197
  fe,
194
198
  {
195
- "data-test": `${l}-add`,
199
+ "data-test": `${r}-add`,
196
200
  onClick: le,
197
201
  "aria-label": `Add ${s}`,
198
202
  children: /* @__PURE__ */ n(Q, { width: 16, height: 16, color: d.content.primary })
@@ -202,43 +206,43 @@ const G = "__bik_create_new__", Je = ({
202
206
  T,
203
207
  {
204
208
  $up: z,
205
- "data-test": `${l}-picker`,
209
+ "data-test": `${r}-picker`,
206
210
  children: N
207
211
  }
208
212
  )
209
213
  ] })
210
214
  ] }),
211
- D && /* @__PURE__ */ n($, { color: d.content.secondary, children: D }),
215
+ _ && /* @__PURE__ */ n($, { color: d.content.secondary, children: _ }),
212
216
  te ? /* @__PURE__ */ i(Ae, { ref: c ? q : void 0, children: [
213
- /* @__PURE__ */ i(pe, { "data-test": `${l}-sources`, children: [
217
+ /* @__PURE__ */ i(pe, { "data-test": `${r}-sources`, children: [
214
218
  h?.map((e) => {
215
219
  const o = e.connected !== !1 && e.options.length === 1 ? e.options[0] : void 0;
216
220
  return /* @__PURE__ */ i(
217
221
  X,
218
222
  {
219
223
  type: "button",
220
- "data-test": `${l}-source-${e.source}`,
224
+ "data-test": `${r}-source-${e.source}`,
221
225
  onClick: () => {
222
226
  if (e.connected === !1) {
223
227
  e.onConnect?.();
224
228
  return;
225
229
  }
226
230
  if (o) {
227
- t(!1), b(o.value);
231
+ l(!1), b(o.value);
228
232
  return;
229
233
  }
230
234
  if (c) {
231
- W(e.source), t(!0);
235
+ W(e.source), l(!0);
232
236
  return;
233
237
  }
234
- k(e.source);
238
+ E(e.source);
235
239
  },
236
240
  children: [
237
- I(we(e.source), -4),
241
+ D(we(e.source), -4),
238
242
  /* @__PURE__ */ n($, { color: d.content.primary, children: o ? o.label : e.label }),
239
243
  e.connected === !1 && // Not connected → show "Connect" upfront (consistent with
240
244
  // the `@` picker); clicking runs the connect flow.
241
- /* @__PURE__ */ n(A, { color: d.content.brand, children: "Connect" })
245
+ /* @__PURE__ */ n(R, { color: d.content.brand, children: "Connect" })
242
246
  ]
243
247
  },
244
248
  e.source
@@ -248,16 +252,16 @@ const G = "__bik_create_new__", Je = ({
248
252
  X,
249
253
  {
250
254
  type: "button",
251
- "data-test": `${l}-action-${e.source}`,
255
+ "data-test": `${r}-action-${e.source}`,
252
256
  onClick: e.connected === !1 ? () => e.onConnect?.() : () => {
253
- t(!1), e.onSelect();
257
+ l(!1), e.onSelect();
254
258
  },
255
259
  children: [
256
- I(e.icon, -4),
260
+ D(e.icon, -4),
257
261
  /* @__PURE__ */ n($, { color: d.content.primary, children: e.label }),
258
262
  e.connected === !1 && // Not connected → "Connect" upfront (consistent with the
259
263
  // source buttons and the `@` picker).
260
- /* @__PURE__ */ n(A, { color: d.content.brand, children: "Connect" })
264
+ /* @__PURE__ */ n(R, { color: d.content.brand, children: "Connect" })
261
265
  ]
262
266
  },
263
267
  e.source
@@ -268,22 +272,22 @@ const G = "__bik_create_new__", Je = ({
268
272
  {
269
273
  $align: "left",
270
274
  $up: z,
271
- "data-test": `${l}-picker`,
275
+ "data-test": `${r}-picker`,
272
276
  children: N
273
277
  }
274
278
  ),
275
- !c && E && /* @__PURE__ */ n(
279
+ !c && A && /* @__PURE__ */ n(
276
280
  Z,
277
281
  {
278
- "data-test": `${l}-dropdown`,
282
+ "data-test": `${r}-dropdown`,
279
283
  size: "small",
280
284
  width: "100%",
281
285
  isSearchable: !0,
282
- placeHolder: `Search ${E.label} tools`,
283
- options: E.options,
286
+ placeHolder: `Search ${A.label} tools`,
287
+ options: A.options,
284
288
  onSelect: (e) => {
285
289
  const o = P(e);
286
- k(null), t(!1), o && b(o);
290
+ E(null), l(!1), o && b(o);
287
291
  }
288
292
  }
289
293
  )
@@ -291,7 +295,7 @@ const G = "__bik_create_new__", Je = ({
291
295
  !c && f && K.length > 0 && /* @__PURE__ */ n(
292
296
  Z,
293
297
  {
294
- "data-test": `${l}-dropdown`,
298
+ "data-test": `${r}-dropdown`,
295
299
  size: "small",
296
300
  width: "100%",
297
301
  isSearchable: !0,
@@ -299,22 +303,22 @@ const G = "__bik_create_new__", Je = ({
299
303
  options: K,
300
304
  onSelect: (e) => {
301
305
  const o = P(e);
302
- t(!1), o && (o === G ? r?.onSelect() : b(o));
306
+ l(!1), o && (o === G ? t?.onSelect() : b(o));
303
307
  }
304
308
  }
305
309
  ),
306
310
  u.length === 0 && !f ? /* @__PURE__ */ i(J, { children: [
307
311
  /* @__PURE__ */ n($, { color: d.content.placeholder, children: O }),
308
- oe && r && /* @__PURE__ */ n(
312
+ oe && t && /* @__PURE__ */ n(
309
313
  ge,
310
314
  {
311
- "data-test": `${l}-create`,
315
+ "data-test": `${r}-create`,
312
316
  buttonType: "secondary",
313
317
  size: "small",
314
318
  matchParentWidth: !0,
315
319
  LeadingIcon: Q,
316
- buttonText: r.label,
317
- onClick: r.onSelect
320
+ buttonText: t.label,
321
+ onClick: t.onSelect
318
322
  }
319
323
  )
320
324
  ] }) : ce()
@@ -322,27 +326,27 @@ const G = "__bik_create_new__", Je = ({
322
326
  p && x && /* @__PURE__ */ n(
323
327
  Ce,
324
328
  {
325
- "data-test": `${l}-delete-confirm`,
329
+ "data-test": `${r}-delete-confirm`,
326
330
  header: `Delete this ${p.noun}?`,
327
331
  subHeader: `Deleting this ${p.noun} will also remove it from your instructions, wherever it's referenced.`,
328
332
  confirmationText: "Delete",
329
333
  zIndex: p.zIndex,
330
334
  onDeleteConfirmed: () => {
331
- _(x), C(null);
335
+ L(x), k(null);
332
336
  },
333
- onCancelClicked: () => C(null)
337
+ onCancelClicked: () => k(null)
334
338
  }
335
339
  )
336
340
  ] });
337
- }, Ee = R.div`
341
+ }, Ee = I.div`
338
342
  position: relative;
339
343
  display: flex;
340
- `, Ae = R.div`
344
+ `, Ae = I.div`
341
345
  position: relative;
342
346
  display: flex;
343
347
  flex-direction: column;
344
348
  gap: 8px;
345
- `, T = R.div`
349
+ `, T = I.div`
346
350
  position: absolute;
347
351
  ${(s) => s.$up ? "bottom: calc(100% + 4px);" : "top: calc(100% + 4px);"}
348
352
  ${(s) => s.$align === "left" ? "left: 0;" : "right: 0;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableListSection.js","sources":["../../../../../src/components/agent-builder/components/SelectableListSection.tsx"],"sourcesContent":["import DeleteIcon from '@src/assets/icons/delete.svg';\nimport EditIcon from '@src/assets/icons/edit.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport { MentionItem } from '@src/editor';\nimport { Shield } from '@src/icons';\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '@src/components/button';\nimport { Dropdown, unwrapDropdownValue } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { DeleteConfirmationModal } from '@src/components/states-modal';\nimport { Tooltip } from '@src/components/tooltips';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAddIconButton,\n\tRowActionDivider,\n\tRowActions,\n\tRowLabel,\n\tRowMenuButton,\n\tRowText,\n\tSelectableRow,\n\tSideSection,\n\tSideSectionHeader,\n\tSourceButton,\n\tSourceButtonRow,\n} from '../AgentBuilder.styled';\nimport { ToolAction } from '../constants/tools';\nimport { renderSourceIcon, sourceIcon, SourceIcon } from '../utils/sourceIcons';\nimport { MentionPicker } from './MentionPicker';\n\nexport interface SelectableItem {\n\tid: string;\n\tlabel: string;\n\t/** Leading brand glyph (e.g. a tool's source icon). */\n\ticon?: SourceIcon;\n\t/**\n\t * True when the tool touches customer-private data and the agent must verify\n\t * the customer first (backend `auth_required`). Shows a shield glyph on the row.\n\t */\n\tauthRequired?: boolean;\n\t/**\n\t * When set, this row shows an edit (Configure) icon that calls this instead of\n\t * the section-level `onConfigure`. Use for rows that open their own drawer\n\t * (e.g. a configured Rest API / email-handover tool). A pending promise\n\t * disables the row's edit button until it settles (e.g. while the consumer\n\t * fetches the sub-agent's data before opening its drawer).\n\t */\n\tonConfigure?: () => void | Promise<void>;\n}\n\n/** A tool source for the empty-state picker (Tools): a button → its searchable list. */\nexport interface SourceGroup {\n\tsource: string;\n\tlabel: string;\n\toptions: SingleOption[];\n\t/**\n\t * Integration connection state for this source. `false` = the store hasn't\n\t * connected it → clicking the source button calls {@link onConnect} instead of\n\t * opening its tool list. `true`/absent → opens normally.\n\t */\n\tconnected?: boolean;\n\t/** Open the connect flow for this source (used when `connected === false`). */\n\tonConnect?: () => void;\n}\n\n/** Sentinel value for the \"create new\" entry in the add dropdown. */\nconst CREATE_OPTION_VALUE = '__bik_create_new__';\n\ninterface SelectableListSectionProps {\n\ttitle: string;\n\thelper?: string;\n\titems: SelectableItem[];\n\t/**\n\t * Options shown in the add dropdown. Pass ALL items (not just unselected\n\t * ones) when re-picking an already-added item is allowed (e.g. to insert its\n\t * mention again) — the chip list still shows each item only once.\n\t */\n\taddableOptions: SingleOption[];\n\tonAdd: (id: string) => void;\n\tonRemove: (id: string) => void;\n\tdataTestPrefix: string;\n\temptyText: string;\n\t/**\n\t * Adds a \"create new\" entry at the top of the add dropdown (e.g. \"Create\n\t * sub-agent\"). Selecting it calls `onSelect` instead of `onAdd`.\n\t */\n\tcreateOption?: { label: string; onSelect: () => void };\n\t/**\n\t * When provided, each row shows an edit (Configure) icon next to Delete.\n\t * Omit for tools (Delete only). A pending promise disables the edit buttons\n\t * until it settles.\n\t */\n\tonConfigure?: (id: string) => void | Promise<void>;\n\t/**\n\t * Tool sources (e.g. Manifest / Shopify). When set, the empty state shows a\n\t * button per source; clicking one reveals a searchable dropdown of just that\n\t * source's options. Selecting calls `onAdd`. Takes precedence over the plain\n\t * `addableOptions` dropdown.\n\t */\n\tsourceGroups?: SourceGroup[];\n\t/**\n\t * When provided, the header \"+\" opens the same `@` reference picker used in the\n\t * Instructions editor (a {@link MentionPicker} popover) instead of the inline\n\t * select dropdown. Pass the items for THIS section only (tools OR sub-agents) —\n\t * the picker auto-drills into the single category. Selecting a row calls\n\t * `onAdd(id)`; the picker's \"Create new\" row (sub-agents) calls\n\t * `createOption.onSelect`.\n\t */\n\tmentionItems?: MentionItem[];\n\t/**\n\t * Built-in \"action\" tools (e.g. Rest API / Handover to email) that open a\n\t * config drawer via `onSelect` instead of adding a mention. Shown as\n\t * empty-state source buttons (only while no items exist, alongside\n\t * `sourceGroups`) AND as rows inside the `@` picker's Tools view.\n\t */\n\tactionSources?: ToolAction[];\n\t/**\n\t * When set, the row Delete icon opens a confirmation modal (instead of\n\t * removing immediately); `onRemove` runs only on confirm. `noun` fills the one\n\t * shared message template (\"Delete this <noun>?\" …); `zIndex` raises the modal\n\t * above a parent drawer. Omit to delete directly.\n\t */\n\tconfirmDelete?: { noun: string; zIndex?: number };\n\t/**\n\t * Open the `@` picker popover above the trigger instead of below. Use inside\n\t * a drawer where the section sits near the bottom — opening downward\n\t * stretches the drawer and leaves a gap.\n\t */\n\tpickerOpensUp?: boolean;\n}\n\nexport const SelectableListSection: React.FC<SelectableListSectionProps> = ({\n\ttitle,\n\thelper,\n\titems,\n\taddableOptions,\n\tonAdd,\n\tonRemove,\n\tdataTestPrefix,\n\temptyText,\n\tcreateOption,\n\tonConfigure,\n\tsourceGroups,\n\tmentionItems,\n\tactionSources,\n\tconfirmDelete,\n\tpickerOpensUp,\n}) => {\n\tconst [adding, setAdding] = useState(false);\n\t// Row id awaiting delete confirmation (null = modal closed).\n\tconst [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\n\t// Row id whose configure handler is in flight (async fetch before its drawer\n\t// opens) — all edit buttons are disabled meanwhile so the UI isn't\n\t// unresponsive to double clicks.\n\tconst [configuringId, setConfiguringId] = useState<string | null>(null);\n\t// Tools: which source's searchable list is open (null = just show the buttons).\n\tconst [activeSource, setActiveSource] = useState<string | null>(null);\n\tconst hasSourceGroups = !!sourceGroups && sourceGroups.length > 0;\n\tconst activeGroup = sourceGroups?.find((g) => g.source === activeSource);\n\t// When set, \"+\" opens the `@` MentionPicker popover instead of a select input.\n\tconst usePicker = mentionItems !== undefined;\n\t// Separate anchors for the header \"+\" popover and the empty-state source-button\n\t// popover — when empty both render at once, so a shared ref would misfire the\n\t// outside-click check (closing the header picker when a source row is clicked).\n\tconst headerPickerRef = useRef<HTMLDivElement>(null);\n\tconst sourcePickerRef = useRef<HTMLDivElement>(null);\n\t// Source (Shopify / Manifest) the empty-state button opened the picker into;\n\t// null when \"+\" opened it at the root source list.\n\tconst [pickerSource, setPickerSource] = useState<string | null>(null);\n\n\t// Dismiss the picker popover on outside click / Escape.\n\tuseEffect(() => {\n\t\tif (!usePicker || !adding) {\n\t\t\treturn;\n\t\t}\n\t\tconst onDocMouseDown = (e: MouseEvent) => {\n\t\t\tconst target = e.target as Node;\n\t\t\tif (\n\t\t\t\t!headerPickerRef.current?.contains(target) &&\n\t\t\t\t!sourcePickerRef.current?.contains(target)\n\t\t\t) {\n\t\t\t\tsetAdding(false);\n\t\t\t}\n\t\t};\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tsetAdding(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', onDocMouseDown);\n\t\tdocument.addEventListener('keydown', onKeyDown);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', onDocMouseDown);\n\t\t\tdocument.removeEventListener('keydown', onKeyDown);\n\t\t};\n\t}, [usePicker, adding]);\n\n\t// Header \"+\" picks an EXISTING item (and, once some exist, re-creates via the\n\t// dropdown's footer row). With an empty list + a createOption the body shows a\n\t// dedicated \"Create new\" button instead, so the header \"+\" would be redundant.\n\t// In picker mode the \"+\" always shows (even empty) — for tools it sits next to\n\t// the empty-state source buttons; the create flow lives inside the picker.\n\tconst showAddButton = hasSourceGroups\n\t\t? usePicker || items.length > 0\n\t\t: usePicker ||\n\t\t addableOptions.length > 0 ||\n\t\t (!!createOption && items.length > 0);\n\t// Empty state offers a one-click \"Create new\" (sub-agents) rather than burying\n\t// it behind a single-item dropdown. In picker mode the \"+\" opens the picker\n\t// (with its own \"Create new\" row) instead, so skip the standalone button.\n\tconst showEmptyCreate =\n\t\titems.length === 0 && !!createOption && !hasSourceGroups && !usePicker;\n\tconst hasActionSources = !!actionSources && actionSources.length > 0;\n\t// Source buttons ONLY while no item is added — the tool sources (Manifest /\n\t// Shopify …) plus the built-in action tools (Rest API / Handover to email).\n\t// Once an item exists, adding more uses the header \"+\" → picker (the buttons\n\t// never come back); the action tools still live inside that picker.\n\tconst showSourceButtons =\n\t\t(hasSourceGroups || hasActionSources) && items.length === 0;\n\t// Nothing existing to pick → skip the 1-item dropdown and create directly.\n\tconst handleAddClick = () => {\n\t\tif (usePicker) {\n\t\t\t// Toggle the `@` reference-picker popover (rendered under the \"+\"), opened\n\t\t\t// at the root source list (no pre-drilled source).\n\t\t\tsetPickerSource(null);\n\t\t\tsetAdding((v) => !v);\n\t\t\treturn;\n\t\t}\n\t\tif (hasSourceGroups) {\n\t\t\tsetActiveSource(null);\n\t\t\tsetAdding((v) => !v);\n\t\t\treturn;\n\t\t}\n\t\tif (addableOptions.length === 0 && createOption) {\n\t\t\tcreateOption.onSelect();\n\t\t\treturn;\n\t\t}\n\t\tsetAdding((v) => !v);\n\t};\n\n\t// Run a row's configure handler; a returned promise disables the edit\n\t// buttons until it settles (same promise-sniff as the drawer Save buttons).\n\tconst handleConfigureClick = (\n\t\tid: string,\n\t\tconfigure: () => void | Promise<void>,\n\t) => {\n\t\tif (configuringId) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = configure();\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetConfiguringId(id);\n\t\t\tvoid (result as Promise<void>).finally(() => setConfiguringId(null));\n\t\t}\n\t};\n\n\tconst renderChipRows = () =>\n\t\titems.map((item) => {\n\t\t\t// Per-item configure wins; otherwise fall back to the section-level one.\n\t\t\tconst configure =\n\t\t\t\titem.onConfigure ??\n\t\t\t\t(onConfigure ? () => onConfigure(item.id) : undefined);\n\t\t\treturn (\n\t\t\t\t<SelectableRow\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\tdata-test={`${dataTestPrefix}-row-${item.id}`}\n\t\t\t\t>\n\t\t\t\t\t{renderSourceIcon(item.icon)}\n\t\t\t\t\t{/* Label + verification shield on one row: label truncates, the shield\n\t\t\t\t\t sits just after the text. */}\n\t\t\t\t\t<RowLabel>\n\t\t\t\t\t\t{/* Row label truncates to one line; tooltip surfaces the full name. */}\n\t\t\t\t\t\t<Tooltip body={item.label} placement=\"top\">\n\t\t\t\t\t\t\t<RowText>\n\t\t\t\t\t\t\t\t<BodySecondary numberOfLines={1} color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t</RowText>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t{item.authRequired && (\n\t\t\t\t\t\t\t// Order tools touch customer-private data — the shield flags that\n\t\t\t\t\t\t\t// this agent must verify the customer before the tool can run.\n\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\tbody=\"This tool requires customer verification\"\n\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-auth-${item.id}`}\n\t\t\t\t\t\t\t\t\tstyle={{ display: 'inline-flex', flexShrink: 0 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Shield size={16} />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</RowLabel>\n\t\t\t\t\t<RowActions>\n\t\t\t\t\t\t{configure && (\n\t\t\t\t\t\t\t// Configurable rows (sub-agents, Rest API / email tools) get an\n\t\t\t\t\t\t\t// always-visible edit icon.\n\t\t\t\t\t\t\t<Tooltip body=\"Edit\" placement=\"top\">\n\t\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-edit-${item.id}`}\n\t\t\t\t\t\t\t\t\taria-label={`Edit ${item.label}`}\n\t\t\t\t\t\t\t\t\tdisabled={configuringId !== null}\n\t\t\t\t\t\t\t\t\tonClick={() => handleConfigureClick(item.id, configure)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EditIcon\n\t\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{configure && <RowActionDivider aria-hidden />}\n\t\t\t\t\t\t<Tooltip body=\"Delete\" placement=\"top\">\n\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-delete-${item.id}`}\n\t\t\t\t\t\t\t\taria-label={`Delete ${item.label}`}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tconfirmDelete\n\t\t\t\t\t\t\t\t\t\t? setPendingDeleteId(item.id)\n\t\t\t\t\t\t\t\t\t\t: onRemove(item.id)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DeleteIcon\n\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</RowActions>\n\t\t\t\t</SelectableRow>\n\t\t\t);\n\t\t});\n\t// \"Create new\" is a brand-coloured footer row at the BOTTOM of the dropdown,\n\t// separated from the selectable items by a divider.\n\tconst dropdownOptions: SingleOption[] = createOption\n\t\t? [\n\t\t\t\t...addableOptions,\n\t\t\t\t{\n\t\t\t\t\tlabel: createOption.label,\n\t\t\t\t\tvalue: CREATE_OPTION_VALUE,\n\t\t\t\t\tsearchKey: createOption.label,\n\t\t\t\t\tcustomComponent: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\t\tcolor: COLORS.content.brand,\n\t\t\t\t\t\t\t\tfontFamily: 'Inter',\n\t\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{createOption.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t ]\n\t\t: addableOptions;\n\n\t// One picker instance reused by the header \"+\" and the empty-state source\n\t// buttons. `key` remounts it so a source button re-drills into its own tools\n\t// (the initial drill-in level is read once, on mount).\n\tconst pickerNode = usePicker ? (\n\t\t<MentionPicker\n\t\t\tkey={pickerSource ?? '__root__'}\n\t\t\titems={mentionItems ?? []}\n\t\t\tquery=\"\"\n\t\t\tactiveIndex={0}\n\t\t\tinitialSource={pickerSource ?? undefined}\n\t\t\tonSelect={(item) => {\n\t\t\t\tsetAdding(false);\n\t\t\t\tonAdd(String(item.id));\n\t\t\t}}\n\t\t\tonClose={() => setAdding(false)}\n\t\t\tonCreateSubAgent={\n\t\t\t\tcreateOption\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\tcreateOption.onSelect();\n\t\t\t\t\t }\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\ttoolActions={\n\t\t\t\thasActionSources\n\t\t\t\t\t? actionSources?.map((a) => ({\n\t\t\t\t\t\t\t...a,\n\t\t\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\ta.onSelect();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t }))\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\t// Gate native source rows in the picker on their connected state, derived\n\t\t\t// from the source groups (which already carry connected/onConnect). This is\n\t\t\t// what makes the \"+\" dropdown show \"Connect\" for unconnected vendors,\n\t\t\t// consistent with the empty-state buttons.\n\t\t\tintegrationStatus={Object.fromEntries(\n\t\t\t\t(sourceGroups ?? [])\n\t\t\t\t\t.filter((g) => g.connected !== undefined)\n\t\t\t\t\t.map((g) => [g.source, g.connected]),\n\t\t\t)}\n\t\t\tonConnectIntegration={(source) => {\n\t\t\t\tsetAdding(false);\n\t\t\t\tsourceGroups?.find((g) => g.source === source)?.onConnect?.();\n\t\t\t}}\n\t\t/>\n\t) : null;\n\n\treturn (\n\t\t<SideSection>\n\t\t\t<SideSectionHeader>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{title}</TitleSmall>\n\t\t\t\t{showAddButton && (\n\t\t\t\t\t<AddButtonWrap ref={headerPickerRef}>\n\t\t\t\t\t\t<AddIconButton\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-add`}\n\t\t\t\t\t\t\tonClick={handleAddClick}\n\t\t\t\t\t\t\taria-label={`Add ${title}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlusIcon width={16} height={16} color={COLORS.content.primary} />\n\t\t\t\t\t\t</AddIconButton>\n\t\t\t\t\t\t{usePicker && adding && pickerSource === null && (\n\t\t\t\t\t\t\t<PickerPopover\n\t\t\t\t\t\t\t\t$up={pickerOpensUp}\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-picker`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{pickerNode}\n\t\t\t\t\t\t\t</PickerPopover>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AddButtonWrap>\n\t\t\t\t)}\n\t\t\t</SideSectionHeader>\n\n\t\t\t{helper && (\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>{helper}</BodyCaption>\n\t\t\t)}\n\n\t\t\t{showSourceButtons ? (\n\t\t\t\t<SourcePickerAnchor ref={usePicker ? sourcePickerRef : undefined}>\n\t\t\t\t\t{/* No tools yet: one button per source (never shown once a tool exists). */}\n\t\t\t\t\t<SourceButtonRow data-test={`${dataTestPrefix}-sources`}>\n\t\t\t\t\t\t{sourceGroups?.map((g) => {\n\t\t\t\t\t\t\t// A connected source with exactly one tool is pointless to drill\n\t\t\t\t\t\t\t// into — surface that single tool right here (its name + the source\n\t\t\t\t\t\t\t// icon) and add it on click, mirroring the `@` picker's single-leaf\n\t\t\t\t\t\t\t// collapse. Connect still wins when the source isn't connected.\n\t\t\t\t\t\t\tconst soleTool =\n\t\t\t\t\t\t\t\tg.connected !== false && g.options.length === 1\n\t\t\t\t\t\t\t\t\t? g.options[0]\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SourceButton\n\t\t\t\t\t\t\t\t\tkey={g.source}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-source-${g.source}`}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t// Not connected → open the connect flow instead of the tools.\n\t\t\t\t\t\t\t\t\t\tif (g.connected === false) {\n\t\t\t\t\t\t\t\t\t\t\tg.onConnect?.();\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (soleTool) {\n\t\t\t\t\t\t\t\t\t\t\t// Single tool → add it directly (no drill-in).\n\t\t\t\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\t\t\t\tonAdd(soleTool.value);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (usePicker) {\n\t\t\t\t\t\t\t\t\t\t\t// Open the `@` picker drilled straight into this source's tools.\n\t\t\t\t\t\t\t\t\t\t\tsetPickerSource(g.source);\n\t\t\t\t\t\t\t\t\t\t\tsetAdding(true);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tsetActiveSource(g.source);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{renderSourceIcon(sourceIcon(g.source), -4)}\n\t\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t\t{soleTool ? soleTool.label : g.label}\n\t\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t\t\t{g.connected === false && (\n\t\t\t\t\t\t\t\t\t\t// Not connected → show \"Connect\" upfront (consistent with\n\t\t\t\t\t\t\t\t\t\t// the `@` picker); clicking runs the connect flow.\n\t\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.brand}>\n\t\t\t\t\t\t\t\t\t\t\tConnect\n\t\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</SourceButton>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{actionSources?.map((a) => (\n\t\t\t\t\t\t\t<SourceButton\n\t\t\t\t\t\t\t\tkey={a.source}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-action-${a.source}`}\n\t\t\t\t\t\t\t\t// Not connected → connect flow; otherwise close any open source\n\t\t\t\t\t\t\t\t// picker before opening this drawer, else the previous source's\n\t\t\t\t\t\t\t\t// popup lingers behind it.\n\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\ta.connected === false\n\t\t\t\t\t\t\t\t\t\t? () => a.onConnect?.()\n\t\t\t\t\t\t\t\t\t\t: () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\t\t\t\t\ta.onSelect();\n\t\t\t\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderSourceIcon(a.icon, -4)}\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{a.label}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t\t{a.connected === false && (\n\t\t\t\t\t\t\t\t\t// Not connected → \"Connect\" upfront (consistent with the\n\t\t\t\t\t\t\t\t\t// source buttons and the `@` picker).\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.brand}>\n\t\t\t\t\t\t\t\t\t\tConnect\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</SourceButton>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SourceButtonRow>\n\n\t\t\t\t\t{/* Picker mode: clicking a source opens its tools in the `@` picker. */}\n\t\t\t\t\t{usePicker && adding && pickerSource !== null && (\n\t\t\t\t\t\t<PickerPopover\n\t\t\t\t\t\t\t$align=\"left\"\n\t\t\t\t\t\t\t$up={pickerOpensUp}\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-picker`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{pickerNode}\n\t\t\t\t\t\t</PickerPopover>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Legacy (non-picker) mode: chosen source → its searchable tool list. */}\n\t\t\t\t\t{!usePicker && activeGroup && (\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\tplaceHolder={`Search ${activeGroup.label} tools`}\n\t\t\t\t\t\t\toptions={activeGroup.options}\n\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\tconst v = unwrapDropdownValue(opt);\n\t\t\t\t\t\t\t\tsetActiveSource(null);\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</SourcePickerAnchor>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{!usePicker && adding && dropdownOptions.length > 0 && (\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\tplaceHolder={`Select ${title.toLowerCase()}`}\n\t\t\t\t\t\t\toptions={dropdownOptions}\n\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\tconst v = unwrapDropdownValue(opt);\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\tif (!v) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v === CREATE_OPTION_VALUE) {\n\t\t\t\t\t\t\t\t\tcreateOption?.onSelect();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{items.length === 0 && !adding ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.placeholder}>\n\t\t\t\t\t\t\t\t{emptyText}\n\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t{showEmptyCreate && createOption && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-create`}\n\t\t\t\t\t\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tmatchParentWidth\n\t\t\t\t\t\t\t\t\tLeadingIcon={PlusIcon}\n\t\t\t\t\t\t\t\t\tbuttonText={createOption.label}\n\t\t\t\t\t\t\t\t\tonClick={createOption.onSelect}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\trenderChipRows()\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{confirmDelete && pendingDeleteId && (\n\t\t\t\t<DeleteConfirmationModal\n\t\t\t\t\tdata-test={`${dataTestPrefix}-delete-confirm`}\n\t\t\t\t\theader={`Delete this ${confirmDelete.noun}?`}\n\t\t\t\t\tsubHeader={`Deleting this ${confirmDelete.noun} will also remove it from your instructions, wherever it's referenced.`}\n\t\t\t\t\tconfirmationText=\"Delete\"\n\t\t\t\t\tzIndex={confirmDelete.zIndex}\n\t\t\t\t\tonDeleteConfirmed={() => {\n\t\t\t\t\t\tonRemove(pendingDeleteId);\n\t\t\t\t\t\tsetPendingDeleteId(null);\n\t\t\t\t\t}}\n\t\t\t\t\tonCancelClicked={() => setPendingDeleteId(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</SideSection>\n\t);\n};\n\n// Anchors the `@`-picker popover to the header \"+\" button.\nconst AddButtonWrap = styled.div`\n\tposition: relative;\n\tdisplay: flex;\n`;\n\n// Anchors the `@`-picker popover to the empty-state source buttons.\nconst SourcePickerAnchor = styled.div`\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n`;\n\n// Floating card under the trigger. Aligns to the \"+\" (right) or the source\n// buttons (left) so it stays inside the side panel.\nconst PickerPopover = styled.div<{ $align?: 'left' | 'right'; $up?: boolean }>`\n\tposition: absolute;\n\t${(p) => (p.$up ? 'bottom: calc(100% + 4px);' : 'top: calc(100% + 4px);')}\n\t${(p) => (p.$align === 'left' ? 'left: 0;' : 'right: 0;')}\n\tz-index: 30;\n`;\n"],"names":["CREATE_OPTION_VALUE","SelectableListSection","title","helper","items","addableOptions","onAdd","onRemove","dataTestPrefix","emptyText","createOption","onConfigure","sourceGroups","mentionItems","actionSources","confirmDelete","pickerOpensUp","adding","setAdding","useState","pendingDeleteId","setPendingDeleteId","configuringId","setConfiguringId","activeSource","setActiveSource","hasSourceGroups","activeGroup","g","usePicker","headerPickerRef","useRef","sourcePickerRef","pickerSource","setPickerSource","useEffect","onDocMouseDown","e","target","onKeyDown","showAddButton","showEmptyCreate","hasActionSources","showSourceButtons","handleAddClick","v","handleConfigureClick","id","configure","result","renderChipRows","item","jsxs","SelectableRow","renderSourceIcon","RowLabel","jsx","Tooltip","RowText","BodySecondary","COLORS","Shield","RowActions","RowMenuButton","EditIcon","RowActionDivider","DeleteIcon","dropdownOptions","pickerNode","MentionPicker","a","source","SideSection","SideSectionHeader","TitleSmall","AddButtonWrap","AddIconButton","PlusIcon","PickerPopover","BodyCaption","SourcePickerAnchor","SourceButtonRow","soleTool","SourceButton","sourceIcon","Dropdown","opt","unwrapDropdownValue","Fragment","Button","DeleteConfirmationModal","styled","p"],"mappings":";;;;;;;;;;;;;;;;;AAuEA,MAAMA,IAAsB,sBAiEfC,KAA8D,CAAC;AAAA,EAC3E,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AACD,MAAM;AACL,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GAEpC,CAACC,GAAiBC,CAAkB,IAAIF,EAAwB,IAAI,GAIpE,CAACG,GAAeC,CAAgB,IAAIJ,EAAwB,IAAI,GAEhE,CAACK,IAAcC,CAAe,IAAIN,EAAwB,IAAI,GAC9DO,IAAkB,CAAC,CAACd,KAAgBA,EAAa,SAAS,GAC1De,IAAcf,GAAc,KAAK,CAACgB,MAAMA,EAAE,WAAWJ,EAAY,GAEjEK,IAAYhB,MAAiB,QAI7BiB,IAAkBC,EAAuB,IAAI,GAC7CC,IAAkBD,EAAuB,IAAI,GAG7C,CAACE,GAAcC,CAAe,IAAIf,EAAwB,IAAI;AAGpE,EAAAgB,GAAU,MAAM;AACf,QAAI,CAACN,KAAa,CAACZ;AAClB;AAED,UAAMmB,IAAiB,CAACC,MAAkB;AACzC,YAAMC,IAASD,EAAE;AACjB,MACC,CAACP,EAAgB,SAAS,SAASQ,CAAM,KACzC,CAACN,EAAgB,SAAS,SAASM,CAAM,KAEzCpB,EAAU,EAAK;AAAA,IAEjB,GACMqB,IAAY,CAACF,MAAqB;AACvC,MAAIA,EAAE,QAAQ,YACbnB,EAAU,EAAK;AAAA,IAEjB;AACA,oBAAS,iBAAiB,aAAakB,CAAc,GACrD,SAAS,iBAAiB,WAAWG,CAAS,GACvC,MAAM;AACZ,eAAS,oBAAoB,aAAaH,CAAc,GACxD,SAAS,oBAAoB,WAAWG,CAAS;AAAA,IAClD;AAAA,EACD,GAAG,CAACV,GAAWZ,CAAM,CAAC;AAOtB,QAAMuB,KAAgBd,IACnBG,KAAazB,EAAM,SAAS,IAC5ByB,KACAxB,EAAe,SAAS,KACvB,CAAC,CAACK,KAAgBN,EAAM,SAAS,GAI/BqC,KACLrC,EAAM,WAAW,KAAK,CAAC,CAACM,KAAgB,CAACgB,KAAmB,CAACG,GACxDa,IAAmB,CAAC,CAAC5B,KAAiBA,EAAc,SAAS,GAK7D6B,MACJjB,KAAmBgB,MAAqBtC,EAAM,WAAW,GAErDwC,KAAiB,MAAM;AAC5B,QAAIf,GAAW;AAGd,MAAAK,EAAgB,IAAI,GACpBhB,EAAU,CAAC2B,MAAM,CAACA,CAAC;AACnB;AAAA,IACD;AACA,QAAInB,GAAiB;AACpB,MAAAD,EAAgB,IAAI,GACpBP,EAAU,CAAC2B,MAAM,CAACA,CAAC;AACnB;AAAA,IACD;AACA,QAAIxC,EAAe,WAAW,KAAKK,GAAc;AAChD,MAAAA,EAAa,SAAA;AACb;AAAA,IACD;AACA,IAAAQ,EAAU,CAAC2B,MAAM,CAACA,CAAC;AAAA,EACpB,GAIMC,KAAuB,CAC5BC,GACAC,MACI;AACJ,QAAI1B;AACH;AAED,UAAM2B,IAASD,EAAA;AACf,IAAIC,KAAU,OAAQA,EAAyB,QAAS,eACvD1B,EAAiBwB,CAAE,GACbE,EAAyB,QAAQ,MAAM1B,EAAiB,IAAI,CAAC;AAAA,EAErE,GAEM2B,KAAiB,MACtB9C,EAAM,IAAI,CAAC+C,MAAS;AAEnB,UAAMH,IACLG,EAAK,gBACJxC,IAAc,MAAMA,EAAYwC,EAAK,EAAE,IAAI;AAC7C,WACC,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QAEA,aAAW,GAAG7C,CAAc,QAAQ2C,EAAK,EAAE;AAAA,QAE1C,UAAA;AAAA,UAAAG,EAAiBH,EAAK,IAAI;AAAA,4BAG1BI,IAAA,EAEA,UAAA;AAAA,YAAA,gBAAAC,EAACC,KAAQ,MAAMN,EAAK,OAAO,WAAU,OACpC,4BAACO,IAAA,EACA,UAAA,gBAAAF,EAACG,KAAc,eAAe,GAAG,OAAOC,EAAO,QAAQ,SACrD,UAAAT,EAAK,OACP,GACD,EAAA,CACD;AAAA,YACCA,EAAK;AAAA;AAAA,YAGL,gBAAAK;AAAA,cAACC;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,WAAU;AAAA,gBAEV,UAAA,gBAAAD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACA,aAAW,GAAGhD,CAAc,SAAS2C,EAAK,EAAE;AAAA,oBAC5C,OAAO,EAAE,SAAS,eAAe,YAAY,EAAA;AAAA,oBAE7C,UAAA,gBAAAK,EAACK,IAAA,EAAO,MAAM,GAAA,CAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACnB;AAAA,YAAA;AAAA,UACD,GAEF;AAAA,4BACCC,IAAA,EACC,UAAA;AAAA,YAAAd;AAAA;AAAA,YAGA,gBAAAQ,EAACC,GAAA,EAAQ,MAAK,QAAO,WAAU,OAC9B,UAAA,gBAAAD;AAAA,cAACO;AAAA,cAAA;AAAA,gBACA,aAAW,GAAGvD,CAAc,SAAS2C,EAAK,EAAE;AAAA,gBAC5C,cAAY,QAAQA,EAAK,KAAK;AAAA,gBAC9B,UAAU7B,MAAkB;AAAA,gBAC5B,SAAS,MAAMwB,GAAqBK,EAAK,IAAIH,CAAS;AAAA,gBAEtD,UAAA,gBAAAQ;AAAA,kBAACQ;AAAAA,kBAAA;AAAA,oBACA,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAOJ,EAAO,QAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACvB;AAAA,YAAA,GAEF;AAAA,YAEAZ,KAAa,gBAAAQ,EAACS,IAAA,EAAiB,eAAW,GAAA,CAAC;AAAA,YAC5C,gBAAAT,EAACC,GAAA,EAAQ,MAAK,UAAS,WAAU,OAChC,UAAA,gBAAAD;AAAA,cAACO;AAAA,cAAA;AAAA,gBACA,aAAW,GAAGvD,CAAc,WAAW2C,EAAK,EAAE;AAAA,gBAC9C,cAAY,UAAUA,EAAK,KAAK;AAAA,gBAChC,SAAS,MACRpC,IACGM,EAAmB8B,EAAK,EAAE,IAC1B5C,EAAS4C,EAAK,EAAE;AAAA,gBAGpB,UAAA,gBAAAK;AAAA,kBAACU;AAAAA,kBAAA;AAAA,oBACA,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAON,EAAO,QAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACvB;AAAA,YAAA,EACD,CACD;AAAA,UAAA,EAAA,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,MApEKT,EAAK;AAAA,IAAA;AAAA,EAuEb,CAAC,GAGIgB,IAAkCzD,IACrC;AAAA,IACA,GAAGL;AAAA,IACH;AAAA,MACC,OAAOK,EAAa;AAAA,MACpB,OAAOV;AAAA,MACP,WAAWU,EAAa;AAAA,MACxB,iBACC,gBAAA8C;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,OAAO;AAAA,YACN,OAAO;AAAA,YACP,WAAW;AAAA,YACX,OAAOI,EAAO,QAAQ;AAAA,YACtB,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,YAAY;AAAA,UAAA;AAAA,UAGZ,UAAAlD,EAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IACf;AAAA,EAEF,IAEAL,GAKG+D,IAAavC,IAClB,gBAAA2B;AAAA,IAACa;AAAA,IAAA;AAAA,MAEA,OAAOxD,KAAgB,CAAA;AAAA,MACvB,OAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAeoB,KAAgB;AAAA,MAC/B,UAAU,CAACkB,MAAS;AACnB,QAAAjC,EAAU,EAAK,GACfZ,EAAM,OAAO6C,EAAK,EAAE,CAAC;AAAA,MACtB;AAAA,MACA,SAAS,MAAMjC,EAAU,EAAK;AAAA,MAC9B,kBACCR,IACG,MAAM;AACN,QAAAQ,EAAU,EAAK,GACfR,EAAa,SAAA;AAAA,MACb,IACA;AAAA,MAEJ,aACCgC,IACG5B,GAAe,IAAI,CAACwD,OAAO;AAAA,QAC3B,GAAGA;AAAA,QACH,UAAU,MAAM;AACf,UAAApD,EAAU,EAAK,GACfoD,EAAE,SAAA;AAAA,QACH;AAAA,MAAA,EACE,IACF;AAAA,MAMJ,mBAAmB,OAAO;AAAA,SACxB1D,KAAgB,CAAA,GACf,OAAO,CAACgB,MAAMA,EAAE,cAAc,MAAS,EACvC,IAAI,CAACA,MAAM,CAACA,EAAE,QAAQA,EAAE,SAAS,CAAC;AAAA,MAAA;AAAA,MAErC,sBAAsB,CAAC2C,MAAW;AACjC,QAAArD,EAAU,EAAK,GACfN,GAAc,KAAK,CAACgB,MAAMA,EAAE,WAAW2C,CAAM,GAAG,YAAA;AAAA,MACjD;AAAA,IAAA;AAAA,IAzCKtC,KAAgB;AAAA,EAAA,IA2CnB;AAEJ,2BACEuC,IAAA,EACA,UAAA;AAAA,IAAA,gBAAApB,EAACqB,IAAA,EACA,UAAA;AAAA,MAAA,gBAAAjB,EAACkB,IAAA,EAAW,OAAOd,EAAO,QAAQ,SAAU,UAAA1D,GAAM;AAAA,MACjDsC,MACA,gBAAAY,EAACuB,IAAA,EAAc,KAAK7C,GACnB,UAAA;AAAA,QAAA,gBAAA0B;AAAA,UAACoB;AAAA,UAAA;AAAA,YACA,aAAW,GAAGpE,CAAc;AAAA,YAC5B,SAASoC;AAAA,YACT,cAAY,OAAO1C,CAAK;AAAA,YAExB,UAAA,gBAAAsD,EAACqB,KAAS,OAAO,IAAI,QAAQ,IAAI,OAAOjB,EAAO,QAAQ,QAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAEhE/B,KAAaZ,KAAUgB,MAAiB,QACxC,gBAAAuB;AAAA,UAACsB;AAAA,UAAA;AAAA,YACA,KAAK9D;AAAA,YACL,aAAW,GAAGR,CAAc;AAAA,YAE3B,UAAA4D;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CAEF;AAAA,IAAA,GAEF;AAAA,IAECjE,KACA,gBAAAqD,EAACuB,GAAA,EAAY,OAAOnB,EAAO,QAAQ,WAAY,UAAAzD,GAAO;AAAA,IAGtDwC,KACA,gBAAAS,EAAC4B,IAAA,EAAmB,KAAKnD,IAAYG,IAAkB,QAEtD,UAAA;AAAA,MAAA,gBAAAoB,EAAC6B,IAAA,EAAgB,aAAW,GAAGzE,CAAc,YAC3C,UAAA;AAAA,QAAAI,GAAc,IAAI,CAACgB,MAAM;AAKzB,gBAAMsD,IACLtD,EAAE,cAAc,MAASA,EAAE,QAAQ,WAAW,IAC3CA,EAAE,QAAQ,CAAC,IACX;AACJ,iBACC,gBAAAwB;AAAA,YAAC+B;AAAA,YAAA;AAAA,cAEA,MAAK;AAAA,cACL,aAAW,GAAG3E,CAAc,WAAWoB,EAAE,MAAM;AAAA,cAC/C,SAAS,MAAM;AAEd,oBAAIA,EAAE,cAAc,IAAO;AAC1B,kBAAAA,EAAE,YAAA;AACF;AAAA,gBACD;AACA,oBAAIsD,GAAU;AAEb,kBAAAhE,EAAU,EAAK,GACfZ,EAAM4E,EAAS,KAAK;AACpB;AAAA,gBACD;AACA,oBAAIrD,GAAW;AAEd,kBAAAK,EAAgBN,EAAE,MAAM,GACxBV,EAAU,EAAI;AACd;AAAA,gBACD;AACA,gBAAAO,EAAgBG,EAAE,MAAM;AAAA,cACzB;AAAA,cAEC,UAAA;AAAA,gBAAA0B,EAAiB8B,GAAWxD,EAAE,MAAM,GAAG,EAAE;AAAA,gBAC1C,gBAAA4B,EAACuB,GAAA,EAAY,OAAOnB,EAAO,QAAQ,SACjC,UAAAsB,IAAWA,EAAS,QAAQtD,EAAE,MAAA,CAChC;AAAA,gBACCA,EAAE,cAAc;AAAA;AAAA,kCAGf+B,GAAA,EAAc,OAAOC,EAAO,QAAQ,OAAO,UAAA,UAAA,CAE5C;AAAA,cAAA;AAAA,YAAA;AAAA,YAjCIhC,EAAE;AAAA,UAAA;AAAA,QAqCV,CAAC;AAAA,QACAd,GAAe,IAAI,CAACwD,MACpB,gBAAAlB;AAAA,UAAC+B;AAAA,UAAA;AAAA,YAEA,MAAK;AAAA,YACL,aAAW,GAAG3E,CAAc,WAAW8D,EAAE,MAAM;AAAA,YAI/C,SACCA,EAAE,cAAc,KACb,MAAMA,EAAE,YAAA,IACR,MAAM;AACN,cAAApD,EAAU,EAAK,GACfoD,EAAE,SAAA;AAAA,YACF;AAAA,YAGH,UAAA;AAAA,cAAAhB,EAAiBgB,EAAE,MAAM,EAAE;AAAA,gCAC3BS,GAAA,EAAY,OAAOnB,EAAO,QAAQ,SACjC,YAAE,OACJ;AAAA,cACCU,EAAE,cAAc;AAAA;AAAA,gCAGfX,GAAA,EAAc,OAAOC,EAAO,QAAQ,OAAO,UAAA,UAAA,CAE5C;AAAA,YAAA;AAAA,UAAA;AAAA,UAxBIU,EAAE;AAAA,QAAA,CA2BR;AAAA,MAAA,GACF;AAAA,MAGCzC,KAAaZ,KAAUgB,MAAiB,QACxC,gBAAAuB;AAAA,QAACsB;AAAA,QAAA;AAAA,UACA,QAAO;AAAA,UACP,KAAK9D;AAAA,UACL,aAAW,GAAGR,CAAc;AAAA,UAE3B,UAAA4D;AAAA,QAAA;AAAA,MAAA;AAAA,MAKF,CAACvC,KAAaF,KACd,gBAAA6B;AAAA,QAAC6B;AAAA,QAAA;AAAA,UACA,aAAW,GAAG7E,CAAc;AAAA,UAC5B,MAAK;AAAA,UACL,OAAM;AAAA,UACN,cAAY;AAAA,UACZ,aAAa,UAAUmB,EAAY,KAAK;AAAA,UACxC,SAASA,EAAY;AAAA,UACrB,UAAU,CAAC2D,MAAQ;AAClB,kBAAMzC,IAAI0C,EAAoBD,CAAG;AACjC,YAAA7D,EAAgB,IAAI,GACpBP,EAAU,EAAK,GACX2B,KACHvC,EAAMuC,CAAC;AAAA,UAET;AAAA,QAAA;AAAA,MAAA;AAAA,IACD,EAAA,CAEF,IAEA,gBAAAO,EAAAoC,GAAA,EACE,UAAA;AAAA,MAAA,CAAC3D,KAAaZ,KAAUkD,EAAgB,SAAS,KACjD,gBAAAX;AAAA,QAAC6B;AAAA,QAAA;AAAA,UACA,aAAW,GAAG7E,CAAc;AAAA,UAC5B,MAAK;AAAA,UACL,OAAM;AAAA,UACN,cAAY;AAAA,UACZ,aAAa,UAAUN,EAAM,YAAA,CAAa;AAAA,UAC1C,SAASiE;AAAA,UACT,UAAU,CAACmB,MAAQ;AAClB,kBAAMzC,IAAI0C,EAAoBD,CAAG;AAEjC,YADApE,EAAU,EAAK,GACV2B,MAGDA,MAAM7C,IACTU,GAAc,SAAA,IAEdJ,EAAMuC,CAAC;AAAA,UAET;AAAA,QAAA;AAAA,MAAA;AAAA,MAIDzC,EAAM,WAAW,KAAK,CAACa,IACvB,gBAAAmC,EAAAoC,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAhC,EAACuB,GAAA,EAAY,OAAOnB,EAAO,QAAQ,aACjC,UAAAnD,GACF;AAAA,QACCgC,MAAmB/B,KACnB,gBAAA8C;AAAA,UAACiC;AAAA,UAAA;AAAA,YACA,aAAW,GAAGjF,CAAc;AAAA,YAC5B,YAAW;AAAA,YACX,MAAK;AAAA,YACL,kBAAgB;AAAA,YAChB,aAAaqE;AAAAA,YACb,YAAYnE,EAAa;AAAA,YACzB,SAASA,EAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MACvB,EAAA,CAEF,IAEAwC,GAAA;AAAA,IAAe,GAEjB;AAAA,IAEAnC,KAAiBK,KACjB,gBAAAoC;AAAA,MAACkC;AAAA,MAAA;AAAA,QACA,aAAW,GAAGlF,CAAc;AAAA,QAC5B,QAAQ,eAAeO,EAAc,IAAI;AAAA,QACzC,WAAW,iBAAiBA,EAAc,IAAI;AAAA,QAC9C,kBAAiB;AAAA,QACjB,QAAQA,EAAc;AAAA,QACtB,mBAAmB,MAAM;AACxB,UAAAR,EAASa,CAAe,GACxBC,EAAmB,IAAI;AAAA,QACxB;AAAA,QACA,iBAAiB,MAAMA,EAAmB,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,EAC/C,GAEF;AAEF,GAGMsD,KAAgBgB,EAAO;AAAA;AAAA;AAAA,GAMvBX,KAAqBW,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,GAS5Bb,IAAgBa,EAAO;AAAA;AAAA,GAE1B,CAACC,MAAOA,EAAE,MAAM,8BAA8B,wBAAyB;AAAA,GACvE,CAACA,MAAOA,EAAE,WAAW,SAAS,aAAa,WAAY;AAAA;AAAA;"}
1
+ {"version":3,"file":"SelectableListSection.js","sources":["../../../../../src/components/agent-builder/components/SelectableListSection.tsx"],"sourcesContent":["import DeleteIcon from '@src/assets/icons/delete.svg';\nimport EditIcon from '@src/assets/icons/edit.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport { MentionItem } from '@src/editor';\nimport { Shield } from '@src/icons';\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '@src/components/button';\nimport { Dropdown, unwrapDropdownValue } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { DeleteConfirmationModal } from '@src/components/states-modal';\nimport { Tooltip } from '@src/components/tooltips';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAddIconButton,\n\tRowActionDivider,\n\tRowActions,\n\tRowLabel,\n\tRowMenuButton,\n\tRowText,\n\tSelectableRow,\n\tSideSection,\n\tSideSectionHeader,\n\tSourceButton,\n\tSourceButtonRow,\n} from '../AgentBuilder.styled';\nimport { ToolAction } from '../constants/tools';\nimport { renderSourceIcon, sourceIcon, SourceIcon } from '../utils/sourceIcons';\nimport { MentionPicker } from './MentionPicker';\n\nexport interface SelectableItem {\n\tid: string;\n\tlabel: string;\n\t/** Leading brand glyph (e.g. a tool's source icon). */\n\ticon?: SourceIcon;\n\t/**\n\t * True when the tool touches customer-private data and the agent must verify\n\t * the customer first (backend `auth_required`). Shows a shield glyph on the row.\n\t */\n\tauthRequired?: boolean;\n\t/**\n\t * When set, this row shows an edit (Configure) icon that calls this instead of\n\t * the section-level `onConfigure`. Use for rows that open their own drawer\n\t * (e.g. a configured Rest API / email-handover tool). A pending promise\n\t * disables the row's edit button until it settles (e.g. while the consumer\n\t * fetches the sub-agent's data before opening its drawer).\n\t */\n\tonConfigure?: () => void | Promise<void>;\n}\n\n/** A tool source for the empty-state picker (Tools): a button → its searchable list. */\nexport interface SourceGroup {\n\tsource: string;\n\tlabel: string;\n\toptions: SingleOption[];\n\t/**\n\t * Integration connection state for this source. `false` = the store hasn't\n\t * connected it → clicking the source button calls {@link onConnect} instead of\n\t * opening its tool list. `true`/absent → opens normally.\n\t */\n\tconnected?: boolean;\n\t/** Open the connect flow for this source (used when `connected === false`). */\n\tonConnect?: () => void;\n}\n\n/** Sentinel value for the \"create new\" entry in the add dropdown. */\nconst CREATE_OPTION_VALUE = '__bik_create_new__';\n\ninterface SelectableListSectionProps {\n\ttitle: string;\n\thelper?: string;\n\titems: SelectableItem[];\n\t/**\n\t * Options shown in the add dropdown. Pass ALL items (not just unselected\n\t * ones) when re-picking an already-added item is allowed (e.g. to insert its\n\t * mention again) — the chip list still shows each item only once.\n\t */\n\taddableOptions: SingleOption[];\n\tonAdd: (id: string) => void;\n\tonRemove: (id: string) => void;\n\tdataTestPrefix: string;\n\temptyText: string;\n\t/**\n\t * Adds a \"create new\" entry at the top of the add dropdown (e.g. \"Create\n\t * sub-agent\"). Selecting it calls `onSelect` instead of `onAdd`.\n\t */\n\tcreateOption?: { label: string; onSelect: () => void };\n\t/**\n\t * When provided, each row shows an edit (Configure) icon next to Delete.\n\t * Omit for tools (Delete only). A pending promise disables the edit buttons\n\t * until it settles.\n\t */\n\tonConfigure?: (id: string) => void | Promise<void>;\n\t/**\n\t * Tool sources (e.g. Manifest / Shopify). When set, the empty state shows a\n\t * button per source; clicking one reveals a searchable dropdown of just that\n\t * source's options. Selecting calls `onAdd`. Takes precedence over the plain\n\t * `addableOptions` dropdown.\n\t */\n\tsourceGroups?: SourceGroup[];\n\t/**\n\t * When provided, the header \"+\" opens the same `@` reference picker used in the\n\t * Instructions editor (a {@link MentionPicker} popover) instead of the inline\n\t * select dropdown. Pass the items for THIS section only (tools OR sub-agents) —\n\t * the picker auto-drills into the single category. Selecting a row calls\n\t * `onAdd(id)`; the picker's \"Create new\" row (sub-agents) calls\n\t * `createOption.onSelect`.\n\t */\n\tmentionItems?: MentionItem[];\n\t/**\n\t * Built-in \"action\" tools (e.g. Rest API / Handover to email) that open a\n\t * config drawer via `onSelect` instead of adding a mention. Shown as\n\t * empty-state source buttons (only while no items exist, alongside\n\t * `sourceGroups`) AND as rows inside the `@` picker's Tools view.\n\t */\n\tactionSources?: ToolAction[];\n\t/**\n\t * When set, the row Delete icon opens a confirmation modal (instead of\n\t * removing immediately); `onRemove` runs only on confirm. `noun` fills the one\n\t * shared message template (\"Delete this <noun>?\" …); `zIndex` raises the modal\n\t * above a parent drawer. Omit to delete directly.\n\t */\n\tconfirmDelete?: { noun: string; zIndex?: number };\n\t/**\n\t * Open the `@` picker popover above the trigger instead of below. Use inside\n\t * a drawer where the section sits near the bottom — opening downward\n\t * stretches the drawer and leaves a gap.\n\t */\n\tpickerOpensUp?: boolean;\n}\n\nexport const SelectableListSection: React.FC<SelectableListSectionProps> = ({\n\ttitle,\n\thelper,\n\titems,\n\taddableOptions,\n\tonAdd,\n\tonRemove,\n\tdataTestPrefix,\n\temptyText,\n\tcreateOption,\n\tonConfigure,\n\tsourceGroups,\n\tmentionItems,\n\tactionSources,\n\tconfirmDelete,\n\tpickerOpensUp,\n}) => {\n\tconst [adding, setAdding] = useState(false);\n\t// Row id awaiting delete confirmation (null = modal closed).\n\tconst [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\n\t// Row id whose configure handler is in flight (async fetch before its drawer\n\t// opens) — all edit buttons are disabled meanwhile so the UI isn't\n\t// unresponsive to double clicks.\n\tconst [configuringId, setConfiguringId] = useState<string | null>(null);\n\t// Tools: which source's searchable list is open (null = just show the buttons).\n\tconst [activeSource, setActiveSource] = useState<string | null>(null);\n\tconst hasSourceGroups = !!sourceGroups && sourceGroups.length > 0;\n\tconst activeGroup = sourceGroups?.find((g) => g.source === activeSource);\n\t// When set, \"+\" opens the `@` MentionPicker popover instead of a select input.\n\tconst usePicker = mentionItems !== undefined;\n\t// Separate anchors for the header \"+\" popover and the empty-state source-button\n\t// popover — when empty both render at once, so a shared ref would misfire the\n\t// outside-click check (closing the header picker when a source row is clicked).\n\tconst headerPickerRef = useRef<HTMLDivElement>(null);\n\tconst sourcePickerRef = useRef<HTMLDivElement>(null);\n\t// Source (Shopify / Manifest) the empty-state button opened the picker into;\n\t// null when \"+\" opened it at the root source list.\n\tconst [pickerSource, setPickerSource] = useState<string | null>(null);\n\n\t// Dismiss the picker popover on outside click / Escape.\n\tuseEffect(() => {\n\t\tif (!usePicker || !adding) {\n\t\t\treturn;\n\t\t}\n\t\tconst onDocMouseDown = (e: MouseEvent) => {\n\t\t\tconst target = e.target as Node;\n\t\t\tif (\n\t\t\t\t!headerPickerRef.current?.contains(target) &&\n\t\t\t\t!sourcePickerRef.current?.contains(target)\n\t\t\t) {\n\t\t\t\tsetAdding(false);\n\t\t\t}\n\t\t};\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tsetAdding(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', onDocMouseDown);\n\t\tdocument.addEventListener('keydown', onKeyDown);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', onDocMouseDown);\n\t\t\tdocument.removeEventListener('keydown', onKeyDown);\n\t\t};\n\t}, [usePicker, adding]);\n\n\t// Header \"+\" picks an EXISTING item (and, once some exist, re-creates via the\n\t// dropdown's footer row). With an empty list + a createOption the body shows a\n\t// dedicated \"Create new\" button instead, so the header \"+\" would be redundant.\n\t// In picker mode the \"+\" always shows (even empty) — for tools it sits next to\n\t// the empty-state source buttons; the create flow lives inside the picker.\n\tconst showAddButton = hasSourceGroups\n\t\t? usePicker || items.length > 0\n\t\t: usePicker ||\n\t\t addableOptions.length > 0 ||\n\t\t (!!createOption && items.length > 0);\n\t// Empty state offers a one-click \"Create new\" (sub-agents) rather than burying\n\t// it behind a single-item dropdown. In picker mode the \"+\" opens the picker\n\t// (with its own \"Create new\" row) instead, so skip the standalone button.\n\tconst showEmptyCreate =\n\t\titems.length === 0 && !!createOption && !hasSourceGroups && !usePicker;\n\tconst hasActionSources = !!actionSources && actionSources.length > 0;\n\t// Source buttons ONLY while no item is added — the tool sources (Manifest /\n\t// Shopify …) plus the built-in action tools (Rest API / Handover to email).\n\t// Once an item exists, adding more uses the header \"+\" → picker (the buttons\n\t// never come back); the action tools still live inside that picker.\n\tconst showSourceButtons =\n\t\t(hasSourceGroups || hasActionSources) && items.length === 0;\n\t// Nothing existing to pick → skip the 1-item dropdown and create directly.\n\tconst handleAddClick = () => {\n\t\tif (usePicker) {\n\t\t\t// Nothing to pick yet and a create flow exists (e.g. Sub-agents with none\n\t\t\t// added) → skip the empty picker and open the create drawer directly,\n\t\t\t// mirroring the single-tool \"one level up\" collapse.\n\t\t\tif ((mentionItems?.length ?? 0) === 0 && createOption) {\n\t\t\t\tcreateOption.onSelect();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Toggle the `@` reference-picker popover (rendered under the \"+\"), opened\n\t\t\t// at the root source list (no pre-drilled source).\n\t\t\tsetPickerSource(null);\n\t\t\tsetAdding((v) => !v);\n\t\t\treturn;\n\t\t}\n\t\tif (hasSourceGroups) {\n\t\t\tsetActiveSource(null);\n\t\t\tsetAdding((v) => !v);\n\t\t\treturn;\n\t\t}\n\t\tif (addableOptions.length === 0 && createOption) {\n\t\t\tcreateOption.onSelect();\n\t\t\treturn;\n\t\t}\n\t\tsetAdding((v) => !v);\n\t};\n\n\t// Run a row's configure handler; a returned promise disables the edit\n\t// buttons until it settles (same promise-sniff as the drawer Save buttons).\n\tconst handleConfigureClick = (\n\t\tid: string,\n\t\tconfigure: () => void | Promise<void>,\n\t) => {\n\t\tif (configuringId) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = configure();\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetConfiguringId(id);\n\t\t\tvoid (result as Promise<void>).finally(() => setConfiguringId(null));\n\t\t}\n\t};\n\n\tconst renderChipRows = () =>\n\t\titems.map((item) => {\n\t\t\t// Per-item configure wins; otherwise fall back to the section-level one.\n\t\t\tconst configure =\n\t\t\t\titem.onConfigure ??\n\t\t\t\t(onConfigure ? () => onConfigure(item.id) : undefined);\n\t\t\treturn (\n\t\t\t\t<SelectableRow\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\tdata-test={`${dataTestPrefix}-row-${item.id}`}\n\t\t\t\t>\n\t\t\t\t\t{renderSourceIcon(item.icon)}\n\t\t\t\t\t{/* Label + verification shield on one row: label truncates, the shield\n\t\t\t\t\t sits just after the text. */}\n\t\t\t\t\t<RowLabel>\n\t\t\t\t\t\t{/* Row label truncates to one line; tooltip surfaces the full name. */}\n\t\t\t\t\t\t<Tooltip body={item.label} placement=\"top\">\n\t\t\t\t\t\t\t<RowText>\n\t\t\t\t\t\t\t\t<BodySecondary numberOfLines={1} color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t</RowText>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t{item.authRequired && (\n\t\t\t\t\t\t\t// Order tools touch customer-private data — the shield flags that\n\t\t\t\t\t\t\t// this agent must verify the customer before the tool can run.\n\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\tbody=\"This tool requires customer verification\"\n\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-auth-${item.id}`}\n\t\t\t\t\t\t\t\t\tstyle={{ display: 'inline-flex', flexShrink: 0 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Shield size={16} />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</RowLabel>\n\t\t\t\t\t<RowActions>\n\t\t\t\t\t\t{configure && (\n\t\t\t\t\t\t\t// Configurable rows (sub-agents, Rest API / email tools) get an\n\t\t\t\t\t\t\t// always-visible edit icon.\n\t\t\t\t\t\t\t<Tooltip body=\"Edit\" placement=\"top\">\n\t\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-edit-${item.id}`}\n\t\t\t\t\t\t\t\t\taria-label={`Edit ${item.label}`}\n\t\t\t\t\t\t\t\t\tdisabled={configuringId !== null}\n\t\t\t\t\t\t\t\t\tonClick={() => handleConfigureClick(item.id, configure)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EditIcon\n\t\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{configure && <RowActionDivider aria-hidden />}\n\t\t\t\t\t\t<Tooltip body=\"Delete\" placement=\"top\">\n\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-delete-${item.id}`}\n\t\t\t\t\t\t\t\taria-label={`Delete ${item.label}`}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tconfirmDelete\n\t\t\t\t\t\t\t\t\t\t? setPendingDeleteId(item.id)\n\t\t\t\t\t\t\t\t\t\t: onRemove(item.id)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DeleteIcon\n\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</RowActions>\n\t\t\t\t</SelectableRow>\n\t\t\t);\n\t\t});\n\t// \"Create new\" is a brand-coloured footer row at the BOTTOM of the dropdown,\n\t// separated from the selectable items by a divider.\n\tconst dropdownOptions: SingleOption[] = createOption\n\t\t? [\n\t\t\t\t...addableOptions,\n\t\t\t\t{\n\t\t\t\t\tlabel: createOption.label,\n\t\t\t\t\tvalue: CREATE_OPTION_VALUE,\n\t\t\t\t\tsearchKey: createOption.label,\n\t\t\t\t\tcustomComponent: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\t\tcolor: COLORS.content.brand,\n\t\t\t\t\t\t\t\tfontFamily: 'Inter',\n\t\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{createOption.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t ]\n\t\t: addableOptions;\n\n\t// One picker instance reused by the header \"+\" and the empty-state source\n\t// buttons. `key` remounts it so a source button re-drills into its own tools\n\t// (the initial drill-in level is read once, on mount).\n\tconst pickerNode = usePicker ? (\n\t\t<MentionPicker\n\t\t\tkey={pickerSource ?? '__root__'}\n\t\t\titems={mentionItems ?? []}\n\t\t\tquery=\"\"\n\t\t\tactiveIndex={0}\n\t\t\tinitialSource={pickerSource ?? undefined}\n\t\t\tonSelect={(item) => {\n\t\t\t\tsetAdding(false);\n\t\t\t\tonAdd(String(item.id));\n\t\t\t}}\n\t\t\tonClose={() => setAdding(false)}\n\t\t\tonCreateSubAgent={\n\t\t\t\tcreateOption\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\tcreateOption.onSelect();\n\t\t\t\t\t }\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\ttoolActions={\n\t\t\t\thasActionSources\n\t\t\t\t\t? actionSources?.map((a) => ({\n\t\t\t\t\t\t\t...a,\n\t\t\t\t\t\t\tonSelect: () => {\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\ta.onSelect();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t }))\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\t// Gate native source rows in the picker on their connected state, derived\n\t\t\t// from the source groups (which already carry connected/onConnect). This is\n\t\t\t// what makes the \"+\" dropdown show \"Connect\" for unconnected vendors,\n\t\t\t// consistent with the empty-state buttons.\n\t\t\tintegrationStatus={Object.fromEntries(\n\t\t\t\t(sourceGroups ?? [])\n\t\t\t\t\t.filter((g) => g.connected !== undefined)\n\t\t\t\t\t.map((g) => [g.source, g.connected]),\n\t\t\t)}\n\t\t\tonConnectIntegration={(source) => {\n\t\t\t\tsetAdding(false);\n\t\t\t\tsourceGroups?.find((g) => g.source === source)?.onConnect?.();\n\t\t\t}}\n\t\t/>\n\t) : null;\n\n\treturn (\n\t\t<SideSection>\n\t\t\t<SideSectionHeader>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{title}</TitleSmall>\n\t\t\t\t{showAddButton && (\n\t\t\t\t\t<AddButtonWrap ref={headerPickerRef}>\n\t\t\t\t\t\t<AddIconButton\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-add`}\n\t\t\t\t\t\t\tonClick={handleAddClick}\n\t\t\t\t\t\t\taria-label={`Add ${title}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlusIcon width={16} height={16} color={COLORS.content.primary} />\n\t\t\t\t\t\t</AddIconButton>\n\t\t\t\t\t\t{usePicker && adding && pickerSource === null && (\n\t\t\t\t\t\t\t<PickerPopover\n\t\t\t\t\t\t\t\t$up={pickerOpensUp}\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-picker`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{pickerNode}\n\t\t\t\t\t\t\t</PickerPopover>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AddButtonWrap>\n\t\t\t\t)}\n\t\t\t</SideSectionHeader>\n\n\t\t\t{helper && (\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>{helper}</BodyCaption>\n\t\t\t)}\n\n\t\t\t{showSourceButtons ? (\n\t\t\t\t<SourcePickerAnchor ref={usePicker ? sourcePickerRef : undefined}>\n\t\t\t\t\t{/* No tools yet: one button per source (never shown once a tool exists). */}\n\t\t\t\t\t<SourceButtonRow data-test={`${dataTestPrefix}-sources`}>\n\t\t\t\t\t\t{sourceGroups?.map((g) => {\n\t\t\t\t\t\t\t// A connected source with exactly one tool is pointless to drill\n\t\t\t\t\t\t\t// into — surface that single tool right here (its name + the source\n\t\t\t\t\t\t\t// icon) and add it on click, mirroring the `@` picker's single-leaf\n\t\t\t\t\t\t\t// collapse. Connect still wins when the source isn't connected.\n\t\t\t\t\t\t\tconst soleTool =\n\t\t\t\t\t\t\t\tg.connected !== false && g.options.length === 1\n\t\t\t\t\t\t\t\t\t? g.options[0]\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SourceButton\n\t\t\t\t\t\t\t\t\tkey={g.source}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-source-${g.source}`}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t// Not connected → open the connect flow instead of the tools.\n\t\t\t\t\t\t\t\t\t\tif (g.connected === false) {\n\t\t\t\t\t\t\t\t\t\t\tg.onConnect?.();\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (soleTool) {\n\t\t\t\t\t\t\t\t\t\t\t// Single tool → add it directly (no drill-in).\n\t\t\t\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\t\t\t\tonAdd(soleTool.value);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (usePicker) {\n\t\t\t\t\t\t\t\t\t\t\t// Open the `@` picker drilled straight into this source's tools.\n\t\t\t\t\t\t\t\t\t\t\tsetPickerSource(g.source);\n\t\t\t\t\t\t\t\t\t\t\tsetAdding(true);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tsetActiveSource(g.source);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{renderSourceIcon(sourceIcon(g.source), -4)}\n\t\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t\t{soleTool ? soleTool.label : g.label}\n\t\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t\t\t{g.connected === false && (\n\t\t\t\t\t\t\t\t\t\t// Not connected → show \"Connect\" upfront (consistent with\n\t\t\t\t\t\t\t\t\t\t// the `@` picker); clicking runs the connect flow.\n\t\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.brand}>\n\t\t\t\t\t\t\t\t\t\t\tConnect\n\t\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</SourceButton>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{actionSources?.map((a) => (\n\t\t\t\t\t\t\t<SourceButton\n\t\t\t\t\t\t\t\tkey={a.source}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-action-${a.source}`}\n\t\t\t\t\t\t\t\t// Not connected → connect flow; otherwise close any open source\n\t\t\t\t\t\t\t\t// picker before opening this drawer, else the previous source's\n\t\t\t\t\t\t\t\t// popup lingers behind it.\n\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\ta.connected === false\n\t\t\t\t\t\t\t\t\t\t? () => a.onConnect?.()\n\t\t\t\t\t\t\t\t\t\t: () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\t\t\t\t\ta.onSelect();\n\t\t\t\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderSourceIcon(a.icon, -4)}\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{a.label}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t\t{a.connected === false && (\n\t\t\t\t\t\t\t\t\t// Not connected → \"Connect\" upfront (consistent with the\n\t\t\t\t\t\t\t\t\t// source buttons and the `@` picker).\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.brand}>\n\t\t\t\t\t\t\t\t\t\tConnect\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</SourceButton>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SourceButtonRow>\n\n\t\t\t\t\t{/* Picker mode: clicking a source opens its tools in the `@` picker. */}\n\t\t\t\t\t{usePicker && adding && pickerSource !== null && (\n\t\t\t\t\t\t<PickerPopover\n\t\t\t\t\t\t\t$align=\"left\"\n\t\t\t\t\t\t\t$up={pickerOpensUp}\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-picker`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{pickerNode}\n\t\t\t\t\t\t</PickerPopover>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Legacy (non-picker) mode: chosen source → its searchable tool list. */}\n\t\t\t\t\t{!usePicker && activeGroup && (\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\tplaceHolder={`Search ${activeGroup.label} tools`}\n\t\t\t\t\t\t\toptions={activeGroup.options}\n\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\tconst v = unwrapDropdownValue(opt);\n\t\t\t\t\t\t\t\tsetActiveSource(null);\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</SourcePickerAnchor>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{!usePicker && adding && dropdownOptions.length > 0 && (\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\tplaceHolder={`Select ${title.toLowerCase()}`}\n\t\t\t\t\t\t\toptions={dropdownOptions}\n\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\tconst v = unwrapDropdownValue(opt);\n\t\t\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\t\t\tif (!v) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v === CREATE_OPTION_VALUE) {\n\t\t\t\t\t\t\t\t\tcreateOption?.onSelect();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{items.length === 0 && !adding ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.placeholder}>\n\t\t\t\t\t\t\t\t{emptyText}\n\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t{showEmptyCreate && createOption && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-create`}\n\t\t\t\t\t\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tmatchParentWidth\n\t\t\t\t\t\t\t\t\tLeadingIcon={PlusIcon}\n\t\t\t\t\t\t\t\t\tbuttonText={createOption.label}\n\t\t\t\t\t\t\t\t\tonClick={createOption.onSelect}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\trenderChipRows()\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{confirmDelete && pendingDeleteId && (\n\t\t\t\t<DeleteConfirmationModal\n\t\t\t\t\tdata-test={`${dataTestPrefix}-delete-confirm`}\n\t\t\t\t\theader={`Delete this ${confirmDelete.noun}?`}\n\t\t\t\t\tsubHeader={`Deleting this ${confirmDelete.noun} will also remove it from your instructions, wherever it's referenced.`}\n\t\t\t\t\tconfirmationText=\"Delete\"\n\t\t\t\t\tzIndex={confirmDelete.zIndex}\n\t\t\t\t\tonDeleteConfirmed={() => {\n\t\t\t\t\t\tonRemove(pendingDeleteId);\n\t\t\t\t\t\tsetPendingDeleteId(null);\n\t\t\t\t\t}}\n\t\t\t\t\tonCancelClicked={() => setPendingDeleteId(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</SideSection>\n\t);\n};\n\n// Anchors the `@`-picker popover to the header \"+\" button.\nconst AddButtonWrap = styled.div`\n\tposition: relative;\n\tdisplay: flex;\n`;\n\n// Anchors the `@`-picker popover to the empty-state source buttons.\nconst SourcePickerAnchor = styled.div`\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n`;\n\n// Floating card under the trigger. Aligns to the \"+\" (right) or the source\n// buttons (left) so it stays inside the side panel.\nconst PickerPopover = styled.div<{ $align?: 'left' | 'right'; $up?: boolean }>`\n\tposition: absolute;\n\t${(p) => (p.$up ? 'bottom: calc(100% + 4px);' : 'top: calc(100% + 4px);')}\n\t${(p) => (p.$align === 'left' ? 'left: 0;' : 'right: 0;')}\n\tz-index: 30;\n`;\n"],"names":["CREATE_OPTION_VALUE","SelectableListSection","title","helper","items","addableOptions","onAdd","onRemove","dataTestPrefix","emptyText","createOption","onConfigure","sourceGroups","mentionItems","actionSources","confirmDelete","pickerOpensUp","adding","setAdding","useState","pendingDeleteId","setPendingDeleteId","configuringId","setConfiguringId","activeSource","setActiveSource","hasSourceGroups","activeGroup","g","usePicker","headerPickerRef","useRef","sourcePickerRef","pickerSource","setPickerSource","useEffect","onDocMouseDown","e","target","onKeyDown","showAddButton","showEmptyCreate","hasActionSources","showSourceButtons","handleAddClick","v","handleConfigureClick","id","configure","result","renderChipRows","item","jsxs","SelectableRow","renderSourceIcon","RowLabel","jsx","Tooltip","RowText","BodySecondary","COLORS","Shield","RowActions","RowMenuButton","EditIcon","RowActionDivider","DeleteIcon","dropdownOptions","pickerNode","MentionPicker","a","source","SideSection","SideSectionHeader","TitleSmall","AddButtonWrap","AddIconButton","PlusIcon","PickerPopover","BodyCaption","SourcePickerAnchor","SourceButtonRow","soleTool","SourceButton","sourceIcon","Dropdown","opt","unwrapDropdownValue","Fragment","Button","DeleteConfirmationModal","styled","p"],"mappings":"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"}
@@ -109,6 +109,26 @@ export declare const TOOL_SOURCE_RANK: Partial<Record<ToolSource, number>>;
109
109
  export declare const INTEGRATION_SOURCES: ToolSource[];
110
110
  /** True for an external integration/vendor source (never collapsed to a single leaf). */
111
111
  export declare const isIntegrationSource: (source: string) => boolean;
112
+ /**
113
+ * Vendor integrations that live UNDER the "More Integrations" umbrella in the `@`
114
+ * picker (a single top-level row → their list), instead of each being its own
115
+ * root row. Shopify, BigCommerce, Skio and Gorgias stay top-level sources of
116
+ * their own; only the less-common vendors (ShipStation) and the generic
117
+ * catch-all Integration are tucked away here.
118
+ */
119
+ export declare const MORE_INTEGRATION_SOURCES: ToolSource[];
120
+ /** True for a source shown under the "More Integrations" umbrella. */
121
+ export declare const isMoreIntegrationSource: (source: string) => boolean;
122
+ /**
123
+ * Synthetic picker key / label / rank for the "More Integrations" umbrella row.
124
+ * The rank lives here (not in {@link TOOL_SOURCE_RANK}) because that map is keyed
125
+ * by the drift-guarded {@link ToolSource} enum — the backend's canonical wire
126
+ * strings — and `more_integrations` is a picker-only key, not a real source.
127
+ */
128
+ export declare const MORE_INTEGRATIONS_KEY = "more_integrations";
129
+ export declare const MORE_INTEGRATIONS_LABEL = "More Integrations";
130
+ /** Always last — sits after every named top-level source (REST API, rank 8). */
131
+ export declare const MORE_INTEGRATIONS_RANK = 9;
112
132
  /** Sort rank for a source string; unknown sources rank after all known ones. */
113
133
  export declare const toolSourceRank: (source: string) => number;
114
134
  /**