@agent-native/toolkit 0.204.0 → 0.204.1-nightly-20261008065100

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 (168) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/dist/app/agent-page/AgentJobsTab.d.ts.map +1 -1
  3. package/dist/app/agent-page/AgentJobsTab.js +4 -2
  4. package/dist/app/agent-page/AgentJobsTab.js.map +1 -1
  5. package/dist/app/agent-page/AutomationDetailsDialog.d.ts +2 -1
  6. package/dist/app/agent-page/AutomationDetailsDialog.d.ts.map +1 -1
  7. package/dist/app/agent-page/AutomationDetailsDialog.js +8 -4
  8. package/dist/app/agent-page/AutomationDetailsDialog.js.map +1 -1
  9. package/dist/app/agent-page/ScheduledTriggerNotice.d.ts.map +1 -1
  10. package/dist/app/agent-page/ScheduledTriggerNotice.js +41 -19
  11. package/dist/app/agent-page/ScheduledTriggerNotice.js.map +1 -1
  12. package/dist/app/agent-page/use-jobs.d.ts +1 -1
  13. package/dist/app/agent-page/use-jobs.d.ts.map +1 -1
  14. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  15. package/dist/app/agentkit/react/components.js +124 -45
  16. package/dist/app/agentkit/react/components.js.map +1 -1
  17. package/dist/app/agentkit/react/context.d.ts +22 -1
  18. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  19. package/dist/app/agentkit/react/context.js +14 -1
  20. package/dist/app/agentkit/react/context.js.map +1 -1
  21. package/dist/app/agentkit/react/root.d.ts +3 -2
  22. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  23. package/dist/app/agentkit/react/root.js +2 -2
  24. package/dist/app/agentkit/react/root.js.map +1 -1
  25. package/dist/app/agentkit/react/styles.css +32 -2
  26. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  27. package/dist/app/chat/AgentKitAssistantChat.js +74 -7
  28. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  29. package/dist/app/chat/AgentPanel.js +1 -1
  30. package/dist/app/chat/AgentPanel.js.map +1 -1
  31. package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
  32. package/dist/app/chat/MultiTabAssistantChat.js +10 -9
  33. package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
  34. package/dist/app/chat/RunStuckBanner.d.ts +8 -1
  35. package/dist/app/chat/RunStuckBanner.d.ts.map +1 -1
  36. package/dist/app/chat/RunStuckBanner.js +68 -6
  37. package/dist/app/chat/RunStuckBanner.js.map +1 -1
  38. package/dist/app/chat/chat/run-recovery.d.ts +4 -2
  39. package/dist/app/chat/chat/run-recovery.d.ts.map +1 -1
  40. package/dist/app/chat/chat/run-recovery.js +3 -3
  41. package/dist/app/chat/chat/run-recovery.js.map +1 -1
  42. package/dist/app/chat/chat/surface-types.d.ts +1 -0
  43. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  44. package/dist/app/chat/composer/use-mention-search.d.ts +1 -0
  45. package/dist/app/chat/composer/use-mention-search.d.ts.map +1 -1
  46. package/dist/app/chat/fallback-chat-title.d.ts +2 -0
  47. package/dist/app/chat/fallback-chat-title.d.ts.map +1 -0
  48. package/dist/app/chat/fallback-chat-title.js +11 -0
  49. package/dist/app/chat/fallback-chat-title.js.map +1 -0
  50. package/dist/app/chat/feedback-report.d.ts +12 -0
  51. package/dist/app/chat/feedback-report.d.ts.map +1 -0
  52. package/dist/app/chat/feedback-report.js +21 -0
  53. package/dist/app/chat/feedback-report.js.map +1 -0
  54. package/dist/app/chat/reconcile-settled-run.d.ts +15 -0
  55. package/dist/app/chat/reconcile-settled-run.d.ts.map +1 -0
  56. package/dist/app/chat/reconcile-settled-run.js +41 -0
  57. package/dist/app/chat/reconcile-settled-run.js.map +1 -0
  58. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  59. package/dist/app/i18n/catalogs/ar-SA.js +9 -0
  60. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  61. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  62. package/dist/app/i18n/catalogs/de-DE.js +9 -0
  63. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  64. package/dist/app/i18n/catalogs/en-US.d.ts +9 -0
  65. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  66. package/dist/app/i18n/catalogs/en-US.js +9 -0
  67. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  68. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  69. package/dist/app/i18n/catalogs/es-ES.js +9 -0
  70. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  71. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  72. package/dist/app/i18n/catalogs/fr-FR.js +9 -0
  73. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  74. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  75. package/dist/app/i18n/catalogs/hi-IN.js +9 -0
  76. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  77. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  78. package/dist/app/i18n/catalogs/ja-JP.js +9 -0
  79. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  80. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  81. package/dist/app/i18n/catalogs/ko-KR.js +9 -0
  82. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  83. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  84. package/dist/app/i18n/catalogs/pt-BR.js +9 -0
  85. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  86. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  87. package/dist/app/i18n/catalogs/zh-CN.js +9 -0
  88. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  89. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  90. package/dist/app/i18n/catalogs/zh-TW.js +9 -0
  91. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  92. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  93. package/dist/app/providers/AppProviders.js +7 -1
  94. package/dist/app/providers/AppProviders.js.map +1 -1
  95. package/dist/app/settings/shell/pages/audit.d.ts.map +1 -1
  96. package/dist/app/settings/shell/pages/audit.js +11 -2
  97. package/dist/app/settings/shell/pages/audit.js.map +1 -1
  98. package/dist/app/shared/AppShellSkeleton.d.ts.map +1 -1
  99. package/dist/app/shared/AppShellSkeleton.js +4 -0
  100. package/dist/app/shared/AppShellSkeleton.js.map +1 -1
  101. package/dist/composer/ComposerContextMenu.d.ts +14 -1
  102. package/dist/composer/ComposerContextMenu.d.ts.map +1 -1
  103. package/dist/composer/ComposerContextMenu.js +65 -19
  104. package/dist/composer/ComposerContextMenu.js.map +1 -1
  105. package/dist/composer/MentionPopover.d.ts.map +1 -1
  106. package/dist/composer/MentionPopover.js +3 -3
  107. package/dist/composer/MentionPopover.js.map +1 -1
  108. package/dist/composer/PromptComposer.d.ts +1 -1
  109. package/dist/composer/PromptComposer.d.ts.map +1 -1
  110. package/dist/composer/TiptapComposer.d.ts +2 -2
  111. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  112. package/dist/composer/TiptapComposer.js +92 -36
  113. package/dist/composer/TiptapComposer.js.map +1 -1
  114. package/dist/composer/use-mention-search.d.ts +1 -0
  115. package/dist/composer/use-mention-search.d.ts.map +1 -1
  116. package/dist/composer/use-mention-search.js +8 -1
  117. package/dist/composer/use-mention-search.js.map +1 -1
  118. package/package.json +4 -4
  119. package/src/app/agent-page/AgentJobsTab.blocked.spec.tsx +43 -0
  120. package/src/app/agent-page/AgentJobsTab.tsx +14 -5
  121. package/src/app/agent-page/AutomationDetailsDialog.tsx +22 -8
  122. package/src/app/agent-page/ScheduledTriggerNotice.spec.tsx +45 -3
  123. package/src/app/agent-page/ScheduledTriggerNotice.tsx +52 -31
  124. package/src/app/agent-page/use-jobs.ts +1 -1
  125. package/src/app/agentkit/react/components.interaction.spec.tsx +311 -1
  126. package/src/app/agentkit/react/components.spec.tsx +106 -2
  127. package/src/app/agentkit/react/components.tsx +217 -80
  128. package/src/app/agentkit/react/context.tsx +36 -0
  129. package/src/app/agentkit/react/root.tsx +4 -0
  130. package/src/app/agentkit/react/styles.css +32 -2
  131. package/src/app/chat/AgentKitAssistantChat.spec.tsx +140 -18
  132. package/src/app/chat/AgentKitAssistantChat.tsx +123 -7
  133. package/src/app/chat/AgentPanel.header.spec.ts +43 -7
  134. package/src/app/chat/AgentPanel.tsx +1 -1
  135. package/src/app/chat/MultiTabAssistantChat.spec.tsx +34 -0
  136. package/src/app/chat/MultiTabAssistantChat.tsx +10 -9
  137. package/src/app/chat/RunStuckBanner.spec.tsx +258 -17
  138. package/src/app/chat/RunStuckBanner.tsx +107 -5
  139. package/src/app/chat/chat/run-recovery.tsx +10 -2
  140. package/src/app/chat/chat/surface-types.ts +1 -0
  141. package/src/app/chat/fallback-chat-title.ts +10 -0
  142. package/src/app/chat/feedback-report.spec.ts +45 -0
  143. package/src/app/chat/feedback-report.ts +27 -0
  144. package/src/app/chat/reconcile-settled-run.spec.ts +112 -0
  145. package/src/app/chat/reconcile-settled-run.ts +57 -0
  146. package/src/app/i18n/catalogs/ar-SA.ts +12 -0
  147. package/src/app/i18n/catalogs/de-DE.ts +12 -0
  148. package/src/app/i18n/catalogs/en-US.ts +12 -0
  149. package/src/app/i18n/catalogs/es-ES.ts +12 -0
  150. package/src/app/i18n/catalogs/fr-FR.ts +12 -0
  151. package/src/app/i18n/catalogs/hi-IN.ts +12 -0
  152. package/src/app/i18n/catalogs/ja-JP.ts +12 -0
  153. package/src/app/i18n/catalogs/ko-KR.ts +12 -0
  154. package/src/app/i18n/catalogs/pt-BR.ts +12 -0
  155. package/src/app/i18n/catalogs/zh-CN.ts +10 -0
  156. package/src/app/i18n/catalogs/zh-TW.ts +10 -0
  157. package/src/app/providers/AppProviders.spec.tsx +29 -0
  158. package/src/app/providers/AppProviders.tsx +13 -0
  159. package/src/app/settings/shell/pages/audit.spec.tsx +30 -0
  160. package/src/app/settings/shell/pages/audit.tsx +12 -1
  161. package/src/app/shared/AppShellSkeleton.tsx +4 -0
  162. package/src/composer/ComposerContextMenu.tsx +94 -22
  163. package/src/composer/ComposerPlusMenu.parity.spec.tsx +218 -233
  164. package/src/composer/MentionPopover.tsx +12 -3
  165. package/src/composer/PromptComposer.context.spec.tsx +527 -195
  166. package/src/composer/PromptComposer.tsx +1 -1
  167. package/src/composer/TiptapComposer.tsx +105 -37
  168. package/src/composer/use-mention-search.ts +8 -1
