@agent-native/toolkit 0.198.4 → 0.198.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/app/agentkit/react/components.d.ts +6 -3
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +98 -68
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/styles.css +36 -24
  6. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  7. package/dist/app/chat/AgentKitAssistantChat.js +32 -15
  8. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  9. package/dist/app/chat/AgentPanel.d.ts +1 -1
  10. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  11. package/dist/app/chat/AgentPanel.js +11 -38
  12. package/dist/app/chat/AgentPanel.js.map +1 -1
  13. package/dist/app/chat/AgentSidebar.d.ts.map +1 -1
  14. package/dist/app/chat/AgentSidebar.js +3 -11
  15. package/dist/app/chat/AgentSidebar.js.map +1 -1
  16. package/dist/app/chat/chat/tool-call-display.d.ts +2 -1
  17. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  18. package/dist/app/chat/chat/tool-call-display.js +83 -55
  19. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  20. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  21. package/dist/app/i18n/catalogs/ar-SA.js +1 -0
  22. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  23. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  24. package/dist/app/i18n/catalogs/de-DE.js +1 -0
  25. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  26. package/dist/app/i18n/catalogs/en-US.d.ts +1 -0
  27. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  28. package/dist/app/i18n/catalogs/en-US.js +1 -0
  29. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  30. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  31. package/dist/app/i18n/catalogs/es-ES.js +1 -0
  32. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  33. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  34. package/dist/app/i18n/catalogs/fr-FR.js +1 -0
  35. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  36. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  37. package/dist/app/i18n/catalogs/hi-IN.js +1 -0
  38. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  39. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  40. package/dist/app/i18n/catalogs/ja-JP.js +1 -0
  41. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  42. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  43. package/dist/app/i18n/catalogs/ko-KR.js +1 -0
  44. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  45. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  46. package/dist/app/i18n/catalogs/pt-BR.js +1 -0
  47. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  48. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  49. package/dist/app/i18n/catalogs/zh-CN.js +1 -0
  50. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  51. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  52. package/dist/app/i18n/catalogs/zh-TW.js +1 -0
  53. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  54. package/dist/composer/PromptComposer.d.ts +3 -0
  55. package/dist/composer/PromptComposer.d.ts.map +1 -1
  56. package/dist/composer/PromptComposer.js +2 -2
  57. package/dist/composer/PromptComposer.js.map +1 -1
  58. package/dist/composer/TiptapComposer.d.ts +4 -1
  59. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  60. package/dist/composer/TiptapComposer.js +32 -25
  61. package/dist/composer/TiptapComposer.js.map +1 -1
  62. package/dist/ui/sonner.js +1 -1
  63. package/dist/ui/sonner.js.map +1 -1
  64. package/package.json +3 -3
  65. package/src/app/agentkit/react/components.interaction.spec.tsx +93 -0
  66. package/src/app/agentkit/react/components.spec.tsx +1 -2
  67. package/src/app/agentkit/react/components.tsx +185 -132
  68. package/src/app/agentkit/react/composer-context.spec.tsx +7 -0
  69. package/src/app/agentkit/react/lifecycle.spec.tsx +556 -39
  70. package/src/app/agentkit/react/styles.css +36 -24
  71. package/src/app/chat/AgentKitAssistantChat.spec.tsx +60 -1
  72. package/src/app/chat/AgentKitAssistantChat.tsx +45 -14
  73. package/src/app/chat/AgentPanel.overlay.spec.tsx +28 -4
  74. package/src/app/chat/AgentPanel.tsx +51 -168
  75. package/src/app/chat/AgentSidebar.spec.tsx +19 -19
  76. package/src/app/chat/AgentSidebar.tsx +59 -94
  77. package/src/app/chat/chat/tool-call-display.spec.tsx +371 -15
  78. package/src/app/chat/chat/tool-call-display.tsx +154 -80
  79. package/src/app/i18n/catalogs/ar-SA.ts +1 -0
  80. package/src/app/i18n/catalogs/de-DE.ts +1 -0
  81. package/src/app/i18n/catalogs/en-US.ts +1 -0
  82. package/src/app/i18n/catalogs/es-ES.ts +1 -0
  83. package/src/app/i18n/catalogs/fr-FR.ts +1 -0
  84. package/src/app/i18n/catalogs/hi-IN.ts +1 -0
  85. package/src/app/i18n/catalogs/ja-JP.ts +1 -0
  86. package/src/app/i18n/catalogs/ko-KR.ts +1 -0
  87. package/src/app/i18n/catalogs/pt-BR.ts +1 -0
  88. package/src/app/i18n/catalogs/zh-CN.ts +1 -0
  89. package/src/app/i18n/catalogs/zh-TW.ts +1 -0
  90. package/src/app-shell/sidebar-overflow.spec.tsx +2 -1
  91. package/src/composer/PromptComposer.context.spec.tsx +28 -15
  92. package/src/composer/PromptComposer.tsx +7 -0
  93. package/src/composer/TiptapComposer.spec.ts +40 -6
  94. package/src/composer/TiptapComposer.tsx +89 -89
  95. package/src/ui/sonner.spec.ts +15 -0
  96. package/src/ui/sonner.tsx +1 -1
