@agent-native/core 0.12.30 → 0.12.31

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 (66) hide show
  1. package/dist/agent/run-manager.d.ts.map +1 -1
  2. package/dist/agent/run-manager.js +21 -5
  3. package/dist/agent/run-manager.js.map +1 -1
  4. package/dist/client/AgentPanel.d.ts.map +1 -1
  5. package/dist/client/AgentPanel.js +10 -3
  6. package/dist/client/AgentPanel.js.map +1 -1
  7. package/dist/client/AssistantChat.d.ts.map +1 -1
  8. package/dist/client/AssistantChat.js +77 -20
  9. package/dist/client/AssistantChat.js.map +1 -1
  10. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  11. package/dist/client/MultiTabAssistantChat.js +9 -8
  12. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  13. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  14. package/dist/client/agent-chat-adapter.js +23 -4
  15. package/dist/client/agent-chat-adapter.js.map +1 -1
  16. package/dist/client/composer/TiptapComposer.js +1 -1
  17. package/dist/client/composer/TiptapComposer.js.map +1 -1
  18. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  19. package/dist/client/dev-overlay/DevOverlay.js +5 -1
  20. package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
  21. package/dist/client/guided-questions.d.ts +77 -0
  22. package/dist/client/guided-questions.d.ts.map +1 -0
  23. package/dist/client/guided-questions.js +295 -0
  24. package/dist/client/guided-questions.js.map +1 -0
  25. package/dist/client/index.d.ts +1 -0
  26. package/dist/client/index.d.ts.map +1 -1
  27. package/dist/client/index.js +1 -0
  28. package/dist/client/index.js.map +1 -1
  29. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  30. package/dist/client/org/OrgSwitcher.js +8 -1
  31. package/dist/client/org/OrgSwitcher.js.map +1 -1
  32. package/dist/client/settings/SettingsPanel.d.ts +3 -1
  33. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  34. package/dist/client/settings/SettingsPanel.js +78 -12
  35. package/dist/client/settings/SettingsPanel.js.map +1 -1
  36. package/dist/client/settings/SettingsSection.d.ts +2 -1
  37. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  38. package/dist/client/settings/SettingsSection.js +2 -2
  39. package/dist/client/settings/SettingsSection.js.map +1 -1
  40. package/dist/client/sharing/ShareButton.d.ts +4 -0
  41. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  42. package/dist/client/sharing/ShareButton.js +76 -32
  43. package/dist/client/sharing/ShareButton.js.map +1 -1
  44. package/dist/client/sharing/ShareButton.spec.js +54 -7
  45. package/dist/client/sharing/ShareButton.spec.js.map +1 -1
  46. package/dist/client/use-db-sync.d.ts +12 -2
  47. package/dist/client/use-db-sync.d.ts.map +1 -1
  48. package/dist/client/use-db-sync.js +195 -53
  49. package/dist/client/use-db-sync.js.map +1 -1
  50. package/dist/server/core-routes-plugin.js +2 -2
  51. package/dist/server/core-routes-plugin.js.map +1 -1
  52. package/dist/server/index.d.ts +2 -1
  53. package/dist/server/index.d.ts.map +1 -1
  54. package/dist/server/index.js +2 -1
  55. package/dist/server/index.js.map +1 -1
  56. package/dist/server/poll-events.d.ts +12 -0
  57. package/dist/server/poll-events.d.ts.map +1 -0
  58. package/dist/server/poll-events.js +41 -0
  59. package/dist/server/poll-events.js.map +1 -0
  60. package/dist/server/poll.d.ts +4 -0
  61. package/dist/server/poll.d.ts.map +1 -1
  62. package/dist/server/poll.js +19 -12
  63. package/dist/server/poll.js.map +1 -1
  64. package/dist/templates/default/react-router.config.ts +1 -0
  65. package/package.json +1 -1
  66. package/src/templates/default/react-router.config.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AA4Bf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AA4vErE,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,4CAA4C;IAC5C,SAAS,IAAI,OAAO,CAAC;IACrB,+BAA+B;IAC/B,aAAa,IAAI,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,KACE,IAAI,CAAC;IACV,+DAA+D;IAC/D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IACpD,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,uDAAuD;IACvD,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,kEAAkE;IAClE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,QAI9C;AAqCD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAg9C7B,eAAO,MAAM,aAAa,gGA4DxB,CAAC"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -563,25 +563,75 @@ function ComposerAttachmentPreviewStrip() {