@@ -11,6 +11,7 @@ import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, } from "../ui/p
11
11
  import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip.js";
12
12
  import { formatAttachmentError } from "./attachment-accept.js";
13
13
  import { BuilderBMark } from "./BuilderBMark.js";
14
+ import { searchComposerContextActions, } from "./ComposerContextMenu.js";
14
15
  import { ComposerPlusMenu, } from "./ComposerPlusMenu.js";
15
16
  import { areComposerContextItemsReady, ComposerContextError, snapshotComposerContextItems, } from "./context-items.js";
16
17
  import { getComposerDraftKey } from "./draft-key.js";
@@ -167,6 +168,9 @@ function isSameComposerAttachment(current, submitted) {
167
168
  function isSameComposerAttachmentSnapshot(current, snapshot) {
168
169
  return current.id === snapshot.id && current.file === snapshot.file;
169
170
  }
171
+ // Host Add-menu actions listed among "@" suggestions. Picking one runs the
172
+ // action or opens its picker as a dialog instead of inserting a mention.
173
+ const COMPOSER_CONTEXT_ENTRY_SOURCE = "composer-context";
170
174
  function composerReferenceFromMentionItem(item) {
171
175
  return {
172
176
  label: item.referenceLabel ?? item.label,
@@ -1338,6 +1342,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1338
1342
  });
1339
1343
  const [popover, setPopover] = useState(null);
1340
1344
  const [contextMenuOpen, setContextMenuOpen] = useState(false);
1345
+ const [contextEntryRequest, setContextEntryRequest] = useState(null);
1341
1346
  const popoverRef = useRef(null);
1342
1347
  const composerRuntime = useComposerRuntime();
1343
1348
  const lastComposerRuntimeSyncRef = useRef(null);
@@ -1418,13 +1423,48 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1418
1423
  onExecModeChangeRef.current = onExecModeChange;
1419
1424
  const planModeDisabledRef = useRef(planModeDisabled);
1420
1425
  planModeDisabledRef.current = planModeDisabled;
1421
- const { items: mentionItems, isLoading: mentionsLoading, error: mentionsError, retry: retryMentions, } = useMentionSearch(popover?.type === "@" ? popover.query : "", includeDefaultMentionSearch && (contextMenuOpen || popover?.type === "@"));
1426
+ const { items: mentionItems, isLoading: mentionsLoading, error: mentionsError, retry: retryMentions, settledQuery: settledMentionQuery, } = useMentionSearch(popover?.type === "@" ? popover.query : "", includeDefaultMentionSearch && (contextMenuOpen || popover?.type === "@"));
1422
1427
  const mentionQuery = popover?.type === "@" ? popover.query : "";
1423
1428
  const filteredMentionItems = useMemo(() => filterMentionItemsForSlots([
1424
1429
  // Host items arrive unfiltered; the default search filters itself.
1425
1430
  ...hostMentionItems.filter((item) => mentionItemMatchesQuery(item, mentionQuery)),
1426
1431
  ...mentionItems,
1427
1432
  ].filter((item, index, items) => items.findIndex((candidate) => candidate.id === item.id) === index), slotReferences), [hostMentionItems, mentionItems, mentionQuery, slotReferences]);
1433
+ const inlineMentionItems = useMemo(() => {
1434
+ if (popover?.type !== "@" ||
1435
+ !hasContextMenu ||
1436
+ disabled ||
1437
+ contextControlsDisabled ||
1438
+ !contextMenuItems?.length)
1439
+ return filteredMentionItems;
1440
+ const addContextLabel = t("agentChat.composer.addContext", {
1441
+ defaultValue: "Add context",
1442
+ });
1443
+ return [
1444
+ ...searchComposerContextActions(contextMenuItems, mentionQuery)
1445
+ // Custom pages only render inside the + menu.
1446
+ .filter(({ action }) => !action.disabled && !action.render)
1447
+ .map(({ action, categories }) => ({
1448
+ id: `${COMPOSER_CONTEXT_ENTRY_SOURCE}:${action.id}`,
1449
+ label: action.label,
1450
+ description: action.description,
1451
+ source: COMPOSER_CONTEXT_ENTRY_SOURCE,
1452
+ refType: COMPOSER_CONTEXT_ENTRY_SOURCE,
1453
+ refId: action.id,
1454
+ section: categories[0] ?? addContextLabel,
1455
+ })),
1456
+ ...filteredMentionItems,
1457
+ ];
1458
+ }, [
1459
+ popover?.type,
1460
+ hasContextMenu,
1461
+ disabled,
1462
+ contextControlsDisabled,
1463
+ contextMenuItems,
1464
+ mentionQuery,
1465
+ filteredMentionItems,
1466
+ t,
1467
+ ]);
1428
1468
  const { skills, hint, isLoading: skillsLoading, } = useSkills(includeDefaultSlashSkills && popover?.type === "/");
1429
1469
  const allSlashCommands = useMemo(() => {
1430
1470
  // A command without a host callback would be deleted as an invisible no-op.
@@ -1458,14 +1498,17 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1458
1498
  s.description?.toLowerCase().includes(q));
1459
1499
  }, [allSlashSkills, popover]);
