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

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 (90) hide show
  1. package/dist/cjs/components/agent-builder/AgentBuilder.js +1 -1
  2. package/dist/cjs/components/agent-builder/AgentBuilder.js.map +1 -1
  3. package/dist/cjs/components/agent-builder/AgentBuilder.styled.js +152 -60
  4. package/dist/cjs/components/agent-builder/AgentBuilder.styled.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js +2 -0
  6. package/dist/cjs/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -0
  7. package/dist/cjs/components/agent-builder/components/MentionEditor.js +2 -0
  8. package/dist/cjs/components/agent-builder/components/MentionEditor.js.map +1 -0
  9. package/dist/cjs/components/agent-builder/components/MentionField.js +2 -0
  10. package/dist/cjs/components/agent-builder/components/MentionField.js.map +1 -0
  11. package/dist/cjs/components/agent-builder/components/MentionPicker.js +12 -12
  12. package/dist/cjs/components/agent-builder/components/MentionPicker.js.map +1 -1
  13. package/dist/cjs/components/agent-builder/components/SelectableListSection.js +1 -1
  14. package/dist/cjs/components/agent-builder/components/SelectableListSection.js.map +1 -1
  15. package/dist/cjs/components/agent-builder/components/UndoToast.js +2 -0
  16. package/dist/cjs/components/agent-builder/components/UndoToast.js.map +1 -0
  17. package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js +1 -1
  18. package/dist/cjs/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
  19. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js +1 -1
  20. package/dist/cjs/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  21. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js +3 -3
  22. package/dist/cjs/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  23. package/dist/cjs/components/agent-listing/AgentListing.js +1 -1
  24. package/dist/cjs/components/agent-listing/AgentListing.js.map +1 -1
  25. package/dist/cjs/components/agent-listing/AgentListingFilters.js +1 -1
  26. package/dist/cjs/components/agent-listing/AgentListingFilters.js.map +1 -1
  27. package/dist/cjs/components/agent-listing/AgentTable.js +1 -1
  28. package/dist/cjs/components/agent-listing/AgentTable.js.map +1 -1
  29. package/dist/cjs/components/agent-listing/AgentTableRow.js +1 -1
  30. package/dist/cjs/components/agent-listing/AgentTableRow.js.map +1 -1
  31. package/dist/cjs/components/agent-listing/DeleteAgentModal.js +2 -0
  32. package/dist/cjs/components/agent-listing/DeleteAgentModal.js.map +1 -0
  33. package/dist/esm/components/agent-builder/AgentBuilder.js +141 -128
  34. package/dist/esm/components/agent-builder/AgentBuilder.js.map +1 -1
  35. package/dist/esm/components/agent-builder/AgentBuilder.model.d.ts +34 -0
  36. package/dist/esm/components/agent-builder/AgentBuilder.styled.d.ts +34 -0
  37. package/dist/esm/components/agent-builder/AgentBuilder.styled.js +206 -82
  38. package/dist/esm/components/agent-builder/AgentBuilder.styled.js.map +1 -1
  39. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.d.ts +25 -0
  40. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js +207 -0
  41. package/dist/esm/components/agent-builder/components/CreateSubAgentPanel.js.map +1 -0
  42. package/dist/esm/components/agent-builder/components/MentionEditor.d.ts +33 -0
  43. package/dist/esm/components/agent-builder/components/MentionEditor.js +99 -0
  44. package/dist/esm/components/agent-builder/components/MentionEditor.js.map +1 -0
  45. package/dist/esm/components/agent-builder/components/MentionField.d.ts +19 -0
  46. package/dist/esm/components/agent-builder/components/MentionField.js +61 -0
  47. package/dist/esm/components/agent-builder/components/MentionField.js.map +1 -0
  48. package/dist/esm/components/agent-builder/components/MentionPicker.js +84 -71
  49. package/dist/esm/components/agent-builder/components/MentionPicker.js.map +1 -1
  50. package/dist/esm/components/agent-builder/components/SelectableListSection.d.ts +18 -1
  51. package/dist/esm/components/agent-builder/components/SelectableListSection.js +102 -57
  52. package/dist/esm/components/agent-builder/components/SelectableListSection.js.map +1 -1
  53. package/dist/esm/components/agent-builder/components/UndoToast.d.ts +7 -0
  54. package/dist/esm/components/agent-builder/components/UndoToast.js +27 -0
  55. package/dist/esm/components/agent-builder/components/UndoToast.js.map +1 -0
  56. package/dist/esm/components/agent-builder/context/AgentBuilderContext.d.ts +43 -5
  57. package/dist/esm/components/agent-builder/context/AgentBuilderContext.js +135 -87
  58. package/dist/esm/components/agent-builder/context/AgentBuilderContext.js.map +1 -1
  59. package/dist/esm/components/agent-builder/index.d.ts +1 -1
  60. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js +149 -68
  61. package/dist/esm/components/agent-builder/steps/Step3HowItResponds.js.map +1 -1
  62. package/dist/esm/components/agent-builder/utils/mentionSerialization.d.ts +6 -0
  63. package/dist/esm/components/agent-builder/utils/mentionSerialization.js +53 -52
  64. package/dist/esm/components/agent-builder/utils/mentionSerialization.js.map +1 -1
  65. package/dist/esm/components/agent-listing/AgentListing.js +126 -91
  66. package/dist/esm/components/agent-listing/AgentListing.js.map +1 -1
  67. package/dist/esm/components/agent-listing/AgentListing.model.d.ts +9 -0
  68. package/dist/esm/components/agent-listing/AgentListingFilters.d.ts +2 -0
  69. package/dist/esm/components/agent-listing/AgentListingFilters.js +37 -33
  70. package/dist/esm/components/agent-listing/AgentListingFilters.js.map +1 -1
  71. package/dist/esm/components/agent-listing/AgentTable.d.ts +1 -0
  72. package/dist/esm/components/agent-listing/AgentTable.js +13 -11
  73. package/dist/esm/components/agent-listing/AgentTable.js.map +1 -1
  74. package/dist/esm/components/agent-listing/AgentTableRow.d.ts +2 -0
  75. package/dist/esm/components/agent-listing/AgentTableRow.js +70 -50
  76. package/dist/esm/components/agent-listing/AgentTableRow.js.map +1 -1
  77. package/dist/esm/components/agent-listing/DeleteAgentModal.d.ts +16 -0
  78. package/dist/esm/components/agent-listing/DeleteAgentModal.js +69 -0
  79. package/dist/esm/components/agent-listing/DeleteAgentModal.js.map +1 -0
  80. package/package.json +1 -1
  81. package/dist/cjs/components/agent-builder/components/InstructionsField.js +0 -2
  82. package/dist/cjs/components/agent-builder/components/InstructionsField.js.map +0 -1
  83. package/dist/cjs/components/agent-builder/components/RichTextField.js +0 -2
  84. package/dist/cjs/components/agent-builder/components/RichTextField.js.map +0 -1
  85. package/dist/esm/components/agent-builder/components/InstructionsField.d.ts +0 -2
  86. package/dist/esm/components/agent-builder/components/InstructionsField.js +0 -81
  87. package/dist/esm/components/agent-builder/components/InstructionsField.js.map +0 -1
  88. package/dist/esm/components/agent-builder/components/RichTextField.d.ts +0 -21
  89. package/dist/esm/components/agent-builder/components/RichTextField.js +0 -66
  90. package/dist/esm/components/agent-builder/components/RichTextField.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSubAgentPanel.js","sources":["../../../../../src/components/agent-builder/components/CreateSubAgentPanel.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Button } from '@src/components/button';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { Input } from '@src/components/input';\nimport { Toaster } from '@src/components/toaster';\nimport { BodySecondary, TitleRegular } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { AgentTool, SubAgentDraft } from '../AgentBuilder.model';\nimport {\n\tFieldActionRow,\n\tSubAgentCloseButton,\n\tSubAgentPanel,\n\tSubAgentPanelBody,\n\tSubAgentPanelFooter,\n\tSubAgentPanelHeader,\n\tSubAgentPanelHeaderText,\n\tSubAgentScrim,\n} from '../AgentBuilder.styled';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { buildAgentMentionItems } from '../utils/mentionSerialization';\nimport { MentionEditor } from './MentionEditor';\nimport { SelectableItem, SelectableListSection } from './SelectableListSection';\n\ntype InsertFn = (kind: 'tool' | 'subagent', id: string, label?: string) => void;\n\ninterface CreateSubAgentPanelProps {\n\tonClose: () => void;\n\t/** Persist the draft. The drawer shows a loader while the returned promise is pending. */\n\tonSave: (draft: SubAgentDraft) => void | Promise<void>;\n\tavailableTools: AgentTool[];\n\t/** Optional \"Improve with AI\" for instructions / guardrails. Omit to hide the buttons. */\n\tonImprove?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\t/** Header title — \"Create sub-agent\" (default) or \"Edit sub-agent\". */\n\ttitle?: string;\n\t/** Initial values, e.g. when configuring an existing sub-agent. */\n\tinitial?: SubAgentDraft;\n\t/** Tool-source fallback label for chips (host app). */\n\tappLabel?: string;\n}\n\n/**\n * Right-side drawer for creating / editing a sub-agent (name, instructions,\n * guardrails, tools). Instructions & Guardrails are `@`-mention editors (tools\n * only — sub-agents can't nest); adding a tool from the list inserts it at the\n * last-focused field's cursor. Mount it fresh per open (key it) so `initial`\n * seeds the draft.\n */\nexport const CreateSubAgentPanel: React.FC<CreateSubAgentPanelProps> = ({\n\tonClose,\n\tonSave,\n\tavailableTools,\n\tonImprove,\n\ttitle = 'Create sub-agent',\n\tinitial,\n\tappLabel = 'Manifest',\n}) => {\n\tconst [name, setName] = useState(initial?.name ?? '');\n\tconst [instructions, setInstructions] = useState(initial?.instructions ?? '');\n\tconst [guardrail, setGuardrail] = useState(initial?.guardrail ?? '');\n\tconst [tools, setTools] = useState<string[]>(initial?.tools ?? []);\n\tconst [saving, setSaving] = useState(false);\n\t// Bumped to remount a field after its text is replaced (e.g. by Improve).\n\tconst [instrKey, setInstrKey] = useState(0);\n\tconst [guardKey, setGuardKey] = useState(0);\n\tconst [improving, setImproving] = useState<\n\t\t'instructions' | 'guardrail' | null\n\t>(null);\n\n\t// Tools-only mention list (sub-agents can't reference other sub-agents).\n\tconst mentionItems = useMemo(\n\t\t() => buildAgentMentionItems(availableTools, [], appLabel),\n\t\t[availableTools, appLabel],\n\t);\n\n\t// Per-field insert + focus registry, so the Tools list inserts a chip into the\n\t// last-focused editor at its cursor.\n\tconst insertersRef = useRef<\n\t\tPartial<Record<'instructions' | 'guardrail', InsertFn>>\n\t>({});\n\tconst lastFocusedRef = useRef<'instructions' | 'guardrail'>('instructions');\n\tconst registerInstr = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.instructions = fn ?? undefined;\n\t}, []);\n\tconst registerGuard = useCallback((fn: InsertFn | null) => {\n\t\tinsertersRef.current.guardrail = fn ?? undefined;\n\t}, []);\n\tconst focusInstr = useCallback(() => {\n\t\tlastFocusedRef.current = 'instructions';\n\t}, []);\n\tconst focusGuard = useCallback(() => {\n\t\tlastFocusedRef.current = 'guardrail';\n\t}, []);\n\tconst addToolMention = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tif (kind === 'tool') {\n\t\t\t\tsetTools((prev) => (prev.includes(id) ? prev : [...prev, id]));\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst insertToolAtCursor = useCallback((id: string) => {\n\t\tconst target =\n\t\t\tinsertersRef.current[lastFocusedRef.current] ??\n\t\t\tinsertersRef.current.instructions;\n\t\ttarget?.('tool', id);\n\t}, []);\n\n\t// Local undo toast for tool removal (drawer state isn't in AgentValue).\n\tconst [undo, setUndo] = useState<{ id: number; message: string } | null>(\n\t\tnull,\n\t);\n\tconst undoSnapshotRef = useRef<{\n\t\tinstructions: string;\n\t\tguardrail: string;\n\t\ttools: string[];\n\t} | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst removeTool = (id: string) => {\n\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\tconst token = tool ? `{{tool:${tool.function_key}}}` : null;\n\t\tconst strip = (text: string) => (token ? text.split(token).join('') : text);\n\t\tundoSnapshotRef.current = { instructions, guardrail, tools };\n\t\tsetInstructions((prev) => strip(prev));\n\t\tsetGuardrail((prev) => strip(prev));\n\t\tsetTools((prev) => prev.filter((t) => t !== id));\n\t\tsetInstrKey((k) => k + 1);\n\t\tsetGuardKey((k) => k + 1);\n\t\tundoIdRef.current += 1;\n\t\tsetUndo({\n\t\t\tid: undoIdRef.current,\n\t\t\tmessage: `Tool \"${tool?.displayName ?? 'Tool'}\" removed`,\n\t\t});\n\t};\n\n\tconst undoRemove = () => {\n\t\tconst snap = undoSnapshotRef.current;\n\t\tif (snap) {\n\t\t\tsetInstructions(snap.instructions);\n\t\t\tsetGuardrail(snap.guardrail);\n\t\t\tsetTools(snap.tools);\n\t\t\tsetInstrKey((k) => k + 1);\n\t\t\tsetGuardKey((k) => k + 1);\n\t\t\tundoSnapshotRef.current = null;\n\t\t}\n\t\tsetUndo(null);\n\t};\n\n\tconst canSave =\n\t\tname.trim().length > 0 &&\n\t\t(instructions.trim().length > 0 || guardrail.trim().length > 0);\n\n\tconst toolItems: SelectableItem[] = tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool ? { id, label: tool.displayName } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// Offer all tools (re-add allowed); the chip list stays deduped.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.displayName,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\n\t}));\n\n\tconst handleSave = async () => {\n\t\tif (!canSave || saving) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = onSave({\n\t\t\tname: name.trim(),\n\t\t\tinstructions,\n\t\t\tguardrail,\n\t\t\ttools,\n\t\t});\n\t\tif (result && typeof (result as Promise<void>).then === 'function') {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait result;\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleImprove = async (kind: 'instructions' | 'guardrail') => {\n\t\tif (!onImprove || improving) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(kind);\n\t\ttry {\n\t\t\tconst current = kind === 'instructions' ? instructions : guardrail;\n\t\t\tconst improved = await onImprove(kind, current);\n\t\t\tif (kind === 'instructions') {\n\t\t\t\tsetInstructions(improved);\n\t\t\t\tsetInstrKey((k) => k + 1);\n\t\t\t} else {\n\t\t\t\tsetGuardrail(improved);\n\t\t\t\tsetGuardKey((k) => k + 1);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetImproving(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SubAgentScrim onClick={onClose} data-test=\"subagent-scrim\" />\n\t\t\t<SubAgentPanel data-test=\"create-subagent-panel\">\n\t\t\t\t<SubAgentPanelHeader>\n\t\t\t\t\t<SubAgentPanelHeaderText>\n\t\t\t\t\t\t<TitleRegular color={COLORS.content.primary}>{title}</TitleRegular>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.secondary}>\n\t\t\t\t\t\t\tEach sub-agent handles one piece of the job. Use @ in the main\n\t\t\t\t\t\t\tinstructions to call them.\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t</SubAgentPanelHeaderText>\n\t\t\t\t\t<SubAgentCloseButton onClick={onClose} aria-label=\"Close\">\n\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\t\theight={20}\n\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SubAgentCloseButton>\n\t\t\t\t</SubAgentPanelHeader>\n\n\t\t\t\t<SubAgentPanelBody>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tdata-test=\"subagent-name\"\n\t\t\t\t\t\tlabelText=\"Agent name\"\n\t\t\t\t\t\tlabelTextBold\n\t\t\t\t\t\tplaceholder=\"Enter agent name\"\n\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\tmaxCharLimit={AGENT_CHAR_LIMITS.name}\n\t\t\t\t\t\tmaxCharLimitPosition=\"TOP\"\n\t\t\t\t\t\tmaxCharStyle={{ fontSize: 12, lineHeight: '16px' }}\n\t\t\t\t\t\tonChangeText={setName}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tvalue={instructions}\n\t\t\t\t\t\tonChange={setInstructions}\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.instructions}\n\t\t\t\t\t\tplaceholder=\"Write the steps in plain English. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`instr-${instrKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusInstr}\n\t\t\t\t\t\tregisterInsert={registerInstr}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionEditor\n\t\t\t\t\t\tdata-test=\"subagent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tvalue={guardrail}\n\t\t\t\t\t\tonChange={setGuardrail}\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.guardrail}\n\t\t\t\t\t\tplaceholder=\"e.g. Never discuss competitor pricing. Type @ to reference a tool.\"\n\t\t\t\t\t\tminHeight=\"160px\"\n\t\t\t\t\t\tresetKey={`guard-${guardKey}`}\n\t\t\t\t\t\tmentionItems={mentionItems}\n\t\t\t\t\t\ttools={availableTools}\n\t\t\t\t\t\tonMentionSelect={addToolMention}\n\t\t\t\t\t\tonFocus={focusGuard}\n\t\t\t\t\t\tregisterInsert={registerGuard}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools this agent can use\"\n\t\t\t\t\t\tdataTestPrefix=\"subagent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertToolAtCursor(id);\n\t\t\t\t\t\t\tsetTools((prev) => (prev.includes(id) ? prev : [...prev, id]));\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={removeTool}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelBody>\n\n\t\t\t\t<SubAgentPanelFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-save\"\n\t\t\t\t\t\tbuttonType=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Save\"\n\t\t\t\t\t\tdisabled={!canSave}\n\t\t\t\t\t\tisLoading={saving}\n\t\t\t\t\t\tonClick={handleSave}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-test=\"subagent-cancel\"\n\t\t\t\t\t\tbuttonType=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tbuttonText=\"Cancel\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</SubAgentPanelFooter>\n\t\t\t</SubAgentPanel>\n\n\t\t\t{undo && (\n\t\t\t\t<Toaster\n\t\t\t\t\tkey={undo.id}\n\t\t\t\t\ttext={undo.message}\n\t\t\t\t\ttype=\"info\"\n\t\t\t\t\tposition=\"top-right\"\n\t\t\t\t\tautoClose={5000}\n\t\t\t\t\thideCloseButton\n\t\t\t\t\tbuttonProps={{\n\t\t\t\t\t\tbuttonText: 'Undo',\n\t\t\t\t\t\tshowButton: true,\n\t\t\t\t\t\tonButtonClick: () => {\n\t\t\t\t\t\t\tundoRemove();\n\t\t\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tonCloseToast={() => setUndo(null)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n};\n"],"names":["CreateSubAgentPanel","onClose","onSave","availableTools","onImprove","title","initial","appLabel","name","setName","useState","instructions","setInstructions","guardrail","setGuardrail","tools","setTools","saving","setSaving","instrKey","setInstrKey","guardKey","setGuardKey","improving","setImproving","mentionItems","useMemo","buildAgentMentionItems","insertersRef","useRef","lastFocusedRef","registerInstr","useCallback","fn","registerGuard","focusInstr","focusGuard","addToolMention","kind","id","prev","insertToolAtCursor","undo","setUndo","undoSnapshotRef","undoIdRef","removeTool","tool","t","token","strip","text","k","undoRemove","snap","canSave","toolItems","x","toolOptions","handleSave","result","jsxs","Fragment","jsx","SubAgentScrim","SubAgentPanel","SubAgentPanelHeader","SubAgentPanelHeaderText","TitleRegular","COLORS","BodySecondary","SubAgentCloseButton","CrossIcon","SubAgentPanelBody","Input","AGENT_CHAR_LIMITS","MentionEditor","SelectableListSection","SubAgentPanelFooter","Button","Toaster"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),i=require("react"),x=require("../../TypographyStyle.js"),T=require("../../../constants/Theme.js"),u=require("../AgentBuilder.styled.js"),A=require("../constants/editorStyle.js"),d=require("../utils/mentionSerialization.js"),D=require("./MentionPicker.js"),L=require("../../../editor/BikEditor.js"),P=({label:m,value:c,onChange:p,maxLength:a,placeholder:y,minHeight:C="200px",resetKey:s,mentionItems:r,tools:E,onMentionSelect:b,onFocus:j,registerInsert:o,action:q,...k})=>{const l=i.useRef(null),[O,S]=i.useState(c.length),h=i.useCallback((t,e,M)=>{const f=l.current;if(!f)return;const B=r.find(g=>String(g.id)===String(e)&&g.meta?.kind===t),H=M??B?.label??e;f.insertInlineContent(`${d.buildMentionHtml(String(e),H,t)}&nbsp;`)},[r]);i.useEffect(()=>{if(o)return o(h),()=>o(null)},[o,h]);const R=i.useMemo(()=>d.instructionsToEditorHtml(c,r),[s]);return i.useEffect(()=>S(c.length),[s]),n.jsxs(u.FieldBlock,{children:[n.jsxs(u.FieldLabelRow,{children:[n.jsx(x.TitleSmall,{color:T.COLORS.content.primary,children:m}),n.jsxs(x.BodyCaption,{color:T.COLORS.content.secondary,children:[O,"/",a]})]}),n.jsxs(u.AiTextAreaShell,{minHeight:C,"data-test":k["data-test"],children:[n.jsx(L.BikEditor,{ref:l,initialContent:R,placeholder:y,maxCharacters:a,minHeight:"120px",maxHeight:"320px",style:{border:"none"},editorStyle:A.AGENT_EDITOR_STYLE,onFocus:j,mentions:{agents:r,removeTriggerOnDismiss:!0,renderDropdown:t=>n.jsx(D.MentionPicker,{...t}),onSelect:t=>{const e=t.meta?.kind;e&&b?.(e,String(t.id))}},onChange:t=>{S(t.characterCount);const e=l.current?.getJSON()??null;p(d.editorDocToInstructions(e,E))}},s),q]})]})};exports.MentionEditor=P;
2
+ //# sourceMappingURL=MentionEditor.js.map
@@ -0,0 +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 { AgentTool } from '../AgentBuilder.model';\nimport {\n\tAiTextAreaShell,\n\tFieldBlock,\n\tFieldLabelRow,\n} from '../AgentBuilder.styled';\nimport { AGENT_EDITOR_STYLE } from '../constants/editorStyle';\nimport {\n\tbuildMentionHtml,\n\teditorDocToInstructions,\n\tinstructionsToEditorHtml,\n\tMentionKindMeta,\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/** 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\taction,\n\t...rest\n}) => {\n\tconst editorRef = useRef<BikEditorRef>(null);\n\tconst [count, setCount] = useState(value.length);\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\tconst initialHtml = useMemo(\n\t\t() => instructionsToEditorHtml(value, mentionItems),\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\tmaxCharacters={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) => <MentionPicker {...props} />,\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\tif (kind) {\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","action","rest","editorRef","useRef","count","setCount","useState","insert","useCallback","kind","id","overrideLabel","editor","item","m","finalLabel","buildMentionHtml","useEffect","initialHtml","useMemo","instructionsToEditorHtml","FieldBlock","jsxs","FieldLabelRow","jsx","TitleSmall","COLORS","BodyCaption","AiTextAreaShell","BikEditor","AGENT_EDITOR_STYLE","props","MentionPicker","snapshot","doc","editorDocToInstructions"],"mappings":"+ZAuDaA,EAA8C,CAAC,CAC3D,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,EAAY,QACZ,SAAAC,EACA,aAAAC,EACA,MAAAC,EACA,gBAAAC,EACA,QAAAC,EACA,eAAAC,EACA,OAAAC,EACA,GAAGC,CACJ,IAAM,CACL,MAAMC,EAAYC,EAAAA,OAAqB,IAAI,EACrC,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAASjB,EAAM,MAAM,EAEzCkB,EAASC,EAAAA,YACd,CAACC,EAAMC,EAAIC,IAAkB,CAC5B,MAAMC,EAASV,EAAU,QACzB,GAAI,CAACU,EACJ,OAED,MAAMC,EAAOlB,EAAa,KACxBmB,GACA,OAAOA,EAAE,EAAE,IAAM,OAAOJ,CAAE,GACzBI,EAAE,MAAiD,OAASL,CAAA,EAEzDM,EAAaJ,GAAiBE,GAAM,OAASH,EACnDE,EAAO,oBACN,GAAGI,EAAAA,iBAAiB,OAAON,CAAE,EAAGK,EAAYN,CAAI,CAAC,QAAA,CAEnD,EACA,CAACd,CAAY,CAAA,EAGdsB,EAAAA,UAAU,IAAM,CACf,GAAKlB,EAGL,OAAAA,EAAeQ,CAAM,EACd,IAAMR,EAAe,IAAI,CACjC,EAAG,CAACA,EAAgBQ,CAAM,CAAC,EAG3B,MAAMW,EAAcC,EAAAA,QACnB,IAAMC,EAAAA,yBAAyB/B,EAAOM,CAAY,EAElD,CAACD,CAAQ,CAAA,EAGVuB,OAAAA,EAAAA,UACC,IAAMZ,EAAShB,EAAM,MAAM,EAE3B,CAACK,CAAQ,CAAA,SAIR2B,aAAA,CACA,SAAA,CAAAC,OAACC,EAAAA,cAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAtC,EAAM,EAClDkC,EAAAA,KAACK,EAAAA,YAAA,CAAY,MAAOD,EAAAA,OAAO,QAAQ,UACjC,SAAA,CAAAtB,EAAM,IAAEb,CAAA,CAAA,CACV,CAAA,EACD,SAECqC,EAAAA,gBAAA,CAAgB,UAAAnC,EAAsB,YAAWQ,EAAK,WAAW,EACjE,SAAA,CAAAuB,EAAAA,IAACK,EAAAA,UAAA,CAEA,IAAK3B,EACL,eAAgBgB,EAChB,YAAA1B,EACA,cAAeD,EACf,UAAU,QACV,UAAU,QACV,MAAO,CAAE,OAAQ,MAAA,EACjB,YAAauC,EAAAA,mBACb,QAAAhC,EACA,SAAU,CACT,OAAQH,EACR,uBAAwB,GACxB,eAAiBoC,GAAUP,EAAAA,IAACQ,EAAAA,cAAA,CAAe,GAAGD,EAAO,EACrD,SAAWlB,GAAS,CACnB,MAAMJ,EAAQI,EAAK,MAChB,KACCJ,GACHZ,IAAkBY,EAAM,OAAOI,EAAK,EAAE,CAAC,CAEzC,CAAA,EAED,SAAWoB,GAAa,CACvB5B,EAAS4B,EAAS,cAAc,EAChC,MAAMC,EAAMhC,EAAU,SAAS,QAAA,GAAa,KAC5CZ,EAAS6C,EAAAA,wBAAwBD,EAAKtC,CAAK,CAAC,CAC7C,CAAA,EA1BKF,CAAA,EA4BLM,CAAA,CAAA,CACF,CAAA,EACD,CAEF"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("react/jsx-runtime"),a=require("react"),x=require("../context/AgentBuilderContext.js"),c=require("../utils/mentionSerialization.js"),A=require("./MentionEditor.js"),T=({fieldKey:t,label:b,placeholder:g,maxLength:M,minHeight:m,...p})=>{const{value:e,patch:o,availableTools:i,availableSubAgents:l,applicationType:u,mentionResetKey:d,registerMentionField:r,notifyMentionFocus:q}=x.useAgentBuilderContext(),v=a.useMemo(()=>c.buildAgentMentionItems(i,l,c.appTypeLabel(u)),[i,l,u]),C=a.useCallback(n=>r(t,n),[r,t]),F=a.useCallback((n,s)=>{n==="tool"?e.tools.includes(s)||o({tools:[...e.tools,s]}):e.subagents.includes(s)||o({subagents:[...e.subagents,s]})},[o,e.tools,e.subagents]);return S.jsx(A.MentionEditor,{label:b,value:e[t]??"",onChange:n=>o({[t]:n}),maxLength:M,placeholder:g,minHeight:m,resetKey:`${e.id}:${t}:${d}`,mentionItems:v,tools:i,onMentionSelect:F,onFocus:()=>q(t),registerInsert:C,"data-test":p["data-test"]})};exports.MentionField=T;
2
+ //# sourceMappingURL=MentionField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentionField.js","sources":["../../../../../src/components/agent-builder/components/MentionField.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport { AgentValue } from '../AgentBuilder.model';\nimport {\n\tMentionFieldKey,\n\tuseAgentBuilderContext,\n} from '../context/AgentBuilderContext';\nimport {\n\tappTypeLabel,\n\tbuildAgentMentionItems,\n} from '../utils/mentionSerialization';\nimport { MentionEditor } from './MentionEditor';\n\ninterface MentionFieldProps {\n\t/** Which AgentValue field this editor reads / writes. */\n\tfieldKey: MentionFieldKey;\n\tlabel: string;\n\tplaceholder?: string;\n\tmaxLength: number;\n\tminHeight?: string;\n\t'data-test'?: string;\n}\n\n/**\n * Context-bound {@link MentionEditor} for the builder's Step-3 Instructions /\n * Guardrails. Both `@` tools and sub-agents are offered; the field registers its\n * insert + focus with the context so side-panel adds drop a chip into whichever\n * field was last focused, and remounts on `mentionResetKey`.\n */\nexport const MentionField: React.FC<MentionFieldProps> = ({\n\tfieldKey,\n\tlabel,\n\tplaceholder,\n\tmaxLength,\n\tminHeight,\n\t...rest\n}) => {\n\tconst {\n\t\tvalue,\n\t\tpatch,\n\t\tavailableTools,\n\t\tavailableSubAgents,\n\t\tapplicationType,\n\t\tmentionResetKey,\n\t\tregisterMentionField,\n\t\tnotifyMentionFocus,\n\t} = useAgentBuilderContext();\n\n\tconst mentionItems = useMemo(\n\t\t() =>\n\t\t\tbuildAgentMentionItems(\n\t\t\t\tavailableTools,\n\t\t\t\tavailableSubAgents,\n\t\t\t\tappTypeLabel(applicationType),\n\t\t\t),\n\t\t[availableTools, availableSubAgents, applicationType],\n\t);\n\n\tconst registerInsert = useCallback(\n\t\t(fn: Parameters<typeof registerMentionField>[1]) =>\n\t\t\tregisterMentionField(fieldKey, fn),\n\t\t[registerMentionField, fieldKey],\n\t);\n\n\tconst onMentionSelect = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tif (kind === 'tool') {\n\t\t\t\tif (!value.tools.includes(id)) {\n\t\t\t\t\tpatch({ tools: [...value.tools, id] });\n\t\t\t\t}\n\t\t\t} else if (!value.subagents.includes(id)) {\n\t\t\t\tpatch({ subagents: [...value.subagents, id] });\n\t\t\t}\n\t\t},\n\t\t[patch, value.tools, value.subagents],\n\t);\n\n\treturn (\n\t\t<MentionEditor\n\t\t\tlabel={label}\n\t\t\tvalue={(value[fieldKey] as string | undefined) ?? ''}\n\t\t\tonChange={(text) => patch({ [fieldKey]: text } as Partial<AgentValue>)}\n\t\t\tmaxLength={maxLength}\n\t\t\tplaceholder={placeholder}\n\t\t\tminHeight={minHeight}\n\t\t\tresetKey={`${value.id}:${fieldKey}:${mentionResetKey}`}\n\t\t\tmentionItems={mentionItems}\n\t\t\ttools={availableTools}\n\t\t\tonMentionSelect={onMentionSelect}\n\t\t\tonFocus={() => notifyMentionFocus(fieldKey)}\n\t\t\tregisterInsert={registerInsert}\n\t\t\tdata-test={rest['data-test']}\n\t\t/>\n\t);\n};\n"],"names":["MentionField","fieldKey","label","placeholder","maxLength","minHeight","rest","value","patch","availableTools","availableSubAgents","applicationType","mentionResetKey","registerMentionField","notifyMentionFocus","useAgentBuilderContext","mentionItems","useMemo","buildAgentMentionItems","appTypeLabel","registerInsert","useCallback","fn","onMentionSelect","kind","id","jsx","MentionEditor","text"],"mappings":"qQA4BaA,EAA4C,CAAC,CACzD,SAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,UAAAC,EACA,GAAGC,CACJ,IAAM,CACL,KAAM,CACL,MAAAC,EACA,MAAAC,EACA,eAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,qBAAAC,EACA,mBAAAC,CAAA,EACGC,yBAAA,EAEEC,EAAeC,EAAAA,QACpB,IACCC,EAAAA,uBACCT,EACAC,EACAS,EAAAA,aAAaR,CAAe,CAAA,EAE9B,CAACF,EAAgBC,EAAoBC,CAAe,CAAA,EAG/CS,EAAiBC,EAAAA,YACrBC,GACAT,EAAqBZ,EAAUqB,CAAE,EAClC,CAACT,EAAsBZ,CAAQ,CAAA,EAG1BsB,EAAkBF,EAAAA,YACvB,CAACG,EAA2BC,IAAe,CACtCD,IAAS,OACPjB,EAAM,MAAM,SAASkB,CAAE,GAC3BjB,EAAM,CAAE,MAAO,CAAC,GAAGD,EAAM,MAAOkB,CAAE,EAAG,EAE3BlB,EAAM,UAAU,SAASkB,CAAE,GACtCjB,EAAM,CAAE,UAAW,CAAC,GAAGD,EAAM,UAAWkB,CAAE,EAAG,CAE/C,EACA,CAACjB,EAAOD,EAAM,MAAOA,EAAM,SAAS,CAAA,EAGrC,OACCmB,EAAAA,IAACC,EAAAA,cAAA,CACA,MAAAzB,EACA,MAAQK,EAAMN,CAAQ,GAA4B,GAClD,SAAW2B,GAASpB,EAAM,CAAE,CAACP,CAAQ,EAAG2B,EAA6B,EACrE,UAAAxB,EACA,YAAAD,EACA,UAAAE,EACA,SAAU,GAAGE,EAAM,EAAE,IAAIN,CAAQ,IAAIW,CAAe,GACpD,aAAAI,EACA,MAAOP,EACP,gBAAAc,EACA,QAAS,IAAMT,EAAmBb,CAAQ,EAC1C,eAAAmB,EACA,YAAWd,EAAK,WAAW,CAAA,CAAA,CAG9B"}
@@ -1,14 +1,14 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),j=require("../../../assets/icons/chevronLeft.svg.js"),I=require("../../../assets/icons/chevronRight.svg.js"),r=require("react"),$=require("styled-components"),w=require("../../TypographyStyle.js"),o=require("../../../constants/Theme.js"),C=require("../utils/mentionSerialization.js"),q=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},h=q($),E=[{key:"tool",label:"Tools"},{key:"subagent",label:"Sub-agent"}],u=t=>t.meta,L=t=>u(t)?.plainLabel??t.label,M=({items:t,onSelect:g,registerKeyHandler:d})=>{const[a,x]=r.useState(null),[l,k]=r.useState(null),[y,p]=r.useState(0),f=r.useMemo(()=>t.filter(e=>u(e)?.kind==="tool"),[t]),S=r.useMemo(()=>t.filter(e=>u(e)?.kind==="subagent"),[t]),v=r.useMemo(()=>{const e=[];return f.forEach(n=>{const b=u(n)?.source??"other";e.includes(b)||e.push(b)}),e},[f]),c=a?a==="subagent"?{title:"Sub-agent",onBack:()=>x(null)}:l?{title:C.toolSourceLabel(l),onBack:()=>k(null)}:{title:"Tools",onBack:()=>x(null)}:null,i=r.useMemo(()=>a?a==="subagent"?S.map(e=>({id:String(e.id),label:L(e),drillsIn:!1,onActivate:()=>g(e)})):l?f.filter(e=>(u(e)?.source??"other")===l).map(e=>({id:String(e.id),label:L(e),drillsIn:!1,onActivate:()=>g(e)})):v.map(e=>({id:e,label:C.toolSourceLabel(e),drillsIn:!0,onActivate:()=>k(e)})):E.map(e=>({id:e.key,label:e.label,drillsIn:!0,onActivate:()=>{x(e.key),k(null)}})),[a,l,f,S,v,g]);r.useEffect(()=>p(0),[a,l,t]);const O=r.useRef({rows:i,activeIndex:y,header:c});O.current={rows:i,activeIndex:y,header:c},r.useEffect(()=>{if(d)return d(e=>{const{rows:n,activeIndex:b,header:R}=O.current;switch(e.key){case"ArrowDown":return n.length&&p(m=>(m+1)%n.length),!0;case"ArrowUp":return n.length&&p(m=>(m+n.length-1)%n.length),!0;case"ArrowRight":case"Enter":return n[b]?.onActivate(),!0;case"ArrowLeft":return R?(R.onBack(),!0):!1;default:return!1}}),()=>d(null)},[d]);const A=a?i.length&&!i[0].drillsIn?"items":"sources":"categories";return s.jsxs(B,{className:`bik-mention-picker bik-mention-picker--${A}`,children:[c&&s.jsxs(T,{type:"button",onClick:c.onBack,style:{background:o.COLORS.surface.subdued},children:[s.jsx(j.default,{width:12,height:12}),s.jsxs(w.TitleSmall,{children:[" ",c.title]})]}),i.length===0?s.jsx(z,{children:a==="subagent"?"No sub-agents available":"No tools available"}):i.map((e,n)=>s.jsxs(P,{type:"button",$active:n===y,onMouseEnter:()=>p(n),onClick:e.onActivate,children:[s.jsx(w.BodySecondary,{color:o.COLORS.content.primary,children:e.label}),e.drillsIn&&s.jsx(I.default,{width:12,height:12})]},e.id))]})},B=h.default.div`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),M=require("../../../assets/icons/chevronLeft.svg.js"),q=require("../../../assets/icons/chevronRight.svg.js"),o=require("react"),E=require("styled-components"),L=require("../../TypographyStyle.js"),r=require("../../../constants/Theme.js"),A=require("../utils/mentionSerialization.js"),B=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},x=B(E),P=[{key:"tool",label:"Tools"},{key:"subagent",label:"Sub-agent"}],d=t=>t.meta,j=t=>d(t)?.plainLabel??t.label,T=({items:t,onSelect:k,registerKeyHandler:f})=>{const[I,y]=o.useState(null),[s,m]=o.useState(null),[v,p]=o.useState(0),i=o.useMemo(()=>t.filter(e=>d(e)?.kind==="tool"),[t]),b=o.useMemo(()=>t.filter(e=>d(e)?.kind==="subagent"),[t]),C=o.useMemo(()=>{const e=[];return i.forEach(n=>{const h=d(n)?.source??"other";e.includes(h)||e.push(h)}),e},[i]),g=o.useMemo(()=>P.filter(e=>e.key==="tool"?i.length>0:b.length>0),[i.length,b.length]),S=g.length===1?g[0].key:null,l=I??S,u=l?l==="subagent"?S?null:{title:"Sub-agent",onBack:()=>y(null)}:s?{title:A.toolSourceLabel(s),onBack:()=>m(null)}:S?null:{title:"Tools",onBack:()=>y(null)}:null,c=o.useMemo(()=>l?l==="subagent"?b.map(e=>({id:String(e.id),label:j(e),drillsIn:!1,onActivate:()=>k(e)})):s?i.filter(e=>(d(e)?.source??"other")===s).map(e=>({id:String(e.id),label:j(e),drillsIn:!1,onActivate:()=>k(e)})):C.map(e=>({id:e,label:A.toolSourceLabel(e),drillsIn:!0,onActivate:()=>m(e)})):g.map(e=>({id:e.key,label:e.label,drillsIn:!0,onActivate:()=>{y(e.key),m(null)}})),[l,g,s,i,b,C,k]);o.useEffect(()=>p(0),[l,s,t]);const R=o.useRef({rows:c,activeIndex:v,header:u});R.current={rows:c,activeIndex:v,header:u},o.useEffect(()=>{if(f)return f(e=>{const{rows:n,activeIndex:h,header:w}=R.current;switch(e.key){case"ArrowDown":return n.length&&p(O=>(O+1)%n.length),!0;case"ArrowUp":return n.length&&p(O=>(O+n.length-1)%n.length),!0;case"ArrowRight":case"Enter":return n[h]?.onActivate(),!0;case"ArrowLeft":return w?(w.onBack(),!0):!1;default:return!1}}),()=>f(null)},[f]);const $=l?c.length&&!c[0].drillsIn?"items":"sources":"categories";return a.jsxs(z,{className:`bik-mention-picker bik-mention-picker--${$}`,children:[u&&a.jsxs(_,{type:"button",onClick:u.onBack,style:{background:r.COLORS.surface.subdued},children:[a.jsx(M.default,{width:12,height:12}),a.jsxs(L.TitleSmall,{children:[" ",u.title]})]}),c.length===0?a.jsx(D,{children:l==="subagent"?"No sub-agents available":"No tools available"}):c.map((e,n)=>a.jsxs(N,{type:"button",$active:n===v,onMouseEnter:()=>p(n),onClick:e.onActivate,children:[a.jsx(L.BodySecondary,{color:r.COLORS.content.primary,children:e.label}),e.drillsIn&&a.jsx(q.default,{width:12,height:12})]},e.id))]})},z=x.default.div`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  min-width: 240px;
5
5
  max-height: 280px;
