@bikdotai/bik-component-library 0.0.831-beta.3 → 0.0.831-beta.4

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.
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),o=require("react"),_e=require("styled-components"),re=require("../../../utils/arrayUtils.js"),H=require("../../../constants/Theme.js"),Ee=require("../constants/charLimits.js"),p=require("../constants/tools.js"),m=require("../utils/mentionSerialization.js"),f=require("../utils/sourceIcons.js"),Oe=require("../utils/toolActions.js"),Me=require("./ConfigToolPanel.js"),F=require("./DrawerHeaderText.js"),ie=require("./MentionEditor.js"),qe=require("./RestApiToolPanel.js"),je=require("./SelectableListSection.js"),we=require("../../side-modal/SideModal.js"),Le=require("../../input/Input.js"),De=require("../../toaster/Toaster.js"),Ke=c=>c&&typeof c=="object"&&"default"in c?c:{default:c},Ne=Ke(_e),Pe=1e3,W=1002,ae=(c,S)=>{const i=c??[];return i.some(u=>u.id===S.id)?i.map(u=>u.id===S.id?S:u):[...i,S]},le=Ne.default.button`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),o=require("react"),Ee=require("styled-components"),ie=require("../../../utils/arrayUtils.js"),H=require("../../../constants/Theme.js"),Oe=require("../constants/charLimits.js"),g=require("../constants/tools.js"),m=require("../utils/mentionSerialization.js"),f=require("../utils/sourceIcons.js"),Me=require("../utils/toolActions.js"),qe=require("./ConfigToolPanel.js"),F=require("./DrawerHeaderText.js"),ae=require("./MentionEditor.js"),je=require("./RestApiToolPanel.js"),we=require("./SelectableListSection.js"),Le=require("../../side-modal/SideModal.js"),De=require("../../input/Input.js"),Ke=require("../../toaster/Toaster.js"),Ne=c=>c&&typeof c=="object"&&"default"in c?c:{default:c},Pe=Ne(Ee),Ge=1e3,W=1002,le=(c,S)=>{const i=c??[];return i.some(u=>u.id===S.id)?i.map(u=>u.id===S.id?S:u):[...i,S]},ce=Pe.default.button`
2
2
  align-self: flex-start;
3
3
  border: 1px solid ${H.COLORS.stroke.primary};
4
4
  color: ${H.COLORS.content.primary};
@@ -14,5 +14,5 @@
14
14
  cursor: default;
15
15
  opacity: 0.6;
16
16
  }
