@bikdotai/bik-component-library 0.0.849-beta.4 → 0.0.849-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/cjs/components/agent-builder/components/AddDataPill.js +10 -0
  2. package/dist/cjs/components/agent-builder/components/AddDataPill.js.map +1 -0
  3. package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js +10 -10
  4. package/dist/cjs/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +2 -2
  6. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  7. package/dist/cjs/components/agent-builder/components/MentionEditor.js +1 -1
  8. package/dist/cjs/components/agent-builder/components/MentionEditor.js.map +1 -1
  9. package/dist/cjs/components/agent-builder/components/MentionField.js +1 -1
  10. package/dist/cjs/components/agent-builder/components/MentionField.js.map +1 -1
  11. package/dist/cjs/components/agent-builder/components/MentionPicker.js +49 -25
  12. package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
  13. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js +9 -8
  14. package/dist/cjs/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  15. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js +1 -1
  16. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  17. package/dist/cjs/components/agent-builder/components/VariableInlineField.js +56 -0
  18. package/dist/cjs/components/agent-builder/components/VariableInlineField.js.map +1 -0
  19. package/dist/cjs/components/agent-builder/components/VariableTriggerArea.js +6 -5
  20. package/dist/cjs/components/agent-builder/components/VariableTriggerArea.js.map +1 -1
  21. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js +4 -4
  22. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  23. package/dist/cjs/editor/BikEditor.js +1 -1
  24. package/dist/cjs/editor/BikEditor.js.map +1 -1
  25. package/dist/cjs/editor/BikEditor.styles.js +5 -3
  26. package/dist/cjs/editor/BikEditor.styles.js.map +1 -1
  27. package/dist/cjs/editor/BikEditor.types.js.map +1 -1
  28. package/dist/esm/components/agent-builder/components/AddDataPill.d.ts +18 -0
  29. package/dist/esm/components/agent-builder/components/AddDataPill.js +32 -0
  30. package/dist/esm/components/agent-builder/components/AddDataPill.js.map +1 -0
  31. package/dist/esm/components/agent-builder/components/ConfigToolPanel.js +165 -148
  32. package/dist/esm/components/agent-builder/components/ConfigToolPanel.js.map +1 -1
  33. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +15 -13
  34. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -1
  35. package/dist/esm/components/agent-builder/components/MentionEditor.d.ts +7 -2
  36. package/dist/esm/components/agent-builder/components/MentionEditor.js +119 -102
  37. package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -1
  38. package/dist/esm/components/agent-builder/components/MentionField.js +30 -29
  39. package/dist/esm/components/agent-builder/components/MentionField.js.map +1 -1
  40. package/dist/esm/components/agent-builder/components/MentionPicker.js +199 -165
  41. package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
  42. package/dist/esm/components/agent-builder/components/RestApiToolPanel.d.ts +3 -2
  43. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js +160 -193
  44. package/dist/esm/components/agent-builder/components/RestApiToolPanel.js.map +1 -1
  45. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js +20 -19
  46. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  47. package/dist/esm/components/agent-builder/components/VariableInlineField.d.ts +26 -0
  48. package/dist/esm/components/agent-builder/components/VariableInlineField.js +142 -0
  49. package/dist/esm/components/agent-builder/components/VariableInlineField.js.map +1 -0
  50. package/dist/esm/components/agent-builder/components/VariableTriggerArea.d.ts +19 -0
  51. package/dist/esm/components/agent-builder/components/VariableTriggerArea.js +113 -72
  52. package/dist/esm/components/agent-builder/components/VariableTriggerArea.js.map +1 -1
  53. package/dist/esm/components/agent-builder/utils/mentionSerialization.js +26 -20
  54. package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  55. package/dist/esm/editor/BikEditor.js +24 -18
  56. package/dist/esm/editor/BikEditor.js.map +1 -1
  57. package/dist/esm/editor/BikEditor.styles.js +5 -3
  58. package/dist/esm/editor/BikEditor.styles.js.map +1 -1
  59. package/dist/esm/editor/BikEditor.types.d.ts +9 -0
  60. package/dist/esm/editor/BikEditor.types.js.map +1 -1
  61. package/package.json +2 -1