6
6
  overflow-y: auto;
7
- background: ${o.COLORS.surface.standard};
8
- border: 1px solid ${o.COLORS.stroke.primary};
7
+ background: ${r.COLORS.surface.standard};
8
+ border: 1px solid ${r.COLORS.stroke.primary};
9
9
  border-radius: 4px;
10
10
  box-shadow: 0px -2px 8px 0px #0000001f;
11
- `,P=h.default.button`
11
+ `,N=x.default.button`
12
12
  display: flex;
13
13
  justify-content: space-between;
14
14
  align-items: center;
@@ -17,20 +17,20 @@
17
17
  padding: 8px 10px;
18
18
  height: 48px;
19
19
  border: none;
20
- border-bottom: 1px solid ${o.COLORS.stroke.primary};
21
- background: ${t=>t.$active?o.COLORS.surface.subdued:"transparent"};
20
+ border-bottom: 1px solid ${r.COLORS.stroke.primary};
21
+ background: ${t=>t.$active?r.COLORS.surface.subdued:"transparent"};
22
22
  cursor: pointer;
23
23
  text-align: left;
24
24
 
25
25
  &:hover {
26
- background: ${o.COLORS.surface.subdued};
26
+ background: ${r.COLORS.surface.subdued};
27
27
  }
28
- `,T=h.default.button`
28
+ `,_=x.default.button`
29
29
  display: flex;