17
- `,Ge=({onClose:c,onSave:S,availableTools:i,onImprove:u,onImproveToolInstructions:$,configToolTemplates:Y,title:X="Create sub-agent",initial:b,appLabel:Z="Manifest",charLimits:C=Ee.AGENT_CHAR_LIMITS})=>{const[O,ce]=o.useState(b?.name??""),[T,A]=o.useState(b?.instructions??""),[h,v]=o.useState(b?.guardrail??""),[M,k]=o.useState(b?.tools??[]),[g,q]=o.useState(b?.configTools??[]),[d,j]=o.useState(b?.restApiTools??[]),[a,y]=o.useState(null),_=o.useRef(0),[J,Q]=o.useState(!1),[ue,w]=o.useState(0),[de,L]=o.useState(0),[I,V]=o.useState(null),D=o.useMemo(()=>[...m.buildAgentMentionItems(i,[],Z),...m.buildCustomToolMentionItems(g,d)],[i,Z,g,d]),E=o.useRef({}),K=o.useRef("instructions"),pe=o.useCallback(e=>{E.current.instructions=e??void 0},[]),ge=o.useCallback(e=>{E.current.guardrail=e??void 0},[]),me=o.useCallback(()=>{K.current="instructions"},[]),fe=o.useCallback(()=>{K.current="guardrail"},[]),ee=o.useCallback((e,t)=>{e==="tool"&&k(n=>re.addUnique(n,t))},[]),x=o.useCallback((e,t)=>{(E.current[K.current]??E.current.instructions)?.("tool",e,t)},[]),N=o.useCallback(e=>{_.current+=1,y({key:_.current,kind:"restapi",initialRest:e})},[]),P=o.useCallback((e,t)=>{_.current+=1,y({key:_.current,kind:"config",toolKey:e,initialConfig:t})},[]),Se=o.useCallback(e=>{const t=p.CONFIG_TOOL_SOURCES[e];t?P(t):N()},[P,N]),be=o.useCallback(e=>{const t=!d.some(n=>n.id===e.id);j(n=>ae(n,e)),t&&x(e.id,m.restApiMentionItem(e).label),y(null)},[d,x]),ye=o.useCallback(e=>{const t=!g.some(n=>n.id===e.id);q(n=>ae(n,e)),t&&x(e.id,m.configToolMentionItem(e).label),y(null)},[g,x]),[G,B]=o.useState(null),U=o.useRef(null),te=o.useRef(0),Ce=e=>{const t=i.find(s=>s.tool_id===e)?.display_name??d.find(s=>s.id===e)?.name??"Tool",n=`{{tool:${e}}}`,l=s=>s.split(n).join("");U.current={instructions:T,guardrail:h,tools:M,configTools:g,restApiTools:d},A(s=>l(s)),v(s=>l(s)),k(s=>s.filter(R=>R!==e)),q(s=>s.filter(R=>R.id!==e)),j(s=>s.filter(R=>R.id!==e)),w(s=>s+1),L(s=>s+1),te.current+=1,B({id:te.current,message:`Tool "${t}" removed`})},Te=()=>{const e=U.current;e&&(A(e.instructions),v(e.guardrail),k(e.tools),q(e.configTools),j(e.restApiTools),w(t=>t+1),L(t=>t+1),U.current=null),B(null)},oe=O.trim().length>0&&(T.trim().length>0||h.trim().length>0),he=M.map(e=>{const t=i.find(n=>n.tool_id===e);return t?{id:e,label:t.display_name,icon:f.sourceIcon(t.source??p.ToolSource.Manifest)}:null}).filter(e=>e!==null),Ie=d.map(e=>({id:e.id,label:m.restApiToolName(e),icon:f.SOURCE_ICONS[p.ToolSource.RestApi],onConfigure:()=>N(e)})),xe=g.map(e=>({id:e.id,label:m.configToolName(e),icon:f.SOURCE_ICONS[e.tool_key==="send_slack_message"?p.ToolSource.Slack:p.ToolSource.EmailHandover],onConfigure:()=>P(e.tool_key,e)})),Re=[...he,...Ie,...xe],z=Oe.buildToolActions(Y,Se),ne=a?.kind==="config"&&a.toolKey?Y?.[a.toolKey]:void 0,Ae=i.map(e=>({label:e.display_name,value:e.tool_id,leadingIcon:f.renderSourceIcon(f.sourceIcon(e.source??p.ToolSource.Manifest))??void 0})),ve=(()=>{const e=[],t=new Map;return i.forEach(n=>{const l=n.source??p.ToolSource.Manifest;t.has(l)||(t.set(l,[]),e.push(l)),t.get(l)?.push({label:n.display_name,value:n.tool_id,leadingIcon:f.renderSourceIcon(f.sourceIcon(n.source??p.ToolSource.Manifest))??void 0})}),e.map(n=>({source:n,label:m.toolSourceLabel(n),options:t.get(n)??[]}))})(),ke=async()=>{if(!oe||J)return;const e=S({name:O.trim(),instructions:T,guardrail:h,tools:M,configTools:g,restApiTools:d});if(e&&typeof e.then=="function"){Q(!0);try{await e}finally{Q(!1)}}},se=async e=>{if(!(!u||I)){V(e);try{const n=await u(e,e==="instructions"?T:h);e==="instructions"?(A(n),w(l=>l+1)):(v(n),L(l=>l+1))}finally{V(null)}}};return r.jsxs(r.Fragment,{children:[r.jsxs(we.SideModal,{header:X,closeOnEscapeKey:!1,zIndex:Pe,headerCustomComponent:r.jsx(F.DrawerHeaderText,{title:X,subtitle:"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."}),width:"421px",headerStyle:F.DRAWER_HEADER_STYLE,bodyStyle:F.DRAWER_BODY_STYLE,onClose:c,saveButtonProps:{"data-test":"subagent-save",buttonText:"Save",buttonType:"primary",size:"small",disabled:!oe,isLoading:J,onClick:ke},cancelButtonProps:{"data-test":"subagent-cancel",buttonText:"Cancel",buttonType:"tertiaryGray",size:"small",onClick:c},children:[r.jsx(Le.Input,{"data-test":"subagent-name",labelText:"Agent name",labelTextBold:!0,placeholder:"Enter agent name",value:O,maxCharLimit:C.name,maxCharLimitPosition:"TOP",maxCharStyle:{fontSize:12,lineHeight:"16px"},onChangeText:ce}),r.jsx(ie.MentionEditor,{"data-test":"subagent-instructions",label:"Instructions",value:T,onChange:A,maxLength:C.instructions,placeholder:"Write the steps in plain English. Type @ to reference a tool.",minHeight:"160px",resetKey:`instr-${ue}`,mentionItems:D,tools:i,toolActions:z,onMentionSelect:ee,onFocus:me,registerInsert:pe,action:u?r.jsx(le,{type:"button","data-test":"subagent-improve-instructions",disabled:I!==null,onClick:()=>se("instructions"),children:I==="instructions"?"Improving…":"Improve with AI"}):void 0}),r.jsx(ie.MentionEditor,{"data-test":"subagent-guardrail",label:"Guardrails",value:h,onChange:v,maxLength:C.guardrail,placeholder:"e.g. Never discuss competitor pricing. Type @ to reference a tool.",minHeight:"160px",resetKey:`guard-${de}`,mentionItems:D,tools:i,toolActions:z,onMentionSelect:ee,onFocus:fe,registerInsert:ge,action:u?r.jsx(le,{type:"button","data-test":"subagent-improve-guardrail",disabled:I!==null,onClick:()=>se("guardrail"),children:I==="guardrail"?"Improving…":"Improve with AI"}):void 0}),r.jsx(je.SelectableListSection,{title:"Tools this agent can use",dataTestPrefix:"subagent-tools",items:Re,addableOptions:Ae,sourceGroups:ve,mentionItems:D,actionSources:z,emptyText:"No tools added yet.",onAdd:e=>{x(e),k(t=>re.addUnique(t,e))},onRemove:Ce,confirmDelete:{noun:"tool",zIndex:W+1}})]}),a?.kind==="restapi"&&r.jsx(qe.RestApiToolPanel,{initial:a.initialRest,charLimits:C,onImprove:$,onClose:()=>y(null),onSave:be,zIndex:W},a.key),a?.kind==="config"&&a.toolKey&&ne&&r.jsx(Me.ConfigToolPanel,{toolKey:a.toolKey,template:ne,initial:a.initialConfig,charLimits:C,onImprove:$,onClose:()=>y(null),onSave:ye,zIndex:W},a.key),G&&r.jsx(De.Toaster,{text:G.message,type:"info",position:"top-right",autoClose:5e3,hideCloseButton:!0,buttonProps:{buttonText:"Undo",showButton:!0,onButtonClick:()=>(Te(),{})},onCloseToast:()=>B(null)},G.id)]})};exports.CreateSubAgentPanel=Ge;
17
+ `,Be=({onClose:c,onSave:S,availableTools:i,onImprove:u,onImproveToolInstructions:$,configToolTemplates:Y,title:X="Create sub-agent",initial:b,appLabel:Z="Manifest",charLimits:T=Oe.AGENT_CHAR_LIMITS})=>{const[O,ue]=o.useState(b?.name??""),[C,A]=o.useState(b?.instructions??""),[h,v]=o.useState(b?.guardrail??""),[M,k]=o.useState(b?.tools??[]),[p,q]=o.useState(b?.configTools??[]),[d,j]=o.useState(b?.restApiTools??[]),[a,y]=o.useState(null),_=o.useRef(0),[J,Q]=o.useState(!1),[de,w]=o.useState(0),[pe,L]=o.useState(0),[I,V]=o.useState(null),D=o.useMemo(()=>[...m.buildAgentMentionItems(i,[],Z),...m.buildCustomToolMentionItems(p,d)],[i,Z,p,d]),E=o.useRef({}),K=o.useRef("instructions"),ge=o.useCallback(e=>{E.current.instructions=e??void 0},[]),me=o.useCallback(e=>{E.current.guardrail=e??void 0},[]),fe=o.useCallback(()=>{K.current="instructions"},[]),Se=o.useCallback(()=>{K.current="guardrail"},[]),ee=o.useRef(new Set);ee.current=new Set([...p,...d].map(e=>e.id));const te=o.useCallback((e,t)=>{e==="tool"&&!ee.current.has(t)&&k(n=>ie.addUnique(n,t))},[]),x=o.useCallback((e,t)=>{(E.current[K.current]??E.current.instructions)?.("tool",e,t)},[]),N=o.useCallback(e=>{_.current+=1,y({key:_.current,kind:"restapi",initialRest:e})},[]),P=o.useCallback((e,t)=>{_.current+=1,y({key:_.current,kind:"config",toolKey:e,initialConfig:t})},[]),be=o.useCallback(e=>{const t=g.CONFIG_TOOL_SOURCES[e];t?P(t):N()},[P,N]),ye=o.useCallback(e=>{const t=!d.some(n=>n.id===e.id);j(n=>le(n,e)),t&&x(e.id,m.restApiMentionItem(e).label),y(null)},[d,x]),Te=o.useCallback(e=>{const t=!p.some(n=>n.id===e.id);q(n=>le(n,e)),t&&x(e.id,m.configToolMentionItem(e).label),y(null)},[p,x]),[G,B]=o.useState(null),U=o.useRef(null),oe=o.useRef(0),Ce=e=>{const t=i.find(s=>s.tool_id===e)?.display_name??d.find(s=>s.id===e)?.name??"Tool",n=`{{tool:${e}}}`,l=s=>s.split(n).join("");U.current={instructions:C,guardrail:h,tools:M,configTools:p,restApiTools:d},A(s=>l(s)),v(s=>l(s)),k(s=>s.filter(R=>R!==e)),q(s=>s.filter(R=>R.id!==e)),j(s=>s.filter(R=>R.id!==e)),w(s=>s+1),L(s=>s+1),oe.current+=1,B({id:oe.current,message:`Tool "${t}" removed`})},he=()=>{const e=U.current;e&&(A(e.instructions),v(e.guardrail),k(e.tools),q(e.configTools),j(e.restApiTools),w(t=>t+1),L(t=>t+1),U.current=null),B(null)},ne=O.trim().length>0&&(C.trim().length>0||h.trim().length>0),Ie=M.map(e=>{const t=i.find(n=>n.tool_id===e);return t?{id:e,label:t.display_name,icon:f.sourceIcon(t.source??g.ToolSource.Manifest)}:null}).filter(e=>e!==null),xe=d.map(e=>({id:e.id,label:m.restApiToolName(e),icon:f.SOURCE_ICONS[g.ToolSource.RestApi],onConfigure:()=>N(e)})),Re=p.map(e=>({id:e.id,label:m.configToolName(e),icon:f.SOURCE_ICONS[e.tool_key==="send_slack_message"?g.ToolSource.Slack:g.ToolSource.EmailHandover],onConfigure:()=>P(e.tool_key,e)})),Ae=[...Ie,...xe,...Re],z=Me.buildToolActions(Y,be),se=a?.kind==="config"&&a.toolKey?Y?.[a.toolKey]:void 0,ve=i.map(e=>({label:e.display_name,value:e.tool_id,leadingIcon:f.renderSourceIcon(f.sourceIcon(e.source??g.ToolSource.Manifest))??void 0})),ke=(()=>{const e=[],t=new Map;return i.forEach(n=>{const l=n.source??g.ToolSource.Manifest;t.has(l)||(t.set(l,[]),e.push(l)),t.get(l)?.push({label:n.display_name,value:n.tool_id,leadingIcon:f.renderSourceIcon(f.sourceIcon(n.source??g.ToolSource.Manifest))??void 0})}),e.map(n=>({source:n,label:m.toolSourceLabel(n),options:t.get(n)??[]}))})(),_e=async()=>{if(!ne||J)return;const e=S({name:O.trim(),instructions:C,guardrail:h,tools:M,configTools:p,restApiTools:d});if(e&&typeof e.then=="function"){Q(!0);try{await e}finally{Q(!1)}}},re=async e=>{if(!(!u||I)){V(e);try{const n=await u(e,e==="instructions"?C:h);e==="instructions"?(A(n),w(l=>l+1)):(v(n),L(l=>l+1))}finally{V(null)}}};return r.jsxs(r.Fragment,{children:[r.jsxs(Le.SideModal,{header:X,closeOnEscapeKey:!1,zIndex:Ge,headerCustomComponent:r.jsx(F.DrawerHeaderText,{title:X,subtitle:"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them."}),width:"421px",headerStyle:F.DRAWER_HEADER_STYLE,bodyStyle:F.DRAWER_BODY_STYLE,onClose:c,saveButtonProps:{"data-test":"subagent-save",buttonText:"Save",buttonType:"primary",size:"small",disabled:!ne,isLoading:J,onClick:_e},cancelButtonProps:{"data-test":"subagent-cancel",buttonText:"Cancel",buttonType:"tertiaryGray",size:"small",onClick:c},children:[r.jsx(De.Input,{"data-test":"subagent-name",labelText:"Agent name",labelTextBold:!0,placeholder:"Enter agent name",value:O,maxCharLimit:T.name,maxCharLimitPosition:"TOP",maxCharStyle:{fontSize:12,lineHeight:"16px"},onChangeText:ue}),r.jsx(ae.MentionEditor,{"data-test":"subagent-instructions",label:"Instructions",value:C,onChange:A,maxLength:T.instructions,placeholder:"Write the steps in plain English. Type @ to reference a tool.",minHeight:"160px",resetKey:`instr-${de}`,mentionItems:D,tools:i,toolActions:z,onMentionSelect:te,onFocus:fe,registerInsert:ge,action:u?r.jsx(ce,{type:"button","data-test":"subagent-improve-instructions",disabled:I!==null,onClick:()=>re("instructions"),children:I==="instructions"?"Improving…":"Improve with AI"}):void 0}),r.jsx(ae.MentionEditor,{"data-test":"subagent-guardrail",label:"Guardrails",value:h,onChange:v,maxLength:T.guardrail,placeholder:"e.g. Never discuss competitor pricing. Type @ to reference a tool.",minHeight:"160px",resetKey:`guard-${pe}`,mentionItems:D,tools:i,toolActions:z,onMentionSelect:te,onFocus:Se,registerInsert:me,action:u?r.jsx(ce,{type:"button","data-test":"subagent-improve-guardrail",disabled:I!==null,onClick:()=>re("guardrail"),children:I==="guardrail"?"Improving…":"Improve with AI"}):void 0}),r.jsx(we.SelectableListSection,{title:"Tools this agent can use",dataTestPrefix:"subagent-tools",items:Ae,addableOptions:ve,sourceGroups:ke,mentionItems:D,actionSources:z,emptyText:"No tools added yet.",onAdd:e=>{x(e),k(t=>ie.addUnique(t,e))},onRemove:Ce,confirmDelete:{noun:"tool",zIndex:W+1}})]}),a?.kind==="restapi"&&r.jsx(je.RestApiToolPanel,{initial:a.initialRest,charLimits:T,onImprove:$,onClose:()=>y(null),onSave:ye,zIndex:W},a.key),a?.kind==="config"&&a.toolKey&&se&&r.jsx(qe.ConfigToolPanel,{toolKey:a.toolKey,template:se,initial:a.initialConfig,charLimits:T,onImprove:$,onClose:()=>y(null),onSave:Te,zIndex:W},a.key),G&&r.jsx(Ke.Toaster,{text:G.message,type:"info",position:"top-right",autoClose:5e3,hideCloseButton:!0,buttonProps:{buttonText:"Undo",showButton:!0,onButtonClick:()=>(he(),{})},onCloseToast:()=>B(null)},G.id)]})};exports.CreateSubAgentPanel=Be;
18
18
  //# sourceMappingURL=CreateSubAgentPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { SideModal } from '@src/components/side-modal';\nimport { Toaster } from '@src/components/toaster';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAgentTool,\n\tConfigToolConfig,\n\tConfigToolKey,\n\tParamsBlob,\n\tRestApiToolConfig,\n\tSubAgentDraft,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { CONFIG_TOOL_SOURCES, ToolSource } from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport {\n\trenderSourceIcon,\n\tSOURCE_ICONS,\n\tsourceIcon,\n} from '../utils/sourceIcons';\nimport { buildToolActions } from '../utils/toolActions';\nimport { ConfigToolPanel } from './ConfigToolPanel';\nimport {\n\tDRAWER_BODY_STYLE,\n\tDRAWER_HEADER_STYLE,\n\tDrawerHeaderText,\n} from './DrawerHeaderText';\nimport { MentionEditor } from './MentionEditor';\nimport { RestApiToolPanel } from './RestApiToolPanel';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\n/**\n * The sub-agent drawer sits above the main builder; its own tool drawers\n * (Rest API / email / Slack) stack one level higher so they open ON TOP of it\n * rather than behind (SideModal defaults to z-index 10).\n */\nconst SUBAGENT_ZINDEX = 1000;\nconst TOOL_DRAWER_ZINDEX = 1002;\n\n/** Upsert an item by id (replace when present, append otherwise). */\nconst upsertById = <T extends { id: string }>(\n\tlist: T[] | undefined,\n\titem: T,\n): T[] => {\n\tconst arr = list ?? [];\n\treturn arr.some((x) => x.id === item.id)\n\t\t? arr.map((x) => (x.id === item.id ? item : x))\n\t\t: [...arr, item];\n};\n\n/** Config-tool / Rest API drawer state; `key` remounts fresh per open. */\ninterface ToolDrawerState {\n\tkey: number;\n\tkind: 'restapi' | 'config';\n\ttoolKey?: ConfigToolKey;\n\tinitialRest?: RestApiToolConfig;\n\tinitialConfig?: ConfigToolConfig;\n}\n\n/** Inline \"Improve with AI\" action rendered below a mention editor. */\nconst ImproveButton = styled.button`\n\talign-self: flex-start;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tcolor: ${COLORS.content.primary};\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 6px 12px;\n\tfont-size: 13px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: 0.6;\n\t}\n`;\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/** Optional \"Improve with AI\" for the Rest API / config-tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n\t/**\n\t * Backend templates (email / Slack) that drive the shared config-tool drawer.\n\t * Each present key enables its tool action in this drawer; absent → hidden.\n\t * Same prop the main builder gets — sub-agents can add the same tools.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\tonImproveToolInstructions,\n\tconfigToolTemplates,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\t// Inline-configured tools owned by this sub-agent (same drawers as the main\n\t// agent). Local to the drawer; flow to the consumer via the saved draft.\n\tconst [configTools, setConfigTools] = useState<ConfigToolConfig[]>(\n\t\tinitial?.configTools ?? [],\n\t);\n\tconst [restApiTools, setRestApiTools] = useState<RestApiToolConfig[]>(\n\t\tinitial?.restApiTools ?? [],\n\t);\n\tconst [toolDrawer, setToolDrawer] = useState<ToolDrawerState | null>(null);\n\tconst toolDrawerKeyRef = useRef(0);\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), PLUS\n\t// this drawer's inline custom tools so their `{{tool:<id>}}` tokens rehydrate\n\t// as chips on remount (they aren't in `availableTools`).\n\tconst mentionItems = useMemo(\n\t\t() => [\n\t\t\t...buildAgentMentionItems(availableTools, [], appLabel),\n\t\t\t...buildCustomToolMentionItems(configTools, restApiTools),\n\t\t],\n\t\t[availableTools, appLabel, configTools, restApiTools],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tif (kind === 'tool') {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback((id: string, label?: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id, label);\n\t}, []);\n\n\t// Rest API (bespoke) + shared config-tool (email / Slack) drawers, same as the\n\t// main builder's Step 3 — here backed by the drawer's local state.\n\t// ponytail: mirrors Step3HowItResponds; kept local rather than sharing a hook\n\t// because Step3 is context-backed and this drawer is local-state.\n\tconst openRestApi = useCallback((tool?: RestApiToolConfig) => {\n\t\ttoolDrawerKeyRef.current += 1;\n\t\tsetToolDrawer({\n\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\tkind: 'restapi',\n\t\t\tinitialRest: tool,\n\t\t});\n\t}, []);\n\tconst openConfigTool = useCallback(\n\t\t(toolKey: ConfigToolKey, tool?: ConfigToolConfig) => {\n\t\t\ttoolDrawerKeyRef.current += 1;\n\t\t\tsetToolDrawer({\n\t\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\t\tkind: 'config',\n\t\t\t\ttoolKey,\n\t\t\t\tinitialConfig: tool,\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\tconst openToolAction = useCallback(\n\t\t(source: ToolSource) => {\n\t\t\tconst toolKey = CONFIG_TOOL_SOURCES[source];\n\t\t\tif (toolKey) {\n\t\t\t\topenConfigTool(toolKey);\n\t\t\t} else {\n\t\t\t\topenRestApi();\n\t\t\t}\n\t\t},\n\t\t[openConfigTool, openRestApi],\n\t);\n\tconst handleSaveRestApi = useCallback(\n\t\t(tool: RestApiToolConfig) => {\n\t\t\tconst isNew = !restApiTools.some((t) => t.id === tool.id);\n\t\t\tsetRestApiTools((prev) => upsertById(prev, tool));\n\t\t\t// Drop a reference chip at the cursor on creation (edits keep the chip).\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, restApiMentionItem(tool).label);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[restApiTools, insertToolAtCursor],\n\t);\n\tconst handleSaveConfigTool = useCallback(\n\t\t(tool: ConfigToolConfig) => {\n\t\t\tconst isNew = !configTools.some((t) => t.id === tool.id);\n\t\t\tsetConfigTools((prev) => upsertById(prev, tool));\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, configToolMentionItem(tool).label);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[configTools, insertToolAtCursor],\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\tconfigTools: ConfigToolConfig[];\n\t\trestApiTools: RestApiToolConfig[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\t// Remove ANY tool by id: strip its `{{tool:<id>}}` tokens, remount the fields,\n\t// and drop it from whichever list holds it (catalog `tools` or an inline\n\t// custom-tool list). One undo restores all of it.\n\tconst removeTool = (id: string) => {\n\t\tconst label =\n\t\t\tavailableTools.find((t) => t.tool_id === id)?.display_name ??\n\t\t\trestApiTools.find((t) => t.id === id)?.name ??\n\t\t\t'Tool';\n\t\t// The token stores the tool id (a tool's id is its tool_id).\n\t\tconst token = `{{tool:${id}}}`;\n\t\tconst strip = (text: string) => text.split(token).join('');\n\t\tundoSnapshotRef.current = {\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t};\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetConfigTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetRestApiTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({ id: undoIdRef.current, message: `Tool \"${label}\" removed` });\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\tsetConfigTools(snap.configTools);\n\t\t\tsetRestApiTools(snap.restApiTools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst canSave =\n\t\tname.trim().length > 0 &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: sourceIcon(tool.source ?? ToolSource.Manifest),\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Inline-configured tools (Rest API + email / Slack) render as rows in the same\n\t// list, each with its own Configure (edit) action that reopens its drawer.\n\tconst restApiItems: SelectableItem[] = restApiTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: restApiToolName(t),\n\t\ticon: SOURCE_ICONS[ToolSource.RestApi],\n\t\tonConfigure: () => openRestApi(t),\n\t}));\n\tconst configToolItems: SelectableItem[] = configTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: configToolName(t),\n\t\ticon: SOURCE_ICONS[\n\t\t\tt.tool_key === 'send_slack_message'\n\t\t\t\t? ToolSource.Slack\n\t\t\t\t: ToolSource.EmailHandover\n\t\t],\n\t\tonConfigure: () => openConfigTool(t.tool_key, t),\n\t}));\n\tconst allToolItems: SelectableItem[] = [\n\t\t...toolItems,\n\t\t...restApiItems,\n\t\t...configToolItems,\n\t];\n\n\t// Built-in tool actions (Rest API / email / Slack); the shared email / Slack\n\t// forms appear only when their backend template was provided.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\n\t);\n\n\tconst openConfigTemplate =\n\t\ttoolDrawer?.kind === 'config' && toolDrawer.toolKey\n\t\t\t? configToolTemplates?.[toolDrawer.toolKey]\n\t\t\t: undefined;\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\tundefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? ToolSource.Manifest;\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\t\t\tundefined,\n\t\t\t});\n\t\t});\n\t\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\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<SideModal\n\t\t\t\theader={title}\n\t\t\t\tcloseOnEscapeKey={false}\n\t\t\t\tzIndex={SUBAGENT_ZINDEX}\n\t\t\t\theaderCustomComponent={\n\t\t\t\t\t<DrawerHeaderText\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tsubtitle=\"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them.\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\twidth=\"421px\"\n\t\t\t\theaderStyle={DRAWER_HEADER_STYLE}\n\t\t\t\tbodyStyle={DRAWER_BODY_STYLE}\n\t\t\t\tonClose={onClose}\n\t\t\t\tsaveButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-save',\n\t\t\t\t\tbuttonText: 'Save',\n\t\t\t\t\tbuttonType: 'primary',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tdisabled: !canSave,\n\t\t\t\t\tisLoading: saving,\n\t\t\t\t\tonClick: handleSave,\n\t\t\t\t}}\n\t\t\t\tcancelButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-cancel',\n\t\t\t\t\tbuttonText: 'Cancel',\n\t\t\t\t\tbuttonType: 'tertiaryGray',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\tlabelTextBold\n\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\tvalue={name}\n\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\tonChangeText={setName}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\tvalue={instructions}\n\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\tplaceholder=\"Write the steps in plain English. Type @ to reference a tool.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-instructions\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('instructions')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'instructions'\n\t\t\t\t\t\t\t\t\t? 'Improving…'\n\t\t\t\t\t\t\t\t\t: 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Type @ to reference a tool.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-guardrail\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('guardrail')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'guardrail' ? 'Improving…' : 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<SelectableListSection\n\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\titems={allToolItems}\n\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\tconfirmDelete={{ noun: 'tool', zIndex: TOOL_DRAWER_ZINDEX + 1 }}\n\t\t\t\t/>\n\t\t\t</SideModal>\n\n\t\t\t{toolDrawer?.kind === 'restapi' && (\n\t\t\t\t<RestApiToolPanel\n\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\tinitial={toolDrawer.initialRest}\n\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\tonSave={handleSaveRestApi}\n\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{toolDrawer?.kind === 'config' &&\n\t\t\t\ttoolDrawer.toolKey &&\n\t\t\t\topenConfigTemplate && (\n\t\t\t\t\t<ConfigToolPanel\n\t\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\t\ttoolKey={toolDrawer.toolKey}\n\t\t\t\t\t\ttemplate={openConfigTemplate}\n\t\t\t\t\t\tinitial={toolDrawer.initialConfig}\n\t\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\t\tonSave={handleSaveConfigTool}\n\t\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t\t/>\n\t\t\t\t)}\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":["SUBAGENT_ZINDEX","TOOL_DRAWER_ZINDEX","upsertById","list","item","arr","x","ImproveButton","styled","COLORS","CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","onImproveToolInstructions","configToolTemplates","title","initial","appLabel","charLimits","AGENT_CHAR_LIMITS","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","configTools","setConfigTools","restApiTools","setRestApiTools","toolDrawer","setToolDrawer","toolDrawerKeyRef","useRef","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","buildCustomToolMentionItems","insertersRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","openRestApi","tool","openConfigTool","toolKey","openToolAction","source","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","t","restApiMentionItem","handleSaveConfigTool","configToolMentionItem","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","canSave","toolItems","sourceIcon","ToolSource","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","handleSave","result","handleImprove","improved","jsxs","Fragment","SideModal","jsx","DrawerHeaderText","DRAWER_HEADER_STYLE","DRAWER_BODY_STYLE","Input","MentionEditor","SelectableListSection","RestApiToolPanel","ConfigToolPanel","Toaster"],"mappings":"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"}
