@bikdotai/bik-component-library 0.0.821-beta.10 → 0.0.821-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +1 -1
  2. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  3. package/dist/cjs/components/agent-builder/constants/charLimits.js +1 -1
  4. package/dist/cjs/components/agent-builder/constants/charLimits.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js +1 -1
  6. package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
  7. package/dist/cjs/components/agent-builder/steps/Step2WhenItStepsIn.js +1 -1
  8. package/dist/cjs/components/agent-builder/steps/Step2WhenItStepsIn.js.map +1 -1
  9. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
  10. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  11. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js +1 -1
  12. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  13. package/dist/esm/components/agent-builder/AgentBuilder.model.d.ts +1 -1
  14. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +26 -26
  15. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  16. package/dist/esm/components/agent-builder/constants/charLimits.d.ts +1 -1
  17. package/dist/esm/components/agent-builder/constants/charLimits.js +1 -1
  18. package/dist/esm/components/agent-builder/constants/charLimits.js.map +1 -1
  19. package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +19 -19
  20. package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
  21. package/dist/esm/components/agent-builder/steps/Step2WhenItStepsIn.js +7 -7
  22. package/dist/esm/components/agent-builder/steps/Step2WhenItStepsIn.js.map +1 -1
  23. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +14 -14
  24. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  25. package/dist/esm/components/agent-builder/utils/mentionSerialization.js +2 -2
  26. package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  27. package/package.json +2 -2
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),Z=require("../../../assets/icons/cross.svg.js"),t=require("react"),_=require("../../TypographyStyle.js"),T=require("../../../constants/Theme.js"),i=require("../AgentBuilder.styled.js"),j=require("../constants/charLimits.js"),ee=require("../utils/mentionSerialization.js"),O=require("./MentionEditor.js"),te=require("./SelectableListSection.js"),ne=require("../../input/Input.js"),E=require("../../button/Button.js"),se=require("../../toaster/Toaster.js"),oe=({onClose:m,onSave:N,availableTools:a,onImprove:re,title:G="Create sub-agent",initial:u,appLabel:I="Manifest"})=>{const[h,H]=t.useState(u?.name??""),[l,S]=t.useState(u?.instructions??""),[c,b]=t.useState(u?.guardrail??""),[p,d]=t.useState(u?.tools??[]),[A,R]=t.useState(!1),[K,k]=t.useState(0),[F,q]=t.useState(0),[ae,ie]=t.useState(null),L=t.useMemo(()=>ee.buildAgentMentionItems(a,[],I),[a,I]),g=t.useRef({}),x=t.useRef("instructions"),z=t.useCallback(e=>{g.current.instructions=e??void 0},[]),$=t.useCallback(e=>{g.current.guardrail=e??void 0},[]),w=t.useCallback(()=>{x.current="instructions"},[]),U=t.useCallback(()=>{x.current="guardrail"},[]),M=t.useCallback((e,s)=>{e==="tool"&&d(r=>r.includes(s)?r:[...r,s])},[]),W=t.useCallback(e=>{(g.current[x.current]??g.current.instructions)?.("tool",e)},[]),[y,f]=t.useState(null),C=t.useRef(null),P=t.useRef(0),D=e=>{const s=a.find(o=>o.tool_id===e),r=s?`{{tool:${s.function_key}}}`:null,B=o=>r?o.split(r).join(""):o;C.current={instructions:l,guardrail:c,tools:p},S(o=>B(o)),b(o=>B(o)),d(o=>o.filter(Y=>Y!==e)),k(o=>o+1),q(o=>o+1),P.current+=1,f({id:P.current,message:`Tool "${s?.displayName??"Tool"}" removed`})},J=()=>{const e=C.current;e&&(S(e.instructions),b(e.guardrail),d(e.tools),k(s=>s+1),q(s=>s+1),C.current=null),f(null)},v=h.trim().length>0&&(l.trim().length>0||c.trim().length>0),Q=p.map(e=>{const s=a.find(r=>r.tool_id===e);return s?{id:e,label:s.displayName}:null}).filter(e=>e!==null),V=a.map(e=>({label:e.displayName,value:e.tool_id,subText:e.description})),X=async()=>{if(!v||A)return;const e=N({name:h.trim(),instructions:l,guardrail:c,tools:p});if(e&&typeof e.then=="function"){R(!0);try{await e}finally{R(!1)}}};return n.jsxs(n.Fragment,{children:[n.jsx(i.SubAgentScrim,{onClick:m,"data-test":"subagent-scrim"}),n.jsxs(i.SubAgentPanel,{"data-test":"create-subagent-panel",children:[n.jsxs(i.SubAgentPanelHeader,{children:[n.jsxs(i.SubAgentPanelHeaderText,{children:[n.jsx(_.TitleRegular,{color:T.COLORS.content.primary,children:G}),n.jsx(_.BodySecondary,{color:T.COLORS.content.secondary,children:"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."})]}),n.jsx(i.SubAgentCloseButton,{onClick:m,"aria-label":"Close",children:n.jsx(Z.default,{width:20,height:20,color:T.COLORS.content.secondary})})]}),n.jsxs(i.SubAgentPanelBody,{children:[n.jsx(ne.Input,{"data-test":"subagent-name",labelText:"Agent name",labelTextBold:!0,placeholder:"Enter agent name",value:h,maxCharLimit:j.AGENT_CHAR_LIMITS.name,maxCharLimitPosition:"TOP",maxCharStyle:{fontSize:12,lineHeight:"16px"},onChangeText:H}),n.jsx(O.MentionEditor,{"data-test":"subagent-instructions",label:"Instructions",value:l,onChange:S,maxLength:j.AGENT_CHAR_LIMITS.instructions,placeholder:"Write the steps in plain English. Type @ to reference a tool.",minHeight:"160px",resetKey:`instr-${K}`,mentionItems:L,tools:a,onMentionSelect:M,onFocus:w,registerInsert:z}),n.jsx(O.MentionEditor,{"data-test":"subagent-guardrail",label:"Guardrails",value:c,onChange:b,maxLength:j.AGENT_CHAR_LIMITS.guardrail,placeholder:"e.g. Never discuss competitor pricing. Type @ to reference a tool.",minHeight:"160px",resetKey:`guard-${F}`,mentionItems:L,tools:a,onMentionSelect:M,onFocus:U,registerInsert:$}),n.jsx(te.SelectableListSection,{title:"Tools this agent can use",dataTestPrefix:"subagent-tools",items:Q,addableOptions:V,emptyText:"No tools added yet.",onAdd:e=>{W(e),d(s=>s.includes(e)?s:[...s,e])},onRemove:D})]}),n.jsxs(i.SubAgentPanelFooter,{children:[n.jsx(E.Button,{"data-test":"subagent-save",buttonType:"primary",size:"small",buttonText:"Save",disabled:!v,isLoading:A,onClick:X}),n.jsx(E.Button,{"data-test":"subagent-cancel",buttonType:"secondary",size:"small",buttonText:"Cancel",onClick:m})]})]}),y&&n.jsx(se.Toaster,{text:y.message,type:"info",position:"top-right",autoClose:5e3,hideCloseButton:!0,buttonProps:{buttonText:"Undo",showButton:!0,onButtonClick:()=>(J(),{})},onCloseToast:()=>f(null)},y.id)]})};exports.CreateSubAgentPanel=oe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),Z=require("../../../assets/icons/cross.svg.js"),t=require("react"),B=require("../../TypographyStyle.js"),T=require("../../../constants/Theme.js"),i=require("../AgentBuilder.styled.js"),j=require("../constants/charLimits.js"),ee=require("../utils/mentionSerialization.js"),O=require("./MentionEditor.js"),te=require("./SelectableListSection.js"),ne=require("../../input/Input.js"),E=require("../../button/Button.js"),se=require("../../toaster/Toaster.js"),oe=({onClose:m,onSave:G,availableTools:a,onImprove:re,title:H="Create sub-agent",initial:u,appLabel:I="Manifest"})=>{const[h,K]=t.useState(u?.name??""),[l,S]=t.useState(u?.instructions??""),[c,b]=t.useState(u?.guardrail??""),[p,d]=t.useState(u?.tools??[]),[A,R]=t.useState(!1),[N,_]=t.useState(0),[F,k]=t.useState(0),[ae,ie]=t.useState(null),q=t.useMemo(()=>ee.buildAgentMentionItems(a,[],I),[a,I]),g=t.useRef({}),x=t.useRef("instructions"),z=t.useCallback(e=>{g.current.instructions=e??void 0},[]),$=t.useCallback(e=>{g.current.guardrail=e??void 0},[]),w=t.useCallback(()=>{x.current="instructions"},[]),U=t.useCallback(()=>{x.current="guardrail"},[]),L=t.useCallback((e,s)=>{e==="tool"&&d(r=>r.includes(s)?r:[...r,s])},[]),W=t.useCallback(e=>{(g.current[x.current]??g.current.instructions)?.("tool",e)},[]),[y,f]=t.useState(null),C=t.useRef(null),M=t.useRef(0),D=e=>{const s=a.find(o=>o.tool_id===e),r=s?`{{tool:${s.function_key}}}`:null,v=o=>r?o.split(r).join(""):o;C.current={instructions:l,guardrail:c,tools:p},S(o=>v(o)),b(o=>v(o)),d(o=>o.filter(Y=>Y!==e)),_(o=>o+1),k(o=>o+1),M.current+=1,f({id:M.current,message:`Tool "${s?.display_name??"Tool"}" removed`})},J=()=>{const e=C.current;e&&(S(e.instructions),b(e.guardrail),d(e.tools),_(s=>s+1),k(s=>s+1),C.current=null),f(null)},P=h.trim().length>0&&(l.trim().length>0||c.trim().length>0),Q=p.map(e=>{const s=a.find(r=>r.tool_id===e);return s?{id:e,label:s.display_name}:null}).filter(e=>e!==null),V=a.map(e=>({label:e.display_name,value:e.tool_id,subText:e.description})),X=async()=>{if(!P||A)return;const e=G({name:h.trim(),instructions:l,guardrail:c,tools:p});if(e&&typeof e.then=="function"){R(!0);try{await e}finally{R(!1)}}};return n.jsxs(n.Fragment,{children:[n.jsx(i.SubAgentScrim,{onClick:m,"data-test":"subagent-scrim"}),n.jsxs(i.SubAgentPanel,{"data-test":"create-subagent-panel",children:[n.jsxs(i.SubAgentPanelHeader,{children:[n.jsxs(i.SubAgentPanelHeaderText,{children:[n.jsx(B.TitleRegular,{color:T.COLORS.content.primary,children:H}),n.jsx(B.BodySecondary,{color:T.COLORS.content.secondary,children:"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."})]}),n.jsx(i.SubAgentCloseButton,{onClick:m,"aria-label":"Close",children:n.jsx(Z.default,{width:20,height:20,color:T.COLORS.content.secondary})})]}),n.jsxs(i.SubAgentPanelBody,{children:[n.jsx(ne.Input,{"data-test":"subagent-name",labelText:"Agent name",labelTextBold:!0,placeholder:"Enter agent name",value:h,maxCharLimit:j.AGENT_CHAR_LIMITS.name,maxCharLimitPosition:"TOP",maxCharStyle:{fontSize:12,lineHeight:"16px"},onChangeText:K}),n.jsx(O.MentionEditor,{"data-test":"subagent-instructions",label:"Instructions",value:l,onChange:S,maxLength:j.AGENT_CHAR_LIMITS.instructions,placeholder:"Write the steps in plain English. Type @ to reference a tool.",minHeight:"160px",resetKey:`instr-${N}`,mentionItems:q,tools:a,onMentionSelect:L,onFocus:w,registerInsert:z}),n.jsx(O.MentionEditor,{"data-test":"subagent-guardrail",label:"Guardrails",value:c,onChange:b,maxLength:j.AGENT_CHAR_LIMITS.guardrail,placeholder:"e.g. Never discuss competitor pricing. Type @ to reference a tool.",minHeight:"160px",resetKey:`guard-${F}`,mentionItems:q,tools:a,onMentionSelect:L,onFocus:U,registerInsert:$}),n.jsx(te.SelectableListSection,{title:"Tools this agent can use",dataTestPrefix:"subagent-tools",items:Q,addableOptions:V,emptyText:"No tools added yet.",onAdd:e=>{W(e),d(s=>s.includes(e)?s:[...s,e])},onRemove:D})]}),n.jsxs(i.SubAgentPanelFooter,{children:[n.jsx(E.Button,{"data-test":"subagent-save",buttonType:"primary",size:"small",buttonText:"Save",disabled:!P,isLoading:A,onClick:X}),n.jsx(E.Button,{"data-test":"subagent-cancel",buttonType:"secondary",size:"small",buttonText:"Cancel",onClick:m})]})]}),y&&n.jsx(se.Toaster,{text:y.message,type:"info",position:"top-right",autoClose:5e3,hideCloseButton:!0,buttonProps:{buttonText:"Undo",showButton:!0,onButtonClick:()=>(J(),{})},onCloseToast:()=>f(null)},y.id)]})};exports.CreateSubAgentPanel=oe;
2
2
  //# sourceMappingURL=CreateSubAgentPanel.js.map