30
30
  align-items: center;
31
31
  padding: 12px 16px;
32
32
  border: none;
33
- border-bottom: 1px solid ${o.COLORS.stroke.primary};
33
+ border-bottom: 1px solid ${r.COLORS.stroke.primary};
34
34
  background: transparent;
35
35
  cursor: pointer;
36
36
  font-family: Inter;
@@ -38,10 +38,10 @@
38
38
  font-weight: 600;
39
39
  height: 48px;
40
40
  gap: 4px;
41
- `,z=h.default.div`
41
+ `,D=x.default.div`
42
42
  padding: 12px 10px;
43
43
  font-family: Inter;
44
44
  font-size: 13px;
45
- color: ${o.COLORS.content.secondary};
46
- `;exports.MentionPicker=M;
45
+ color: ${r.COLORS.content.secondary};
46
+ `;exports.MentionPicker=T;
47
47
  //# sourceMappingURL=MentionPicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MentionPicker.js","sources":["../../../../../src/components/agent-builder/components/MentionPicker.tsx"],"sourcesContent":["import ChevronLeft from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRight from '@src/assets/icons/chevronRight.svg';\nimport type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { BodySecondary, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\n\ntype Category = 'tool' | 'subagent';\n\nconst CATEGORIES: { key: Category; label: string }[] = [\n\t{ key: 'tool', label: 'Tools' },\n\t{ key: 'subagent', label: 'Sub-agent' },\n];\n\nconst metaOf = (item: MentionItem): MentionKindMeta | undefined =>\n\titem.meta as unknown as MentionKindMeta | undefined;\n\nconst rowLabel = (item: MentionItem): string =>\n\tmetaOf(item)?.plainLabel ?? item.label;\n\n/** One navigable row in the picker's current view. */\ntype PickerRowModel = {\n\tid: string;\n\tlabel: string;\n\t/** Drill-in rows show a chevron; leaf (selectable) rows do not. */\n\tdrillsIn: boolean;\n\tonActivate: () => void;\n};\n\n/**\n * `@` reference picker. Drills:\n * root → Tools → <source> (Manifest / Shopify / …) → tool\n * → Sub-agent → sub-agent\n * (\"Add condition\" and \"Variables\" are intentionally not shown yet.)\n *\n * Owns keyboard navigation (↑/↓ move, →/Enter activate, ← go back) over the\n * CURRENTLY visible rows — registered with the editor via `registerKeyHandler`.\n */\nexport const MentionPicker: React.FC<MentionDropdownRenderProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(null);\n\tconst [activeIndex, setActiveIndex] = useState(0);\n\n\tconst tools = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'tool'),\n\t\t[items],\n\t);\n\tconst subAgents = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'subagent'),\n\t\t[items],\n\t);\n\tconst sources = useMemo(() => {\n\t\tconst acc: string[] = [];\n\t\ttools.forEach((t) => {\n\t\t\tconst s = metaOf(t)?.source ?? 'other';\n\t\t\tif (!acc.includes(s)) {\n\t\t\t\tacc.push(s);\n\t\t\t}\n\t\t});\n\t\treturn acc;\n\t}, [tools]);\n\n\t// Title shown above the current view, and whether we can go back a level.\n\tconst header: { title: string; onBack: () => void } | null = !category\n\t\t? null\n\t\t: category === 'subagent'\n\t\t? { title: 'Sub-agent', onBack: () => setCategory(null) }\n\t\t: source\n\t\t? { title: toolSourceLabel(source), onBack: () => setSource(null) }\n\t\t: { title: 'Tools', onBack: () => setCategory(null) };\n\n\t// Build the navigable rows for the current view.\n\tconst rows: PickerRowModel[] = useMemo(() => {\n\t\tif (!category) {\n\t\t\treturn CATEGORIES.map((c) => ({\n\t\t\t\tid: c.key,\n\t\t\t\tlabel: c.label,\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tsetCategory(c.key);\n\t\t\t\t\tsetSource(null);\n\t\t\t\t},\n\t\t\t}));\n\t\t}\n\t\tif (category === 'subagent') {\n\t\t\treturn subAgents.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t}\n\t\tif (!source) {\n\t\t\treturn sources.map((s) => ({\n\t\t\t\tid: s,\n\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => setSource(s),\n\t\t\t}));\n\t\t}\n\t\treturn tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\n\t\t\t.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t}, [category, source, tools, subAgents, sources, onSelect]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(() => setActiveIndex(0), [category, source, items]);\n\n\t// Keep the latest rows/index reachable from the stable key handler.\n\tconst navRef = useRef({ rows, activeIndex, header });\n\tnavRef.current = { rows, activeIndex, header };\n\n\tuseEffect(() => {\n\t\tif (!registerKeyHandler) {\n\t\t\treturn;\n\t\t}\n\t\tregisterKeyHandler((event) => {\n\t\t\tconst { rows: r, activeIndex: i, header: h } = navRef.current;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + r.length - 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\tcase 'Enter':\n\t\t\t\t\tr[i]?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h) {\n\t\t\t\t\t\th.onBack();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn () => registerKeyHandler(null);\n\t}, [registerKeyHandler]);\n\n\tconst variant = !category\n\t\t? 'categories'\n\t\t: rows.length && !rows[0].drillsIn\n\t\t? 'items'\n\t\t: 'sources';\n\n\treturn (\n\t\t<PickerCard className={`bik-mention-picker bik-mention-picker--${variant}`}>\n\t\t\t{header && (\n\t\t\t\t<PickerBack\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={header.onBack}\n\t\t\t\t\tstyle={{ background: COLORS.surface.subdued }}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft width={12} height={12} />\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\n\t\t\t)}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<PickerEmpty>\n\t\t\t\t\t{category === 'subagent'\n\t\t\t\t\t\t? 'No sub-agents available'\n\t\t\t\t\t\t: 'No tools available'}\n\t\t\t\t</PickerEmpty>\n\t\t\t) : (\n\t\t\t\trows.map((row, i) => (\n\t\t\t\t\t<PickerRow\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={i === activeIndex}\n\t\t\t\t\t\tonMouseEnter={() => setActiveIndex(i)}\n\t\t\t\t\t\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t{row.drillsIn && <ChevronRight width={12} height={12} />}\n\t\t\t\t\t</PickerRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t</PickerCard>\n\t);\n};\n\nconst PickerCard = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 240px;\n\tmax-height: 280px;\n\toverflow-y: auto;\n\tbackground: ${COLORS.surface.standard};\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 4px;\n\tbox-shadow: 0px -2px 8px 0px #0000001f;\n`;\n\nconst PickerRow = styled.button<{ $active?: boolean }>`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tgap: 2px;\n\twidth: 100%;\n\tpadding: 8px 10px;\n\theight: 48px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: ${(p) => (p.$active ? COLORS.surface.subdued : 'transparent')};\n\tcursor: pointer;\n\ttext-align: left;\n\n\t&:hover {\n\t\tbackground: ${COLORS.surface.subdued};\n\t}\n`;\n\nconst PickerBack = styled.button`\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 12px 16px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\theight: 48px;\n\tgap: 4px;\n`;\n\nconst PickerEmpty = styled.div`\n\tpadding: 12px 10px;\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tcolor: ${COLORS.content.secondary};\n`;\n"],"names":["CATEGORIES","metaOf","item","rowLabel","MentionPicker","items","onSelect","registerKeyHandler","category","setCategory","useState","source","setSource","activeIndex","setActiveIndex","tools","useMemo","i","subAgents","sources","acc","t","s","header","toolSourceLabel","rows","c","useEffect","navRef","useRef","event","r","h","p","variant","jsxs","PickerCard","PickerBack","COLORS","jsx","ChevronLeft","TitleSmall","PickerEmpty","row","PickerRow","BodySecondary","ChevronRight","styled"],"mappings":"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"}