563
563
  // can stop spinning when the user clicks stop. `thread.isRunning` alone misses
564
564
  // the force-stopped case; `part.result === undefined` alone ignores stop.
565
565
  const ChatRunningContext = React.createContext(false);
566
- // ─── Tool Call Display ──────────────────────────────────────────────────────
567
- // Shared presentational component for rendering a tool call pill + result.
568
- // Used by both the normal message path (ToolCallFallback) and the reconnect
569
- // stream path (ReconnectStreamMessage). All state is passed as props — no
570
- // assistant-ui hooks here.
566
+ function stringifyToolValue(value, pretty = false) {
567
+ if (typeof value === "string")
568
+ return value;
569
+ try {
570
+ return JSON.stringify(value, null, pretty ? 2 : 0);
571
+ }
572
+ catch {
573
+ return String(value ?? "");
574
+ }
575
+ }
576
+ function toolArgsPreview(args) {
577
+ return Object.entries(args)
578
+ .map(([key, value]) => {
579
+ const singleLine = stringifyToolValue(value).replace(/\s+/g, " ").trim();
580
+ const preview = singleLine.length > 96 ? `${singleLine.slice(0, 96)}...` : singleLine;
581
+ return `${key}=${preview}`;
582
+ })
583
+ .join(", ");
584
+ }
585
+ function toolArgsDisplayText(args) {
586
+ const entries = Object.entries(args);
587
+ if (entries.length === 1) {
588
+ const [key, value] = entries[0];
589
+ return `${key}=\n${stringifyToolValue(value, true)}`;
590
+ }
591
+ return JSON.stringify(args, null, 2);
592
+ }
593
+ function toolArgsCopyText(args) {
594
+ const entries = Object.entries(args);
595
+ if (entries.length === 1 && typeof entries[0][1] === "string") {
596
+ return entries[0][1];
597
+ }
598
+ return JSON.stringify(args, null, 2);
599
+ }
571
600
  function ToolCallDisplay({ toolName, argsText, args, result, isRunning, }) {
572
601
  const streamRef = useRef(null);
573
602
  const isAgentCall = toolName.startsWith("agent:");
574
603
  const [expanded, setExpanded] = useState(isAgentCall);
604
+ const [copiedSection, setCopiedSection] = useState(null);
605
+ const copyResetRef = useRef(null);
575
606
  const agentName = isAgentCall ? toolName.slice(6) : null;
576
607
  const isAgentError = isAgentCall && result === "Error calling agent";
577
608
  const agentStreamText = isAgentCall ? (argsText ?? "") : "";
578
609
  const hasStreamText = agentStreamText.length > 0;
610
+ const hasArgs = !isAgentCall && Object.keys(args).length > 0;
579
611
  // NOTE: All hooks must be above any conditional returns
580
612
  useEffect(() => {
581
613
  if (isAgentCall && isRunning && streamRef.current) {
582
614
  streamRef.current.scrollTop = streamRef.current.scrollHeight;
583
615
  }
584
616
  }, [agentStreamText, isAgentCall, isRunning]);
617
+ useEffect(() => {
618
+ return () => {
619
+ if (copyResetRef.current)
620
+ clearTimeout(copyResetRef.current);
621
+ };
622
+ }, []);
623
+ const copyToolDetail = useCallback(async (section, text) => {
624
+ try {
625
+ await navigator.clipboard.writeText(text);
626
+ setCopiedSection(section);
627
+ if (copyResetRef.current)
628
+ clearTimeout(copyResetRef.current);
629
+ copyResetRef.current = setTimeout(() => setCopiedSection(null), 1200);
630
+ }
631
+ catch {
632
+ // Clipboard failures should not interrupt chat rendering.
633
+ }
634
+ }, []);
585
635
  // Render connect-builder as ConnectBuilderCard once the result is available
586
636
  if (toolName === "connect-builder" && result) {
587
637
  try {
@@ -620,11 +670,10 @@ function ToolCallDisplay({ toolName, argsText, args, result, isRunning, }) {
620
670
  // Fall through to default pill rendering
621
671
  }
622
672
  }
623
- const argsStr = isAgentCall
624
- ? ""
625
- : Object.entries(args)
626
- .map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
627
- .join(", ");
673
+ const argsStr = isAgentCall ? "" : toolArgsPreview(args);
674
+ const inputDisplay = hasArgs ? toolArgsDisplayText(args) : "";
675
+ const inputCopy = hasArgs ? toolArgsCopyText(args) : "";
676
+ const resultDisplay = result !== undefined ? stringifyToolValue(result, true) : "";
628
677
  const displayName = isAgentCall
629
678
  ? isRunning
630
679
  ? `Asking ${agentName}...`
@@ -632,13 +681,13 @@ function ToolCallDisplay({ toolName, argsText, args, result, isRunning, }) {
632
681
  ? `Error asking ${agentName}`
633
682
  : `Asked ${agentName}`
634
683
  : toolName;
635
- const canExpand = isAgentCall ? hasStreamText : result !== undefined;
684
+ const canExpand = isAgentCall
685
+ ? hasStreamText
686
+ : hasArgs || result !== undefined;
636
687
  const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;
637
- return (_jsxs("div", { className: "my-1 overflow-hidden", children: [_jsxs("button", { onClick: () => canExpand && setExpanded(!isExpanded), className: cn("flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden", isRunning
688
+ return (_jsxs("div", { className: "my-1 overflow-hidden", children: [_jsxs("button", { onClick: () => canExpand && setExpanded(!isExpanded), "aria-expanded": canExpand ? isExpanded : undefined, className: cn("flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden", isRunning
638
689
  ? "bg-muted text-muted-foreground"
639
- : "bg-muted text-muted-foreground hover:bg-accent"), children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : isAgentError ? (_jsx(IconCircleX, { className: "h-3 w-3 text-destructive" })) : result !== undefined ? (_jsx(IconCheck, { className: "h-3 w-3 text-emerald-500" })) : (_jsx(IconSquareFilled, { className: "h-3 w-3 text-muted-foreground" })) }), _jsxs("span", { className: "truncate min-w-0", children: [_jsx("span", { className: "font-medium", children: displayName }), argsStr && _jsxs("span", { className: "opacity-60 ml-1", children: ["(", argsStr, ")"] })] }), canExpand && !isRunning && (_jsx(IconChevronDown, { className: cn("ml-auto h-3 w-3 shrink-0 opacity-40", isExpanded && "rotate-180") }))] }), isExpanded && isAgentCall && hasStreamText && (_jsx("div", { ref: streamRef, className: "mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], components: markdownComponents, children: agentStreamText }) })), isExpanded && !isAgentCall && result !== undefined && (_jsx("div", { className: "mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs font-mono text-muted-foreground whitespace-pre-wrap break-all max-h-48 overflow-y-auto", children: typeof result === "string"
640
- ? result
641
- : JSON.stringify(result, null, 2) }))] }));
690
+ : "bg-muted text-muted-foreground hover:bg-accent"), children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : isAgentError ? (_jsx(IconCircleX, { className: "h-3 w-3 text-destructive" })) : result !== undefined ? (_jsx(IconCheck, { className: "h-3 w-3 text-emerald-500" })) : (_jsx(IconSquareFilled, { className: "h-3 w-3 text-muted-foreground" })) }), _jsxs("span", { className: "truncate min-w-0", children: [_jsx("span", { className: "font-medium", children: displayName }), argsStr && _jsxs("span", { className: "opacity-60 ml-1", children: ["(", argsStr, ")"] })] }), canExpand && (_jsx(IconChevronDown, { className: cn("ml-auto h-3 w-3 shrink-0 opacity-40", isExpanded && "rotate-180") }))] }), isExpanded && isAgentCall && hasStreamText && (_jsx("div", { ref: streamRef, className: "mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], components: markdownComponents, children: agentStreamText }) })), isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (_jsxs("div", { className: "mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground", children: [hasArgs && (_jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-2", children: [_jsx("span", { className: "font-medium text-foreground/80", children: "Input" }), _jsxs("button", { type: "button", onClick: () => copyToolDetail("input", inputCopy), className: "inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-background/80 hover:text-foreground", children: [_jsx(IconCopy, { size: 12 }), copiedSection === "input" ? "Copied" : "Copy"] })] }), _jsx("pre", { className: "max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md border border-border/50 bg-background/60 p-2 font-mono text-[11px] leading-relaxed", children: inputDisplay })] })), result !== undefined && (_jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-2", children: [_jsx("span", { className: "font-medium text-foreground/80", children: "Result" }), _jsxs("button", { type: "button", onClick: () => copyToolDetail("result", resultDisplay), className: "inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-background/80 hover:text-foreground", children: [_jsx(IconCopy, { size: 12 }), copiedSection === "result" ? "Copied" : "Copy"] })] }), _jsx("pre", { className: "max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md border border-border/50 bg-background/60 p-2 font-mono text-[11px] leading-relaxed", children: resultDisplay })] }))] }))] }));
642
691
  }
