@bikdotai/bik-component-library 0.0.850-beta.2 → 0.0.850-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/assets/icons/ShipStation.svg.js +1 -1
- package/dist/cjs/assets/icons/ShipStation.svg.js.map +1 -1
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js +0 -1
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/DiscardModal.js +1 -1
- package/dist/cjs/components/agent-builder/components/DiscardModal.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/GoLiveModal.js +1 -1
- package/dist/cjs/components/agent-builder/components/GoLiveModal.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/MentionEditor.js +1 -1
- package/dist/cjs/components/agent-builder/components/MentionEditor.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/MentionPicker.js +32 -24
- package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/cjs/editor/BikEditor.js +1 -1
- package/dist/cjs/editor/BikEditor.js.map +1 -1
- package/dist/cjs/editor/BikEditor.styles.js +17 -12
- package/dist/cjs/editor/BikEditor.styles.js.map +1 -1
- package/dist/cjs/editor/BikEditor.types.js.map +1 -1
- package/dist/cjs/editor/extensions/buildExtensions.js +2 -2
- package/dist/cjs/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/cjs/editor/extensions/characterLimit/CharacterLimitExtension.js +3 -3
- package/dist/cjs/editor/extensions/characterLimit/CharacterLimitExtension.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/assets/icons/ShipStation.svg.js +2 -2
- package/dist/esm/assets/icons/ShipStation.svg.js.map +1 -1
- package/dist/esm/assets/icons/index.d.ts +1 -0
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js +4 -5
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/esm/components/agent-builder/components/DiscardModal.js +57 -49
- package/dist/esm/components/agent-builder/components/DiscardModal.js.map +1 -1
- package/dist/esm/components/agent-builder/components/GoLiveModal.js +26 -22
- package/dist/esm/components/agent-builder/components/GoLiveModal.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionEditor.js +24 -23
- package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionPicker.js +81 -73
- package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/esm/editor/BikEditor.js +70 -68
- package/dist/esm/editor/BikEditor.js.map +1 -1
- package/dist/esm/editor/BikEditor.styles.js +20 -15
- package/dist/esm/editor/BikEditor.styles.js.map +1 -1
- package/dist/esm/editor/BikEditor.types.d.ts +10 -0
- package/dist/esm/editor/BikEditor.types.js.map +1 -1
- package/dist/esm/editor/extensions/buildExtensions.d.ts +6 -0
- package/dist/esm/editor/extensions/buildExtensions.js +20 -15
- package/dist/esm/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.d.ts +20 -3
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.js +40 -25
- package/dist/esm/editor/extensions/characterLimit/CharacterLimitExtension.js.map +1 -1
- package/dist/esm/index.js +761 -759
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as k, jsx as s, Fragment as oe } from "react/jsx-runtime";
|
|
2
2
|
import ie from "../../../assets/icons/chevronRight.svg.js";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import le from "../../../assets/icons/searchIcon.svg.js";
|
|
4
|
+
import ae from "../../../icons/Arrows/Normal arrows/ArrowLeft.js";
|
|
5
5
|
import { useState as A, useMemo as y, useEffect as U, useRef as ce } from "react";
|
|
6
|
-
import
|
|
6
|
+
import h from "styled-components";
|
|
7
7
|
import { TitleSmall as se, BodySecondary as de, BodyCaption as ue } from "../../TypographyStyle.js";
|
|
8
8
|
import { COLORS as o } from "../../../constants/Theme.js";
|
|
9
|
-
import { CATEGORIES as pe, isIntegrationSource as j, toolSourceRank as F, CONFIG_TOOL_SOURCES as
|
|
9
|
+
import { CATEGORIES as pe, isIntegrationSource as j, toolSourceRank as F, CONFIG_TOOL_SOURCES as he, INTEGRATIONS_RANK as fe } from "../constants/tools.js";
|
|
10
10
|
import { toolSourceLabel as J } from "../utils/mentionSerialization.js";
|
|
11
11
|
import { renderSourceIcon as H, sourceIcon as P } from "../utils/sourceIcons.js";
|
|
12
12
|
import ee from "../../../icons/Informational/Common UI/Shield.js";
|
|
13
|
-
const
|
|
14
|
-
items:
|
|
13
|
+
const b = (a) => a.meta, C = (a) => b(a)?.plainLabel ?? a.label, ge = "__bik_create_subagent__", Ne = ({
|
|
14
|
+
items: a,
|
|
15
15
|
onSelect: $,
|
|
16
16
|
registerKeyHandler: L,
|
|
17
17
|
onClose: w,
|
|
@@ -21,29 +21,29 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
21
21
|
integrationStatus: V,
|
|
22
22
|
onConnectIntegration: W
|
|
23
23
|
}) => {
|
|
24
|
-
const [te, z] = A(null), [c, B] = A(Q ?? null), [R, D] = A(null), [_,
|
|
25
|
-
() =>
|
|
26
|
-
[
|
|
27
|
-
),
|
|
28
|
-
() =>
|
|
29
|
-
[
|
|
24
|
+
const [te, z] = A(null), [c, B] = A(Q ?? null), [R, D] = A(null), [_, m] = A(-1), [S, X] = A(""), x = y(
|
|
25
|
+
() => a.filter((e) => b(e)?.kind === "tool"),
|
|
26
|
+
[a]
|
|
27
|
+
), T = y(
|
|
28
|
+
() => a.filter((e) => b(e)?.kind === "subagent"),
|
|
29
|
+
[a]
|
|
30
30
|
), N = y(() => {
|
|
31
31
|
const e = [];
|
|
32
|
-
return
|
|
33
|
-
const
|
|
34
|
-
e.includes(
|
|
32
|
+
return x.forEach((r) => {
|
|
33
|
+
const f = b(r)?.source ?? "other";
|
|
34
|
+
e.includes(f) || e.push(f);
|
|
35
35
|
}), e;
|
|
36
|
-
}, [
|
|
36
|
+
}, [x]), M = y(
|
|
37
37
|
() => new Map(
|
|
38
38
|
(v ?? []).map((e) => [e.source, e])
|
|
39
39
|
),
|
|
40
40
|
[v]
|
|
41
|
-
),
|
|
41
|
+
), E = y(
|
|
42
42
|
() => pe.filter(
|
|
43
|
-
(e) => e.key === "tool" ?
|
|
43
|
+
(e) => e.key === "tool" ? x.length > 0 || (v?.length ?? 0) > 0 : T.length > 0 || !!I
|
|
44
44
|
),
|
|
45
|
-
[
|
|
46
|
-
), G =
|
|
45
|
+
[x.length, T.length, I, v?.length]
|
|
46
|
+
), G = E.length === 1 ? E[0].key : null, d = te ?? G, u = d ? d === "subagent" ? (
|
|
47
47
|
// Always titled — with a back arrow only when the category chooser is above.
|
|
48
48
|
{
|
|
49
49
|
title: "Sub-agent",
|
|
@@ -64,9 +64,9 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
64
64
|
title: "Tools",
|
|
65
65
|
onBack: G ? void 0 : () => z(null)
|
|
66
66
|
}
|
|
67
|
-
) : null,
|
|
67
|
+
) : null, l = y(() => {
|
|
68
68
|
if (!d)
|
|
69
|
-
return
|
|
69
|
+
return E.map((n) => ({
|
|
70
70
|
id: n.key,
|
|
71
71
|
label: n.label,
|
|
72
72
|
drillsIn: !0,
|
|
@@ -75,7 +75,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
75
75
|
}
|
|
76
76
|
}));
|
|
77
77
|
if (d === "subagent") {
|
|
78
|
-
const n = S.trim().toLowerCase(), p =
|
|
78
|
+
const n = S.trim().toLowerCase(), p = T.filter((g) => !n || C(g).toLowerCase().includes(n)).map((g) => ({
|
|
79
79
|
id: String(g.id),
|
|
80
80
|
label: C(g),
|
|
81
81
|
drillsIn: !1,
|
|
@@ -105,8 +105,8 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
105
105
|
w?.(), i?.onConnect ? i.onConnect() : W?.(t);
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
|
-
const K =
|
|
109
|
-
(q) => (
|
|
108
|
+
const K = x.filter(
|
|
109
|
+
(q) => (b(q)?.source ?? "other") === t
|
|
110
110
|
);
|
|
111
111
|
if (K.length + (i ? 1 : 0) === 1) {
|
|
112
112
|
const q = P(t) ?? i?.icon;
|
|
@@ -126,7 +126,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
126
126
|
label: C(O),
|
|
127
127
|
drillsIn: !1,
|
|
128
128
|
icon: q,
|
|
129
|
-
authRequired:
|
|
129
|
+
authRequired: b(O)?.authRequired,
|
|
130
130
|
onActivate: () => $(O)
|
|
131
131
|
};
|
|
132
132
|
}
|
|
@@ -142,7 +142,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
142
142
|
return p.filter(j).sort((t, i) => F(t) - F(i)).map(g);
|
|
143
143
|
const Z = p.filter((t) => !j(t)).map((t) => ({ rank: F(t), row: g(t) }));
|
|
144
144
|
return p.some(j) && Z.push({
|
|
145
|
-
rank:
|
|
145
|
+
rank: fe,
|
|
146
146
|
row: {
|
|
147
147
|
id: "__integrations__",
|
|
148
148
|
label: "Integrations",
|
|
@@ -153,34 +153,34 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
153
153
|
}
|
|
154
154
|
}), Z.sort((t, i) => t.rank - i.rank).map((t) => t.row);
|
|
155
155
|
}
|
|
156
|
-
const e = S.trim().toLowerCase(), r =
|
|
156
|
+
const e = S.trim().toLowerCase(), r = x.filter((n) => (b(n)?.source ?? "other") === c).filter((n) => !e || C(n).toLowerCase().includes(e)).map((n) => ({
|
|
157
157
|
id: String(n.id),
|
|
158
158
|
label: C(n),
|
|
159
159
|
drillsIn: !1,
|
|
160
|
-
authRequired:
|
|
160
|
+
authRequired: b(n)?.authRequired,
|
|
161
161
|
onActivate: () => $(n)
|
|
162
|
-
})),
|
|
163
|
-
if (
|
|
164
|
-
const n = c in
|
|
162
|
+
})), f = M.get(c);
|
|
163
|
+
if (f) {
|
|
164
|
+
const n = c in he;
|
|
165
165
|
r.push({
|
|
166
166
|
id: `create:${c}`,
|
|
167
|
-
label:
|
|
167
|
+
label: f.label,
|
|
168
168
|
drillsIn: !1,
|
|
169
169
|
isCreate: !n,
|
|
170
170
|
onActivate: () => {
|
|
171
|
-
w?.(),
|
|
171
|
+
w?.(), f.onSelect();
|
|
172
172
|
}
|
|
173
173
|
});
|
|
174
174
|
}
|
|
175
175
|
return r;
|
|
176
176
|
}, [
|
|
177
177
|
d,
|
|
178
|
-
|
|
178
|
+
E,
|
|
179
179
|
c,
|
|
180
180
|
R,
|
|
181
181
|
S,
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
x,
|
|
183
|
+
T,
|
|
184
184
|
N,
|
|
185
185
|
$,
|
|
186
186
|
w,
|
|
@@ -191,22 +191,22 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
191
191
|
W
|
|
192
192
|
]);
|
|
193
193
|
U(
|
|
194
|
-
() =>
|
|
195
|
-
[d, c, R, S,
|
|
194
|
+
() => m(-1),
|
|
195
|
+
[d, c, R, S, a]
|
|
196
196
|
), U(() => X(""), [d, c, R]);
|
|
197
|
-
const Y = ce({ rows:
|
|
198
|
-
Y.current = { rows:
|
|
197
|
+
const Y = ce({ rows: l, activeIndex: _, header: u });
|
|
198
|
+
Y.current = { rows: l, activeIndex: _, header: u }, U(() => {
|
|
199
199
|
if (L)
|
|
200
200
|
return L((e) => {
|
|
201
|
-
const { rows: r, activeIndex:
|
|
201
|
+
const { rows: r, activeIndex: f, header: n } = Y.current;
|
|
202
202
|
switch (e.key) {
|
|
203
203
|
case "ArrowDown":
|
|
204
|
-
return r.length &&
|
|
204
|
+
return r.length && m((p) => (p + 1) % r.length), !0;
|
|
205
205
|
case "ArrowUp":
|
|
206
|
-
return r.length &&
|
|
206
|
+
return r.length && m((p) => (p + r.length - 1) % r.length), !0;
|
|
207
207
|
case "ArrowRight":
|
|
208
208
|
case "Enter":
|
|
209
|
-
return (r[
|
|
209
|
+
return (r[f] ?? r[0])?.onActivate(), !0;
|
|
210
210
|
case "ArrowLeft":
|
|
211
211
|
return n?.onBack ? (n.onBack(), !0) : !1;
|
|
212
212
|
default:
|
|
@@ -214,9 +214,9 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
214
214
|
}
|
|
215
215
|
}), () => L(null);
|
|
216
216
|
}, [L]);
|
|
217
|
-
const ne = d ?
|
|
218
|
-
return /* @__PURE__ */
|
|
219
|
-
u && /* @__PURE__ */
|
|
217
|
+
const ne = d ? l.length && !l[0].drillsIn ? "items" : "sources" : "categories", re = d === "tool" && !!c || d === "subagent";
|
|
218
|
+
return /* @__PURE__ */ k(be, { className: `bik-mention-picker bik-mention-picker--${ne}`, children: [
|
|
219
|
+
u && /* @__PURE__ */ k(
|
|
220
220
|
Re,
|
|
221
221
|
{
|
|
222
222
|
type: "button",
|
|
@@ -228,7 +228,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
228
228
|
},
|
|
229
229
|
children: [
|
|
230
230
|
u.onBack && /* @__PURE__ */ s(
|
|
231
|
-
|
|
231
|
+
ae,
|
|
232
232
|
{
|
|
233
233
|
width: 20,
|
|
234
234
|
height: 20,
|
|
@@ -236,16 +236,16 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
236
236
|
}
|
|
237
237
|
),
|
|
238
238
|
u.icon && H(u.icon),
|
|
239
|
-
/* @__PURE__ */
|
|
239
|
+
/* @__PURE__ */ k(se, { children: [
|
|
240
240
|
" ",
|
|
241
241
|
u.title
|
|
242
242
|
] })
|
|
243
243
|
]
|
|
244
244
|
}
|
|
245
245
|
),
|
|
246
|
-
re && /* @__PURE__ */
|
|
246
|
+
re && /* @__PURE__ */ k(me, { children: [
|
|
247
247
|
/* @__PURE__ */ s(
|
|
248
|
-
|
|
248
|
+
le,
|
|
249
249
|
{
|
|
250
250
|
width: 20,
|
|
251
251
|
height: 20,
|
|
@@ -253,7 +253,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
253
253
|
}
|
|
254
254
|
),
|
|
255
255
|
/* @__PURE__ */ s(
|
|
256
|
-
|
|
256
|
+
xe,
|
|
257
257
|
{
|
|
258
258
|
autoFocus: !0,
|
|
259
259
|
value: S,
|
|
@@ -261,21 +261,21 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
261
261
|
"data-test": "mention-picker-search",
|
|
262
262
|
onChange: (e) => X(e.target.value),
|
|
263
263
|
onKeyDown: (e) => {
|
|
264
|
-
|
|
264
|
+
l.length && (e.key === "ArrowDown" ? (e.preventDefault(), m((r) => (r + 1) % l.length)) : e.key === "ArrowUp" ? (e.preventDefault(), m((r) => (r + l.length - 1) % l.length)) : e.key === "Enter" && (e.preventDefault(), (l[_] ?? l[0])?.onActivate()));
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
)
|
|
268
268
|
] }),
|
|
269
|
-
|
|
270
|
-
|
|
269
|
+
l.length === 0 ? /* @__PURE__ */ s(Se, { children: d === "subagent" ? null : "No tools available" }) : l.map((e, r) => /* @__PURE__ */ s(
|
|
270
|
+
ke,
|
|
271
271
|
{
|
|
272
272
|
type: "button",
|
|
273
273
|
$active: r === _,
|
|
274
|
-
onMouseEnter: () =>
|
|
275
|
-
onMouseLeave: () =>
|
|
274
|
+
onMouseEnter: () => m(r),
|
|
275
|
+
onMouseLeave: () => m(-1),
|
|
276
276
|
onClick: e.onActivate,
|
|
277
|
-
children: e.isCreate ? /* @__PURE__ */ s(Ie, { children: e.label }) : /* @__PURE__ */
|
|
278
|
-
/* @__PURE__ */
|
|
277
|
+
children: e.isCreate ? /* @__PURE__ */ s(Ie, { children: e.label }) : /* @__PURE__ */ k(oe, { children: [
|
|
278
|
+
/* @__PURE__ */ k(ve, { children: [
|
|
279
279
|
H(e.icon),
|
|
280
280
|
/* @__PURE__ */ s(de, { color: o.content.primary, children: e.label }),
|
|
281
281
|
e.authRequired && /* @__PURE__ */ s(
|
|
@@ -291,12 +291,12 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
291
291
|
},
|
|
292
292
|
e.id
|
|
293
293
|
)),
|
|
294
|
-
|
|
294
|
+
l.some((e) => e.authRequired) && /* @__PURE__ */ k(ye, { children: [
|
|
295
295
|
/* @__PURE__ */ s(ee, { size: 14 }),
|
|
296
296
|
/* @__PURE__ */ s(ue, { color: o.content.secondary, children: "This tool requires customer verification" })
|
|
297
297
|
] })
|
|
298
298
|
] });
|
|
299
|
-
},
|
|
299
|
+
}, be = h.div`
|
|
300
300
|
display: flex;
|
|
301
301
|
flex-direction: column;
|
|
302
302
|
min-width: 240px;
|
|
@@ -306,13 +306,14 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
306
306
|
border: 1px solid ${o.stroke.primary};
|
|
307
307
|
border-radius: 4px;
|
|
308
308
|
box-shadow: 0px -2px 8px 0px #0000001f;
|
|
309
|
-
`,
|
|
309
|
+
`, me = h.div`
|
|
310
310
|
display: flex;
|
|
311
311
|
align-items: center;
|
|
312
312
|
gap: 8px;
|
|
313
313
|
padding: 10px 12px;
|
|
314
|
+
flex-shrink: 0;
|
|
314
315
|
border-bottom: 1px solid ${o.stroke.primary};
|
|
315
|
-
`,
|
|
316
|
+
`, xe = h.input`
|
|
316
317
|
flex: 1;
|
|
317
318
|
min-width: 0;
|
|
318
319
|
border: none;
|
|
@@ -325,7 +326,7 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
325
326
|
&::placeholder {
|
|
326
327
|
color: ${o.content.placeholder};
|
|
327
328
|
}
|
|
328
|
-
`,
|
|
329
|
+
`, ke = h.button`
|
|
329
330
|
display: flex;
|
|
330
331
|
justify-content: space-between;
|
|
331
332
|
align-items: center;
|
|
@@ -333,41 +334,46 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
333
334
|
width: 100%;
|
|
334
335
|
padding: 8px 10px;
|
|
335
336
|
height: 48px;
|
|
337
|
+
/* The card is a flex column with a max-height; without these a long list
|
|
338
|
+
compresses its rows below 48px (why only the short first step looked right)
|
|
339
|
+
instead of scrolling. Pin the row so the card scrolls instead. */
|
|
340
|
+
box-sizing: border-box;
|
|
341
|
+
flex-shrink: 0;
|
|
336
342
|
border: none;
|
|
337
343
|
border-bottom: 1px solid ${o.stroke.primary};
|
|
338
|
-
background: ${(
|
|
344
|
+
background: ${(a) => a.$active ? o.surface.subdued : "transparent"};
|
|
339
345
|
cursor: pointer;
|
|
340
346
|
text-align: left;
|
|
341
347
|
|
|
342
348
|
&:hover {
|
|
343
349
|
background: ${o.surface.hovered};
|
|
344
350
|
}
|
|
345
|
-
`, ve =
|
|
351
|
+
`, ve = h.div`
|
|
346
352
|
display: flex;
|
|
347
353
|
align-items: center;
|
|
348
354
|
gap: 12px;
|
|
349
355
|
min-width: 0;
|
|
350
|
-
`, ye =
|
|
356
|
+
`, ye = h.div`
|
|
351
357
|
display: flex;
|
|
352
358
|
align-items: center;
|
|
353
359
|
gap: 6px;
|
|
354
360
|
padding: 8px 12px;
|
|
355
361
|
border-top: 1px solid ${o.stroke.primary};
|
|
356
|
-
`, we =
|
|
362
|
+
`, we = h.span`
|
|
357
363
|
flex-shrink: 0;
|
|
358
364
|
color: ${o.content.brand};
|
|
359
365
|
font-family: Inter;
|
|
360
366
|
font-size: 14px;
|
|
361
367
|
font-weight: 600;
|
|
362
368
|
white-space: nowrap;
|
|
363
|
-
`, Ie =
|
|
369
|
+
`, Ie = h.div`
|
|
364
370
|
width: 100%;
|
|
365
371
|
text-align: center;
|
|
366
372
|
color: ${o.content.brand};
|
|
367
373
|
font-family: Inter;
|
|
368
374
|
font-size: 14px;
|
|
369
375
|
font-weight: 600;
|
|
370
|
-
`, Re =
|
|
376
|
+
`, Re = h.button`
|
|
371
377
|
display: flex;
|
|
372
378
|
align-items: center;
|
|
373
379
|
padding: 12px 16px;
|
|
@@ -379,8 +385,10 @@ const m = (l) => l.meta, C = (l) => m(l)?.plainLabel ?? l.label, ge = "__bik_cre
|
|
|
379
385
|
font-size: 12px;
|
|
380
386
|
font-weight: 600;
|
|
381
387
|
height: 48px;
|
|
388
|
+
box-sizing: border-box;
|
|
389
|
+
flex-shrink: 0;
|
|
382
390
|
gap: 4px;
|
|
383
|
-
`, Se =
|
|
391
|
+
`, Se = h.div`
|
|
384
392
|
padding: 12px 10px;
|
|
385
393
|
font-family: Inter;
|
|
386
394
|
font-size: 13px;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentionPicker.js","sources":["../../../../../src/components/agent-builder/components/MentionPicker.tsx"],"sourcesContent":["// import ChevronLeft from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRight from '@src/assets/icons/chevronRight.svg';\nimport SearchIcon from '@src/assets/icons/searchIcon.svg';\nimport type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport { Shield } from '@src/icons';\nimport SvgArrowLeft from '@src/icons/Arrows/Normal arrows/ArrowLeft';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tCATEGORIES,\n\tCONFIG_TOOL_SOURCES,\n\tINTEGRATIONS_RANK,\n\tisIntegrationSource,\n\ttoolSourceRank,\n} from '../constants/tools';\nimport type { Category, ToolAction, ToolSource } from '../constants/tools';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { renderSourceIcon, sourceIcon, SourceIcon } from '../utils/sourceIcons';\n\nconst metaOf = (item: MentionItem): MentionKindMeta | undefined =>\n\titem.meta as unknown as MentionKindMeta | undefined;\n\nconst rowLabel = (item: MentionItem): string =>\n\tmetaOf(item)?.plainLabel ?? item.label;\n\n/** One navigable row in the picker's current view. */\ntype PickerRowModel = {\n\tid: string;\n\tlabel: string;\n\t/** Drill-in rows show a chevron; leaf (selectable) rows do not. */\n\tdrillsIn: boolean;\n\t/** Leading brand glyph (source rows only). */\n\ticon?: SourceIcon;\n\t/** Brand-coloured \"Create new\" action row (not a selectable item). */\n\tisCreate?: boolean;\n\t/**\n\t * Brand-coloured right-aligned action text (e.g. \"Connect\") shown in place of\n\t * the drill-in chevron — used for an unconnected integration source.\n\t */\n\trightLabel?: string;\n\t/** Tool leaf touches customer-private data → shows a shield glyph. */\n\tauthRequired?: boolean;\n\tonActivate: () => void;\n};\n\n/** Sentinel id for the sub-agent \"Create new\" row. */\nconst CREATE_SUBAGENT_ID = '__bik_create_subagent__';\n\ntype MentionPickerProps = MentionDropdownRenderProps & {\n\t/** Opens the create-sub-agent drawer (shows a \"Create new\" row in the Sub-agent view). */\n\tonCreateSubAgent?: () => void;\n\t/**\n\t * Open already drilled into this tool source (e.g. `'shopify'`) — its tool list\n\t * is shown immediately. */\n\tinitialSource?: string;\n\t/**\n\t * Built-in tool actions (Rest API / Handover to email) shown in the Tools view.\n\t * Picking one opens its config drawer (via `onSelect`) and dismisses the picker\n\t * — it never inserts a mention into the text.\n\t */\n\ttoolActions?: ToolAction[];\n\t/**\n\t * Per-source integration connection state. A source whose value is `false`\n\t * renders a \"Connect\" row (like an unconnected action) instead of drilling in —\n\t * so native source groups (Shopify / BigCommerce / ShipStation) show \"Connect\"\n\t * consistently with the config actions (Slack).\n\t */\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\t/** Open the connect flow for an unconnected source (used by the Connect row). */\n\tonConnectIntegration?: (source: ToolSource) => void;\n};\n\n/**\n * `@` reference picker. Drills:\n * root → Tools → <source> (Manifest / Shopify / …) → tool\n * → Sub-agent → sub-agent\n * (\"Add condition\" and \"Variables\" are intentionally not shown yet.)\n *\n * Owns keyboard navigation (↑/↓ move, →/Enter activate, ← go back) over the\n * CURRENTLY visible rows — registered with the editor via `registerKeyHandler`.\n */\nexport const MentionPicker: React.FC<MentionPickerProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n\tonClose,\n\tonCreateSubAgent,\n\tinitialSource,\n\ttoolActions,\n\tintegrationStatus,\n\tonConnectIntegration,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(initialSource ?? null);\n\t// Non-null when drilled into the consolidated \"Integrations\" group (its member\n\t// sources are shown; picking one drills into that source's tools as usual).\n\tconst [group, setGroup] = useState<'integrations' | null>(null);\n\t// -1 = nothing highlighted; rows highlight only on hover / arrow keys\n\t// (a default highlight reads as a stuck hover state).\n\tconst [activeIndex, setActiveIndex] = useState(-1);\n\t// Search box shown inside a source's tool list (Manifest / Shopify); filters\n\t// that source's tools by name.\n\tconst [search, setSearch] = useState('');\n\n\tconst tools = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'tool'),\n\t\t[items],\n\t);\n\tconst subAgents = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'subagent'),\n\t\t[items],\n\t);\n\tconst sources = useMemo(() => {\n\t\tconst acc: string[] = [];\n\t\ttools.forEach((t) => {\n\t\t\tconst s = metaOf(t)?.source ?? 'other';\n\t\t\tif (!acc.includes(s)) {\n\t\t\t\tacc.push(s);\n\t\t\t}\n\t\t});\n\t\treturn acc;\n\t}, [tools]);\n\t// The built-in \"create\" action per source (Rest API / email / Slack). A source\n\t// with an action drills into [its instances + a \"Create new\" row] — like the\n\t// Sub-agent category — instead of showing a duplicate flat \"create\" row.\n\tconst actionBySource = useMemo(\n\t\t() =>\n\t\t\tnew Map<string, ToolAction>(\n\t\t\t\t(toolActions ?? []).map((a) => [a.source, a]),\n\t\t\t),\n\t\t[toolActions],\n\t);\n\n\t// Show a category when it has items — and ALWAYS show Sub-agent when creating\n\t// one is possible, so an agent with no sub-agents yet still gets the root\n\t// \"Tools / Sub-agent\" choice (with a \"Create new\" inside). When only one is\n\t// available (e.g. the sub-agent drawer offers tools only) the selector is skipped.\n\tconst availableCategories = useMemo(\n\t\t() =>\n\t\t\tCATEGORIES.filter((c) =>\n\t\t\t\tc.key === 'tool'\n\t\t\t\t\t? tools.length > 0 || (toolActions?.length ?? 0) > 0\n\t\t\t\t\t: subAgents.length > 0 || !!onCreateSubAgent,\n\t\t\t),\n\t\t[tools.length, subAgents.length, onCreateSubAgent, toolActions?.length],\n\t);\n\tconst soleCategory =\n\t\tavailableCategories.length === 1 ? availableCategories[0].key : null;\n\tconst activeCategory = category ?? soleCategory;\n\n\t// Title shown above the current view. `onBack` is omitted at a root level (a\n\t// sole category has nowhere to go back to) — the header then shows as a plain\n\t// title. When `onBack` is set the header leads with a back arrow, followed by\n\t// the source icon in a source detail view: `[← back][icon][title]`.\n\tconst header: {\n\t\ttitle: string;\n\t\tonBack?: () => void;\n\t\ticon?: SourceIcon;\n\t} | null = !activeCategory\n\t\t? null\n\t\t: activeCategory === 'subagent'\n\t\t? // Always titled — with a back arrow only when the category chooser is above.\n\t\t {\n\t\t\t\ttitle: 'Sub-agent',\n\t\t\t\tonBack: soleCategory ? undefined : () => setCategory(null),\n\t\t }\n\t\t: source\n\t\t? {\n\t\t\t\ttitle: toolSourceLabel(source),\n\t\t\t\t// Deep-linked to a source (opened from a right-panel source button):\n\t\t\t\t// that source IS the root, so no back arrow. Otherwise back clears the\n\t\t\t\t// source — returning to the Integrations group if we came via it (its\n\t\t\t\t// `group` state is untouched), else to the source chooser.\n\t\t\t\tonBack: initialSource ? undefined : () => setSource(null),\n\t\t\t\ticon: sourceIcon(source),\n\t\t }\n\t\t: group === 'integrations'\n\t\t? { title: 'Integrations', onBack: () => setGroup(null) }\n\t\t: // Always titled — matches the Sub-agent header; back arrow only when the\n\t\t // category chooser is above (i.e. not the sole category).\n\t\t {\n\t\t\t\ttitle: 'Tools',\n\t\t\t\tonBack: soleCategory ? undefined : () => setCategory(null),\n\t\t };\n\n\t// Build the navigable rows for the current view.\n\tconst rows: PickerRowModel[] = useMemo(() => {\n\t\tif (!activeCategory) {\n\t\t\treturn availableCategories.map((c) => ({\n\t\t\t\tid: c.key,\n\t\t\t\tlabel: c.label,\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tsetCategory(c.key);\n\t\t\t\t\tsetSource(null);\n\t\t\t\t\tsetGroup(null);\n\t\t\t\t},\n\t\t\t}));\n\t\t}\n\t\tif (activeCategory === 'subagent') {\n\t\t\tconst sq = search.trim().toLowerCase();\n\t\t\tconst leaves: PickerRowModel[] = subAgents\n\t\t\t\t.filter((item) => !sq || rowLabel(item).toLowerCase().includes(sq))\n\t\t\t\t.map((item) => ({\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tlabel: rowLabel(item),\n\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t\t}));\n\t\t\t// \"Create new\" opens the drawer — first dismiss the menu (strips the \"@\").\n\t\t\tif (onCreateSubAgent) {\n\t\t\t\tleaves.push({\n\t\t\t\t\tid: CREATE_SUBAGENT_ID,\n\t\t\t\t\tlabel: 'Create new',\n\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\tisCreate: true,\n\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\tonCreateSubAgent();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn leaves;\n\t\t}\n\t\tif (!source) {\n\t\t\t// The real sources (from instances) plus any action source (Rest API /\n\t\t\t// email / Slack) with no instances yet, so it still appears for first-time\n\t\t\t// creation. Deduped — no more twin rows.\n\t\t\tconst actionOnly = (toolActions ?? [])\n\t\t\t\t.map((a) => a.source)\n\t\t\t\t.filter((s) => !sources.includes(s));\n\t\t\tconst combined = [...sources, ...actionOnly];\n\n\t\t\t// One drill-in row per source: Connect (unconnected) / a single collapsed\n\t\t\t// leaf / a drill-in. Reused at the top level AND inside the Integrations\n\t\t\t// group so both behave identically.\n\t\t\tconst buildSourceRow = (s: string): PickerRowModel => {\n\t\t\t\tconst action = actionBySource.get(s);\n\t\t\t\t// Not connected → a \"Connect\" row (no drill-in / no instances / no\n\t\t\t\t// \"Create new\"); clicking dismisses the picker and runs the connect\n\t\t\t\t// flow. Applies to config actions (their own `connected`) AND native\n\t\t\t\t// source groups (via `integrationStatus`), so both look consistent.\n\t\t\t\tconst connected =\n\t\t\t\t\taction !== undefined\n\t\t\t\t\t\t? action.connected\n\t\t\t\t\t\t: integrationStatus?.[s as ToolSource];\n\t\t\t\tif (connected === false) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: s,\n\t\t\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\ticon: sourceIcon(s) ?? action?.icon,\n\t\t\t\t\t\trightLabel: 'Connect',\n\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\t\tif (action?.onConnect) {\n\t\t\t\t\t\t\t\taction.onConnect();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonConnectIntegration?.(s as ToolSource);\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}\n\t\t\t\t// A source whose drill-in view would hold exactly one leaf is pointless\n\t\t\t\t// to drill into — surface that single leaf right here (its function name\n\t\t\t\t// + the same source icon). Covers \"no Rest API added yet\" (→ open the\n\t\t\t\t// create modal directly) and a config tool's single capability (Slack →\n\t\t\t\t// \"Send Slack message\", email → \"Send email\").\n\t\t\t\tconst instances = tools.filter(\n\t\t\t\t\t(t) => (metaOf(t)?.source ?? 'other') === s,\n\t\t\t\t);\n\t\t\t\tif (instances.length + (action ? 1 : 0) === 1) {\n\t\t\t\t\tconst icon = sourceIcon(s) ?? action?.icon;\n\t\t\t\t\tif (action) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: s,\n\t\t\t\t\t\t\tlabel: action.label,\n\t\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\t\ticon,\n\t\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\t\t\taction.onSelect();\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\tconst only = instances[0];\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: String(only.id),\n\t\t\t\t\t\tlabel: rowLabel(only),\n\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\ticon,\n\t\t\t\t\t\tauthRequired: metaOf(only)?.authRequired,\n\t\t\t\t\t\tonActivate: () => onSelect(only),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: s,\n\t\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\t\tdrillsIn: true,\n\t\t\t\t\ticon: sourceIcon(s) ?? action?.icon,\n\t\t\t\t\tonActivate: () => setSource(s),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// Inside the Integrations group: just its member sources, ranked.\n\t\t\tif (group === 'integrations') {\n\t\t\t\treturn combined\n\t\t\t\t\t.filter(isIntegrationSource)\n\t\t\t\t\t.sort((a, b) => toolSourceRank(a) - toolSourceRank(b))\n\t\t\t\t\t.map(buildSourceRow);\n\t\t\t}\n\n\t\t\t// Top level: non-integration sources as their own rows, plus ONE\n\t\t\t// \"Integrations\" drill-in row (only when a member exists). Fixed rank order\n\t\t\t// so adding/updating a tool never reshuffles the picker rows.\n\t\t\tconst topRows = combined\n\t\t\t\t.filter((s) => !isIntegrationSource(s))\n\t\t\t\t.map((s) => ({ rank: toolSourceRank(s), row: buildSourceRow(s) }));\n\t\t\tif (combined.some(isIntegrationSource)) {\n\t\t\t\ttopRows.push({\n\t\t\t\t\trank: INTEGRATIONS_RANK,\n\t\t\t\t\trow: {\n\t\t\t\t\t\tid: '__integrations__',\n\t\t\t\t\t\tlabel: 'Integrations',\n\t\t\t\t\t\tdrillsIn: true,\n\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\tsetGroup('integrations');\n\t\t\t\t\t\t\tsetSource(null);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn topRows.sort((a, b) => a.rank - b.rank).map((x) => x.row);\n\t\t}\n\t\tconst q = search.trim().toLowerCase();\n\t\tconst leaves: PickerRowModel[] = tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\n\t\t\t.filter((t) => !q || rowLabel(t).toLowerCase().includes(q))\n\t\t\t.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tauthRequired: metaOf(item)?.authRequired,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t// A configurable source's add row, below any existing instances, opening\n\t\t// its drawer. Config tools (Slack / email) are a single fixed capability →\n\t\t// render like a normal tool leaf (label only, no icon — matching the tool\n\t\t// rows). Rest API instances are user-created, so its \"add\" stays a\n\t\t// brand-coloured create row.\n\t\tconst action = actionBySource.get(source);\n\t\tif (action) {\n\t\t\tconst isConfigTool = source in CONFIG_TOOL_SOURCES;\n\t\t\tleaves.push({\n\t\t\t\tid: `create:${source}`,\n\t\t\t\tlabel: action.label,\n\t\t\t\tdrillsIn: false,\n\t\t\t\tisCreate: !isConfigTool,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tonClose?.();\n\t\t\t\t\taction.onSelect();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn leaves;\n\t}, [\n\t\tactiveCategory,\n\t\tavailableCategories,\n\t\tsource,\n\t\tgroup,\n\t\tsearch,\n\t\ttools,\n\t\tsubAgents,\n\t\tsources,\n\t\tonSelect,\n\t\tonClose,\n\t\tonCreateSubAgent,\n\t\ttoolActions,\n\t\tactionBySource,\n\t\tintegrationStatus,\n\t\tonConnectIntegration,\n\t]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(\n\t\t() => setActiveIndex(-1),\n\t\t[activeCategory, source, group, search, items],\n\t);\n\t// Clear the search box when leaving a source view.\n\tuseEffect(() => setSearch(''), [activeCategory, source, group]);\n\n\t// Keep the latest rows/index reachable from the stable key handler.\n\tconst navRef = useRef({ rows, activeIndex, header });\n\tnavRef.current = { rows, activeIndex, header };\n\n\tuseEffect(() => {\n\t\tif (!registerKeyHandler) {\n\t\t\treturn;\n\t\t}\n\t\tregisterKeyHandler((event) => {\n\t\t\tconst { rows: r, activeIndex: i, header: h } = navRef.current;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + r.length - 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\tcase 'Enter':\n\t\t\t\t\t// Nothing highlighted yet → treat the first row as the target so\n\t\t\t\t\t// the editor's @-flow (type, then Enter) still works.\n\t\t\t\t\t(r[i] ?? r[0])?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h?.onBack) {\n\t\t\t\t\t\th.onBack();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn () => registerKeyHandler(null);\n\t}, [registerKeyHandler]);\n\n\tconst variant = !activeCategory\n\t\t? 'categories'\n\t\t: rows.length && !rows[0].drillsIn\n\t\t? 'items'\n\t\t: 'sources';\n\n\t// Search lives inside a source's tool list (Manifest / Shopify) and in the\n\t// sub-agent list.\n\tconst showSearch =\n\t\t(activeCategory === 'tool' && !!source) || activeCategory === 'subagent';\n\n\treturn (\n\t\t<PickerCard className={`bik-mention-picker bik-mention-picker--${variant}`}>\n\t\t\t{header && (\n\t\t\t\t<PickerBack\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={header.onBack}\n\t\t\t\t\tdisabled={!header.onBack}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: COLORS.surface.subdued,\n\t\t\t\t\t\tcursor: header.onBack ? 'pointer' : 'default',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{header.onBack && (\n\t\t\t\t\t\t<SvgArrowLeft\n\t\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\t\theight={20}\n\t\t\t\t\t\t\tcolor={COLORS.content.primary}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{header.icon && renderSourceIcon(header.icon)}\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\n\t\t\t)}\n\t\t\t{showSearch && (\n\t\t\t\t<PickerSearchRow>\n\t\t\t\t\t<SearchIcon\n\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\theight={20}\n\t\t\t\t\t\tcolor={COLORS.content.placeholder}\n\t\t\t\t\t/>\n\t\t\t\t\t<PickerSearchInput\n\t\t\t\t\t\t// Focus on open so the user can type immediately (appears only\n\t\t\t\t\t\t// after they drill into a source).\n\t\t\t\t\t\t// eslint-disable-next-line jsx-a11y/no-autofocus\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\tdata-test=\"mention-picker-search\"\n\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\tif (!rows.length) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (e.key === 'ArrowDown') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetActiveIndex((p) => (p + 1) % rows.length);\n\t\t\t\t\t\t\t} else if (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetActiveIndex((p) => (p + rows.length - 1) % rows.length);\n\t\t\t\t\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t(rows[activeIndex] ?? rows[0])?.onActivate();\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</PickerSearchRow>\n\t\t\t)}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<PickerEmpty>\n\t\t\t\t\t{activeCategory === 'subagent' ? null : 'No tools available'}\n\t\t\t\t</PickerEmpty>\n\t\t\t) : (\n\t\t\t\trows.map((row, i) => (\n\t\t\t\t\t<PickerRow\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={i === activeIndex}\n\t\t\t\t\t\tonMouseEnter={() => setActiveIndex(i)}\n\t\t\t\t\t\tonMouseLeave={() => setActiveIndex(-1)}\n\t\t\t\t\t\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.isCreate ? (\n\t\t\t\t\t\t\t<CreateRowText>{row.label}</CreateRowText>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<PickerRowMain>\n\t\t\t\t\t\t\t\t\t{renderSourceIcon(row.icon)}\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t\t{row.authRequired && (\n\t\t\t\t\t\t\t\t\t\t<Shield\n\t\t\t\t\t\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"This tool requires customer verification\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</PickerRowMain>\n\t\t\t\t\t\t\t\t{row.rightLabel ? (\n\t\t\t\t\t\t\t\t\t<RightActionText>{row.rightLabel}</RightActionText>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\trow.drillsIn && <ChevronRight width={12} height={12} />\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</PickerRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t\t{rows.some((row) => row.authRequired) && (\n\t\t\t\t<PickerLegend>\n\t\t\t\t\t<Shield size={14} />\n\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\tThis tool requires customer verification\n\t\t\t\t\t</BodyCaption>\n\t\t\t\t</PickerLegend>\n\t\t\t)}\n\t\t</PickerCard>\n\t);\n};\n\nconst PickerCard = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 240px;\n\tmax-height: 301px;\n\toverflow-y: auto;\n\tbackground: ${COLORS.surface.standard};\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 4px;\n\tbox-shadow: 0px -2px 8px 0px #0000001f;\n`;\n\n// Search box at the top of a source's tool list (Manifest / Shopify).\nconst PickerSearchRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 10px 12px;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n`;\n\nconst PickerSearchInput = styled.input`\n\tflex: 1;\n\tmin-width: 0;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tcolor: ${COLORS.content.primary};\n\n\t&::placeholder {\n\t\tcolor: ${COLORS.content.placeholder};\n\t}\n`;\n\nconst PickerRow = styled.button<{ $active?: boolean }>`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tgap: 2px;\n\twidth: 100%;\n\tpadding: 8px 10px;\n\theight: 48px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: ${(p) => (p.$active ? COLORS.surface.subdued : 'transparent')};\n\tcursor: pointer;\n\ttext-align: left;\n\n\t&:hover {\n\t\tbackground: ${COLORS.surface.hovered};\n\t}\n`;\n\n// Left cluster: leading source glyph + label (chevron stays right via PickerRow).\nconst PickerRowMain = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmin-width: 0;\n`;\n\n// Footer legend, shown when the list holds any auth-required tool.\nconst PickerLegend = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 12px;\n\tborder-top: 1px solid ${COLORS.stroke.primary};\n`;\n\n// Right-aligned brand action text (e.g. \"Connect\") in place of the chevron.\nconst RightActionText = styled.span`\n\tflex-shrink: 0;\n\tcolor: ${COLORS.content.brand};\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n`;\n\n// \"Create new\" — centered brand text, no icon (matches the side-panel dropdown).\nconst CreateRowText = styled.div`\n\twidth: 100%;\n\ttext-align: center;\n\tcolor: ${COLORS.content.brand};\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tfont-weight: 600;\n`;\n\nconst PickerBack = styled.button`\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 12px 16px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\theight: 48px;\n\tgap: 4px;\n`;\n\nconst PickerEmpty = styled.div`\n\tpadding: 12px 10px;\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tcolor: ${COLORS.content.secondary};\n`;\n"],"names":["metaOf","item","rowLabel","CREATE_SUBAGENT_ID","MentionPicker","items","onSelect","registerKeyHandler","onClose","onCreateSubAgent","initialSource","toolActions","integrationStatus","onConnectIntegration","category","setCategory","useState","source","setSource","group","setGroup","activeIndex","setActiveIndex","search","setSearch","tools","useMemo","i","subAgents","sources","acc","t","s","actionBySource","a","availableCategories","CATEGORIES","c","soleCategory","activeCategory","header","toolSourceLabel","sourceIcon","rows","sq","leaves","actionOnly","combined","buildSourceRow","action","instances","icon","only","isIntegrationSource","b","toolSourceRank","topRows","INTEGRATIONS_RANK","x","q","isConfigTool","CONFIG_TOOL_SOURCES","useEffect","navRef","useRef","event","h","variant","showSearch","jsxs","PickerCard","PickerBack","COLORS","jsx","SvgArrowLeft","renderSourceIcon","TitleSmall","PickerSearchRow","SearchIcon","PickerSearchInput","p","PickerEmpty","row","PickerRow","CreateRowText","Fragment","PickerRowMain","BodySecondary","Shield","RightActionText","ChevronRight","PickerLegend","BodyCaption","styled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MentionPicker.js","sources":["../../../../../src/components/agent-builder/components/MentionPicker.tsx"],"sourcesContent":["// import ChevronLeft from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRight from '@src/assets/icons/chevronRight.svg';\nimport SearchIcon from '@src/assets/icons/searchIcon.svg';\nimport type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport { Shield } from '@src/icons';\nimport SvgArrowLeft from '@src/icons/Arrows/Normal arrows/ArrowLeft';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tCATEGORIES,\n\tCONFIG_TOOL_SOURCES,\n\tINTEGRATIONS_RANK,\n\tisIntegrationSource,\n\ttoolSourceRank,\n} from '../constants/tools';\nimport type { Category, ToolAction, ToolSource } from '../constants/tools';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { renderSourceIcon, sourceIcon, SourceIcon } from '../utils/sourceIcons';\n\nconst metaOf = (item: MentionItem): MentionKindMeta | undefined =>\n\titem.meta as unknown as MentionKindMeta | undefined;\n\nconst rowLabel = (item: MentionItem): string =>\n\tmetaOf(item)?.plainLabel ?? item.label;\n\n/** One navigable row in the picker's current view. */\ntype PickerRowModel = {\n\tid: string;\n\tlabel: string;\n\t/** Drill-in rows show a chevron; leaf (selectable) rows do not. */\n\tdrillsIn: boolean;\n\t/** Leading brand glyph (source rows only). */\n\ticon?: SourceIcon;\n\t/** Brand-coloured \"Create new\" action row (not a selectable item). */\n\tisCreate?: boolean;\n\t/**\n\t * Brand-coloured right-aligned action text (e.g. \"Connect\") shown in place of\n\t * the drill-in chevron — used for an unconnected integration source.\n\t */\n\trightLabel?: string;\n\t/** Tool leaf touches customer-private data → shows a shield glyph. */\n\tauthRequired?: boolean;\n\tonActivate: () => void;\n};\n\n/** Sentinel id for the sub-agent \"Create new\" row. */\nconst CREATE_SUBAGENT_ID = '__bik_create_subagent__';\n\ntype MentionPickerProps = MentionDropdownRenderProps & {\n\t/** Opens the create-sub-agent drawer (shows a \"Create new\" row in the Sub-agent view). */\n\tonCreateSubAgent?: () => void;\n\t/**\n\t * Open already drilled into this tool source (e.g. `'shopify'`) — its tool list\n\t * is shown immediately. */\n\tinitialSource?: string;\n\t/**\n\t * Built-in tool actions (Rest API / Handover to email) shown in the Tools view.\n\t * Picking one opens its config drawer (via `onSelect`) and dismisses the picker\n\t * — it never inserts a mention into the text.\n\t */\n\ttoolActions?: ToolAction[];\n\t/**\n\t * Per-source integration connection state. A source whose value is `false`\n\t * renders a \"Connect\" row (like an unconnected action) instead of drilling in —\n\t * so native source groups (Shopify / BigCommerce / ShipStation) show \"Connect\"\n\t * consistently with the config actions (Slack).\n\t */\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\t/** Open the connect flow for an unconnected source (used by the Connect row). */\n\tonConnectIntegration?: (source: ToolSource) => void;\n};\n\n/**\n * `@` reference picker. Drills:\n * root → Tools → <source> (Manifest / Shopify / …) → tool\n * → Sub-agent → sub-agent\n * (\"Add condition\" and \"Variables\" are intentionally not shown yet.)\n *\n * Owns keyboard navigation (↑/↓ move, →/Enter activate, ← go back) over the\n * CURRENTLY visible rows — registered with the editor via `registerKeyHandler`.\n */\nexport const MentionPicker: React.FC<MentionPickerProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n\tonClose,\n\tonCreateSubAgent,\n\tinitialSource,\n\ttoolActions,\n\tintegrationStatus,\n\tonConnectIntegration,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(initialSource ?? null);\n\t// Non-null when drilled into the consolidated \"Integrations\" group (its member\n\t// sources are shown; picking one drills into that source's tools as usual).\n\tconst [group, setGroup] = useState<'integrations' | null>(null);\n\t// -1 = nothing highlighted; rows highlight only on hover / arrow keys\n\t// (a default highlight reads as a stuck hover state).\n\tconst [activeIndex, setActiveIndex] = useState(-1);\n\t// Search box shown inside a source's tool list (Manifest / Shopify); filters\n\t// that source's tools by name.\n\tconst [search, setSearch] = useState('');\n\n\tconst tools = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'tool'),\n\t\t[items],\n\t);\n\tconst subAgents = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'subagent'),\n\t\t[items],\n\t);\n\tconst sources = useMemo(() => {\n\t\tconst acc: string[] = [];\n\t\ttools.forEach((t) => {\n\t\t\tconst s = metaOf(t)?.source ?? 'other';\n\t\t\tif (!acc.includes(s)) {\n\t\t\t\tacc.push(s);\n\t\t\t}\n\t\t});\n\t\treturn acc;\n\t}, [tools]);\n\t// The built-in \"create\" action per source (Rest API / email / Slack). A source\n\t// with an action drills into [its instances + a \"Create new\" row] — like the\n\t// Sub-agent category — instead of showing a duplicate flat \"create\" row.\n\tconst actionBySource = useMemo(\n\t\t() =>\n\t\t\tnew Map<string, ToolAction>(\n\t\t\t\t(toolActions ?? []).map((a) => [a.source, a]),\n\t\t\t),\n\t\t[toolActions],\n\t);\n\n\t// Show a category when it has items — and ALWAYS show Sub-agent when creating\n\t// one is possible, so an agent with no sub-agents yet still gets the root\n\t// \"Tools / Sub-agent\" choice (with a \"Create new\" inside). When only one is\n\t// available (e.g. the sub-agent drawer offers tools only) the selector is skipped.\n\tconst availableCategories = useMemo(\n\t\t() =>\n\t\t\tCATEGORIES.filter((c) =>\n\t\t\t\tc.key === 'tool'\n\t\t\t\t\t? tools.length > 0 || (toolActions?.length ?? 0) > 0\n\t\t\t\t\t: subAgents.length > 0 || !!onCreateSubAgent,\n\t\t\t),\n\t\t[tools.length, subAgents.length, onCreateSubAgent, toolActions?.length],\n\t);\n\tconst soleCategory =\n\t\tavailableCategories.length === 1 ? availableCategories[0].key : null;\n\tconst activeCategory = category ?? soleCategory;\n\n\t// Title shown above the current view. `onBack` is omitted at a root level (a\n\t// sole category has nowhere to go back to) — the header then shows as a plain\n\t// title. When `onBack` is set the header leads with a back arrow, followed by\n\t// the source icon in a source detail view: `[← back][icon][title]`.\n\tconst header: {\n\t\ttitle: string;\n\t\tonBack?: () => void;\n\t\ticon?: SourceIcon;\n\t} | null = !activeCategory\n\t\t? null\n\t\t: activeCategory === 'subagent'\n\t\t? // Always titled — with a back arrow only when the category chooser is above.\n\t\t {\n\t\t\t\ttitle: 'Sub-agent',\n\t\t\t\tonBack: soleCategory ? undefined : () => setCategory(null),\n\t\t }\n\t\t: source\n\t\t? {\n\t\t\t\ttitle: toolSourceLabel(source),\n\t\t\t\t// Deep-linked to a source (opened from a right-panel source button):\n\t\t\t\t// that source IS the root, so no back arrow. Otherwise back clears the\n\t\t\t\t// source — returning to the Integrations group if we came via it (its\n\t\t\t\t// `group` state is untouched), else to the source chooser.\n\t\t\t\tonBack: initialSource ? undefined : () => setSource(null),\n\t\t\t\ticon: sourceIcon(source),\n\t\t }\n\t\t: group === 'integrations'\n\t\t? { title: 'Integrations', onBack: () => setGroup(null) }\n\t\t: // Always titled — matches the Sub-agent header; back arrow only when the\n\t\t // category chooser is above (i.e. not the sole category).\n\t\t {\n\t\t\t\ttitle: 'Tools',\n\t\t\t\tonBack: soleCategory ? undefined : () => setCategory(null),\n\t\t };\n\n\t// Build the navigable rows for the current view.\n\tconst rows: PickerRowModel[] = useMemo(() => {\n\t\tif (!activeCategory) {\n\t\t\treturn availableCategories.map((c) => ({\n\t\t\t\tid: c.key,\n\t\t\t\tlabel: c.label,\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tsetCategory(c.key);\n\t\t\t\t\tsetSource(null);\n\t\t\t\t\tsetGroup(null);\n\t\t\t\t},\n\t\t\t}));\n\t\t}\n\t\tif (activeCategory === 'subagent') {\n\t\t\tconst sq = search.trim().toLowerCase();\n\t\t\tconst leaves: PickerRowModel[] = subAgents\n\t\t\t\t.filter((item) => !sq || rowLabel(item).toLowerCase().includes(sq))\n\t\t\t\t.map((item) => ({\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tlabel: rowLabel(item),\n\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t\t}));\n\t\t\t// \"Create new\" opens the drawer — first dismiss the menu (strips the \"@\").\n\t\t\tif (onCreateSubAgent) {\n\t\t\t\tleaves.push({\n\t\t\t\t\tid: CREATE_SUBAGENT_ID,\n\t\t\t\t\tlabel: 'Create new',\n\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\tisCreate: true,\n\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\tonCreateSubAgent();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn leaves;\n\t\t}\n\t\tif (!source) {\n\t\t\t// The real sources (from instances) plus any action source (Rest API /\n\t\t\t// email / Slack) with no instances yet, so it still appears for first-time\n\t\t\t// creation. Deduped — no more twin rows.\n\t\t\tconst actionOnly = (toolActions ?? [])\n\t\t\t\t.map((a) => a.source)\n\t\t\t\t.filter((s) => !sources.includes(s));\n\t\t\tconst combined = [...sources, ...actionOnly];\n\n\t\t\t// One drill-in row per source: Connect (unconnected) / a single collapsed\n\t\t\t// leaf / a drill-in. Reused at the top level AND inside the Integrations\n\t\t\t// group so both behave identically.\n\t\t\tconst buildSourceRow = (s: string): PickerRowModel => {\n\t\t\t\tconst action = actionBySource.get(s);\n\t\t\t\t// Not connected → a \"Connect\" row (no drill-in / no instances / no\n\t\t\t\t// \"Create new\"); clicking dismisses the picker and runs the connect\n\t\t\t\t// flow. Applies to config actions (their own `connected`) AND native\n\t\t\t\t// source groups (via `integrationStatus`), so both look consistent.\n\t\t\t\tconst connected =\n\t\t\t\t\taction !== undefined\n\t\t\t\t\t\t? action.connected\n\t\t\t\t\t\t: integrationStatus?.[s as ToolSource];\n\t\t\t\tif (connected === false) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: s,\n\t\t\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\ticon: sourceIcon(s) ?? action?.icon,\n\t\t\t\t\t\trightLabel: 'Connect',\n\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\t\tif (action?.onConnect) {\n\t\t\t\t\t\t\t\taction.onConnect();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonConnectIntegration?.(s as ToolSource);\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}\n\t\t\t\t// A source whose drill-in view would hold exactly one leaf is pointless\n\t\t\t\t// to drill into — surface that single leaf right here (its function name\n\t\t\t\t// + the same source icon). Covers \"no Rest API added yet\" (→ open the\n\t\t\t\t// create modal directly) and a config tool's single capability (Slack →\n\t\t\t\t// \"Send Slack message\", email → \"Send email\").\n\t\t\t\tconst instances = tools.filter(\n\t\t\t\t\t(t) => (metaOf(t)?.source ?? 'other') === s,\n\t\t\t\t);\n\t\t\t\tif (instances.length + (action ? 1 : 0) === 1) {\n\t\t\t\t\tconst icon = sourceIcon(s) ?? action?.icon;\n\t\t\t\t\tif (action) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: s,\n\t\t\t\t\t\t\tlabel: action.label,\n\t\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\t\ticon,\n\t\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\t\tonClose?.();\n\t\t\t\t\t\t\t\taction.onSelect();\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\tconst only = instances[0];\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: String(only.id),\n\t\t\t\t\t\tlabel: rowLabel(only),\n\t\t\t\t\t\tdrillsIn: false,\n\t\t\t\t\t\ticon,\n\t\t\t\t\t\tauthRequired: metaOf(only)?.authRequired,\n\t\t\t\t\t\tonActivate: () => onSelect(only),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: s,\n\t\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\t\tdrillsIn: true,\n\t\t\t\t\ticon: sourceIcon(s) ?? action?.icon,\n\t\t\t\t\tonActivate: () => setSource(s),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// Inside the Integrations group: just its member sources, ranked.\n\t\t\tif (group === 'integrations') {\n\t\t\t\treturn combined\n\t\t\t\t\t.filter(isIntegrationSource)\n\t\t\t\t\t.sort((a, b) => toolSourceRank(a) - toolSourceRank(b))\n\t\t\t\t\t.map(buildSourceRow);\n\t\t\t}\n\n\t\t\t// Top level: non-integration sources as their own rows, plus ONE\n\t\t\t// \"Integrations\" drill-in row (only when a member exists). Fixed rank order\n\t\t\t// so adding/updating a tool never reshuffles the picker rows.\n\t\t\tconst topRows = combined\n\t\t\t\t.filter((s) => !isIntegrationSource(s))\n\t\t\t\t.map((s) => ({ rank: toolSourceRank(s), row: buildSourceRow(s) }));\n\t\t\tif (combined.some(isIntegrationSource)) {\n\t\t\t\ttopRows.push({\n\t\t\t\t\trank: INTEGRATIONS_RANK,\n\t\t\t\t\trow: {\n\t\t\t\t\t\tid: '__integrations__',\n\t\t\t\t\t\tlabel: 'Integrations',\n\t\t\t\t\t\tdrillsIn: true,\n\t\t\t\t\t\tonActivate: () => {\n\t\t\t\t\t\t\tsetGroup('integrations');\n\t\t\t\t\t\t\tsetSource(null);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn topRows.sort((a, b) => a.rank - b.rank).map((x) => x.row);\n\t\t}\n\t\tconst q = search.trim().toLowerCase();\n\t\tconst leaves: PickerRowModel[] = tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\n\t\t\t.filter((t) => !q || rowLabel(t).toLowerCase().includes(q))\n\t\t\t.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tauthRequired: metaOf(item)?.authRequired,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t// A configurable source's add row, below any existing instances, opening\n\t\t// its drawer. Config tools (Slack / email) are a single fixed capability →\n\t\t// render like a normal tool leaf (label only, no icon — matching the tool\n\t\t// rows). Rest API instances are user-created, so its \"add\" stays a\n\t\t// brand-coloured create row.\n\t\tconst action = actionBySource.get(source);\n\t\tif (action) {\n\t\t\tconst isConfigTool = source in CONFIG_TOOL_SOURCES;\n\t\t\tleaves.push({\n\t\t\t\tid: `create:${source}`,\n\t\t\t\tlabel: action.label,\n\t\t\t\tdrillsIn: false,\n\t\t\t\tisCreate: !isConfigTool,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tonClose?.();\n\t\t\t\t\taction.onSelect();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn leaves;\n\t}, [\n\t\tactiveCategory,\n\t\tavailableCategories,\n\t\tsource,\n\t\tgroup,\n\t\tsearch,\n\t\ttools,\n\t\tsubAgents,\n\t\tsources,\n\t\tonSelect,\n\t\tonClose,\n\t\tonCreateSubAgent,\n\t\ttoolActions,\n\t\tactionBySource,\n\t\tintegrationStatus,\n\t\tonConnectIntegration,\n\t]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(\n\t\t() => setActiveIndex(-1),\n\t\t[activeCategory, source, group, search, items],\n\t);\n\t// Clear the search box when leaving a source view.\n\tuseEffect(() => setSearch(''), [activeCategory, source, group]);\n\n\t// Keep the latest rows/index reachable from the stable key handler.\n\tconst navRef = useRef({ rows, activeIndex, header });\n\tnavRef.current = { rows, activeIndex, header };\n\n\tuseEffect(() => {\n\t\tif (!registerKeyHandler) {\n\t\t\treturn;\n\t\t}\n\t\tregisterKeyHandler((event) => {\n\t\t\tconst { rows: r, activeIndex: i, header: h } = navRef.current;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + r.length - 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\tcase 'Enter':\n\t\t\t\t\t// Nothing highlighted yet → treat the first row as the target so\n\t\t\t\t\t// the editor's @-flow (type, then Enter) still works.\n\t\t\t\t\t(r[i] ?? r[0])?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h?.onBack) {\n\t\t\t\t\t\th.onBack();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn () => registerKeyHandler(null);\n\t}, [registerKeyHandler]);\n\n\tconst variant = !activeCategory\n\t\t? 'categories'\n\t\t: rows.length && !rows[0].drillsIn\n\t\t? 'items'\n\t\t: 'sources';\n\n\t// Search lives inside a source's tool list (Manifest / Shopify) and in the\n\t// sub-agent list.\n\tconst showSearch =\n\t\t(activeCategory === 'tool' && !!source) || activeCategory === 'subagent';\n\n\treturn (\n\t\t<PickerCard className={`bik-mention-picker bik-mention-picker--${variant}`}>\n\t\t\t{header && (\n\t\t\t\t<PickerBack\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={header.onBack}\n\t\t\t\t\tdisabled={!header.onBack}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: COLORS.surface.subdued,\n\t\t\t\t\t\tcursor: header.onBack ? 'pointer' : 'default',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{header.onBack && (\n\t\t\t\t\t\t<SvgArrowLeft\n\t\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\t\theight={20}\n\t\t\t\t\t\t\tcolor={COLORS.content.primary}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{header.icon && renderSourceIcon(header.icon)}\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\n\t\t\t)}\n\t\t\t{showSearch && (\n\t\t\t\t<PickerSearchRow>\n\t\t\t\t\t<SearchIcon\n\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\theight={20}\n\t\t\t\t\t\tcolor={COLORS.content.placeholder}\n\t\t\t\t\t/>\n\t\t\t\t\t<PickerSearchInput\n\t\t\t\t\t\t// Focus on open so the user can type immediately (appears only\n\t\t\t\t\t\t// after they drill into a source).\n\t\t\t\t\t\t// eslint-disable-next-line jsx-a11y/no-autofocus\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\tdata-test=\"mention-picker-search\"\n\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\tif (!rows.length) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (e.key === 'ArrowDown') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetActiveIndex((p) => (p + 1) % rows.length);\n\t\t\t\t\t\t\t} else if (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tsetActiveIndex((p) => (p + rows.length - 1) % rows.length);\n\t\t\t\t\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t(rows[activeIndex] ?? rows[0])?.onActivate();\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</PickerSearchRow>\n\t\t\t)}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<PickerEmpty>\n\t\t\t\t\t{activeCategory === 'subagent' ? null : 'No tools available'}\n\t\t\t\t</PickerEmpty>\n\t\t\t) : (\n\t\t\t\trows.map((row, i) => (\n\t\t\t\t\t<PickerRow\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={i === activeIndex}\n\t\t\t\t\t\tonMouseEnter={() => setActiveIndex(i)}\n\t\t\t\t\t\tonMouseLeave={() => setActiveIndex(-1)}\n\t\t\t\t\t\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.isCreate ? (\n\t\t\t\t\t\t\t<CreateRowText>{row.label}</CreateRowText>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<PickerRowMain>\n\t\t\t\t\t\t\t\t\t{renderSourceIcon(row.icon)}\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t\t{row.authRequired && (\n\t\t\t\t\t\t\t\t\t\t<Shield\n\t\t\t\t\t\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"This tool requires customer verification\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</PickerRowMain>\n\t\t\t\t\t\t\t\t{row.rightLabel ? (\n\t\t\t\t\t\t\t\t\t<RightActionText>{row.rightLabel}</RightActionText>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\trow.drillsIn && <ChevronRight width={12} height={12} />\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</PickerRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t\t{rows.some((row) => row.authRequired) && (\n\t\t\t\t<PickerLegend>\n\t\t\t\t\t<Shield size={14} />\n\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\tThis tool requires customer verification\n\t\t\t\t\t</BodyCaption>\n\t\t\t\t</PickerLegend>\n\t\t\t)}\n\t\t</PickerCard>\n\t);\n};\n\nconst PickerCard = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 240px;\n\tmax-height: 301px;\n\toverflow-y: auto;\n\tbackground: ${COLORS.surface.standard};\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 4px;\n\tbox-shadow: 0px -2px 8px 0px #0000001f;\n`;\n\n// Search box at the top of a source's tool list (Manifest / Shopify).\nconst PickerSearchRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 10px 12px;\n\tflex-shrink: 0;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n`;\n\nconst PickerSearchInput = styled.input`\n\tflex: 1;\n\tmin-width: 0;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tcolor: ${COLORS.content.primary};\n\n\t&::placeholder {\n\t\tcolor: ${COLORS.content.placeholder};\n\t}\n`;\n\nconst PickerRow = styled.button<{ $active?: boolean }>`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tgap: 2px;\n\twidth: 100%;\n\tpadding: 8px 10px;\n\theight: 48px;\n\t/* The card is a flex column with a max-height; without these a long list\n\t compresses its rows below 48px (why only the short first step looked right)\n\t instead of scrolling. Pin the row so the card scrolls instead. */\n\tbox-sizing: border-box;\n\tflex-shrink: 0;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: ${(p) => (p.$active ? COLORS.surface.subdued : 'transparent')};\n\tcursor: pointer;\n\ttext-align: left;\n\n\t&:hover {\n\t\tbackground: ${COLORS.surface.hovered};\n\t}\n`;\n\n// Left cluster: leading source glyph + label (chevron stays right via PickerRow).\nconst PickerRowMain = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmin-width: 0;\n`;\n\n// Footer legend, shown when the list holds any auth-required tool.\nconst PickerLegend = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 12px;\n\tborder-top: 1px solid ${COLORS.stroke.primary};\n`;\n\n// Right-aligned brand action text (e.g. \"Connect\") in place of the chevron.\nconst RightActionText = styled.span`\n\tflex-shrink: 0;\n\tcolor: ${COLORS.content.brand};\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n`;\n\n// \"Create new\" — centered brand text, no icon (matches the side-panel dropdown).\nconst CreateRowText = styled.div`\n\twidth: 100%;\n\ttext-align: center;\n\tcolor: ${COLORS.content.brand};\n\tfont-family: Inter;\n\tfont-size: 14px;\n\tfont-weight: 600;\n`;\n\nconst PickerBack = styled.button`\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 12px 16px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\theight: 48px;\n\tbox-sizing: border-box;\n\tflex-shrink: 0;\n\tgap: 4px;\n`;\n\nconst PickerEmpty = styled.div`\n\tpadding: 12px 10px;\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tcolor: ${COLORS.content.secondary};\n`;\n"],"names":["metaOf","item","rowLabel","CREATE_SUBAGENT_ID","MentionPicker","items","onSelect","registerKeyHandler","onClose","onCreateSubAgent","initialSource","toolActions","integrationStatus","onConnectIntegration","category","setCategory","useState","source","setSource","group","setGroup","activeIndex","setActiveIndex","search","setSearch","tools","useMemo","i","subAgents","sources","acc","t","s","actionBySource","a","availableCategories","CATEGORIES","c","soleCategory","activeCategory","header","toolSourceLabel","sourceIcon","rows","sq","leaves","actionOnly","combined","buildSourceRow","action","instances","icon","only","isIntegrationSource","b","toolSourceRank","topRows","INTEGRATIONS_RANK","x","q","isConfigTool","CONFIG_TOOL_SOURCES","useEffect","navRef","useRef","event","h","variant","showSearch","jsxs","PickerCard","PickerBack","COLORS","jsx","SvgArrowLeft","renderSourceIcon","TitleSmall","PickerSearchRow","SearchIcon","PickerSearchInput","p","PickerEmpty","row","PickerRow","CreateRowText","Fragment","PickerRowMain","BodySecondary","Shield","RightActionText","ChevronRight","PickerLegend","BodyCaption","styled"],"mappings":"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"}
|