1
+ {"version":3,"file":"MentionPicker.js","sources":["../../../../../src/components/agent-builder/components/MentionPicker.tsx"],"sourcesContent":["import ChevronLeft from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRight from '@src/assets/icons/chevronRight.svg';\nimport type { MentionDropdownRenderProps, MentionItem } from '@src/editor';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { BodySecondary, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tMentionKindMeta,\n\ttoolSourceLabel,\n} from '../utils/mentionSerialization';\n\ntype Category = 'tool' | 'subagent';\n\nconst CATEGORIES: { key: Category; label: string }[] = [\n\t{ key: 'tool', label: 'Tools' },\n\t{ key: 'subagent', label: 'Sub-agent' },\n];\n\nconst metaOf = (item: MentionItem): MentionKindMeta | undefined =>\n\titem.meta as unknown as MentionKindMeta | undefined;\n\nconst rowLabel = (item: MentionItem): string =>\n\tmetaOf(item)?.plainLabel ?? item.label;\n\n/** One navigable row in the picker's current view. */\ntype PickerRowModel = {\n\tid: string;\n\tlabel: string;\n\t/** Drill-in rows show a chevron; leaf (selectable) rows do not. */\n\tdrillsIn: boolean;\n\tonActivate: () => void;\n};\n\n/**\n * `@` reference picker. Drills:\n * root → Tools → <source> (Manifest / Shopify / …) → tool\n * → Sub-agent → sub-agent\n * (\"Add condition\" and \"Variables\" are intentionally not shown yet.)\n *\n * Owns keyboard navigation (↑/↓ move, →/Enter activate, ← go back) over the\n * CURRENTLY visible rows — registered with the editor via `registerKeyHandler`.\n */\nexport const MentionPicker: React.FC<MentionDropdownRenderProps> = ({\n\titems,\n\tonSelect,\n\tregisterKeyHandler,\n}) => {\n\tconst [category, setCategory] = useState<Category | null>(null);\n\tconst [source, setSource] = useState<string | null>(null);\n\tconst [activeIndex, setActiveIndex] = useState(0);\n\n\tconst tools = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'tool'),\n\t\t[items],\n\t);\n\tconst subAgents = useMemo(\n\t\t() => items.filter((i) => metaOf(i)?.kind === 'subagent'),\n\t\t[items],\n\t);\n\tconst sources = useMemo(() => {\n\t\tconst acc: string[] = [];\n\t\ttools.forEach((t) => {\n\t\t\tconst s = metaOf(t)?.source ?? 'other';\n\t\t\tif (!acc.includes(s)) {\n\t\t\t\tacc.push(s);\n\t\t\t}\n\t\t});\n\t\treturn acc;\n\t}, [tools]);\n\n\t// Only show categories that actually have items. When just one is available\n\t// (e.g. the sub-agent drawer offers tools only), skip the category selector.\n\tconst availableCategories = useMemo(\n\t\t() =>\n\t\t\tCATEGORIES.filter((c) =>\n\t\t\t\tc.key === 'tool' ? tools.length > 0 : subAgents.length > 0,\n\t\t\t),\n\t\t[tools.length, subAgents.length],\n\t);\n\tconst soleCategory =\n\t\tavailableCategories.length === 1 ? availableCategories[0].key : null;\n\tconst activeCategory = category ?? soleCategory;\n\n\t// Title shown above the current view, and whether we can go back a level.\n\t// With a sole category there is no root to go back to (no category header).\n\tconst header: { title: string; onBack: () => void } | null = !activeCategory\n\t\t? null\n\t\t: activeCategory === 'subagent'\n\t\t? soleCategory\n\t\t\t? null\n\t\t\t: { title: 'Sub-agent', onBack: () => setCategory(null) }\n\t\t: source\n\t\t? { title: toolSourceLabel(source), onBack: () => setSource(null) }\n\t\t: soleCategory\n\t\t? null\n\t\t: { title: 'Tools', onBack: () => setCategory(null) };\n\n\t// Build the navigable rows for the current view.\n\tconst rows: PickerRowModel[] = useMemo(() => {\n\t\tif (!activeCategory) {\n\t\t\treturn availableCategories.map((c) => ({\n\t\t\t\tid: c.key,\n\t\t\t\tlabel: c.label,\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => {\n\t\t\t\t\tsetCategory(c.key);\n\t\t\t\t\tsetSource(null);\n\t\t\t\t},\n\t\t\t}));\n\t\t}\n\t\tif (activeCategory === 'subagent') {\n\t\t\treturn subAgents.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t\t}\n\t\tif (!source) {\n\t\t\treturn sources.map((s) => ({\n\t\t\t\tid: s,\n\t\t\t\tlabel: toolSourceLabel(s),\n\t\t\t\tdrillsIn: true,\n\t\t\t\tonActivate: () => setSource(s),\n\t\t\t}));\n\t\t}\n\t\treturn tools\n\t\t\t.filter((t) => (metaOf(t)?.source ?? 'other') === source)\n\t\t\t.map((item) => ({\n\t\t\t\tid: String(item.id),\n\t\t\t\tlabel: rowLabel(item),\n\t\t\t\tdrillsIn: false,\n\t\t\t\tonActivate: () => onSelect(item),\n\t\t\t}));\n\t}, [\n\t\tactiveCategory,\n\t\tavailableCategories,\n\t\tsource,\n\t\ttools,\n\t\tsubAgents,\n\t\tsources,\n\t\tonSelect,\n\t]);\n\n\t// Reset highlight whenever the view (or filtered result set) changes.\n\tuseEffect(() => setActiveIndex(0), [activeCategory, source, items]);\n\n\t// Keep the latest rows/index reachable from the stable key handler.\n\tconst navRef = useRef({ rows, activeIndex, header });\n\tnavRef.current = { rows, activeIndex, header };\n\n\tuseEffect(() => {\n\t\tif (!registerKeyHandler) {\n\t\t\treturn;\n\t\t}\n\t\tregisterKeyHandler((event) => {\n\t\t\tconst { rows: r, activeIndex: i, header: h } = navRef.current;\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tif (r.length) setActiveIndex((p) => (p + r.length - 1) % r.length);\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\tcase 'Enter':\n\t\t\t\t\tr[i]?.onActivate();\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tif (h) {\n\t\t\t\t\t\th.onBack();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn () => registerKeyHandler(null);\n\t}, [registerKeyHandler]);\n\n\tconst variant = !activeCategory\n\t\t? 'categories'\n\t\t: rows.length && !rows[0].drillsIn\n\t\t? 'items'\n\t\t: 'sources';\n\n\treturn (\n\t\t<PickerCard className={`bik-mention-picker bik-mention-picker--${variant}`}>\n\t\t\t{header && (\n\t\t\t\t<PickerBack\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={header.onBack}\n\t\t\t\t\tstyle={{ background: COLORS.surface.subdued }}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft width={12} height={12} />\n\t\t\t\t\t<TitleSmall> {header.title}</TitleSmall>\n\t\t\t\t</PickerBack>\n\t\t\t)}\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<PickerEmpty>\n\t\t\t\t\t{activeCategory === 'subagent'\n\t\t\t\t\t\t? 'No sub-agents available'\n\t\t\t\t\t\t: 'No tools available'}\n\t\t\t\t</PickerEmpty>\n\t\t\t) : (\n\t\t\t\trows.map((row, i) => (\n\t\t\t\t\t<PickerRow\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={i === activeIndex}\n\t\t\t\t\t\tonMouseEnter={() => setActiveIndex(i)}\n\t\t\t\t\t\tonClick={row.onActivate}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BodySecondary color={COLORS.content.primary}>\n\t\t\t\t\t\t\t{row.label}\n\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t{row.drillsIn && <ChevronRight width={12} height={12} />}\n\t\t\t\t\t</PickerRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t</PickerCard>\n\t);\n};\n\nconst PickerCard = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 240px;\n\tmax-height: 280px;\n\toverflow-y: auto;\n\tbackground: ${COLORS.surface.standard};\n\tborder: 1px solid ${COLORS.stroke.primary};\n\tborder-radius: 4px;\n\tbox-shadow: 0px -2px 8px 0px #0000001f;\n`;\n\nconst PickerRow = styled.button<{ $active?: boolean }>`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tgap: 2px;\n\twidth: 100%;\n\tpadding: 8px 10px;\n\theight: 48px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: ${(p) => (p.$active ? COLORS.surface.subdued : 'transparent')};\n\tcursor: pointer;\n\ttext-align: left;\n\n\t&:hover {\n\t\tbackground: ${COLORS.surface.subdued};\n\t}\n`;\n\nconst PickerBack = styled.button`\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 12px 16px;\n\tborder: none;\n\tborder-bottom: 1px solid ${COLORS.stroke.primary};\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont-family: Inter;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\theight: 48px;\n\tgap: 4px;\n`;\n\nconst PickerEmpty = styled.div`\n\tpadding: 12px 10px;\n\tfont-family: Inter;\n\tfont-size: 13px;\n\tcolor: ${COLORS.content.secondary};\n`;\n"],"names":["CATEGORIES","metaOf","item","rowLabel","MentionPicker","items","onSelect","registerKeyHandler","category","setCategory","useState","source","setSource","activeIndex","setActiveIndex","tools","useMemo","i","subAgents","sources","acc","t","s","availableCategories","c","soleCategory","activeCategory","header","toolSourceLabel","rows","useEffect","navRef","useRef","event","r","h","p","variant","jsxs","PickerCard","PickerBack","COLORS","jsx","ChevronLeft","TitleSmall","PickerEmpty","row","PickerRow","BodySecondary","ChevronRight","styled"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),g=require("../../../assets/icons/cross.svg.js"),x=require("../../../assets/icons/plus.svg.js"),R=require("react"),t=require("../../TypographyStyle.js"),n=require("../../../constants/Theme.js"),r=require("../AgentBuilder.styled.js"),O=require("../../dropdown/Dropdown.js"),w=({title:c,helper:i,items:d,addableOptions:l,onAdd:u,onRemove:y,dataTestPrefix:s,emptyText:j})=>{const[a,S]=R.useState(!1);return e.jsxs(r.SideSection,{children:[e.jsxs(r.SideSectionHeader,{children:[e.jsx(t.TitleSmall,{color:n.COLORS.content.primary,children:c}),l.length>0&&e.jsx(r.AddIconButton,{"data-test":`${s}-add`,onClick:()=>S(o=>!o),"aria-label":`Add ${c}`,children:e.jsx(x.default,{width:20,height:20,color:n.COLORS.content.brand})})]}),i&&e.jsx(t.BodyCaption,{color:n.COLORS.content.secondary,children:i}),a&&l.length>0&&e.jsx(O.Dropdown,{"data-test":`${s}-dropdown`,size:"small",width:"100%",isSearchable:!0,placeHolder:`Select ${c.toLowerCase()}`,options:l,onSelect:o=>{const h=(Array.isArray(o)?o[0]:o)?.value;h&&u(h),S(!1)}}),d.length===0&&!a?e.jsx(t.BodyCaption,{color:n.COLORS.content.placeholder,children:j}):d.map(o=>e.jsxs(r.SelectableRow,{"data-test":`${s}-row-${o.id}`,children:[e.jsx(r.RowText,{children:e.jsx(t.BodySecondary,{numberOfLines:1,color:n.COLORS.content.primary,children:o.label})}),e.jsx(r.RowRemoveButton,{onClick:()=>y(o.id),"aria-label":`Remove ${o.label}`,children:e.jsx(g.default,{width:16,height:16,color:n.COLORS.content.secondary})})]},o.id))]})};exports.SelectableListSection=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),C=require("../../../assets/icons/delete.svg.js"),O=require("../../../assets/icons/edit.svg.js"),L=require("../../../assets/icons/plus.svg.js"),A=require("react"),c=require("../../TypographyStyle.js"),o=require("../../../constants/Theme.js"),t=require("../AgentBuilder.styled.js"),$=require("../../dropdown/Dropdown.js"),w="__bik_create_new__",_=({title:d,helper:h,items:u,addableOptions:s,onAdd:b,onRemove:x,dataTestPrefix:r,emptyText:R,createOption:l,onConfigure:i})=>{const[S,j]=A.useState(!1),g=s.length>0||!!l,y=l?[...s,{label:l.label,value:w,searchKey:l.label,customComponent:e.jsx("div",{style:{width:"100%",textAlign:"center",color:o.COLORS.content.brand,fontFamily:"Inter",fontSize:14,fontWeight:600},children:l.label})}]:s;return e.jsxs(t.SideSection,{children:[e.jsxs(t.SideSectionHeader,{children:[e.jsx(c.TitleSmall,{color:o.COLORS.content.primary,children:d}),g&&e.jsx(t.AddIconButton,{"data-test":`${r}-add`,onClick:()=>j(n=>!n),"aria-label":`Add ${d}`,children:e.jsx(L.default,{width:20,height:20,color:o.COLORS.content.brand})})]}),h&&e.jsx(c.BodyCaption,{color:o.COLORS.content.secondary,children:h}),S&&y.length>0&&e.jsx($.Dropdown,{"data-test":`${r}-dropdown`,size:"small",width:"100%",isSearchable:!0,placeHolder:`Select ${d.toLowerCase()}`,options:y,onSelect:n=>{const a=(Array.isArray(n)?n[0]:n)?.value;j(!1),a&&(a===w?l?.onSelect():b(a))}}),u.length===0&&!S?e.jsx(c.BodyCaption,{color:o.COLORS.content.placeholder,children:R}):u.map(n=>e.jsxs(t.SelectableRow,{"data-test":`${r}-row-${n.id}`,children:[e.jsx(t.RowText,{children:e.jsx(c.BodySecondary,{numberOfLines:1,color:o.COLORS.content.primary,children:n.label})}),e.jsxs(t.RowActions,{children:[i&&e.jsx(t.RowMenuButton,{"data-test":`${r}-edit-${n.id}`,"aria-label":`Edit ${n.label}`,onClick:()=>i(n.id),children:e.jsx(O.default,{width:16,height:16,color:o.COLORS.content.secondary})}),i&&e.jsx(t.RowActionDivider,{"aria-hidden":!0}),e.jsx(t.RowMenuButton,{"data-test":`${r}-delete-${n.id}`,"aria-label":`Delete ${n.label}`,onClick:()=>x(n.id),children:e.jsx(C.default,{width:16,height:16,color:o.COLORS.content.secondary})})]})]},n.id))]})};exports.SelectableListSection=_;
2
2
  //# sourceMappingURL=SelectableListSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableListSection.js","sources":["../../../../../src/components/agent-builder/components/SelectableListSection.tsx"],"sourcesContent":["import CrossIcon from '@src/assets/icons/cross.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport React, { useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAddIconButton,\n\tRowRemoveButton,\n\tRowText,\n\tSelectableRow,\n\tSideSection,\n\tSideSectionHeader,\n} from '../AgentBuilder.styled';\n\nexport interface SelectableItem {\n\tid: string;\n\tlabel: string;\n}\n\ninterface SelectableListSectionProps {\n\ttitle: string;\n\thelper?: string;\n\titems: SelectableItem[];\n\t/** Options not yet selected, available to add. */\n\taddableOptions: SingleOption[];\n\tonAdd: (id: string) => void;\n\tonRemove: (id: string) => void;\n\tdataTestPrefix: string;\n\temptyText: string;\n}\n\nexport const SelectableListSection: React.FC<SelectableListSectionProps> = ({\n\ttitle,\n\thelper,\n\titems,\n\taddableOptions,\n\tonAdd,\n\tonRemove,\n\tdataTestPrefix,\n\temptyText,\n}) => {\n\tconst [adding, setAdding] = useState(false);\n\n\treturn (\n\t\t<SideSection>\n\t\t\t<SideSectionHeader>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{title}</TitleSmall>\n\t\t\t\t{addableOptions.length > 0 && (\n\t\t\t\t\t<AddIconButton\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-add`}\n\t\t\t\t\t\tonClick={() => setAdding((v) => !v)}\n\t\t\t\t\t\taria-label={`Add ${title}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<PlusIcon width={20} height={20} color={COLORS.content.brand} />\n\t\t\t\t\t</AddIconButton>\n\t\t\t\t)}\n\t\t\t</SideSectionHeader>\n\n\t\t\t{helper && (\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>{helper}</BodyCaption>\n\t\t\t)}\n\n\t\t\t{adding && addableOptions.length > 0 && (\n\t\t\t\t<Dropdown\n\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\tisSearchable\n\t\t\t\t\tplaceHolder={`Select ${title.toLowerCase()}`}\n\t\t\t\t\toptions={addableOptions}\n\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{items.length === 0 && !adding ? (\n\t\t\t\t<BodyCaption color={COLORS.content.placeholder}>\n\t\t\t\t\t{emptyText}\n\t\t\t\t</BodyCaption>\n\t\t\t) : (\n\t\t\t\titems.map((item) => (\n\t\t\t\t\t<SelectableRow\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-row-${item.id}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RowText>\n\t\t\t\t\t\t\t<BodySecondary numberOfLines={1} color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t</RowText>\n\t\t\t\t\t\t<RowRemoveButton\n\t\t\t\t\t\t\tonClick={() => onRemove(item.id)}\n\t\t\t\t\t\t\taria-label={`Remove ${item.label}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RowRemoveButton>\n\t\t\t\t\t</SelectableRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t</SideSection>\n\t);\n};\n"],"names":["SelectableListSection","title","helper","items","addableOptions","onAdd","onRemove","dataTestPrefix","emptyText","adding","setAdding","useState","SideSection","jsxs","SideSectionHeader","jsx","TitleSmall","COLORS","AddIconButton","v","PlusIcon","BodyCaption","Dropdown","opt","item","SelectableRow","RowText","BodySecondary","RowRemoveButton","CrossIcon"],"mappings":"qYAqCaA,EAA8D,CAAC,CAC3E,MAAAC,EACA,OAAAC,EACA,MAAAC,EACA,eAAAC,EACA,MAAAC,EACA,SAAAC,EACA,eAAAC,EACA,UAAAC,CACD,IAAM,CACL,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EAE1C,cACEC,cAAA,CACA,SAAA,CAAAC,OAACC,EAAAA,kBAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAhB,EAAM,EACjDG,EAAe,OAAS,GACxBW,EAAAA,IAACG,EAAAA,cAAA,CACA,YAAW,GAAGX,CAAc,OAC5B,QAAS,IAAMG,EAAWS,GAAM,CAACA,CAAC,EAClC,aAAY,OAAOlB,CAAK,GAExB,SAAAc,EAAAA,IAACK,WAAS,MAAO,GAAI,OAAQ,GAAI,MAAOH,SAAO,QAAQ,KAAA,CAAO,CAAA,CAAA,CAC/D,EAEF,EAECf,GACAa,EAAAA,IAACM,EAAAA,YAAA,CAAY,MAAOJ,SAAO,QAAQ,UAAY,SAAAf,EAAO,EAGtDO,GAAUL,EAAe,OAAS,GAClCW,EAAAA,IAACO,EAAAA,SAAA,CACA,YAAW,GAAGf,CAAc,YAC5B,KAAK,QACL,MAAM,OACN,aAAY,GACZ,YAAa,UAAUN,EAAM,YAAA,CAAa,GAC1C,QAASG,EACT,SAAWmB,GAAQ,CAElB,MAAMJ,GADS,MAAM,QAAQI,CAAG,EAAIA,EAAI,CAAC,EAAIA,IACT,MAChCJ,GACHd,EAAMc,CAAC,EAERT,EAAU,EAAK,CAChB,CAAA,CAAA,EAIDP,EAAM,SAAW,GAAK,CAACM,QACtBY,EAAAA,YAAA,CAAY,MAAOJ,EAAAA,OAAO,QAAQ,YACjC,SAAAT,CAAA,CACF,EAEAL,EAAM,IAAKqB,GACVX,EAAAA,KAACY,EAAAA,cAAA,CAEA,YAAW,GAAGlB,CAAc,QAAQiB,EAAK,EAAE,GAE3C,SAAA,CAAAT,EAAAA,IAACW,EAAAA,QAAA,CACA,SAAAX,EAAAA,IAACY,EAAAA,cAAA,CAAc,cAAe,EAAG,MAAOV,EAAAA,OAAO,QAAQ,QACrD,SAAAO,EAAK,KAAA,CACP,EACD,EACAT,EAAAA,IAACa,EAAAA,gBAAA,CACA,QAAS,IAAMtB,EAASkB,EAAK,EAAE,EAC/B,aAAY,UAAUA,EAAK,KAAK,GAEhC,SAAAT,EAAAA,IAACc,EAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOZ,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,CACD,CAAA,EAjBKO,EAAK,EAAA,CAmBX,CAAA,EAEH,CAEF"}
