@bikdotai/bik-component-library 0.0.823 → 0.0.824
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/adbanner/AdBanner.js.map +1 -0
- package/dist/cjs/components/{banner → adbanner}/Banner.styled.js +13 -9
- package/dist/cjs/components/adbanner/Banner.styled.js.map +1 -0
- package/dist/cjs/components/adbanner/BannerInline.js.map +1 -0
- package/dist/cjs/components/adbanner/BannerWithImage.js.map +1 -0
- package/dist/cjs/components/adbanner/CardBanner.js.map +1 -0
- package/dist/cjs/components/adbanner/CardBannerWithImage.js.map +1 -0
- package/dist/cjs/components/adbanner/model.js.map +1 -0
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +1 -1
- package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- 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/utils/mentionSerialization.js +2 -2
- package/dist/cjs/components/agent-builder/utils/mentionSerialization.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 +143 -5
- package/dist/cjs/editor/BikEditor.styles.js.map +1 -1
- package/dist/cjs/editor/BikEditor.types.js.map +1 -1
- package/dist/cjs/editor/BikEditor.utils.js +3 -2
- package/dist/cjs/editor/BikEditor.utils.js.map +1 -1
- package/dist/cjs/editor/extensions/buildExtensions.js +3 -1
- package/dist/cjs/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/cjs/editor/extensions/jsonHighlight/JsonHighlightExtension.js +4 -0
- package/dist/cjs/editor/extensions/jsonHighlight/JsonHighlightExtension.js.map +1 -0
- package/dist/cjs/editor/extensions/jsonHighlight/tokenizeJson.js +2 -0
- package/dist/cjs/editor/extensions/jsonHighlight/tokenizeJson.js.map +1 -0
- package/dist/cjs/icons/Actions/Common actions/ProductTour.js +2 -0
- package/dist/cjs/icons/Actions/Common actions/ProductTour.js.map +1 -0
- package/dist/cjs/icons/Actions/Common actions/RestApi.js +2 -0
- package/dist/cjs/icons/Actions/Common actions/RestApi.js.map +1 -0
- package/dist/cjs/icons/Actions/Common actions/Save.js +2 -0
- package/dist/cjs/icons/Actions/Common actions/Save.js.map +1 -0
- package/dist/cjs/icons/Actions/Common actions/Shortcut.js +2 -0
- package/dist/cjs/icons/Actions/Common actions/Shortcut.js.map +1 -0
- package/dist/cjs/icons/BIK AI specific/WandSparkles.js +2 -0
- package/dist/cjs/icons/BIK AI specific/WandSparkles.js.map +1 -0
- package/dist/cjs/icons/BIK AI specific/Webhook.js +2 -0
- package/dist/cjs/icons/BIK AI specific/Webhook.js.map +1 -0
- package/dist/cjs/icons/Informational/Store related/TicketForm.js +2 -0
- package/dist/cjs/icons/Informational/Store related/TicketForm.js.map +1 -0
- package/dist/cjs/icons/Legacy - Bikayi specific/Services/LoudSpeaker.js +2 -0
- package/dist/cjs/icons/Legacy - Bikayi specific/Services/LoudSpeaker.js.map +1 -0
- package/dist/cjs/icons/index.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/components/adbanner/AdBanner.js.map +1 -0
- package/dist/esm/components/{banner → adbanner}/Banner.styled.js +18 -14
- package/dist/esm/components/adbanner/Banner.styled.js.map +1 -0
- package/dist/esm/components/adbanner/BannerInline.js.map +1 -0
- package/dist/esm/components/adbanner/BannerWithImage.js.map +1 -0
- package/dist/esm/components/adbanner/CardBanner.js.map +1 -0
- package/dist/esm/components/adbanner/CardBannerWithImage.js.map +1 -0
- package/dist/esm/components/adbanner/model.js.map +1 -0
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +24 -24
- package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +98 -101
- package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
- package/dist/esm/components/agent-builder/utils/mentionSerialization.d.ts +5 -7
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js +40 -37
- package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
- package/dist/esm/editor/BikEditor.js +247 -181
- package/dist/esm/editor/BikEditor.js.map +1 -1
- package/dist/esm/editor/BikEditor.styles.d.ts +9 -0
- package/dist/esm/editor/BikEditor.styles.js +147 -7
- package/dist/esm/editor/BikEditor.styles.js.map +1 -1
- package/dist/esm/editor/BikEditor.types.d.ts +76 -0
- package/dist/esm/editor/BikEditor.types.js.map +1 -1
- package/dist/esm/editor/BikEditor.utils.d.ts +15 -1
- package/dist/esm/editor/BikEditor.utils.js +155 -92
- package/dist/esm/editor/BikEditor.utils.js.map +1 -1
- package/dist/esm/editor/extensions/buildExtensions.d.ts +1 -1
- package/dist/esm/editor/extensions/buildExtensions.js +86 -55
- package/dist/esm/editor/extensions/buildExtensions.js.map +1 -1
- package/dist/esm/editor/extensions/jsonHighlight/JsonHighlightExtension.d.ts +14 -0
- package/dist/esm/editor/extensions/jsonHighlight/JsonHighlightExtension.js +132 -0
- package/dist/esm/editor/extensions/jsonHighlight/JsonHighlightExtension.js.map +1 -0
- package/dist/esm/editor/extensions/jsonHighlight/tokenizeJson.d.ts +18 -0
- package/dist/esm/editor/extensions/jsonHighlight/tokenizeJson.js +21 -0
- package/dist/esm/editor/extensions/jsonHighlight/tokenizeJson.js.map +1 -0
- package/dist/esm/editor/index.d.ts +1 -1
- package/dist/esm/icons/Actions/Common actions/ProductTour.d.ts +7 -0
- package/dist/esm/icons/Actions/Common actions/ProductTour.js +51 -0
- package/dist/esm/icons/Actions/Common actions/ProductTour.js.map +1 -0
- package/dist/esm/icons/Actions/Common actions/RestApi.d.ts +7 -0
- package/dist/esm/icons/Actions/Common actions/RestApi.js +29 -0
- package/dist/esm/icons/Actions/Common actions/RestApi.js.map +1 -0
- package/dist/esm/icons/Actions/Common actions/Save.d.ts +7 -0
- package/dist/esm/icons/Actions/Common actions/Save.js +40 -0
- package/dist/esm/icons/Actions/Common actions/Save.js.map +1 -0
- package/dist/esm/icons/Actions/Common actions/Shortcut.d.ts +7 -0
- package/dist/esm/icons/Actions/Common actions/Shortcut.js +40 -0
- package/dist/esm/icons/Actions/Common actions/Shortcut.js.map +1 -0
- package/dist/esm/icons/Actions/Common actions/index.d.ts +4 -0
- package/dist/esm/icons/BIK AI specific/WandSparkles.d.ts +7 -0
- package/dist/esm/icons/BIK AI specific/WandSparkles.js +39 -0
- package/dist/esm/icons/BIK AI specific/WandSparkles.js.map +1 -0
- package/dist/esm/icons/BIK AI specific/Webhook.d.ts +7 -0
- package/dist/esm/icons/BIK AI specific/Webhook.js +32 -0
- package/dist/esm/icons/BIK AI specific/Webhook.js.map +1 -0
- package/dist/esm/icons/BIK AI specific/index.d.ts +2 -0
- package/dist/esm/icons/Informational/Store related/TicketForm.d.ts +7 -0
- package/dist/esm/icons/Informational/Store related/TicketForm.js +65 -0
- package/dist/esm/icons/Informational/Store related/TicketForm.js.map +1 -0
- package/dist/esm/icons/Informational/Store related/index.d.ts +1 -0
- package/dist/esm/icons/Legacy - Bikayi specific/Services/LoudSpeaker.d.ts +7 -0
- package/dist/esm/icons/Legacy - Bikayi specific/Services/LoudSpeaker.js +35 -0
- package/dist/esm/icons/Legacy - Bikayi specific/Services/LoudSpeaker.js.map +1 -0
- package/dist/esm/icons/Legacy - Bikayi specific/Services/index.d.ts +1 -0
- package/dist/esm/icons/index.d.ts +4 -4
- package/dist/esm/icons/index.js +284 -268
- package/dist/esm/icons/index.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -2
- package/package.json +1 -1
- package/dist/cjs/components/banner/AdBanner.js.map +0 -1
- package/dist/cjs/components/banner/Banner.styled.js.map +0 -1
- package/dist/cjs/components/banner/BannerInline.js.map +0 -1
- package/dist/cjs/components/banner/BannerWithImage.js.map +0 -1
- package/dist/cjs/components/banner/CardBanner.js.map +0 -1
- package/dist/cjs/components/banner/CardBannerWithImage.js.map +0 -1
- package/dist/cjs/components/banner/model.js.map +0 -1
- package/dist/esm/components/banner/AdBanner.js.map +0 -1
- package/dist/esm/components/banner/Banner.stories.d.ts +0 -39
- package/dist/esm/components/banner/Banner.styled.js.map +0 -1
- package/dist/esm/components/banner/BannerInline.js.map +0 -1
- package/dist/esm/components/banner/BannerWithImage.js.map +0 -1
- package/dist/esm/components/banner/CardBanner.js.map +0 -1
- package/dist/esm/components/banner/CardBannerWithImage.js.map +0 -1
- package/dist/esm/components/banner/model.js.map +0 -1
- /package/dist/cjs/components/{banner → adbanner}/AdBanner.js +0 -0
- /package/dist/cjs/components/{banner → adbanner}/BannerInline.js +0 -0
- /package/dist/cjs/components/{banner → adbanner}/BannerWithImage.js +0 -0
- /package/dist/cjs/components/{banner → adbanner}/CardBanner.js +0 -0
- /package/dist/cjs/components/{banner → adbanner}/CardBannerWithImage.js +0 -0
- /package/dist/cjs/components/{banner → adbanner}/model.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/AdBanner.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/AdBanner.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/Banner.styled.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/BannerInline.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/BannerInline.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/BannerWithImage.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/BannerWithImage.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/CardBanner.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/CardBanner.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/CardBannerWithImage.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/CardBannerWithImage.js +0 -0
- /package/dist/esm/components/{banner → adbanner}/index.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/model.d.ts +0 -0
- /package/dist/esm/components/{banner → adbanner}/model.js +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs as l, Fragment as rt, jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import st from "../../../assets/icons/cross.svg.js";
|
|
3
|
-
import { useState as s, useMemo as
|
|
4
|
-
import { TitleRegular as
|
|
3
|
+
import { useState as s, useMemo as at, useRef as f, useCallback as c } from "react";
|
|
4
|
+
import { TitleRegular as it, BodySecondary as lt } from "../../TypographyStyle.js";
|
|
5
5
|
import { addUnique as L } from "../../../utils/arrayUtils.js";
|
|
6
|
-
import { COLORS as
|
|
6
|
+
import { COLORS as _ } from "../../../constants/Theme.js";
|
|
7
7
|
import { SubAgentScrim as ct, SubAgentPanel as ut, SubAgentPanelHeader as dt, SubAgentPanelHeaderText as mt, SubAgentCloseButton as gt, SubAgentPanelBody as pt, SubAgentPanelFooter as ft } from "../AgentBuilder.styled.js";
|
|
8
8
|
import { AGENT_CHAR_LIMITS as ht } from "../constants/charLimits.js";
|
|
9
9
|
import { buildAgentMentionItems as bt, toolSourceLabel as yt } from "../utils/mentionSerialization.js";
|
|
@@ -16,16 +16,16 @@ import { Toaster as xt } from "../../toaster/Toaster.js";
|
|
|
16
16
|
const Ut = ({
|
|
17
17
|
onClose: h,
|
|
18
18
|
onSave: j,
|
|
19
|
-
availableTools:
|
|
19
|
+
availableTools: a,
|
|
20
20
|
onImprove: It,
|
|
21
21
|
title: w = "Create sub-agent",
|
|
22
22
|
initial: u,
|
|
23
23
|
appLabel: G = "Manifest",
|
|
24
24
|
charLimits: b = ht
|
|
25
25
|
}) => {
|
|
26
|
-
const [y, $] = s(u?.name ?? ""), [d, S] = s(u?.instructions ?? ""), [m, C] = s(u?.guardrail ?? ""), [x, g] = s(u?.tools ?? []), [M,
|
|
27
|
-
() => bt(
|
|
28
|
-
[
|
|
26
|
+
const [y, $] = s(u?.name ?? ""), [d, S] = s(u?.instructions ?? ""), [m, C] = s(u?.guardrail ?? ""), [x, g] = s(u?.tools ?? []), [M, B] = s(!1), [z, k] = s(0), [q, E] = s(0), [Tt, vt] = s(null), I = at(
|
|
27
|
+
() => bt(a, [], G),
|
|
28
|
+
[a, G]
|
|
29
29
|
), p = f({}), T = f("instructions"), W = c((t) => {
|
|
30
30
|
p.current.instructions = t ?? void 0;
|
|
31
31
|
}, []), D = c((t) => {
|
|
@@ -43,31 +43,31 @@ const Ut = ({
|
|
|
43
43
|
(p.current[T.current] ?? p.current.instructions)?.("tool", t);
|
|
44
44
|
}, []), [v, A] = s(
|
|
45
45
|
null
|
|
46
|
-
),
|
|
47
|
-
const e =
|
|
48
|
-
|
|
46
|
+
), R = f(null), H = f(0), X = (t) => {
|
|
47
|
+
const e = a.find((o) => o.tool_id === t), n = `{{tool:${t}}}`, i = (o) => o.split(n).join("");
|
|
48
|
+
R.current = { instructions: d, guardrail: m, tools: x }, S((o) => i(o)), C((o) => i(o)), g((o) => o.filter((ot) => ot !== t)), k((o) => o + 1), E((o) => o + 1), H.current += 1, A({
|
|
49
49
|
id: H.current,
|
|
50
50
|
message: `Tool "${e?.display_name ?? "Tool"}" removed`
|
|
51
51
|
});
|
|
52
52
|
}, Y = () => {
|
|
53
|
-
const t =
|
|
54
|
-
t && (S(t.instructions), C(t.guardrail), g(t.tools),
|
|
53
|
+
const t = R.current;
|
|
54
|
+
t && (S(t.instructions), C(t.guardrail), g(t.tools), k((e) => e + 1), E((e) => e + 1), R.current = null), A(null);
|
|
55
55
|
}, K = y.trim().length > 0 && (d.trim().length > 0 || m.trim().length > 0), Z = x.map((t) => {
|
|
56
|
-
const e =
|
|
56
|
+
const e = a.find((n) => n.tool_id === t);
|
|
57
57
|
return e ? {
|
|
58
58
|
id: t,
|
|
59
59
|
label: e.display_name,
|
|
60
60
|
icon: P[e.source ?? "manifest"]
|
|
61
61
|
} : null;
|
|
62
|
-
}).filter((t) => t !== null), tt =
|
|
62
|
+
}).filter((t) => t !== null), tt = a.map((t) => ({
|
|
63
63
|
label: t.display_name,
|
|
64
64
|
value: t.tool_id,
|
|
65
65
|
leadingIcon: F(P[t.source ?? "manifest"]) ?? void 0
|
|
66
66
|
})), et = (() => {
|
|
67
67
|
const t = [], e = /* @__PURE__ */ new Map();
|
|
68
|
-
return
|
|
69
|
-
const
|
|
70
|
-
e.has(
|
|
68
|
+
return a.forEach((n) => {
|
|
69
|
+
const i = n.source ?? "manifest";
|
|
70
|
+
e.has(i) || (e.set(i, []), t.push(i)), e.get(i)?.push({
|
|
71
71
|
label: n.display_name,
|
|
72
72
|
value: n.tool_id,
|
|
73
73
|
leadingIcon: F(P[n.source ?? "manifest"]) ?? void 0
|
|
@@ -87,11 +87,11 @@ const Ut = ({
|
|
|
87
87
|
tools: x
|
|
88
88
|
});
|
|
89
89
|
if (t && typeof t.then == "function") {
|
|
90
|
-
|
|
90
|
+
B(!0);
|
|
91
91
|
try {
|
|
92
92
|
await t;
|
|
93
93
|
} finally {
|
|
94
|
-
|
|
94
|
+
B(!1);
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
};
|
|
@@ -100,15 +100,15 @@ const Ut = ({
|
|
|
100
100
|
/* @__PURE__ */ l(ut, { "data-test": "create-subagent-panel", children: [
|
|
101
101
|
/* @__PURE__ */ l(dt, { children: [
|
|
102
102
|
/* @__PURE__ */ l(mt, { children: [
|
|
103
|
-
/* @__PURE__ */ r(
|
|
104
|
-
/* @__PURE__ */ r(lt, { color:
|
|
103
|
+
/* @__PURE__ */ r(it, { color: _.content.primary, children: w }),
|
|
104
|
+
/* @__PURE__ */ r(lt, { color: _.content.secondary, children: "Each sub-agent handles one piece of the job. Use @ in the main instructions to call them." })
|
|
105
105
|
] }),
|
|
106
106
|
/* @__PURE__ */ r(gt, { onClick: h, "aria-label": "Close", children: /* @__PURE__ */ r(
|
|
107
107
|
st,
|
|
108
108
|
{
|
|
109
109
|
width: 20,
|
|
110
110
|
height: 20,
|
|
111
|
-
color:
|
|
111
|
+
color: _.content.secondary
|
|
112
112
|
}
|
|
113
113
|
) })
|
|
114
114
|
] }),
|
|
@@ -139,7 +139,7 @@ const Ut = ({
|
|
|
139
139
|
minHeight: "160px",
|
|
140
140
|
resetKey: `instr-${z}`,
|
|
141
141
|
mentionItems: I,
|
|
142
|
-
tools:
|
|
142
|
+
tools: a,
|
|
143
143
|
onMentionSelect: O,
|
|
144
144
|
onFocus: J,
|
|
145
145
|
registerInsert: W
|
|
@@ -157,7 +157,7 @@ const Ut = ({
|
|
|
157
157
|
minHeight: "160px",
|
|
158
158
|
resetKey: `guard-${q}`,
|
|
159
159
|
mentionItems: I,
|
|
160
|
-
tools:
|
|
160
|
+
tools: a,
|
|
161
161
|
onMentionSelect: O,
|
|
162
162
|
onFocus: Q,
|
|
163
163
|
registerInsert: D
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Button } from '@src/components/button';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { Toaster } from '@src/components/toaster';\nimport { BodySecondary, TitleRegular } from '@src/components/TypographyStyle';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport { AgentTool, SubAgentDraft } from '../AgentBuilder.model';\nimport {\n\tSubAgentCloseButton,\n\tSubAgentPanel,\n\tSubAgentPanelBody,\n\tSubAgentPanelFooter,\n\tSubAgentPanelHeader,\n\tSubAgentPanelHeaderText,\n\tSubAgentScrim,\n} from '../AgentBuilder.styled';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport {\n\tbuildAgentMentionItems,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { renderSourceIcon, SOURCE_ICONS } from '../utils/sourceIcons';\nimport { MentionEditor } from './MentionEditor';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\ntype InsertFn = (kind: 'tool' | 'subagent', id: string, label?: string) => void;\n\ninterface CreateSubAgentPanelProps {\n\tonClose: () => void;\n\t/** Persist the draft. The drawer shows a loader while the returned promise is pending. */\n\tonSave: (draft: SubAgentDraft) => void | Promise<void>;\n\tavailableTools: AgentTool[];\n\t/** Optional \"Improve with AI\" for instructions / guardrails. Omit to hide the buttons. */\n\tonImprove?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\tconst [saving, setSaving] = useState(false);\n\t// Bumped to remount a field after its text is replaced (e.g. by Improve).\n\tconst [instrKey, setInstrKey] = useState(0);\n\tconst [guardKey, setGuardKey] = useState(0);\n\tconst [improving, setImproving] = useState<\n\t\t'instructions' | 'guardrail' | null\n\t>(null);\n\n\t// Tools-only mention list (sub-agents can't reference other sub-agents).\n\tconst mentionItems = useMemo(\n\t\t() => buildAgentMentionItems(availableTools, [], appLabel),\n\t\t[availableTools, appLabel],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tif (kind === 'tool') {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback((id: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id);\n\t}, []);\n\n\t// Local undo toast for tool removal (drawer state isn't in AgentValue).\n\tconst [undo, setUndo] = useState<{ id: number; message: string } | null>(\n\t\tnull,\n\t);\n\tconst undoSnapshotRef = useRef<{\n\t\tinstructions: string;\n\t\tguardrail: string;\n\t\ttools: string[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst removeTool = (id: string) => {\n\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\tconst token = tool ? `{{tool:${tool.function_key}}}` : null;\n\t\tconst strip = (text: string) => (token ? text.split(token).join('') : text);\n\t\tundoSnapshotRef.current = { instructions, guardrail, tools };\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({\n\t\t\tid: undoIdRef.current,\n\t\t\tmessage: `Tool \"${tool?.display_name ?? 'Tool'}\" removed`,\n\t\t});\n\t};\n\n\tconst undoRemove = () => {\n\t\tconst snap = undoSnapshotRef.current;\n\t\tif (snap) {\n\t\t\tsetInstructions(snap.instructions);\n\t\t\tsetGuardrail(snap.guardrail);\n\t\t\tsetTools(snap.tools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst canSave =\n\t\tname.trim().length > 0 &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: SOURCE_ICONS[tool.source ?? 'manifest'],\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(SOURCE_ICONS[t.source ?? 'manifest']) ?? undefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? 'manifest';\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(SOURCE_ICONS[t.source ?? 'manifest']) ?? undefined,\n\t\t\t});\n\t\t});\n\t\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t});\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleImprove = async (kind: 'instructions' | 'guardrail') => {\n\t\tif (!onImprove || improving) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(kind);\n\t\ttry {\n\t\t\tconst current = kind === 'instructions' ? instructions : guardrail;\n\t\t\tconst improved = await onImprove(kind, current);\n\t\t\tif (kind === 'instructions') {\n\t\t\t\tsetInstructions(improved);\n\t\t\t\tsetInstrKey((k) => k + 1);\n\t\t\t} else {\n\t\t\t\tsetGuardrail(improved);\n\t\t\t\tsetGuardKey((k) => k + 1);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetImproving(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SubAgentScrim onClick={onClose} data-test=\"subagent-scrim\" />\n\t\t\t<SubAgentPanel data-test=\"create-subagent-panel\">\n\t\t\t\t<SubAgentPanelHeader>\n\t\t\t\t\t<SubAgentPanelHeaderText>\n\t\t\t\t\t\t<TitleRegular color={COLORS.content.primary}>{title}</TitleRegular>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tEach sub-agent handles one piece of the job. Use @ in the main\n\t\t\t\t\t\t\tinstructions to call them.\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t</SubAgentPanelHeaderText>\n\t\t\t\t\t<SubAgentCloseButton onClick={onClose} aria-label=\"Close\">\n\t\t\t\t\t\t<CrossIcon\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.secondary}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SubAgentCloseButton>\n\t\t\t\t</SubAgentPanelHeader>\n\n\t\t\t\t<SubAgentPanelBody>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\t\tlabelTextBold\n\t\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\t\tonChangeText={setName}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tvalue={instructions}\n\t\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\t\tplaceholder=\"Write the steps in plain English. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelBody>\n\n\t\t\t\t<SubAgentPanelFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-save\"\n\t\t\t\t\t\tbuttonType=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Save\"\n\t\t\t\t\t\tdisabled={!canSave}\n\t\t\t\t\t\tisLoading={saving}\n\t\t\t\t\t\tonClick={handleSave}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-cancel\"\n\t\t\t\t\t\tbuttonType=\"tertiaryGray\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Cancel\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelFooter>\n\t\t\t</SubAgentPanel>\n\n\t\t\t{undo && (\n\t\t\t\t<Toaster\n\t\t\t\t\tkey={undo.id}\n\t\t\t\t\ttext={undo.message}\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tposition=\"top-right\"\n\t\t\t\t\tautoClose={5000}\n\t\t\t\t\thideCloseButton\n\t\t\t\t\tbuttonProps={{\n\t\t\t\t\t\tbuttonText: 'Undo',\n\t\t\t\t\t\tshowButton: true,\n\t\t\t\t\t\tonButtonClick: () => {\n\t\t\t\t\t\t\tundoRemove();\n\t\t\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonCloseToast={() => setUndo(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n"],"names":["CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","title","initial","appLabel","charLimits","AGENT_CHAR_LIMITS","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","insertersRef","useRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","tool","t","token","strip","text","k","undoRemove","snap","canSave","toolItems","SOURCE_ICONS","x","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","handleSave","result","jsxs","Fragment","jsx","SubAgentScrim","SubAgentPanel","SubAgentPanelHeader","SubAgentPanelHeaderText","TitleRegular","COLORS","BodySecondary","SubAgentCloseButton","CrossIcon","SubAgentPanelBody","Input","MentionEditor","SelectableListSection","SubAgentPanelFooter","Button","Toaster"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Button } from '@src/components/button';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { Toaster } from '@src/components/toaster';\nimport { BodySecondary, TitleRegular } from '@src/components/TypographyStyle';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport { AgentTool, SubAgentDraft } from '../AgentBuilder.model';\nimport {\n\tSubAgentCloseButton,\n\tSubAgentPanel,\n\tSubAgentPanelBody,\n\tSubAgentPanelFooter,\n\tSubAgentPanelHeader,\n\tSubAgentPanelHeaderText,\n\tSubAgentScrim,\n} from '../AgentBuilder.styled';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport {\n\tbuildAgentMentionItems,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport { renderSourceIcon, SOURCE_ICONS } from '../utils/sourceIcons';\nimport { MentionEditor } from './MentionEditor';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\ntype InsertFn = (kind: 'tool' | 'subagent', id: string, label?: string) => void;\n\ninterface CreateSubAgentPanelProps {\n\tonClose: () => void;\n\t/** Persist the draft. The drawer shows a loader while the returned promise is pending. */\n\tonSave: (draft: SubAgentDraft) => void | Promise<void>;\n\tavailableTools: AgentTool[];\n\t/** Optional \"Improve with AI\" for instructions / guardrails. Omit to hide the buttons. */\n\tonImprove?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\tconst [saving, setSaving] = useState(false);\n\t// Bumped to remount a field after its text is replaced (e.g. by Improve).\n\tconst [instrKey, setInstrKey] = useState(0);\n\tconst [guardKey, setGuardKey] = useState(0);\n\tconst [improving, setImproving] = useState<\n\t\t'instructions' | 'guardrail' | null\n\t>(null);\n\n\t// Tools-only mention list (sub-agents can't reference other sub-agents).\n\tconst mentionItems = useMemo(\n\t\t() => buildAgentMentionItems(availableTools, [], appLabel),\n\t\t[availableTools, appLabel],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tif (kind === 'tool') {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback((id: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id);\n\t}, []);\n\n\t// Local undo toast for tool removal (drawer state isn't in AgentValue).\n\tconst [undo, setUndo] = useState<{ id: number; message: string } | null>(\n\t\tnull,\n\t);\n\tconst undoSnapshotRef = useRef<{\n\t\tinstructions: string;\n\t\tguardrail: string;\n\t\ttools: string[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst removeTool = (id: string) => {\n\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t// The token stores the tool id (a tool's id is its tool_id).\n\t\tconst token = `{{tool:${id}}}`;\n\t\tconst strip = (text: string) => text.split(token).join('');\n\t\tundoSnapshotRef.current = { instructions, guardrail, tools };\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({\n\t\t\tid: undoIdRef.current,\n\t\t\tmessage: `Tool \"${tool?.display_name ?? 'Tool'}\" removed`,\n\t\t});\n\t};\n\n\tconst undoRemove = () => {\n\t\tconst snap = undoSnapshotRef.current;\n\t\tif (snap) {\n\t\t\tsetInstructions(snap.instructions);\n\t\t\tsetGuardrail(snap.guardrail);\n\t\t\tsetTools(snap.tools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst canSave =\n\t\tname.trim().length > 0 &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: SOURCE_ICONS[tool.source ?? 'manifest'],\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(SOURCE_ICONS[t.source ?? 'manifest']) ?? undefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? 'manifest';\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(SOURCE_ICONS[t.source ?? 'manifest']) ?? undefined,\n\t\t\t});\n\t\t});\n\t\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t});\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleImprove = async (kind: 'instructions' | 'guardrail') => {\n\t\tif (!onImprove || improving) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(kind);\n\t\ttry {\n\t\t\tconst current = kind === 'instructions' ? instructions : guardrail;\n\t\t\tconst improved = await onImprove(kind, current);\n\t\t\tif (kind === 'instructions') {\n\t\t\t\tsetInstructions(improved);\n\t\t\t\tsetInstrKey((k) => k + 1);\n\t\t\t} else {\n\t\t\t\tsetGuardrail(improved);\n\t\t\t\tsetGuardKey((k) => k + 1);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetImproving(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SubAgentScrim onClick={onClose} data-test=\"subagent-scrim\" />\n\t\t\t<SubAgentPanel data-test=\"create-subagent-panel\">\n\t\t\t\t<SubAgentPanelHeader>\n\t\t\t\t\t<SubAgentPanelHeaderText>\n\t\t\t\t\t\t<TitleRegular color={COLORS.content.primary}>{title}</TitleRegular>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tEach sub-agent handles one piece of the job. Use @ in the main\n\t\t\t\t\t\t\tinstructions to call them.\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t</SubAgentPanelHeaderText>\n\t\t\t\t\t<SubAgentCloseButton onClick={onClose} aria-label=\"Close\">\n\t\t\t\t\t\t<CrossIcon\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.secondary}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SubAgentCloseButton>\n\t\t\t\t</SubAgentPanelHeader>\n\n\t\t\t\t<SubAgentPanelBody>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\t\tlabelTextBold\n\t\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\t\tonChangeText={setName}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tvalue={instructions}\n\t\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\t\tplaceholder=\"Write the steps in plain English. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelBody>\n\n\t\t\t\t<SubAgentPanelFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-save\"\n\t\t\t\t\t\tbuttonType=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Save\"\n\t\t\t\t\t\tdisabled={!canSave}\n\t\t\t\t\t\tisLoading={saving}\n\t\t\t\t\t\tonClick={handleSave}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-cancel\"\n\t\t\t\t\t\tbuttonType=\"tertiaryGray\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Cancel\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelFooter>\n\t\t\t</SubAgentPanel>\n\n\t\t\t{undo && (\n\t\t\t\t<Toaster\n\t\t\t\t\tkey={undo.id}\n\t\t\t\t\ttext={undo.message}\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tposition=\"top-right\"\n\t\t\t\t\tautoClose={5000}\n\t\t\t\t\thideCloseButton\n\t\t\t\t\tbuttonProps={{\n\t\t\t\t\t\tbuttonText: 'Undo',\n\t\t\t\t\t\tshowButton: true,\n\t\t\t\t\t\tonButtonClick: () => {\n\t\t\t\t\t\t\tundoRemove();\n\t\t\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonCloseToast={() => setUndo(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n"],"names":["CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","title","initial","appLabel","charLimits","AGENT_CHAR_LIMITS","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","insertersRef","useRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","tool","t","token","strip","text","k","undoRemove","snap","canSave","toolItems","SOURCE_ICONS","x","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","handleSave","result","jsxs","Fragment","jsx","SubAgentScrim","SubAgentPanel","SubAgentPanelHeader","SubAgentPanelHeaderText","TitleRegular","COLORS","BodySecondary","SubAgentCloseButton","CrossIcon","SubAgentPanelBody","Input","MentionEditor","SelectableListSection","SubAgentPanelFooter","Button","Toaster"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
import { AGENT_CHAR_LIMITS as
|
|
4
|
-
import { getStepIndex as
|
|
5
|
-
const nt =
|
|
6
|
-
const n =
|
|
1
|
+
import { jsx as it } from "react/jsx-runtime";
|
|
2
|
+
import ut, { useState as h, useRef as d, useCallback as r, useMemo as B, useContext as dt } from "react";
|
|
3
|
+
import { AGENT_CHAR_LIMITS as gt } from "../constants/charLimits.js";
|
|
4
|
+
import { getStepIndex as mt, STEP_KEYS as _ } from "../constants/steps.js";
|
|
5
|
+
const nt = ut.createContext(null), _t = () => {
|
|
6
|
+
const n = dt(nt);
|
|
7
7
|
if (!n)
|
|
8
8
|
throw new Error(
|
|
9
9
|
"useAgentBuilderContext must be used within an AgentBuilderProvider"
|
|
10
10
|
);
|
|
11
11
|
return n;
|
|
12
|
-
},
|
|
12
|
+
}, lt = (n, s) => {
|
|
13
13
|
const g = n.trigger.mode === "custom_intent" ? (n.trigger.custom_intent ?? "").trim().length > 0 : n.trigger.intents.length > 0;
|
|
14
14
|
return {
|
|
15
15
|
about: n.name.trim().length > 0 && n.name.length <= s.name && n.description.length <= s.description,
|
|
@@ -19,172 +19,169 @@ const nt = dt.createContext(null), Mt = () => {
|
|
|
19
19
|
// Optional until specced further — never blocks go-live.
|
|
20
20
|
handover: !0
|
|
21
21
|
};
|
|
22
|
-
},
|
|
22
|
+
}, Mt = ({
|
|
23
23
|
value: n,
|
|
24
24
|
onChange: s,
|
|
25
25
|
activeStep: g,
|
|
26
|
-
onStepChange:
|
|
27
|
-
availableTools:
|
|
26
|
+
onStepChange: F,
|
|
27
|
+
availableTools: l,
|
|
28
28
|
availableSubAgents: f,
|
|
29
|
-
availableIntents:
|
|
30
|
-
availableModels:
|
|
31
|
-
validation:
|
|
32
|
-
applicationType:
|
|
33
|
-
charLimits:
|
|
34
|
-
disableStepNavigation:
|
|
35
|
-
onCreateSubAgent:
|
|
29
|
+
availableIntents: I,
|
|
30
|
+
availableModels: P,
|
|
31
|
+
validation: A,
|
|
32
|
+
applicationType: E,
|
|
33
|
+
charLimits: T,
|
|
34
|
+
disableStepNavigation: $ = !0,
|
|
35
|
+
onCreateSubAgent: w,
|
|
36
36
|
onFetchSubAgent: L,
|
|
37
|
-
onUpdateSubAgent:
|
|
38
|
-
onImproveSubAgent:
|
|
37
|
+
onUpdateSubAgent: V,
|
|
38
|
+
onImproveSubAgent: b,
|
|
39
39
|
children: et
|
|
40
40
|
}) => {
|
|
41
|
-
const [
|
|
41
|
+
const [st, rt] = h("about"), x = g ?? st, c = mt(x), j = d(n);
|
|
42
42
|
j.current = n;
|
|
43
|
-
const [
|
|
43
|
+
const [y, K] = h(0), M = d({}), q = d("instructions"), G = r(
|
|
44
44
|
(t, e) => {
|
|
45
45
|
e ? M.current[t] = e : delete M.current[t];
|
|
46
46
|
},
|
|
47
47
|
[]
|
|
48
|
-
), H =
|
|
48
|
+
), H = r((t) => {
|
|
49
49
|
q.current = t;
|
|
50
|
-
}, []), N = d(null), U =
|
|
50
|
+
}, []), N = d(null), U = r((t) => {
|
|
51
51
|
N.current = t;
|
|
52
|
-
}, []), Y =
|
|
52
|
+
}, []), Y = r(() => {
|
|
53
53
|
N.current?.();
|
|
54
|
-
}, []),
|
|
55
|
-
const
|
|
56
|
-
(
|
|
57
|
-
}, []), [
|
|
54
|
+
}, []), z = r((t, e, i) => {
|
|
55
|
+
const m = M.current;
|
|
56
|
+
(m[q.current] ?? m.instructions)?.(t, e, i);
|
|
57
|
+
}, []), [D, S] = h(null), p = d(null), J = d(0), u = r(
|
|
58
58
|
(t) => {
|
|
59
|
-
g === void 0 &&
|
|
59
|
+
g === void 0 && rt(t), F?.(t);
|
|
60
60
|
},
|
|
61
|
-
[g,
|
|
62
|
-
),
|
|
63
|
-
const t = _[Math.min(
|
|
61
|
+
[g, F]
|
|
62
|
+
), Q = r(() => {
|
|
63
|
+
const t = _[Math.min(c + 1, _.length - 1)];
|
|
64
64
|
u(t);
|
|
65
|
-
}, [
|
|
66
|
-
const t = _[Math.max(
|
|
65
|
+
}, [c, u]), W = r(() => {
|
|
66
|
+
const t = _[Math.max(c - 1, 0)];
|
|
67
67
|
u(t);
|
|
68
|
-
}, [
|
|
68
|
+
}, [c, u]), X = r(
|
|
69
69
|
(t) => s(t),
|
|
70
70
|
[s]
|
|
71
|
-
),
|
|
71
|
+
), Z = r(
|
|
72
72
|
(t, e) => s({ [t]: e }),
|
|
73
73
|
[s]
|
|
74
|
-
),
|
|
74
|
+
), k = r(
|
|
75
75
|
(t, e) => {
|
|
76
|
-
const
|
|
77
|
-
t === "tool" ?
|
|
76
|
+
const i = j.current;
|
|
77
|
+
t === "tool" ? i.tools.includes(e) || s({ tools: [...i.tools, e] }) : i.subagents.includes(e) || s({ subagents: [...i.subagents, e] });
|
|
78
78
|
},
|
|
79
79
|
[s]
|
|
80
|
-
), C =
|
|
80
|
+
), C = r(
|
|
81
81
|
(t, e) => {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
return r ? `{{tool:${r.function_key}}}` : null;
|
|
85
|
-
})() : `{{subagent:${e}}}`, l = (r) => c ? r.split(c).join("") : r;
|
|
86
|
-
x.current = {
|
|
82
|
+
const i = t === "tool" ? `{{tool:${e}}}` : `{{subagent:${e}}}`, m = (o) => o.split(i).join("");
|
|
83
|
+
p.current = {
|
|
87
84
|
tools: n.tools,
|
|
88
85
|
subagents: n.subagents,
|
|
89
86
|
instructions: n.instructions,
|
|
90
87
|
guardrail: n.guardrail
|
|
91
88
|
};
|
|
92
89
|
const tt = {
|
|
93
|
-
instructions:
|
|
94
|
-
guardrail:
|
|
95
|
-
...t === "tool" ? { tools: n.tools.filter((
|
|
90
|
+
instructions: m(n.instructions),
|
|
91
|
+
guardrail: m(n.guardrail ?? ""),
|
|
92
|
+
...t === "tool" ? { tools: n.tools.filter((o) => o !== e) } : { subagents: n.subagents.filter((o) => o !== e) }
|
|
96
93
|
};
|
|
97
|
-
s(tt),
|
|
98
|
-
const ct = t === "tool" ?
|
|
99
|
-
|
|
100
|
-
id:
|
|
94
|
+
s(tt), K((o) => o + 1);
|
|
95
|
+
const ct = t === "tool" ? l.find((o) => o.tool_id === e)?.display_name ?? "Tool" : f.find((o) => o.id === e)?.name ?? "Sub-agent";
|
|
96
|
+
J.current += 1, S({
|
|
97
|
+
id: J.current,
|
|
101
98
|
message: `${t === "tool" ? "Tool" : "Sub-agent"} "${ct}" removed`
|
|
102
99
|
});
|
|
103
100
|
},
|
|
104
|
-
[
|
|
105
|
-
), O =
|
|
106
|
-
|
|
107
|
-
}, [s]), v =
|
|
108
|
-
() => ({ ...
|
|
109
|
-
[
|
|
110
|
-
),
|
|
111
|
-
() => ({ ...
|
|
112
|
-
[n, R,
|
|
113
|
-
), ot =
|
|
101
|
+
[l, f, n, s]
|
|
102
|
+
), O = r(() => {
|
|
103
|
+
p.current && (s(p.current), p.current = null, K((t) => t + 1)), S(null);
|
|
104
|
+
}, [s]), v = r(() => S(null), []), R = B(
|
|
105
|
+
() => ({ ...gt, ...T }),
|
|
106
|
+
[T]
|
|
107
|
+
), a = B(
|
|
108
|
+
() => ({ ...lt(n, R), ...A }),
|
|
109
|
+
[n, R, A]
|
|
110
|
+
), ot = B(
|
|
114
111
|
() => ({
|
|
115
112
|
value: n,
|
|
116
|
-
patch:
|
|
117
|
-
updateField:
|
|
118
|
-
addReference:
|
|
113
|
+
patch: X,
|
|
114
|
+
updateField: Z,
|
|
115
|
+
addReference: k,
|
|
119
116
|
removeReference: C,
|
|
120
|
-
mentionResetKey:
|
|
121
|
-
insertMention:
|
|
117
|
+
mentionResetKey: y,
|
|
118
|
+
insertMention: z,
|
|
122
119
|
registerMentionField: G,
|
|
123
120
|
notifyMentionFocus: H,
|
|
124
|
-
undoToast:
|
|
121
|
+
undoToast: D,
|
|
125
122
|
undoRemoval: O,
|
|
126
123
|
dismissUndo: v,
|
|
127
|
-
activeStep:
|
|
128
|
-
activeIndex:
|
|
124
|
+
activeStep: x,
|
|
125
|
+
activeIndex: c,
|
|
129
126
|
goToStep: u,
|
|
130
|
-
goNext:
|
|
131
|
-
goPrev:
|
|
132
|
-
isFirstStep:
|
|
133
|
-
isLastStep:
|
|
134
|
-
validation:
|
|
135
|
-
isActiveStepValid:
|
|
136
|
-
availableTools:
|
|
127
|
+
goNext: Q,
|
|
128
|
+
goPrev: W,
|
|
129
|
+
isFirstStep: c === 0,
|
|
130
|
+
isLastStep: c === _.length - 1,
|
|
131
|
+
validation: a,
|
|
132
|
+
isActiveStepValid: a[x],
|
|
133
|
+
availableTools: l,
|
|
137
134
|
availableSubAgents: f,
|
|
138
|
-
availableIntents:
|
|
139
|
-
availableModels:
|
|
140
|
-
applicationType:
|
|
135
|
+
availableIntents: I,
|
|
136
|
+
availableModels: P,
|
|
137
|
+
applicationType: E,
|
|
141
138
|
charLimits: R,
|
|
142
|
-
disableStepNavigation:
|
|
143
|
-
onCreateSubAgent:
|
|
139
|
+
disableStepNavigation: $,
|
|
140
|
+
onCreateSubAgent: w,
|
|
144
141
|
registerSubAgentCreator: U,
|
|
145
142
|
requestCreateSubAgent: Y,
|
|
146
143
|
onFetchSubAgent: L,
|
|
147
|
-
onUpdateSubAgent:
|
|
148
|
-
onImproveSubAgent:
|
|
144
|
+
onUpdateSubAgent: V,
|
|
145
|
+
onImproveSubAgent: b
|
|
149
146
|
}),
|
|
150
147
|
[
|
|
151
148
|
n,
|
|
152
|
-
W,
|
|
153
149
|
X,
|
|
154
150
|
Z,
|
|
155
|
-
C,
|
|
156
|
-
K,
|
|
157
151
|
k,
|
|
152
|
+
C,
|
|
153
|
+
y,
|
|
154
|
+
z,
|
|
158
155
|
G,
|
|
159
156
|
H,
|
|
160
|
-
|
|
157
|
+
D,
|
|
161
158
|
O,
|
|
162
159
|
v,
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
x,
|
|
161
|
+
c,
|
|
165
162
|
u,
|
|
166
|
-
J,
|
|
167
163
|
Q,
|
|
168
|
-
|
|
169
|
-
|
|
164
|
+
W,
|
|
165
|
+
a,
|
|
166
|
+
l,
|
|
170
167
|
f,
|
|
168
|
+
I,
|
|
171
169
|
P,
|
|
172
|
-
|
|
173
|
-
$,
|
|
170
|
+
E,
|
|
174
171
|
R,
|
|
172
|
+
$,
|
|
175
173
|
w,
|
|
176
|
-
y,
|
|
177
174
|
U,
|
|
178
175
|
Y,
|
|
179
176
|
L,
|
|
180
|
-
|
|
181
|
-
|
|
177
|
+
V,
|
|
178
|
+
b
|
|
182
179
|
]
|
|
183
180
|
);
|
|
184
|
-
return /* @__PURE__ */
|
|
181
|
+
return /* @__PURE__ */ it(nt.Provider, { value: ot, children: et });
|
|
185
182
|
};
|
|
186
183
|
export {
|
|
187
|
-
|
|
188
|
-
|
|
184
|
+
Mt as AgentBuilderProvider,
|
|
185
|
+
_t as useAgentBuilderContext
|
|
189
186
|
};
|
|
190
187
|
//# sourceMappingURL=AgentBuilderContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentBuilderContext.js","sources":["../../../../../src/components/agent-builder/context/AgentBuilderContext.tsx"],"sourcesContent":["import type { ApplicationType } from '@bikdotai/bik-models/growth';\nimport React, {\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tAgentTool,\n\tAgentValue,\n\tIntentOption,\n\tModelOption,\n\tStepKey,\n\tStepValidation,\n\tSubAgentDraft,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\n\n/** Mention-capable text fields in Step 3 (both store firebase token text). */\nexport type MentionFieldKey = 'instructions' | 'guardrail';\ntype MentionInsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n) => void;\n\n/** Toast shown after a tool / sub-agent is removed, offering an undo. */\nexport interface UndoToastState {\n\t/** Bumped per removal so the toast timer restarts. */\n\tid: number;\n\tmessage: string;\n}\n\nexport interface AgentBuilderContextShape {\n\t/** Controlled value relayed from props. */\n\tvalue: AgentValue;\n\t/** Patch one or more fields. */\n\tpatch: (partial: Partial<AgentValue>) => void;\n\t/** Patch a single field. */\n\tupdateField: <K extends keyof AgentValue>(key: K, val: AgentValue[K]) => void;\n\t/**\n\t * Remove a tool / sub-agent everywhere: drops it from the list AND strips ALL\n\t * its `{{tool:KEY}}` / `{{subagent:ID}}` tokens from BOTH the instructions and\n\t * the guardrails, remounts the editors, and raises an undo toast.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/**\n\t * Append a tool / sub-agent id to its list (deduped), reading the LATEST value\n\t * via a ref. Use this instead of `patch({ tools: [...value.tools, id] })` from\n\t * any handler that may be captured with a stale `value` — notably the `@`\n\t * editor's mount-time `onSelect`, which would otherwise keep only the last pick.\n\t */\n\taddReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the mention editors after an external edit. */\n\tmentionResetKey: number;\n\t/**\n\t * Insert a tool / sub-agent mention chip at the last cursor position of\n\t * whichever mention field was focused most recently (Instructions or\n\t * Guardrails). `label` overrides the chip text (e.g. a just-created sub-agent\n\t * not yet in the available list).\n\t */\n\tinsertMention: (\n\t\tkind: 'tool' | 'subagent',\n\t\tid: string,\n\t\tlabel?: string,\n\t) => void;\n\t/** A mention field registers its editor-backed insert here (internal). */\n\tregisterMentionField: (\n\t\tfieldKey: MentionFieldKey,\n\t\tfn: MentionInsertFn | null,\n\t) => void;\n\t/** A mention field reports focus so inserts target it (internal). */\n\tnotifyMentionFocus: (fieldKey: MentionFieldKey) => void;\n\n\t// Undo (post-removal)\n\t/** Non-null while the undo toast should be visible. */\n\tundoToast: UndoToastState | null;\n\t/** Restore the last removed tool / sub-agent (list + stripped tokens). */\n\tundoRemoval: () => void;\n\t/** Dismiss the undo toast without restoring. */\n\tdismissUndo: () => void;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** Resolved per-field character limits (consumer overrides merged over defaults). */\n\tcharLimits: AgentCharLimits;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n\n\t// Sub-agent creation (Step 3 drawer)\n\t/** Persist a new sub-agent and resolve with its ref. Omit to hide the create flow. */\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/**\n\t * Step 3 registers its \"open create-sub-agent drawer\" action here so the `@`\n\t * picker's \"Create new\" row can trigger it. Pass `null` to unregister.\n\t */\n\tregisterSubAgentCreator: (fn: (() => void) | null) => void;\n\t/** Open the create-sub-agent drawer (no-op until Step 3 registers it). */\n\trequestCreateSubAgent: () => void;\n\t/** Fetch a sub-agent's editable data (Configure). Omit to hide Configure. */\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\t/** Persist edits to an existing sub-agent. */\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Optional \"Improve with AI\" for the drawer's instructions / guardrails. */\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (\n\tvalue: AgentValue,\n\tlimits: AgentCharLimits,\n): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.custom_intent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= limits.name &&\n\t\t\tvalue.description.length <= limits.description,\n\t\ttrigger: triggerValid,\n\t\t// At least one of Instructions / Guardrails must be filled.\n\t\tresponse:\n\t\t\tvalue.instructions.trim().length > 0 ||\n\t\t\t(value.guardrail ?? '').trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tcharLimits?: Partial<AgentCharLimits>;\n\tdisableStepNavigation?: boolean;\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\tchildren: React.ReactNode;\n}\n\nexport const AgentBuilderProvider: React.FC<ProviderProps> = ({\n\tvalue,\n\tonChange,\n\tactiveStep: controlledStep,\n\tonStepChange,\n\tavailableTools,\n\tavailableSubAgents,\n\tavailableIntents,\n\tavailableModels,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tcharLimits: charLimitsOverride,\n\tdisableStepNavigation = true,\n\tonCreateSubAgent,\n\tonFetchSubAgent,\n\tonUpdateSubAgent,\n\tonImproveSubAgent,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Latest value, so closure-captured handlers (e.g. the `@` editor's mount-time\n\t// mention onSelect) append against the current lists, not a stale snapshot.\n\tconst valueRef = useRef(value);\n\tvalueRef.current = value;\n\n\t// Bumped when a mention field is edited from OUTSIDE its editor (removing a\n\t// tool from the side list, undo), forcing the mention editors to remount.\n\tconst [mentionResetKey, setMentionResetKey] = useState(0);\n\n\t// Each mention field registers an editor-backed insert fn + reports focus, so\n\t// side-panel adds drop a chip into the last-focused field at its cursor.\n\tconst mentionInsertersRef = useRef<\n\t\tPartial<Record<MentionFieldKey, MentionInsertFn>>\n\t>({});\n\tconst lastFocusedFieldRef = useRef<MentionFieldKey>('instructions');\n\tconst registerMentionField = useCallback(\n\t\t(fieldKey: MentionFieldKey, fn: MentionInsertFn | null) => {\n\t\t\tif (fn) {\n\t\t\t\tmentionInsertersRef.current[fieldKey] = fn;\n\t\t\t} else {\n\t\t\t\tdelete mentionInsertersRef.current[fieldKey];\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst notifyMentionFocus = useCallback((fieldKey: MentionFieldKey) => {\n\t\tlastFocusedFieldRef.current = fieldKey;\n\t}, []);\n\n\t// Step 3 registers its drawer opener here; the `@` picker's \"Create new\" calls it.\n\tconst subAgentCreatorRef = useRef<(() => void) | null>(null);\n\tconst registerSubAgentCreator = useCallback((fn: (() => void) | null) => {\n\t\tsubAgentCreatorRef.current = fn;\n\t}, []);\n\tconst requestCreateSubAgent = useCallback(() => {\n\t\tsubAgentCreatorRef.current?.();\n\t}, []);\n\tconst insertMention = useCallback<MentionInsertFn>((kind, id, label) => {\n\t\tconst inserters = mentionInsertersRef.current;\n\t\tconst target =\n\t\t\tinserters[lastFocusedFieldRef.current] ?? inserters.instructions;\n\t\ttarget?.(kind, id, label);\n\t}, []);\n\n\t// Undo state for the most recent removal.\n\tconst [undoToast, setUndoToast] = useState<UndoToastState | null>(null);\n\tconst undoSnapshotRef = useRef<Partial<AgentValue> | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst addReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst v = valueRef.current;\n\t\t\tif (kind === 'tool') {\n\t\t\t\tif (!v.tools.includes(id)) {\n\t\t\t\t\tonChange({ tools: [...v.tools, id] });\n\t\t\t\t}\n\t\t\t} else if (!v.subagents.includes(id)) {\n\t\t\t\tonChange({ subagents: [...v.subagents, id] });\n\t\t\t}\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst token =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\t\t\t\t\treturn tool ? `{{tool:${tool.function_key}}}` : null;\n\t\t\t\t\t })()\n\t\t\t\t\t: `{{subagent:${id}}}`;\n\t\t\tconst strip = (text: string) =>\n\t\t\t\ttoken ? text.split(token).join('') : text;\n\n\t\t\t// Snapshot the four fields a removal touches, for undo.\n\t\t\tundoSnapshotRef.current = {\n\t\t\t\ttools: value.tools,\n\t\t\t\tsubagents: value.subagents,\n\t\t\t\tinstructions: value.instructions,\n\t\t\t\tguardrail: value.guardrail,\n\t\t\t};\n\n\t\t\tconst next: Partial<AgentValue> = {\n\t\t\t\tinstructions: strip(value.instructions),\n\t\t\t\tguardrail: strip(value.guardrail ?? ''),\n\t\t\t\t...(kind === 'tool'\n\t\t\t\t\t? { tools: value.tools.filter((t) => t !== id) }\n\t\t\t\t\t: { subagents: value.subagents.filter((s) => s !== id) }),\n\t\t\t};\n\t\t\tonChange(next);\n\t\t\tsetMentionResetKey((k) => k + 1);\n\n\t\t\tconst label =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? availableTools.find((t) => t.tool_id === id)?.display_name ?? 'Tool'\n\t\t\t\t\t: availableSubAgents.find((s) => s.id === id)?.name ?? 'Sub-agent';\n\t\t\tundoIdRef.current += 1;\n\t\t\tsetUndoToast({\n\t\t\t\tid: undoIdRef.current,\n\t\t\t\tmessage: `${kind === 'tool' ? 'Tool' : 'Sub-agent'} \"${label}\" removed`,\n\t\t\t});\n\t\t},\n\t\t[availableTools, availableSubAgents, value, onChange],\n\t);\n\n\tconst undoRemoval = useCallback(() => {\n\t\tif (undoSnapshotRef.current) {\n\t\t\tonChange(undoSnapshotRef.current);\n\t\t\tundoSnapshotRef.current = null;\n\t\t\tsetMentionResetKey((k) => k + 1);\n\t\t}\n\t\tsetUndoToast(null);\n\t}, [onChange]);\n\n\tconst dismissUndo = useCallback(() => setUndoToast(null), []);\n\n\t// Consumer overrides merged over the built-in defaults (name 60, rest 1000).\n\tconst charLimits = useMemo<AgentCharLimits>(\n\t\t() => ({ ...AGENT_CHAR_LIMITS, ...charLimitsOverride }),\n\t\t[charLimitsOverride],\n\t);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value, charLimits), ...validationOverride }),\n\t\t[value, charLimits, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","limits","triggerValid","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","charLimitsOverride","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","valueRef","useRef","mentionResetKey","setMentionResetKey","mentionInsertersRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","subAgentCreatorRef","registerSubAgentCreator","requestCreateSubAgent","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","addReference","v","removeReference","token","tool","t","strip","text","s","k","undoRemoval","dismissUndo","charLimits","useMemo","AGENT_CHAR_LIMITS","validation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentBuilderContext.js","sources":["../../../../../src/components/agent-builder/context/AgentBuilderContext.tsx"],"sourcesContent":["import type { ApplicationType } from '@bikdotai/bik-models/growth';\nimport React, {\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tAgentTool,\n\tAgentValue,\n\tIntentOption,\n\tModelOption,\n\tStepKey,\n\tStepValidation,\n\tSubAgentDraft,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\n\n/** Mention-capable text fields in Step 3 (both store firebase token text). */\nexport type MentionFieldKey = 'instructions' | 'guardrail';\ntype MentionInsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n) => void;\n\n/** Toast shown after a tool / sub-agent is removed, offering an undo. */\nexport interface UndoToastState {\n\t/** Bumped per removal so the toast timer restarts. */\n\tid: number;\n\tmessage: string;\n}\n\nexport interface AgentBuilderContextShape {\n\t/** Controlled value relayed from props. */\n\tvalue: AgentValue;\n\t/** Patch one or more fields. */\n\tpatch: (partial: Partial<AgentValue>) => void;\n\t/** Patch a single field. */\n\tupdateField: <K extends keyof AgentValue>(key: K, val: AgentValue[K]) => void;\n\t/**\n\t * Remove a tool / sub-agent everywhere: drops it from the list AND strips ALL\n\t * its `{{tool:KEY}}` / `{{subagent:ID}}` tokens from BOTH the instructions and\n\t * the guardrails, remounts the editors, and raises an undo toast.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/**\n\t * Append a tool / sub-agent id to its list (deduped), reading the LATEST value\n\t * via a ref. Use this instead of `patch({ tools: [...value.tools, id] })` from\n\t * any handler that may be captured with a stale `value` — notably the `@`\n\t * editor's mount-time `onSelect`, which would otherwise keep only the last pick.\n\t */\n\taddReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the mention editors after an external edit. */\n\tmentionResetKey: number;\n\t/**\n\t * Insert a tool / sub-agent mention chip at the last cursor position of\n\t * whichever mention field was focused most recently (Instructions or\n\t * Guardrails). `label` overrides the chip text (e.g. a just-created sub-agent\n\t * not yet in the available list).\n\t */\n\tinsertMention: (\n\t\tkind: 'tool' | 'subagent',\n\t\tid: string,\n\t\tlabel?: string,\n\t) => void;\n\t/** A mention field registers its editor-backed insert here (internal). */\n\tregisterMentionField: (\n\t\tfieldKey: MentionFieldKey,\n\t\tfn: MentionInsertFn | null,\n\t) => void;\n\t/** A mention field reports focus so inserts target it (internal). */\n\tnotifyMentionFocus: (fieldKey: MentionFieldKey) => void;\n\n\t// Undo (post-removal)\n\t/** Non-null while the undo toast should be visible. */\n\tundoToast: UndoToastState | null;\n\t/** Restore the last removed tool / sub-agent (list + stripped tokens). */\n\tundoRemoval: () => void;\n\t/** Dismiss the undo toast without restoring. */\n\tdismissUndo: () => void;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** Resolved per-field character limits (consumer overrides merged over defaults). */\n\tcharLimits: AgentCharLimits;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n\n\t// Sub-agent creation (Step 3 drawer)\n\t/** Persist a new sub-agent and resolve with its ref. Omit to hide the create flow. */\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/**\n\t * Step 3 registers its \"open create-sub-agent drawer\" action here so the `@`\n\t * picker's \"Create new\" row can trigger it. Pass `null` to unregister.\n\t */\n\tregisterSubAgentCreator: (fn: (() => void) | null) => void;\n\t/** Open the create-sub-agent drawer (no-op until Step 3 registers it). */\n\trequestCreateSubAgent: () => void;\n\t/** Fetch a sub-agent's editable data (Configure). Omit to hide Configure. */\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\t/** Persist edits to an existing sub-agent. */\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Optional \"Improve with AI\" for the drawer's instructions / guardrails. */\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (\n\tvalue: AgentValue,\n\tlimits: AgentCharLimits,\n): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.custom_intent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= limits.name &&\n\t\t\tvalue.description.length <= limits.description,\n\t\ttrigger: triggerValid,\n\t\t// At least one of Instructions / Guardrails must be filled.\n\t\tresponse:\n\t\t\tvalue.instructions.trim().length > 0 ||\n\t\t\t(value.guardrail ?? '').trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tcharLimits?: Partial<AgentCharLimits>;\n\tdisableStepNavigation?: boolean;\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\tchildren: React.ReactNode;\n}\n\nexport const AgentBuilderProvider: React.FC<ProviderProps> = ({\n\tvalue,\n\tonChange,\n\tactiveStep: controlledStep,\n\tonStepChange,\n\tavailableTools,\n\tavailableSubAgents,\n\tavailableIntents,\n\tavailableModels,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tcharLimits: charLimitsOverride,\n\tdisableStepNavigation = true,\n\tonCreateSubAgent,\n\tonFetchSubAgent,\n\tonUpdateSubAgent,\n\tonImproveSubAgent,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Latest value, so closure-captured handlers (e.g. the `@` editor's mount-time\n\t// mention onSelect) append against the current lists, not a stale snapshot.\n\tconst valueRef = useRef(value);\n\tvalueRef.current = value;\n\n\t// Bumped when a mention field is edited from OUTSIDE its editor (removing a\n\t// tool from the side list, undo), forcing the mention editors to remount.\n\tconst [mentionResetKey, setMentionResetKey] = useState(0);\n\n\t// Each mention field registers an editor-backed insert fn + reports focus, so\n\t// side-panel adds drop a chip into the last-focused field at its cursor.\n\tconst mentionInsertersRef = useRef<\n\t\tPartial<Record<MentionFieldKey, MentionInsertFn>>\n\t>({});\n\tconst lastFocusedFieldRef = useRef<MentionFieldKey>('instructions');\n\tconst registerMentionField = useCallback(\n\t\t(fieldKey: MentionFieldKey, fn: MentionInsertFn | null) => {\n\t\t\tif (fn) {\n\t\t\t\tmentionInsertersRef.current[fieldKey] = fn;\n\t\t\t} else {\n\t\t\t\tdelete mentionInsertersRef.current[fieldKey];\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst notifyMentionFocus = useCallback((fieldKey: MentionFieldKey) => {\n\t\tlastFocusedFieldRef.current = fieldKey;\n\t}, []);\n\n\t// Step 3 registers its drawer opener here; the `@` picker's \"Create new\" calls it.\n\tconst subAgentCreatorRef = useRef<(() => void) | null>(null);\n\tconst registerSubAgentCreator = useCallback((fn: (() => void) | null) => {\n\t\tsubAgentCreatorRef.current = fn;\n\t}, []);\n\tconst requestCreateSubAgent = useCallback(() => {\n\t\tsubAgentCreatorRef.current?.();\n\t}, []);\n\tconst insertMention = useCallback<MentionInsertFn>((kind, id, label) => {\n\t\tconst inserters = mentionInsertersRef.current;\n\t\tconst target =\n\t\t\tinserters[lastFocusedFieldRef.current] ?? inserters.instructions;\n\t\ttarget?.(kind, id, label);\n\t}, []);\n\n\t// Undo state for the most recent removal.\n\tconst [undoToast, setUndoToast] = useState<UndoToastState | null>(null);\n\tconst undoSnapshotRef = useRef<Partial<AgentValue> | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst addReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst v = valueRef.current;\n\t\t\tif (kind === 'tool') {\n\t\t\t\tif (!v.tools.includes(id)) {\n\t\t\t\t\tonChange({ tools: [...v.tools, id] });\n\t\t\t\t}\n\t\t\t} else if (!v.subagents.includes(id)) {\n\t\t\t\tonChange({ subagents: [...v.subagents, id] });\n\t\t\t}\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Tokens store the id for both kinds (a tool's id is its tool_id).\n\t\t\tconst token = kind === 'tool' ? `{{tool:${id}}}` : `{{subagent:${id}}}`;\n\t\t\tconst strip = (text: string) => text.split(token).join('');\n\n\t\t\t// Snapshot the four fields a removal touches, for undo.\n\t\t\tundoSnapshotRef.current = {\n\t\t\t\ttools: value.tools,\n\t\t\t\tsubagents: value.subagents,\n\t\t\t\tinstructions: value.instructions,\n\t\t\t\tguardrail: value.guardrail,\n\t\t\t};\n\n\t\t\tconst next: Partial<AgentValue> = {\n\t\t\t\tinstructions: strip(value.instructions),\n\t\t\t\tguardrail: strip(value.guardrail ?? ''),\n\t\t\t\t...(kind === 'tool'\n\t\t\t\t\t? { tools: value.tools.filter((t) => t !== id) }\n\t\t\t\t\t: { subagents: value.subagents.filter((s) => s !== id) }),\n\t\t\t};\n\t\t\tonChange(next);\n\t\t\tsetMentionResetKey((k) => k + 1);\n\n\t\t\tconst label =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? availableTools.find((t) => t.tool_id === id)?.display_name ?? 'Tool'\n\t\t\t\t\t: availableSubAgents.find((s) => s.id === id)?.name ?? 'Sub-agent';\n\t\t\tundoIdRef.current += 1;\n\t\t\tsetUndoToast({\n\t\t\t\tid: undoIdRef.current,\n\t\t\t\tmessage: `${kind === 'tool' ? 'Tool' : 'Sub-agent'} \"${label}\" removed`,\n\t\t\t});\n\t\t},\n\t\t[availableTools, availableSubAgents, value, onChange],\n\t);\n\n\tconst undoRemoval = useCallback(() => {\n\t\tif (undoSnapshotRef.current) {\n\t\t\tonChange(undoSnapshotRef.current);\n\t\t\tundoSnapshotRef.current = null;\n\t\t\tsetMentionResetKey((k) => k + 1);\n\t\t}\n\t\tsetUndoToast(null);\n\t}, [onChange]);\n\n\tconst dismissUndo = useCallback(() => setUndoToast(null), []);\n\n\t// Consumer overrides merged over the built-in defaults (name 60, rest 1000).\n\tconst charLimits = useMemo<AgentCharLimits>(\n\t\t() => ({ ...AGENT_CHAR_LIMITS, ...charLimitsOverride }),\n\t\t[charLimitsOverride],\n\t);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value, charLimits), ...validationOverride }),\n\t\t[value, charLimits, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","limits","triggerValid","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","charLimitsOverride","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","valueRef","useRef","mentionResetKey","setMentionResetKey","mentionInsertersRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","subAgentCreatorRef","registerSubAgentCreator","requestCreateSubAgent","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","addReference","v","removeReference","token","strip","text","t","s","k","undoRemoval","dismissUndo","charLimits","useMemo","AGENT_CHAR_LIMITS","validation"],"mappings":"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"}
|