1
+ {"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { SideModal } from '@src/components/side-modal';\nimport { Toaster } from '@src/components/toaster';\nimport { addUnique } from '@src/utils/arrayUtils';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAgentTool,\n\tConfigToolConfig,\n\tConfigToolKey,\n\tParamsBlob,\n\tRestApiToolConfig,\n\tSubAgentDraft,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { CONFIG_TOOL_SOURCES, ToolSource } from '../constants/tools';\nimport {\n\tbuildAgentMentionItems,\n\tbuildCustomToolMentionItems,\n\tconfigToolMentionItem,\n\tconfigToolName,\n\trestApiMentionItem,\n\trestApiToolName,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\nimport {\n\trenderSourceIcon,\n\tSOURCE_ICONS,\n\tsourceIcon,\n} from '../utils/sourceIcons';\nimport { buildToolActions } from '../utils/toolActions';\nimport { ConfigToolPanel } from './ConfigToolPanel';\nimport {\n\tDRAWER_BODY_STYLE,\n\tDRAWER_HEADER_STYLE,\n\tDrawerHeaderText,\n} from './DrawerHeaderText';\nimport { MentionEditor } from './MentionEditor';\nimport { RestApiToolPanel } from './RestApiToolPanel';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n\tSourceGroup,\n} from './SelectableListSection';\n\n/**\n * The sub-agent drawer sits above the main builder; its own tool drawers\n * (Rest API / email / Slack) stack one level higher so they open ON TOP of it\n * rather than behind (SideModal defaults to z-index 10).\n */\nconst SUBAGENT_ZINDEX = 1000;\nconst TOOL_DRAWER_ZINDEX = 1002;\n\n/** Upsert an item by id (replace when present, append otherwise). */\nconst upsertById = <T extends { id: string }>(\n\tlist: T[] | undefined,\n\titem: T,\n): T[] => {\n\tconst arr = list ?? [];\n\treturn arr.some((x) => x.id === item.id)\n\t\t? arr.map((x) => (x.id === item.id ? item : x))\n\t\t: [...arr, item];\n};\n\n/** Config-tool / Rest API drawer state; `key` remounts fresh per open. */\ninterface ToolDrawerState {\n\tkey: number;\n\tkind: 'restapi' | 'config';\n\ttoolKey?: ConfigToolKey;\n\tinitialRest?: RestApiToolConfig;\n\tinitialConfig?: ConfigToolConfig;\n}\n\n/** Inline \"Improve with AI\" action rendered below a mention editor. */\nconst ImproveButton = styled.button`\n\talign-self: flex-start;\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tcolor: ${COLORS.content.primary};\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 6px 12px;\n\tfont-size: 13px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: 0.6;\n\t}\n`;\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/** Optional \"Improve with AI\" for the Rest API / config-tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n\t/**\n\t * Backend templates (email / Slack) that drive the shared config-tool drawer.\n\t * Each present key enables its tool action in this drawer; absent → hidden.\n\t * Same prop the main builder gets — sub-agents can add the same tools.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n\t/** Resolved character limits (defaults to {@link AGENT_CHAR_LIMITS}). */\n\tcharLimits?: AgentCharLimits;\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\tonImproveToolInstructions,\n\tconfigToolTemplates,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\tappLabel = 'Manifest',\n\tcharLimits = AGENT_CHAR_LIMITS,\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\t// Inline-configured tools owned by this sub-agent (same drawers as the main\n\t// agent). Local to the drawer; flow to the consumer via the saved draft.\n\tconst [configTools, setConfigTools] = useState<ConfigToolConfig[]>(\n\t\tinitial?.configTools ?? [],\n\t);\n\tconst [restApiTools, setRestApiTools] = useState<RestApiToolConfig[]>(\n\t\tinitial?.restApiTools ?? [],\n\t);\n\tconst [toolDrawer, setToolDrawer] = useState<ToolDrawerState | null>(null);\n\tconst toolDrawerKeyRef = useRef(0);\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), PLUS\n\t// this drawer's inline custom tools so their `{{tool:<id>}}` tokens rehydrate\n\t// as chips on remount (they aren't in `availableTools`).\n\tconst mentionItems = useMemo(\n\t\t() => [\n\t\t\t...buildAgentMentionItems(availableTools, [], appLabel),\n\t\t\t...buildCustomToolMentionItems(configTools, restApiTools),\n\t\t],\n\t\t[availableTools, appLabel, configTools, restApiTools],\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\t// Latest custom-tool ids, readable from the mount-captured `@` onSelect handler\n\t// (BikEditor captures it once) — mirrors the context's valueRef trick.\n\tconst customToolIdsRef = useRef<Set<string>>(new Set());\n\tcustomToolIdsRef.current = new Set(\n\t\t[...configTools, ...restApiTools].map((t) => t.id),\n\t);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Only catalog tool ids belong in `tools`; custom tools (Rest API / email /\n\t\t\t// Slack) track themselves on their own lists. Picking an existing custom\n\t\t\t// tool from `@` must not leak its id in as a bogus native ref.\n\t\t\tif (kind === 'tool' && !customToolIdsRef.current.has(id)) {\n\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback((id: string, label?: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id, label);\n\t}, []);\n\n\t// Rest API (bespoke) + shared config-tool (email / Slack) drawers, same as the\n\t// main builder's Step 3 — here backed by the drawer's local state.\n\t// ponytail: mirrors Step3HowItResponds; kept local rather than sharing a hook\n\t// because Step3 is context-backed and this drawer is local-state.\n\tconst openRestApi = useCallback((tool?: RestApiToolConfig) => {\n\t\ttoolDrawerKeyRef.current += 1;\n\t\tsetToolDrawer({\n\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\tkind: 'restapi',\n\t\t\tinitialRest: tool,\n\t\t});\n\t}, []);\n\tconst openConfigTool = useCallback(\n\t\t(toolKey: ConfigToolKey, tool?: ConfigToolConfig) => {\n\t\t\ttoolDrawerKeyRef.current += 1;\n\t\t\tsetToolDrawer({\n\t\t\t\tkey: toolDrawerKeyRef.current,\n\t\t\t\tkind: 'config',\n\t\t\t\ttoolKey,\n\t\t\t\tinitialConfig: tool,\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\tconst openToolAction = useCallback(\n\t\t(source: ToolSource) => {\n\t\t\tconst toolKey = CONFIG_TOOL_SOURCES[source];\n\t\t\tif (toolKey) {\n\t\t\t\topenConfigTool(toolKey);\n\t\t\t} else {\n\t\t\t\topenRestApi();\n\t\t\t}\n\t\t},\n\t\t[openConfigTool, openRestApi],\n\t);\n\tconst handleSaveRestApi = useCallback(\n\t\t(tool: RestApiToolConfig) => {\n\t\t\tconst isNew = !restApiTools.some((t) => t.id === tool.id);\n\t\t\tsetRestApiTools((prev) => upsertById(prev, tool));\n\t\t\t// Drop a reference chip at the cursor on creation (edits keep the chip).\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, restApiMentionItem(tool).label);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[restApiTools, insertToolAtCursor],\n\t);\n\tconst handleSaveConfigTool = useCallback(\n\t\t(tool: ConfigToolConfig) => {\n\t\t\tconst isNew = !configTools.some((t) => t.id === tool.id);\n\t\t\tsetConfigTools((prev) => upsertById(prev, tool));\n\t\t\tif (isNew) {\n\t\t\t\tinsertToolAtCursor(tool.id, configToolMentionItem(tool).label);\n\t\t\t}\n\t\t\tsetToolDrawer(null);\n\t\t},\n\t\t[configTools, insertToolAtCursor],\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\tconfigTools: ConfigToolConfig[];\n\t\trestApiTools: RestApiToolConfig[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\t// Remove ANY tool by id: strip its `{{tool:<id>}}` tokens, remount the fields,\n\t// and drop it from whichever list holds it (catalog `tools` or an inline\n\t// custom-tool list). One undo restores all of it.\n\tconst removeTool = (id: string) => {\n\t\tconst label =\n\t\t\tavailableTools.find((t) => t.tool_id === id)?.display_name ??\n\t\t\trestApiTools.find((t) => t.id === id)?.name ??\n\t\t\t'Tool';\n\t\t// The token stores the tool id (a tool's id is its tool_id).\n\t\tconst token = `{{tool:${id}}}`;\n\t\tconst strip = (text: string) => text.split(token).join('');\n\t\tundoSnapshotRef.current = {\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\n\t\t};\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetConfigTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetRestApiTools((prev) => prev.filter((t) => t.id !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({ id: undoIdRef.current, message: `Tool \"${label}\" removed` });\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\tsetConfigTools(snap.configTools);\n\t\t\tsetRestApiTools(snap.restApiTools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst canSave =\n\t\tname.trim().length > 0 &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool\n\t\t\t\t? {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tlabel: tool.display_name,\n\t\t\t\t\t\ticon: sourceIcon(tool.source ?? ToolSource.Manifest),\n\t\t\t\t }\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Inline-configured tools (Rest API + email / Slack) render as rows in the same\n\t// list, each with its own Configure (edit) action that reopens its drawer.\n\tconst restApiItems: SelectableItem[] = restApiTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: restApiToolName(t),\n\t\ticon: SOURCE_ICONS[ToolSource.RestApi],\n\t\tonConfigure: () => openRestApi(t),\n\t}));\n\tconst configToolItems: SelectableItem[] = configTools.map((t) => ({\n\t\tid: t.id,\n\t\tlabel: configToolName(t),\n\t\ticon: SOURCE_ICONS[\n\t\t\tt.tool_key === 'send_slack_message'\n\t\t\t\t? ToolSource.Slack\n\t\t\t\t: ToolSource.EmailHandover\n\t\t],\n\t\tonConfigure: () => openConfigTool(t.tool_key, t),\n\t}));\n\tconst allToolItems: SelectableItem[] = [\n\t\t...toolItems,\n\t\t...restApiItems,\n\t\t...configToolItems,\n\t];\n\n\t// Built-in tool actions (Rest API / email / Slack); the shared email / Slack\n\t// forms appear only when their backend template was provided.\n\tconst toolActionSources = buildToolActions(\n\t\tconfigToolTemplates,\n\t\topenToolAction,\n\t);\n\n\tconst openConfigTemplate =\n\t\ttoolDrawer?.kind === 'config' && toolDrawer.toolKey\n\t\t\t? configToolTemplates?.[toolDrawer.toolKey]\n\t\t\t: undefined;\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped. Icon left of\n\t// the name, no description.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.display_name,\n\t\tvalue: t.tool_id,\n\t\tleadingIcon:\n\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\tundefined,\n\t}));\n\n\t// Group tools by source (Manifest / Shopify / …) so the empty state shows the\n\t// same per-source buttons as the main builder's side panel.\n\tconst toolSourceGroups: SourceGroup[] = (() => {\n\t\tconst order: string[] = [];\n\t\tconst bySource = new Map<string, SingleOption[]>();\n\t\tavailableTools.forEach((t) => {\n\t\t\tconst src = t.source ?? ToolSource.Manifest;\n\t\t\tif (!bySource.has(src)) {\n\t\t\t\tbySource.set(src, []);\n\t\t\t\torder.push(src);\n\t\t\t}\n\t\t\tbySource.get(src)?.push({\n\t\t\t\tlabel: t.display_name,\n\t\t\t\tvalue: t.tool_id,\n\t\t\t\tleadingIcon:\n\t\t\t\t\trenderSourceIcon(sourceIcon(t.source ?? ToolSource.Manifest)) ??\n\t\t\t\t\tundefined,\n\t\t\t});\n\t\t});\n\t\treturn order.map((src) => ({\n\t\t\tsource: src,\n\t\t\tlabel: toolSourceLabel(src),\n\t\t\toptions: bySource.get(src) ?? [],\n\t\t}));\n\t})();\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t\tconfigTools,\n\t\t\trestApiTools,\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<SideModal\n\t\t\t\theader={title}\n\t\t\t\tcloseOnEscapeKey={false}\n\t\t\t\tzIndex={SUBAGENT_ZINDEX}\n\t\t\t\theaderCustomComponent={\n\t\t\t\t\t<DrawerHeaderText\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tsubtitle=\"Each sub-agent handles one piece of the job. Use @ in the main instructions to call them.\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\twidth=\"421px\"\n\t\t\t\theaderStyle={DRAWER_HEADER_STYLE}\n\t\t\t\tbodyStyle={DRAWER_BODY_STYLE}\n\t\t\t\tonClose={onClose}\n\t\t\t\tsaveButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-save',\n\t\t\t\t\tbuttonText: 'Save',\n\t\t\t\t\tbuttonType: 'primary',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tdisabled: !canSave,\n\t\t\t\t\tisLoading: saving,\n\t\t\t\t\tonClick: handleSave,\n\t\t\t\t}}\n\t\t\t\tcancelButtonProps={{\n\t\t\t\t\t'data-test': 'subagent-cancel',\n\t\t\t\t\tbuttonText: 'Cancel',\n\t\t\t\t\tbuttonType: 'tertiaryGray',\n\t\t\t\t\tsize: 'small',\n\t\t\t\t\tonClick: onClose,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\tlabelTextBold\n\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\tvalue={name}\n\t\t\t\t\tmaxCharLimit={charLimits.name}\n\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\tonChangeText={setName}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\tvalue={instructions}\n\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\tmaxLength={charLimits.instructions}\n\t\t\t\t\tplaceholder=\"Write the steps in plain English. Type @ to reference a tool.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-instructions\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('instructions')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'instructions'\n\t\t\t\t\t\t\t\t\t? 'Improving…'\n\t\t\t\t\t\t\t\t\t: 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<MentionEditor\n\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\tmaxLength={charLimits.guardrail}\n\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Type @ to reference a tool.\"\n\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\ttools={availableTools}\n\t\t\t\t\ttoolActions={toolActionSources}\n\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\taction={\n\t\t\t\t\t\tonImprove ? (\n\t\t\t\t\t\t\t<ImproveButton\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdata-test=\"subagent-improve-guardrail\"\n\t\t\t\t\t\t\t\tdisabled={improving !== null}\n\t\t\t\t\t\t\t\tonClick={() => handleImprove('guardrail')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{improving === 'guardrail' ? 'Improving…' : 'Improve with AI'}\n\t\t\t\t\t\t\t</ImproveButton>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<SelectableListSection\n\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\titems={allToolItems}\n\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\tsourceGroups={toolSourceGroups}\n\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\tactionSources={toolActionSources}\n\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\tsetTools((prev) => addUnique(prev, id));\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\tconfirmDelete={{ noun: 'tool', zIndex: TOOL_DRAWER_ZINDEX + 1 }}\n\t\t\t\t/>\n\t\t\t</SideModal>\n\n\t\t\t{toolDrawer?.kind === 'restapi' && (\n\t\t\t\t<RestApiToolPanel\n\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\tinitial={toolDrawer.initialRest}\n\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\tonSave={handleSaveRestApi}\n\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{toolDrawer?.kind === 'config' &&\n\t\t\t\ttoolDrawer.toolKey &&\n\t\t\t\topenConfigTemplate && (\n\t\t\t\t\t<ConfigToolPanel\n\t\t\t\t\t\tkey={toolDrawer.key}\n\t\t\t\t\t\ttoolKey={toolDrawer.toolKey}\n\t\t\t\t\t\ttemplate={openConfigTemplate}\n\t\t\t\t\t\tinitial={toolDrawer.initialConfig}\n\t\t\t\t\t\tcharLimits={charLimits}\n\t\t\t\t\t\tonImprove={onImproveToolInstructions}\n\t\t\t\t\t\tonClose={() => setToolDrawer(null)}\n\t\t\t\t\t\tonSave={handleSaveConfigTool}\n\t\t\t\t\t\tzIndex={TOOL_DRAWER_ZINDEX}\n\t\t\t\t\t/>\n\t\t\t\t)}\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":["SUBAGENT_ZINDEX","TOOL_DRAWER_ZINDEX","upsertById","list","item","arr","x","ImproveButton","styled","COLORS","CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","onImproveToolInstructions","configToolTemplates","title","initial","appLabel","charLimits","AGENT_CHAR_LIMITS","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","configTools","setConfigTools","restApiTools","setRestApiTools","toolDrawer","setToolDrawer","toolDrawerKeyRef","useRef","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","buildCustomToolMentionItems","insertersRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","customToolIdsRef","t","addToolMention","kind","id","prev","addUnique","insertToolAtCursor","label","openRestApi","tool","openConfigTool","toolKey","openToolAction","source","CONFIG_TOOL_SOURCES","handleSaveRestApi","isNew","restApiMentionItem","handleSaveConfigTool","configToolMentionItem","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","token","strip","text","k","undoRemove","snap","canSave","toolItems","sourceIcon","ToolSource","restApiItems","restApiToolName","SOURCE_ICONS","configToolItems","configToolName","allToolItems","toolActionSources","buildToolActions","openConfigTemplate","toolOptions","renderSourceIcon","toolSourceGroups","order","bySource","src","toolSourceLabel","handleSave","result","handleImprove","improved","jsxs","Fragment","SideModal","jsx","DrawerHeaderText","DRAWER_HEADER_STYLE","DRAWER_BODY_STYLE","Input","MentionEditor","SelectableListSection","RestApiToolPanel","ConfigToolPanel","Toaster"],"mappings":"8yBAqDMA,GAAkB,IAClBC,EAAqB,KAGrBC,GAAa,CAClBC,EACAC,IACS,CACT,MAAMC,EAAMF,GAAQ,CAAA,EACpB,OAAOE,EAAI,KAAMC,GAAMA,EAAE,KAAOF,EAAK,EAAE,EACpCC,EAAI,IAAKC,GAAOA,EAAE,KAAOF,EAAK,GAAKA,EAAOE,CAAE,EAC5C,CAAC,GAAGD,EAAKD,CAAI,CACjB,EAYMG,GAAgBC,GAAAA,QAAO;AAAA;AAAA,qBAERC,EAAAA,OAAO,OAAO,OAAO;AAAA,UAChCA,EAAAA,OAAO,QAAQ,OAAO;AAAA,eACjBA,EAAAA,OAAO,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmDzBC,GAA0D,CAAC,CACvE,QAAAC,EACA,OAAAC,EACA,eAAAC,EACA,UAAAC,EACA,0BAAAC,EACA,oBAAAC,EACA,MAAAC,EAAQ,mBACR,QAAAC,EACA,SAAAC,EAAW,WAAA,WACXC,EAAaC,GAAAA,iBACd,IAAM,CACL,KAAM,CAACC,EAAMC,EAAO,EAAIC,EAAAA,SAASN,GAAS,MAAQ,EAAE,EAC9C,CAACO,EAAcC,CAAe,EAAIF,EAAAA,SAASN,GAAS,cAAgB,EAAE,EACtE,CAACS,EAAWC,CAAY,EAAIJ,EAAAA,SAASN,GAAS,WAAa,EAAE,EAC7D,CAACW,EAAOC,CAAQ,EAAIN,EAAAA,SAAmBN,GAAS,OAAS,EAAE,EAG3D,CAACa,EAAaC,CAAc,EAAIR,EAAAA,SACrCN,GAAS,aAAe,CAAA,CAAC,EAEpB,CAACe,EAAcC,CAAe,EAAIV,EAAAA,SACvCN,GAAS,cAAgB,CAAA,CAAC,EAErB,CAACiB,EAAYC,CAAa,EAAIZ,EAAAA,SAAiC,IAAI,EACnEa,EAAmBC,EAAAA,OAAO,CAAC,EAC3B,CAACC,EAAQC,CAAS,EAAIhB,EAAAA,SAAS,EAAK,EAEpC,CAACiB,GAAUC,CAAW,EAAIlB,EAAAA,SAAS,CAAC,EACpC,CAACmB,GAAUC,CAAW,EAAIpB,EAAAA,SAAS,CAAC,EACpC,CAACqB,EAAWC,CAAY,EAAItB,EAAAA,SAEhC,IAAI,EAKAuB,EAAeC,EAAAA,QACpB,IAAM,CACL,GAAGC,yBAAuBpC,EAAgB,CAAA,EAAIM,CAAQ,EACtD,GAAG+B,EAAAA,4BAA4BnB,EAAaE,CAAY,CAAA,EAEzD,CAACpB,EAAgBM,EAAUY,EAAaE,CAAY,CAAA,EAK/CkB,EAAeb,EAAAA,OAEnB,EAAE,EACEc,EAAiBd,EAAAA,OAAqC,cAAc,EACpEe,GAAgBC,cAAaC,GAAwB,CAC1DJ,EAAa,QAAQ,aAAeI,GAAM,MAC3C,EAAG,CAAA,CAAE,EACCC,GAAgBF,cAAaC,GAAwB,CAC1DJ,EAAa,QAAQ,UAAYI,GAAM,MACxC,EAAG,CAAA,CAAE,EACCE,GAAaH,EAAAA,YAAY,IAAM,CACpCF,EAAe,QAAU,cAC1B,EAAG,CAAA,CAAE,EACCM,GAAaJ,EAAAA,YAAY,IAAM,CACpCF,EAAe,QAAU,WAC1B,EAAG,CAAA,CAAE,EAGCO,GAAmBrB,EAAAA,OAAoB,IAAI,GAAK,EACtDqB,GAAiB,QAAU,IAAI,IAC9B,CAAC,GAAG5B,EAAa,GAAGE,CAAY,EAAE,IAAK2B,GAAMA,EAAE,EAAE,CAAA,EAElD,MAAMC,GAAiBP,EAAAA,YACtB,CAACQ,EAA2BC,IAAe,CAItCD,IAAS,QAAU,CAACH,GAAiB,QAAQ,IAAII,CAAE,GACtDjC,EAAUkC,GAASC,GAAAA,UAAUD,EAAMD,CAAE,CAAC,CAExC,EACA,CAAA,CAAC,EAEIG,EAAqBZ,EAAAA,YAAY,CAACS,EAAYI,IAAmB,EAErEhB,EAAa,QAAQC,EAAe,OAAO,GAC3CD,EAAa,QAAQ,gBACb,OAAQY,EAAII,CAAK,CAC3B,EAAG,CAAA,CAAE,EAMCC,EAAcd,cAAae,GAA6B,CAC7DhC,EAAiB,SAAW,EAC5BD,EAAc,CACb,IAAKC,EAAiB,QACtB,KAAM,UACN,YAAagC,CAAA,CACb,CACF,EAAG,CAAA,CAAE,EACCC,EAAiBhB,EAAAA,YACtB,CAACiB,EAAwBF,IAA4B,CACpDhC,EAAiB,SAAW,EAC5BD,EAAc,CACb,IAAKC,EAAiB,QACtB,KAAM,SACN,QAAAkC,EACA,cAAeF,CAAA,CACf,CACF,EACA,CAAA,CAAC,EAEIG,GAAiBlB,EAAAA,YACrBmB,GAAuB,CACvB,MAAMF,EAAUG,EAAAA,oBAAoBD,CAAM,EACtCF,EACHD,EAAeC,CAAO,EAEtBH,EAAA,CAEF,EACA,CAACE,EAAgBF,CAAW,CAAA,EAEvBO,GAAoBrB,EAAAA,YACxBe,GAA4B,CAC5B,MAAMO,EAAQ,CAAC3C,EAAa,KAAM2B,GAAMA,EAAE,KAAOS,EAAK,EAAE,EACxDnC,EAAiB8B,GAAS9D,GAAW8D,EAAMK,CAAI,CAAC,EAE5CO,GACHV,EAAmBG,EAAK,GAAIQ,EAAAA,mBAAmBR,CAAI,EAAE,KAAK,EAE3DjC,EAAc,IAAI,CACnB,EACA,CAACH,EAAciC,CAAkB,CAAA,EAE5BY,GAAuBxB,EAAAA,YAC3Be,GAA2B,CAC3B,MAAMO,EAAQ,CAAC7C,EAAY,KAAM6B,GAAMA,EAAE,KAAOS,EAAK,EAAE,EACvDrC,EAAgBgC,GAAS9D,GAAW8D,EAAMK,CAAI,CAAC,EAC3CO,GACHV,EAAmBG,EAAK,GAAIU,EAAAA,sBAAsBV,CAAI,EAAE,KAAK,EAE9DjC,EAAc,IAAI,CACnB,EACA,CAACL,EAAamC,CAAkB,CAAA,EAI3B,CAACc,EAAMC,CAAO,EAAIzD,EAAAA,SACvB,IAAA,EAEK0D,EAAkB5C,EAAAA,OAMd,IAAI,EACR6C,GAAY7C,EAAAA,OAAO,CAAC,EAKpB8C,GAAcrB,GAAe,CAClC,MAAMI,EACLtD,EAAe,KAAM+C,GAAMA,EAAE,UAAYG,CAAE,GAAG,cAC9C9B,EAAa,KAAM2B,GAAMA,EAAE,KAAOG,CAAE,GAAG,MACvC,OAEKsB,EAAQ,UAAUtB,CAAE,KACpBuB,EAASC,GAAiBA,EAAK,MAAMF,CAAK,EAAE,KAAK,EAAE,EACzDH,EAAgB,QAAU,CACzB,aAAAzD,EACA,UAAAE,EAAA,MACAE,EACA,YAAAE,EACA,aAAAE,CAAA,EAEDP,EAAiBsC,GAASsB,EAAMtB,CAAI,CAAC,EACrCpC,EAAcoC,GAASsB,EAAMtB,CAAI,CAAC,EAClClC,EAAUkC,GAASA,EAAK,OAAQJ,GAAMA,IAAMG,CAAE,CAAC,EAC/C/B,EAAgBgC,GAASA,EAAK,OAAQJ,GAAMA,EAAE,KAAOG,CAAE,CAAC,EACxD7B,EAAiB8B,GAASA,EAAK,OAAQJ,GAAMA,EAAE,KAAOG,CAAE,CAAC,EACzDrB,EAAa8C,GAAMA,EAAI,CAAC,EACxB5C,EAAa4C,GAAMA,EAAI,CAAC,EACxBL,GAAU,SAAW,EACrBF,EAAQ,CAAE,GAAIE,GAAU,QAAS,QAAS,SAAShB,CAAK,YAAa,CACtE,EAEMsB,GAAa,IAAM,CACxB,MAAMC,EAAOR,EAAgB,QACzBQ,IACHhE,EAAgBgE,EAAK,YAAY,EACjC9D,EAAa8D,EAAK,SAAS,EAC3B5D,EAAS4D,EAAK,KAAK,EACnB1D,EAAe0D,EAAK,WAAW,EAC/BxD,EAAgBwD,EAAK,YAAY,EACjChD,EAAa8C,GAAMA,EAAI,CAAC,EACxB5C,EAAa4C,GAAMA,EAAI,CAAC,EACxBN,EAAgB,QAAU,MAE3BD,EAAQ,IAAI,CACb,EAEMU,GACLrE,EAAK,KAAA,EAAO,OAAS,IACpBG,EAAa,KAAA,EAAO,OAAS,GAAKE,EAAU,KAAA,EAAO,OAAS,GAExDiE,GAA8B/D,EAClC,IAAKkC,GAA8B,CACnC,MAAMM,EAAOxD,EAAe,KAAM+C,GAAMA,EAAE,UAAYG,CAAE,EACxD,OAAOM,EACJ,CACA,GAAAN,EACA,MAAOM,EAAK,aACZ,KAAMwB,EAAAA,WAAWxB,EAAK,QAAUyB,EAAAA,WAAW,QAAQ,CAAA,EAEnD,IACJ,CAAC,EACA,OAAQxF,GAA2BA,IAAM,IAAI,EAIzCyF,GAAiC9D,EAAa,IAAK2B,IAAO,CAC/D,GAAIA,EAAE,GACN,MAAOoC,EAAAA,gBAAgBpC,CAAC,EACxB,KAAMqC,EAAAA,aAAaH,EAAAA,WAAW,OAAO,EACrC,YAAa,IAAM1B,EAAYR,CAAC,CAAA,EAC/B,EACIsC,GAAoCnE,EAAY,IAAK6B,IAAO,CACjE,GAAIA,EAAE,GACN,MAAOuC,EAAAA,eAAevC,CAAC,EACvB,KAAMqC,EAAAA,aACLrC,EAAE,WAAa,qBACZkC,aAAW,MACXA,EAAAA,WAAW,aACf,EACA,YAAa,IAAMxB,EAAeV,EAAE,SAAUA,CAAC,CAAA,EAC9C,EACIwC,GAAiC,CACtC,GAAGR,GACH,GAAGG,GACH,GAAGG,EAAA,EAKEG,EAAoBC,GAAAA,iBACzBtF,EACAwD,EAAA,EAGK+B,GACLpE,GAAY,OAAS,UAAYA,EAAW,QACzCnB,IAAsBmB,EAAW,OAAO,EACxC,OAIEqE,GAA8B3F,EAAe,IAAK+C,IAAO,CAC9D,MAAOA,EAAE,aACT,MAAOA,EAAE,QACT,YACC6C,EAAAA,iBAAiBZ,aAAWjC,EAAE,QAAUkC,EAAAA,WAAW,QAAQ,CAAC,GAC5D,MAAA,EACA,EAIIY,IAAmC,IAAM,CAC9C,MAAMC,EAAkB,CAAA,EAClBC,MAAe,IACrB,OAAA/F,EAAe,QAAS+C,GAAM,CAC7B,MAAMiD,EAAMjD,EAAE,QAAUkC,EAAAA,WAAW,SAC9Bc,EAAS,IAAIC,CAAG,IACpBD,EAAS,IAAIC,EAAK,EAAE,EACpBF,EAAM,KAAKE,CAAG,GAEfD,EAAS,IAAIC,CAAG,GAAG,KAAK,CACvB,MAAOjD,EAAE,aACT,MAAOA,EAAE,QACT,YACC6C,EAAAA,iBAAiBZ,aAAWjC,EAAE,QAAUkC,EAAAA,WAAW,QAAQ,CAAC,GAC5D,MAAA,CACD,CACF,CAAC,EACMa,EAAM,IAAKE,IAAS,CAC1B,OAAQA,EACR,MAAOC,EAAAA,gBAAgBD,CAAG,EAC1B,QAASD,EAAS,IAAIC,CAAG,GAAK,CAAA,CAAC,EAC9B,CACH,GAAA,EAEME,GAAa,SAAY,CAC9B,GAAI,CAACpB,IAAWpD,EACf,OAED,MAAMyE,EAASpG,EAAO,CACrB,KAAMU,EAAK,KAAA,EACX,aAAAG,EACA,UAAAE,EAAA,MACAE,EACA,YAAAE,EACA,aAAAE,CAAA,CACA,EACD,GAAI+E,GAAU,OAAQA,EAAyB,MAAS,WAAY,CACnExE,EAAU,EAAI,EACd,GAAI,CACH,MAAMwE,CACP,QAAA,CACCxE,EAAU,EAAK,CAChB,CACD,CACD,EAEMyE,GAAgB,MAAOnD,GAAuC,CACnE,GAAI,GAAChD,GAAa+B,GAGlB,CAAAC,EAAagB,CAAI,EACjB,GAAI,CAEH,MAAMoD,EAAW,MAAMpG,EAAUgD,EADjBA,IAAS,eAAiBrC,EAAeE,CACX,EAC1CmC,IAAS,gBACZpC,EAAgBwF,CAAQ,EACxBxE,EAAa8C,GAAMA,EAAI,CAAC,IAExB5D,EAAasF,CAAQ,EACrBtE,EAAa4C,GAAMA,EAAI,CAAC,EAE1B,QAAA,CACC1C,EAAa,IAAI,CAClB,EACD,EAEA,OACCqE,EAAAA,KAAAC,WAAA,CACC,SAAA,CAAAD,EAAAA,KAACE,GAAAA,UAAA,CACA,OAAQpG,EACR,iBAAkB,GAClB,OAAQjB,GACR,sBACCsH,EAAAA,IAACC,EAAAA,iBAAA,CACA,MAAAtG,EACA,SAAS,2FAAA,CAAA,EAGX,MAAM,QACN,YAAauG,EAAAA,oBACb,UAAWC,EAAAA,kBACX,QAAA9G,EACA,gBAAiB,CAChB,YAAa,gBACb,WAAY,OACZ,WAAY,UACZ,KAAM,QACN,SAAU,CAACgF,GACX,UAAWpD,EACX,QAASwE,EAAA,EAEV,kBAAmB,CAClB,YAAa,kBACb,WAAY,SACZ,WAAY,eACZ,KAAM,QACN,QAASpG,CAAA,EAGV,SAAA,CAAA2G,EAAAA,IAACI,GAAAA,MAAA,CACA,YAAU,gBACV,UAAU,aACV,cAAa,GACb,YAAY,mBACZ,MAAOpG,EACP,aAAcF,EAAW,KACzB,qBAAqB,MACrB,aAAc,CAAE,SAAU,GAAI,WAAY,MAAA,EAC1C,aAAcG,EAAA,CAAA,EAGf+F,EAAAA,IAACK,GAAAA,cAAA,CACA,YAAU,wBACV,MAAM,eACN,MAAOlG,EACP,SAAUC,EACV,UAAWN,EAAW,aACtB,YAAY,gEACZ,UAAU,QACV,SAAU,SAASqB,EAAQ,GAC3B,aAAAM,EACA,MAAOlC,EACP,YAAawF,EACb,gBAAiBxC,GACjB,QAASJ,GACT,eAAgBJ,GAChB,OACCvC,EACCwG,EAAAA,IAAC/G,GAAA,CACA,KAAK,SACL,YAAU,gCACV,SAAUsC,IAAc,KACxB,QAAS,IAAMoE,GAAc,cAAc,EAE1C,SAAApE,IAAc,eACZ,aACA,iBAAA,CAAA,EAED,MAAA,CAAA,EAINyE,EAAAA,IAACK,GAAAA,cAAA,CACA,YAAU,qBACV,MAAM,aACN,MAAOhG,EACP,SAAUC,EACV,UAAWR,EAAW,UACtB,YAAY,qEACZ,UAAU,QACV,SAAU,SAASuB,EAAQ,GAC3B,aAAAI,EACA,MAAOlC,EACP,YAAawF,EACb,gBAAiBxC,GACjB,QAASH,GACT,eAAgBF,GAChB,OACC1C,EACCwG,EAAAA,IAAC/G,GAAA,CACA,KAAK,SACL,YAAU,6BACV,SAAUsC,IAAc,KACxB,QAAS,IAAMoE,GAAc,WAAW,EAEvC,SAAApE,IAAc,YAAc,aAAe,iBAAA,CAAA,EAE1C,MAAA,CAAA,EAINyE,EAAAA,IAACM,GAAAA,sBAAA,CACA,MAAM,2BACN,eAAe,iBACf,MAAOxB,GACP,eAAgBI,GAChB,aAAcE,GACd,aAAA3D,EACA,cAAesD,EACf,UAAU,sBACV,MAAQtC,GAAO,CACdG,EAAmBH,CAAE,EACrBjC,EAAUkC,GAASC,GAAAA,UAAUD,EAAMD,CAAE,CAAC,CACvC,EACA,SAAUqB,GACV,cAAe,CAAE,KAAM,OAAQ,OAAQnF,EAAqB,CAAA,CAAE,CAAA,CAC/D,CAAA,CAAA,EAGAkC,GAAY,OAAS,WACrBmF,EAAAA,IAACO,GAAAA,iBAAA,CAEA,QAAS1F,EAAW,YAAA,WACpBf,EACA,UAAWL,EACX,QAAS,IAAMqB,EAAc,IAAI,EACjC,OAAQuC,GACR,OAAQ1E,CAAA,EANHkC,EAAW,GAAA,EAUjBA,GAAY,OAAS,UACrBA,EAAW,SACXoE,IACCe,EAAAA,IAACQ,GAAAA,gBAAA,CAEA,QAAS3F,EAAW,QACpB,SAAUoE,GACV,QAASpE,EAAW,cAAA,WACpBf,EACA,UAAWL,EACX,QAAS,IAAMqB,EAAc,IAAI,EACjC,OAAQ0C,GACR,OAAQ7E,CAAA,EARHkC,EAAW,GAAA,EAYlB6C,GACAsC,EAAAA,IAACS,GAAAA,QAAA,CAEA,KAAM/C,EAAK,QACX,KAAK,OACL,SAAS,YACT,UAAW,IACX,gBAAe,GACf,YAAa,CACZ,WAAY,OACZ,WAAY,GACZ,cAAe,KACdS,GAAA,EACO,CAAA,EACR,EAED,aAAc,IAAMR,EAAQ,IAAI,CAAA,EAd3BD,EAAK,EAAA,CAeX,EAEF,CAEF"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const lt=require("react/jsx-runtime"),s=require("react"),at=require("../constants/charLimits.js"),d=require("../constants/steps.js"),dt=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},gt=dt(s),nt=gt.default.createContext(null),ft=()=>{const t=s.useContext(nt);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},mt=(t,r)=>{const l=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<=r.name&&t.description.length<=r.description,trigger:l,response:t.instructions.trim().length>0||(t.guardrail??"").trim().length>0,handover:!0}},Rt=({value:t,onChange:r,activeStep:l,onStepChange:T,availableTools:g,availableSubAgents:f,availableIntents:C,availableModels:k,configToolTemplates:A,validation:_,applicationType:E,charLimits:M,disableStepNavigation:P=!0,onCreateSubAgent:h,onFetchSubAgent:B,onUpdateSubAgent:q,onImproveSubAgent:j,onImproveToolInstructions:y,children:ot})=>{const[rt,ct]=s.useState("about"),m=l??rt,c=d.getStepIndex(m),F=s.useRef(t);F.current=t;const[K,L]=s.useState(0),p=s.useRef({}),$=s.useRef("instructions"),Y=s.useCallback((e,n)=>{n?p.current[e]=n:delete p.current[e]},[]),w=s.useCallback(e=>{$.current=e},[]),H=s.useRef(null),I=s.useCallback(e=>{H.current=e},[]),V=s.useCallback(()=>{H.current?.()},[]),D=s.useRef(null),G=s.useCallback(e=>{D.current=e},[]),N=s.useCallback(e=>{D.current?.(e)},[]),U=s.useCallback((e,n,i)=>{const a=p.current;(a[$.current]??a.instructions)?.(e,n,i)},[]),[z,S]=s.useState(null),R=s.useRef(null),J=s.useRef(0),u=s.useCallback(e=>{l===void 0&&ct(e),T?.(e)},[l,T]),Q=s.useCallback(()=>{const e=d.STEP_KEYS[Math.min(c+1,d.STEP_KEYS.length-1)];u(e)},[c,u]),W=s.useCallback(()=>{const e=d.STEP_KEYS[Math.max(c-1,0)];u(e)},[c,u]),X=s.useCallback(e=>r(e),[r]),Z=s.useCallback((e,n)=>r({[e]:n}),[r]),O=s.useCallback((e,n)=>{const i=F.current;e==="tool"?i.tools.includes(n)||r({tools:[...i.tools,n]}):i.subagents.includes(n)||r({subagents:[...i.subagents,n]})},[r]),v=s.useCallback((e,n)=>{const i=e==="tool"?`{{tool:${n}}}`:`{{subagent:${n}}}`,a=o=>o.split(i).join("");R.current={tools:t.tools,subagents:t.subagents,configTools:t.configTools,restApiTools:t.restApiTools,instructions:t.instructions,guardrail:t.guardrail};const st={instructions:a(t.instructions),guardrail:a(t.guardrail??""),...e==="tool"?{tools:t.tools.filter(o=>o!==n),configTools:(t.configTools??[]).filter(o=>o.id!==n),restApiTools:(t.restApiTools??[]).filter(o=>o.id!==n)}:{subagents:t.subagents.filter(o=>o!==n)}};r(st),L(o=>o+1);const ut=e==="tool"?g.find(o=>o.tool_id===n)?.display_name??(t.restApiTools??[]).find(o=>o.id===n)?.name??"Tool":f.find(o=>o.id===n)?.name??"Sub-agent";J.current+=1,S({id:J.current,message:`${e==="tool"?"Tool":"Sub-agent"} "${ut}" removed`})},[g,f,t,r]),tt=s.useCallback(()=>{R.current&&(r(R.current),R.current=null,L(e=>e+1)),S(null)},[r]),et=s.useCallback(()=>S(null),[]),b=s.useMemo(()=>({...at.AGENT_CHAR_LIMITS,...M}),[M]),x=s.useMemo(()=>({...mt(t,b),..._}),[t,b,_]),it=s.useMemo(()=>({value:t,patch:X,updateField:Z,addReference:O,removeReference:v,mentionResetKey:K,insertMention:U,registerMentionField:Y,notifyMentionFocus:w,undoToast:z,undoRemoval:tt,dismissUndo:et,activeStep:m,activeIndex:c,goToStep:u,goNext:Q,goPrev:W,isFirstStep:c===0,isLastStep:c===d.STEP_KEYS.length-1,validation:x,isActiveStepValid:x[m],availableTools:g,availableSubAgents:f,availableIntents:C,availableModels:k,configToolTemplates:A,applicationType:E,charLimits:b,disableStepNavigation:P,onCreateSubAgent:h,registerSubAgentCreator:I,requestCreateSubAgent:V,registerToolActionHandler:G,requestToolAction:N,onFetchSubAgent:B,onUpdateSubAgent:q,onImproveSubAgent:j,onImproveToolInstructions:y}),[t,X,Z,O,v,K,U,Y,w,z,tt,et,m,c,u,Q,W,x,g,f,C,k,A,E,b,P,h,I,V,G,N,B,q,j,y]);return lt.jsx(nt.Provider,{value:it,children:ot})};exports.AgentBuilderProvider=Rt;exports.useAgentBuilderContext=ft;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const lt=require("react/jsx-runtime"),s=require("react"),at=require("../constants/charLimits.js"),g=require("../constants/steps.js"),dt=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},gt=dt(s),nt=gt.default.createContext(null),ft=()=>{const t=s.useContext(nt);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},mt=(t,r)=>{const d=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<=r.name&&t.description.length<=r.description,trigger:d,response:t.instructions.trim().length>0||(t.guardrail??"").trim().length>0,handover:!0}},Rt=({value:t,onChange:r,activeStep:d,onStepChange:x,availableTools:f,availableSubAgents:m,availableIntents:A,availableModels:k,configToolTemplates:_,validation:E,applicationType:M,charLimits:P,disableStepNavigation:h=!0,onCreateSubAgent:B,onFetchSubAgent:q,onUpdateSubAgent:j,onImproveSubAgent:y,onImproveToolInstructions:F,children:ot})=>{const[rt,ct]=s.useState("about"),R=d??rt,i=g.getStepIndex(R),K=s.useRef(t);K.current=t;const[L,$]=s.useState(0),T=s.useRef({}),Y=s.useRef("instructions"),w=s.useCallback((e,n)=>{n?T.current[e]=n:delete T.current[e]},[]),H=s.useCallback(e=>{Y.current=e},[]),I=s.useRef(null),V=s.useCallback(e=>{I.current=e},[]),D=s.useCallback(()=>{I.current?.()},[]),G=s.useRef(null),N=s.useCallback(e=>{G.current=e},[]),U=s.useCallback(e=>{G.current?.(e)},[]),z=s.useCallback((e,n,c)=>{const l=T.current;(l[Y.current]??l.instructions)?.(e,n,c)},[]),[J,C]=s.useState(null),b=s.useRef(null),Q=s.useRef(0),u=s.useCallback(e=>{d===void 0&&ct(e),x?.(e)},[d,x]),W=s.useCallback(()=>{const e=g.STEP_KEYS[Math.min(i+1,g.STEP_KEYS.length-1)];u(e)},[i,u]),X=s.useCallback(()=>{const e=g.STEP_KEYS[Math.max(i-1,0)];u(e)},[i,u]),Z=s.useCallback(e=>r(e),[r]),O=s.useCallback((e,n)=>r({[e]:n}),[r]),v=s.useCallback((e,n)=>{const c=K.current;e==="tool"?!((c.configTools??[]).some(a=>a.id===n)||(c.restApiTools??[]).some(a=>a.id===n))&&!c.tools.includes(n)&&r({tools:[...c.tools,n]}):c.subagents.includes(n)||r({subagents:[...c.subagents,n]})},[r]),tt=s.useCallback((e,n)=>{const c=e==="tool"?`{{tool:${n}}}`:`{{subagent:${n}}}`,l=o=>o.split(c).join("");b.current={tools:t.tools,subagents:t.subagents,configTools:t.configTools,restApiTools:t.restApiTools,instructions:t.instructions,guardrail:t.guardrail};const a={instructions:l(t.instructions),guardrail:l(t.guardrail??""),...e==="tool"?{tools:t.tools.filter(o=>o!==n),configTools:(t.configTools??[]).filter(o=>o.id!==n),restApiTools:(t.restApiTools??[]).filter(o=>o.id!==n)}:{subagents:t.subagents.filter(o=>o!==n)}};r(a),$(o=>o+1);const ut=e==="tool"?f.find(o=>o.tool_id===n)?.display_name??(t.restApiTools??[]).find(o=>o.id===n)?.name??"Tool":m.find(o=>o.id===n)?.name??"Sub-agent";Q.current+=1,C({id:Q.current,message:`${e==="tool"?"Tool":"Sub-agent"} "${ut}" removed`})},[f,m,t,r]),et=s.useCallback(()=>{b.current&&(r(b.current),b.current=null,$(e=>e+1)),C(null)},[r]),st=s.useCallback(()=>C(null),[]),p=s.useMemo(()=>({...at.AGENT_CHAR_LIMITS,...P}),[P]),S=s.useMemo(()=>({...mt(t,p),...E}),[t,p,E]),it=s.useMemo(()=>({value:t,patch:Z,updateField:O,addReference:v,removeReference:tt,mentionResetKey:L,insertMention:z,registerMentionField:w,notifyMentionFocus:H,undoToast:J,undoRemoval:et,dismissUndo:st,activeStep:R,activeIndex:i,goToStep:u,goNext:W,goPrev:X,isFirstStep:i===0,isLastStep:i===g.STEP_KEYS.length-1,validation:S,isActiveStepValid:S[R],availableTools:f,availableSubAgents:m,availableIntents:A,availableModels:k,configToolTemplates:_,applicationType:M,charLimits:p,disableStepNavigation:h,onCreateSubAgent:B,registerSubAgentCreator:V,requestCreateSubAgent:D,registerToolActionHandler:N,requestToolAction:U,onFetchSubAgent:q,onUpdateSubAgent:j,onImproveSubAgent:y,onImproveToolInstructions:F}),[t,Z,O,v,tt,L,z,w,H,J,et,st,R,i,u,W,X,S,f,m,A,k,_,M,p,h,B,V,D,N,U,q,j,y,F]);return lt.jsx(nt.Provider,{value:it,children:ot})};exports.AgentBuilderProvider=Rt;exports.useAgentBuilderContext=ft;
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\tConfigToolKey,\n\tIntentOption,\n\tModelOption,\n\tParamsBlob,\n\tStepKey,\n\tStepValidation,\n\tSubAgentDraft,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\nimport type { ToolSource } from '../constants/tools';\n\n/** Mention-capable text fields in Step 3 (both store firebase token text). */\nexport type MentionFieldKey = 'instructions' | 'guardrail';\ntype MentionInsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n) => void;\n\n/** Toast shown after a tool / sub-agent is removed, offering an undo. */\nexport interface UndoToastState {\n\t/** Bumped per removal so the toast timer restarts. */\n\tid: number;\n\tmessage: string;\n}\n\nexport interface AgentBuilderContextShape {\n\t/** Controlled value relayed from props. */\n\tvalue: AgentValue;\n\t/** Patch one or more fields. */\n\tpatch: (partial: Partial<AgentValue>) => void;\n\t/** Patch a single field. */\n\tupdateField: <K extends keyof AgentValue>(key: K, val: AgentValue[K]) => void;\n\t/**\n\t * Remove a tool / sub-agent everywhere: drops it from the list AND strips ALL\n\t * its `{{tool:KEY}}` / `{{subagent:ID}}` tokens from BOTH the instructions and\n\t * the guardrails, remounts the editors, and raises an undo toast.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/**\n\t * Append a tool / sub-agent id to its list (deduped), reading the LATEST value\n\t * via a ref. Use this instead of `patch({ tools: [...value.tools, id] })` from\n\t * any handler that may be captured with a stale `value` — notably the `@`\n\t * editor's mount-time `onSelect`, which would otherwise keep only the last pick.\n\t */\n\taddReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the mention editors after an external edit. */\n\tmentionResetKey: number;\n\t/**\n\t * Insert a tool / sub-agent mention chip at the last cursor position of\n\t * whichever mention field was focused most recently (Instructions or\n\t * Guardrails). `label` overrides the chip text (e.g. a just-created sub-agent\n\t * not yet in the available list).\n\t */\n\tinsertMention: (\n\t\tkind: 'tool' | 'subagent',\n\t\tid: string,\n\t\tlabel?: string,\n\t) => void;\n\t/** A mention field registers its editor-backed insert here (internal). */\n\tregisterMentionField: (\n\t\tfieldKey: MentionFieldKey,\n\t\tfn: MentionInsertFn | null,\n\t) => void;\n\t/** A mention field reports focus so inserts target it (internal). */\n\tnotifyMentionFocus: (fieldKey: MentionFieldKey) => void;\n\n\t// Undo (post-removal)\n\t/** Non-null while the undo toast should be visible. */\n\tundoToast: UndoToastState | null;\n\t/** Restore the last removed tool / sub-agent (list + stripped tokens). */\n\tundoRemoval: () => void;\n\t/** Dismiss the undo toast without restoring. */\n\tdismissUndo: () => void;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/**\n\t * Backend templates for the shared-drawer tools (email / Slack), keyed by\n\t * `tool_key`. A present key drives its dynamic form + enables its tool action.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** Resolved per-field character limits (consumer overrides merged over defaults). */\n\tcharLimits: AgentCharLimits;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n\n\t// Sub-agent creation (Step 3 drawer)\n\t/** Persist a new sub-agent and resolve with its ref. Omit to hide the create flow. */\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/**\n\t * Step 3 registers its \"open create-sub-agent drawer\" action here so the `@`\n\t * picker's \"Create new\" row can trigger it. Pass `null` to unregister.\n\t */\n\tregisterSubAgentCreator: (fn: (() => void) | null) => void;\n\t/** Open the create-sub-agent drawer (no-op until Step 3 registers it). */\n\trequestCreateSubAgent: () => void;\n\t/**\n\t * Step 3 registers its \"open the drawer for this built-in tool action\"\n\t * (Rest API / email handover / Slack) handler here so the `@` reference picker\n\t * can trigger it. Pass `null` to unregister.\n\t */\n\tregisterToolActionHandler: (\n\t\tfn: ((source: ToolSource) => void) | null,\n\t) => void;\n\t/** Open a built-in tool action's drawer (no-op until Step 3 registers it). */\n\trequestToolAction: (source: ToolSource) => void;\n\t/** Fetch a sub-agent's editable data (Configure). Omit to hide Configure. */\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\t/** Persist edits to an existing sub-agent. */\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Optional \"Improve with AI\" for the drawer's instructions / guardrails. */\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Optional \"Improve with AI\" for the Rest API / email-handover tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (\n\tvalue: AgentValue,\n\tlimits: AgentCharLimits,\n): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.custom_intent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= limits.name &&\n\t\t\tvalue.description.length <= limits.description,\n\t\ttrigger: triggerValid,\n\t\t// At least one of Instructions / Guardrails must be filled.\n\t\tresponse:\n\t\t\tvalue.instructions.trim().length > 0 ||\n\t\t\t(value.guardrail ?? '').trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tcharLimits?: Partial<AgentCharLimits>;\n\tdisableStepNavigation?: boolean;\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\tonImproveToolInstructions?: (text: string) => 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\tconfigToolTemplates,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tcharLimits: charLimitsOverride,\n\tdisableStepNavigation = true,\n\tonCreateSubAgent,\n\tonFetchSubAgent,\n\tonUpdateSubAgent,\n\tonImproveSubAgent,\n\tonImproveToolInstructions,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Latest value, so closure-captured handlers (e.g. the `@` editor's mount-time\n\t// mention onSelect) append against the current lists, not a stale snapshot.\n\tconst valueRef = useRef(value);\n\tvalueRef.current = value;\n\n\t// Bumped when a mention field is edited from OUTSIDE its editor (removing a\n\t// tool from the side list, undo), forcing the mention editors to remount.\n\tconst [mentionResetKey, setMentionResetKey] = useState(0);\n\n\t// Each mention field registers an editor-backed insert fn + reports focus, so\n\t// side-panel adds drop a chip into the last-focused field at its cursor.\n\tconst mentionInsertersRef = useRef<\n\t\tPartial<Record<MentionFieldKey, MentionInsertFn>>\n\t>({});\n\tconst lastFocusedFieldRef = useRef<MentionFieldKey>('instructions');\n\tconst registerMentionField = useCallback(\n\t\t(fieldKey: MentionFieldKey, fn: MentionInsertFn | null) => {\n\t\t\tif (fn) {\n\t\t\t\tmentionInsertersRef.current[fieldKey] = fn;\n\t\t\t} else {\n\t\t\t\tdelete mentionInsertersRef.current[fieldKey];\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst notifyMentionFocus = useCallback((fieldKey: MentionFieldKey) => {\n\t\tlastFocusedFieldRef.current = fieldKey;\n\t}, []);\n\n\t// Step 3 registers its drawer opener here; the `@` picker's \"Create new\" calls it.\n\tconst subAgentCreatorRef = useRef<(() => void) | null>(null);\n\tconst registerSubAgentCreator = useCallback((fn: (() => void) | null) => {\n\t\tsubAgentCreatorRef.current = fn;\n\t}, []);\n\tconst requestCreateSubAgent = useCallback(() => {\n\t\tsubAgentCreatorRef.current?.();\n\t}, []);\n\n\t// Step 3 registers a dispatcher that opens a built-in tool action's drawer.\n\tconst toolActionHandlerRef = useRef<((source: ToolSource) => void) | null>(\n\t\tnull,\n\t);\n\tconst registerToolActionHandler = useCallback(\n\t\t(fn: ((source: ToolSource) => void) | null) => {\n\t\t\ttoolActionHandlerRef.current = fn;\n\t\t},\n\t\t[],\n\t);\n\tconst requestToolAction = useCallback((source: ToolSource) => {\n\t\ttoolActionHandlerRef.current?.(source);\n\t}, []);\n\tconst insertMention = useCallback<MentionInsertFn>((kind, id, label) => {\n\t\tconst inserters = mentionInsertersRef.current;\n\t\tconst target =\n\t\t\tinserters[lastFocusedFieldRef.current] ?? inserters.instructions;\n\t\ttarget?.(kind, id, label);\n\t}, []);\n\n\t// Undo state for the most recent removal.\n\tconst [undoToast, setUndoToast] = useState<UndoToastState | null>(null);\n\tconst undoSnapshotRef = useRef<Partial<AgentValue> | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst addReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst v = valueRef.current;\n\t\t\tif (kind === 'tool') {\n\t\t\t\tif (!v.tools.includes(id)) {\n\t\t\t\t\tonChange({ tools: [...v.tools, id] });\n\t\t\t\t}\n\t\t\t} else if (!v.subagents.includes(id)) {\n\t\t\t\tonChange({ subagents: [...v.subagents, id] });\n\t\t\t}\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Tokens store the id for both kinds (a tool's id is its tool_id).\n\t\t\tconst token = kind === 'tool' ? `{{tool:${id}}}` : `{{subagent:${id}}}`;\n\t\t\tconst strip = (text: string) => text.split(token).join('');\n\n\t\t\t// Snapshot every field a removal touches, for undo. Custom tools (Rest\n\t\t\t// API / email / Slack) live on their own lists, so include them too.\n\t\t\tundoSnapshotRef.current = {\n\t\t\t\ttools: value.tools,\n\t\t\t\tsubagents: value.subagents,\n\t\t\t\tconfigTools: value.configTools,\n\t\t\t\trestApiTools: value.restApiTools,\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? {\n\t\t\t\t\t\t\t// A tool id may be a catalog tool OR an inline custom tool — drop\n\t\t\t\t\t\t\t// it from whichever list holds it (the others are no-op filters).\n\t\t\t\t\t\t\ttools: value.tools.filter((t) => t !== id),\n\t\t\t\t\t\t\tconfigTools: (value.configTools ?? []).filter((t) => t.id !== id),\n\t\t\t\t\t\t\trestApiTools: (value.restApiTools ?? []).filter(\n\t\t\t\t\t\t\t\t(t) => t.id !== id,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t }\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 ??\n\t\t\t\t\t (value.restApiTools ?? []).find((t) => t.id === id)?.name ??\n\t\t\t\t\t 'Tool'\n\t\t\t\t\t: availableSubAgents.find((s) => s.id === id)?.name ?? 'Sub-agent';\n\t\t\tundoIdRef.current += 1;\n\t\t\tsetUndoToast({\n\t\t\t\tid: undoIdRef.current,\n\t\t\t\tmessage: `${kind === 'tool' ? 'Tool' : 'Sub-agent'} \"${label}\" removed`,\n\t\t\t});\n\t\t},\n\t\t[availableTools, availableSubAgents, value, onChange],\n\t);\n\n\tconst undoRemoval = useCallback(() => {\n\t\tif (undoSnapshotRef.current) {\n\t\t\tonChange(undoSnapshotRef.current);\n\t\t\tundoSnapshotRef.current = null;\n\t\t\tsetMentionResetKey((k) => k + 1);\n\t\t}\n\t\tsetUndoToast(null);\n\t}, [onChange]);\n\n\tconst dismissUndo = useCallback(() => setUndoToast(null), []);\n\n\t// Consumer overrides merged over the built-in defaults (name 60, rest 1000).\n\tconst charLimits = useMemo<AgentCharLimits>(\n\t\t() => ({ ...AGENT_CHAR_LIMITS, ...charLimitsOverride }),\n\t\t[charLimitsOverride],\n\t);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value, charLimits), ...validationOverride }),\n\t\t[value, charLimits, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tconfigToolTemplates,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tregisterToolActionHandler,\n\t\t\trequestToolAction,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t\tonImproveToolInstructions,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tconfigToolTemplates,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tregisterToolActionHandler,\n\t\t\trequestToolAction,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t\tonImproveToolInstructions,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","limits","triggerValid","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","configToolTemplates","validationOverride","applicationType","charLimitsOverride","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","onImproveToolInstructions","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","valueRef","useRef","mentionResetKey","setMentionResetKey","mentionInsertersRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","subAgentCreatorRef","registerSubAgentCreator","requestCreateSubAgent","toolActionHandlerRef","registerToolActionHandler","requestToolAction","source","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","addReference","v","removeReference","token","strip","text","t","s","k","undoRemoval","dismissUndo","charLimits","useMemo","AGENT_CHAR_LIMITS","validation"],"mappings":"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"}
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\tConfigToolKey,\n\tIntentOption,\n\tModelOption,\n\tParamsBlob,\n\tStepKey,\n\tStepValidation,\n\tSubAgentDraft,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport type { AgentCharLimits } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\nimport type { ToolSource } from '../constants/tools';\n\n/** Mention-capable text fields in Step 3 (both store firebase token text). */\nexport type MentionFieldKey = 'instructions' | 'guardrail';\ntype MentionInsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n) => void;\n\n/** Toast shown after a tool / sub-agent is removed, offering an undo. */\nexport interface UndoToastState {\n\t/** Bumped per removal so the toast timer restarts. */\n\tid: number;\n\tmessage: string;\n}\n\nexport interface AgentBuilderContextShape {\n\t/** Controlled value relayed from props. */\n\tvalue: AgentValue;\n\t/** Patch one or more fields. */\n\tpatch: (partial: Partial<AgentValue>) => void;\n\t/** Patch a single field. */\n\tupdateField: <K extends keyof AgentValue>(key: K, val: AgentValue[K]) => void;\n\t/**\n\t * Remove a tool / sub-agent everywhere: drops it from the list AND strips ALL\n\t * its `{{tool:KEY}}` / `{{subagent:ID}}` tokens from BOTH the instructions and\n\t * the guardrails, remounts the editors, and raises an undo toast.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/**\n\t * Append a tool / sub-agent id to its list (deduped), reading the LATEST value\n\t * via a ref. Use this instead of `patch({ tools: [...value.tools, id] })` from\n\t * any handler that may be captured with a stale `value` — notably the `@`\n\t * editor's mount-time `onSelect`, which would otherwise keep only the last pick.\n\t */\n\taddReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the mention editors after an external edit. */\n\tmentionResetKey: number;\n\t/**\n\t * Insert a tool / sub-agent mention chip at the last cursor position of\n\t * whichever mention field was focused most recently (Instructions or\n\t * Guardrails). `label` overrides the chip text (e.g. a just-created sub-agent\n\t * not yet in the available list).\n\t */\n\tinsertMention: (\n\t\tkind: 'tool' | 'subagent',\n\t\tid: string,\n\t\tlabel?: string,\n\t) => void;\n\t/** A mention field registers its editor-backed insert here (internal). */\n\tregisterMentionField: (\n\t\tfieldKey: MentionFieldKey,\n\t\tfn: MentionInsertFn | null,\n\t) => void;\n\t/** A mention field reports focus so inserts target it (internal). */\n\tnotifyMentionFocus: (fieldKey: MentionFieldKey) => void;\n\n\t// Undo (post-removal)\n\t/** Non-null while the undo toast should be visible. */\n\tundoToast: UndoToastState | null;\n\t/** Restore the last removed tool / sub-agent (list + stripped tokens). */\n\tundoRemoval: () => void;\n\t/** Dismiss the undo toast without restoring. */\n\tdismissUndo: () => void;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/**\n\t * Backend templates for the shared-drawer tools (email / Slack), keyed by\n\t * `tool_key`. A present key drives its dynamic form + enables its tool action.\n\t */\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** Resolved per-field character limits (consumer overrides merged over defaults). */\n\tcharLimits: AgentCharLimits;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n\n\t// Sub-agent creation (Step 3 drawer)\n\t/** Persist a new sub-agent and resolve with its ref. Omit to hide the create flow. */\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/**\n\t * Step 3 registers its \"open create-sub-agent drawer\" action here so the `@`\n\t * picker's \"Create new\" row can trigger it. Pass `null` to unregister.\n\t */\n\tregisterSubAgentCreator: (fn: (() => void) | null) => void;\n\t/** Open the create-sub-agent drawer (no-op until Step 3 registers it). */\n\trequestCreateSubAgent: () => void;\n\t/**\n\t * Step 3 registers its \"open the drawer for this built-in tool action\"\n\t * (Rest API / email handover / Slack) handler here so the `@` reference picker\n\t * can trigger it. Pass `null` to unregister.\n\t */\n\tregisterToolActionHandler: (\n\t\tfn: ((source: ToolSource) => void) | null,\n\t) => void;\n\t/** Open a built-in tool action's drawer (no-op until Step 3 registers it). */\n\trequestToolAction: (source: ToolSource) => void;\n\t/** Fetch a sub-agent's editable data (Configure). Omit to hide Configure. */\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\t/** Persist edits to an existing sub-agent. */\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Optional \"Improve with AI\" for the drawer's instructions / guardrails. */\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Optional \"Improve with AI\" for the Rest API / email-handover tool drawers. */\n\tonImproveToolInstructions?: (text: string) => Promise<string>;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (\n\tvalue: AgentValue,\n\tlimits: AgentCharLimits,\n): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.custom_intent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= limits.name &&\n\t\t\tvalue.description.length <= limits.description,\n\t\ttrigger: triggerValid,\n\t\t// At least one of Instructions / Guardrails must be filled.\n\t\tresponse:\n\t\t\tvalue.instructions.trim().length > 0 ||\n\t\t\t(value.guardrail ?? '').trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tconfigToolTemplates?: Partial<Record<ConfigToolKey, ParamsBlob>>;\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tcharLimits?: Partial<AgentCharLimits>;\n\tdisableStepNavigation?: boolean;\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\tonImproveToolInstructions?: (text: string) => 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\tconfigToolTemplates,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tcharLimits: charLimitsOverride,\n\tdisableStepNavigation = true,\n\tonCreateSubAgent,\n\tonFetchSubAgent,\n\tonUpdateSubAgent,\n\tonImproveSubAgent,\n\tonImproveToolInstructions,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Latest value, so closure-captured handlers (e.g. the `@` editor's mount-time\n\t// mention onSelect) append against the current lists, not a stale snapshot.\n\tconst valueRef = useRef(value);\n\tvalueRef.current = value;\n\n\t// Bumped when a mention field is edited from OUTSIDE its editor (removing a\n\t// tool from the side list, undo), forcing the mention editors to remount.\n\tconst [mentionResetKey, setMentionResetKey] = useState(0);\n\n\t// Each mention field registers an editor-backed insert fn + reports focus, so\n\t// side-panel adds drop a chip into the last-focused field at its cursor.\n\tconst mentionInsertersRef = useRef<\n\t\tPartial<Record<MentionFieldKey, MentionInsertFn>>\n\t>({});\n\tconst lastFocusedFieldRef = useRef<MentionFieldKey>('instructions');\n\tconst registerMentionField = useCallback(\n\t\t(fieldKey: MentionFieldKey, fn: MentionInsertFn | null) => {\n\t\t\tif (fn) {\n\t\t\t\tmentionInsertersRef.current[fieldKey] = fn;\n\t\t\t} else {\n\t\t\t\tdelete mentionInsertersRef.current[fieldKey];\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst notifyMentionFocus = useCallback((fieldKey: MentionFieldKey) => {\n\t\tlastFocusedFieldRef.current = fieldKey;\n\t}, []);\n\n\t// Step 3 registers its drawer opener here; the `@` picker's \"Create new\" calls it.\n\tconst subAgentCreatorRef = useRef<(() => void) | null>(null);\n\tconst registerSubAgentCreator = useCallback((fn: (() => void) | null) => {\n\t\tsubAgentCreatorRef.current = fn;\n\t}, []);\n\tconst requestCreateSubAgent = useCallback(() => {\n\t\tsubAgentCreatorRef.current?.();\n\t}, []);\n\n\t// Step 3 registers a dispatcher that opens a built-in tool action's drawer.\n\tconst toolActionHandlerRef = useRef<((source: ToolSource) => void) | null>(\n\t\tnull,\n\t);\n\tconst registerToolActionHandler = useCallback(\n\t\t(fn: ((source: ToolSource) => void) | null) => {\n\t\t\ttoolActionHandlerRef.current = fn;\n\t\t},\n\t\t[],\n\t);\n\tconst requestToolAction = useCallback((source: ToolSource) => {\n\t\ttoolActionHandlerRef.current?.(source);\n\t}, []);\n\tconst insertMention = useCallback<MentionInsertFn>((kind, id, label) => {\n\t\tconst inserters = mentionInsertersRef.current;\n\t\tconst target =\n\t\t\tinserters[lastFocusedFieldRef.current] ?? inserters.instructions;\n\t\ttarget?.(kind, id, label);\n\t}, []);\n\n\t// Undo state for the most recent removal.\n\tconst [undoToast, setUndoToast] = useState<UndoToastState | null>(null);\n\tconst undoSnapshotRef = useRef<Partial<AgentValue> | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst addReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst v = valueRef.current;\n\t\t\tif (kind === 'tool') {\n\t\t\t\t// Custom tools (Rest API / email / Slack) track themselves on their own\n\t\t\t\t// lists; only catalog/native ids belong in `tools`. Picking an EXISTING\n\t\t\t\t// custom tool from the `@` picker must not leak its id in here — on save\n\t\t\t\t// it becomes a bogus native ref and create-agent validation rejects it.\n\t\t\t\tconst isCustom =\n\t\t\t\t\t(v.configTools ?? []).some((t) => t.id === id) ||\n\t\t\t\t\t(v.restApiTools ?? []).some((t) => t.id === id);\n\t\t\t\tif (!isCustom && !v.tools.includes(id)) {\n\t\t\t\t\tonChange({ tools: [...v.tools, id] });\n\t\t\t\t}\n\t\t\t} else if (!v.subagents.includes(id)) {\n\t\t\t\tonChange({ subagents: [...v.subagents, id] });\n\t\t\t}\n\t\t},\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\t// Tokens store the id for both kinds (a tool's id is its tool_id).\n\t\t\tconst token = kind === 'tool' ? `{{tool:${id}}}` : `{{subagent:${id}}}`;\n\t\t\tconst strip = (text: string) => text.split(token).join('');\n\n\t\t\t// Snapshot every field a removal touches, for undo. Custom tools (Rest\n\t\t\t// API / email / Slack) live on their own lists, so include them too.\n\t\t\tundoSnapshotRef.current = {\n\t\t\t\ttools: value.tools,\n\t\t\t\tsubagents: value.subagents,\n\t\t\t\tconfigTools: value.configTools,\n\t\t\t\trestApiTools: value.restApiTools,\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? {\n\t\t\t\t\t\t\t// A tool id may be a catalog tool OR an inline custom tool — drop\n\t\t\t\t\t\t\t// it from whichever list holds it (the others are no-op filters).\n\t\t\t\t\t\t\ttools: value.tools.filter((t) => t !== id),\n\t\t\t\t\t\t\tconfigTools: (value.configTools ?? []).filter((t) => t.id !== id),\n\t\t\t\t\t\t\trestApiTools: (value.restApiTools ?? []).filter(\n\t\t\t\t\t\t\t\t(t) => t.id !== id,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t }\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 ??\n\t\t\t\t\t (value.restApiTools ?? []).find((t) => t.id === id)?.name ??\n\t\t\t\t\t 'Tool'\n\t\t\t\t\t: availableSubAgents.find((s) => s.id === id)?.name ?? 'Sub-agent';\n\t\t\tundoIdRef.current += 1;\n\t\t\tsetUndoToast({\n\t\t\t\tid: undoIdRef.current,\n\t\t\t\tmessage: `${kind === 'tool' ? 'Tool' : 'Sub-agent'} \"${label}\" removed`,\n\t\t\t});\n\t\t},\n\t\t[availableTools, availableSubAgents, value, onChange],\n\t);\n\n\tconst undoRemoval = useCallback(() => {\n\t\tif (undoSnapshotRef.current) {\n\t\t\tonChange(undoSnapshotRef.current);\n\t\t\tundoSnapshotRef.current = null;\n\t\t\tsetMentionResetKey((k) => k + 1);\n\t\t}\n\t\tsetUndoToast(null);\n\t}, [onChange]);\n\n\tconst dismissUndo = useCallback(() => setUndoToast(null), []);\n\n\t// Consumer overrides merged over the built-in defaults (name 60, rest 1000).\n\tconst charLimits = useMemo<AgentCharLimits>(\n\t\t() => ({ ...AGENT_CHAR_LIMITS, ...charLimitsOverride }),\n\t\t[charLimitsOverride],\n\t);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value, charLimits), ...validationOverride }),\n\t\t[value, charLimits, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tconfigToolTemplates,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tregisterToolActionHandler,\n\t\t\trequestToolAction,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t\tonImproveToolInstructions,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\taddReference,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tconfigToolTemplates,\n\t\t\tapplicationType,\n\t\t\tcharLimits,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tregisterSubAgentCreator,\n\t\t\trequestCreateSubAgent,\n\t\t\tregisterToolActionHandler,\n\t\t\trequestToolAction,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t\tonImproveToolInstructions,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","limits","triggerValid","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","configToolTemplates","validationOverride","applicationType","charLimitsOverride","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","onImproveToolInstructions","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","valueRef","useRef","mentionResetKey","setMentionResetKey","mentionInsertersRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","subAgentCreatorRef","registerSubAgentCreator","requestCreateSubAgent","toolActionHandlerRef","registerToolActionHandler","requestToolAction","source","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","addReference","v","t","removeReference","token","strip","text","s","k","undoRemoval","dismissUndo","charLimits","useMemo","AGENT_CHAR_LIMITS","validation"],"mappings":"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"}