@@ -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 type { VariableListInterfaceV3 } from '../../variable-picker-v3/model';\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\t/** Variable catalog for the editors' `@` picker \"Variables\" view. */\n\tvariablesData?: VariableListInterfaceV3[];\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\tvariablesData,\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\tvariablesData={variablesData}\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\tvariablesData={variablesData}\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\tpickerOpensUp\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\tvariablesData={variablesData}\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\tvariablesData={variablesData}\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","variablesData","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","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 type { VariableListInterfaceV3 } from '../../variable-picker-v3/model';\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\t/** Variable catalog for the editors' `@` picker \"Variables\" view. */\n\tvariablesData?: VariableListInterfaceV3[];\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\tvariablesData,\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\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\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\tvariablesData={variablesData}\n\t\t\t\t\taddDataButton\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\tpickerOpensUp\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\tvariablesData={variablesData}\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\tvariablesData={variablesData}\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","variablesData","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","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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"}
@@ -37,10 +37,15 @@ interface MentionEditorProps {
37
37
  onConnectIntegration?: (source: ToolSource) => void;
38
38
  /**
39
39
  * Variable catalog for the `@` picker's "Variables" view. Picking one inserts
40
- * a `Variable: <name>` mention chip at the cursor, persisted as a
41
- * `{{variable:<name>}}` token. Omit to hide the category.
40
+ * a `{{<name>}}` mention chip (rendered as the purple raw token) at the
41
+ * cursor, persisted as `{{variable:<name>}}`. Omit to hide the category.
42
42
  */
43
43
  variablesData?: VariableListInterfaceV3[];
44
+ /**
45
+ * Show a floating "+ Add data" pill at the field's bottom-right while it is
46
+ * focused. Clicking it opens the same `@` reference menu at the cursor.
47
+ */
48
+ addDataButton?: boolean;
44
49
  /** Optional action(s) rendered inside the shell, below the editor. */
45
50
  action?: React.ReactNode;
46
51
  'data-test'?: string;
@@ -1,127 +1,144 @@
1
- import { jsxs as r, jsx as a } from "react/jsx-runtime";
2
- import { useRef as F, useState as _, useCallback as b, useEffect as S, useMemo as G } from "react";
3
- import { TitleSmall as J, BodyCaption as P } from "../../TypographyStyle.js";
4
- import { COLORS as h } from "../../../constants/Theme.js";
5
- import { FieldBlock as Y, FieldLabelRow as q, AiTextAreaShell as z } from "../AgentBuilder.styled.js";
6
- import { AGENT_EDITOR_STYLE as Q } from "../constants/editorStyle.js";
7
- import { variableTokenName as U, buildMentionHtml as g, instructionsToEditorHtml as W, buildVariableMentionItems as X, editorDocToInstructions as Z } from "../utils/mentionSerialization.js";
8
- import { MentionPicker as v } from "./MentionPicker.js";
9
- import { BikEditor as I } from "../../../editor/BikEditor.js";
10
- const at = ({
11
- label: C,
12
- value: l,
13
- onChange: T,
1
+ import { jsxs as r, jsx as l } from "react/jsx-runtime";
2
+ import { useRef as G, useState as h, useCallback as g, useEffect as C, useMemo as J } from "react";
3
+ import { TitleSmall as Y, BodyCaption as q } from "../../TypographyStyle.js";
4
+ import { COLORS as T } from "../../../constants/Theme.js";
5
+ import { FieldBlock as z, FieldLabelRow as Q, AiTextAreaShell as U } from "../AgentBuilder.styled.js";
6
+ import { AGENT_EDITOR_STYLE as W } from "../constants/editorStyle.js";
7
+ import { variableTokenName as X, buildMentionHtml as k, instructionsToEditorHtml as Z, buildVariableMentionItems as I, editorDocToInstructions as K } from "../utils/mentionSerialization.js";
8
+ import { AddDataPill as tt } from "./AddDataPill.js";
9
+ import { MentionPicker as nt } from "./MentionPicker.js";
10
+ import { BikEditor as ot } from "../../../editor/BikEditor.js";
11
+ const ft = ({
12
+ label: x,
13
+ value: c,
14
+ onChange: E,
14
15
  maxLength: s,
15
- placeholder: k,
16
- minHeight: x = "200px",
17
- resetKey: c,
18
- mentionItems: o,
19
- tools: E,
20
- onMentionSelect: H,
21
- onFocus: M,
22
- registerInsert: e,
23
- onCreateSubAgent: O,
24
- toolActions: R,
25
- integrationStatus: y,
26
- onConnectIntegration: L,
16
+ placeholder: M,
17
+ minHeight: O = "200px",
18
+ resetKey: a,
19
+ mentionItems: e,
20
+ tools: H,
21
+ onMentionSelect: R,
22
+ onFocus: y,
23
+ registerInsert: i,
24
+ onCreateSubAgent: A,
25
+ toolActions: B,
26
+ integrationStatus: D,
27
+ onConnectIntegration: F,
27
28
  variablesData: d,
29
+ addDataButton: L,
28
30
  action: N,
29
31
  ...V
30
32
  }) => {
31
- const i = F(null), [A, m] = _(l.length), B = b((t) => {
32
- const n = U(t.actualValue);
33
- i.current?.insertInlineContent(
34
- `${g(
35
- n,
36
- `Variable: ${t.displayName}`,
37
- "variable"
38
- )}&nbsp;`
33
+ const o = G(null), [$, u] = h(c.length), [m, f] = h(!1), j = g((n) => {
34
+ const t = X(n.actualValue);
35
+ o.current?.insertInlineContent(
36
+ `${k(t, `{{${t}}}`, "variable")}&nbsp;`
39
37
  );
40
- }, []), u = b(
41
- (t, n, $) => {
42
- const f = i.current;
43
- if (!f)
38
+ }, []), p = g(
39
+ (n, t, P) => {
40
+ const b = o.current;
41
+ if (!b)
44
42
  return;
45
- const j = o.find(
46
- (p) => String(p.id) === String(n) && p.meta?.kind === t
47
- ), w = $ ?? j?.label ?? n;
48
- f.insertInlineContent(
49
- `${g(String(n), w, t)}&nbsp;`
43
+ const _ = e.find(
44
+ (S) => String(S.id) === String(t) && S.meta?.kind === n
45
+ ), v = P ?? _?.label ?? t;
46
+ b.insertInlineContent(
47
+ `${k(String(t), v, n)}&nbsp;`
50
48
  );
51
49
  },
52
- [o]
50
+ [e]
53
51
  );
54
- S(() => {
55
- if (e)
56
- return e(u), () => e(null);
57
- }, [e, u]);
58
- const D = G(
59
- () => W(l, [
60
- ...o,
61
- ...X(d)
52
+ C(() => {
53
+ if (i)
54
+ return i(p), () => i(null);
55
+ }, [i, p]);
56
+ const w = J(
57
+ () => Z(c, [
58
+ ...e,
59
+ ...I(d)
62
60
  ]),
63
61
  // eslint-disable-next-line react-hooks/exhaustive-deps
64
- [c]
62
+ [a]
65
63
  );
66
- return S(
67
- () => m(l.length),
64
+ return C(
65
+ () => u(c.length),
68
66
  // eslint-disable-next-line react-hooks/exhaustive-deps
69
- [c]
70
- ), /* @__PURE__ */ r(Y, { children: [
71
- /* @__PURE__ */ r(q, { children: [
72
- /* @__PURE__ */ a(J, { color: h.content.primary, children: C }),
73
- /* @__PURE__ */ r(P, { color: h.content.secondary, children: [
74
- A,
67
+ [a]
68
+ ), /* @__PURE__ */ r(z, { children: [
69
+ /* @__PURE__ */ r(Q, { children: [
70
+ /* @__PURE__ */ l(Y, { color: T.content.primary, children: x }),
71
+ /* @__PURE__ */ r(q, { color: T.content.secondary, children: [
72
+ $,
75
73
  "/",
76
74
  s
77
75
  ] })
78
76
  ] }),
79
- /* @__PURE__ */ r(z, { minHeight: x, "data-test": V["data-test"], children: [
80
- /* @__PURE__ */ a(
81
- I,
82
- {
83
- ref: i,
84
- initialContent: D,
85
- placeholder: k,
86
- characterLimit: s,
87
- minHeight: "120px",
88
- maxHeight: "320px",
89
- style: { border: "none" },
90
- editorStyle: Q,
91
- onFocus: M,
92
- mentions: {
93
- agents: o,
94
- removeTriggerOnDismiss: !0,
95
- renderDropdown: (t) => /* @__PURE__ */ a(
96
- v,
97
- {
98
- ...t,
99
- onCreateSubAgent: O,
100
- toolActions: R,
101
- integrationStatus: y,
102
- onConnectIntegration: L,
103
- variablesData: d,
104
- onSelectVariable: B
77
+ /* @__PURE__ */ r(
78
+ U,
79
+ {
80
+ minHeight: O,
81
+ focused: m,
82
+ style: { position: "relative" },
83
+ "data-test": V["data-test"],
84
+ children: [
85
+ /* @__PURE__ */ l(
86
+ ot,
87
+ {
88
+ ref: o,
89
+ initialContent: w,
90
+ placeholder: M,
91
+ characterLimit: s,
92
+ minHeight: "120px",
93
+ maxHeight: "320px",
94
+ style: { border: "none" },
95
+ editorStyle: W,
96
+ onFocus: () => {
97
+ f(!0), y?.();
98
+ },
99
+ onBlur: () => f(!1),
100
+ mentions: {
101
+ agents: e,
102
+ removeTriggerOnDismiss: !0,
103
+ renderDropdown: (n) => /* @__PURE__ */ l(
104
+ nt,
105
+ {
106
+ ...n,
107
+ onCreateSubAgent: A,
108
+ toolActions: B,
109
+ integrationStatus: D,
110
+ onConnectIntegration: F,
111
+ variablesData: d,
112
+ onSelectVariable: j
113
+ }
114
+ ),
115
+ onSelect: (n) => {
116
+ const t = n.meta?.kind;
117
+ (t === "tool" || t === "subagent") && R?.(t, String(n.id));
118
+ }
119
+ },
120
+ onChange: (n) => {
121
+ u(n.characterCount);
122
+ const t = o.current?.getJSON() ?? null;
123
+ E(K(t, H));
105
124
  }
106
- ),
107
- onSelect: (t) => {
108
- const n = t.meta?.kind;
109
- (n === "tool" || n === "subagent") && H?.(n, String(t.id));
125
+ },
126
+ a
127
+ ),
128
+ N,
129
+ L && m && /* @__PURE__ */ l(
130
+ tt,
131
+ {
132
+ "data-test": "mention-add-data",
133
+ onOpen: () => o.current?.actions.openMentionMenu("@")
110
134
  }
111
- },
112
- onChange: (t) => {
113
- m(t.characterCount);
114
- const n = i.current?.getJSON() ?? null;
115
- T(Z(n, E));
116
- }
117
- },
118
- c
119
- ),
120
- N
121
- ] })
135
+ )
136
+ ]
137
+ }
138
+ )
122
139
  ] });
123
140
  };
124
141
  export {
125
- at as MentionEditor
142
+ ft as MentionEditor
126
143
  };
127
144
  //# sourceMappingURL=MentionEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MentionEditor.js","sources":["../../../../../src/components/agent-builder/components/MentionEditor.tsx"],"sourcesContent":["import { BikEditor, BikEditorRef, MentionItem } from '@src/editor';\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport { BodyCaption, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport type {\n\tVariableListInterfaceV3,\n\tVariableV3,\n} from '../../variable-picker-v3/model';\nimport { AgentTool } from '../AgentBuilder.model';\nimport {\n\tAiTextAreaShell,\n\tFieldBlock,\n\tFieldLabelRow,\n} from '../AgentBuilder.styled';\nimport { AGENT_EDITOR_STYLE } from '../constants/editorStyle';\nimport type { ToolAction, ToolSource } from '../constants/tools';\nimport {\n\tbuildMentionHtml,\n\tbuildVariableMentionItems,\n\teditorDocToInstructions,\n\tinstructionsToEditorHtml,\n\tMentionKindMeta,\n\tvariableTokenName,\n} from '../utils/mentionSerialization';\nimport { MentionPicker } from './MentionPicker';\n\ntype InsertFn = (kind: 'tool' | 'subagent', id: string, label?: string) => void;\n\ninterface MentionEditorProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (text: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\t/** Changing this remounts the editor with fresh content. */\n\tresetKey?: string | number;\n\t/** Items shown in the `@` picker (tools, and sub-agents where allowed). */\n\tmentionItems: MentionItem[];\n\t/** Tools used to serialise mention nodes back to `{{tool:KEY}}`. */\n\ttools: AgentTool[];\n\t/** Called when an item is picked from the `@` menu (to attach it upstream). */\n\tonMentionSelect?: (kind: 'tool' | 'subagent', id: string) => void;\n\tonFocus?: () => void;\n\t/** Receives an insert-at-cursor fn (and null on unmount) for side-panel adds. */\n\tregisterInsert?: (fn: InsertFn | null) => void;\n\t/**\n\t * When set, the `@` picker's Sub-agent view shows a \"Create new\" row that calls\n\t * this (opens the create-sub-agent drawer). Omit to hide it (e.g. the drawer's\n\t * own editors, which can't nest sub-agents).\n\t */\n\tonCreateSubAgent?: () => void;\n\t/**\n\t * Built-in tool actions (Rest API / Handover to email) shown in the `@` picker's\n\t * Tools view. Picking one opens its drawer instead of inserting a mention.\n\t */\n\ttoolActions?: ToolAction[];\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\tonConnectIntegration?: (source: ToolSource) => void;\n\t/**\n\t * Variable catalog for the `@` picker's \"Variables\" view. Picking one inserts\n\t * a `Variable: <name>` mention chip at the cursor, persisted as a\n\t * `{{variable:<name>}}` token. Omit to hide the category.\n\t */\n\tvariablesData?: VariableListInterfaceV3[];\n\t/** Optional action(s) rendered inside the shell, below the editor. */\n\taction?: React.ReactNode;\n\t'data-test'?: string;\n}\n\n/**\n * Presentational BikEditor field with `@` mentions. Stores firebase token text\n * (`{{tool:KEY}}` / `{{subagent:ID}}`). Context-free — both the builder's\n * Step-3 fields and the create-sub-agent drawer compose it.\n */\nexport const MentionEditor: React.FC<MentionEditorProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight = '200px',\n\tresetKey,\n\tmentionItems,\n\ttools,\n\tonMentionSelect,\n\tonFocus,\n\tregisterInsert,\n\tonCreateSubAgent,\n\ttoolActions,\n\tintegrationStatus,\n\tonConnectIntegration,\n\tvariablesData,\n\taction,\n\t...rest\n}) => {\n\tconst editorRef = useRef<BikEditorRef>(null);\n\tconst [count, setCount] = useState(value.length);\n\n\t// The picker dismissed itself already (stripping the \"@\" + query) — drop a\n\t// `Variable: <name>` mention chip at the cursor, same shape as tool /\n\t// sub-agent chips. `editorDocToInstructions` serializes it back to a\n\t// `{{variable:<name>}}` token.\n\tconst onSelectVariable = useCallback((variable: VariableV3) => {\n\t\tconst name = variableTokenName(variable.actualValue);\n\t\teditorRef.current?.insertInlineContent(\n\t\t\t`${buildMentionHtml(\n\t\t\t\tname,\n\t\t\t\t`Variable: ${variable.displayName}`,\n\t\t\t\t'variable',\n\t\t\t)}&nbsp;`,\n\t\t);\n\t}, []);\n\n\tconst insert = useCallback<InsertFn>(\n\t\t(kind, id, overrideLabel) => {\n\t\t\tconst editor = editorRef.current;\n\t\t\tif (!editor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = mentionItems.find(\n\t\t\t\t(m) =>\n\t\t\t\t\tString(m.id) === String(id) &&\n\t\t\t\t\t(m.meta as unknown as MentionKindMeta | undefined)?.kind === kind,\n\t\t\t);\n\t\t\tconst finalLabel = overrideLabel ?? item?.label ?? id;\n\t\t\teditor.insertInlineContent(\n\t\t\t\t`${buildMentionHtml(String(id), finalLabel, kind)}&nbsp;`,\n\t\t\t);\n\t\t},\n\t\t[mentionItems],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!registerInsert) {\n\t\t\treturn;\n\t\t}\n\t\tregisterInsert(insert);\n\t\treturn () => registerInsert(null);\n\t}, [registerInsert, insert]);\n\n\t// Mount-only initial HTML; recomputed (editor remounted via key) on resetKey.\n\t// Variable items are merged in so stored `{{name}}` tokens rehydrate as chips.\n\tconst initialHtml = useMemo(\n\t\t() =>\n\t\t\tinstructionsToEditorHtml(value, [\n\t\t\t\t...mentionItems,\n\t\t\t\t...buildVariableMentionItems(variablesData),\n\t\t\t]),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[resetKey],\n\t);\n\n\tuseEffect(\n\t\t() => setCount(value.length),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[resetKey],\n\t);\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<FieldLabelRow>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t{count}/{maxLength}\n\t\t\t\t</BodyCaption>\n\t\t\t</FieldLabelRow>\n\n\t\t\t<AiTextAreaShell minHeight={minHeight} data-test={rest['data-test']}>\n\t\t\t\t<BikEditor\n\t\t\t\t\tkey={resetKey}\n\t\t\t\t\tref={editorRef}\n\t\t\t\t\tinitialContent={initialHtml}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t// Soft limit: blocks typing past the cap but lets a paste through\n\t\t\t\t\t// (overflow rendered grey) instead of rejecting the whole paste.\n\t\t\t\t\tcharacterLimit={maxLength}\n\t\t\t\t\tminHeight=\"120px\"\n\t\t\t\t\tmaxHeight=\"320px\"\n\t\t\t\t\tstyle={{ border: 'none' }}\n\t\t\t\t\teditorStyle={AGENT_EDITOR_STYLE}\n\t\t\t\t\tonFocus={onFocus}\n\t\t\t\t\tmentions={{\n\t\t\t\t\t\tagents: mentionItems,\n\t\t\t\t\t\tremoveTriggerOnDismiss: true,\n\t\t\t\t\t\trenderDropdown: (props) => (\n\t\t\t\t\t\t\t<MentionPicker\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tonCreateSubAgent={onCreateSubAgent}\n\t\t\t\t\t\t\t\ttoolActions={toolActions}\n\t\t\t\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\t\t\t\tonSelectVariable={onSelectVariable}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tonSelect: (item) => {\n\t\t\t\t\t\t\tconst kind = (item.meta as unknown as MentionKindMeta | undefined)\n\t\t\t\t\t\t\t\t?.kind;\n\t\t\t\t\t\t\t// Variables never come through this path (they use the embedded\n\t\t\t\t\t\t\t// picker's onSelectVariable) and have nothing to attach upstream.\n\t\t\t\t\t\t\tif (kind === 'tool' || kind === 'subagent') {\n\t\t\t\t\t\t\t\tonMentionSelect?.(kind, String(item.id));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={(snapshot) => {\n\t\t\t\t\t\tsetCount(snapshot.characterCount);\n\t\t\t\t\t\tconst doc = editorRef.current?.getJSON() ?? null;\n\t\t\t\t\t\tonChange(editorDocToInstructions(doc, tools));\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{action}\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n"],"names":["MentionEditor","label","value","onChange","maxLength","placeholder","minHeight","resetKey","mentionItems","tools","onMentionSelect","onFocus","registerInsert","onCreateSubAgent","toolActions","integrationStatus","onConnectIntegration","variablesData","action","rest","editorRef","useRef","count","setCount","useState","onSelectVariable","useCallback","variable","name","variableTokenName","buildMentionHtml","insert","kind","id","overrideLabel","editor","item","m","finalLabel","useEffect","initialHtml","useMemo","instructionsToEditorHtml","buildVariableMentionItems","FieldBlock","jsxs","FieldLabelRow","jsx","TitleSmall","COLORS","BodyCaption","AiTextAreaShell","BikEditor","AGENT_EDITOR_STYLE","props","MentionPicker","snapshot","doc","editorDocToInstructions"],"mappings":"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"}
1
+ {"version":3,"file":"MentionEditor.js","sources":["../../../../../src/components/agent-builder/components/MentionEditor.tsx"],"sourcesContent":["import { BikEditor, BikEditorRef, MentionItem } from '@src/editor';\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport { BodyCaption, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport type {\n\tVariableListInterfaceV3,\n\tVariableV3,\n} from '../../variable-picker-v3/model';\nimport { AgentTool } from '../AgentBuilder.model';\nimport {\n\tAiTextAreaShell,\n\tFieldBlock,\n\tFieldLabelRow,\n} from '../AgentBuilder.styled';\nimport { AGENT_EDITOR_STYLE } from '../constants/editorStyle';\nimport type { ToolAction, ToolSource } from '../constants/tools';\nimport {\n\tbuildMentionHtml,\n\tbuildVariableMentionItems,\n\teditorDocToInstructions,\n\tinstructionsToEditorHtml,\n\tMentionKindMeta,\n\tvariableTokenName,\n} from '../utils/mentionSerialization';\nimport { AddDataPill } from './AddDataPill';\nimport { MentionPicker } from './MentionPicker';\n\ntype InsertFn = (kind: 'tool' | 'subagent', id: string, label?: string) => void;\n\ninterface MentionEditorProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (text: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\t/** Changing this remounts the editor with fresh content. */\n\tresetKey?: string | number;\n\t/** Items shown in the `@` picker (tools, and sub-agents where allowed). */\n\tmentionItems: MentionItem[];\n\t/** Tools used to serialise mention nodes back to `{{tool:KEY}}`. */\n\ttools: AgentTool[];\n\t/** Called when an item is picked from the `@` menu (to attach it upstream). */\n\tonMentionSelect?: (kind: 'tool' | 'subagent', id: string) => void;\n\tonFocus?: () => void;\n\t/** Receives an insert-at-cursor fn (and null on unmount) for side-panel adds. */\n\tregisterInsert?: (fn: InsertFn | null) => void;\n\t/**\n\t * When set, the `@` picker's Sub-agent view shows a \"Create new\" row that calls\n\t * this (opens the create-sub-agent drawer). Omit to hide it (e.g. the drawer's\n\t * own editors, which can't nest sub-agents).\n\t */\n\tonCreateSubAgent?: () => void;\n\t/**\n\t * Built-in tool actions (Rest API / Handover to email) shown in the `@` picker's\n\t * Tools view. Picking one opens its drawer instead of inserting a mention.\n\t */\n\ttoolActions?: ToolAction[];\n\tintegrationStatus?: Partial<Record<ToolSource, boolean>>;\n\tonConnectIntegration?: (source: ToolSource) => void;\n\t/**\n\t * Variable catalog for the `@` picker's \"Variables\" view. Picking one inserts\n\t * a `{{<name>}}` mention chip (rendered as the purple raw token) at the\n\t * cursor, persisted as `{{variable:<name>}}`. Omit to hide the category.\n\t */\n\tvariablesData?: VariableListInterfaceV3[];\n\t/**\n\t * Show a floating \"+ Add data\" pill at the field's bottom-right while it is\n\t * focused. Clicking it opens the same `@` reference menu at the cursor.\n\t */\n\taddDataButton?: boolean;\n\t/** Optional action(s) rendered inside the shell, below the editor. */\n\taction?: React.ReactNode;\n\t'data-test'?: string;\n}\n\n/**\n * Presentational BikEditor field with `@` mentions. Stores firebase token text\n * (`{{tool:KEY}}` / `{{subagent:ID}}`). Context-free — both the builder's\n * Step-3 fields and the create-sub-agent drawer compose it.\n */\nexport const MentionEditor: React.FC<MentionEditorProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight = '200px',\n\tresetKey,\n\tmentionItems,\n\ttools,\n\tonMentionSelect,\n\tonFocus,\n\tregisterInsert,\n\tonCreateSubAgent,\n\ttoolActions,\n\tintegrationStatus,\n\tonConnectIntegration,\n\tvariablesData,\n\taddDataButton,\n\taction,\n\t...rest\n}) => {\n\tconst editorRef = useRef<BikEditorRef>(null);\n\tconst [count, setCount] = useState(value.length);\n\tconst [focused, setFocused] = useState(false);\n\n\t// The picker dismissed itself already (stripping the \"@\" + query) — drop a\n\t// mention chip at the cursor whose text is the raw token (`{{<name>}}`,\n\t// rendered purple by the editor). `editorDocToInstructions` serializes it\n\t// back to a `{{variable:<name>}}` token.\n\tconst onSelectVariable = useCallback((variable: VariableV3) => {\n\t\tconst name = variableTokenName(variable.actualValue);\n\t\teditorRef.current?.insertInlineContent(\n\t\t\t`${buildMentionHtml(name, `{{${name}}}`, 'variable')}&nbsp;`,\n\t\t);\n\t}, []);\n\n\tconst insert = useCallback<InsertFn>(\n\t\t(kind, id, overrideLabel) => {\n\t\t\tconst editor = editorRef.current;\n\t\t\tif (!editor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst item = mentionItems.find(\n\t\t\t\t(m) =>\n\t\t\t\t\tString(m.id) === String(id) &&\n\t\t\t\t\t(m.meta as unknown as MentionKindMeta | undefined)?.kind === kind,\n\t\t\t);\n\t\t\tconst finalLabel = overrideLabel ?? item?.label ?? id;\n\t\t\teditor.insertInlineContent(\n\t\t\t\t`${buildMentionHtml(String(id), finalLabel, kind)}&nbsp;`,\n\t\t\t);\n\t\t},\n\t\t[mentionItems],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!registerInsert) {\n\t\t\treturn;\n\t\t}\n\t\tregisterInsert(insert);\n\t\treturn () => registerInsert(null);\n\t}, [registerInsert, insert]);\n\n\t// Mount-only initial HTML; recomputed (editor remounted via key) on resetKey.\n\t// Variable items are merged in so stored `{{name}}` tokens rehydrate as chips.\n\tconst initialHtml = useMemo(\n\t\t() =>\n\t\t\tinstructionsToEditorHtml(value, [\n\t\t\t\t...mentionItems,\n\t\t\t\t...buildVariableMentionItems(variablesData),\n\t\t\t]),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[resetKey],\n\t);\n\n\tuseEffect(\n\t\t() => setCount(value.length),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[resetKey],\n\t);\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<FieldLabelRow>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t{count}/{maxLength}\n\t\t\t\t</BodyCaption>\n\t\t\t</FieldLabelRow>\n\n\t\t\t<AiTextAreaShell\n\t\t\t\tminHeight={minHeight}\n\t\t\t\tfocused={focused}\n\t\t\t\t// Anchors the floating \"+ Add data\" pill to the shell's corner.\n\t\t\t\tstyle={{ position: 'relative' }}\n\t\t\t\tdata-test={rest['data-test']}\n\t\t\t>\n\t\t\t\t<BikEditor\n\t\t\t\t\tkey={resetKey}\n\t\t\t\t\tref={editorRef}\n\t\t\t\t\tinitialContent={initialHtml}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t// Soft limit: blocks typing past the cap but lets a paste through\n\t\t\t\t\t// (overflow rendered grey) instead of rejecting the whole paste.\n\t\t\t\t\tcharacterLimit={maxLength}\n\t\t\t\t\tminHeight=\"120px\"\n\t\t\t\t\tmaxHeight=\"320px\"\n\t\t\t\t\tstyle={{ border: 'none' }}\n\t\t\t\t\teditorStyle={AGENT_EDITOR_STYLE}\n\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\tsetFocused(true);\n\t\t\t\t\t\tonFocus?.();\n\t\t\t\t\t}}\n\t\t\t\t\tonBlur={() => setFocused(false)}\n\t\t\t\t\tmentions={{\n\t\t\t\t\t\tagents: mentionItems,\n\t\t\t\t\t\tremoveTriggerOnDismiss: true,\n\t\t\t\t\t\trenderDropdown: (props) => (\n\t\t\t\t\t\t\t<MentionPicker\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tonCreateSubAgent={onCreateSubAgent}\n\t\t\t\t\t\t\t\ttoolActions={toolActions}\n\t\t\t\t\t\t\t\tintegrationStatus={integrationStatus}\n\t\t\t\t\t\t\t\tonConnectIntegration={onConnectIntegration}\n\t\t\t\t\t\t\t\tvariablesData={variablesData}\n\t\t\t\t\t\t\t\tonSelectVariable={onSelectVariable}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tonSelect: (item) => {\n\t\t\t\t\t\t\tconst kind = (item.meta as unknown as MentionKindMeta | undefined)\n\t\t\t\t\t\t\t\t?.kind;\n\t\t\t\t\t\t\t// Variables never come through this path (they use the embedded\n\t\t\t\t\t\t\t// picker's onSelectVariable) and have nothing to attach upstream.\n\t\t\t\t\t\t\tif (kind === 'tool' || kind === 'subagent') {\n\t\t\t\t\t\t\t\tonMentionSelect?.(kind, String(item.id));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={(snapshot) => {\n\t\t\t\t\t\tsetCount(snapshot.characterCount);\n\t\t\t\t\t\tconst doc = editorRef.current?.getJSON() ?? null;\n\t\t\t\t\t\tonChange(editorDocToInstructions(doc, tools));\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{action}\n\t\t\t\t{addDataButton && focused && (\n\t\t\t\t\t<AddDataPill\n\t\t\t\t\t\tdata-test=\"mention-add-data\"\n\t\t\t\t\t\tonOpen={() => editorRef.current?.actions.openMentionMenu('@')}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n"],"names":["MentionEditor","label","value","onChange","maxLength","placeholder","minHeight","resetKey","mentionItems","tools","onMentionSelect","onFocus","registerInsert","onCreateSubAgent","toolActions","integrationStatus","onConnectIntegration","variablesData","addDataButton","action","rest","editorRef","useRef","count","setCount","useState","focused","setFocused","onSelectVariable","useCallback","variable","name","variableTokenName","buildMentionHtml","insert","kind","id","overrideLabel","editor","item","m","finalLabel","useEffect","initialHtml","useMemo","instructionsToEditorHtml","buildVariableMentionItems","FieldBlock","jsxs","FieldLabelRow","jsx","TitleSmall","COLORS","BodyCaption","AiTextAreaShell","BikEditor","AGENT_EDITOR_STYLE","props","MentionPicker","snapshot","doc","editorDocToInstructions","AddDataPill"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { jsx as j } from "react/jsx-runtime";
1
+ import { jsx as D } from "react/jsx-runtime";
2
2
  import { useMemo as p, useCallback as g } from "react";
3
- import { useAgentBuilderContext as k } from "../context/AgentBuilderContext.js";
4
- import { buildAgentMentionItems as B, appTypeLabel as D, buildCustomToolMentionItems as E } from "../utils/mentionSerialization.js";
3
+ import { useAgentBuilderContext as R } from "../context/AgentBuilderContext.js";
4
+ import { buildAgentMentionItems as j, appTypeLabel as k, buildCustomToolMentionItems as E } from "../utils/mentionSerialization.js";
5
5
  import { buildToolActions as L } from "../utils/toolActions.js";
6
6
  import { MentionEditor as w } from "./MentionEditor.js";
7
7
  const O = ({
8
- fieldKey: o,
8
+ fieldKey: t,
9
9
  label: b,
10
10
  placeholder: T,
11
11
  maxLength: A,
@@ -13,78 +13,79 @@ const O = ({
13
13
  ...C
14
14
  }) => {
15
15
  const {
16
- value: t,
16
+ value: o,
17
17
  patch: M,
18
- addReference: r,
18
+ addReference: a,
19
19
  availableTools: n,
20
- availableSubAgents: a,
20
+ availableSubAgents: r,
21
21
  applicationType: l,
22
22
  mentionResetKey: f,
23
- registerMentionField: c,
23
+ registerMentionField: u,
24
24
  notifyMentionFocus: v,
25
25
  onCreateSubAgent: S,
26
26
  requestCreateSubAgent: I,
27
- requestToolAction: m,
28
- configToolTemplates: u,
27
+ requestToolAction: c,
28
+ configToolTemplates: m,
29
29
  integrationStatus: s,
30
30
  onConnectIntegration: i,
31
31
  variablesData: F
32
- } = k(), x = p(
32
+ } = R(), x = p(
33
33
  () => [
34
- ...B(
34
+ ...j(
35
35
  n,
36
- a,
37
- D(l)
36
+ r,
37
+ k(l)
38
38
  ),
39
- ...E(t.configTools, t.restApiTools)
39
+ ...E(o.configTools, o.restApiTools)
40
40
  ],
41
41
  [
42
42
  n,
43
- a,
43
+ r,
44
44
  l,
45
- t.configTools,
46
- t.restApiTools
45
+ o.configTools,
46
+ o.restApiTools
47
47
  ]
48
48
  ), $ = p(
49
49
  () => L(
50
- u,
51
50
  m,
51
+ c,
52
52
  s,
53
53
  i
54
54
  ),
55
55
  [
56
+ c,
56
57
  m,
57
- u,
58
58
  s,
59
59
  i
60
60
  ]
61
61
  ), h = g(
62
- (e) => c(o, e),
63
- [c, o]
62
+ (e) => u(t, e),
63
+ [u, t]
64
64
  ), q = g(
65
- (e, R) => r(e, R),
66
- [r]
65
+ (e, B) => a(e, B),
66
+ [a]
67
67
  );
68
- return /* @__PURE__ */ j(
68
+ return /* @__PURE__ */ D(
69
69
  w,
70
70
  {
71
71
  label: b,
72
- value: t[o] ?? "",
73
- onChange: (e) => M({ [o]: e }),
72
+ value: o[t] ?? "",
73
+ onChange: (e) => M({ [t]: e }),
74
74
  maxLength: A,
75
75
  placeholder: T,
76
76
  minHeight: d,
77
- resetKey: `${t.id}:${o}:${f}`,
77
+ resetKey: `${o.id}:${t}:${f}`,
78
78
  mentionItems: x,
79
79
  tools: n,
80
80
  onMentionSelect: q,
81
- onFocus: () => v(o),
81
+ onFocus: () => v(t),
82
82
  registerInsert: h,
83
83
  onCreateSubAgent: S ? I : void 0,
84
84
  toolActions: $,
85
85
  integrationStatus: s,
86
86
  onConnectIntegration: i,
87
87
  variablesData: F,
88
+ addDataButton: !0,
88
89
  "data-test": C["data-test"]
89
90
  }
90
91
  );