1460
1500
  // Keep refs in sync with state
1461
- const mentionItemsRef = useRef(filteredMentionItems);
1462
- mentionItemsRef.current = filteredMentionItems;
1501
+ // Results for an earlier query are stale until the search for this one
1502
+ // settles, so auto-close may not treat them as final. Host mention items
1503
+ // carry no readiness signal (they may still be loading), so only a settled
1504
+ // default search can end a query as "nothing matches".
1505
+ const mentionSearchSettled = includeDefaultMentionSearch &&
1506
+ !mentionsLoading &&
1507
+ settledMentionQuery === mentionQuery;
1463
1508
  const filteredCommandsRef = useRef(filteredCommands);
1464
1509
  filteredCommandsRef.current = filteredCommands;
1465
1510
  const filteredSkillsRef = useRef(filteredSkills);
1466
1511
  filteredSkillsRef.current = filteredSkills;
1467
- const hasContextMenuRef = useRef(hasContextMenu);
1468
- hasContextMenuRef.current = hasContextMenu;
1469
1512
  const launchersDisabledRef = useRef(disabled || contextControlsDisabled);
1470
1513
  launchersDisabledRef.current = disabled || contextControlsDisabled;
1471
1514
  const onSlashCommandRef = useRef(onSlashCommand);
@@ -1510,6 +1553,21 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1510
1553
  setPopover(null);