643
692
  function ToolCallFallback({ toolName, args, argsText, result, }) {
644
693
  const chatRunning = React.useContext(ChatRunningContext);
@@ -1036,6 +1085,11 @@ function getRunErrorMetadata(message) {
1036
1085
  ...(runError.recoverable ? { recoverable: true } : {}),
1037
1086
  };
1038
1087
  }
1088
+ function getRequestModeMetadata(message) {
1089
+ const meta = message?.metadata;
1090
+ const requestMode = meta?.custom?.requestMode ?? meta?.requestMode;
1091
+ return requestMode === "act" || requestMode === "plan" ? requestMode : null;
1092
+ }
1039
1093
  function isBuilderReconnectRunError(info) {
1040
1094
  const code = (info.errorCode ?? "").toLowerCase();
1041
1095
  const message = info.message.toLowerCase();
@@ -2093,12 +2147,15 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2093
2147
  }
2094
2148
  return "";
2095
2149
  }, [messages]);
2096
- const latestMessageRole = messages[messages.length - 1]?.role;
2150
+ const latestMessage = messages[messages.length - 1];
2151
+ const latestMessageRole = latestMessage?.role;
2152
+ const latestAssistantWasPlan = latestMessageRole === "assistant" &&
2153
+ getRequestModeMetadata(latestMessage) === "plan";
2097
2154
  const showPlanModeCallout = execMode === "plan" &&