1
+ {"version":3,"file":"SelectableListSection.js","sources":["../../../../../src/components/agent-builder/components/SelectableListSection.tsx"],"sourcesContent":["import DeleteIcon from '@src/assets/icons/delete.svg';\nimport EditIcon from '@src/assets/icons/edit.svg';\nimport PlusIcon from '@src/assets/icons/plus.svg';\nimport React, { useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport {\n\tBodyCaption,\n\tBodySecondary,\n\tTitleSmall,\n} from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAddIconButton,\n\tRowActionDivider,\n\tRowActions,\n\tRowMenuButton,\n\tRowText,\n\tSelectableRow,\n\tSideSection,\n\tSideSectionHeader,\n} from '../AgentBuilder.styled';\n\nexport interface SelectableItem {\n\tid: string;\n\tlabel: string;\n}\n\n/** Sentinel value for the \"create new\" entry in the add dropdown. */\nconst CREATE_OPTION_VALUE = '__bik_create_new__';\n\ninterface SelectableListSectionProps {\n\ttitle: string;\n\thelper?: string;\n\titems: SelectableItem[];\n\t/**\n\t * Options shown in the add dropdown. Pass ALL items (not just unselected\n\t * ones) when re-picking an already-added item is allowed (e.g. to insert its\n\t * mention again) — the chip list still shows each item only once.\n\t */\n\taddableOptions: SingleOption[];\n\tonAdd: (id: string) => void;\n\tonRemove: (id: string) => void;\n\tdataTestPrefix: string;\n\temptyText: string;\n\t/**\n\t * Adds a \"create new\" entry at the top of the add dropdown (e.g. \"Create\n\t * sub-agent\"). Selecting it calls `onSelect` instead of `onAdd`.\n\t */\n\tcreateOption?: { label: string; onSelect: () => void };\n\t/**\n\t * When provided, each row's kebab menu gains a \"Configure\" action (above\n\t * \"Delete\"). Omit for tools (Delete only).\n\t */\n\tonConfigure?: (id: string) => void;\n}\n\nexport const SelectableListSection: React.FC<SelectableListSectionProps> = ({\n\ttitle,\n\thelper,\n\titems,\n\taddableOptions,\n\tonAdd,\n\tonRemove,\n\tdataTestPrefix,\n\temptyText,\n\tcreateOption,\n\tonConfigure,\n}) => {\n\tconst [adding, setAdding] = useState(false);\n\tconst showAddButton = addableOptions.length > 0 || !!createOption;\n\t// \"Create new\" is a brand-coloured footer row at the BOTTOM of the dropdown,\n\t// separated from the selectable items by a divider.\n\tconst dropdownOptions: SingleOption[] = createOption\n\t\t? [\n\t\t\t\t...addableOptions,\n\t\t\t\t{\n\t\t\t\t\tlabel: createOption.label,\n\t\t\t\t\tvalue: CREATE_OPTION_VALUE,\n\t\t\t\t\tsearchKey: createOption.label,\n\t\t\t\t\tcustomComponent: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\t\tcolor: COLORS.content.brand,\n\t\t\t\t\t\t\t\tfontFamily: 'Inter',\n\t\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{createOption.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t ]\n\t\t: addableOptions;\n\n\treturn (\n\t\t<SideSection>\n\t\t\t<SideSectionHeader>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{title}</TitleSmall>\n\t\t\t\t{showAddButton && (\n\t\t\t\t\t<AddIconButton\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-add`}\n\t\t\t\t\t\tonClick={() => setAdding((v) => !v)}\n\t\t\t\t\t\taria-label={`Add ${title}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<PlusIcon width={20} height={20} color={COLORS.content.brand} />\n\t\t\t\t\t</AddIconButton>\n\t\t\t\t)}\n\t\t\t</SideSectionHeader>\n\n\t\t\t{helper && (\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>{helper}</BodyCaption>\n\t\t\t)}\n\n\t\t\t{adding && dropdownOptions.length > 0 && (\n\t\t\t\t<Dropdown\n\t\t\t\t\tdata-test={`${dataTestPrefix}-dropdown`}\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\tisSearchable\n\t\t\t\t\tplaceHolder={`Select ${title.toLowerCase()}`}\n\t\t\t\t\toptions={dropdownOptions}\n\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\tsetAdding(false);\n\t\t\t\t\t\tif (!v) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (v === CREATE_OPTION_VALUE) {\n\t\t\t\t\t\t\tcreateOption?.onSelect();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tonAdd(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{items.length === 0 && !adding ? (\n\t\t\t\t<BodyCaption color={COLORS.content.placeholder}>\n\t\t\t\t\t{emptyText}\n\t\t\t\t</BodyCaption>\n\t\t\t) : (\n\t\t\t\titems.map((item) => (\n\t\t\t\t\t<SelectableRow\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tdata-test={`${dataTestPrefix}-row-${item.id}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RowText>\n\t\t\t\t\t\t\t<BodySecondary numberOfLines={1} color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t</RowText>\n\t\t\t\t\t\t<RowActions>\n\t\t\t\t\t\t\t{onConfigure && (\n\t\t\t\t\t\t\t\t// Configurable rows (sub-agents) get an always-visible edit icon.\n\t\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-edit-${item.id}`}\n\t\t\t\t\t\t\t\t\taria-label={`Edit ${item.label}`}\n\t\t\t\t\t\t\t\t\tonClick={() => onConfigure(item.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EditIcon\n\t\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{onConfigure && <RowActionDivider aria-hidden />}\n\t\t\t\t\t\t\t<RowMenuButton\n\t\t\t\t\t\t\t\tdata-test={`${dataTestPrefix}-delete-${item.id}`}\n\t\t\t\t\t\t\t\taria-label={`Delete ${item.label}`}\n\t\t\t\t\t\t\t\tonClick={() => onRemove(item.id)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DeleteIcon\n\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</RowMenuButton>\n\t\t\t\t\t\t</RowActions>\n\t\t\t\t\t</SelectableRow>\n\t\t\t\t))\n\t\t\t)}\n\t\t</SideSection>\n\t);\n};\n"],"names":["CREATE_OPTION_VALUE","SelectableListSection","title","helper","items","addableOptions","onAdd","onRemove","dataTestPrefix","emptyText","createOption","onConfigure","adding","setAdding","useState","showAddButton","dropdownOptions","jsx","COLORS","SideSection","jsxs","SideSectionHeader","TitleSmall","AddIconButton","v","PlusIcon","BodyCaption","Dropdown","opt","item","SelectableRow","RowText","BodySecondary","RowActions","RowMenuButton","EditIcon","RowActionDivider","DeleteIcon"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),s=require("../context/AgentBuilderContext.js"),r=require("../../toaster/Toaster.js"),u=()=>{const{undoToast:t,undoRemoval:o,dismissUndo:e}=s.useAgentBuilderContext();return t?n.jsx(r.Toaster,{text:t.message,type:"info",position:"top-right",autoClose:5e3,hideCloseButton:!0,buttonProps:{buttonText:"Undo",showButton:!0,onButtonClick:()=>(o(),{})},onCloseToast:()=>e()},t.id):null};exports.UndoToast=u;
2
+ //# sourceMappingURL=UndoToast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UndoToast.js","sources":["../../../../../src/components/agent-builder/components/UndoToast.tsx"],"sourcesContent":["import React from 'react';\nimport { Toaster } from '@src/components/toaster';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\n\n/**\n * Top-right toast shown after a tool / sub-agent is removed, offering an Undo.\n * Re-keyed per removal so each one restarts the auto-close timer. Uses the\n * shared `Toaster` (which mounts its own ToastContainer).\n */\nexport const UndoToast: React.FC = () => {\n\tconst { undoToast, undoRemoval, dismissUndo } = useAgentBuilderContext();\n\n\tif (!undoToast) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Toaster\n\t\t\tkey={undoToast.id}\n\t\t\ttext={undoToast.message}\n\t\t\ttype=\"info\"\n\t\t\tposition=\"top-right\"\n\t\t\tautoClose={5000}\n\t\t\thideCloseButton\n\t\t\tbuttonProps={{\n\t\t\t\tbuttonText: 'Undo',\n\t\t\t\tshowButton: true,\n\t\t\t\tonButtonClick: () => {\n\t\t\t\t\tundoRemoval();\n\t\t\t\t\treturn {} as Record<string, never>;\n\t\t\t\t},\n\t\t\t}}\n\t\t\tonCloseToast={() => dismissUndo()}\n\t\t/>\n\t);\n};\n"],"names":["UndoToast","undoToast","undoRemoval","dismissUndo","useAgentBuilderContext","jsx","Toaster"],"mappings":"0MASaA,EAAsB,IAAM,CACxC,KAAM,CAAE,UAAAC,EAAW,YAAAC,EAAa,YAAAC,CAAA,EAAgBC,EAAAA,uBAAA,EAEhD,OAAKH,EAKJI,EAAAA,IAACC,EAAAA,QAAA,CAEA,KAAML,EAAU,QAChB,KAAK,OACL,SAAS,YACT,UAAW,IACX,gBAAe,GACf,YAAa,CACZ,WAAY,OACZ,WAAY,GACZ,cAAe,KACdC,EAAA,EACO,CAAA,EACR,EAED,aAAc,IAAMC,EAAA,CAAY,EAd3BF,EAAU,EAAA,EALT,IAsBT"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Y=require("react/jsx-runtime"),n=require("react"),B=require("../constants/charLimits.js"),u=require("../constants/steps.js"),w=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},V=w(n),K=V.default.createContext(null),F=()=>{const t=n.useContext(K);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},G=t=>{const s=t.trigger.mode==="custom_intent"?(t.trigger.customIntent??"").trim().length>0:t.trigger.intents.length>0;return{about:t.name.trim().length>0&&t.name.length<=B.AGENT_CHAR_LIMITS.name&&t.description.length<=B.AGENT_CHAR_LIMITS.description,trigger:s,response:t.instructions.trim().length>0,handover:!0}},H=({value:t,onChange:s,activeStep:l,onStepChange:S,availableTools:g,availableSubAgents:x,availableIntents:f,availableModels:_,validation:p,applicationType:a,disableStepNavigation:A=!0,children:M})=>{const[T,j]=n.useState("about"),d=l??T,r=u.getStepIndex(d),[E,y]=n.useState(0),i=n.useCallback(e=>{l===void 0&&j(e),S?.(e)},[l,S]),P=n.useCallback(()=>{const e=u.STEP_KEYS[Math.min(r+1,u.STEP_KEYS.length-1)];i(e)},[r,i]),h=n.useCallback(()=>{const e=u.STEP_KEYS[Math.max(r-1,0)];i(e)},[r,i]),C=n.useCallback(e=>s(e),[s]),I=n.useCallback((e,c)=>s({[e]:c}),[s]),R=n.useCallback((e,c)=>{const b=e==="tool"?(()=>{const o=g.find(L=>L.tool_id===c);return o?`{{tool:${o.function_key}}}`:null})():`{{subagent:${c}}}`,k=b?t.instructions.split(b).join(""):t.instructions;s(e==="tool"?{tools:t.tools.filter(o=>o!==c),instructions:k}:{subagents:t.subagents.filter(o=>o!==c),instructions:k}),y(o=>o+1)},[g,t,s]),m=n.useMemo(()=>({...G(t),...p}),[t,p]),q=n.useMemo(()=>({value:t,patch:C,updateField:I,removeReference:R,instructionsResetKey:E,activeStep:d,activeIndex:r,goToStep:i,goNext:P,goPrev:h,isFirstStep:r===0,isLastStep:r===u.STEP_KEYS.length-1,validation:m,isActiveStepValid:m[d],availableTools:g,availableSubAgents:x,availableIntents:f,availableModels:_,applicationType:a,disableStepNavigation:A}),[t,C,I,R,E,d,r,i,P,h,m,g,x,f,_,a,A]);return Y.jsx(K.Provider,{value:q,children:M})};exports.AgentBuilderProvider=H;exports.useAgentBuilderContext=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react/jsx-runtime"),n=require("react"),U=require("../constants/charLimits.js"),d=require("../constants/steps.js"),tt=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},et=tt(n),z=et.default.createContext(null),nt=()=>{const t=n.useContext(z);if(!t)throw new Error("useAgentBuilderContext must be used within an AgentBuilderProvider");return t},st=t=>{const o=t.trigger.mode==="custom_intent"?(t.trigger.customIntent??"").trim().length>0:t.trigger.intents.length>0;return{about:t.name.trim().length>0&&t.name.length<=U.AGENT_CHAR_LIMITS.name&&t.description.length<=U.AGENT_CHAR_LIMITS.description,trigger:o,response:t.instructions.trim().length>0||(t.guardrail??"").trim().length>0,handover:!0}},rt=({value:t,onChange:o,activeStep:R,onStepChange:p,availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,validation:k,applicationType:M,disableStepNavigation:P=!0,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:I,children:J})=>{const[O,Q]=n.useState("about"),a=R??O,c=d.getStepIndex(a),[B,y]=n.useState(0),S=n.useRef({}),j=n.useRef("instructions"),A=n.useCallback((e,r)=>{r?S.current[e]=r:delete S.current[e]},[]),F=n.useCallback(e=>{j.current=e},[]),K=n.useCallback((e,r,f)=>{const l=S.current;(l[j.current]??l.instructions)?.(e,r,f)},[]),[q,x]=n.useState(null),m=n.useRef(null),L=n.useRef(0),i=n.useCallback(e=>{R===void 0&&Q(e),p?.(e)},[R,p]),Y=n.useCallback(()=>{const e=d.STEP_KEYS[Math.min(c+1,d.STEP_KEYS.length-1)];i(e)},[c,i]),$=n.useCallback(()=>{const e=d.STEP_KEYS[Math.max(c-1,0)];i(e)},[c,i]),w=n.useCallback(e=>o(e),[o]),N=n.useCallback((e,r)=>o({[e]:r}),[o]),V=n.useCallback((e,r)=>{const f=e==="tool"?(()=>{const s=u.find(Z=>Z.tool_id===r);return s?`{{tool:${s.function_key}}}`:null})():`{{subagent:${r}}}`,l=s=>f?s.split(f).join(""):s;m.current={tools:t.tools,subagents:t.subagents,instructions:t.instructions,guardrail:t.guardrail};const D={instructions:l(t.instructions),guardrail:l(t.guardrail??""),...e==="tool"?{tools:t.tools.filter(s=>s!==r)}:{subagents:t.subagents.filter(s=>s!==r)}};o(D),y(s=>s+1);const X=e==="tool"?u.find(s=>s.tool_id===r)?.displayName??"Tool":g.find(s=>s.id===r)?.name??"Sub-agent";L.current+=1,x({id:L.current,message:`${e==="tool"?"Tool":"Sub-agent"} "${X}" removed`})},[u,g,t,o]),G=n.useCallback(()=>{m.current&&(o(m.current),m.current=null,y(e=>e+1)),x(null)},[o]),H=n.useCallback(()=>x(null),[]),_=n.useMemo(()=>({...st(t),...k}),[t,k]),W=n.useMemo(()=>({value:t,patch:w,updateField:N,removeReference:V,mentionResetKey:B,insertMention:K,registerMentionField:A,notifyMentionFocus:F,undoToast:q,undoRemoval:G,dismissUndo:H,activeStep:a,activeIndex:c,goToStep:i,goNext:Y,goPrev:$,isFirstStep:c===0,isLastStep:c===d.STEP_KEYS.length-1,validation:_,isActiveStepValid:_[a],availableTools:u,availableSubAgents:g,availableIntents:C,availableModels:E,applicationType:M,disableStepNavigation:P,onCreateSubAgent:T,onFetchSubAgent:b,onUpdateSubAgent:h,onImproveSubAgent:I}),[t,w,N,V,B,K,A,F,q,G,H,a,c,i,Y,$,_,u,g,C,E,M,P,T,b,h,I]);return v.jsx(z.Provider,{value:W,children:J})};exports.AgentBuilderProvider=rt;exports.useAgentBuilderContext=nt;
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, { useCallback, useContext, useMemo, useState } from 'react';\nimport {\n\tAgentTool,\n\tAgentValue,\n\tIntentOption,\n\tModelOption,\n\tStepKey,\n\tStepValidation,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\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 the instructions, then\n\t * bumps `instructionsResetKey` so the editor remounts without those chips.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the instructions editor after an external edit. */\n\tinstructionsResetKey: number;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (value: AgentValue): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.customIntent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= AGENT_CHAR_LIMITS.name &&\n\t\t\tvalue.description.length <= AGENT_CHAR_LIMITS.description,\n\t\ttrigger: triggerValid,\n\t\tresponse: value.instructions.trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tdisableStepNavigation?: boolean;\n\tchildren: React.ReactNode;\n}\n\nexport const AgentBuilderProvider: React.FC<ProviderProps> = ({\n\tvalue,\n\tonChange,\n\tactiveStep: controlledStep,\n\tonStepChange,\n\tavailableTools,\n\tavailableSubAgents,\n\tavailableIntents,\n\tavailableModels,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tdisableStepNavigation = true,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Bumped when instructions are edited from OUTSIDE the editor (e.g. removing\n\t// a tool from the side list), forcing the instructions editor to remount.\n\tconst [instructionsResetKey, setInstructionsResetKey] = useState(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst token =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\t\t\t\t\treturn tool ? `{{tool:${tool.function_key}}}` : null;\n\t\t\t\t\t })()\n\t\t\t\t\t: `{{subagent:${id}}}`;\n\t\t\tconst instructions = token\n\t\t\t\t? value.instructions.split(token).join('')\n\t\t\t\t: value.instructions;\n\t\t\tonChange(\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? { tools: value.tools.filter((t) => t !== id), instructions }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tsubagents: value.subagents.filter((s) => s !== id),\n\t\t\t\t\t\t\tinstructions,\n\t\t\t\t\t },\n\t\t\t);\n\t\t\tsetInstructionsResetKey((k) => k + 1);\n\t\t},\n\t\t[availableTools, value, onChange],\n\t);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value), ...validationOverride }),\n\t\t[value, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\tremoveReference,\n\t\t\tinstructionsResetKey,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tdisableStepNavigation,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\tremoveReference,\n\t\t\tinstructionsResetKey,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tdisableStepNavigation,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","triggerValid","AGENT_CHAR_LIMITS","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","disableStepNavigation","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","instructionsResetKey","setInstructionsResetKey","goToStep","useCallback","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","removeReference","kind","id","token","tool","t","instructions","s","k","validation","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"AgentBuilderContext.js","sources":["../../../../../src/components/agent-builder/context/AgentBuilderContext.tsx"],"sourcesContent":["import type { ApplicationType } from '@bikdotai/bik-models/growth';\nimport React, {\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tAgentTool,\n\tAgentValue,\n\tIntentOption,\n\tModelOption,\n\tStepKey,\n\tStepValidation,\n\tSubAgentDraft,\n\tSubAgentRef,\n} from '../AgentBuilder.model';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { getStepIndex, STEP_KEYS } from '../constants/steps';\n\n/** Mention-capable text fields in Step 3 (both store firebase token text). */\nexport type MentionFieldKey = 'instructions' | 'guardrail';\ntype MentionInsertFn = (\n\tkind: 'tool' | 'subagent',\n\tid: string,\n\tlabel?: string,\n) => void;\n\n/** Toast shown after a tool / sub-agent is removed, offering an undo. */\nexport interface UndoToastState {\n\t/** Bumped per removal so the toast timer restarts. */\n\tid: number;\n\tmessage: string;\n}\n\nexport interface AgentBuilderContextShape {\n\t/** Controlled value relayed from props. */\n\tvalue: AgentValue;\n\t/** Patch one or more fields. */\n\tpatch: (partial: Partial<AgentValue>) => void;\n\t/** Patch a single field. */\n\tupdateField: <K extends keyof AgentValue>(key: K, val: AgentValue[K]) => void;\n\t/**\n\t * Remove a tool / sub-agent everywhere: drops it from the list AND strips ALL\n\t * its `{{tool:KEY}}` / `{{subagent:ID}}` tokens from BOTH the instructions and\n\t * the guardrails, remounts the editors, and raises an undo toast.\n\t */\n\tremoveReference: (kind: 'tool' | 'subagent', id: string) => void;\n\t/** Remount signal for the mention editors after an external edit. */\n\tmentionResetKey: number;\n\t/**\n\t * Insert a tool / sub-agent mention chip at the last cursor position of\n\t * whichever mention field was focused most recently (Instructions or\n\t * Guardrails). `label` overrides the chip text (e.g. a just-created sub-agent\n\t * not yet in the available list).\n\t */\n\tinsertMention: (\n\t\tkind: 'tool' | 'subagent',\n\t\tid: string,\n\t\tlabel?: string,\n\t) => void;\n\t/** A mention field registers its editor-backed insert here (internal). */\n\tregisterMentionField: (\n\t\tfieldKey: MentionFieldKey,\n\t\tfn: MentionInsertFn | null,\n\t) => void;\n\t/** A mention field reports focus so inserts target it (internal). */\n\tnotifyMentionFocus: (fieldKey: MentionFieldKey) => void;\n\n\t// Undo (post-removal)\n\t/** Non-null while the undo toast should be visible. */\n\tundoToast: UndoToastState | null;\n\t/** Restore the last removed tool / sub-agent (list + stripped tokens). */\n\tundoRemoval: () => void;\n\t/** Dismiss the undo toast without restoring. */\n\tdismissUndo: () => void;\n\n\t// Navigation\n\tactiveStep: StepKey;\n\tactiveIndex: number;\n\tgoToStep: (step: StepKey) => void;\n\tgoNext: () => void;\n\tgoPrev: () => void;\n\tisFirstStep: boolean;\n\tisLastStep: boolean;\n\n\t// Validation\n\tvalidation: StepValidation;\n\tisActiveStepValid: boolean;\n\n\t// Reference data\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\t/** Host application context (e.g. MANIFEST) — drives tool-chip labelling. */\n\tapplicationType?: ApplicationType;\n\t/** When true, step-rail items are not clickable (Back / Next only). */\n\tdisableStepNavigation: boolean;\n\n\t// Sub-agent creation (Step 3 drawer)\n\t/** Persist a new sub-agent and resolve with its ref. Omit to hide the create flow. */\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Fetch a sub-agent's editable data (Configure). Omit to hide Configure. */\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\t/** Persist edits to an existing sub-agent. */\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\t/** Optional \"Improve with AI\" for the drawer's instructions / guardrails. */\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n}\n\nconst AgentBuilderContext =\n\tReact.createContext<AgentBuilderContextShape | null>(null);\n\nexport const useAgentBuilderContext = (): AgentBuilderContextShape => {\n\tconst ctx = useContext(AgentBuilderContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'useAgentBuilderContext must be used within an AgentBuilderProvider',\n\t\t);\n\t}\n\treturn ctx;\n};\n\n/** Validity derived purely from the current value (no effects). */\nconst deriveValidation = (value: AgentValue): StepValidation => {\n\tconst triggerValid =\n\t\tvalue.trigger.mode === 'custom_intent'\n\t\t\t? (value.trigger.customIntent ?? '').trim().length > 0\n\t\t\t: value.trigger.intents.length > 0;\n\n\treturn {\n\t\tabout:\n\t\t\tvalue.name.trim().length > 0 &&\n\t\t\tvalue.name.length <= AGENT_CHAR_LIMITS.name &&\n\t\t\tvalue.description.length <= AGENT_CHAR_LIMITS.description,\n\t\ttrigger: triggerValid,\n\t\t// At least one of Instructions / Guardrails must be filled.\n\t\tresponse:\n\t\t\tvalue.instructions.trim().length > 0 ||\n\t\t\t(value.guardrail ?? '').trim().length > 0,\n\t\t// Optional until specced further — never blocks go-live.\n\t\thandover: true,\n\t};\n};\n\ninterface ProviderProps {\n\tvalue: AgentValue;\n\tonChange: (patch: Partial<AgentValue>) => void;\n\tactiveStep?: StepKey;\n\tonStepChange?: (step: StepKey) => void;\n\tavailableTools: AgentTool[];\n\tavailableSubAgents: SubAgentRef[];\n\tavailableIntents: IntentOption[];\n\tavailableModels: ModelOption[];\n\tvalidation?: Partial<StepValidation>;\n\tapplicationType?: ApplicationType;\n\tdisableStepNavigation?: boolean;\n\tonCreateSubAgent?: (draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonFetchSubAgent?: (id: string) => Promise<SubAgentDraft>;\n\tonUpdateSubAgent?: (id: string, draft: SubAgentDraft) => Promise<SubAgentRef>;\n\tonImproveSubAgent?: (\n\t\tkind: 'instructions' | 'guardrail',\n\t\ttext: string,\n\t) => Promise<string>;\n\tchildren: React.ReactNode;\n}\n\nexport const AgentBuilderProvider: React.FC<ProviderProps> = ({\n\tvalue,\n\tonChange,\n\tactiveStep: controlledStep,\n\tonStepChange,\n\tavailableTools,\n\tavailableSubAgents,\n\tavailableIntents,\n\tavailableModels,\n\tvalidation: validationOverride,\n\tapplicationType,\n\tdisableStepNavigation = true,\n\tonCreateSubAgent,\n\tonFetchSubAgent,\n\tonUpdateSubAgent,\n\tonImproveSubAgent,\n\tchildren,\n}) => {\n\tconst [internalStep, setInternalStep] = useState<StepKey>('about');\n\tconst activeStep = controlledStep ?? internalStep;\n\tconst activeIndex = getStepIndex(activeStep);\n\n\t// Bumped when a mention field is edited from OUTSIDE its editor (removing a\n\t// tool from the side list, undo), forcing the mention editors to remount.\n\tconst [mentionResetKey, setMentionResetKey] = useState(0);\n\n\t// Each mention field registers an editor-backed insert fn + reports focus, so\n\t// side-panel adds drop a chip into the last-focused field at its cursor.\n\tconst mentionInsertersRef = useRef<\n\t\tPartial<Record<MentionFieldKey, MentionInsertFn>>\n\t>({});\n\tconst lastFocusedFieldRef = useRef<MentionFieldKey>('instructions');\n\tconst registerMentionField = useCallback(\n\t\t(fieldKey: MentionFieldKey, fn: MentionInsertFn | null) => {\n\t\t\tif (fn) {\n\t\t\t\tmentionInsertersRef.current[fieldKey] = fn;\n\t\t\t} else {\n\t\t\t\tdelete mentionInsertersRef.current[fieldKey];\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\tconst notifyMentionFocus = useCallback((fieldKey: MentionFieldKey) => {\n\t\tlastFocusedFieldRef.current = fieldKey;\n\t}, []);\n\tconst insertMention = useCallback<MentionInsertFn>((kind, id, label) => {\n\t\tconst inserters = mentionInsertersRef.current;\n\t\tconst target =\n\t\t\tinserters[lastFocusedFieldRef.current] ?? inserters.instructions;\n\t\ttarget?.(kind, id, label);\n\t}, []);\n\n\t// Undo state for the most recent removal.\n\tconst [undoToast, setUndoToast] = useState<UndoToastState | null>(null);\n\tconst undoSnapshotRef = useRef<Partial<AgentValue> | null>(null);\n\tconst undoIdRef = useRef(0);\n\n\tconst goToStep = useCallback(\n\t\t(step: StepKey) => {\n\t\t\tif (controlledStep === undefined) {\n\t\t\t\tsetInternalStep(step);\n\t\t\t}\n\t\t\tonStepChange?.(step);\n\t\t},\n\t\t[controlledStep, onStepChange],\n\t);\n\n\tconst goNext = useCallback(() => {\n\t\tconst next = STEP_KEYS[Math.min(activeIndex + 1, STEP_KEYS.length - 1)];\n\t\tgoToStep(next);\n\t}, [activeIndex, goToStep]);\n\n\tconst goPrev = useCallback(() => {\n\t\tconst prev = STEP_KEYS[Math.max(activeIndex - 1, 0)];\n\t\tgoToStep(prev);\n\t}, [activeIndex, goToStep]);\n\n\tconst patch = useCallback(\n\t\t(partial: Partial<AgentValue>) => onChange(partial),\n\t\t[onChange],\n\t);\n\n\tconst updateField = useCallback(\n\t\t<K extends keyof AgentValue>(key: K, val: AgentValue[K]) =>\n\t\t\tonChange({ [key]: val } as Partial<AgentValue>),\n\t\t[onChange],\n\t);\n\n\tconst removeReference = useCallback(\n\t\t(kind: 'tool' | 'subagent', id: string) => {\n\t\t\tconst token =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\t\t\t\t\treturn tool ? `{{tool:${tool.function_key}}}` : null;\n\t\t\t\t\t })()\n\t\t\t\t\t: `{{subagent:${id}}}`;\n\t\t\tconst strip = (text: string) =>\n\t\t\t\ttoken ? text.split(token).join('') : text;\n\n\t\t\t// Snapshot the four fields a removal touches, for undo.\n\t\t\tundoSnapshotRef.current = {\n\t\t\t\ttools: value.tools,\n\t\t\t\tsubagents: value.subagents,\n\t\t\t\tinstructions: value.instructions,\n\t\t\t\tguardrail: value.guardrail,\n\t\t\t};\n\n\t\t\tconst next: Partial<AgentValue> = {\n\t\t\t\tinstructions: strip(value.instructions),\n\t\t\t\tguardrail: strip(value.guardrail ?? ''),\n\t\t\t\t...(kind === 'tool'\n\t\t\t\t\t? { tools: value.tools.filter((t) => t !== id) }\n\t\t\t\t\t: { subagents: value.subagents.filter((s) => s !== id) }),\n\t\t\t};\n\t\t\tonChange(next);\n\t\t\tsetMentionResetKey((k) => k + 1);\n\n\t\t\tconst label =\n\t\t\t\tkind === 'tool'\n\t\t\t\t\t? availableTools.find((t) => t.tool_id === id)?.displayName ?? 'Tool'\n\t\t\t\t\t: availableSubAgents.find((s) => s.id === id)?.name ?? 'Sub-agent';\n\t\t\tundoIdRef.current += 1;\n\t\t\tsetUndoToast({\n\t\t\t\tid: undoIdRef.current,\n\t\t\t\tmessage: `${kind === 'tool' ? 'Tool' : 'Sub-agent'} \"${label}\" removed`,\n\t\t\t});\n\t\t},\n\t\t[availableTools, availableSubAgents, value, onChange],\n\t);\n\n\tconst undoRemoval = useCallback(() => {\n\t\tif (undoSnapshotRef.current) {\n\t\t\tonChange(undoSnapshotRef.current);\n\t\t\tundoSnapshotRef.current = null;\n\t\t\tsetMentionResetKey((k) => k + 1);\n\t\t}\n\t\tsetUndoToast(null);\n\t}, [onChange]);\n\n\tconst dismissUndo = useCallback(() => setUndoToast(null), []);\n\n\tconst validation: StepValidation = useMemo(\n\t\t() => ({ ...deriveValidation(value), ...validationOverride }),\n\t\t[value, validationOverride],\n\t);\n\n\tconst ctx = useMemo<AgentBuilderContextShape>(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tisFirstStep: activeIndex === 0,\n\t\t\tisLastStep: activeIndex === STEP_KEYS.length - 1,\n\t\t\tvalidation,\n\t\t\tisActiveStepValid: validation[activeStep],\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t}),\n\t\t[\n\t\t\tvalue,\n\t\t\tpatch,\n\t\t\tupdateField,\n\t\t\tremoveReference,\n\t\t\tmentionResetKey,\n\t\t\tinsertMention,\n\t\t\tregisterMentionField,\n\t\t\tnotifyMentionFocus,\n\t\t\tundoToast,\n\t\t\tundoRemoval,\n\t\t\tdismissUndo,\n\t\t\tactiveStep,\n\t\t\tactiveIndex,\n\t\t\tgoToStep,\n\t\t\tgoNext,\n\t\t\tgoPrev,\n\t\t\tvalidation,\n\t\t\tavailableTools,\n\t\t\tavailableSubAgents,\n\t\t\tavailableIntents,\n\t\t\tavailableModels,\n\t\t\tapplicationType,\n\t\t\tdisableStepNavigation,\n\t\t\tonCreateSubAgent,\n\t\t\tonFetchSubAgent,\n\t\t\tonUpdateSubAgent,\n\t\t\tonImproveSubAgent,\n\t\t],\n\t);\n\n\treturn (\n\t\t<AgentBuilderContext.Provider value={ctx}>\n\t\t\t{children}\n\t\t</AgentBuilderContext.Provider>\n\t);\n};\n"],"names":["AgentBuilderContext","React","useAgentBuilderContext","ctx","useContext","deriveValidation","value","triggerValid","AGENT_CHAR_LIMITS","AgentBuilderProvider","onChange","controlledStep","onStepChange","availableTools","availableSubAgents","availableIntents","availableModels","validationOverride","applicationType","disableStepNavigation","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","children","internalStep","setInternalStep","useState","activeStep","activeIndex","getStepIndex","mentionResetKey","setMentionResetKey","mentionInsertersRef","useRef","lastFocusedFieldRef","registerMentionField","useCallback","fieldKey","fn","notifyMentionFocus","insertMention","kind","id","label","inserters","undoToast","setUndoToast","undoSnapshotRef","undoIdRef","goToStep","step","goNext","next","STEP_KEYS","goPrev","prev","patch","partial","updateField","key","val","removeReference","token","tool","t","strip","text","k","undoRemoval","dismissUndo","validation","useMemo"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),g=require("../../TypographyStyle.js"),m=require("../../../constants/Theme.js"),o=require("../AgentBuilder.styled.js"),j=require("../components/InstructionsField.js"),A=require("../components/RichTextField.js"),b=require("../components/SelectableListSection.js"),f=require("../components/StepSectionHeader.js"),q=require("../constants/charLimits.js"),I=require("../constants/steps.js"),O=require("../context/AgentBuilderContext.js"),R=require("../../dropdown/Dropdown.js"),S=I.STEP_DEFINITIONS[2],L=()=>{const{value:l,patch:r,updateField:d,removeReference:c,availableTools:u,availableSubAgents:p,availableModels:i}=O.useAgentBuilderContext(),x=l.tools.map(e=>{const s=u.find(n=>n.tool_id===e);return s?{id:e,label:s.displayName}:null}).filter(e=>e!==null),h=u.filter(e=>!l.tools.includes(e.tool_id)).map(e=>({label:e.displayName,value:e.tool_id,subText:e.description})),v=l.subagents.map(e=>{const s=p.find(n=>n.id===e);return s?{id:e,label:s.name}:null}).filter(e=>e!==null),T=p.filter(e=>!l.subagents.includes(e.id)).map(e=>({label:e.name,value:e.id})),y=i.map(e=>({label:e.label,value:e.value,selected:e.value===l.model})),a=i.find(e=>e.value===l.model);return t.jsxs("div",{className:"bik-agent-step bik-agent-step--response",children:[t.jsx(f.StepSectionHeader,{title:S.title,helper:S.helper}),t.jsxs(o.Step3Grid,{children:[t.jsxs(o.Step3Main,{children:[t.jsx(j.InstructionsField,{}),t.jsx(A.RichTextField,{"data-test":"agent-guardrail",label:"Guardrails",value:l.guardrail??"",onChange:e=>d("guardrail",e),maxLength:q.AGENT_CHAR_LIMITS.guardrail,placeholder:"Things this agent must never do.",minHeight:"140px",resetKey:l.id})]}),t.jsxs(o.Step3Side,{children:[t.jsx(b.SelectableListSection,{title:"Tools",dataTestPrefix:"agent-tools",items:x,addableOptions:h,emptyText:"No tools added yet.",onAdd:e=>r({tools:[...l.tools,e]}),onRemove:e=>c("tool",e)}),t.jsx(b.SelectableListSection,{title:"Sub-agents",dataTestPrefix:"agent-subagents",items:v,addableOptions:T,emptyText:"No sub-agents added yet.",onAdd:e=>r({subagents:[...l.subagents,e]}),onRemove:e=>c("subagent",e)}),i.length>0&&t.jsxs(o.SideSection,{children:[t.jsx(g.TitleSmall,{color:m.COLORS.content.primary,children:"Advanced settings"}),t.jsx(g.TitleSmall,{color:m.COLORS.content.secondary,children:"Select AI model"}),t.jsx(R.Dropdown,{"data-test":"agent-model",size:"small",width:"100%",placeHolder:"Select model",options:y,defaultOptions:a?[{label:a.label,value:a.value}]:void 0,onSelect:e=>{const n=(Array.isArray(e)?e[0]:e)?.value;n&&d("model",n)}})]})]})]})]})};exports.Step3HowItResponds=L;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),o=require("react"),A=require("../../TypographyStyle.js"),x=require("../../../constants/Theme.js"),b=require("../AgentBuilder.styled.js"),D=require("../components/CreateSubAgentPanel.js"),T=require("../components/MentionField.js"),C=require("../components/SelectableListSection.js"),K=require("../components/StepSectionHeader.js"),I=require("../constants/charLimits.js"),z=require("../constants/steps.js"),U=require("../context/AgentBuilderContext.js"),W=require("../utils/mentionSerialization.js"),$=require("../../dropdown/Dropdown.js"),j=z.STEP_DEFINITIONS[2],J=()=>{const{value:s,patch:i,updateField:q,removeReference:v,availableTools:S,availableSubAgents:O,availableModels:m,applicationType:w,insertMention:r,onCreateSubAgent:c,onFetchSubAgent:u,onUpdateSubAgent:h,onImproveSubAgent:R}=U.useAgentBuilderContext(),[l,d]=o.useState(null),g=o.useRef(0),[L,y]=o.useState([]),p=new Map;O.forEach(e=>p.set(e.id,e)),L.forEach(e=>p.set(e.id,e));const M=Array.from(p.values()),k=o.useCallback(()=>{g.current+=1,d({key:g.current,title:"Create sub-agent"})},[]),H=o.useCallback(async e=>{if(!u)return;const t=await u(e);g.current+=1,d({key:g.current,title:"Edit sub-agent",editingId:e,initial:t})},[u]),N=o.useCallback(async e=>{if(l?.editingId){if(h){const t=await h(l.editingId,e);y(a=>[...a.filter(G=>G.id!==t.id),t])}}else if(c){const t=await c(e);y(a=>[...a,t]),i({subagents:[...s.subagents,t.id]}),r("subagent",t.id,`sub-agent: ${t.name}`)}d(null)},[l,h,c,i,s.subagents,r]),P=s.tools.map(e=>{const t=S.find(a=>a.tool_id===e);return t?{id:e,label:t.displayName}:null}).filter(e=>e!==null),E=S.map(e=>({label:e.displayName,value:e.tool_id,subText:e.description})),_=s.subagents.map(e=>{const t=p.get(e);return t?{id:e,label:t.name}:null}).filter(e=>e!==null),F=M.map(e=>({label:e.name,value:e.id})),B=m.map(e=>({label:e.label,value:e.value,selected:e.value===s.model})),f=m.find(e=>e.value===s.model);return n.jsxs("div",{className:"bik-agent-step bik-agent-step--response",children:[n.jsx(K.StepSectionHeader,{title:j.title,helper:j.helper}),n.jsxs(b.Step3Grid,{children:[n.jsxs(b.Step3Main,{children:[n.jsx(T.MentionField,{fieldKey:"instructions","data-test":"agent-instructions",label:"Instructions",maxLength:I.AGENT_CHAR_LIMITS.instructions,placeholder:"Write what this agent should do. Type @ to reference a tool or sub-agent.",minHeight:"200px"}),n.jsx(T.MentionField,{fieldKey:"guardrail","data-test":"agent-guardrail",label:"Guardrails",maxLength:I.AGENT_CHAR_LIMITS.guardrail,placeholder:"Things this agent must never do. Type @ to reference a tool or sub-agent.",minHeight:"140px"})]}),n.jsxs(b.Step3Side,{children:[n.jsx(C.SelectableListSection,{title:"Tools",helper:"Actions this agent can take while responding.",dataTestPrefix:"agent-tools",items:P,addableOptions:E,emptyText:"No tools added yet.",onAdd:e=>{r("tool",e),s.tools.includes(e)||i({tools:[...s.tools,e]})},onRemove:e=>v("tool",e)}),n.jsx(C.SelectableListSection,{title:"Sub-agents",helper:"Other agents this agent can hand off the conversation to.",dataTestPrefix:"agent-subagents",items:_,addableOptions:F,emptyText:"No sub-agents added yet.",onAdd:e=>{r("subagent",e),s.subagents.includes(e)||i({subagents:[...s.subagents,e]})},onRemove:e=>v("subagent",e),onConfigure:u?H:void 0,createOption:c?{label:"Create new",onSelect:k}:void 0}),m.length>0&&n.jsxs(b.SideSection,{children:[n.jsx(A.TitleSmall,{color:x.COLORS.content.primary,children:"Advanced settings"}),n.jsx(A.TitleSmall,{color:x.COLORS.content.secondary,children:"Select AI model"}),n.jsx($.Dropdown,{"data-test":"agent-model",size:"small",width:"100%",placeHolder:"Select model",options:B,defaultOptions:f?[{label:f.label,value:f.value}]:void 0,onSelect:e=>{const a=(Array.isArray(e)?e[0]:e)?.value;a&&q("model",a)}})]})]})]}),l&&n.jsx(D.CreateSubAgentPanel,{title:l.title,initial:l.initial,availableTools:S,appLabel:W.appTypeLabel(w),onImprove:R,onClose:()=>d(null),onSave:N},l.key)]})};exports.Step3HowItResponds=J;
2
2
  //# sourceMappingURL=Step3HowItResponds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Step3HowItResponds.js","sources":["../../../../../src/components/agent-builder/steps/Step3HowItResponds.tsx"],"sourcesContent":["import React from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tSideSection,\n\tStep3Grid,\n\tStep3Main,\n\tStep3Side,\n} from '../AgentBuilder.styled';\nimport { InstructionsField } from '../components/InstructionsField';\nimport { RichTextField } from '../components/RichTextField';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n} from '../components/SelectableListSection';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\n\nconst STEP = STEP_DEFINITIONS[2];\n\nexport const Step3HowItResponds: React.FC = () => {\n\tconst {\n\t\tvalue,\n\t\tpatch,\n\t\tupdateField,\n\t\tremoveReference,\n\t\tavailableTools,\n\t\tavailableSubAgents,\n\t\tavailableModels,\n\t} = useAgentBuilderContext();\n\n\tconst toolItems: SelectableItem[] = value.tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool ? { id, label: tool.displayName } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\tconst toolOptions: SingleOption[] = availableTools\n\t\t.filter((t) => !value.tools.includes(t.tool_id))\n\t\t.map((t) => ({\n\t\t\tlabel: t.displayName,\n\t\t\tvalue: t.tool_id,\n\t\t\tsubText: t.description,\n\t\t}));\n\n\tconst subAgentItems: SelectableItem[] = value.subagents\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst sub = availableSubAgents.find((s) => s.id === id);\n\t\t\treturn sub ? { id, label: sub.name } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\tconst subAgentOptions: SingleOption[] = availableSubAgents\n\t\t.filter((s) => !value.subagents.includes(s.id))\n\t\t.map((s) => ({ label: s.name, value: s.id }));\n\n\tconst modelOptions: SingleOption[] = availableModels.map((m) => ({\n\t\tlabel: m.label,\n\t\tvalue: m.value,\n\t\tselected: m.value === value.model,\n\t}));\n\tconst selectedModel = availableModels.find((m) => m.value === value.model);\n\n\treturn (\n\t\t<div className=\"bik-agent-step bik-agent-step--response\">\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<Step3Grid>\n\t\t\t\t<Step3Main>\n\t\t\t\t\t<InstructionsField />\n\n\t\t\t\t\t<RichTextField\n\t\t\t\t\t\tdata-test=\"agent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tvalue={value.guardrail ?? ''}\n\t\t\t\t\t\tonChange={(text) => updateField('guardrail', text)}\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.guardrail}\n\t\t\t\t\t\tplaceholder=\"Things this agent must never do.\"\n\t\t\t\t\t\tminHeight=\"140px\"\n\t\t\t\t\t\tresetKey={value.id}\n\t\t\t\t\t/>\n\t\t\t\t</Step3Main>\n\n\t\t\t\t<Step3Side>\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools\"\n\t\t\t\t\t\t// helper=\"Actions this agent can take while responding.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\t\tonAdd={(id) => patch({ tools: [...value.tools, id] })}\n\t\t\t\t\t\tonRemove={(id) => removeReference('tool', id)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Sub-agents\"\n\t\t\t\t\t\t// helper=\"Other agents this agent can hand off the conversation to.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-subagents\"\n\t\t\t\t\t\titems={subAgentItems}\n\t\t\t\t\t\taddableOptions={subAgentOptions}\n\t\t\t\t\t\temptyText=\"No sub-agents added yet.\"\n\t\t\t\t\t\tonAdd={(id) => patch({ subagents: [...value.subagents, id] })}\n\t\t\t\t\t\tonRemove={(id) => removeReference('subagent', id)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{availableModels.length > 0 && (\n\t\t\t\t\t\t<SideSection>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\tAdvanced settings\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\tSelect AI model\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"agent-model\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select model\"\n\t\t\t\t\t\t\t\toptions={modelOptions}\n\t\t\t\t\t\t\t\tdefaultOptions={\n\t\t\t\t\t\t\t\t\tselectedModel\n\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: selectedModel.label,\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: selectedModel.value,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\tupdateField('model', v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</SideSection>\n\t\t\t\t\t)}\n\t\t\t\t</Step3Side>\n\t\t\t</Step3Grid>\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step3HowItResponds","value","patch","updateField","removeReference","availableTools","availableSubAgents","availableModels","useAgentBuilderContext","toolItems","id","tool","t","x","toolOptions","subAgentItems","sub","s","subAgentOptions","modelOptions","m","selectedModel","jsxs","jsx","StepSectionHeader","Step3Grid","Step3Main","InstructionsField","RichTextField","text","AGENT_CHAR_LIMITS","Step3Side","SelectableListSection","SideSection","TitleSmall","COLORS","Dropdown","opt","v"],"mappings":"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"}
1
+ {"version":3,"file":"Step3HowItResponds.js","sources":["../../../../../src/components/agent-builder/steps/Step3HowItResponds.tsx"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\nimport { Dropdown } from '@src/components/dropdown';\nimport { SingleOption } from '@src/components/dropdown/type';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport { SubAgentDraft, SubAgentRef } from '../AgentBuilder.model';\nimport {\n\tSideSection,\n\tStep3Grid,\n\tStep3Main,\n\tStep3Side,\n} from '../AgentBuilder.styled';\nimport { CreateSubAgentPanel } from '../components/CreateSubAgentPanel';\nimport { MentionField } from '../components/MentionField';\nimport {\n\tSelectableItem,\n\tSelectableListSection,\n} from '../components/SelectableListSection';\nimport { StepSectionHeader } from '../components/StepSectionHeader';\nimport { AGENT_CHAR_LIMITS } from '../constants/charLimits';\nimport { STEP_DEFINITIONS } from '../constants/steps';\nimport { useAgentBuilderContext } from '../context/AgentBuilderContext';\nimport { appTypeLabel } from '../utils/mentionSerialization';\n\nconst STEP = STEP_DEFINITIONS[2];\n\n/** Drawer state — null when closed; `key` remounts it fresh per open. */\ninterface SubAgentPanelState {\n\tkey: number;\n\ttitle: string;\n\teditingId?: string;\n\tinitial?: SubAgentDraft;\n}\n\nexport const Step3HowItResponds: React.FC = () => {\n\tconst {\n\t\tvalue,\n\t\tpatch,\n\t\tupdateField,\n\t\tremoveReference,\n\t\tavailableTools,\n\t\tavailableSubAgents,\n\t\tavailableModels,\n\t\tapplicationType,\n\t\tinsertMention,\n\t\tonCreateSubAgent,\n\t\tonFetchSubAgent,\n\t\tonUpdateSubAgent,\n\t\tonImproveSubAgent,\n\t} = useAgentBuilderContext();\n\n\tconst [panel, setPanel] = useState<SubAgentPanelState | null>(null);\n\tconst panelKeyRef = useRef(0);\n\t// Sub-agents created / edited in this session, so a chip resolves (and reflects\n\t// a renamed sub-agent) before the consumer refreshes `availableSubAgents`.\n\tconst [createdSubAgents, setCreatedSubAgents] = useState<SubAgentRef[]>([]);\n\t// Created/edited refs take precedence over the consumer-supplied list.\n\tconst subAgentById = new Map<string, SubAgentRef>();\n\tavailableSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tcreatedSubAgents.forEach((s) => subAgentById.set(s.id, s));\n\tconst knownSubAgents = Array.from(subAgentById.values());\n\n\tconst openCreate = useCallback(() => {\n\t\tpanelKeyRef.current += 1;\n\t\tsetPanel({ key: panelKeyRef.current, title: 'Create sub-agent' });\n\t}, []);\n\n\tconst openConfigure = useCallback(\n\t\tasync (id: string) => {\n\t\t\tif (!onFetchSubAgent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst data = await onFetchSubAgent(id);\n\t\t\tpanelKeyRef.current += 1;\n\t\t\tsetPanel({\n\t\t\t\tkey: panelKeyRef.current,\n\t\t\t\ttitle: 'Edit sub-agent',\n\t\t\t\teditingId: id,\n\t\t\t\tinitial: data,\n\t\t\t});\n\t\t},\n\t\t[onFetchSubAgent],\n\t);\n\n\tconst handlePanelSave = useCallback(\n\t\tasync (draft: SubAgentDraft) => {\n\t\t\tif (panel?.editingId) {\n\t\t\t\tif (onUpdateSubAgent) {\n\t\t\t\t\tconst ref = await onUpdateSubAgent(panel.editingId, draft);\n\t\t\t\t\tsetCreatedSubAgents((prev) => [\n\t\t\t\t\t\t...prev.filter((s) => s.id !== ref.id),\n\t\t\t\t\t\tref,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t} else if (onCreateSubAgent) {\n\t\t\t\tconst ref = await onCreateSubAgent(draft);\n\t\t\t\tsetCreatedSubAgents((prev) => [...prev, ref]);\n\t\t\t\tpatch({ subagents: [...value.subagents, ref.id] });\n\t\t\t\tinsertMention('subagent', ref.id, `sub-agent: ${ref.name}`);\n\t\t\t}\n\t\t\tsetPanel(null);\n\t\t},\n\t\t[\n\t\t\tpanel,\n\t\t\tonUpdateSubAgent,\n\t\t\tonCreateSubAgent,\n\t\t\tpatch,\n\t\t\tvalue.subagents,\n\t\t\tinsertMention,\n\t\t],\n\t);\n\n\tconst toolItems: SelectableItem[] = value.tools\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst tool = availableTools.find((t) => t.tool_id === id);\n\t\t\treturn tool ? { id, label: tool.displayName } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\t// All tools are offered (even already-added ones) so a tool can be referenced\n\t// again in the text; the chip list below still shows each only once.\n\tconst toolOptions: SingleOption[] = availableTools.map((t) => ({\n\t\tlabel: t.displayName,\n\t\tvalue: t.tool_id,\n\t\tsubText: t.description,\n\t}));\n\n\tconst subAgentItems: SelectableItem[] = value.subagents\n\t\t.map((id): SelectableItem | null => {\n\t\t\tconst sub = subAgentById.get(id);\n\t\t\treturn sub ? { id, label: sub.name } : null;\n\t\t})\n\t\t.filter((x): x is SelectableItem => x !== null);\n\n\tconst subAgentOptions: SingleOption[] = knownSubAgents.map((s) => ({\n\t\tlabel: s.name,\n\t\tvalue: s.id,\n\t}));\n\n\tconst modelOptions: SingleOption[] = availableModels.map((m) => ({\n\t\tlabel: m.label,\n\t\tvalue: m.value,\n\t\tselected: m.value === value.model,\n\t}));\n\tconst selectedModel = availableModels.find((m) => m.value === value.model);\n\n\treturn (\n\t\t<div className=\"bik-agent-step bik-agent-step--response\">\n\t\t\t<StepSectionHeader title={STEP.title} helper={STEP.helper} />\n\n\t\t\t<Step3Grid>\n\t\t\t\t<Step3Main>\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"instructions\"\n\t\t\t\t\t\tdata-test=\"agent-instructions\"\n\t\t\t\t\t\tlabel=\"Instructions\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.instructions}\n\t\t\t\t\t\tplaceholder=\"Write what this agent should do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"200px\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<MentionField\n\t\t\t\t\t\tfieldKey=\"guardrail\"\n\t\t\t\t\t\tdata-test=\"agent-guardrail\"\n\t\t\t\t\t\tlabel=\"Guardrails\"\n\t\t\t\t\t\tmaxLength={AGENT_CHAR_LIMITS.guardrail}\n\t\t\t\t\t\tplaceholder=\"Things this agent must never do. Type @ to reference a tool or sub-agent.\"\n\t\t\t\t\t\tminHeight=\"140px\"\n\t\t\t\t\t/>\n\t\t\t\t</Step3Main>\n\n\t\t\t\t<Step3Side>\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Tools\"\n\t\t\t\t\t\thelper=\"Actions this agent can take while responding.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-tools\"\n\t\t\t\t\t\titems={toolItems}\n\t\t\t\t\t\taddableOptions={toolOptions}\n\t\t\t\t\t\temptyText=\"No tools added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\t// Always drop a chip at the cursor; keep the list deduped.\n\t\t\t\t\t\t\tinsertMention('tool', id);\n\t\t\t\t\t\t\tif (!value.tools.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ tools: [...value.tools, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('tool', id)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SelectableListSection\n\t\t\t\t\t\ttitle=\"Sub-agents\"\n\t\t\t\t\t\thelper=\"Other agents this agent can hand off the conversation to.\"\n\t\t\t\t\t\tdataTestPrefix=\"agent-subagents\"\n\t\t\t\t\t\titems={subAgentItems}\n\t\t\t\t\t\taddableOptions={subAgentOptions}\n\t\t\t\t\t\temptyText=\"No sub-agents added yet.\"\n\t\t\t\t\t\tonAdd={(id) => {\n\t\t\t\t\t\t\tinsertMention('subagent', id);\n\t\t\t\t\t\t\tif (!value.subagents.includes(id)) {\n\t\t\t\t\t\t\t\tpatch({ subagents: [...value.subagents, id] });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonRemove={(id) => removeReference('subagent', id)}\n\t\t\t\t\t\tonConfigure={onFetchSubAgent ? openConfigure : undefined}\n\t\t\t\t\t\tcreateOption={\n\t\t\t\t\t\t\tonCreateSubAgent\n\t\t\t\t\t\t\t\t? { label: 'Create new', onSelect: openCreate }\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{availableModels.length > 0 && (\n\t\t\t\t\t\t<SideSection>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.primary}>\n\t\t\t\t\t\t\t\tAdvanced settings\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<TitleSmall color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\tSelect AI model\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\tdata-test=\"agent-model\"\n\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\tplaceHolder=\"Select model\"\n\t\t\t\t\t\t\t\toptions={modelOptions}\n\t\t\t\t\t\t\t\tdefaultOptions={\n\t\t\t\t\t\t\t\t\tselectedModel\n\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: selectedModel.label,\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: selectedModel.value,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonSelect={(opt) => {\n\t\t\t\t\t\t\t\t\tconst single = Array.isArray(opt) ? opt[0] : opt;\n\t\t\t\t\t\t\t\t\tconst v = (single as SingleOption)?.value;\n\t\t\t\t\t\t\t\t\tif (v) {\n\t\t\t\t\t\t\t\t\t\tupdateField('model', v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</SideSection>\n\t\t\t\t\t)}\n\t\t\t\t</Step3Side>\n\t\t\t</Step3Grid>\n\n\t\t\t{panel && (\n\t\t\t\t<CreateSubAgentPanel\n\t\t\t\t\tkey={panel.key}\n\t\t\t\t\ttitle={panel.title}\n\t\t\t\t\tinitial={panel.initial}\n\t\t\t\t\tavailableTools={availableTools}\n\t\t\t\t\tappLabel={appTypeLabel(applicationType)}\n\t\t\t\t\tonImprove={onImproveSubAgent}\n\t\t\t\t\tonClose={() => setPanel(null)}\n\t\t\t\t\tonSave={handlePanelSave}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["STEP","STEP_DEFINITIONS","Step3HowItResponds","value","patch","updateField","removeReference","availableTools","availableSubAgents","availableModels","applicationType","insertMention","onCreateSubAgent","onFetchSubAgent","onUpdateSubAgent","onImproveSubAgent","useAgentBuilderContext","panel","setPanel","useState","panelKeyRef","useRef","createdSubAgents","setCreatedSubAgents","subAgentById","s","knownSubAgents","openCreate","useCallback","openConfigure","id","data","handlePanelSave","draft","ref","prev","toolItems","tool","t","x","toolOptions","subAgentItems","sub","subAgentOptions","modelOptions","m","selectedModel","jsxs","jsx","StepSectionHeader","Step3Grid","Step3Main","MentionField","AGENT_CHAR_LIMITS","Step3Side","SelectableListSection","SideSection","TitleSmall","COLORS","Dropdown","opt","v","CreateSubAgentPanel","appTypeLabel"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={manifest:"Manifest",shopify:"Shopify",integration:"Integration"},u=(t,o="Manifest")=>t?c[t]??t:o,m=t=>{const o=t?String(t):"";return o==="BIK"?"BIK":o==="BSP"?"BSP":"Manifest"},b=(t,o,e="Manifest")=>[...t.map(n=>({id:n.tool_id,label:`${u(n.source,e)} : ${n.displayName}`,meta:{kind:"tool",functionKey:n.function_key,plainLabel:n.displayName,source:n.source}})),...o.map(n=>({id:n.id,label:`sub-agent: ${n.name}`,meta:{kind:"subagent",plainLabel:n.name}}))],a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),s=t=>a(t).replace(/"/g,"&quot;"),g=(t,o,e)=>`<span data-type="mentionAgent" class="bik-mention bik-mention--agent" data-id="${s(t)}" data-label="${s(o)}" data-kind="${s(e)}">${a(o)}</span>`,f=t=>{const o=new Map;for(const e of t){const n=e.meta;n?.kind==="tool"&&n.functionKey?o.set(`tool:${n.functionKey}`,e):n?.kind==="subagent"&&o.set(`subagent:${String(e.id)}`,e)}return o},l=/\{\{(tool:[^}]+|subagent:[^}]+)\}\}/g,k=(t,o)=>{let e="",n=0;l.lastIndex=0;let i;for(;(i=l.exec(t))!==null;){e+=a(t.slice(n,i.index));const r=o.get(i[1]);if(r){const d=r.meta.kind;e+=g(String(r.id),r.label,d)}else e+=a(i[0]);n=l.lastIndex}return e+=a(t.slice(n)),e.replace(/\n/g,"<br>")},y=(t,o=[])=>{if(!t)return"";const e=f(o);return t.split(/\n{2,}/).map(n=>`<p>${k(n,e)}</p>`).join("")},S=(t,o)=>{const e=o[t];return e?`{{tool:${e}}}`:`{{subagent:${t}}}`},p=(t,o)=>{switch(t.type){case"text":return t.text??"";case"mentionAgent":case"mentionTeam":{const e=t.attrs?.id;return e==null?"":S(String(e),o)}case"variable":return`{{${String(t.attrs?.variableName??"")}}}`;case"hardBreak":return`
2
- `;default:{const e=(t.content??[]).map(i=>p(i,o)).join("");return["paragraph","heading","listItem","blockquote"].includes(t.type)?`${e}
3
- `:e}}},T=(t,o)=>{if(!t)return"";const e=o.reduce((n,i)=>(n[i.tool_id]=i.function_key,n),{});return p(t,e).replace(/\n+$/,"")};exports.TOOL_SOURCE_LABELS=c;exports.appTypeLabel=m;exports.buildAgentMentionItems=b;exports.editorDocToInstructions=T;exports.instructionsToEditorHtml=y;exports.toolSourceLabel=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={manifest:"Manifest",shopify:"Shopify",integration:"Integration"},u=(t,n="Manifest")=>t?c[t]??t:n,b=t=>{const n=t?String(t):"";return n==="BIK"?"BIK":n==="BSP"?"BSP":"Manifest"},g=(t,n,e="Manifest")=>[...t.map(o=>({id:o.tool_id,label:`${u(o.source,e)} : ${o.displayName}`,meta:{kind:"tool",functionKey:o.function_key,plainLabel:o.displayName,source:o.source}})),...n.map(o=>({id:o.id,label:`sub-agent: ${o.name}`,meta:{kind:"subagent",plainLabel:o.name}}))],a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),s=t=>a(t).replace(/"/g,"&quot;"),d=(t,n,e)=>`<span data-type="mentionAgent" class="bik-mention bik-mention--agent" data-id="${s(t)}" data-label="${s(n)}" data-kind="${s(e)}">${a(n)}</span>`,f=(t,n,e)=>d(t,n,e),k=t=>{const n=new Map;for(const e of t){const o=e.meta;o?.kind==="tool"&&o.functionKey?n.set(`tool:${o.functionKey}`,e):o?.kind==="subagent"&&n.set(`subagent:${String(e.id)}`,e)}return n},l=/\{\{(tool:[^}]+|subagent:[^}]+)\}\}/g,y=(t,n)=>{let e="",o=0;l.lastIndex=0;let i;for(;(i=l.exec(t))!==null;){e+=a(t.slice(o,i.index));const r=n.get(i[1]);if(r){const m=r.meta.kind;e+=d(String(r.id),r.label,m)}else e+=a(i[0]);o=l.lastIndex}return e+=a(t.slice(o)),e.replace(/\n/g,"<br>")},S=(t,n=[])=>{if(!t)return"";const e=k(n);return t.split(/\n{2,}/).map(o=>`<p>${y(o,e)}</p>`).join("")},T=(t,n)=>{const e=n[t];return e?`{{tool:${e}}}`:`{{subagent:${t}}}`},p=(t,n)=>{switch(t.type){case"text":return t.text??"";case"mentionAgent":case"mentionTeam":{const e=t.attrs?.id;return e==null?"":T(String(e),n)}case"variable":return`{{${String(t.attrs?.variableName??"")}}}`;case"hardBreak":return`
2
+ `;default:{const e=(t.content??[]).map(i=>p(i,n)).join("");return["paragraph","heading","listItem","blockquote"].includes(t.type)?`${e}
3
+ `:e}}},L=(t,n)=>{if(!t)return"";const e=n.reduce((o,i)=>(o[i.tool_id]=i.function_key,o),{});return p(t,e).replace(/\n+$/,"")};exports.TOOL_SOURCE_LABELS=c;exports.appTypeLabel=b;exports.buildAgentMentionItems=g;exports.buildMentionHtml=f;exports.editorDocToInstructions=L;exports.instructionsToEditorHtml=S;exports.toolSourceLabel=u;
4
4
  //# sourceMappingURL=mentionSerialization.js.map