@@ -1,11 +1,11 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useComposer, useComposerRuntime } from "@assistant-ui/react";
3
- import { IconArrowUp, IconCheck, IconChevronDown, IconChevronRight, IconBulb, IconClock, IconBolt, IconTool, IconX, IconClipboardList, IconKey, IconPencil, IconPlugConnected, IconHelpCircle, IconRefresh, IconAlertCircle, IconLoader2, } from "@tabler/icons-react";
3
+ import { IconArrowUp, IconCheck, IconChevronDown, IconChevronRight, IconBulb, IconClock, IconBolt, IconTool, IconX, IconClipboardList, IconKey, IconPencil, IconPlugConnected, IconHelpCircle, IconAlertCircle, IconLoader2, IconRefresh, } from "@tabler/icons-react";
4
4
  import Placeholder from "@tiptap/extension-placeholder";
5
5
  import { TextSelection } from "@tiptap/pm/state";
6
6
  import { useEditor, EditorContent } from "@tiptap/react";
7
7
  import StarterKit from "@tiptap/starter-kit";
8
- import { useState, useRef, useEffect, useLayoutEffect, useCallback, useImperativeHandle, useMemo, } from "react";
8
+ import React, { useState, useRef, useEffect, useLayoutEffect, useCallback, useImperativeHandle, useMemo, } from "react";
9
9
  import { toast } from "sonner";
10
10
  import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, } from "../ui/popover.js";
11
11
  import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip.js";
