@bikdotai/bik-component-library 0.0.821-beta.0 → 0.0.821-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/agent-builder/AgentBuilder.js +1 -1
- package/dist/cjs/components/agent-builder/AgentBuilder.js.map +1 -1
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js +152 -60
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +2 -0
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/MentionEditor.js +2 -0
- package/dist/cjs/components/agent-builder/components/MentionEditor.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/MentionField.js +2 -0
- package/dist/cjs/components/agent-builder/components/MentionField.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/MentionPicker.js +12 -12
- package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js +1 -1
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/UndoToast.js +2 -0
- package/dist/cjs/components/agent-builder/components/UndoToast.js.map +1 -0
- package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js +1 -1
- package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
- package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
- package/dist/cjs/components/agent-builder/utils/mentionSerialization.js +3 -3
- package/dist/cjs/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentListing.js +1 -1
- package/dist/cjs/components/agent-listing/AgentListing.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentListingFilters.js +1 -1
- package/dist/cjs/components/agent-listing/AgentListingFilters.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentTable.js +1 -1
- package/dist/cjs/components/agent-listing/AgentTable.js.map +1 -1
- package/dist/cjs/components/agent-listing/AgentTableRow.js +1 -1
- package/dist/cjs/components/agent-listing/AgentTableRow.js.map +1 -1
- package/dist/cjs/components/agent-listing/DeleteAgentModal.js +2 -0
- package/dist/cjs/components/agent-listing/DeleteAgentModal.js.map +1 -0
- package/dist/esm/components/agent-builder/AgentBuilder.js +141 -128
- package/dist/esm/components/agent-builder/AgentBuilder.js.map +1 -1
- package/dist/esm/components/agent-builder/AgentBuilder.model.d.ts +34 -0
- package/dist/esm/components/agent-builder/AgentBuilder.styled.d.ts +34 -0
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js +206 -82
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +25 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +207 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -0
- package/dist/esm/components/agent-builder/components/MentionEditor.d.ts +33 -0
- package/dist/esm/components/agent-builder/components/MentionEditor.js +99 -0
- package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -0
- package/dist/esm/components/agent-builder/components/MentionField.d.ts +19 -0
- package/dist/esm/components/agent-builder/components/MentionField.js +61 -0
- package/dist/esm/components/agent-builder/components/MentionField.js.map +1 -0
- package/dist/esm/components/agent-builder/components/MentionPicker.js +84 -71
- package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/esm/components/agent-builder/components/SelectableListSection.d.ts +18 -1
- package/dist/esm/components/agent-builder/components/SelectableListSection.js +102 -57
- package/dist/esm/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/esm/components/agent-builder/components/UndoToast.d.ts +7 -0
- package/dist/esm/components/agent-builder/components/UndoToast.js +27 -0
- package/dist/esm/components/agent-builder/components/UndoToast.js.map +1 -0
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.d.ts +43 -5
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +135 -87
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/esm/components/agent-builder/index.d.ts +1 -1
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +149 -68
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/mentionSerialization.d.ts +6 -0
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js +53 -52
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentListing.js +126 -91
- package/dist/esm/components/agent-listing/AgentListing.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentListing.model.d.ts +9 -0
- package/dist/esm/components/agent-listing/AgentListingFilters.d.ts +2 -0
- package/dist/esm/components/agent-listing/AgentListingFilters.js +37 -33
- package/dist/esm/components/agent-listing/AgentListingFilters.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentTable.d.ts +1 -0
- package/dist/esm/components/agent-listing/AgentTable.js +13 -11
- package/dist/esm/components/agent-listing/AgentTable.js.map +1 -1
- package/dist/esm/components/agent-listing/AgentTableRow.d.ts +2 -0
- package/dist/esm/components/agent-listing/AgentTableRow.js +70 -50
- package/dist/esm/components/agent-listing/AgentTableRow.js.map +1 -1
- package/dist/esm/components/agent-listing/DeleteAgentModal.d.ts +16 -0
- package/dist/esm/components/agent-listing/DeleteAgentModal.js +69 -0
- package/dist/esm/components/agent-listing/DeleteAgentModal.js.map +1 -0
- package/package.json +1 -1
- package/dist/cjs/components/agent-builder/components/InstructionsField.js +0 -2
- package/dist/cjs/components/agent-builder/components/InstructionsField.js.map +0 -1
- package/dist/cjs/components/agent-builder/components/RichTextField.js +0 -2
- package/dist/cjs/components/agent-builder/components/RichTextField.js.map +0 -1
- package/dist/esm/components/agent-builder/components/InstructionsField.d.ts +0 -2
- package/dist/esm/components/agent-builder/components/InstructionsField.js +0 -81
- package/dist/esm/components/agent-builder/components/InstructionsField.js.map +0 -1
- package/dist/esm/components/agent-builder/components/RichTextField.d.ts +0 -21
- package/dist/esm/components/agent-builder/components/RichTextField.js +0 -66
- package/dist/esm/components/agent-builder/components/RichTextField.js.map +0 -1
|
@@ -1,118 +1,131 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { useState as
|
|
5
|
-
import
|
|
6
|
-
import { TitleSmall as
|
|
7
|
-
import { COLORS as
|
|
8
|
-
import { toolSourceLabel as
|
|
9
|
-
const
|
|
1
|
+
import { jsxs as h, jsx as x } from "react/jsx-runtime";
|
|
2
|
+
import T from "../../../assets/icons/chevronLeft.svg.js";
|
|
3
|
+
import j from "../../../assets/icons/chevronRight.svg.js";
|
|
4
|
+
import { useState as C, useMemo as c, useEffect as E, useRef as M } from "react";
|
|
5
|
+
import k from "styled-components";
|
|
6
|
+
import { TitleSmall as N, BodySecondary as z } from "../../TypographyStyle.js";
|
|
7
|
+
import { COLORS as r } from "../../../constants/Theme.js";
|
|
8
|
+
import { toolSourceLabel as R } from "../utils/mentionSerialization.js";
|
|
9
|
+
const D = [
|
|
10
10
|
{ key: "tool", label: "Tools" },
|
|
11
11
|
{ key: "subagent", label: "Sub-agent" }
|
|
12
|
-
],
|
|
12
|
+
], u = (t) => t.meta, L = (t) => u(t)?.plainLabel ?? t.label, H = ({
|
|
13
13
|
items: t,
|
|
14
|
-
onSelect:
|
|
15
|
-
registerKeyHandler:
|
|
14
|
+
onSelect: m,
|
|
15
|
+
registerKeyHandler: d
|
|
16
16
|
}) => {
|
|
17
|
-
const [
|
|
18
|
-
() => t.filter((e) =>
|
|
17
|
+
const [P, y] = C(null), [l, v] = C(null), [w, p] = C(0), a = c(
|
|
18
|
+
() => t.filter((e) => u(e)?.kind === "tool"),
|
|
19
19
|
[t]
|
|
20
|
-
),
|
|
21
|
-
() => t.filter((e) =>
|
|
20
|
+
), f = c(
|
|
21
|
+
() => t.filter((e) => u(e)?.kind === "subagent"),
|
|
22
22
|
[t]
|
|
23
|
-
),
|
|
23
|
+
), S = c(() => {
|
|
24
24
|
const e = [];
|
|
25
|
-
return
|
|
26
|
-
const
|
|
27
|
-
e.includes(
|
|
25
|
+
return a.forEach((n) => {
|
|
26
|
+
const b = u(n)?.source ?? "other";
|
|
27
|
+
e.includes(b) || e.push(b);
|
|
28
28
|
}), e;
|
|
29
|
-
}, [
|
|
29
|
+
}, [a]), g = c(
|
|
30
|
+
() => D.filter(
|
|
31
|
+
(e) => e.key === "tool" ? a.length > 0 : f.length > 0
|
|
32
|
+
),
|
|
33
|
+
[a.length, f.length]
|
|
34
|
+
), A = g.length === 1 ? g[0].key : null, o = P ?? A, s = o ? o === "subagent" ? A ? null : { title: "Sub-agent", onBack: () => y(null) } : l ? { title: R(l), onBack: () => v(null) } : A ? null : { title: "Tools", onBack: () => y(null) } : null, i = c(() => o ? o === "subagent" ? f.map((e) => ({
|
|
30
35
|
id: String(e.id),
|
|
31
|
-
label:
|
|
36
|
+
label: L(e),
|
|
32
37
|
drillsIn: !1,
|
|
33
|
-
onActivate: () =>
|
|
34
|
-
})) :
|
|
38
|
+
onActivate: () => m(e)
|
|
39
|
+
})) : l ? a.filter((e) => (u(e)?.source ?? "other") === l).map((e) => ({
|
|
35
40
|
id: String(e.id),
|
|
36
|
-
label:
|
|
41
|
+
label: L(e),
|
|
37
42
|
drillsIn: !1,
|
|
38
|
-
onActivate: () =>
|
|
39
|
-
})) :
|
|
43
|
+
onActivate: () => m(e)
|
|
44
|
+
})) : S.map((e) => ({
|
|
40
45
|
id: e,
|
|
41
|
-
label:
|
|
46
|
+
label: R(e),
|
|
42
47
|
drillsIn: !0,
|
|
43
|
-
onActivate: () =>
|
|
44
|
-
})) :
|
|
48
|
+
onActivate: () => v(e)
|
|
49
|
+
})) : g.map((e) => ({
|
|
45
50
|
id: e.key,
|
|
46
51
|
label: e.label,
|
|
47
52
|
drillsIn: !0,
|
|
48
53
|
onActivate: () => {
|
|
49
|
-
|
|
54
|
+
y(e.key), v(null);
|
|
50
55
|
}
|
|
51
|
-
})), [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
})), [
|
|
57
|
+
o,
|
|
58
|
+
g,
|
|
59
|
+
l,
|
|
60
|
+
a,
|
|
61
|
+
f,
|
|
62
|
+
S,
|
|
63
|
+
m
|
|
64
|
+
]);
|
|
65
|
+
E(() => p(0), [o, l, t]);
|
|
66
|
+
const $ = M({ rows: i, activeIndex: w, header: s });
|
|
67
|
+
$.current = { rows: i, activeIndex: w, header: s }, E(() => {
|
|
68
|
+
if (d)
|
|
69
|
+
return d((e) => {
|
|
70
|
+
const { rows: n, activeIndex: b, header: B } = $.current;
|
|
58
71
|
switch (e.key) {
|
|
59
72
|
case "ArrowDown":
|
|
60
|
-
return
|
|
73
|
+
return n.length && p((I) => (I + 1) % n.length), !0;
|
|
61
74
|
case "ArrowUp":
|
|
62
|
-
return
|
|
75
|
+
return n.length && p((I) => (I + n.length - 1) % n.length), !0;
|
|
63
76
|
case "ArrowRight":
|
|
64
77
|
case "Enter":
|
|
65
|
-
return
|
|
78
|
+
return n[b]?.onActivate(), !0;
|
|
66
79
|
case "ArrowLeft":
|
|
67
|
-
return
|
|
80
|
+
return B ? (B.onBack(), !0) : !1;
|
|
68
81
|
default:
|
|
69
82
|
return !1;
|
|
70
83
|
}
|
|
71
|
-
}), () =>
|
|
72
|
-
}, [
|
|
73
|
-
const
|
|
74
|
-
return /* @__PURE__ */
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
}), () => d(null);
|
|
85
|
+
}, [d]);
|
|
86
|
+
const O = o ? i.length && !i[0].drillsIn ? "items" : "sources" : "categories";
|
|
87
|
+
return /* @__PURE__ */ h(G, { className: `bik-mention-picker bik-mention-picker--${O}`, children: [
|
|
88
|
+
s && /* @__PURE__ */ h(
|
|
89
|
+
q,
|
|
77
90
|
{
|
|
78
91
|
type: "button",
|
|
79
|
-
onClick:
|
|
80
|
-
style: { background:
|
|
92
|
+
onClick: s.onBack,
|
|
93
|
+
style: { background: r.surface.subdued },
|
|
81
94
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ x(T, { width: 12, height: 12 }),
|
|
96
|
+
/* @__PURE__ */ h(N, { children: [
|
|
84
97
|
" ",
|
|
85
|
-
|
|
98
|
+
s.title
|
|
86
99
|
] })
|
|
87
100
|
]
|
|
88
101
|
}
|
|
89
102
|
),
|
|
90
|
-
i.length === 0 ? /* @__PURE__ */
|
|
91
|
-
|
|
103
|
+
i.length === 0 ? /* @__PURE__ */ x(F, { children: o === "subagent" ? "No sub-agents available" : "No tools available" }) : i.map((e, n) => /* @__PURE__ */ h(
|
|
104
|
+
U,
|
|
92
105
|
{
|
|
93
106
|
type: "button",
|
|
94
|
-
$active:
|
|
95
|
-
onMouseEnter: () =>
|
|
107
|
+
$active: n === w,
|
|
108
|
+
onMouseEnter: () => p(n),
|
|
96
109
|
onClick: e.onActivate,
|
|
97
110
|
children: [
|
|
98
|
-
/* @__PURE__ */
|
|
99
|
-
e.drillsIn && /* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ x(z, { color: r.content.primary, children: e.label }),
|
|
112
|
+
e.drillsIn && /* @__PURE__ */ x(j, { width: 12, height: 12 })
|
|
100
113
|
]
|
|
101
114
|
},
|
|
102
115
|
e.id
|
|
103
116
|
))
|
|
104
117
|
] });
|
|
105
|
-
},
|
|
118
|
+
}, G = k.div`
|
|
106
119
|
display: flex;
|
|
107
120
|
flex-direction: column;
|
|
108
121
|
min-width: 240px;
|
|
109
122
|
max-height: 280px;
|
|
110
123
|
overflow-y: auto;
|
|
111
|
-
background: ${
|
|
112
|
-
border: 1px solid ${
|
|
124
|
+
background: ${r.surface.standard};
|
|
125
|
+
border: 1px solid ${r.stroke.primary};
|
|
113
126
|
border-radius: 4px;
|
|
114
127
|
box-shadow: 0px -2px 8px 0px #0000001f;
|
|
115
|
-
`,
|
|
128
|
+
`, U = k.button`
|
|
116
129
|
display: flex;
|
|
117
130
|
justify-content: space-between;
|
|
118
131
|
align-items: center;
|
|
@@ -121,20 +134,20 @@ const M = [
|
|
|
121
134
|
padding: 8px 10px;
|
|
122
135
|
height: 48px;
|
|
123
136
|
border: none;
|
|
124
|
-
border-bottom: 1px solid ${
|
|
125
|
-
background: ${(t) => t.$active ?
|
|
137
|
+
border-bottom: 1px solid ${r.stroke.primary};
|
|
138
|
+
background: ${(t) => t.$active ? r.surface.subdued : "transparent"};
|
|
126
139
|
cursor: pointer;
|
|
127
140
|
text-align: left;
|
|
128
141
|
|
|
129
142
|
&:hover {
|
|
130
|
-
background: ${
|
|
143
|
+
background: ${r.surface.subdued};
|
|
131
144
|
}
|
|
132
|
-
`,
|
|
145
|
+
`, q = k.button`
|
|
133
146
|
display: flex;
|
|
134
147
|
align-items: center;
|
|
135
148
|
padding: 12px 16px;
|
|
136
149
|
border: none;
|
|
137
|
-
border-bottom: 1px solid ${
|
|
150
|
+
border-bottom: 1px solid ${r.stroke.primary};
|
|
138
151
|
background: transparent;
|
|
139
152
|
cursor: pointer;
|
|
140
153
|
font-family: Inter;
|
|
@@ -142,13 +155,13 @@ const M = [
|
|
|
142
155
|
font-weight: 600;
|
|
143
156
|
height: 48px;
|
|
144
157
|
gap: 4px;
|
|
145
|
-
`,
|
|
158
|
+
`, F = k.div`
|
|
146
159
|
padding: 12px 10px;
|
|
147
160
|
font-family: Inter;
|
|
148
161
|
font-size: 13px;
|
|
149
|
-
color: ${
|
|
162
|
+
color: ${r.content.secondary};
|
|
150
163
|
`;
|
|
151
164
|
export {
|
|
152
|
-
|
|
165
|
+
H as MentionPicker
|
|
153
166
|
};
|
|
154
167
|
//# sourceMappingURL=MentionPicker.js.map
|
|
@@ -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 type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { BodySecondary, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\n\ntype Category = 'tool' | 'subagent';\n\nconst CATEGORIES: { key: Category; label: string }[] = [\n\t{ key: 'tool', label: 'Tools' },\n\t{ key: 'subagent', label: 'Sub-agent' },\n];\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\tonActivate: () => 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<MentionDropdownRenderProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(null);\n\tconst [activeIndex, setActiveIndex] = useState(0);\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\n\t// Title shown above the current view, and whether we can go back a level.\n\tconst header: { title: string; onBack: () => void } | null = !category\n\t\t? null\n\t\t: category === 'subagent'\n\t\t? { title: 'Sub-agent', onBack: () => setCategory(null) }\n\t\t: source\n\t\t? { title: toolSourceLabel(source), onBack: () => setSource(null) }\n\t\t: { title: 'Tools', onBack: () => setCategory(null) };\n\n\t// Build the navigable rows for the current view.\n\tconst rows: PickerRowModel[] = useMemo(() => {\n\t\tif (!category) {\n\t\t\treturn CATEGORIES.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},\n\t\t\t}));\n\t\t}\n\t\tif (category === 'subagent') {\n\t\t\treturn subAgents.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\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t}\n\t\tif (!source) {\n\t\t\treturn sources.map((s) => ({\n\t\t\t\tid: s,\n\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => setSource(s),\n\t\t\t}));\n\t\t}\n\t\treturn tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\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\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t}, [category, source, tools, subAgents, sources, onSelect]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(() => setActiveIndex(0), [category, source, items]);\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\tr[i]?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h) {\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 = !category\n\t\t? 'categories'\n\t\t: rows.length && !rows[0].drillsIn\n\t\t? 'items'\n\t\t: 'sources';\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\tstyle={{ background: COLORS.surface.subdued }}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft width={12} height={12} />\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\n\t\t\t)}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<PickerEmpty>\n\t\t\t\t\t{category === 'subagent'\n\t\t\t\t\t\t? 'No sub-agents available'\n\t\t\t\t\t\t: '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\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t{row.drillsIn && <ChevronRight width={12} height={12} />}\n\t\t\t\t\t</PickerRow>\n\t\t\t\t))\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: 280px;\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\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.subdued};\n\t}\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":["CATEGORIES","metaOf","item","rowLabel","MentionPicker","items","onSelect","registerKeyHandler","category","setCategory","useState","source","setSource","activeIndex","setActiveIndex","tools","useMemo","i","subAgents","sources","acc","t","s","header","toolSourceLabel","rows","c","useEffect","navRef","useRef","event","h","p","variant","jsxs","PickerCard","PickerBack","COLORS","jsx","ChevronLeft","TitleSmall","PickerEmpty","row","PickerRow","BodySecondary","ChevronRight","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 type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { BodySecondary, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\n\ntype Category = 'tool' | 'subagent';\n\nconst CATEGORIES: { key: Category; label: string }[] = [\n\t{ key: 'tool', label: 'Tools' },\n\t{ key: 'subagent', label: 'Sub-agent' },\n];\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\tonActivate: () => 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<MentionDropdownRenderProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(null);\n\tconst [activeIndex, setActiveIndex] = useState(0);\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\n\t// Only show categories that actually have items. When just one is available\n\t// (e.g. the sub-agent drawer offers tools only), skip the category selector.\n\tconst availableCategories = useMemo(\n\t\t() =>\n\t\t\tCATEGORIES.filter((c) =>\n\t\t\t\tc.key === 'tool' ? tools.length > 0 : subAgents.length > 0,\n\t\t\t),\n\t\t[tools.length, subAgents.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, and whether we can go back a level.\n\t// With a sole category there is no root to go back to (no category header).\n\tconst header: { title: string; onBack: () => void } | null = !activeCategory\n\t\t? null\n\t\t: activeCategory === 'subagent'\n\t\t? soleCategory\n\t\t\t? null\n\t\t\t: { title: 'Sub-agent', onBack: () => setCategory(null) }\n\t\t: source\n\t\t? { title: toolSourceLabel(source), onBack: () => setSource(null) }\n\t\t: soleCategory\n\t\t? null\n\t\t: { title: 'Tools', onBack: () => setCategory(null) };\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},\n\t\t\t}));\n\t\t}\n\t\tif (activeCategory === 'subagent') {\n\t\t\treturn subAgents.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\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t}\n\t\tif (!source) {\n\t\t\treturn sources.map((s) => ({\n\t\t\t\tid: s,\n\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => setSource(s),\n\t\t\t}));\n\t\t}\n\t\treturn tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\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\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t}, [\n\t\tactiveCategory,\n\t\tavailableCategories,\n\t\tsource,\n\t\ttools,\n\t\tsubAgents,\n\t\tsources,\n\t\tonSelect,\n\t]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(() => setActiveIndex(0), [activeCategory, source, items]);\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\tr[i]?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h) {\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\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\tstyle={{ background: COLORS.surface.subdued }}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft width={12} height={12} />\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\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'\n\t\t\t\t\t\t? 'No sub-agents available'\n\t\t\t\t\t\t: '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\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t{row.drillsIn && <ChevronRight width={12} height={12} />}\n\t\t\t\t\t</PickerRow>\n\t\t\t\t))\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: 280px;\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\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.subdued};\n\t}\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":["CATEGORIES","metaOf","item","rowLabel","MentionPicker","items","onSelect","registerKeyHandler","category","setCategory","useState","source","setSource","activeIndex","setActiveIndex","tools","useMemo","i","subAgents","sources","acc","t","s","availableCategories","c","soleCategory","activeCategory","header","toolSourceLabel","rows","useEffect","navRef","useRef","event","r","h","p","variant","jsxs","PickerCard","PickerBack","COLORS","jsx","ChevronLeft","TitleSmall","PickerEmpty","row","PickerRow","BodySecondary","ChevronRight","styled"],"mappings":"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"}
|
|
@@ -8,12 +8,29 @@ interface SelectableListSectionProps {
|
|
|
8
8
|
title: string;
|
|
9
9
|
helper?: string;
|
|
10
10
|
items: SelectableItem[];
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Options shown in the add dropdown. Pass ALL items (not just unselected
|
|
13
|
+
* ones) when re-picking an already-added item is allowed (e.g. to insert its
|
|
14
|
+
* mention again) — the chip list still shows each item only once.
|
|
15
|
+
*/
|
|
12
16
|
addableOptions: SingleOption[];
|
|
13
17
|
onAdd: (id: string) => void;
|
|
14
18
|
onRemove: (id: string) => void;
|
|
15
19
|
dataTestPrefix: string;
|
|
16
20
|
emptyText: string;
|
|
21
|
+
/**
|
|
22
|
+
* Adds a "create new" entry at the top of the add dropdown (e.g. "Create
|
|
23
|
+
* sub-agent"). Selecting it calls `onSelect` instead of `onAdd`.
|
|
24
|
+
*/
|
|
25
|
+
createOption?: {
|
|
26
|
+
label: string;
|
|
27
|
+
onSelect: () => void;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* When provided, each row's kebab menu gains a "Configure" action (above
|
|
31
|
+
* "Delete"). Omit for tools (Delete only).
|
|
32
|
+
*/
|
|
33
|
+
onConfigure?: (id: string) => void;
|
|
17
34
|
}
|
|
18
35
|
export declare const SelectableListSection: React.FC<SelectableListSectionProps>;
|
|
19
36
|
export {};
|
|
@@ -1,79 +1,124 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { jsx as o, jsxs as r } from "react/jsx-runtime";
|
|
2
|
+
import A from "../../../assets/icons/delete.svg.js";
|
|
3
|
+
import v from "../../../assets/icons/edit.svg.js";
|
|
4
|
+
import _ from "../../../assets/icons/plus.svg.js";
|
|
5
|
+
import { useState as R } from "react";
|
|
6
|
+
import { TitleSmall as C, BodyCaption as b, BodySecondary as B } from "../../TypographyStyle.js";
|
|
7
|
+
import { COLORS as l } from "../../../constants/Theme.js";
|
|
8
|
+
import { SideSection as E, SideSectionHeader as L, AddIconButton as k, SelectableRow as D, RowText as I, RowActions as j, RowMenuButton as g, RowActionDivider as z } from "../AgentBuilder.styled.js";
|
|
9
|
+
import { Dropdown as H } from "../../dropdown/Dropdown.js";
|
|
10
|
+
const y = "__bik_create_new__", J = ({
|
|
11
|
+
title: d,
|
|
12
|
+
helper: s,
|
|
13
|
+
items: h,
|
|
14
|
+
addableOptions: c,
|
|
15
|
+
onAdd: p,
|
|
16
|
+
onRemove: u,
|
|
17
|
+
dataTestPrefix: t,
|
|
18
|
+
emptyText: $,
|
|
19
|
+
createOption: n,
|
|
20
|
+
onConfigure: i
|
|
18
21
|
}) => {
|
|
19
|
-
const [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const [S, m] = R(!1), f = c.length > 0 || !!n, w = n ? [
|
|
23
|
+
...c,
|
|
24
|
+
{
|
|
25
|
+
label: n.label,
|
|
26
|
+
value: y,
|
|
27
|
+
searchKey: n.label,
|
|
28
|
+
customComponent: /* @__PURE__ */ o(
|
|
29
|
+
"div",
|
|
25
30
|
{
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
style: {
|
|
32
|
+
width: "100%",
|
|
33
|
+
textAlign: "center",
|
|
34
|
+
color: l.content.brand,
|
|
35
|
+
fontFamily: "Inter",
|
|
36
|
+
fontSize: 14,
|
|
37
|
+
fontWeight: 600
|
|
38
|
+
},
|
|
39
|
+
children: n.label
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
] : c;
|
|
44
|
+
return /* @__PURE__ */ r(E, { children: [
|
|
45
|
+
/* @__PURE__ */ r(L, { children: [
|
|
46
|
+
/* @__PURE__ */ o(C, { color: l.content.primary, children: d }),
|
|
47
|
+
f && /* @__PURE__ */ o(
|
|
48
|
+
k,
|
|
49
|
+
{
|
|
50
|
+
"data-test": `${t}-add`,
|
|
51
|
+
onClick: () => m((e) => !e),
|
|
52
|
+
"aria-label": `Add ${d}`,
|
|
53
|
+
children: /* @__PURE__ */ o(_, { width: 20, height: 20, color: l.content.brand })
|
|
30
54
|
}
|
|
31
55
|
)
|
|
32
56
|
] }),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
57
|
+
s && /* @__PURE__ */ o(b, { color: l.content.secondary, children: s }),
|
|
58
|
+
S && w.length > 0 && /* @__PURE__ */ o(
|
|
59
|
+
H,
|
|
36
60
|
{
|
|
37
|
-
"data-test": `${
|
|
61
|
+
"data-test": `${t}-dropdown`,
|
|
38
62
|
size: "small",
|
|
39
63
|
width: "100%",
|
|
40
64
|
isSearchable: !0,
|
|
41
|
-
placeHolder: `Select ${
|
|
42
|
-
options:
|
|
43
|
-
onSelect: (
|
|
44
|
-
const
|
|
45
|
-
|
|
65
|
+
placeHolder: `Select ${d.toLowerCase()}`,
|
|
66
|
+
options: w,
|
|
67
|
+
onSelect: (e) => {
|
|
68
|
+
const a = (Array.isArray(e) ? e[0] : e)?.value;
|
|
69
|
+
m(!1), a && (a === y ? n?.onSelect() : p(a));
|
|
46
70
|
}
|
|
47
71
|
}
|
|
48
72
|
),
|
|
49
|
-
|
|
50
|
-
|
|
73
|
+
h.length === 0 && !S ? /* @__PURE__ */ o(b, { color: l.content.placeholder, children: $ }) : h.map((e) => /* @__PURE__ */ r(
|
|
74
|
+
D,
|
|
51
75
|
{
|
|
52
|
-
"data-test": `${
|
|
76
|
+
"data-test": `${t}-row-${e.id}`,
|
|
53
77
|
children: [
|
|
54
|
-
/* @__PURE__ */
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
/* @__PURE__ */ o(I, { children: /* @__PURE__ */ o(B, { numberOfLines: 1, color: l.content.primary, children: e.label }) }),
|
|
79
|
+
/* @__PURE__ */ r(j, { children: [
|
|
80
|
+
i && // Configurable rows (sub-agents) get an always-visible edit icon.
|
|
81
|
+
/* @__PURE__ */ o(
|
|
82
|
+
g,
|
|
83
|
+
{
|
|
84
|
+
"data-test": `${t}-edit-${e.id}`,
|
|
85
|
+
"aria-label": `Edit ${e.label}`,
|
|
86
|
+
onClick: () => i(e.id),
|
|
87
|
+
children: /* @__PURE__ */ o(
|
|
88
|
+
v,
|
|
89
|
+
{
|
|
90
|
+
width: 16,
|
|
91
|
+
height: 16,
|
|
92
|
+
color: l.content.secondary
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
i && /* @__PURE__ */ o(z, { "aria-hidden": !0 }),
|
|
98
|
+
/* @__PURE__ */ o(
|
|
99
|
+
g,
|
|
100
|
+
{
|
|
101
|
+
"data-test": `${t}-delete-${e.id}`,
|
|
102
|
+
"aria-label": `Delete ${e.label}`,
|
|
103
|
+
onClick: () => u(e.id),
|
|
104
|
+
children: /* @__PURE__ */ o(
|
|
105
|
+
A,
|
|
106
|
+
{
|
|
107
|
+
width: 16,
|
|
108
|
+
height: 16,
|
|
109
|
+
color: l.content.secondary
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
] })
|
|
70
115
|
]
|
|
71
116
|
},
|
|
72
|
-
|
|
117
|
+
e.id
|
|
73
118
|
))
|
|
74
119
|
] });
|
|
75
120
|
};
|
|
76
121
|
export {
|
|
77
|
-
|
|
122
|
+
J as SelectableListSection
|
|
78
123
|
};
|
|
79
124
|
//# sourceMappingURL=SelectableListSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectableListSection.js","sources":["../../../../../src/components/agent-builder/components/SelectableListSection.tsx"],"sourcesContent":["import
|
|
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 React, { useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\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\tRowMenuButton,\n\tRowText,\n\tSelectableRow,\n\tSideSection,\n\tSideSectionHeader,\n} from '../AgentBuilder.styled';\n\nexport interface SelectableItem {\n\tid: string;\n\tlabel: string;\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's kebab menu gains a \"Configure\" action (above\n\t * \"Delete\"). Omit for tools (Delete only).\n\t */\n\tonConfigure?: (id: string) => void;\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}) => {\n\tconst [adding, setAdding] = useState(false);\n\tconst showAddButton = addableOptions.length > 0 || !!createOption;\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\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<AddIconButton\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-add`}\n\t\t\t\t\t\tonClick={() => setAdding((v) => !v)}\n\t\t\t\t\t\taria-label={`Add ${title}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<PlusIcon width={20} height={20} color={COLORS.content.brand} />\n\t\t\t\t\t</AddIconButton>\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{adding && dropdownOptions.length > 0 && (\n\t\t\t\t<Dropdown\n\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\tisSearchable\n\t\t\t\t\tplaceHolder={`Select ${title.toLowerCase()}`}\n\t\t\t\t\toptions={dropdownOptions}\n\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\tif (!v) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (v === CREATE_OPTION_VALUE) {\n\t\t\t\t\t\t\tcreateOption?.onSelect();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{items.length === 0 && !adding ? (\n\t\t\t\t<BodyCaption color={COLORS.content.placeholder}>\n\t\t\t\t\t{emptyText}\n\t\t\t\t</BodyCaption>\n\t\t\t) : (\n\t\t\t\titems.map((item) => (\n\t\t\t\t\t<SelectableRow\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-row-${item.id}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RowText>\n\t\t\t\t\t\t\t<BodySecondary numberOfLines={1} color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t</RowText>\n\t\t\t\t\t\t<RowActions>\n\t\t\t\t\t\t\t{onConfigure && (\n\t\t\t\t\t\t\t\t// Configurable rows (sub-agents) get an always-visible edit icon.\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\tonClick={() => onConfigure(item.id)}\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)}\n\t\t\t\t\t\t\t{onConfigure && <RowActionDivider aria-hidden />}\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={() => onRemove(item.id)}\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</RowActions>\n\t\t\t\t\t</SelectableRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t</SideSection>\n\t);\n};\n"],"names":["CREATE_OPTION_VALUE","SelectableListSection","title","helper","items","addableOptions","onAdd","onRemove","dataTestPrefix","emptyText","createOption","onConfigure","adding","setAdding","useState","showAddButton","dropdownOptions","jsx","COLORS","SideSection","jsxs","SideSectionHeader","TitleSmall","AddIconButton","v","PlusIcon","BodyCaption","Dropdown","opt","item","SelectableRow","RowText","BodySecondary","RowActions","RowMenuButton","EditIcon","RowActionDivider","DeleteIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Top-right toast shown after a tool / sub-agent is removed, offering an Undo.
|
|
4
|
+
* Re-keyed per removal so each one restarts the auto-close timer. Uses the
|
|
5
|
+
* shared `Toaster` (which mounts its own ToastContainer).
|
|
6
|
+
*/
|
|
7
|
+
export declare const UndoToast: React.FC;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { useAgentBuilderContext as r } from "../context/AgentBuilderContext.js";
|
|
3
|
+
import { Toaster as s } from "../../toaster/Toaster.js";
|
|
4
|
+
const m = () => {
|
|
5
|
+
const { undoToast: o, undoRemoval: t, dismissUndo: e } = r();
|
|
6
|
+
return o ? /* @__PURE__ */ n(
|
|
7
|
+
s,
|
|
8
|
+
{
|
|
9
|
+
text: o.message,
|
|
10
|
+
type: "info",
|
|
11
|
+
position: "top-right",
|
|
12
|
+
autoClose: 5e3,
|
|
13
|
+
hideCloseButton: !0,
|
|
14
|
+
buttonProps: {
|
|
15
|
+
buttonText: "Undo",
|
|
16
|
+
showButton: !0,
|
|
17
|
+
onButtonClick: () => (t(), {})
|
|
18
|
+
},
|
|
19
|
+
onCloseToast: () => e()
|
|
20
|
+
},
|
|
21
|
+
o.id
|
|
22
|
+
) : null;
|
|
23
|
+
};
|
|
24
|
+
export {
|
|
25
|
+
m as UndoToast
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=UndoToast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UndoToast.js","sources":["../../../../../src/components/agent-builder/components/UndoToast.tsx"],"sourcesContent":["import React from 'react';\nimport { Toaster } from '@src/components/toaster';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\n\n/**\n * Top-right toast shown after a tool / sub-agent is removed, offering an Undo.\n * Re-keyed per removal so each one restarts the auto-close timer. Uses the\n * shared `Toaster` (which mounts its own ToastContainer).\n */\nexport const UndoToast: React.FC = () => {\n\tconst { undoToast, undoRemoval, dismissUndo } = useAgentBuilderContext();\n\n\tif (!undoToast) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Toaster\n\t\t\tkey={undoToast.id}\n\t\t\ttext={undoToast.message}\n\t\t\ttype=\"info\"\n\t\t\tposition=\"top-right\"\n\t\t\tautoClose={5000}\n\t\t\thideCloseButton\n\t\t\tbuttonProps={{\n\t\t\t\tbuttonText: 'Undo',\n\t\t\t\tshowButton: true,\n\t\t\t\tonButtonClick: () => {\n\t\t\t\t\tundoRemoval();\n\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t},\n\t\t\t}}\n\t\t\tonCloseToast={() => dismissUndo()}\n\t\t/>\n\t);\n};\n"],"names":["UndoToast","undoToast","undoRemoval","dismissUndo","useAgentBuilderContext","jsx","Toaster"],"mappings":";;;AASO,MAAMA,IAAsB,MAAM;AACxC,QAAM,EAAE,WAAAC,GAAW,aAAAC,GAAa,aAAAC,EAAA,IAAgBC,EAAA;AAEhD,SAAKH,IAKJ,gBAAAI;AAAA,IAACC;AAAA,IAAA;AAAA,MAEA,MAAML,EAAU;AAAA,MAChB,MAAK;AAAA,MACL,UAAS;AAAA,MACT,WAAW;AAAA,MACX,iBAAe;AAAA,MACf,aAAa;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe,OACdC,EAAA,GACO,CAAA;AAAA,MACR;AAAA,MAED,cAAc,MAAMC,EAAA;AAAA,IAAY;AAAA,IAd3BF,EAAU;AAAA,EAAA,IALT;AAsBT;"}
|