@@ -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 { COLORS } from '@src/constants/Theme';\nimport { AgentTool, SubAgentDraft } from '../AgentBuilder.model';\nimport {\n\tFieldActionRow,\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 { buildAgentMentionItems } from '../utils/mentionSerialization';\nimport { MentionEditor } from './MentionEditor';\nimport { SelectableItem, SelectableListSection } 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}\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}) => {\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) => (prev.includes(id) ? prev : [...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?.displayName ?? '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 ? { id, label: tool.displayName } : 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.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.displayName,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\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={AGENT_CHAR_LIMITS.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={AGENT_CHAR_LIMITS.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={AGENT_CHAR_LIMITS.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\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) => (prev.includes(id) ? prev : [...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=\"secondary\"\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","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","insertToolAtCursor","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","tool","t","token","strip","text","k","undoRemove","snap","canSave","toolItems","x","toolOptions","handleSave","result","jsxs","Fragment","jsx","SubAgentScrim","SubAgentPanel","SubAgentPanelHeader","SubAgentPanelHeaderText","TitleRegular","COLORS","BodySecondary","SubAgentCloseButton","CrossIcon","SubAgentPanelBody","Input","AGENT_CHAR_LIMITS","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 { COLORS } from '@src/constants/Theme';\nimport { AgentTool, SubAgentDraft } from '../AgentBuilder.model';\nimport {\n\tFieldActionRow,\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 { buildAgentMentionItems } from '../utils/mentionSerialization';\nimport { MentionEditor } from './MentionEditor';\nimport { SelectableItem, SelectableListSection } 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}\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}) => {\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) => (prev.includes(id) ? prev : [...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 ? { id, label: tool.display_name } : 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.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\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={AGENT_CHAR_LIMITS.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={AGENT_CHAR_LIMITS.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={AGENT_CHAR_LIMITS.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\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) => (prev.includes(id) ? prev : [...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=\"secondary\"\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","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","insertToolAtCursor","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","tool","t","token","strip","text","k","undoRemove","snap","canSave","toolItems","x","toolOptions","handleSave","result","jsxs","Fragment","jsx","SubAgentScrim","SubAgentPanel","SubAgentPanelHeader","SubAgentPanelHeaderText","TitleRegular","COLORS","BodySecondary","SubAgentCloseButton","CrossIcon","SubAgentPanelBody","Input","AGENT_CHAR_LIMITS","MentionEditor","SelectableListSection","SubAgentPanelFooter","Button","Toaster"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={name:60,description:1e3,customIntent:1e3,instructions:1e3,guardrail:1e3,handoverWhen:1e3};exports.AGENT_CHAR_LIMITS=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={name:60,description:1e3,custom_intent:1e3,instructions:1e3,guardrail:1e3,handoverWhen:1e3};exports.AGENT_CHAR_LIMITS=e;
2
2
  //# sourceMappingURL=charLimits.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"charLimits.js","sources":["../../../../../src/components/agent-builder/constants/charLimits.ts"],"sourcesContent":["/**\n * Character limits for AgentBuilder fields.\n *\n * `name` and `description` are taken directly from the Figma spec. The rest are\n * sized to match the 0/1000 counters shown on the response/handover steps; adjust\n * here if product changes them.\n */\nexport const AGENT_CHAR_LIMITS = {\n\t/** Step 1 — Agent name. */\n\tname: 60,\n\t/** Step 1 — \"What it does\". */\n\tdescription: 1000,\n\t/** Step 2 — custom intent free text. */\n\tcustomIntent: 1000,\n\t/** Step 3 — Instructions (BikEditor `maxCharacters`). */\n\tinstructions: 1000,\n\t/** Step 3 — Guardrails. */\n\tguardrail: 1000,\n\t/** Step 4 — \"Handover when\". */\n\thandoverWhen: 1000,\n} as const;\n"],"names":["AGENT_CHAR_LIMITS"],"mappings":"gFAOO,MAAMA,EAAoB,CAEhC,KAAM,GAEN,YAAa,IAEb,aAAc,IAEd,aAAc,IAEd,UAAW,IAEX,aAAc,GACf"}
1
+ {"version":3,"file":"charLimits.js","sources":["../../../../../src/components/agent-builder/constants/charLimits.ts"],"sourcesContent":["/**\n * Character limits for AgentBuilder fields.\n *\n * `name` and `description` are taken directly from the Figma spec. The rest are\n * sized to match the 0/1000 counters shown on the response/handover steps; adjust\n * here if product changes them.\n */\nexport const AGENT_CHAR_LIMITS = {\n\t/** Step 1 — Agent name. */\n\tname: 60,\n\t/** Step 1 — \"What it does\". */\n\tdescription: 1000,\n\t/** Step 2 — custom intent free text. */\n\tcustom_intent: 1000,\n\t/** Step 3 — Instructions (BikEditor `maxCharacters`). */\n\tinstructions: 1000,\n\t/** Step 3 — Guardrails. */\n\tguardrail: 1000,\n\t/** Step 4 — \"Handover when\". */\n\thandoverWhen: 1000,\n} as const;\n"],"names":["AGENT_CHAR_LIMITS"],"mappings":"gFAOO,MAAMA,EAAoB,CAEhC,KAAM,GAEN,YAAa,IAEb,cAAe,IAEf,aAAc,IAEd,UAAW,IAEX,aAAc,GACf"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react/jsx-runtime"),n=require("react"),U=require("../constants/charLimits.js"),d=require("../constants/steps.js"),tt=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},et=tt(n),z=et.default.createContext(null),nt=()=>{const t=n.useContext(z);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},st=t=>{const o=t.trigger.mode==="custom_intent"?(t.trigger.customIntent??"").trim().length>0:t.trigger.intents.length>0;return{about:t.name.trim().length>0&&t.name.length<=U.AGENT_CHAR_LIMITS.name&&t.description.length<=U.AGENT_CHAR_LIMITS.description,trigger:o,response:t.instructions.trim().length>0||(t.guardrail??"").trim().length>0,handover:!0}},rt=({value:t,onChange:o,activeStep:R,onStepChange:p,availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,validation:k,applicationType:M,disableStepNavigation:P=!0,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:I,children:J})=>{const[O,Q]=n.useState("about"),a=R??O,c=d.getStepIndex(a),[B,y]=n.useState(0),S=n.useRef({}),j=n.useRef("instructions"),A=n.useCallback((e,r)=>{r?S.current[e]=r:delete S.current[e]},[]),F=n.useCallback(e=>{j.current=e},[]),K=n.useCallback((e,r,f)=>{const l=S.current;(l[j.current]??l.instructions)?.(e,r,f)},[]),[q,x]=n.useState(null),m=n.useRef(null),L=n.useRef(0),i=n.useCallback(e=>{R===void 0&&Q(e),p?.(e)},[R,p]),Y=n.useCallback(()=>{const e=d.STEP_KEYS[Math.min(c+1,d.STEP_KEYS.length-1)];i(e)},[c,i]),$=n.useCallback(()=>{const e=d.STEP_KEYS[Math.max(c-1,0)];i(e)},[c,i]),w=n.useCallback(e=>o(e),[o]),N=n.useCallback((e,r)=>o({[e]:r}),[o]),V=n.useCallback((e,r)=>{const f=e==="tool"?(()=>{const s=u.find(Z=>Z.tool_id===r);return s?`{{tool:${s.function_key}}}`:null})():`{{subagent:${r}}}`,l=s=>f?s.split(f).join(""):s;m.current={tools:t.tools,subagents:t.subagents,instructions:t.instructions,guardrail:t.guardrail};const D={instructions:l(t.instructions),guardrail:l(t.guardrail??""),...e==="tool"?{tools:t.tools.filter(s=>s!==r)}:{subagents:t.subagents.filter(s=>s!==r)}};o(D),y(s=>s+1);const X=e==="tool"?u.find(s=>s.tool_id===r)?.displayName??"Tool":g.find(s=>s.id===r)?.name??"Sub-agent";L.current+=1,x({id:L.current,message:`${e==="tool"?"Tool":"Sub-agent"} "${X}" removed`})},[u,g,t,o]),G=n.useCallback(()=>{m.current&&(o(m.current),m.current=null,y(e=>e+1)),x(null)},[o]),H=n.useCallback(()=>x(null),[]),_=n.useMemo(()=>({...st(t),...k}),[t,k]),W=n.useMemo(()=>({value:t,patch:w,updateField:N,removeReference:V,mentionResetKey:B,insertMention:K,registerMentionField:A,notifyMentionFocus:F,undoToast:q,undoRemoval:G,dismissUndo:H,activeStep:a,activeIndex:c,goToStep:i,goNext:Y,goPrev:$,isFirstStep:c===0,isLastStep:c===d.STEP_KEYS.length-1,validation:_,isActiveStepValid:_[a],availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,applicationType:M,disableStepNavigation:P,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:I}),[t,w,N,V,B,K,A,F,q,G,H,a,c,i,Y,$,_,u,g,C,E,M,P,T,b,h,I]);return v.jsx(z.Provider,{value:W,children:J})};exports.AgentBuilderProvider=rt;exports.useAgentBuilderContext=nt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react/jsx-runtime"),n=require("react"),U=require("../constants/charLimits.js"),d=require("../constants/steps.js"),tt=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},et=tt(n),z=et.default.createContext(null),nt=()=>{const t=n.useContext(z);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},st=t=>{const o=t.trigger.mode==="custom_intent"?(t.trigger.custom_intent??"").trim().length>0:t.trigger.intents.length>0;return{about:t.name.trim().length>0&&t.name.length<=U.AGENT_CHAR_LIMITS.name&&t.description.length<=U.AGENT_CHAR_LIMITS.description,trigger:o,response:t.instructions.trim().length>0||(t.guardrail??"").trim().length>0,handover:!0}},rt=({value:t,onChange:o,activeStep:R,onStepChange:p,availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,validation:k,applicationType:M,disableStepNavigation:P=!0,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:B,children:J})=>{const[O,Q]=n.useState("about"),a=R??O,c=d.getStepIndex(a),[I,y]=n.useState(0),_=n.useRef({}),j=n.useRef("instructions"),A=n.useCallback((e,r)=>{r?_.current[e]=r:delete _.current[e]},[]),F=n.useCallback(e=>{j.current=e},[]),K=n.useCallback((e,r,f)=>{const l=_.current;(l[j.current]??l.instructions)?.(e,r,f)},[]),[q,S]=n.useState(null),m=n.useRef(null),L=n.useRef(0),i=n.useCallback(e=>{R===void 0&&Q(e),p?.(e)},[R,p]),Y=n.useCallback(()=>{const e=d.STEP_KEYS[Math.min(c+1,d.STEP_KEYS.length-1)];i(e)},[c,i]),$=n.useCallback(()=>{const e=d.STEP_KEYS[Math.max(c-1,0)];i(e)},[c,i]),w=n.useCallback(e=>o(e),[o]),V=n.useCallback((e,r)=>o({[e]:r}),[o]),G=n.useCallback((e,r)=>{const f=e==="tool"?(()=>{const s=u.find(Z=>Z.tool_id===r);return s?`{{tool:${s.function_key}}}`:null})():`{{subagent:${r}}}`,l=s=>f?s.split(f).join(""):s;m.current={tools:t.tools,subagents:t.subagents,instructions:t.instructions,guardrail:t.guardrail};const D={instructions:l(t.instructions),guardrail:l(t.guardrail??""),...e==="tool"?{tools:t.tools.filter(s=>s!==r)}:{subagents:t.subagents.filter(s=>s!==r)}};o(D),y(s=>s+1);const X=e==="tool"?u.find(s=>s.tool_id===r)?.display_name??"Tool":g.find(s=>s.id===r)?.name??"Sub-agent";L.current+=1,S({id:L.current,message:`${e==="tool"?"Tool":"Sub-agent"} "${X}" removed`})},[u,g,t,o]),H=n.useCallback(()=>{m.current&&(o(m.current),m.current=null,y(e=>e+1)),S(null)},[o]),N=n.useCallback(()=>S(null),[]),x=n.useMemo(()=>({...st(t),...k}),[t,k]),W=n.useMemo(()=>({value:t,patch:w,updateField:V,removeReference:G,mentionResetKey:I,insertMention:K,registerMentionField:A,notifyMentionFocus:F,undoToast:q,undoRemoval:H,dismissUndo:N,activeStep:a,activeIndex:c,goToStep:i,goNext:Y,goPrev:$,isFirstStep:c===0,isLastStep:c===d.STEP_KEYS.length-1,validation:x,isActiveStepValid:x[a],availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,applicationType:M,disableStepNavigation:P,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:B}),[t,w,V,G,I,K,A,F,q,H,N,a,c,i,Y,$,x,u,g,C,E,M,P,T,b,h,B]);return v.jsx(z.Provider,{value:W,children:J})};exports.AgentBuilderProvider=rt;exports.useAgentBuilderContext=nt;
2
2
  //# 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 { 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/** 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/** 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/** 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 = (value: AgentValue): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.customIntent ?? '').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 <= AGENT_CHAR_LIMITS.name &&\n\t\t\tvalue.description.length <= AGENT_CHAR_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\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\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// 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\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 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)?.displayName ?? '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\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value), ...validationOverride }),\n\t\t[value, 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\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\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\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\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\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\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","triggerValid","AGENT_CHAR_LIMITS","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","mentionResetKey","setMentionResetKey","mentionInsertersRef","useRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","removeReference","token","tool","t","strip","text","k","undoRemoval","dismissUndo","validation","useMemo"],"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 { 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/** 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/** 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/** 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 = (value: AgentValue): 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 <= AGENT_CHAR_LIMITS.name &&\n\t\t\tvalue.description.length <= AGENT_CHAR_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\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\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// 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\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 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\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value), ...validationOverride }),\n\t\t[value, 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\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\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\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\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\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\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","triggerValid","AGENT_CHAR_LIMITS","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","mentionResetKey","setMentionResetKey","mentionInsertersRef","useRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","removeReference","token","tool","t","strip","text","k","undoRemoval","dismissUndo","validation","useMemo"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),y=require("../../../assets/icons/cross.svg.js"),j=require("../../../assets/icons/plus.svg.js"),O=require("react"),p=require("../../radioButton/RadioButton.js"),s=require("../../TypographyStyle.js"),o=require("../../../constants/Theme.js"),i=require("../AgentBuilder.styled.js"),R=require("../components/AiTextArea.js"),v=require("../components/StepSectionHeader.js"),I=require("../constants/charLimits.js"),T=require("../constants/steps.js"),b=require("../context/AgentBuilderContext.js"),A=require("../../dropdown/Dropdown.js"),_=r=>r&&typeof r=="object"&&"default"in r?r:{default:r},L=_(O),C=T.STEP_DEFINITIONS[1],q=()=>{const{value:r,patch:a,availableIntents:u}=b.useAgentBuilderContext(),{trigger:n}=r,[S,h]=L.default.useState(!1),c=e=>a({trigger:{...n,mode:e}}),x=e=>{n.intents.includes(e)||a({trigger:{...n,intents:[...n.intents,e]}}),h(!1)},f=e=>a({trigger:{...n,intents:n.intents.filter(l=>l!==e)}}),m=e=>u.find(l=>l.value===e)?.label??e,d=u.filter(e=>!n.intents.includes(e.value)).map(e=>({label:e.label,value:e.value}));return t.jsxs("div",{children:[t.jsx(v.StepSectionHeader,{title:C.title,helper:C.helper}),t.jsxs(i.CardRow,{children:[t.jsxs(i.RadioCard,{"data-test":"trigger-mode-manifest",selected:n.mode==="manifest_intent",onClick:()=>c("manifest_intent"),children:[t.jsx(p.RadioButton,{isActive:n.mode==="manifest_intent",onValueChange:()=>c("manifest_intent"),skipSelectingOff:!0,activeColor:o.COLORS.content.brand}),t.jsxs(i.RadioCardText,{children:[t.jsx(s.TitleSmall,{color:o.COLORS.content.primary,children:"Manifest intent"}),t.jsx(s.BodyCaption,{color:o.COLORS.content.secondary,children:"Manifest's AI classifier routes conversations automatically — no keywords needed."})]})]}),t.jsxs(i.RadioCard,{"data-test":"trigger-mode-custom",selected:n.mode==="custom_intent",onClick:()=>c("custom_intent"),children:[t.jsx(p.RadioButton,{isActive:n.mode==="custom_intent",onValueChange:()=>c("custom_intent"),skipSelectingOff:!0,activeColor:o.COLORS.content.brand}),t.jsxs(i.RadioCardText,{children:[t.jsx(s.TitleSmall,{color:o.COLORS.content.primary,children:"Custom intent"}),t.jsx(s.BodyCaption,{color:o.COLORS.content.secondary,children:"Define your own trigger — use exact phrases or describe the customer's intent."})]})]})]}),n.mode==="manifest_intent"?t.jsxs(i.FieldBlock,{children:[t.jsx(s.TitleSmall,{color:o.COLORS.content.primary,children:"If customer talks about"}),t.jsxs(i.ChipWrap,{children:[n.intents.map(e=>t.jsxs(i.IntentChip,{"data-test":`intent-chip-${e}`,children:[t.jsx(s.BodySecondary,{color:o.COLORS.content.primary,children:m(e)}),t.jsx(i.ChipCloseButton,{onClick:()=>f(e),"aria-label":`Remove ${m(e)}`,children:t.jsx(y.default,{width:14,height:14,color:o.COLORS.content.secondary})})]},e)),S&&d.length>0?t.jsx(A.Dropdown,{"data-test":"intent-add-dropdown",size:"small",width:"200px",placeHolder:"Select intent",isSearchable:!0,options:d,onSelect:e=>{const g=(Array.isArray(e)?e[0]:e)?.value;g&&x(g)}}):d.length>0&&t.jsxs(i.AddChipButton,{"data-test":"intent-add-button",onClick:()=>h(!0),children:[t.jsx(j.default,{width:16,height:16,color:o.COLORS.content.secondary}),t.jsx(s.BodySecondary,{color:o.COLORS.content.secondary,children:"Intent"})]})]}),t.jsx(s.BodyCaption,{color:o.COLORS.content.secondary,children:"This agent takes over from your main assistant when this intent is detected. The changeover is automatic when you go live."})]}):t.jsx(R.AiTextArea,{"data-test":"custom-intent",label:"Describe the trigger",value:n.customIntent??"",onChange:e=>a({trigger:{...n,customIntent:e}}),maxLength:I.AGENT_CHAR_LIMITS.customIntent,placeholder:"e.g. The customer wants to cancel an order they placed.",minHeight:"120px"})]})};exports.Step2WhenItStepsIn=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),y=require("../../../assets/icons/cross.svg.js"),j=require("../../../assets/icons/plus.svg.js"),O=require("react"),p=require("../../radioButton/RadioButton.js"),s=require("../../TypographyStyle.js"),i=require("../../../constants/Theme.js"),o=require("../AgentBuilder.styled.js"),R=require("../components/AiTextArea.js"),v=require("../components/StepSectionHeader.js"),_=require("../constants/charLimits.js"),T=require("../constants/steps.js"),b=require("../context/AgentBuilderContext.js"),A=require("../../dropdown/Dropdown.js"),I=r=>r&&typeof r=="object"&&"default"in r?r:{default:r},L=I(O),C=T.STEP_DEFINITIONS[1],q=()=>{const{value:r,patch:a,availableIntents:u}=b.useAgentBuilderContext(),{trigger:n}=r,[S,h]=L.default.useState(!1),c=e=>a({trigger:{...n,mode:e}}),x=e=>{n.intents.includes(e)||a({trigger:{...n,intents:[...n.intents,e]}}),h(!1)},f=e=>a({trigger:{...n,intents:n.intents.filter(l=>l!==e)}}),m=e=>u.find(l=>l.value===e)?.label??e,d=u.filter(e=>!n.intents.includes(e.value)).map(e=>({label:e.label,value:e.value}));return t.jsxs("div",{children:[t.jsx(v.StepSectionHeader,{title:C.title,helper:C.helper}),t.jsxs(o.CardRow,{children:[t.jsxs(o.RadioCard,{"data-test":"trigger-mode-manifest",selected:n.mode==="manifest_intent",onClick:()=>c("manifest_intent"),children:[t.jsx(p.RadioButton,{isActive:n.mode==="manifest_intent",onValueChange:()=>c("manifest_intent"),skipSelectingOff:!0,activeColor:i.COLORS.content.brand}),t.jsxs(o.RadioCardText,{children:[t.jsx(s.TitleSmall,{color:i.COLORS.content.primary,children:"Manifest intent"}),t.jsx(s.BodyCaption,{color:i.COLORS.content.secondary,children:"Manifest's AI classifier routes conversations automatically — no keywords needed."})]})]}),t.jsxs(o.RadioCard,{"data-test":"trigger-mode-custom",selected:n.mode==="custom_intent",onClick:()=>c("custom_intent"),children:[t.jsx(p.RadioButton,{isActive:n.mode==="custom_intent",onValueChange:()=>c("custom_intent"),skipSelectingOff:!0,activeColor:i.COLORS.content.brand}),t.jsxs(o.RadioCardText,{children:[t.jsx(s.TitleSmall,{color:i.COLORS.content.primary,children:"Custom intent"}),t.jsx(s.BodyCaption,{color:i.COLORS.content.secondary,children:"Define your own trigger — use exact phrases or describe the customer's intent."})]})]})]}),n.mode==="manifest_intent"?t.jsxs(o.FieldBlock,{children:[t.jsx(s.TitleSmall,{color:i.COLORS.content.primary,children:"If customer talks about"}),t.jsxs(o.ChipWrap,{children:[n.intents.map(e=>t.jsxs(o.IntentChip,{"data-test":`intent-chip-${e}`,children:[t.jsx(s.BodySecondary,{color:i.COLORS.content.primary,children:m(e)}),t.jsx(o.ChipCloseButton,{onClick:()=>f(e),"aria-label":`Remove ${m(e)}`,children:t.jsx(y.default,{width:14,height:14,color:i.COLORS.content.secondary})})]},e)),S&&d.length>0?t.jsx(A.Dropdown,{"data-test":"intent-add-dropdown",size:"small",width:"200px",placeHolder:"Select intent",isSearchable:!0,options:d,onSelect:e=>{const g=(Array.isArray(e)?e[0]:e)?.value;g&&x(g)}}):d.length>0&&t.jsxs(o.AddChipButton,{"data-test":"intent-add-button",onClick:()=>h(!0),children:[t.jsx(j.default,{width:16,height:16,color:i.COLORS.content.secondary}),t.jsx(s.BodySecondary,{color:i.COLORS.content.secondary,children:"Intent"})]})]}),t.jsx(s.BodyCaption,{color:i.COLORS.content.secondary,children:"This agent takes over from your main assistant when this intent is detected. The changeover is automatic when you go live."})]}):t.jsx(R.AiTextArea,{"data-test":"custom-intent",label:"Describe the trigger",value:n.custom_intent??"",onChange:e=>a({trigger:{...n,custom_intent:e}}),maxLength:_.AGENT_CHAR_LIMITS.custom_intent,placeholder:"e.g. The customer wants to cancel an order they placed.",minHeight:"120px"})]})};exports.Step2WhenItStepsIn=q;
2
2
  //# sourceMappingURL=Step2WhenItStepsIn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Step2WhenItStepsIn.js","sources":["../../../../../src/components/agent-builder/steps/Step2WhenItStepsIn.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport React from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { RadioButton } from '@src/components/radioButton/RadioButton';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { TriggerMode } from '../AgentBuilder.model';\nimport {\n\tAddChipButton,\n\tCardRow,\n\tChipCloseButton,\n\tChipWrap,\n\tFieldBlock,\n\tIntentChip,\n\tRadioCard,\n\tRadioCardText,\n} from '../AgentBuilder.styled';\nimport { AiTextArea } from '../components/AiTextArea';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\n\nconst STEP = STEP_DEFINITIONS[1];\n\nexport const Step2WhenItStepsIn: React.FC = () => {\n\tconst { value, patch, availableIntents } = useAgentBuilderContext();\n\tconst { trigger } = value;\n\tconst [adding, setAdding] = React.useState(false);\n\n\tconst setMode = (mode: TriggerMode) =>\n\t\tpatch({ trigger: { ...trigger, mode } });\n\n\tconst addIntent = (intentValue: string) => {\n\t\tif (!trigger.intents.includes(intentValue)) {\n\t\t\tpatch({\n\t\t\t\ttrigger: { ...trigger, intents: [...trigger.intents, intentValue] },\n\t\t\t});\n\t\t}\n\t\tsetAdding(false);\n\t};\n\n\tconst removeIntent = (intentValue: string) =>\n\t\tpatch({\n\t\t\ttrigger: {\n\t\t\t\t...trigger,\n\t\t\t\tintents: trigger.intents.filter((i) => i !== intentValue),\n\t\t\t},\n\t\t});\n\n\tconst labelFor = (v: string) =>\n\t\tavailableIntents.find((o) => o.value === v)?.label ?? v;\n\n\tconst remainingOptions: SingleOption[] = availableIntents\n\t\t.filter((o) => !trigger.intents.includes(o.value))\n\t\t.map((o) => ({ label: o.label, value: o.value }));\n\n\treturn (\n\t\t<div>\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<CardRow>\n\t\t\t\t<RadioCard\n\t\t\t\t\tdata-test=\"trigger-mode-manifest\"\n\t\t\t\t\tselected={trigger.mode === 'manifest_intent'}\n\t\t\t\t\tonClick={() => setMode('manifest_intent')}\n\t\t\t\t>\n\t\t\t\t\t<RadioButton\n\t\t\t\t\t\tisActive={trigger.mode === 'manifest_intent'}\n\t\t\t\t\t\tonValueChange={() => setMode('manifest_intent')}\n\t\t\t\t\t\tskipSelectingOff\n\t\t\t\t\t\tactiveColor={COLORS.content.brand}\n\t\t\t\t\t/>\n\t\t\t\t\t<RadioCardText>\n\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\tManifest intent\n\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tManifest&apos;s AI classifier routes conversations automatically —\n\t\t\t\t\t\t\tno keywords needed.\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t</RadioCardText>\n\t\t\t\t</RadioCard>\n\n\t\t\t\t<RadioCard\n\t\t\t\t\tdata-test=\"trigger-mode-custom\"\n\t\t\t\t\tselected={trigger.mode === 'custom_intent'}\n\t\t\t\t\tonClick={() => setMode('custom_intent')}\n\t\t\t\t>\n\t\t\t\t\t<RadioButton\n\t\t\t\t\t\tisActive={trigger.mode === 'custom_intent'}\n\t\t\t\t\t\tonValueChange={() => setMode('custom_intent')}\n\t\t\t\t\t\tskipSelectingOff\n\t\t\t\t\t\tactiveColor={COLORS.content.brand}\n\t\t\t\t\t/>\n\t\t\t\t\t<RadioCardText>\n\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\tCustom intent\n\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tDefine your own trigger — use exact phrases or describe the\n\t\t\t\t\t\t\tcustomer&apos;s intent.\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t</RadioCardText>\n\t\t\t\t</RadioCard>\n\t\t\t</CardRow>\n\n\t\t\t{trigger.mode === 'manifest_intent' ? (\n\t\t\t\t<FieldBlock>\n\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\tIf customer talks about\n\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t<ChipWrap>\n\t\t\t\t\t\t{trigger.intents.map((intent) => (\n\t\t\t\t\t\t\t<IntentChip key={intent} data-test={`intent-chip-${intent}`}>\n\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{labelFor(intent)}\n\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t<ChipCloseButton\n\t\t\t\t\t\t\t\t\tonClick={() => removeIntent(intent)}\n\t\t\t\t\t\t\t\t\taria-label={`Remove ${labelFor(intent)}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</ChipCloseButton>\n\t\t\t\t\t\t\t</IntentChip>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{adding && remainingOptions.length > 0 ? (\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"intent-add-dropdown\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"200px\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select intent\"\n\t\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\t\toptions={remainingOptions}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\taddIntent(v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tremainingOptions.length > 0 && (\n\t\t\t\t\t\t\t\t<AddChipButton\n\t\t\t\t\t\t\t\t\tdata-test=\"intent-add-button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setAdding(true)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<PlusIcon\n\t\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\t\tIntent\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t</AddChipButton>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ChipWrap>\n\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\tThis agent takes over from your main assistant when this intent is\n\t\t\t\t\t\tdetected. The changeover is automatic when you go live.\n\t\t\t\t\t</BodyCaption>\n\t\t\t\t</FieldBlock>\n\t\t\t) : (\n\t\t\t\t<AiTextArea\n\t\t\t\t\tdata-test=\"custom-intent\"\n\t\t\t\t\tlabel=\"Describe the trigger\"\n\t\t\t\t\tvalue={trigger.customIntent ?? ''}\n\t\t\t\t\tonChange={(text) =>\n\t\t\t\t\t\tpatch({ trigger: { ...trigger, customIntent: text } })\n\t\t\t\t\t}\n\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.customIntent}\n\t\t\t\t\tplaceholder=\"e.g. The customer wants to cancel an order they placed.\"\n\t\t\t\t\tminHeight=\"120px\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step2WhenItStepsIn","value","patch","availableIntents","useAgentBuilderContext","trigger","adding","setAdding","React","setMode","mode","addIntent","intentValue","removeIntent","i","labelFor","v","o","remainingOptions","jsx","StepSectionHeader","CardRow","jsxs","RadioCard","RadioButton","COLORS","RadioCardText","TitleSmall","BodyCaption","FieldBlock","ChipWrap","intent","IntentChip","BodySecondary","ChipCloseButton","CrossIcon","Dropdown","opt","AddChipButton","PlusIcon","AiTextArea","text","AGENT_CHAR_LIMITS"],"mappings":"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"}
1
+ {"version":3,"file":"Step2WhenItStepsIn.js","sources":["../../../../../src/components/agent-builder/steps/Step2WhenItStepsIn.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport React from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { RadioButton } from '@src/components/radioButton/RadioButton';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { TriggerMode } from '../AgentBuilder.model';\nimport {\n\tAddChipButton,\n\tCardRow,\n\tChipCloseButton,\n\tChipWrap,\n\tFieldBlock,\n\tIntentChip,\n\tRadioCard,\n\tRadioCardText,\n} from '../AgentBuilder.styled';\nimport { AiTextArea } from '../components/AiTextArea';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\n\nconst STEP = STEP_DEFINITIONS[1];\n\nexport const Step2WhenItStepsIn: React.FC = () => {\n\tconst { value, patch, availableIntents } = useAgentBuilderContext();\n\tconst { trigger } = value;\n\tconst [adding, setAdding] = React.useState(false);\n\n\tconst setMode = (mode: TriggerMode) =>\n\t\tpatch({ trigger: { ...trigger, mode } });\n\n\tconst addIntent = (intentValue: string) => {\n\t\tif (!trigger.intents.includes(intentValue)) {\n\t\t\tpatch({\n\t\t\t\ttrigger: { ...trigger, intents: [...trigger.intents, intentValue] },\n\t\t\t});\n\t\t}\n\t\tsetAdding(false);\n\t};\n\n\tconst removeIntent = (intentValue: string) =>\n\t\tpatch({\n\t\t\ttrigger: {\n\t\t\t\t...trigger,\n\t\t\t\tintents: trigger.intents.filter((i) => i !== intentValue),\n\t\t\t},\n\t\t});\n\n\tconst labelFor = (v: string) =>\n\t\tavailableIntents.find((o) => o.value === v)?.label ?? v;\n\n\tconst remainingOptions: SingleOption[] = availableIntents\n\t\t.filter((o) => !trigger.intents.includes(o.value))\n\t\t.map((o) => ({ label: o.label, value: o.value }));\n\n\treturn (\n\t\t<div>\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<CardRow>\n\t\t\t\t<RadioCard\n\t\t\t\t\tdata-test=\"trigger-mode-manifest\"\n\t\t\t\t\tselected={trigger.mode === 'manifest_intent'}\n\t\t\t\t\tonClick={() => setMode('manifest_intent')}\n\t\t\t\t>\n\t\t\t\t\t<RadioButton\n\t\t\t\t\t\tisActive={trigger.mode === 'manifest_intent'}\n\t\t\t\t\t\tonValueChange={() => setMode('manifest_intent')}\n\t\t\t\t\t\tskipSelectingOff\n\t\t\t\t\t\tactiveColor={COLORS.content.brand}\n\t\t\t\t\t/>\n\t\t\t\t\t<RadioCardText>\n\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\tManifest intent\n\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tManifest&apos;s AI classifier routes conversations automatically —\n\t\t\t\t\t\t\tno keywords needed.\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t</RadioCardText>\n\t\t\t\t</RadioCard>\n\n\t\t\t\t<RadioCard\n\t\t\t\t\tdata-test=\"trigger-mode-custom\"\n\t\t\t\t\tselected={trigger.mode === 'custom_intent'}\n\t\t\t\t\tonClick={() => setMode('custom_intent')}\n\t\t\t\t>\n\t\t\t\t\t<RadioButton\n\t\t\t\t\t\tisActive={trigger.mode === 'custom_intent'}\n\t\t\t\t\t\tonValueChange={() => setMode('custom_intent')}\n\t\t\t\t\t\tskipSelectingOff\n\t\t\t\t\t\tactiveColor={COLORS.content.brand}\n\t\t\t\t\t/>\n\t\t\t\t\t<RadioCardText>\n\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\tCustom intent\n\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tDefine your own trigger — use exact phrases or describe the\n\t\t\t\t\t\t\tcustomer&apos;s intent.\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t</RadioCardText>\n\t\t\t\t</RadioCard>\n\t\t\t</CardRow>\n\n\t\t\t{trigger.mode === 'manifest_intent' ? (\n\t\t\t\t<FieldBlock>\n\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\tIf customer talks about\n\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t<ChipWrap>\n\t\t\t\t\t\t{trigger.intents.map((intent) => (\n\t\t\t\t\t\t\t<IntentChip key={intent} data-test={`intent-chip-${intent}`}>\n\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t\t{labelFor(intent)}\n\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t<ChipCloseButton\n\t\t\t\t\t\t\t\t\tonClick={() => removeIntent(intent)}\n\t\t\t\t\t\t\t\t\taria-label={`Remove ${labelFor(intent)}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</ChipCloseButton>\n\t\t\t\t\t\t\t</IntentChip>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{adding && remainingOptions.length > 0 ? (\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"intent-add-dropdown\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"200px\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select intent\"\n\t\t\t\t\t\t\t\tisSearchable\n\t\t\t\t\t\t\t\toptions={remainingOptions}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\taddIntent(v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tremainingOptions.length > 0 && (\n\t\t\t\t\t\t\t\t<AddChipButton\n\t\t\t\t\t\t\t\t\tdata-test=\"intent-add-button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setAdding(true)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<PlusIcon\n\t\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<BodySecondary color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\t\tIntent\n\t\t\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t\t</AddChipButton>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ChipWrap>\n\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\tThis agent takes over from your main assistant when this intent is\n\t\t\t\t\t\tdetected. The changeover is automatic when you go live.\n\t\t\t\t\t</BodyCaption>\n\t\t\t\t</FieldBlock>\n\t\t\t) : (\n\t\t\t\t<AiTextArea\n\t\t\t\t\tdata-test=\"custom-intent\"\n\t\t\t\t\tlabel=\"Describe the trigger\"\n\t\t\t\t\tvalue={trigger.custom_intent ?? ''}\n\t\t\t\t\tonChange={(text) =>\n\t\t\t\t\t\tpatch({ trigger: { ...trigger, custom_intent: text } })\n\t\t\t\t\t}\n\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.custom_intent}\n\t\t\t\t\tplaceholder=\"e.g. The customer wants to cancel an order they placed.\"\n\t\t\t\t\tminHeight=\"120px\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step2WhenItStepsIn","value","patch","availableIntents","useAgentBuilderContext","trigger","adding","setAdding","React","setMode","mode","addIntent","intentValue","removeIntent","i","labelFor","v","o","remainingOptions","jsx","StepSectionHeader","CardRow","jsxs","RadioCard","RadioButton","COLORS","RadioCardText","TitleSmall","BodyCaption","FieldBlock","ChipWrap","intent","IntentChip","BodySecondary","ChipCloseButton","CrossIcon","Dropdown","opt","AddChipButton","PlusIcon","AiTextArea","text","AGENT_CHAR_LIMITS"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),o=require("react"),A=require("../../TypographyStyle.js"),x=require("../../../constants/Theme.js"),b=require("../AgentBuilder.styled.js"),D=require("../components/CreateSubAgentPanel.js"),T=require("../components/MentionField.js"),C=require("../components/SelectableListSection.js"),K=require("../components/StepSectionHeader.js"),I=require("../constants/charLimits.js"),z=require("../constants/steps.js"),U=require("../context/AgentBuilderContext.js"),W=require("../utils/mentionSerialization.js"),$=require("../../dropdown/Dropdown.js"),j=z.STEP_DEFINITIONS[2],J=()=>{const{value:s,patch:i,updateField:q,removeReference:v,availableTools:S,availableSubAgents:O,availableModels:m,applicationType:w,insertMention:r,onCreateSubAgent:c,onFetchSubAgent:u,onUpdateSubAgent:h,onImproveSubAgent:R}=U.useAgentBuilderContext(),[l,d]=o.useState(null),g=o.useRef(0),[L,y]=o.useState([]),p=new Map;O.forEach(e=>p.set(e.id,e)),L.forEach(e=>p.set(e.id,e));const M=Array.from(p.values()),k=o.useCallback(()=>{g.current+=1,d({key:g.current,title:"Create sub-agent"})},[]),H=o.useCallback(async e=>{if(!u)return;const t=await u(e);g.current+=1,d({key:g.current,title:"Edit sub-agent",editingId:e,initial:t})},[u]),N=o.useCallback(async e=>{if(l?.editingId){if(h){const t=await h(l.editingId,e);y(a=>[...a.filter(G=>G.id!==t.id),t])}}else if(c){const t=await c(e);y(a=>[...a,t]),i({subagents:[...s.subagents,t.id]}),r("subagent",t.id,`sub-agent: ${t.name}`)}d(null)},[l,h,c,i,s.subagents,r]),P=s.tools.map(e=>{const t=S.find(a=>a.tool_id===e);return t?{id:e,label:t.displayName}:null}).filter(e=>e!==null),E=S.map(e=>({label:e.displayName,value:e.tool_id,subText:e.description})),_=s.subagents.map(e=>{const t=p.get(e);return t?{id:e,label:t.name}:null}).filter(e=>e!==null),F=M.map(e=>({label:e.name,value:e.id})),B=m.map(e=>({label:e.label,value:e.value,selected:e.value===s.model})),f=m.find(e=>e.value===s.model);return n.jsxs("div",{className:"bik-agent-step bik-agent-step--response",children:[n.jsx(K.StepSectionHeader,{title:j.title,helper:j.helper}),n.jsxs(b.Step3Grid,{children:[n.jsxs(b.Step3Main,{children:[n.jsx(T.MentionField,{fieldKey:"instructions","data-test":"agent-instructions",label:"Instructions",maxLength:I.AGENT_CHAR_LIMITS.instructions,placeholder:"Write what this agent should do. Type @ to reference a tool or sub-agent.",minHeight:"200px"}),n.jsx(T.MentionField,{fieldKey:"guardrail","data-test":"agent-guardrail",label:"Guardrails",maxLength:I.AGENT_CHAR_LIMITS.guardrail,placeholder:"Things this agent must never do. Type @ to reference a tool or sub-agent.",minHeight:"140px"})]}),n.jsxs(b.Step3Side,{children:[n.jsx(C.SelectableListSection,{title:"Tools",helper:"Actions this agent can take while responding.",dataTestPrefix:"agent-tools",items:P,addableOptions:E,emptyText:"No tools added yet.",onAdd:e=>{r("tool",e),s.tools.includes(e)||i({tools:[...s.tools,e]})},onRemove:e=>v("tool",e)}),n.jsx(C.SelectableListSection,{title:"Sub-agents",helper:"Other agents this agent can hand off the conversation to.",dataTestPrefix:"agent-subagents",items:_,addableOptions:F,emptyText:"No sub-agents added yet.",onAdd:e=>{r("subagent",e),s.subagents.includes(e)||i({subagents:[...s.subagents,e]})},onRemove:e=>v("subagent",e),onConfigure:u?H:void 0,createOption:c?{label:"Create new",onSelect:k}:void 0}),m.length>0&&n.jsxs(b.SideSection,{children:[n.jsx(A.TitleSmall,{color:x.COLORS.content.primary,children:"Advanced settings"}),n.jsx(A.TitleSmall,{color:x.COLORS.content.secondary,children:"Select AI model"}),n.jsx($.Dropdown,{"data-test":"agent-model",size:"small",width:"100%",placeHolder:"Select model",options:B,defaultOptions:f?[{label:f.label,value:f.value}]:void 0,onSelect:e=>{const a=(Array.isArray(e)?e[0]:e)?.value;a&&q("model",a)}})]})]})]}),l&&n.jsx(D.CreateSubAgentPanel,{title:l.title,initial:l.initial,availableTools:S,appLabel:W.appTypeLabel(w),onImprove:R,onClose:()=>d(null),onSave:N},l.key)]})};exports.Step3HowItResponds=J;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),o=require("react"),A=require("../../TypographyStyle.js"),x=require("../../../constants/Theme.js"),b=require("../AgentBuilder.styled.js"),D=require("../components/CreateSubAgentPanel.js"),T=require("../components/MentionField.js"),C=require("../components/SelectableListSection.js"),K=require("../components/StepSectionHeader.js"),I=require("../constants/charLimits.js"),z=require("../constants/steps.js"),U=require("../context/AgentBuilderContext.js"),W=require("../utils/mentionSerialization.js"),$=require("../../dropdown/Dropdown.js"),j=z.STEP_DEFINITIONS[2],J=()=>{const{value:s,patch:i,updateField:q,removeReference:v,availableTools:S,availableSubAgents:O,availableModels:m,applicationType:w,insertMention:r,onCreateSubAgent:c,onFetchSubAgent:u,onUpdateSubAgent:h,onImproveSubAgent:R}=U.useAgentBuilderContext(),[l,d]=o.useState(null),g=o.useRef(0),[L,y]=o.useState([]),p=new Map;O.forEach(e=>p.set(e.id,e)),L.forEach(e=>p.set(e.id,e));const M=Array.from(p.values()),k=o.useCallback(()=>{g.current+=1,d({key:g.current,title:"Create sub-agent"})},[]),_=o.useCallback(async e=>{if(!u)return;const t=await u(e);g.current+=1,d({key:g.current,title:"Edit sub-agent",editingId:e,initial:t})},[u]),H=o.useCallback(async e=>{if(l?.editingId){if(h){const t=await h(l.editingId,e);y(a=>[...a.filter(G=>G.id!==t.id),t])}}else if(c){const t=await c(e);y(a=>[...a,t]),i({subagents:[...s.subagents,t.id]}),r("subagent",t.id,`sub-agent: ${t.name}`)}d(null)},[l,h,c,i,s.subagents,r]),P=s.tools.map(e=>{const t=S.find(a=>a.tool_id===e);return t?{id:e,label:t.display_name}:null}).filter(e=>e!==null),E=S.map(e=>({label:e.display_name,value:e.tool_id,subText:e.description})),N=s.subagents.map(e=>{const t=p.get(e);return t?{id:e,label:t.name}:null}).filter(e=>e!==null),F=M.map(e=>({label:e.name,value:e.id})),B=m.map(e=>({label:e.label,value:e.value,selected:e.value===s.model})),f=m.find(e=>e.value===s.model);return n.jsxs("div",{className:"bik-agent-step bik-agent-step--response",children:[n.jsx(K.StepSectionHeader,{title:j.title,helper:j.helper}),n.jsxs(b.Step3Grid,{children:[n.jsxs(b.Step3Main,{children:[n.jsx(T.MentionField,{fieldKey:"instructions","data-test":"agent-instructions",label:"Instructions",maxLength:I.AGENT_CHAR_LIMITS.instructions,placeholder:"Write what this agent should do. Type @ to reference a tool or sub-agent.",minHeight:"200px"}),n.jsx(T.MentionField,{fieldKey:"guardrail","data-test":"agent-guardrail",label:"Guardrails",maxLength:I.AGENT_CHAR_LIMITS.guardrail,placeholder:"Things this agent must never do. Type @ to reference a tool or sub-agent.",minHeight:"140px"})]}),n.jsxs(b.Step3Side,{children:[n.jsx(C.SelectableListSection,{title:"Tools",helper:"Actions this agent can take while responding.",dataTestPrefix:"agent-tools",items:P,addableOptions:E,emptyText:"No tools added yet.",onAdd:e=>{r("tool",e),s.tools.includes(e)||i({tools:[...s.tools,e]})},onRemove:e=>v("tool",e)}),n.jsx(C.SelectableListSection,{title:"Sub-agents",helper:"Other agents this agent can hand off the conversation to.",dataTestPrefix:"agent-subagents",items:N,addableOptions:F,emptyText:"No sub-agents added yet.",onAdd:e=>{r("subagent",e),s.subagents.includes(e)||i({subagents:[...s.subagents,e]})},onRemove:e=>v("subagent",e),onConfigure:u?_:void 0,createOption:c?{label:"Create new",onSelect:k}:void 0}),m.length>0&&n.jsxs(b.SideSection,{children:[n.jsx(A.TitleSmall,{color:x.COLORS.content.primary,children:"Advanced settings"}),n.jsx(A.TitleSmall,{color:x.COLORS.content.secondary,children:"Select AI model"}),n.jsx($.Dropdown,{"data-test":"agent-model",size:"small",width:"100%",placeHolder:"Select model",options:B,defaultOptions:f?[{label:f.label,value:f.value}]:void 0,onSelect:e=>{const a=(Array.isArray(e)?e[0]:e)?.value;a&&q("model",a)}})]})]})]}),l&&n.jsx(D.CreateSubAgentPanel,{title:l.title,initial:l.initial,availableTools:S,appLabel:W.appTypeLabel(w),onImprove:R,onClose:()=>d(null),onSave:H},l.key)]})};exports.Step3HowItResponds=J;
2
2
  //# sourceMappingURL=Step3HowItResponds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Step3HowItResponds.js","sources":["../../../../../src/components/agent-builder/steps/Step3HowItResponds.tsx"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { SubAgentDraft, SubAgentRef } from '../AgentBuilder.model';\nimport {\n\tSideSection,\n\tStep3Grid,\n\tStep3Main,\n\tStep3Side,\n} from '../AgentBuilder.styled';\nimport { CreateSubAgentPanel } from '../components/CreateSubAgentPanel';\nimport { MentionField } from '../components/MentionField';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n} from '../components/SelectableListSection';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\nimport { appTypeLabel } from '../utils/mentionSerialization';\n\nconst STEP = STEP_DEFINITIONS[2];\n\n/** Drawer state — null when closed; `key` remounts it fresh per open. */\ninterface SubAgentPanelState {\n\tkey: number;\n\ttitle: string;\n\teditingId?: string;\n\tinitial?: SubAgentDraft;\n}\n\nexport const Step3HowItResponds: React.FC = () => {\n\tconst {\n\t\tvalue,\n\t\tpatch,\n\t\tupdateField,\n\t\tremoveReference,\n\t\tavailableTools,\n\t\tavailableSubAgents,\n\t\tavailableModels,\n\t\tapplicationType,\n\t\tinsertMention,\n\t\tonCreateSubAgent,\n\t\tonFetchSubAgent,\n\t\tonUpdateSubAgent,\n\t\tonImproveSubAgent,\n\t} = useAgentBuilderContext();\n\n\tconst [panel, setPanel] = useState<SubAgentPanelState | null>(null);\n\tconst panelKeyRef = useRef(0);\n\t// Sub-agents created / edited in this session, so a chip resolves (and reflects\n\t// a renamed sub-agent) before the consumer refreshes `availableSubAgents`.\n\tconst [createdSubAgents, setCreatedSubAgents] = useState<SubAgentRef[]>([]);\n\t// Created/edited refs take precedence over the consumer-supplied list.\n\tconst subAgentById = new Map<string, SubAgentRef>();\n\tavailableSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tcreatedSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tconst knownSubAgents = Array.from(subAgentById.values());\n\n\tconst openCreate = useCallback(() => {\n\t\tpanelKeyRef.current += 1;\n\t\tsetPanel({ key: panelKeyRef.current, title: 'Create sub-agent' });\n\t}, []);\n\n\tconst openConfigure = useCallback(\n\t\tasync (id: string) => {\n\t\t\tif (!onFetchSubAgent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst data = await onFetchSubAgent(id);\n\t\t\tpanelKeyRef.current += 1;\n\t\t\tsetPanel({\n\t\t\t\tkey: panelKeyRef.current,\n\t\t\t\ttitle: 'Edit sub-agent',\n\t\t\t\teditingId: id,\n\t\t\t\tinitial: data,\n\t\t\t});\n\t\t},\n\t\t[onFetchSubAgent],\n\t);\n\n\tconst handlePanelSave = useCallback(\n\t\tasync (draft: SubAgentDraft) => {\n\t\t\tif (panel?.editingId) {\n\t\t\t\tif (onUpdateSubAgent) {\n\t\t\t\t\tconst ref = await onUpdateSubAgent(panel.editingId, draft);\n\t\t\t\t\tsetCreatedSubAgents((prev) => [\n\t\t\t\t\t\t...prev.filter((s) => s.id !== ref.id),\n\t\t\t\t\t\tref,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t} else if (onCreateSubAgent) {\n\t\t\t\tconst ref = await onCreateSubAgent(draft);\n\t\t\t\tsetCreatedSubAgents((prev) => [...prev, ref]);\n\t\t\t\tpatch({ subagents: [...value.subagents, ref.id] });\n\t\t\t\tinsertMention('subagent', ref.id, `sub-agent: ${ref.name}`);\n\t\t\t}\n\t\t\tsetPanel(null);\n\t\t},\n\t\t[\n\t\t\tpanel,\n\t\t\tonUpdateSubAgent,\n\t\t\tonCreateSubAgent,\n\t\t\tpatch,\n\t\t\tvalue.subagents,\n\t\t\tinsertMention,\n\t\t],\n\t);\n\n\tconst toolItems: SelectableItem[] = value.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 ? { id, label: tool.displayName } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// All tools are offered (even already-added ones) so a tool can be referenced\n\t// again in the text; the chip list below still shows each only once.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.displayName,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\n\t}));\n\n\tconst subAgentItems: SelectableItem[] = value.subagents\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst sub = subAgentById.get(id);\n\t\t\treturn sub ? { id, label: sub.name } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\tconst subAgentOptions: SingleOption[] = knownSubAgents.map((s) => ({\n\t\tlabel: s.name,\n\t\tvalue: s.id,\n\t}));\n\n\tconst modelOptions: SingleOption[] = availableModels.map((m) => ({\n\t\tlabel: m.label,\n\t\tvalue: m.value,\n\t\tselected: m.value === value.model,\n\t}));\n\tconst selectedModel = availableModels.find((m) => m.value === value.model);\n\n\treturn (\n\t\t<div className=\"bik-agent-step bik-agent-step--response\">\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<Step3Grid>\n\t\t\t\t<Step3Main>\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"instructions\"\n\t\t\t\t\t\tdata-test=\"agent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.instructions}\n\t\t\t\t\t\tplaceholder=\"Write what this agent should do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"200px\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"guardrail\"\n\t\t\t\t\t\tdata-test=\"agent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.guardrail}\n\t\t\t\t\t\tplaceholder=\"Things this agent must never do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"140px\"\n\t\t\t\t\t/>\n\t\t\t\t</Step3Main>\n\n\t\t\t\t<Step3Side>\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools\"\n\t\t\t\t\t\thelper=\"Actions this agent can take while responding.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\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\t// Always drop a chip at the cursor; keep the list deduped.\n\t\t\t\t\t\t\tinsertMention('tool', id);\n\t\t\t\t\t\t\tif (!value.tools.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ tools: [...value.tools, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('tool', id)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Sub-agents\"\n\t\t\t\t\t\thelper=\"Other agents this agent can hand off the conversation to.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-subagents\"\n\t\t\t\t\t\titems={subAgentItems}\n\t\t\t\t\t\taddableOptions={subAgentOptions}\n\t\t\t\t\t\temptyText=\"No sub-agents added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertMention('subagent', id);\n\t\t\t\t\t\t\tif (!value.subagents.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ subagents: [...value.subagents, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('subagent', id)}\n\t\t\t\t\t\tonConfigure={onFetchSubAgent ? openConfigure : undefined}\n\t\t\t\t\t\tcreateOption={\n\t\t\t\t\t\t\tonCreateSubAgent\n\t\t\t\t\t\t\t\t? { label: 'Create new', onSelect: openCreate }\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{availableModels.length > 0 && (\n\t\t\t\t\t\t<SideSection>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\tAdvanced settings\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\tSelect AI model\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"agent-model\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select model\"\n\t\t\t\t\t\t\t\toptions={modelOptions}\n\t\t\t\t\t\t\t\tdefaultOptions={\n\t\t\t\t\t\t\t\t\tselectedModel\n\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: selectedModel.label,\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: selectedModel.value,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\tupdateField('model', v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</SideSection>\n\t\t\t\t\t)}\n\t\t\t\t</Step3Side>\n\t\t\t</Step3Grid>\n\n\t\t\t{panel && (\n\t\t\t\t<CreateSubAgentPanel\n\t\t\t\t\tkey={panel.key}\n\t\t\t\t\ttitle={panel.title}\n\t\t\t\t\tinitial={panel.initial}\n\t\t\t\t\tavailableTools={availableTools}\n\t\t\t\t\tappLabel={appTypeLabel(applicationType)}\n\t\t\t\t\tonImprove={onImproveSubAgent}\n\t\t\t\t\tonClose={() => setPanel(null)}\n\t\t\t\t\tonSave={handlePanelSave}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step3HowItResponds","value","patch","updateField","removeReference","availableTools","availableSubAgents","availableModels","applicationType","insertMention","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","useAgentBuilderContext","panel","setPanel","useState","panelKeyRef","useRef","createdSubAgents","setCreatedSubAgents","subAgentById","s","knownSubAgents","openCreate","useCallback","openConfigure","id","data","handlePanelSave","draft","ref","prev","toolItems","tool","t","x","toolOptions","subAgentItems","sub","subAgentOptions","modelOptions","m","selectedModel","jsxs","jsx","StepSectionHeader","Step3Grid","Step3Main","MentionField","AGENT_CHAR_LIMITS","Step3Side","SelectableListSection","SideSection","TitleSmall","COLORS","Dropdown","opt","v","CreateSubAgentPanel","appTypeLabel"],"mappings":"+oBAwBMA,EAAOC,EAAAA,iBAAiB,CAAC,EAUlBC,EAA+B,IAAM,CACjD,KAAM,CACL,MAAAC,EACA,MAAAC,EACA,YAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,iBAAAC,EACA,kBAAAC,CAAA,EACGC,yBAAA,EAEE,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAoC,IAAI,EAC5DC,EAAcC,EAAAA,OAAO,CAAC,EAGtB,CAACC,EAAkBC,CAAmB,EAAIJ,EAAAA,SAAwB,CAAA,CAAE,EAEpEK,MAAmB,IACzBhB,EAAmB,QAASiB,GAAMD,EAAa,IAAIC,EAAE,GAAIA,CAAC,CAAC,EAC3DH,EAAiB,QAASG,GAAMD,EAAa,IAAIC,EAAE,GAAIA,CAAC,CAAC,EACzD,MAAMC,EAAiB,MAAM,KAAKF,EAAa,QAAQ,EAEjDG,EAAaC,EAAAA,YAAY,IAAM,CACpCR,EAAY,SAAW,EACvBF,EAAS,CAAE,IAAKE,EAAY,QAAS,MAAO,mBAAoB,CACjE,EAAG,CAAA,CAAE,EAECS,EAAgBD,EAAAA,YACrB,MAAOE,GAAe,CACrB,GAAI,CAACjB,EACJ,OAED,MAAMkB,EAAO,MAAMlB,EAAgBiB,CAAE,EACrCV,EAAY,SAAW,EACvBF,EAAS,CACR,IAAKE,EAAY,QACjB,MAAO,iBACP,UAAWU,EACX,QAASC,CAAA,CACT,CACF,EACA,CAAClB,CAAe,CAAA,EAGXmB,EAAkBJ,EAAAA,YACvB,MAAOK,GAAyB,CAC/B,GAAIhB,GAAO,WACV,GAAIH,EAAkB,CACrB,MAAMoB,EAAM,MAAMpB,EAAiBG,EAAM,UAAWgB,CAAK,EACzDV,EAAqBY,GAAS,CAC7B,GAAGA,EAAK,OAAQV,GAAMA,EAAE,KAAOS,EAAI,EAAE,EACrCA,CAAA,CACA,CACF,UACUtB,EAAkB,CAC5B,MAAMsB,EAAM,MAAMtB,EAAiBqB,CAAK,EACxCV,EAAqBY,GAAS,CAAC,GAAGA,EAAMD,CAAG,CAAC,EAC5C9B,EAAM,CAAE,UAAW,CAAC,GAAGD,EAAM,UAAW+B,EAAI,EAAE,EAAG,EACjDvB,EAAc,WAAYuB,EAAI,GAAI,cAAcA,EAAI,IAAI,EAAE,CAC3D,CACAhB,EAAS,IAAI,CACd,EACA,CACCD,EACAH,EACAF,EACAR,EACAD,EAAM,UACNQ,CAAA,CACD,EAGKyB,EAA8BjC,EAAM,MACxC,IAAK2B,GAA8B,CACnC,MAAMO,EAAO9B,EAAe,KAAM+B,GAAMA,EAAE,UAAYR,CAAE,EACxD,OAAOO,EAAO,CAAE,GAAAP,EAAI,MAAOO,EAAK,aAAgB,IACjD,CAAC,EACA,OAAQE,GAA2BA,IAAM,IAAI,EAIzCC,EAA8BjC,EAAe,IAAK+B,IAAO,CAC9D,MAAOA,EAAE,YACT,MAAOA,EAAE,QACT,QAASA,EAAE,WAAA,EACV,EAEIG,EAAkCtC,EAAM,UAC5C,IAAK2B,GAA8B,CACnC,MAAMY,EAAMlB,EAAa,IAAIM,CAAE,EAC/B,OAAOY,EAAM,CAAE,GAAAZ,EAAI,MAAOY,EAAI,MAAS,IACxC,CAAC,EACA,OAAQH,GAA2BA,IAAM,IAAI,EAEzCI,EAAkCjB,EAAe,IAAKD,IAAO,CAClE,MAAOA,EAAE,KACT,MAAOA,EAAE,EAAA,EACR,EAEImB,EAA+BnC,EAAgB,IAAKoC,IAAO,CAChE,MAAOA,EAAE,MACT,MAAOA,EAAE,MACT,SAAUA,EAAE,QAAU1C,EAAM,KAAA,EAC3B,EACI2C,EAAgBrC,EAAgB,KAAMoC,GAAMA,EAAE,QAAU1C,EAAM,KAAK,EAEzE,OACC4C,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACd,SAAA,CAAAC,MAACC,EAAAA,mBAAkB,MAAOjD,EAAK,MAAO,OAAQA,EAAK,OAAQ,SAE1DkD,EAAAA,UAAA,CACA,SAAA,CAAAH,OAACI,EAAAA,UAAA,CACA,SAAA,CAAAH,EAAAA,IAACI,EAAAA,aAAA,CACA,SAAS,eACT,YAAU,qBACV,MAAM,eACN,UAAWC,EAAAA,kBAAkB,aAC7B,YAAY,4EACZ,UAAU,OAAA,CAAA,EAGXL,EAAAA,IAACI,EAAAA,aAAA,CACA,SAAS,YACT,YAAU,kBACV,MAAM,aACN,UAAWC,EAAAA,kBAAkB,UAC7B,YAAY,4EACZ,UAAU,OAAA,CAAA,CACX,EACD,SAECC,EAAAA,UAAA,CACA,SAAA,CAAAN,EAAAA,IAACO,EAAAA,sBAAA,CACA,MAAM,QACN,OAAO,gDACP,eAAe,cACf,MAAOnB,EACP,eAAgBI,EAChB,UAAU,sBACV,MAAQV,GAAO,CAEdnB,EAAc,OAAQmB,CAAE,EACnB3B,EAAM,MAAM,SAAS2B,CAAE,GAC3B1B,EAAM,CAAE,MAAO,CAAC,GAAGD,EAAM,MAAO2B,CAAE,EAAG,CAEvC,EACA,SAAWA,GAAOxB,EAAgB,OAAQwB,CAAE,CAAA,CAAA,EAG7CkB,EAAAA,IAACO,EAAAA,sBAAA,CACA,MAAM,aACN,OAAO,4DACP,eAAe,kBACf,MAAOd,EACP,eAAgBE,EAChB,UAAU,2BACV,MAAQb,GAAO,CACdnB,EAAc,WAAYmB,CAAE,EACvB3B,EAAM,UAAU,SAAS2B,CAAE,GAC/B1B,EAAM,CAAE,UAAW,CAAC,GAAGD,EAAM,UAAW2B,CAAE,EAAG,CAE/C,EACA,SAAWA,GAAOxB,EAAgB,WAAYwB,CAAE,EAChD,YAAajB,EAAkBgB,EAAgB,OAC/C,aACCjB,EACG,CAAE,MAAO,aAAc,SAAUe,GACjC,MAAA,CAAA,EAIJlB,EAAgB,OAAS,GACzBsC,EAAAA,KAACS,EAAAA,YAAA,CACA,SAAA,CAAAR,MAACS,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAS,SAAA,oBAE3C,QACCD,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,UAAW,SAAA,kBAE7C,EACAV,EAAAA,IAACW,EAAAA,SAAA,CACA,YAAU,cACV,KAAK,QACL,MAAM,OACN,YAAY,eACZ,QAASf,EACT,eACCE,EACG,CACA,CACC,MAAOA,EAAc,MACrB,MAAOA,EAAc,KAAA,CACtB,EAEA,OAEJ,SAAWc,GAAQ,CAElB,MAAMC,GADS,MAAM,QAAQD,CAAG,EAAIA,EAAI,CAAC,EAAIA,IACT,MAChCC,GACHxD,EAAY,QAASwD,CAAC,CAExB,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CAAA,CAEF,CAAA,EACD,EAEC5C,GACA+B,EAAAA,IAACc,EAAAA,oBAAA,CAEA,MAAO7C,EAAM,MACb,QAASA,EAAM,QACf,eAAAV,EACA,SAAUwD,EAAAA,aAAarD,CAAe,EACtC,UAAWK,EACX,QAAS,IAAMG,EAAS,IAAI,EAC5B,OAAQc,CAAA,EAPHf,EAAM,GAAA,CAQZ,EAEF,CAEF"}
1
+ {"version":3,"file":"Step3HowItResponds.js","sources":["../../../../../src/components/agent-builder/steps/Step3HowItResponds.tsx"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { SubAgentDraft, SubAgentRef } from '../AgentBuilder.model';\nimport {\n\tSideSection,\n\tStep3Grid,\n\tStep3Main,\n\tStep3Side,\n} from '../AgentBuilder.styled';\nimport { CreateSubAgentPanel } from '../components/CreateSubAgentPanel';\nimport { MentionField } from '../components/MentionField';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n} from '../components/SelectableListSection';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\nimport { appTypeLabel } from '../utils/mentionSerialization';\n\nconst STEP = STEP_DEFINITIONS[2];\n\n/** Drawer state — null when closed; `key` remounts it fresh per open. */\ninterface SubAgentPanelState {\n\tkey: number;\n\ttitle: string;\n\teditingId?: string;\n\tinitial?: SubAgentDraft;\n}\n\nexport const Step3HowItResponds: React.FC = () => {\n\tconst {\n\t\tvalue,\n\t\tpatch,\n\t\tupdateField,\n\t\tremoveReference,\n\t\tavailableTools,\n\t\tavailableSubAgents,\n\t\tavailableModels,\n\t\tapplicationType,\n\t\tinsertMention,\n\t\tonCreateSubAgent,\n\t\tonFetchSubAgent,\n\t\tonUpdateSubAgent,\n\t\tonImproveSubAgent,\n\t} = useAgentBuilderContext();\n\n\tconst [panel, setPanel] = useState<SubAgentPanelState | null>(null);\n\tconst panelKeyRef = useRef(0);\n\t// Sub-agents created / edited in this session, so a chip resolves (and reflects\n\t// a renamed sub-agent) before the consumer refreshes `availableSubAgents`.\n\tconst [createdSubAgents, setCreatedSubAgents] = useState<SubAgentRef[]>([]);\n\t// Created/edited refs take precedence over the consumer-supplied list.\n\tconst subAgentById = new Map<string, SubAgentRef>();\n\tavailableSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tcreatedSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tconst knownSubAgents = Array.from(subAgentById.values());\n\n\tconst openCreate = useCallback(() => {\n\t\tpanelKeyRef.current += 1;\n\t\tsetPanel({ key: panelKeyRef.current, title: 'Create sub-agent' });\n\t}, []);\n\n\tconst openConfigure = useCallback(\n\t\tasync (id: string) => {\n\t\t\tif (!onFetchSubAgent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst data = await onFetchSubAgent(id);\n\t\t\tpanelKeyRef.current += 1;\n\t\t\tsetPanel({\n\t\t\t\tkey: panelKeyRef.current,\n\t\t\t\ttitle: 'Edit sub-agent',\n\t\t\t\teditingId: id,\n\t\t\t\tinitial: data,\n\t\t\t});\n\t\t},\n\t\t[onFetchSubAgent],\n\t);\n\n\tconst handlePanelSave = useCallback(\n\t\tasync (draft: SubAgentDraft) => {\n\t\t\tif (panel?.editingId) {\n\t\t\t\tif (onUpdateSubAgent) {\n\t\t\t\t\tconst ref = await onUpdateSubAgent(panel.editingId, draft);\n\t\t\t\t\tsetCreatedSubAgents((prev) => [\n\t\t\t\t\t\t...prev.filter((s) => s.id !== ref.id),\n\t\t\t\t\t\tref,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t} else if (onCreateSubAgent) {\n\t\t\t\tconst ref = await onCreateSubAgent(draft);\n\t\t\t\tsetCreatedSubAgents((prev) => [...prev, ref]);\n\t\t\t\tpatch({ subagents: [...value.subagents, ref.id] });\n\t\t\t\tinsertMention('subagent', ref.id, `sub-agent: ${ref.name}`);\n\t\t\t}\n\t\t\tsetPanel(null);\n\t\t},\n\t\t[\n\t\t\tpanel,\n\t\t\tonUpdateSubAgent,\n\t\t\tonCreateSubAgent,\n\t\t\tpatch,\n\t\t\tvalue.subagents,\n\t\t\tinsertMention,\n\t\t],\n\t);\n\n\tconst toolItems: SelectableItem[] = value.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 ? { id, label: tool.display_name } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// All tools are offered (even already-added ones) so a tool can be referenced\n\t// again in the text; the chip list below still shows each only once.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\n\t}));\n\n\tconst subAgentItems: SelectableItem[] = value.subagents\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst sub = subAgentById.get(id);\n\t\t\treturn sub ? { id, label: sub.name } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\tconst subAgentOptions: SingleOption[] = knownSubAgents.map((s) => ({\n\t\tlabel: s.name,\n\t\tvalue: s.id,\n\t}));\n\n\tconst modelOptions: SingleOption[] = availableModels.map((m) => ({\n\t\tlabel: m.label,\n\t\tvalue: m.value,\n\t\tselected: m.value === value.model,\n\t}));\n\tconst selectedModel = availableModels.find((m) => m.value === value.model);\n\n\treturn (\n\t\t<div className=\"bik-agent-step bik-agent-step--response\">\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<Step3Grid>\n\t\t\t\t<Step3Main>\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"instructions\"\n\t\t\t\t\t\tdata-test=\"agent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.instructions}\n\t\t\t\t\t\tplaceholder=\"Write what this agent should do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"200px\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"guardrail\"\n\t\t\t\t\t\tdata-test=\"agent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.guardrail}\n\t\t\t\t\t\tplaceholder=\"Things this agent must never do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"140px\"\n\t\t\t\t\t/>\n\t\t\t\t</Step3Main>\n\n\t\t\t\t<Step3Side>\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools\"\n\t\t\t\t\t\thelper=\"Actions this agent can take while responding.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\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\t// Always drop a chip at the cursor; keep the list deduped.\n\t\t\t\t\t\t\tinsertMention('tool', id);\n\t\t\t\t\t\t\tif (!value.tools.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ tools: [...value.tools, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('tool', id)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Sub-agents\"\n\t\t\t\t\t\thelper=\"Other agents this agent can hand off the conversation to.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-subagents\"\n\t\t\t\t\t\titems={subAgentItems}\n\t\t\t\t\t\taddableOptions={subAgentOptions}\n\t\t\t\t\t\temptyText=\"No sub-agents added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertMention('subagent', id);\n\t\t\t\t\t\t\tif (!value.subagents.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ subagents: [...value.subagents, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('subagent', id)}\n\t\t\t\t\t\tonConfigure={onFetchSubAgent ? openConfigure : undefined}\n\t\t\t\t\t\tcreateOption={\n\t\t\t\t\t\t\tonCreateSubAgent\n\t\t\t\t\t\t\t\t? { label: 'Create new', onSelect: openCreate }\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{availableModels.length > 0 && (\n\t\t\t\t\t\t<SideSection>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\tAdvanced settings\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\tSelect AI model\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"agent-model\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select model\"\n\t\t\t\t\t\t\t\toptions={modelOptions}\n\t\t\t\t\t\t\t\tdefaultOptions={\n\t\t\t\t\t\t\t\t\tselectedModel\n\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: selectedModel.label,\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: selectedModel.value,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\tupdateField('model', v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</SideSection>\n\t\t\t\t\t)}\n\t\t\t\t</Step3Side>\n\t\t\t</Step3Grid>\n\n\t\t\t{panel && (\n\t\t\t\t<CreateSubAgentPanel\n\t\t\t\t\tkey={panel.key}\n\t\t\t\t\ttitle={panel.title}\n\t\t\t\t\tinitial={panel.initial}\n\t\t\t\t\tavailableTools={availableTools}\n\t\t\t\t\tappLabel={appTypeLabel(applicationType)}\n\t\t\t\t\tonImprove={onImproveSubAgent}\n\t\t\t\t\tonClose={() => setPanel(null)}\n\t\t\t\t\tonSave={handlePanelSave}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step3HowItResponds","value","patch","updateField","removeReference","availableTools","availableSubAgents","availableModels","applicationType","insertMention","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","useAgentBuilderContext","panel","setPanel","useState","panelKeyRef","useRef","createdSubAgents","setCreatedSubAgents","subAgentById","s","knownSubAgents","openCreate","useCallback","openConfigure","id","data","handlePanelSave","draft","ref","prev","toolItems","tool","t","x","toolOptions","subAgentItems","sub","subAgentOptions","modelOptions","m","selectedModel","jsxs","jsx","StepSectionHeader","Step3Grid","Step3Main","MentionField","AGENT_CHAR_LIMITS","Step3Side","SelectableListSection","SideSection","TitleSmall","COLORS","Dropdown","opt","v","CreateSubAgentPanel","appTypeLabel"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={manifest:"Manifest",shopify:"Shopify",integration:"Integration"},u=(t,n="Manifest")=>t?c[t]??t:n,b=t=>{const n=t?String(t):"";return n==="BIK"?"BIK":n==="BSP"?"BSP":"Manifest"},g=(t,n,e="Manifest")=>[...t.map(o=>({id:o.tool_id,label:`${u(o.source,e)} : ${o.displayName}`,meta:{kind:"tool",functionKey:o.function_key,plainLabel:o.displayName,source:o.source}})),...n.map(o=>({id:o.id,label:`sub-agent: ${o.name}`,meta:{kind:"subagent",plainLabel:o.name}}))],a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),s=t=>a(t).replace(/"/g,"&quot;"),d=(t,n,e)=>`<span data-type="mentionAgent" class="bik-mention bik-mention--agent" data-id="${s(t)}" data-label="${s(n)}" data-kind="${s(e)}">${a(n)}</span>`,f=(t,n,e)=>d(t,n,e),k=t=>{const n=new Map;for(const e of t){const o=e.meta;o?.kind==="tool"&&o.functionKey?n.set(`tool:${o.functionKey}`,e):o?.kind==="subagent"&&n.set(`subagent:${String(e.id)}`,e)}return n},l=/\{\{(tool:[^}]+|subagent:[^}]+)\}\}/g,y=(t,n)=>{let e="",o=0;l.lastIndex=0;let i;for(;(i=l.exec(t))!==null;){e+=a(t.slice(o,i.index));const r=n.get(i[1]);if(r){const m=r.meta.kind;e+=d(String(r.id),r.label,m)}else e+=a(i[0]);o=l.lastIndex}return e+=a(t.slice(o)),e.replace(/\n/g,"<br>")},S=(t,n=[])=>{if(!t)return"";const e=k(n);return t.split(/\n{2,}/).map(o=>`<p>${y(o,e)}</p>`).join("")},T=(t,n)=>{const e=n[t];return e?`{{tool:${e}}}`:`{{subagent:${t}}}`},p=(t,n)=>{switch(t.type){case"text":return t.text??"";case"mentionAgent":case"mentionTeam":{const e=t.attrs?.id;return e==null?"":T(String(e),n)}case"variable":return`{{${String(t.attrs?.variableName??"")}}}`;case"hardBreak":return`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={manifest:"Manifest",shopify:"Shopify",integration:"Integration"},u=(t,n="Manifest")=>t?c[t]??t:n,b=t=>{const n=t?String(t):"";return n==="BIK"?"BIK":n==="BSP"?"BSP":"Manifest"},g=(t,n,e="Manifest")=>[...t.map(o=>({id:o.tool_id,label:`${u(o.source,e)} : ${o.display_name}`,meta:{kind:"tool",functionKey:o.function_key,plainLabel:o.display_name,source:o.source}})),...n.map(o=>({id:o.id,label:`sub-agent: ${o.name}`,meta:{kind:"subagent",plainLabel:o.name}}))],a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),s=t=>a(t).replace(/"/g,"&quot;"),d=(t,n,e)=>`<span data-type="mentionAgent" class="bik-mention bik-mention--agent" data-id="${s(t)}" data-label="${s(n)}" data-kind="${s(e)}">${a(n)}</span>`,f=(t,n,e)=>d(t,n,e),k=t=>{const n=new Map;for(const e of t){const o=e.meta;o?.kind==="tool"&&o.functionKey?n.set(`tool:${o.functionKey}`,e):o?.kind==="subagent"&&n.set(`subagent:${String(e.id)}`,e)}return n},l=/\{\{(tool:[^}]+|subagent:[^}]+)\}\}/g,y=(t,n)=>{let e="",o=0;l.lastIndex=0;let i;for(;(i=l.exec(t))!==null;){e+=a(t.slice(o,i.index));const r=n.get(i[1]);if(r){const m=r.meta.kind;e+=d(String(r.id),r.label,m)}else e+=a(i[0]);o=l.lastIndex}return e+=a(t.slice(o)),e.replace(/\n/g,"<br>")},S=(t,n=[])=>{if(!t)return"";const e=k(n);return t.split(/\n{2,}/).map(o=>`<p>${y(o,e)}</p>`).join("")},T=(t,n)=>{const e=n[t];return e?`{{tool:${e}}}`:`{{subagent:${t}}}`},p=(t,n)=>{switch(t.type){case"text":return t.text??"";case"mentionAgent":case"mentionTeam":{const e=t.attrs?.id;return e==null?"":T(String(e),n)}case"variable":return`{{${String(t.attrs?.variableName??"")}}}`;case"hardBreak":return`
2
2
  `;default:{const e=(t.content??[]).map(i=>p(i,n)).join("");return["paragraph","heading","listItem","blockquote"].includes(t.type)?`${e}
3
3
  `:e}}},L=(t,n)=>{if(!t)return"";const e=n.reduce((o,i)=>(o[i.tool_id]=i.function_key,o),{});return p(t,e).replace(/\n+$/,"")};exports.TOOL_SOURCE_LABELS=c;exports.appTypeLabel=b;exports.buildAgentMentionItems=g;exports.buildMentionHtml=f;exports.editorDocToInstructions=L;exports.instructionsToEditorHtml=S;exports.toolSourceLabel=u;
4
4
  //# sourceMappingURL=mentionSerialization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mentionSerialization.js","sources":["../../../../../src/components/agent-builder/utils/mentionSerialization.ts"],"sourcesContent":["import type { ApplicationType } from '@bikdotai/bik-models/growth';\nimport { MentionItem } from '@src/editor';\nimport { AgentTool, SubAgentRef } from '../AgentBuilder.model';\n\n/**\n * Serialization helpers between the BikEditor document and the firebase\n * `instructions` string.\n *\n * Firebase stores `instructions` as PLAIN TEXT with inline reference tokens:\n * - `{{subagent:<agentId>}}` — hand-off to another agent\n * - `{{tool:<function_key>}}` — an action the agent can call\n * - `{{<variableName>}}` — a template variable\n *\n * In the editor those references are inserted via the `@` mention menu (which we\n * populate with BOTH tools and sub-agents). Mention nodes keep their `id` in the\n * ProseMirror doc JSON (the rendered HTML drops it), so we serialize from the doc\n * JSON — not from HTML.\n */\n\nexport interface MentionKindMeta {\n\t/** Distinguishes a tool reference from a sub-agent reference. */\n\tkind: 'tool' | 'subagent';\n\t/** For tools: the function_key used in the `{{tool:KEY}}` token. */\n\tfunctionKey?: string;\n\t/** Plain item name (no prefix) shown in the picker dropdown rows. */\n\tplainLabel?: string;\n\t/** For tools: the source bucket (manifest / shopify / …) the picker groups by. */\n\tsource?: string;\n}\n\n/** Display labels for the known tool sources (drives picker headers + chip prefix). */\nexport const TOOL_SOURCE_LABELS: Record<string, string> = {\n\tmanifest: 'Manifest',\n\tshopify: 'Shopify',\n\tintegration: 'Integration',\n};\n\n/** Human label for a tool source; falls back to the host-app label, then the raw key. */\nexport const toolSourceLabel = (\n\tsource: string | undefined,\n\tfallback = 'Manifest',\n): string => {\n\tif (!source) {\n\t\treturn fallback;\n\t}\n\treturn TOOL_SOURCE_LABELS[source] ?? source;\n};\n\n/** Human label for the host application, used as the tool-chip prefix. */\nexport const appTypeLabel = (applicationType?: ApplicationType): string => {\n\tconst key = applicationType ? String(applicationType) : '';\n\tif (key === 'BIK') {\n\t\treturn 'BIK';\n\t}\n\tif (key === 'BSP') {\n\t\treturn 'BSP';\n\t}\n\treturn 'Manifest';\n};\n\n/**\n * Build the combined `@` mention list from the available tools + sub-agents.\n *\n * The `label` is the CHIP text shown once inserted — tools read\n * `\"<App> : <tool name>\"` (e.g. \"Manifest : Look up order\"), sub-agents read\n * `\"sub-agent: <name>\"`. `meta.plainLabel` is the un-prefixed name for the\n * picker rows, and `meta.kind` drives the `{{tool}}` / `{{subagent}}` colour.\n */\nexport const buildAgentMentionItems = (\n\ttools: AgentTool[],\n\tsubAgents: SubAgentRef[],\n\tappLabel = 'Manifest',\n): MentionItem[] => [\n\t...tools.map(\n\t\t(t): MentionItem => ({\n\t\t\tid: t.tool_id,\n\t\t\tlabel: `${toolSourceLabel(t.source, appLabel)} : ${t.displayName}`,\n\t\t\tmeta: {\n\t\t\t\tkind: 'tool',\n\t\t\t\tfunctionKey: t.function_key,\n\t\t\t\tplainLabel: t.displayName,\n\t\t\t\tsource: t.source,\n\t\t\t},\n\t\t}),\n\t),\n\t...subAgents.map(\n\t\t(s): MentionItem => ({\n\t\t\tid: s.id,\n\t\t\tlabel: `sub-agent: ${s.name}`,\n\t\t\tmeta: { kind: 'subagent', plainLabel: s.name },\n\t\t}),\n\t),\n];\n\nconst escapeHtml = (raw: string): string =>\n\traw.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nconst escapeAttr = (raw: string): string =>\n\tescapeHtml(raw).replace(/\"/g, '&quot;');\n\n/**\n * The HTML for a single mention chip. Must round-trip through the TipTap mention\n * extension's `parseHTML` (`span[data-type=\"mentionAgent\"]`, reading\n * `data-id`/`data-label`/`data-kind`) — see MentionExtension.ts. `normalizeHtml`\n * is taught to keep `data-type=\"mention…\"` spans so this survives to the parser.\n */\nconst mentionSpanHtml = (id: string, label: string, kind: string): string =>\n\t`<span data-type=\"mentionAgent\" class=\"bik-mention bik-mention--agent\"` +\n\t` data-id=\"${escapeAttr(id)}\" data-label=\"${escapeAttr(label)}\"` +\n\t` data-kind=\"${escapeAttr(kind)}\">${escapeHtml(label)}</span>`;\n\n/**\n * Public: HTML for one mention chip, for inserting at the cursor (e.g. when a\n * tool / sub-agent is added from the Step-3 side panel). Round-trips through the\n * same parser path as the rehydrated chips.\n */\nexport const buildMentionHtml = (\n\tid: string,\n\tlabel: string,\n\tkind: 'tool' | 'subagent',\n): string => mentionSpanHtml(id, label, kind);\n\n/** `{{tool:KEY}}` / `{{subagent:ID}}` → the mention item that produced them. */\nconst buildTokenLookup = (\n\tmentionItems: MentionItem[],\n): Map<string, MentionItem> => {\n\tconst byToken = new Map<string, MentionItem>();\n\tfor (const item of mentionItems) {\n\t\tconst meta = item.meta as unknown as MentionKindMeta | undefined;\n\t\tif (meta?.kind === 'tool' && meta.functionKey) {\n\t\t\tbyToken.set(`tool:${meta.functionKey}`, item);\n\t\t} else if (meta?.kind === 'subagent') {\n\t\t\tbyToken.set(`subagent:${String(item.id)}`, item);\n\t\t}\n\t}\n\treturn byToken;\n};\n\n// Matches the reference tokens we render as chips. Other `{{var}}` tokens fall\n// through untouched (left as literal text for the variable decoration).\nconst REFERENCE_TOKEN = /\\{\\{(tool:[^}]+|subagent:[^}]+)\\}\\}/g;\n\n/** Escape plain text, swapping recognised reference tokens for mention spans. */\nconst inlineToHtml = (\n\tsegment: string,\n\tbyToken: Map<string, MentionItem>,\n): string => {\n\tlet out = '';\n\tlet lastIndex = 0;\n\tREFERENCE_TOKEN.lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\twhile ((match = REFERENCE_TOKEN.exec(segment)) !== null) {\n\t\tout += escapeHtml(segment.slice(lastIndex, match.index));\n\t\tconst item = byToken.get(match[1]);\n\t\tif (item) {\n\t\t\tconst kind = (item.meta as unknown as MentionKindMeta).kind;\n\t\t\tout += mentionSpanHtml(String(item.id), item.label, kind);\n\t\t} else {\n\t\t\t// Tool/sub-agent no longer in the available list → keep the raw token.\n\t\t\tout += escapeHtml(match[0]);\n\t\t}\n\t\tlastIndex = REFERENCE_TOKEN.lastIndex;\n\t}\n\tout += escapeHtml(segment.slice(lastIndex));\n\treturn out.replace(/\\n/g, '<br>');\n};\n\n/**\n * Convert the stored instructions string into HTML for `BikEditor.initialContent`.\n * `{{tool:KEY}}` / `{{subagent:ID}}` tokens are rehydrated into mention chips\n * (resolved via `mentionItems`); any other `{{…}}` token is left as literal text\n * for the editor's variable decoration. Newlines become paragraph / line breaks.\n */\nexport const instructionsToEditorHtml = (\n\ttext: string,\n\tmentionItems: MentionItem[] = [],\n): string => {\n\tif (!text) {\n\t\treturn '';\n\t}\n\tconst byToken = buildTokenLookup(mentionItems);\n\treturn text\n\t\t.split(/\\n{2,}/)\n\t\t.map((para) => `<p>${inlineToHtml(para, byToken)}</p>`)\n\t\t.join('');\n};\n\ninterface ProseMirrorNode {\n\ttype: string;\n\ttext?: string;\n\tattrs?: Record<string, unknown>;\n\tcontent?: ProseMirrorNode[];\n}\n\n/** Map of mention node id → token, derived from the available tools. */\nconst resolveMentionToken = (\n\tid: string,\n\ttoolKeyById: Record<string, string>,\n): string => {\n\tconst functionKey = toolKeyById[id];\n\tif (functionKey) {\n\t\treturn `{{tool:${functionKey}}}`;\n\t}\n\treturn `{{subagent:${id}}}`;\n};\n\nconst nodeToText = (\n\tnode: ProseMirrorNode,\n\ttoolKeyById: Record<string, string>,\n): string => {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn node.text ?? '';\n\t\tcase 'mentionAgent':\n\t\tcase 'mentionTeam': {\n\t\t\tconst id = node.attrs?.['id'];\n\t\t\treturn id == null ? '' : resolveMentionToken(String(id), toolKeyById);\n\t\t}\n\t\tcase 'variable':\n\t\t\treturn `{{${String(node.attrs?.['variableName'] ?? '')}}}`;\n\t\tcase 'hardBreak':\n\t\t\treturn '\\n';\n\t\tdefault: {\n\t\t\tconst inner = (node.content ?? [])\n\t\t\t\t.map((child) => nodeToText(child, toolKeyById))\n\t\t\t\t.join('');\n\t\t\t// Block nodes terminate with a newline so paragraphs stay separated.\n\t\t\tconst BLOCK_NODES = ['paragraph', 'heading', 'listItem', 'blockquote'];\n\t\t\treturn BLOCK_NODES.includes(node.type) ? `${inner}\\n` : inner;\n\t\t}\n\t}\n};\n\n/**\n * Convert a BikEditor document (from `ref.getJSON()`) into the firebase\n * instructions string, replacing mention nodes with `{{subagent:ID}}` /\n * `{{tool:KEY}}` tokens.\n */\nexport const editorDocToInstructions = (\n\tdoc: Record<string, unknown> | null,\n\ttools: AgentTool[],\n): string => {\n\tif (!doc) {\n\t\treturn '';\n\t}\n\tconst toolKeyById = tools.reduce<Record<string, string>>((acc, t) => {\n\t\tacc[t.tool_id] = t.function_key;\n\t\treturn acc;\n\t}, {});\n\treturn nodeToText(doc as unknown as ProseMirrorNode, toolKeyById).replace(\n\t\t/\\n+$/,\n\t\t'',\n\t);\n};\n"],"names":["TOOL_SOURCE_LABELS","toolSourceLabel","source","fallback","appTypeLabel","applicationType","key","buildAgentMentionItems","tools","subAgents","appLabel","t","s","escapeHtml","raw","escapeAttr","mentionSpanHtml","id","label","kind","buildMentionHtml","buildTokenLookup","mentionItems","byToken","item","meta","REFERENCE_TOKEN","inlineToHtml","segment","out","lastIndex","match","instructionsToEditorHtml","text","para","resolveMentionToken","toolKeyById","functionKey","nodeToText","node","inner","child","editorDocToInstructions","doc","acc"],"mappings":"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"}
1
+ {"version":3,"file":"mentionSerialization.js","sources":["../../../../../src/components/agent-builder/utils/mentionSerialization.ts"],"sourcesContent":["import type { ApplicationType } from '@bikdotai/bik-models/growth';\nimport { MentionItem } from '@src/editor';\nimport { AgentTool, SubAgentRef } from '../AgentBuilder.model';\n\n/**\n * Serialization helpers between the BikEditor document and the firebase\n * `instructions` string.\n *\n * Firebase stores `instructions` as PLAIN TEXT with inline reference tokens:\n * - `{{subagent:<agentId>}}` — hand-off to another agent\n * - `{{tool:<function_key>}}` — an action the agent can call\n * - `{{<variableName>}}` — a template variable\n *\n * In the editor those references are inserted via the `@` mention menu (which we\n * populate with BOTH tools and sub-agents). Mention nodes keep their `id` in the\n * ProseMirror doc JSON (the rendered HTML drops it), so we serialize from the doc\n * JSON — not from HTML.\n */\n\nexport interface MentionKindMeta {\n\t/** Distinguishes a tool reference from a sub-agent reference. */\n\tkind: 'tool' | 'subagent';\n\t/** For tools: the function_key used in the `{{tool:KEY}}` token. */\n\tfunctionKey?: string;\n\t/** Plain item name (no prefix) shown in the picker dropdown rows. */\n\tplainLabel?: string;\n\t/** For tools: the source bucket (manifest / shopify / …) the picker groups by. */\n\tsource?: string;\n}\n\n/** Display labels for the known tool sources (drives picker headers + chip prefix). */\nexport const TOOL_SOURCE_LABELS: Record<string, string> = {\n\tmanifest: 'Manifest',\n\tshopify: 'Shopify',\n\tintegration: 'Integration',\n};\n\n/** Human label for a tool source; falls back to the host-app label, then the raw key. */\nexport const toolSourceLabel = (\n\tsource: string | undefined,\n\tfallback = 'Manifest',\n): string => {\n\tif (!source) {\n\t\treturn fallback;\n\t}\n\treturn TOOL_SOURCE_LABELS[source] ?? source;\n};\n\n/** Human label for the host application, used as the tool-chip prefix. */\nexport const appTypeLabel = (applicationType?: ApplicationType): string => {\n\tconst key = applicationType ? String(applicationType) : '';\n\tif (key === 'BIK') {\n\t\treturn 'BIK';\n\t}\n\tif (key === 'BSP') {\n\t\treturn 'BSP';\n\t}\n\treturn 'Manifest';\n};\n\n/**\n * Build the combined `@` mention list from the available tools + sub-agents.\n *\n * The `label` is the CHIP text shown once inserted — tools read\n * `\"<App> : <tool name>\"` (e.g. \"Manifest : Look up order\"), sub-agents read\n * `\"sub-agent: <name>\"`. `meta.plainLabel` is the un-prefixed name for the\n * picker rows, and `meta.kind` drives the `{{tool}}` / `{{subagent}}` colour.\n */\nexport const buildAgentMentionItems = (\n\ttools: AgentTool[],\n\tsubAgents: SubAgentRef[],\n\tappLabel = 'Manifest',\n): MentionItem[] => [\n\t...tools.map(\n\t\t(t): MentionItem => ({\n\t\t\tid: t.tool_id,\n\t\t\tlabel: `${toolSourceLabel(t.source, appLabel)} : ${t.display_name}`,\n\t\t\tmeta: {\n\t\t\t\tkind: 'tool',\n\t\t\t\tfunctionKey: t.function_key,\n\t\t\t\tplainLabel: t.display_name,\n\t\t\t\tsource: t.source,\n\t\t\t},\n\t\t}),\n\t),\n\t...subAgents.map(\n\t\t(s): MentionItem => ({\n\t\t\tid: s.id,\n\t\t\tlabel: `sub-agent: ${s.name}`,\n\t\t\tmeta: { kind: 'subagent', plainLabel: s.name },\n\t\t}),\n\t),\n];\n\nconst escapeHtml = (raw: string): string =>\n\traw.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nconst escapeAttr = (raw: string): string =>\n\tescapeHtml(raw).replace(/\"/g, '&quot;');\n\n/**\n * The HTML for a single mention chip. Must round-trip through the TipTap mention\n * extension's `parseHTML` (`span[data-type=\"mentionAgent\"]`, reading\n * `data-id`/`data-label`/`data-kind`) — see MentionExtension.ts. `normalizeHtml`\n * is taught to keep `data-type=\"mention…\"` spans so this survives to the parser.\n */\nconst mentionSpanHtml = (id: string, label: string, kind: string): string =>\n\t`<span data-type=\"mentionAgent\" class=\"bik-mention bik-mention--agent\"` +\n\t` data-id=\"${escapeAttr(id)}\" data-label=\"${escapeAttr(label)}\"` +\n\t` data-kind=\"${escapeAttr(kind)}\">${escapeHtml(label)}</span>`;\n\n/**\n * Public: HTML for one mention chip, for inserting at the cursor (e.g. when a\n * tool / sub-agent is added from the Step-3 side panel). Round-trips through the\n * same parser path as the rehydrated chips.\n */\nexport const buildMentionHtml = (\n\tid: string,\n\tlabel: string,\n\tkind: 'tool' | 'subagent',\n): string => mentionSpanHtml(id, label, kind);\n\n/** `{{tool:KEY}}` / `{{subagent:ID}}` → the mention item that produced them. */\nconst buildTokenLookup = (\n\tmentionItems: MentionItem[],\n): Map<string, MentionItem> => {\n\tconst byToken = new Map<string, MentionItem>();\n\tfor (const item of mentionItems) {\n\t\tconst meta = item.meta as unknown as MentionKindMeta | undefined;\n\t\tif (meta?.kind === 'tool' && meta.functionKey) {\n\t\t\tbyToken.set(`tool:${meta.functionKey}`, item);\n\t\t} else if (meta?.kind === 'subagent') {\n\t\t\tbyToken.set(`subagent:${String(item.id)}`, item);\n\t\t}\n\t}\n\treturn byToken;\n};\n\n// Matches the reference tokens we render as chips. Other `{{var}}` tokens fall\n// through untouched (left as literal text for the variable decoration).\nconst REFERENCE_TOKEN = /\\{\\{(tool:[^}]+|subagent:[^}]+)\\}\\}/g;\n\n/** Escape plain text, swapping recognised reference tokens for mention spans. */\nconst inlineToHtml = (\n\tsegment: string,\n\tbyToken: Map<string, MentionItem>,\n): string => {\n\tlet out = '';\n\tlet lastIndex = 0;\n\tREFERENCE_TOKEN.lastIndex = 0;\n\tlet match: RegExpExecArray | null;\n\twhile ((match = REFERENCE_TOKEN.exec(segment)) !== null) {\n\t\tout += escapeHtml(segment.slice(lastIndex, match.index));\n\t\tconst item = byToken.get(match[1]);\n\t\tif (item) {\n\t\t\tconst kind = (item.meta as unknown as MentionKindMeta).kind;\n\t\t\tout += mentionSpanHtml(String(item.id), item.label, kind);\n\t\t} else {\n\t\t\t// Tool/sub-agent no longer in the available list → keep the raw token.\n\t\t\tout += escapeHtml(match[0]);\n\t\t}\n\t\tlastIndex = REFERENCE_TOKEN.lastIndex;\n\t}\n\tout += escapeHtml(segment.slice(lastIndex));\n\treturn out.replace(/\\n/g, '<br>');\n};\n\n/**\n * Convert the stored instructions string into HTML for `BikEditor.initialContent`.\n * `{{tool:KEY}}` / `{{subagent:ID}}` tokens are rehydrated into mention chips\n * (resolved via `mentionItems`); any other `{{…}}` token is left as literal text\n * for the editor's variable decoration. Newlines become paragraph / line breaks.\n */\nexport const instructionsToEditorHtml = (\n\ttext: string,\n\tmentionItems: MentionItem[] = [],\n): string => {\n\tif (!text) {\n\t\treturn '';\n\t}\n\tconst byToken = buildTokenLookup(mentionItems);\n\treturn text\n\t\t.split(/\\n{2,}/)\n\t\t.map((para) => `<p>${inlineToHtml(para, byToken)}</p>`)\n\t\t.join('');\n};\n\ninterface ProseMirrorNode {\n\ttype: string;\n\ttext?: string;\n\tattrs?: Record<string, unknown>;\n\tcontent?: ProseMirrorNode[];\n}\n\n/** Map of mention node id → token, derived from the available tools. */\nconst resolveMentionToken = (\n\tid: string,\n\ttoolKeyById: Record<string, string>,\n): string => {\n\tconst functionKey = toolKeyById[id];\n\tif (functionKey) {\n\t\treturn `{{tool:${functionKey}}}`;\n\t}\n\treturn `{{subagent:${id}}}`;\n};\n\nconst nodeToText = (\n\tnode: ProseMirrorNode,\n\ttoolKeyById: Record<string, string>,\n): string => {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn node.text ?? '';\n\t\tcase 'mentionAgent':\n\t\tcase 'mentionTeam': {\n\t\t\tconst id = node.attrs?.['id'];\n\t\t\treturn id == null ? '' : resolveMentionToken(String(id), toolKeyById);\n\t\t}\n\t\tcase 'variable':\n\t\t\treturn `{{${String(node.attrs?.['variableName'] ?? '')}}}`;\n\t\tcase 'hardBreak':\n\t\t\treturn '\\n';\n\t\tdefault: {\n\t\t\tconst inner = (node.content ?? [])\n\t\t\t\t.map((child) => nodeToText(child, toolKeyById))\n\t\t\t\t.join('');\n\t\t\t// Block nodes terminate with a newline so paragraphs stay separated.\n\t\t\tconst BLOCK_NODES = ['paragraph', 'heading', 'listItem', 'blockquote'];\n\t\t\treturn BLOCK_NODES.includes(node.type) ? `${inner}\\n` : inner;\n\t\t}\n\t}\n};\n\n/**\n * Convert a BikEditor document (from `ref.getJSON()`) into the firebase\n * instructions string, replacing mention nodes with `{{subagent:ID}}` /\n * `{{tool:KEY}}` tokens.\n */\nexport const editorDocToInstructions = (\n\tdoc: Record<string, unknown> | null,\n\ttools: AgentTool[],\n): string => {\n\tif (!doc) {\n\t\treturn '';\n\t}\n\tconst toolKeyById = tools.reduce<Record<string, string>>((acc, t) => {\n\t\tacc[t.tool_id] = t.function_key;\n\t\treturn acc;\n\t}, {});\n\treturn nodeToText(doc as unknown as ProseMirrorNode, toolKeyById).replace(\n\t\t/\\n+$/,\n\t\t'',\n\t);\n};\n"],"names":["TOOL_SOURCE_LABELS","toolSourceLabel","source","fallback","appTypeLabel","applicationType","key","buildAgentMentionItems","tools","subAgents","appLabel","t","s","escapeHtml","raw","escapeAttr","mentionSpanHtml","id","label","kind","buildMentionHtml","buildTokenLookup","mentionItems","byToken","item","meta","REFERENCE_TOKEN","inlineToHtml","segment","out","lastIndex","match","instructionsToEditorHtml","text","para","resolveMentionToken","toolKeyById","functionKey","nodeToText","node","inner","child","editorDocToInstructions","doc","acc"],"mappings":"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"}
@@ -16,7 +16,7 @@ export type AgentTool = AgentToolDoc;
16
16
  export type AgentTriggerValue = Trigger;
17
17
  /**
18
18
  * The data captured by the "Create sub-agent" drawer. The consumer persists it
19
- * (as an `isEntry: false` agent) and returns the created {@link SubAgentRef}.
19
+ * (as an `is_entry: false` agent) and returns the created {@link SubAgentRef}.
20
20
  */
21
21
  export interface SubAgentDraft {
22
22
  name: string;