1511
1554
  popoverStateRef.current = null;
1512
1555
  }, []);
1556
+ // A query nothing matches is plain text ("@builder.io", "@3pm"), so end the
1557
+ // mention there instead of holding later keys.
1558
+ useEffect(() => {
1559
+ if (mentionQuery &&
1560
+ mentionSearchSettled &&
1561
+ inlineMentionItems.length === 0) {
1562
+ closePopover();
1563
+ }
1564
+ }, [mentionQuery, mentionSearchSettled, inlineMentionItems, closePopover]);
1565
+ // The + menu runs a request from its own effect, which fires before this one;
1566
+ // clear it so a remounted menu cannot run the same action again.
1567
+ useEffect(() => {
1568
+ if (contextEntryRequest)
1569
+ setContextEntryRequest(null);
1570
+ }, [contextEntryRequest]);
1513
1571
  // Persist draft to localStorage so refreshes don't lose the prompt.
1514
1572
  const hasDraftScope = Boolean(draftScope?.trim());
1515
1573
  const draftKey = hasDraftScope || initialText === undefined
@@ -1910,14 +1968,6 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1910
1968
  const pop = popoverStateRef.current;
1911
1969
  // Handle popover keyboard nav
1912
1970
  if (pop) {
1913
- if (event.key === " " && pop.type === "@" && pop.query) {
1914
- const exact = findExactMentionItem(mentionItemsRef.current, pop.query);
1915
- if (exact) {
1916
- event.preventDefault();
1917
- selectMention(view, pop, exact);
1918
- return true;
1919
- }
1920
- }
1921
1971
  if (event.key === "ArrowUp") {
1922
1972
  event.preventDefault();
1923
1973
  popoverRef.current?.moveUp();
@@ -1928,7 +1978,19 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
1928
1978
  popoverRef.current?.moveDown();
1929
1979
  return true;
1930
1980
  }
1931
- if (event.key === "Enter") {
1981
+ // A mention comes only from an explicit pick of a highlighted row. With
1982
+ // nothing highlighted, even while a search is pending, the "@" is
1983
+ // plain text: Enter submits it and a late result changes nothing.
1984
+ const highlighted = pop.type === "@" ? popoverRef.current?.getSelectedMention() : null;
1985
+ if (event.key === "Enter" && pop.type === "@" && !highlighted) {
1986
+ closePopover();
1987
+ }
1988
+ else if (event.key === "Tab" && !event.shiftKey && highlighted) {
1989
+ event.preventDefault();
1990
+ selectMention(view, pop, highlighted);
1991
+ return true;
1992
+ }
1993
+ else if (event.key === "Enter") {
1932
1994
  event.preventDefault();
1933
1995
  const idx = popoverRef.current?.getSelectedIndex() ?? 0;
1934
1996
  const currentCommands = filteredCommandsRef.current;
@@ -2035,20 +2097,15 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2035
2097
  return true;
2036
2098
  }
2037
2099
  // Detect @ trigger — only when preceded by start-of-text, space, or newline
2038
- // (not after alphanumeric chars, which would indicate an email address)
2100
+ // (not after alphanumeric chars, which would indicate an email address).
2101
+ // Keep the typed "@" in the draft and focus in the editor: a focus-taking
2102
+ // menu here would swallow the rest of a literal like "@builder.io".
2039
2103
  if (event.key === "@") {
2104
+ if (launchersDisabledRef.current)
2105
+ return false;
2040
2106
  const { from } = view.state.selection;
2041
2107
  const textBefore = view.state.doc.textBetween(Math.max(0, from - 1), from);
2042
2108
  if (from === 1 || textBefore === "" || /\s/.test(textBefore)) {
2043
- if (hasContextMenuRef.current) {
2044
- if (launchersDisabledRef.current)
2045
- return false;
2046
- event.preventDefault();
2047
- popoverStateRef.current = null;
2048
- setPopover(null);
2049
- setContextMenuOpen(true);
2050
- return true;
2051
- }
2052
2109
  const position = getComposerPopoverAnchorPosition(view, from);
2053
2110
  if (!position)
2054
2111
  return false;
@@ -2234,16 +2291,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
2234
2291
  if (!isComposerEditorUsable(editor))
2235
2292
  return;
2236
2293
  editor.commands.focus();
2237
- // An inserted "@" opens the shared Add menu when the host provides one.
2238
- const mention = text === "@";
2239
- if (mention && hasContextMenuRef.current) {
2240
- if (launchersDisabledRef.current)
2241
- return;
2242
- popoverStateRef.current = null;
2243
- setPopover(null);
2244
- setContextMenuOpen(true);
2245
- return;
2246
- }
2294
+ const mention = text === "@" && !launchersDisabledRef.current;
2247
2295
  let inserted = text;
2248
2296
  if (mention) {
2249
2297
  const { from } = editor.state.selection;
@@ -3462,6 +3510,14 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3462
3510
  const currentPos = ed.state.selection.from;
3463
3511
  // startPos is after the trigger char, so -1 to include the @ or /
3464
3512
  const deleteFrom = Math.max(0, pop.startPos - 1);
3513
+ if (item.source === COMPOSER_CONTEXT_ENTRY_SOURCE && item.refId) {
3514
+ ed.chain()
3515
+ .focus()
3516
+ .deleteRange({ from: deleteFrom, to: currentPos })
3517
+ .run();
3518
+ setContextEntryRequest({ id: item.refId });
3519
+ return;
3520
+ }
3465
3521
  const normalized = adapters.agentChat.normalizeReference(composerReferenceFromMentionItem(item));
3466
3522
  if (!normalized)
3467
3523
  return;
@@ -3853,7 +3909,7 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3853
3909
  }), 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", {
3854
3910
  defaultValue: "Retry {{name}} context",
3855
3911
  name: item.title,
3856
- }) })] })) : null] }, item.key)))] })), contextSubmissionError ? (_jsx("p", { role: "alert", className: "px-2 text-xs text-destructive", children: contextSubmissionError })) : null, attachmentError ? (_jsx("p", { role: "alert", className: "break-words px-2.5 pt-2 text-xs text-destructive", children: attachmentError })) : 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"
3912
+ }) })] })) : null] }, item.key)))] })), contextSubmissionError ? (_jsx("p", { role: "alert", className: "px-2 text-xs text-destructive", children: contextSubmissionError })) : null, attachmentError ? (_jsx("p", { role: "alert", className: "break-words px-2.5 pt-2 text-xs text-destructive", children: attachmentError })) : 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, openEntry: contextEntryRequest, mode: launchersDisabled || plusMenuMode === "hidden"
3857
3913
  ? "upload-only"