2098
2155
  !planModeDisabled &&
2099
2156
  !isComposerDisabled &&
2100
2157
  !showRunningInUI;
2101
- const canImplementPlan = showPlanModeCallout && latestMessageRole === "assistant";
2158
+ const canImplementPlan = showPlanModeCallout && latestAssistantWasPlan;
2102
2159
  const handleImplementPlan = useCallback(() => {
2103
2160
  onExecModeChange?.("build");
2104
2161
  void addToQueue("Implement the plan.", undefined, undefined, undefined, "act");
@@ -2161,12 +2218,12 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2161
2218
  addToQueue("Continue from where you left off.");
2162
2219
  } })), shouldShowRunError && visibleRunError && (_jsx(RunErrorRecoveryCard, { info: visibleRunError, onContinue: () => {
2163
2220
  setRunErrorInfo(null);
2164
- addToQueue("Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Prefer dedicated app actions over raw database edits when they exist.");
2221
+ addToQueue("Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. Prefer dedicated app actions over raw database edits when they exist.");
2165
2222
  }, onRetry: () => {
2166
2223
  setRunErrorInfo(null);
2167
2224
  addToQueue(lastUserText
2168
- ? `Retry the previous request from a clean approach. Original request:\n\n${lastUserText}`
2169
- : "Retry the previous request from a clean approach.");
2225
+ ? `Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\n\nOriginal request:\n\n${lastUserText}`
2226
+ : "Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.");
2170
2227
  }, onFork: onForkChat, onDismiss: () => {
2171
2228
  if (visibleRunErrorKey) {
2172
2229
  setDismissedRunErrorKey(visibleRunErrorKey);