@@ -1190,7 +1190,7 @@ function ModelSelector({ model, effort, engines, agents, selectedAgent, selected
1190
1190
  : undefined);
1191
1191
  return (_jsxs("div", { className: showProviderLabels && groupIndex > 0
1192
1192
  ? "mt-2 pt-1"
1193
- : "", children: [showProviderLabels && (_jsxs("div", { className: "group flex items-center px-2 py-1", children: [_jsx("span", { className: "shrink-0 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: group.label }), !group.configured && statusLabel && (_jsx("button", { type: "button", "aria-label": statusLabel, className: "ms-auto max-w-[9rem] shrink-0 cursor-pointer truncate px-0 py-1 text-end text-[10px] text-muted-foreground/60 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 hover:text-foreground focus-visible:opacity-100", onClick: () => canConnectLocalRuntime
1193
+ : "", children: [showProviderLabels && (_jsxs("div", { className: "group flex items-center px-2 py-1", children: [_jsx("span", { className: "shrink-0 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: group.label.replace(/ · Builder\.io$/i, "") }), !group.configured && statusLabel && (_jsx("button", { type: "button", "aria-label": statusLabel, className: "ms-auto max-w-[9rem] shrink-0 cursor-pointer truncate px-0 py-1 text-end text-[10px] text-muted-foreground/60 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 hover:text-foreground focus-visible:opacity-100", onClick: () => canConnectLocalRuntime
1194
1194
  ? connectLocalRuntime(group.engine)
1195
1195
  : openLlmSettings(), children: statusLabel })), group.configured && statusLabel && (_jsx("span", { className: "ms-auto max-w-[9rem] shrink-0 truncate py-1 text-end text-[10px] text-muted-foreground/70 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100", children: statusLabel }))] })), models.map((m) => {
1196
1196
  const isSelected = m === model && group.configured;
@@ -1235,7 +1235,7 @@ function ModelSelector({ model, effort, engines, agents, selectedAgent, selected
1235
1235
  ? "text-foreground"
1236
1236
  : "text-muted-foreground"}`, children: option.label }), option.enabled === terminalModeControl.enabled && (_jsx(IconCheck, { className: "size-4 shrink-0 text-primary" }))] }, option.label))) }))] }) }) })] }) })] }));
1237
1237
  }
1238
- export function TiptapComposer({ placeholder, ariaLabel, disabled = false, contextControlsDisabled = false, submissionDisabled = false, submitting = false, maxDocumentAttachmentBytes = MAX_DOCUMENT_ATTACHMENT_BYTES, documentAttachmentLimitLabel = "PDFs", attachmentsEnabled = true, onAttachmentRequest, contextButtonTooltipDisabled = false, focusRef, initialText, initialTextKey, onSubmit, onBeforeSubmit, getSubmitFailureDraftScope, clearOnSubmit = true, clearOnSubmitImmediately = false, onTextChange, actionButton, willQueue = false, extraActionButton, stopButton, attachButton, modeControl, toolbarSlot, layoutVariant = "default", slashCommands = [], slashSkills = [], includeDefaultSlashCommands = true, includeDefaultSlashSkills = true, onSlashCommand, execMode, onExecModeChange, planModeDisabled = false, planModeDisabledReason, voiceEnabled = DEFAULT_VOICE_DICTATION_ENABLED, selectedModel, selectedEngine, selectedEffort, showAutoModelOption = true, modelSelectorOpen, availableModels, modelListLoading, onModelChange, onEffortChange, availableAgents, selectedAgent, agentOnly = false, hostedHarness, onAgentChange, onModelSelectorOpenChange, providerConnectStatusEnabled, onConnectProvider, onConnectLocalRuntime, imageModelMenu, draftScope, contextItems: providedContextItems, onRemoveContextItem, onInspectContextItem, onRetryContextItem, contextMenuItems, plusMenuMode = "full", terminalModeControl, extensionTools = false, interceptBuildRequestsForBuilder = false, onAttachmentError, mentionItems: hostMentionItems = [], mentionPopoverDensity = "default", includeDefaultMentionSearch = true, onReferencesChange, onEscape, onFocus, onBlur, onSelectionChange, }) {
1238
+ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, contextControlsDisabled = false, submissionDisabled = false, sendButtonDisabled = false, submitting = false, maxDocumentAttachmentBytes = MAX_DOCUMENT_ATTACHMENT_BYTES, documentAttachmentLimitLabel = "PDFs", attachmentsEnabled = true, onAttachmentRequest, contextButtonTooltipDisabled = false, focusRef, initialText, initialTextKey, onSubmit, onBeforeSubmit, onSubmissionPendingChange, getSubmitFailureDraftScope, clearOnSubmit = true, clearOnSubmitImmediately = false, onTextChange, actionButton, willQueue = false, extraActionButton, stopButton, attachButton, modeControl, toolbarSlot, layoutVariant = "default", slashCommands = [], slashSkills = [], includeDefaultSlashCommands = true, includeDefaultSlashSkills = true, onSlashCommand, execMode, onExecModeChange, planModeDisabled = false, planModeDisabledReason, voiceEnabled = DEFAULT_VOICE_DICTATION_ENABLED, selectedModel, selectedEngine, selectedEffort, showAutoModelOption = true, modelSelectorOpen, availableModels, modelListLoading, onModelChange, onEffortChange, availableAgents, selectedAgent, agentOnly = false, hostedHarness, onAgentChange, onModelSelectorOpenChange, providerConnectStatusEnabled, onConnectProvider, onConnectLocalRuntime, imageModelMenu, draftScope, contextItems: providedContextItems, onRemoveContextItem, onRetryContextItem, contextMenuItems, plusMenuMode = "full", terminalModeControl, extensionTools = false, interceptBuildRequestsForBuilder = false, onAttachmentError, mentionItems: hostMentionItems = [], mentionPopoverDensity = "default", includeDefaultMentionSearch = true, onReferencesChange, onEscape, onFocus, onBlur, onSelectionChange, }) {
1239
1239
  const contextItems = providedContextItems ?? [];
1240
1240
  const hasContextMenu = (contextMenuItems !== undefined || plusMenuMode !== "hidden") &&
1241
1241
  !(attachmentsEnabled && attachButton);
@@ -2609,7 +2609,6 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2609
2609
  (composerDocumentHasContent(ed.state.doc) ||
2610
2610
  slotReferencesRef.current.length > 0);
2611
2611
  const canPreserveFollowUp = preserveFollowUp &&
2612
- clearedBeforePreflight &&
2613
2612
  !isForkRecovery &&
2614
2613
  hasFollowUp &&
2615
2614
  (currentDraft === null ||
@@ -2672,6 +2671,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2672
2671
  }
2673
2672
  if (onBeforeSubmit) {
2674
2673
  submitInFlightRef.current = true;
2674
+ onSubmissionPendingChange?.(true);
2675
2675
  try {
2676
2676
  const shouldSubmit = await onBeforeSubmit();
2677
2677
  if (!shouldSubmit) {
@@ -2690,6 +2690,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2690
2690
  }
2691
2691
  finally {
2692
2692
  submitInFlightRef.current = false;
2693
+ onSubmissionPendingChange?.(false);
2693
2694
  }
2694
2695
  }
2695
2696
  if (!isComposerEditorUsable(ed) ||
@@ -2820,6 +2821,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2820
2821
  submitInFlightRef.current = true;
2821
2822
  let locallySubmitted = false;
2822
2823
  let settled = false;
2824
+ onSubmissionPendingChange?.(true);
2823
2825
  const clearSubmittedComposer = () => {
2824
2826
  if (clearOnSubmit) {
2825
2827
  clearComposerDraft(submittingDraftKey, submittingDraftSnapshot);
@@ -2891,7 +2893,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2891
2893
  }
2892
2894
  catch (error) {
2893
2895
  if (locallySubmitted) {
2894
- restoreSubmittedDraft();
2896
+ restoreSubmittedDraft(true);
2895
2897
  return true;
2896
2898
  }
2897
2899
  restoreSubmittedDraft(true);
@@ -2905,6 +2907,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2905
2907
  finally {
2906
2908
  settled = true;
2907
2909
  submitInFlightRef.current = false;
2910
+ onSubmissionPendingChange?.(false);
2908
2911
  }
2909
2912
  if (!isCurrentDraftScope()) {
2910
2913
  clearComposerDraft(submittingDraftKey, submittingDraftSnapshot);
@@ -2983,6 +2986,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2983
2986
  clearOnSubmitImmediately,
2984
2987
  getSubmitFailureDraftScope,
2985
2988
  onBeforeSubmit,
2989
+ onSubmissionPendingChange,
2986
2990
  extractComposerPayload,
2987
2991
  syncComposerState,
2988
2992
  updateSlotReferences,
@@ -3366,7 +3370,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3366
3370
  if (isComposerEditorUsable(editor)) {
3367
3371
  editor.commands.focus("end");
3368
3372
  }
3369
- } }) })), hasContextRows && (_jsxs("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "context-row", className: "agent-composer-context-row flex flex-wrap gap-1.5 px-2.5 pt-2 pb-0", children: [slotReferences.map((ref) => (_jsxs("span", { className: "inline-flex max-w-full items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1 text-[11px] font-medium text-foreground shadow-sm", children: [_jsx(MentionItemMedia, { media: ref.media, size: "sm", fallbackIcon: "clipboard" }), ref.slotLabel && (_jsx("span", { className: "shrink-0 text-muted-foreground", children: ref.slotLabel })), _jsx("span", { className: "min-w-0 truncate", children: ref.label }), _jsx("button", { type: "button", onClick: () => {
3373
+ } }) })), hasContextRows && (_jsxs("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "context-row", className: "agent-composer-context-row flex flex-wrap gap-1.5 px-2.5 pt-2 pb-0", children: [slotReferences.map((ref) => (_jsxs("span", { className: "inline-flex max-w-full items-center gap-1.5 rounded-md border border-border bg-background px-2 py-0.5 text-[11px] font-medium text-foreground shadow-sm", children: [_jsx(MentionItemMedia, { media: ref.media, size: "sm", fallbackIcon: "clipboard" }), ref.slotLabel && (_jsx("span", { className: "shrink-0 text-muted-foreground", children: ref.slotLabel })), _jsx("span", { className: "min-w-0 truncate", children: ref.label }), _jsx("button", { type: "button", onClick: () => {
3370
3374
  updateSlotReferences((current) => removeSlotReference(current, ref));
3371
3375
  if (isComposerEditorUsable(editor)) {
3372
3376
  editor.commands.focus("end");
@@ -3374,23 +3378,26 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3374
3378
  }, "aria-label": t("agentChat.composer.removeReference", {
3375
3379
  defaultValue: "Remove {{name}} reference",
3376
3380
  name: slotReferenceTitle(ref),
3377
- }), className: "ms-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconX, { className: "h-3 w-3" }) })] }, ref.slotKey))), contextItems.map((item) => (_jsxs("span", { "data-context-key": item.key, "data-context-status": item.status ?? "ready", title: item.statusMessage, "data-state": selectedContextItemKey === item.key ? "selected" : undefined, className: `inline-flex max-w-full items-center gap-1.5 rounded-md border px-2 py-1 text-[11px] font-medium text-foreground ${selectedContextItemKey === item.key
3378
- ? "border-ring bg-accent ring-2 ring-ring/40"
3379
- : "border-border bg-muted/50"}`, children: [item.status === "pending" ? (_jsx(IconLoader2, { "aria-label": t("agentChat.composer.contextPending", {
3380
- defaultValue: "Context pending",
3381
- }), className: "size-3 shrink-0 animate-spin motion-reduce:animate-none text-muted-foreground" })) : item.status === "error" ? (_jsx(IconAlertCircle, { "aria-label": t("agentChat.composer.contextError", {
3382
- defaultValue: "Context failed",
3383
- }), className: "size-3 shrink-0 text-destructive" })) : (_jsx(IconClipboardList, { className: "h-3 w-3 shrink-0 text-muted-foreground" })), onInspectContextItem ? (_jsx("button", { type: "button", onClick: () => onInspectContextItem(item.key), className: "min-w-0 truncate hover:underline", children: item.title })) : (_jsx("span", { className: "min-w-0 truncate", children: item.title })), item.status === "error" && onRetryContextItem ? (_jsx("button", { type: "button", onClick: () => onRetryContextItem(item.key), "aria-label": t("agentChat.composer.retryContext", {
3384
- defaultValue: "Retry {{name}} context",
3385
- name: item.title,
3386
- }), className: "flex size-4 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconRefresh, { className: "size-3" }) })) : null, onRemoveContextItem && item.removable !== false ? (_jsx("button", { type: "button", onClick: () => {
3387
- selectedContextItemKeyRef.current = null;
3388
- setSelectedContextItemKey(null);
3389
- onRemoveContextItem?.(item.key);
3390
- }, "aria-label": t("agentChat.composer.removeContext", {
3391
- defaultValue: "Remove {{name}} context",
3392
- name: item.title,
3393
- }), className: "ms-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconX, { className: "h-3 w-3" }) })) : null] }, item.key)))] })), contextSubmissionError ? (_jsx("p", { role: "alert", className: "px-2 text-xs text-destructive", children: contextSubmissionError })) : null, _jsx("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "editor-wrap", className: `agent-composer-editor-wrap ${composerMode || hasContextRows ? "px-2 pt-1 pb-1" : "px-2 pt-2 pb-1"}`, children: _jsx(EditorContent, { editor: editor, "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "editor", className: "agent-composer-editor aui-composer flex-1 min-w-0 [&_.ProseMirror]:outline-none [&_.ProseMirror_p]:m-0 px-0.5" }) }), voiceEnabled && _jsx(VoiceRecordingOverlay, { voice: voice }), _jsxs("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "toolbar", className: "agent-composer-toolbar flex items-center gap-1 px-2 py-1.5", children: [!launchersDisabled && attachmentsEnabled && attachButton ? (attachButton) : hasContextMenu ? (_jsx(ComposerPlusMenu, { contextMenuItems: launchersDisabled ? [] : contextLauncherItems, mode: launchersDisabled || plusMenuMode === "hidden"
3381
+ }), className: "ms-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconX, { className: "h-3 w-3" }) })] }, ref.slotKey))), contextItems.map((item) => (_jsxs(React.Fragment, { children: [_jsxs("span", { "data-context-key": item.key, "data-context-status": item.status ?? "ready", title: item.statusMessage, "data-state": selectedContextItemKey === item.key ? "selected" : undefined, className: `inline-flex max-w-full items-center gap-1.5 rounded-md border px-2 py-0.5 text-[11px] font-medium text-foreground ${selectedContextItemKey === item.key
3382
+ ? "border-ring bg-accent ring-2 ring-ring/40"
3383
+ : "border-border bg-muted/50"}`, children: [item.status === "pending" ? (_jsx(IconLoader2, { "aria-label": t("agentChat.composer.contextPending", {
3384
+ defaultValue: "Context pending",
3385
+ }), className: "size-3 shrink-0 animate-spin motion-reduce:animate-none text-muted-foreground" })) : item.status === "error" ? (_jsx(IconAlertCircle, { "aria-label": t("agentChat.composer.contextError", {
3386
+ defaultValue: "Context failed",
3387
+ }), className: "size-3 shrink-0 text-destructive" })) : (_jsx(IconClipboardList, { className: "h-3 w-3 shrink-0 text-muted-foreground" })), _jsx("span", { className: "min-w-0 truncate", children: item.title }), onRemoveContextItem && item.removable !== false ? (_jsx("button", { type: "button", onClick: () => {
3388
+ selectedContextItemKeyRef.current = null;
3389
+ setSelectedContextItemKey(null);
3390
+ onRemoveContextItem?.(item.key);
3391
+ }, "aria-label": t("agentChat.composer.removeContext", {
3392
+ defaultValue: "Remove {{name}} context",
3393
+ name: item.title,
3394
+ }), className: "ms-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconX, { className: "h-3 w-3" }) })) : null] }), item.status === "error" && onRetryContextItem ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => onRetryContextItem(item.key), "aria-label": t("agentChat.composer.retryContext", {
3395
+ defaultValue: "Retry {{name}} context",
3396
+ name: item.title,
3397
+ }), className: "flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(IconRefresh, { "aria-hidden": "true", className: "size-3.5" }) }) }), _jsx(TooltipContent, { children: t("agentChat.composer.retryContext", {
3398
+ defaultValue: "Retry {{name}} context",
3399
+ name: item.title,
3400
+ }) })] })) : null] }, item.key)))] })), contextSubmissionError ? (_jsx("p", { role: "alert", className: "px-2 text-xs text-destructive", children: contextSubmissionError })) : null, _jsx("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "editor-wrap", className: `agent-composer-editor-wrap ${composerMode || hasContextRows ? "px-2 pt-1 pb-1" : "px-2 pt-2 pb-1"}`, children: _jsx(EditorContent, { editor: editor, "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "editor", className: "agent-composer-editor aui-composer flex-1 min-w-0 [&_.ProseMirror]:outline-none [&_.ProseMirror_p]:m-0 px-0.5" }) }), voiceEnabled && _jsx(VoiceRecordingOverlay, { voice: voice }), _jsxs("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "toolbar", className: "agent-composer-toolbar flex items-center gap-1 px-2 py-1.5", children: [!launchersDisabled && attachmentsEnabled && attachButton ? (attachButton) : hasContextMenu ? (_jsx(ComposerPlusMenu, { contextMenuItems: launchersDisabled ? [] : contextLauncherItems, mode: launchersDisabled || plusMenuMode === "hidden"
3394
3401
  ? "upload-only"
3395
3402
  : plusMenuMode, onSelectMode: handleSelectMode, terminalModeControl: terminalModeControl, extensionTools: extensionTools, attachmentsEnabled: attachmentsEnabled, open: contextMenuOpen, onOpenChange: setContextMenuOpen, onSearchChange: setContextMenuSearch, loading: mentionsLoading, error: mentionsError
3396
3403
  ? t("agentChat.composer.contextLoadFailed", {
@@ -3410,6 +3417,6 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3410
3417
  }
3411
3418
  const pageTarget = Array.from(document.querySelectorAll('button:not(:disabled), a[href], input:not([type="hidden"]):not(:disabled), textarea:not(:disabled)')).find((element) => !root?.contains(element) && !element.closest("[hidden]"));
3412
3419
  pageTarget?.focus();
3413
- }, disabled: launchersDisabled })) : null, toolbarSlot ?? modeControl, _jsx("div", { "data-agent-composer-slot": "toolbar-spacer", className: "flex-1" }), shouldRenderModelSelector(availableModels, onModelChange) && (_jsx(ModelSelector, { model: selectedModel ?? "", selectedEngine: selectedEngine, open: modelSelectorOpen, effort: selectedEffort, engines: availableModels, agents: availableAgents, selectedAgent: selectedAgent, agentOnly: agentOnly, hostedHarness: hostedHarness, showAutoModelOption: showAutoModelOption, modelListLoading: modelListLoading, onChange: onModelChange, onEffortChange: onEffortChange, onAgentChange: onAgentChange, onModelSelectorOpenChange: onModelSelectorOpenChange, providerConnectStatusEnabled: providerConnectStatusEnabled, onConnectProvider: onConnectProvider, onConnectLocalRuntime: onConnectLocalRuntime, terminalModeControl: terminalModeControl, imageModel: imageModelMenu })), execMode && onExecModeChange && (_jsx(ModeSelector, { mode: execMode, onChange: onExecModeChange, planModeDisabled: planModeDisabled, planModeDisabledReason: planModeDisabledReason })), actionButton ?? (_jsxs(_Fragment, { children: [extraActionButton, voiceEnabled && (_jsx(VoiceButton, { voice: voice, isMac: isMac, disabled: disabled })), primaryAction === "stop" ? (stopButton) : (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => void submitComposer("immediate"), disabled: !canSend, "aria-label": submitting ? t("common.loading") : sendButtonTooltip, "aria-busy": submitting || undefined, "data-agent-composer-slot": "send-button", className: "agent-composer-send-button shrink-0 flex h-7 w-7 items-center justify-center rounded-full bg-primary text-primary-foreground hover:opacity-90 transition-[opacity,transform] duration-150 active:scale-[0.97] disabled:opacity-30 disabled:cursor-not-allowed", children: submitting ? (_jsx(IconLoader2, { className: "size-3.5 animate-spin motion-reduce:animate-none" })) : (_jsx(IconArrowUp, { className: "h-3.5 w-3.5" })) }) }), _jsx(TooltipContent, { children: submitting ? t("common.loading") : sendButtonTooltip })] }))] }))] }), _jsx(MentionPopover, { ref: popoverRef, density: mentionPopoverDensity, type: popover?.type ?? "@", position: popover?.position ?? null, mentionItems: filteredMentionItems, skills: filteredSkills, commands: filteredCommands, hint: hint, isLoading: popover?.type === "@" ? mentionsLoading : skillsLoading, query: popover?.query ?? "", onSelectMention: handleSelectMention, onSelectSkill: handleSelectSkill, onSelectCommand: handleSelectCommand, onClose: closePopover })] }));
3420
+ }, disabled: launchersDisabled })) : null, toolbarSlot ?? modeControl, _jsx("div", { "data-agent-composer-slot": "toolbar-spacer", className: "flex-1" }), shouldRenderModelSelector(availableModels, onModelChange) && (_jsx(ModelSelector, { model: selectedModel ?? "", selectedEngine: selectedEngine, open: modelSelectorOpen, effort: selectedEffort, engines: availableModels, agents: availableAgents, selectedAgent: selectedAgent, agentOnly: agentOnly, hostedHarness: hostedHarness, showAutoModelOption: showAutoModelOption, modelListLoading: modelListLoading, onChange: onModelChange, onEffortChange: onEffortChange, onAgentChange: onAgentChange, onModelSelectorOpenChange: onModelSelectorOpenChange, providerConnectStatusEnabled: providerConnectStatusEnabled, onConnectProvider: onConnectProvider, onConnectLocalRuntime: onConnectLocalRuntime, terminalModeControl: terminalModeControl, imageModel: imageModelMenu })), execMode && onExecModeChange && (_jsx(ModeSelector, { mode: execMode, onChange: onExecModeChange, planModeDisabled: planModeDisabled, planModeDisabledReason: planModeDisabledReason })), actionButton ?? (_jsxs(_Fragment, { children: [extraActionButton, voiceEnabled && (_jsx(VoiceButton, { voice: voice, isMac: isMac, disabled: disabled })), primaryAction === "stop" ? (stopButton) : (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => void submitComposer("immediate"), disabled: !canSend || sendButtonDisabled, "aria-label": sendButtonTooltip, "data-agent-composer-slot": "send-button", className: "agent-composer-send-button shrink-0 flex h-7 w-7 items-center justify-center rounded-full bg-primary text-primary-foreground hover:opacity-90 transition-[opacity,transform] duration-150 active:scale-[0.97] disabled:opacity-30 disabled:cursor-not-allowed", children: _jsx(IconArrowUp, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: sendButtonTooltip })] }))] }))] }), _jsx(MentionPopover, { ref: popoverRef, density: mentionPopoverDensity, type: popover?.type ?? "@", position: popover?.position ?? null, mentionItems: filteredMentionItems, skills: filteredSkills, commands: filteredCommands, hint: hint, isLoading: popover?.type === "@" ? mentionsLoading : skillsLoading, query: popover?.query ?? "", onSelectMention: handleSelectMention, onSelectSkill: handleSelectSkill, onSelectCommand: handleSelectCommand, onClose: closePopover })] }));
3414
3421
  }
3415
3422
  //# sourceMappingURL=TiptapComposer.js.map