3858
3914
  : plusMenuMode, onSelectMode: handleSelectMode, terminalModeControl: terminalModeControl, extensionTools: extensionTools, attachmentsEnabled: attachmentsEnabled, open: contextMenuOpen, onOpenChange: setContextMenuOpen, loading: mentionsLoading, error: mentionsError
3859
3915
  ? t("agentChat.composer.contextLoadFailed", {
@@ -3873,6 +3929,6 @@ export function TiptapComposer({ placeholder, ariaLabel, disabled = false, conte
3873
3929
  }
3874
3930
  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]"));
3875
3931
  pageTarget?.focus();
3876
- }, 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: (event) => void submitComposer("immediate", undefined, event.metaKey || event.ctrlKey), 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 })] }));
3932
+ }, 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: (event) => void submitComposer("immediate", undefined, event.metaKey || event.ctrlKey), 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: inlineMentionItems, skills: filteredSkills, commands: filteredCommands, hint: hint, isLoading: popover?.type === "@" ? mentionsLoading : skillsLoading, query: popover?.query ?? "", onSelectMention: handleSelectMention, onSelectSkill: handleSelectSkill, onSelectCommand: handleSelectCommand, onClose: closePopover })] }));
3877
3933
  }
3878
3934
  //# sourceMappingURL=TiptapComposer.js.map