@bikdotai/bik-component-library 0.0.830 → 0.0.831-beta.0
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 +17 -65
- package/dist/cjs/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js +41 -0
- package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +5 -5
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/DrawerHeaderText.js +15 -0
- package/dist/cjs/components/agent-builder/components/DrawerHeaderText.js.map +1 -0
- 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/MentionField.js +1 -1
- package/dist/cjs/components/agent-builder/components/MentionField.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/MentionPicker.js +20 -20
- package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +23 -0
- package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js +5 -5
- package/dist/cjs/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js +5 -0
- package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js.map +1 -0
- package/dist/cjs/components/agent-builder/constants/tools.js +2 -0
- package/dist/cjs/components/agent-builder/constants/tools.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-builder/utils/sourceIcons.js +1 -1
- package/dist/cjs/components/agent-builder/utils/sourceIcons.js.map +1 -1
- package/dist/cjs/components/side-modal/SideModal.style.js +11 -10
- package/dist/cjs/components/side-modal/SideModal.style.js.map +1 -1
- package/dist/cjs/editor/extensions/mention/MentionExtension.js +1 -1
- package/dist/cjs/editor/extensions/mention/MentionExtension.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/components/agent-builder/AgentBuilder.js +100 -96
- package/dist/esm/components/agent-builder/AgentBuilder.js.map +1 -1
- package/dist/esm/components/agent-builder/AgentBuilder.model.d.ts +144 -1
- package/dist/esm/components/agent-builder/AgentBuilder.styled.d.ts +0 -21
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js +42 -111
- package/dist/esm/components/agent-builder/AgentBuilder.styled.js.map +1 -1
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.d.ts +33 -0
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +251 -0
- package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +9 -1
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +318 -219
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/components/DrawerHeaderText.d.ts +33 -0
- package/dist/esm/components/agent-builder/components/DrawerHeaderText.js +42 -0
- package/dist/esm/components/agent-builder/components/DrawerHeaderText.js.map +1 -0
- package/dist/esm/components/agent-builder/components/MentionEditor.d.ts +6 -0
- package/dist/esm/components/agent-builder/components/MentionEditor.js +38 -30
- package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionField.js +77 -52
- package/dist/esm/components/agent-builder/components/MentionField.js.map +1 -1
- package/dist/esm/components/agent-builder/components/MentionPicker.d.ts +7 -0
- package/dist/esm/components/agent-builder/components/MentionPicker.js +162 -145
- package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.d.ts +27 -0
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +270 -0
- package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -0
- package/dist/esm/components/agent-builder/components/SelectableListSection.d.ts +14 -0
- package/dist/esm/components/agent-builder/components/SelectableListSection.js +166 -140
- package/dist/esm/components/agent-builder/components/SelectableListSection.js.map +1 -1
- package/dist/esm/components/agent-builder/components/ToolInstructionsField.d.ts +19 -0
- package/dist/esm/components/agent-builder/components/ToolInstructionsField.js +66 -0
- package/dist/esm/components/agent-builder/components/ToolInstructionsField.js.map +1 -0
- package/dist/esm/components/agent-builder/constants/tools.d.ts +67 -0
- package/dist/esm/components/agent-builder/constants/tools.js +29 -0
- package/dist/esm/components/agent-builder/constants/tools.js.map +1 -0
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.d.ts +19 -1
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +169 -140
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/esm/components/agent-builder/index.d.ts +2 -1
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +241 -141
- package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/mentionSerialization.d.ts +18 -3
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js +81 -62
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/sourceIcons.d.ts +15 -9
- package/dist/esm/components/agent-builder/utils/sourceIcons.js +16 -8
- package/dist/esm/components/agent-builder/utils/sourceIcons.js.map +1 -1
- package/dist/esm/components/side-modal/SideModal.style.js +1 -0
- package/dist/esm/components/side-modal/SideModal.style.js.map +1 -1
- package/dist/esm/editor/extensions/mention/MentionExtension.js +60 -57
- package/dist/esm/editor/extensions/mention/MentionExtension.js.map +1 -1
- package/dist/esm/index.js +97 -95
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { jsx as r, jsxs as k } from "react/jsx-runtime";
|
|
2
|
+
import R from "../../../assets/icons/cross.svg.js";
|
|
3
|
+
import { useState as C } from "react";
|
|
4
|
+
import u from "styled-components";
|
|
5
|
+
import { TitleSmall as w, BodyCaption as E } from "../../TypographyStyle.js";
|
|
6
|
+
import { COLORS as i } from "../../../constants/Theme.js";
|
|
7
|
+
import { FieldBlock as $ } from "../AgentBuilder.styled.js";
|
|
8
|
+
import { AGENT_CHAR_LIMITS as D } from "../constants/charLimits.js";
|
|
9
|
+
import { ToolSource as _ } from "../constants/tools.js";
|
|
10
|
+
import { SOURCE_ICONS as L } from "../utils/sourceIcons.js";
|
|
11
|
+
import { DRAWER_BODY_STYLE as A, DRAWER_HEADER_STYLE as j, DrawerHeaderText as P } from "./DrawerHeaderText.js";
|
|
12
|
+
import { ToolInstructionsField as Y } from "./ToolInstructionsField.js";
|
|
13
|
+
import { SideModal as F } from "../../side-modal/SideModal.js";
|
|
14
|
+
import { Switch as H } from "../../switch/Switch.js";
|
|
15
|
+
import { Input as z } from "../../input/Input.js";
|
|
16
|
+
import { Tag as V } from "../../tag/Tag.js";
|
|
17
|
+
const M = {
|
|
18
|
+
send_email: {
|
|
19
|
+
title: "Handover to email",
|
|
20
|
+
subtitle: "Notify someone by email when this agent can't continue. You pick the recipient, the AI drafts the message."
|
|
21
|
+
},
|
|
22
|
+
send_slack_message: {
|
|
23
|
+
title: "Send Slack message",
|
|
24
|
+
subtitle: "Post a message to a Slack channel. You pick the channel, the AI composes the message from the conversation."
|
|
25
|
+
}
|
|
26
|
+
}, N = ({
|
|
27
|
+
chips: o,
|
|
28
|
+
onChange: a,
|
|
29
|
+
placeholder: c,
|
|
30
|
+
nativeID: m,
|
|
31
|
+
hint: d
|
|
32
|
+
}) => {
|
|
33
|
+
const [p, h] = C(""), y = () => {
|
|
34
|
+
const t = p.split(",").map((s) => s.trim()).filter(Boolean);
|
|
35
|
+
t.length && a([...o, ...t.filter((s) => !o.includes(s))]), h("");
|
|
36
|
+
};
|
|
37
|
+
return /* @__PURE__ */ k(q, { children: [
|
|
38
|
+
/* @__PURE__ */ r(
|
|
39
|
+
U,
|
|
40
|
+
{
|
|
41
|
+
id: m,
|
|
42
|
+
type: "text",
|
|
43
|
+
placeholder: c,
|
|
44
|
+
value: p,
|
|
45
|
+
onChange: (t) => h(t.target.value),
|
|
46
|
+
onBlur: y,
|
|
47
|
+
onKeyDown: (t) => {
|
|
48
|
+
t.key === "Enter" || t.key === "," ? (t.preventDefault(), y()) : t.key === "Backspace" && p === "" && o.length > 0 && a(o.slice(0, -1));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
d,
|
|
53
|
+
o.length > 0 && /* @__PURE__ */ r(J, { children: o.map((t, s) => /* @__PURE__ */ r(
|
|
54
|
+
V,
|
|
55
|
+
{
|
|
56
|
+
tagText: t,
|
|
57
|
+
theme: "light",
|
|
58
|
+
type: "neutral",
|
|
59
|
+
variant: "regular",
|
|
60
|
+
TrailingIcon: R,
|
|
61
|
+
onTrailingIconClicked: () => a(o.filter((x, g) => g !== s))
|
|
62
|
+
},
|
|
63
|
+
`${t}-${s}`
|
|
64
|
+
)) })
|
|
65
|
+
] });
|
|
66
|
+
}, W = (o, a) => {
|
|
67
|
+
const c = {};
|
|
68
|
+
return Object.keys(o).forEach((m) => {
|
|
69
|
+
c[m] = a?.params[m]?.value ?? o[m].value;
|
|
70
|
+
}), c;
|
|
71
|
+
}, G = (o) => String(o ?? "").split(",").map((a) => a.trim()).filter(Boolean), he = ({
|
|
72
|
+
toolKey: o,
|
|
73
|
+
template: a,
|
|
74
|
+
onClose: c,
|
|
75
|
+
onSave: m,
|
|
76
|
+
initial: d,
|
|
77
|
+
onImprove: p,
|
|
78
|
+
charLimits: h = D,
|
|
79
|
+
zIndex: y
|
|
80
|
+
}) => {
|
|
81
|
+
const [t, s] = C(
|
|
82
|
+
() => W(a, d)
|
|
83
|
+
), [x, g] = C(!1), v = Object.values(a), I = o === "send_email", f = (e, l) => s((n) => ({ ...n, [e]: l })), T = v.every(
|
|
84
|
+
(e) => !e.required || String(t[e.key] ?? "").trim() !== ""
|
|
85
|
+
), B = async () => {
|
|
86
|
+
if (!T || x)
|
|
87
|
+
return;
|
|
88
|
+
const e = {};
|
|
89
|
+
v.forEach((b) => {
|
|
90
|
+
e[b.key] = { ...b, value: t[b.key] };
|
|
91
|
+
});
|
|
92
|
+
const l = {
|
|
93
|
+
id: d?.id ?? `${o}_${Date.now().toString(36)}`,
|
|
94
|
+
tool_key: o,
|
|
95
|
+
params: e
|
|
96
|
+
}, n = m(l);
|
|
97
|
+
if (n && typeof n.then == "function") {
|
|
98
|
+
g(!0);
|
|
99
|
+
try {
|
|
100
|
+
await n;
|
|
101
|
+
} finally {
|
|
102
|
+
g(!1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, O = (e) => {
|
|
106
|
+
const l = `config-tool-${e.key.toLowerCase()}`;
|
|
107
|
+
switch (e.component) {
|
|
108
|
+
// Multi-value email chips — only for the email tool. Slack's KeywordInput
|
|
109
|
+
// (channelId) falls through to the plain input below.
|
|
110
|
+
case "KeywordInput":
|
|
111
|
+
if (!I)
|
|
112
|
+
break;
|
|
113
|
+
return /* @__PURE__ */ k($, { children: [
|
|
114
|
+
/* @__PURE__ */ r(w, { color: i.content.primary, children: e.title }),
|
|
115
|
+
/* @__PURE__ */ r(
|
|
116
|
+
N,
|
|
117
|
+
{
|
|
118
|
+
nativeID: l,
|
|
119
|
+
placeholder: e.hint ?? "",
|
|
120
|
+
chips: G(t[e.key]),
|
|
121
|
+
onChange: (n) => f(e.key, n.join(",")),
|
|
122
|
+
hint: /* @__PURE__ */ r(E, { color: i.content.secondary, children: "Press Enter or comma to add multiple emails" })
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
] }, e.key);
|
|
126
|
+
case "MultilineInput":
|
|
127
|
+
return /* @__PURE__ */ r(
|
|
128
|
+
Y,
|
|
129
|
+
{
|
|
130
|
+
"data-test": l,
|
|
131
|
+
label: e.title,
|
|
132
|
+
value: String(t[e.key] ?? ""),
|
|
133
|
+
onChange: (n) => f(e.key, n),
|
|
134
|
+
maxLength: h.instructions,
|
|
135
|
+
placeholder: e.hint ?? "",
|
|
136
|
+
onImprove: p
|
|
137
|
+
},
|
|
138
|
+
e.key
|
|
139
|
+
);
|
|
140
|
+
case "Switch":
|
|
141
|
+
return /* @__PURE__ */ k(Q, { children: [
|
|
142
|
+
/* @__PURE__ */ k(X, { children: [
|
|
143
|
+
/* @__PURE__ */ r(w, { color: i.content.primary, children: e.title }),
|
|
144
|
+
e.hint && /* @__PURE__ */ r(E, { color: i.content.secondary, children: e.hint })
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ r(
|
|
147
|
+
H,
|
|
148
|
+
{
|
|
149
|
+
"data-test": l,
|
|
150
|
+
value: !!t[e.key],
|
|
151
|
+
onValueChange: async (n) => f(e.key, n)
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
] }, e.key);
|
|
155
|
+
}
|
|
156
|
+
return /* @__PURE__ */ r(
|
|
157
|
+
z,
|
|
158
|
+
{
|
|
159
|
+
"data-test": l,
|
|
160
|
+
variant: "small",
|
|
161
|
+
labelText: e.title,
|
|
162
|
+
labelTextBold: !0,
|
|
163
|
+
placeholder: e.hint ?? "",
|
|
164
|
+
value: String(t[e.key] ?? ""),
|
|
165
|
+
onChangeText: (n) => f(e.key, n)
|
|
166
|
+
},
|
|
167
|
+
e.key
|
|
168
|
+
);
|
|
169
|
+
}, S = M[o];
|
|
170
|
+
return /* @__PURE__ */ r(
|
|
171
|
+
F,
|
|
172
|
+
{
|
|
173
|
+
header: S.title,
|
|
174
|
+
closeOnEscapeKey: !1,
|
|
175
|
+
zIndex: y,
|
|
176
|
+
headerCustomComponent: /* @__PURE__ */ r(
|
|
177
|
+
P,
|
|
178
|
+
{
|
|
179
|
+
title: S.title,
|
|
180
|
+
subtitle: S.subtitle,
|
|
181
|
+
icon: L[o === "send_slack_message" ? _.Slack : _.EmailHandover]
|
|
182
|
+
}
|
|
183
|
+
),
|
|
184
|
+
hideCrossButton: !1,
|
|
185
|
+
width: "431px",
|
|
186
|
+
headerStyle: j,
|
|
187
|
+
bodyStyle: A,
|
|
188
|
+
onClose: c,
|
|
189
|
+
saveButtonProps: {
|
|
190
|
+
"data-test": "config-tool-save",
|
|
191
|
+
buttonText: "Save",
|
|
192
|
+
buttonType: "primary",
|
|
193
|
+
size: "small",
|
|
194
|
+
disabled: !T,
|
|
195
|
+
isLoading: x,
|
|
196
|
+
onClick: B
|
|
197
|
+
},
|
|
198
|
+
cancelButtonProps: {
|
|
199
|
+
"data-test": "config-tool-cancel",
|
|
200
|
+
buttonText: "Cancel",
|
|
201
|
+
buttonType: "tertiaryGray",
|
|
202
|
+
size: "small",
|
|
203
|
+
onClick: c
|
|
204
|
+
},
|
|
205
|
+
children: v.map(O)
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
}, q = u.div`
|
|
209
|
+
display: flex;
|
|
210
|
+
flex-direction: column;
|
|
211
|
+
gap: 8px;
|
|
212
|
+
`, U = u.input`
|
|
213
|
+
width: 100%;
|
|
214
|
+
min-width: 0;
|
|
215
|
+
box-sizing: border-box;
|
|
216
|
+
height: 32px;
|
|
217
|
+
padding: 0 8px;
|
|
218
|
+
border: 1px solid ${i.stroke.primary};
|
|
219
|
+
border-radius: 4px;
|
|
220
|
+
font-family: 'Inter', sans-serif;
|
|
221
|
+
font-size: 14px;
|
|
222
|
+
color: ${i.content.primary};
|
|
223
|
+
background: ${i.surface.standard};
|
|
224
|
+
outline: none;
|
|
225
|
+
|
|
226
|
+
&::placeholder {
|
|
227
|
+
color: ${i.content.secondary};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
&:focus {
|
|
231
|
+
border-color: ${i.stroke.brand};
|
|
232
|
+
}
|
|
233
|
+
`, J = u.div`
|
|
234
|
+
display: flex;
|
|
235
|
+
flex-wrap: wrap;
|
|
236
|
+
gap: 6px;
|
|
237
|
+
`, Q = u.div`
|
|
238
|
+
display: flex;
|
|
239
|
+
align-items: center;
|
|
240
|
+
justify-content: space-between;
|
|
241
|
+
gap: 12px;
|
|
242
|
+
`, X = u.div`
|
|
243
|
+
display: flex;
|
|
244
|
+
flex-direction: column;
|
|
245
|
+
gap: 4px;
|
|
246
|
+
min-width: 0;
|
|
247
|
+
`;
|
|
248
|
+
export {
|
|
249
|
+
he as ConfigToolPanel
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=ConfigToolPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigToolPanel.js","sources":["../../../../../src/components/agent-builder/components/ConfigToolPanel.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Input } from '@src/components/input';\nimport { SideModal } from '@src/components/side-modal';\nimport { Switch } from '@src/components/switch';\nimport { Tag } from '@src/components/tag';\nimport { BodyCaption, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tConfigToolConfig,\n\tConfigToolKey,\n\tParamField,\n\tParamsBlob,\n} from '../AgentBuilder.model';\nimport { FieldBlock } from '../AgentBuilder.styled';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { ToolSource } from '../constants/tools';\nimport { SOURCE_ICONS } from '../utils/sourceIcons';\nimport {\n\tDRAWER_BODY_STYLE,\n\tDRAWER_HEADER_STYLE,\n\tDrawerHeaderText,\n} from './DrawerHeaderText';\nimport { ToolInstructionsField } from './ToolInstructionsField';\n\n/** Header copy per shared-drawer tool. */\nconst TOOL_COPY: Record<ConfigToolKey, { title: string; subtitle: string }> = {\n\tsend_email: {\n\t\ttitle: 'Handover to email',\n\t\tsubtitle:\n\t\t\t\"Notify someone by email when this agent can't continue. You pick the recipient, the AI drafts the message.\",\n\t},\n\tsend_slack_message: {\n\t\ttitle: 'Send Slack message',\n\t\tsubtitle:\n\t\t\t'Post a message to a Slack channel. You pick the channel, the AI composes the message from the conversation.',\n\t},\n};\n\ninterface ConfigToolPanelProps {\n\t/** Which tool this drawer configures (drives copy + persistence). */\n\ttoolKey: ConfigToolKey;\n\t/**\n\t * The backend template (`list-catalog` → params) for `toolKey`. The form is\n\t * DYNAMIC: exactly these fields render, in this order, each by its\n\t * `component` kind (KeywordInput | MultilineInput | Switch | fallback input).\n\t */\n\ttemplate: ParamsBlob;\n\tonClose: () => void;\n\t/** Persist the filled template. A pending promise shows the Save loader. */\n\tonSave: (config: ConfigToolConfig) => void | Promise<void>;\n\t/** Seed values when editing an existing tool. */\n\tinitial?: ConfigToolConfig;\n\t/** Optional \"Improve with AI\" for multiline fields. Omit to hide it. */\n\tonImprove?: (text: string) => Promise<string>;\n\tcharLimits?: AgentCharLimits;\n\t/** SideModal stacking order — raise it when opened over another drawer. */\n\tzIndex?: number;\n}\n\ninterface EmailChipsFieldProps {\n\tchips: string[];\n\tonChange: (next: string[]) => void;\n\tplaceholder: string;\n\tnativeID?: string;\n\t/** Optional helper caption shown between the input and the chips. */\n\thint?: React.ReactNode;\n}\n\n/**\n * Email entry field: type an address and press Enter / comma (or blur) to add\n * it. Added emails render as removable chips BELOW the input — not inside it.\n * Backspace on an empty input removes the last chip.\n */\nconst EmailChipsField: React.FC<EmailChipsFieldProps> = ({\n\tchips,\n\tonChange,\n\tplaceholder,\n\tnativeID,\n\thint,\n}) => {\n\tconst [buffer, setBuffer] = useState('');\n\n\tconst commit = () => {\n\t\tconst parts = buffer\n\t\t\t.split(',')\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\t\tif (parts.length) {\n\t\t\tonChange([...chips, ...parts.filter((p) => !chips.includes(p))]);\n\t\t}\n\t\tsetBuffer('');\n\t};\n\n\treturn (\n\t\t<ChipsFieldWrap>\n\t\t\t<EmailInputBox\n\t\t\t\tid={nativeID}\n\t\t\t\ttype=\"text\"\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tvalue={buffer}\n\t\t\t\tonChange={(e) => setBuffer(e.target.value)}\n\t\t\t\tonBlur={commit}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === 'Enter' || e.key === ',') {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tcommit();\n\t\t\t\t\t} else if (\n\t\t\t\t\t\te.key === 'Backspace' &&\n\t\t\t\t\t\tbuffer === '' &&\n\t\t\t\t\t\tchips.length > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tonChange(chips.slice(0, -1));\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{hint}\n\t\t\t{chips.length > 0 && (\n\t\t\t\t<ChipRow>\n\t\t\t\t\t{chips.map((email, i) => (\n\t\t\t\t\t\t<Tag\n\t\t\t\t\t\t\tkey={`${email}-${i}`}\n\t\t\t\t\t\t\ttagText={email}\n\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\ttype=\"neutral\"\n\t\t\t\t\t\t\tvariant=\"regular\"\n\t\t\t\t\t\t\tTrailingIcon={CrossIcon}\n\t\t\t\t\t\t\tonTrailingIconClicked={() =>\n\t\t\t\t\t\t\t\tonChange(chips.filter((_, idx) => idx !== i))\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</ChipRow>\n\t\t\t)}\n\t\t</ChipsFieldWrap>\n\t);\n};\n\n/** Field values keyed by param key (the editable part of a {@link ParamsBlob}). */\ntype ParamValues = Record<string, string | boolean | number | object>;\n\nconst seedValues = (\n\ttemplate: ParamsBlob,\n\tinitial?: ConfigToolConfig,\n): ParamValues => {\n\tconst values: ParamValues = {};\n\tObject.keys(template).forEach((key) => {\n\t\tvalues[key] = initial?.params[key]?.value ?? template[key].value;\n\t});\n\treturn values;\n};\n\n/** Chips ↔ the string value KeywordInput fields carry (comma-separated). */\nconst toChips = (value: unknown): string[] =>\n\tString(value ?? '')\n\t\t.split(',')\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\n/**\n * Shared right-side drawer for the params-driven configurable tools (email /\n * Slack). Fully backend-driven: it renders the template fields by their\n * `component` kind and returns the same blob with values filled in. KeywordInput\n * renders as multi-value email chips only for `send_email`; every other tool\n * gets a plain single-line input. Mount it fresh per open (key it) so `initial`\n * seeds the state. Built on the shared `SideModal` shell.\n */\nexport const ConfigToolPanel: React.FC<ConfigToolPanelProps> = ({\n\ttoolKey,\n\ttemplate,\n\tonClose,\n\tonSave,\n\tinitial,\n\tonImprove,\n\tcharLimits = AGENT_CHAR_LIMITS,\n\tzIndex,\n}) => {\n\tconst [values, setValues] = useState<ParamValues>(() =>\n\t\tseedValues(template, initial),\n\t);\n\tconst [saving, setSaving] = useState(false);\n\n\tconst fields = Object.values(template);\n\tconst isEmail = toolKey === 'send_email';\n\tconst setValue = (key: string, value: string | boolean | number | object) =>\n\t\tsetValues((prev) => ({ ...prev, [key]: value }));\n\n\tconst canSave = fields.every(\n\t\t(f) => !f.required || String(values[f.key] ?? '').trim() !== '',\n\t);\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst params: ParamsBlob = {};\n\t\tfields.forEach((f) => {\n\t\t\t// Save the FULL descriptor with only `value` changed — the backend\n\t\t\t// infers each field's type from `component` and reads `required`.\n\t\t\tparams[f.key] = { ...f, value: values[f.key] };\n\t\t});\n\t\tconst config: ConfigToolConfig = {\n\t\t\tid: initial?.id ?? `${toolKey}_${Date.now().toString(36)}`,\n\t\t\ttool_key: toolKey,\n\t\t\tparams,\n\t\t};\n\t\tconst result = onSave(config);\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst renderField = (field: ParamField) => {\n\t\tconst testId = `config-tool-${field.key.toLowerCase()}`;\n\t\tswitch (field.component) {\n\t\t\t// Multi-value email chips — only for the email tool. Slack's KeywordInput\n\t\t\t// (channelId) falls through to the plain input below.\n\t\t\tcase 'KeywordInput':\n\t\t\t\tif (!isEmail) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<FieldBlock key={field.key}>\n\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t{field.title}\n\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t<EmailChipsField\n\t\t\t\t\t\t\tnativeID={testId}\n\t\t\t\t\t\t\tplaceholder={field.hint ?? ''}\n\t\t\t\t\t\t\tchips={toChips(values[field.key])}\n\t\t\t\t\t\t\tonChange={(chips) => setValue(field.key, chips.join(','))}\n\t\t\t\t\t\t\thint={\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\tPress Enter or comma to add multiple emails\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FieldBlock>\n\t\t\t\t);\n\t\t\tcase 'MultilineInput':\n\t\t\t\treturn (\n\t\t\t\t\t<ToolInstructionsField\n\t\t\t\t\t\tkey={field.key}\n\t\t\t\t\t\tdata-test={testId}\n\t\t\t\t\t\tlabel={field.title}\n\t\t\t\t\t\tvalue={String(values[field.key] ?? '')}\n\t\t\t\t\t\tonChange={(text) => setValue(field.key, text)}\n\t\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\t\tplaceholder={field.hint ?? ''}\n\t\t\t\t\t\tonImprove={onImprove}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase 'Switch':\n\t\t\t\treturn (\n\t\t\t\t\t<SwitchRow key={field.key}>\n\t\t\t\t\t\t<SwitchText>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t{field.title}\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t{field.hint && (\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\t{field.hint}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</SwitchText>\n\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\tdata-test={testId}\n\t\t\t\t\t\t\tvalue={Boolean(values[field.key])}\n\t\t\t\t\t\t\tonValueChange={async (next) => setValue(field.key, next)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SwitchRow>\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\treturn (\n\t\t\t<Input\n\t\t\t\tkey={field.key}\n\t\t\t\tdata-test={testId}\n\t\t\t\tvariant=\"small\"\n\t\t\t\tlabelText={field.title}\n\t\t\t\tlabelTextBold\n\t\t\t\tplaceholder={field.hint ?? ''}\n\t\t\t\tvalue={String(values[field.key] ?? '')}\n\t\t\t\tonChangeText={(text) => setValue(field.key, text)}\n\t\t\t/>\n\t\t);\n\t};\n\n\tconst copy = TOOL_COPY[toolKey];\n\n\treturn (\n\t\t<SideModal\n\t\t\theader={copy.title}\n\t\t\tcloseOnEscapeKey={false}\n\t\t\tzIndex={zIndex}\n\t\t\theaderCustomComponent={\n\t\t\t\t<DrawerHeaderText\n\t\t\t\t\ttitle={copy.title}\n\t\t\t\t\tsubtitle={copy.subtitle}\n\t\t\t\t\ticon={\n\t\t\t\t\t\tSOURCE_ICONS[\n\t\t\t\t\t\t\ttoolKey === 'send_slack_message'\n\t\t\t\t\t\t\t\t? ToolSource.Slack\n\t\t\t\t\t\t\t\t: ToolSource.EmailHandover\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\thideCrossButton={false}\n\t\t\twidth=\"431px\"\n\t\t\theaderStyle={DRAWER_HEADER_STYLE}\n\t\t\tbodyStyle={DRAWER_BODY_STYLE}\n\t\t\tonClose={onClose}\n\t\t\tsaveButtonProps={{\n\t\t\t\t'data-test': 'config-tool-save',\n\t\t\t\tbuttonText: 'Save',\n\t\t\t\tbuttonType: 'primary',\n\t\t\t\tsize: 'small',\n\t\t\t\tdisabled: !canSave,\n\t\t\t\tisLoading: saving,\n\t\t\t\tonClick: handleSave,\n\t\t\t}}\n\t\t\tcancelButtonProps={{\n\t\t\t\t'data-test': 'config-tool-cancel',\n\t\t\t\tbuttonText: 'Cancel',\n\t\t\t\tbuttonType: 'tertiaryGray',\n\t\t\t\tsize: 'small',\n\t\t\t\tonClick: onClose,\n\t\t\t}}\n\t\t>\n\t\t\t{fields.map(renderField)}\n\t\t</SideModal>\n\t);\n};\n\nconst ChipsFieldWrap = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n`;\n\nconst EmailInputBox = styled.input`\n\twidth: 100%;\n\tmin-width: 0;\n\tbox-sizing: border-box;\n\theight: 32px;\n\tpadding: 0 8px;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 4px;\n\tfont-family: 'Inter', sans-serif;\n\tfont-size: 14px;\n\tcolor: ${COLORS.content.primary};\n\tbackground: ${COLORS.surface.standard};\n\toutline: none;\n\n\t&::placeholder {\n\t\tcolor: ${COLORS.content.secondary};\n\t}\n\n\t&:focus {\n\t\tborder-color: ${COLORS.stroke.brand};\n\t}\n`;\n\nconst ChipRow = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 6px;\n`;\n\nconst SwitchRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n`;\n\nconst SwitchText = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n`;\n"],"names":["TOOL_COPY","EmailChipsField","chips","onChange","placeholder","nativeID","hint","buffer","setBuffer","useState","commit","parts","p","ChipsFieldWrap","jsx","EmailInputBox","e","ChipRow","email","i","Tag","CrossIcon","_","idx","seedValues","template","initial","values","key","toChips","value","s","ConfigToolPanel","toolKey","onClose","onSave","onImprove","charLimits","AGENT_CHAR_LIMITS","zIndex","setValues","saving","setSaving","fields","isEmail","setValue","prev","canSave","f","handleSave","params","config","result","renderField","field","testId","FieldBlock","TitleSmall","COLORS","BodyCaption","ToolInstructionsField","text","SwitchRow","jsxs","SwitchText","Switch","next","Input","copy","SideModal","DrawerHeaderText","SOURCE_ICONS","ToolSource","DRAWER_HEADER_STYLE","DRAWER_BODY_STYLE","styled"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { AgentTool, SubAgentDraft } from '../AgentBuilder.model';
|
|
2
|
+
import { AgentTool, ConfigToolKey, ParamsBlob, SubAgentDraft } from '../AgentBuilder.model';
|
|
3
3
|
import { AgentCharLimits } from '../constants/charLimits';
|
|
4
4
|
interface CreateSubAgentPanelProps {
|
|
5
5
|
onClose: () => void;
|
|
@@ -8,6 +8,14 @@ interface CreateSubAgentPanelProps {
|
|
|
8
8
|
availableTools: AgentTool[];
|
|
9
9
|
/** Optional "Improve with AI" for instructions / guardrails. Omit to hide the buttons. */
|
|
10
10
|
onImprove?: (kind: 'instructions' | 'guardrail', text: string) => Promise<string>;
|
|
11
|
+
/** Optional "Improve with AI" for the Rest API / config-tool drawers. */
|
|
12
|
+
onImproveToolInstructions?: (text: string) => Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Backend templates (email / Slack) that drive the shared config-tool drawer.
|
|
15
|
+
* Each present key enables its tool action in this drawer; absent → hidden.
|
|
16
|
+
* Same prop the main builder gets — sub-agents can add the same tools.
|
|
17
|
+
*/
|
|
18
|
+
configToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;
|
|
11
19
|
/** Header title — "Create sub-agent" (default) or "Edit sub-agent". */
|
|
12
20
|
title?: string;
|
|
13
21
|
/** Initial values, e.g. when configuring an existing sub-agent. */
|