@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
@@ -984,6 +984,15 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
984
984
  opacity: 1;
985
985
  }
986
986
 
987
+ .agentkit-message .agentkit-message-actions[data-streaming="true"],
988
+ .agentkit-message:hover .agentkit-message-actions[data-streaming="true"],
989
+ .agentkit-message:focus-within
990
+ .agentkit-message-actions[data-streaming="true"] {
991
+ opacity: 0;
992
+ visibility: hidden;
993
+ pointer-events: none;
994
+ }
995
+
987
996
  @media (hover: none), (any-pointer: coarse) {
988
997
  .agentkit-message-actions[data-role="user"] {
989
998
  opacity: 1;
@@ -1133,11 +1142,11 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1133
1142
  }
1134
1143
 
1135
1144
  .agentkit-activities-summary {
1136
- display: grid;
1145
+ display: flex;
1137
1146
  inline-size: fit-content;
1138
1147
  max-inline-size: 100%;
1139
- justify-items: start;
1140
- gap: 0.125rem;
1148
+ align-items: center;
1149
+ gap: 0.375rem;
1141
1150
  }
1142
1151
 
1143
1152
  .agentkit-activities {
@@ -1263,6 +1272,12 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1263
1272
  gap: 0.375rem;
1264
1273
  }
1265
1274
 
1275
+ .agentkit-activities-summary-content {
1276
+ display: grid;
1277
+ min-inline-size: 0;
1278
+ gap: 0.125rem;
1279
+ }
1280
+
1266
1281
  .agentkit-activities-current {
1267
1282
  display: flex;
1268
1283
  align-items: center;
@@ -1280,20 +1295,6 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1280
1295
  white-space: nowrap;
1281
1296
  }
1282
1297
 
1283
- .agentkit-activities-current[data-running="true"]
1284
- .agentkit-activities-current-label {
1285
- color: transparent;
1286
- background: linear-gradient(
1287
- 90deg,
1288
- var(--agentkit-text),
1289
- color-mix(in srgb, var(--agentkit-text) 32%, transparent),
1290
- var(--agentkit-text)
1291
- );
1292
- background-size: 200% 100%;
1293
- background-clip: text;
1294
- animation: agentkit-shimmer 1.8s linear infinite;
1295
- }
1296
-
1297
1298
  .agentkit-summary-chevron,
1298
1299
  .agentkit-disclosure-icon {
1299
1300
  transition:
@@ -1301,16 +1302,24 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1301
1302
  transform 160ms ease;
1302
1303
  }
1303
1304
 
1304
- .agentkit-activities-summary .agentkit-summary-chevron {
1305
+ .agentkit-activities-summary > .agentkit-summary-chevron {
1305
1306
  opacity: 0;
1306
1307
  }
1307
1308
 
1308
- .agentkit-activities-summary:hover .agentkit-summary-chevron,
1309
- .agentkit-activities-summary:focus-visible .agentkit-summary-chevron,
1310
- .agentkit-activities[open] .agentkit-summary-chevron {
1309
+ .agentkit-activities[data-expandable="true"]
1310
+ .agentkit-activities-summary:hover
1311
+ > .agentkit-summary-chevron,
1312
+ .agentkit-activities[data-expandable="true"]
1313
+ .agentkit-activities-summary:focus-visible
1314
+ > .agentkit-summary-chevron,
1315
+ .agentkit-activities[data-expandable="true"][open] .agentkit-summary-chevron {
1311
1316
  opacity: 1;
1312
1317
  }
1313
1318
 
1319
+ .agentkit-activities[data-expandable="false"] .agentkit-activities-summary {
1320
+ cursor: default;
1321
+ }
1322
+
1314
1323
  .agentkit-activities-static {
1315
1324
  display: grid;
1316
1325
  min-inline-size: 0;
@@ -1346,7 +1355,10 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1346
1355
 
1347
1356
  .agentkit-activities-list {
1348
1357
  display: grid;
1358
+ max-block-size: 15.625rem;
1349
1359
  gap: 0.5rem;
1360
+ overflow: auto;
1361
+ overscroll-behavior: contain;
1350
1362
  padding-block-start: 0.25rem;
1351
1363
  }
1352
1364
 
@@ -1384,7 +1396,9 @@ body:has(> [data-agent-native-composer-popover="true"]) > .fixed.inset-0 {
1384
1396
 
1385
1397
  @media (hover: none) {
1386
1398
  .agentkit-message-actions[data-role="user"],
1387
- .agentkit-activities-summary .agentkit-summary-chevron {
1399
+ .agentkit-activities[data-expandable="true"]
1400
+ .agentkit-activities-summary
1401
+ .agentkit-summary-chevron {
1388
1402
  opacity: 1;
1389
1403
  }
1390
1404
  }
@@ -1844,8 +1858,6 @@ button.agentkit-object {
1844
1858
  }
1845
1859
 
1846
1860
  @media (prefers-reduced-motion: reduce) {
1847
- .agentkit-activities-current[data-running="true"]
1848
- .agentkit-activities-current-label,
1849
1861
  .agentkit-activity-item[data-status="running"] .agentkit-activity-label,
1850
1862
  .agentkit-agent[data-status="working"] .agentkit-agent-name,
1851
1863
  .agentkit-reasoning[data-active="true"] .agentkit-reasoning-label {
@@ -1 +1 @@
1
- {"version":3,"file":"AgentKitAssistantChat.d.ts","sourceRoot":"","sources":["../../../src/app/chat/AgentKitAssistantChat.tsx"],"names":[],"mappings":"AA2FA,OAAO,KASN,MAAM,OAAO,CAAC;AAEf,OAAO,EAWL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AAoCpC,OAAO,KAAK,EAGV,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,yBAAyB,CAAC;AAajC,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,mFAAmF;IACnF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;OAGG;IACH,aAAa,CAAC,EAAE,iHAAiH,CAAC;CACnI;AAqZD,eAAO,MAAM,qBAAqB,wGAmgBhC,CAAC"}
1
+ {"version":3,"file":"AgentKitAssistantChat.d.ts","sourceRoot":"","sources":["../../../src/app/chat/AgentKitAssistantChat.tsx"],"names":[],"mappings":"AA2FA,OAAO,KASN,MAAM,OAAO,CAAC;AAEf,OAAO,EAWL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AAoCpC,OAAO,KAAK,EAGV,mBAAmB,EACnB,kBAAkB,EAGnB,MAAM,yBAAyB,CAAC;AAajC,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,mFAAmF;IACnF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C;;;OAGG;IACH,aAAa,CAAC,EAAE,iHAAiH,CAAC;CACnI;AAwZD,eAAO,MAAM,qBAAqB,wGAmgBhC,CAAC"}
@@ -659,6 +659,7 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
659
659
  }, [fileUploadStatus.refetch]);
660
660
  const isRestoring = history?.isRestoring === true || props.threadRestore.status === "loading";
661
661
  const isSubmissionInFlight = history?.isSubmissionInFlight === true;
662
+ const [composerSubmissionPending, setComposerSubmissionPending] = useState(false);
662
663
  const [authError, setAuthError] = useState(null);
663
664
  const [authSessionAvailable, setAuthSessionAvailable] = useState(false);
664
665
  const [composerText, setComposerText] = useState(() => readAssistantChatComposerDraft(props.tabId ?? threadId) ?? "");
@@ -768,6 +769,10 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
768
769
  .reverse()
769
770
  .find((message) => message.role === "assistant"), [thread.messages]);
770
771
  const isRunning = hasActiveAgentRuns(thread);
772
+ const lastMessage = thread.messages.at(-1);
773
+ const isThinkingVisibleInTranscript = (isRunning || isSubmissionInFlight) &&
774
+ lastMessage?.role === "user" &&
775
+ lastMessage.metadata?.hideUserMessage !== true;
771
776
  const isThreadRunning = useCallback(() => hasActiveAgentRuns(controller.getThread(threadId)), [controller, threadId]);
772
777
  useEffect(() => {
773
778
  if (previousPrefillRevisionRef.current === prefillRevision)
@@ -1764,13 +1769,15 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1764
1769
  }
1765
1770
  }, [props.isActiveComposer, props.tabId, send, threadId]);
1766
1771
  const submitSuggestion = useCallback((suggestion) => {
1772
+ if (composerSubmissionPending)
1773
+ return;
1767
1774
  const handler = suggestionSubmitRef.current;
1768
1775
  if (!handler || handler.threadId !== threadId)
1769
1776
  return;
1770
1777
  void handler.submit(suggestion).catch((error) => {
1771
1778
  dispatchSetupRequiredEvent(error, props.tabId, threadId);
1772
1779
  });
1773
- }, [props.tabId, threadId]);
1780
+ }, [composerSubmissionPending, props.tabId, threadId]);
1774
1781
  const retryDeferredSubmission = useCallback(async () => {
1775
1782
  if (!deferredProviderSubmissionFailureId)
1776
1783
  return;
@@ -1903,6 +1910,9 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1903
1910
  setupBouncePulse,
1904
1911
  bounceSetupCard,
1905
1912
  isSubmissionInFlight,
1913
+ composerSubmissionPending,
1914
+ onComposerSubmissionPendingChange: setComposerSubmissionPending,
1915
+ isThinkingVisibleInTranscript,
1906
1916
  contextItems,
1907
1917
  voiceTranscriptMessages,
1908
1918
  selectionLength,
@@ -1974,7 +1984,8 @@ function AgentKitEmptyState({ threadId }) {
1974
1984
  const prompt = agentSuggestionPrompt(suggestion);
1975
1985
  return (_jsx("button", { type: "button", disabled: !surface.canChat ||
1976
1986
  surface.props.composerDisabled ||
1977
- surface.props.composerSubmissionDisabled, onClick: () => surface.submitSuggestion(suggestion), className: "w-full rounded-xl border border-border/70 bg-card/60 px-3 py-2.5 text-left text-[13px] text-muted-foreground shadow-sm transition-colors hover:border-border hover:bg-card hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", children: typeof suggestion === "string"
1987
+ surface.props.composerSubmissionDisabled ||
1988
+ surface.composerSubmissionPending, onClick: () => surface.submitSuggestion(suggestion), className: "w-full rounded-xl border border-border/70 bg-card/60 px-3 py-2.5 text-left text-[13px] text-muted-foreground shadow-sm transition-colors hover:border-border hover:bg-card hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", children: typeof suggestion === "string"
1978
1989
  ? suggestion
1979
1990
  : suggestion.label || prompt || String(index) }, typeof suggestion === "string"
1980
1991
  ? suggestion
@@ -2022,7 +2033,8 @@ function AgentKitTranscript({ children, threadId }) {
2022
2033
  });
2023
2034
  const threadMessageIds = new Set(thread.messages.map((message) => message.id));
2024
2035
  const lastMessage = thread.messages.at(-1);
2025
- const showThinking = (surface.isRunning || surface.isSubmissionInFlight) &&
2036
+ const showThinking = surface.isSubmissionInFlight &&
2037
+ !surface.isRunning &&
2026
2038
  lastMessage?.role === "user" &&
2027
2039
  lastMessage.metadata?.hideUserMessage !== true;
2028
2040
  const pendingVoiceMessages = surface.voiceTranscriptMessages.filter((message) => !threadMessageIds.has(message.id));
@@ -2037,7 +2049,8 @@ function AgentKitTranscript({ children, threadId }) {
2037
2049
  surface.suggestions.length > 0 ? (_jsx(AgentKitSuggestedPrompts, { suggestions: surface.suggestions, disabled: !surface.canChat ||
2038
2050
  surface.props.composerDisabled ||
2039
2051
  surface.props.composerSubmissionDisabled ||
2040
- surface.isSubmissionInFlight, onSelect: surface.submitSuggestion, className: "agentkit-host-suggestions" })) : null;
2052
+ surface.isSubmissionInFlight ||
2053
+ surface.composerSubmissionPending, onSelect: surface.submitSuggestion, className: "agentkit-host-suggestions" })) : null;
2041
2054
  if (surface.authError) {
2042
2055
  const authTitle = surface.authSessionAvailable
2043
2056
  ? t("agentChat.auth.refreshTitle")
@@ -2068,7 +2081,7 @@ function AgentKitTranscript({ children, threadId }) {
2068
2081
  }
2069
2082
  return (_jsxs(_Fragment, { children: [thread.messages.length > 0 || surface.hasRenderedMessages ? (_jsx(AgentKitHistoryBeginningRevert, {})) : null, surface.threadRestore.status === "error" ? (_jsxs("div", { className: "mx-4 mt-3 flex items-center justify-between gap-3 rounded-md border border-border px-3 py-2 text-xs text-muted-foreground", role: "alert", children: [_jsx("span", { children: surface.threadRestore.notFound
2070
2083
  ? t("agentChat.message.threadNotFound")
2071
- : t("agentChat.message.restoreRequestFailed") }), _jsx("button", { type: "button", onClick: surface.retryThreadRestore, className: "shrink-0 rounded px-2 py-1 hover:bg-accent hover:text-foreground", children: t("agentChat.common.retry") })] })) : null, renderThreadSlot(surface.props.threadContentSlot, threadId, surface.props.tabId), children, handoffMessages.map((message) => (_jsx(AgentMessageView, { value: message, threadId: threadId }, message.id))), pendingVoiceMessages.map((message) => (_jsx(AgentMessageView, { value: message, threadId: threadId }, message.id))), showThinking ? (_jsx("div", { role: "status", "aria-live": "polite", className: "px-3 py-2 text-sm text-muted-foreground", children: t("agentChat.status.thinking") })) : null, guided.questions?.length ? (_jsx("div", { className: "px-3 pb-3", children: _jsx(GuidedQuestionFlow, { questions: guided.questions, onSubmit: guided.handleSubmit, onSkip: guided.handleSkip, isSubmitting: guided.isSubmitting, isSubmissionBlocked: !surface.canChat, providerStatus: surface.providerStatus, onRetryProviderStatus: surface.retryProviderStatus, ...(guided.title ? { title: guided.title } : {}), ...(guided.description ? { description: guided.description } : {}), ...(guided.skipLabel ? { skipLabel: guided.skipLabel } : {}), ...(guided.submitLabel ? { submitLabel: guided.submitLabel } : {}), className: "h-auto items-stretch justify-stretch bg-transparent" }) })) : null, suggestionBar, renderThreadSlot(surface.props.threadFooterSlot, threadId, surface.props.tabId)] }));
2084
+ : t("agentChat.message.restoreRequestFailed") }), _jsx("button", { type: "button", onClick: surface.retryThreadRestore, className: "shrink-0 rounded px-2 py-1 hover:bg-accent hover:text-foreground", children: t("agentChat.common.retry") })] })) : null, renderThreadSlot(surface.props.threadContentSlot, threadId, surface.props.tabId), children, handoffMessages.map((message) => (_jsx(AgentMessageView, { value: message, threadId: threadId }, message.id))), pendingVoiceMessages.map((message) => (_jsx(AgentMessageView, { value: message, threadId: threadId }, message.id))), showThinking ? (_jsx("div", { className: "agent-thinking-indicator", role: "status", "aria-live": "polite", children: _jsx("span", { className: "agent-thinking-indicator__text", children: t("agentChat.status.thinking") }) })) : null, guided.questions?.length ? (_jsx("div", { className: "px-3 pb-3", children: _jsx(GuidedQuestionFlow, { questions: guided.questions, onSubmit: guided.handleSubmit, onSkip: guided.handleSkip, isSubmitting: guided.isSubmitting, isSubmissionBlocked: !surface.canChat, providerStatus: surface.providerStatus, onRetryProviderStatus: surface.retryProviderStatus, ...(guided.title ? { title: guided.title } : {}), ...(guided.description ? { description: guided.description } : {}), ...(guided.skipLabel ? { skipLabel: guided.skipLabel } : {}), ...(guided.submitLabel ? { submitLabel: guided.submitLabel } : {}), className: "h-auto items-stretch justify-stretch bg-transparent" }) })) : null, suggestionBar, renderThreadSlot(surface.props.threadFooterSlot, threadId, surface.props.tabId)] }));
2072
2085
  }
2073
2086
  function renderThreadSlot(slot, threadId, tabId) {
2074
2087
  return typeof slot === "function"
@@ -2125,7 +2138,7 @@ class AgentKitComposerContextError extends Error {
2125
2138
  this.name = "AgentKitComposerContextError";
2126
2139
  }
2127
2140
  }
2128
- function AgentKitComposerSurface({ threadId, props, composerContext, canChat, setupMissing, providerStatus, retryProviderStatus, fileStorageConfigured, fileStorageMissing, retryFileStorageStatus, deferredSubmissionFailed, retryDeferredSubmission, dismissDeferredSubmission, isRunning, isRestoring, isSubmissionInFlight, hasRenderedMessages, threadRestore, suggestions, showSuggestions, setupBouncePulse, bounceSetupCard, contextItems, selectionLength, prefillRevision, text, onTextChange, onRemoveContextItem, onClearSelection, onBeforeSubmit, onSubmit, submitSuggestion, suggestionSubmitRef, onImplementPlan, }) {
2141
+ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, setupMissing, providerStatus, retryProviderStatus, fileStorageConfigured, fileStorageMissing, retryFileStorageStatus, deferredSubmissionFailed, retryDeferredSubmission, dismissDeferredSubmission, isRunning, isRestoring, isSubmissionInFlight, composerSubmissionPending, onComposerSubmissionPendingChange, isThinkingVisibleInTranscript, hasRenderedMessages, threadRestore, suggestions, showSuggestions, setupBouncePulse, bounceSetupCard, contextItems, selectionLength, prefillRevision, text, onTextChange, onRemoveContextItem, onClearSelection, onBeforeSubmit, onSubmit, submitSuggestion, suggestionSubmitRef, onImplementPlan, }) {
2129
2142
  const t = useT();
2130
2143
  const [composerError, setComposerError] = useState(null);
2131
2144
  const mounted = useRef(true);
@@ -2298,7 +2311,8 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2298
2311
  }) }), props.composerSlot, showHomeIntro ? (_jsx("div", { className: "agentkit-home-intro", children: props.homeIntroSlot })) : null, showHomeSuggestions ? (_jsx(AgentKitSuggestedPrompts, { suggestions: suggestions, disabled: !canChat ||
2299
2312
  props.composerDisabled ||
2300
2313
  props.composerSubmissionDisabled ||
2301
- isSubmissionInFlight, onSelect: submitSuggestion, className: "agentkit-home-suggestions" })) : null, showPlanCallout ? (_jsx(PlanModeCallout, { canImplementPlan: latestAssistantWasPlan, onImplementPlan: onImplementPlan, onSwitchToAct: () => props.onExecModeChange?.("build") })) : null, setupMissing && props.showMissingApiKeySetup !== false ? (_jsx(BuilderSetupCard, { fullWidth: true, attached: true, bouncePulse: setupBouncePulse, layout: props.missingApiKeySetupLayout ?? "default", onConnected: () => window.dispatchEvent(new Event("agent-engine:configured-changed")) })) : null, !canChat && !setupMissing && providerStatus !== "configured" ? (_jsx(GuidedQuestionProviderGate, { providerStatus: providerStatus, onRetry: retryProviderStatus })) : null, integration ? (_jsx(McpConnectionSuggestion, { text: text, variant: "composer", requestedByUser: true, integrationId: integration.id })) : null, selectionLength !== null && selectionLength > 0 ? (_jsx(AgentKitSelectionPill, { length: selectionLength, onClear: onClearSelection })) : null, _jsxs("div", { className: "relative", children: [_jsx(AgentKitComposer, { threadId: threadId, disabled: (!canChat && !providerSubmissionPending) ||
2314
+ isSubmissionInFlight ||
2315
+ composerSubmissionPending, onSelect: submitSuggestion, className: "agentkit-home-suggestions" })) : null, showPlanCallout ? (_jsx(PlanModeCallout, { canImplementPlan: latestAssistantWasPlan, onImplementPlan: onImplementPlan, onSwitchToAct: () => props.onExecModeChange?.("build") })) : null, setupMissing && props.showMissingApiKeySetup !== false ? (_jsx(BuilderSetupCard, { fullWidth: true, attached: true, bouncePulse: setupBouncePulse, layout: props.missingApiKeySetupLayout ?? "default", onConnected: () => window.dispatchEvent(new Event("agent-engine:configured-changed")) })) : null, !canChat && !setupMissing && providerStatus !== "configured" ? (_jsx(GuidedQuestionProviderGate, { providerStatus: providerStatus, onRetry: retryProviderStatus })) : null, integration ? (_jsx(McpConnectionSuggestion, { text: text, variant: "composer", requestedByUser: true, integrationId: integration.id })) : null, selectionLength !== null && selectionLength > 0 ? (_jsx(AgentKitSelectionPill, { length: selectionLength, onClear: onClearSelection })) : null, _jsxs("div", { className: "relative", children: [_jsx(AgentKitComposer, { threadId: threadId, disabled: (!canChat && !providerSubmissionPending) ||
2302
2316
  props.composerDisabled ||
2303
2317
  isRestoring, submissionDisabled: (!canChat && !providerSubmissionPending) ||
2304
2318
  props.composerSubmissionDisabled === true ||
@@ -2309,7 +2323,7 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2309
2323
  window.dispatchEvent(new CustomEvent("agent-chat:missing-api-key", {
2310
2324
  detail: { tabId: props.tabId, threadId },
2311
2325
  }));
2312
- }, initialText: text, initialTextKey: `${props.tabId ?? threadId}:${prefillRevision}`, requireAgentEngine: false, onTextChange: onTextChange, onBeforeSubmit: onBeforeSubmit, contextItems: visibleContextItems, contextMenuItems: composerContext?.menuItems, onRemoveContextItem: (key) => {
2326
+ }, initialText: text, initialTextKey: `${props.tabId ?? threadId}:${prefillRevision}`, requireAgentEngine: false, onTextChange: onTextChange, onBeforeSubmit: onBeforeSubmit, announcePendingSubmission: !isThinkingVisibleInTranscript, onSubmissionPendingChange: onComposerSubmissionPendingChange, contextItems: visibleContextItems, contextMenuItems: composerContext?.menuItems, onRemoveContextItem: (key) => {
2313
2327
  if (providerContextKeys.has(key))
2314
2328
  composerContext?.onRemoveContextItem(key);
2315
2329
  else
@@ -2335,7 +2349,8 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2335
2349
  }, "aria-label": t("agentChat.composer.stopResponse"), title: t("agentChat.composer.stopResponse"), "data-agent-composer-slot": "stop-button", className: "flex h-7 w-7 items-center justify-center rounded-full bg-primary text-primary-foreground", children: _jsx(IconPlayerStopFilled, { className: "h-3 w-3" }) })) : undefined }), deferredSubmissionFailed ? (_jsxs("div", { role: "alert", className: "mx-3 mb-1.5 flex shrink-0 items-center gap-2 rounded-md border border-border bg-muted/70 px-3 py-2 text-xs text-foreground shadow-sm", children: [_jsx(IconAlertTriangle, { className: "size-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 leading-snug", children: t("agentChat.recovery.deferredSubmissionFailed") }), _jsx("button", { type: "button", disabled: !canChat || isSubmissionInFlight, onClick: () => void retryDeferredSubmission().catch(() => undefined), className: "shrink-0 rounded px-2 py-1 font-medium hover:bg-accent disabled:opacity-60", children: t("agentChat.common.retry") }), _jsx("button", { type: "button", "aria-label": t("agentChat.common.dismissError"), onClick: () => void dismissDeferredSubmission().catch(() => undefined), className: "-mr-1 flex size-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(IconX, { className: "size-3.5" }) })] })) : null, composerError ? (_jsxs("div", { role: "alert", className: "mx-3 mb-1.5 flex shrink-0 items-start gap-2 rounded-md border border-border bg-muted/70 px-3 py-2 text-xs text-foreground shadow-sm", children: [_jsx(IconAlertTriangle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 leading-snug", children: composerError }), _jsx("button", { type: "button", "aria-label": t("agentChat.common.dismissError"), onClick: () => setComposerError(null), className: "-mr-1 -mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(IconX, { className: "h-3.5 w-3.5" }) })] })) : null, _jsx(ExternalAgentNudge, { variant: "prompt" })] }), showAfterComposerSuggestions ? (_jsx(AgentKitSuggestedPrompts, { suggestions: suggestions, disabled: !canChat ||
2336
2350
  props.composerDisabled ||
2337
2351
  props.composerSubmissionDisabled ||
2338
- isSubmissionInFlight, onSelect: submitSuggestion, className: "agentkit-home-suggestions" })) : null, showAfterComposerSlot ? (_jsx("div", { className: "agentkit-after-composer-slot", children: props.afterComposerSlot })) : null, composerContext?.dialogs] }));
2352
+ isSubmissionInFlight ||
2353
+ composerSubmissionPending, onSelect: submitSuggestion, className: "agentkit-home-suggestions" })) : null, showAfterComposerSlot ? (_jsx("div", { className: "agentkit-after-composer-slot", children: props.afterComposerSlot })) : null, composerContext?.dialogs] }));
2339
2354
  }
2340
2355
  function AgentKitSuggestedPrompts({ suggestions, disabled, onSelect, className, }) {
2341
2356
  const t = useT();
@@ -2404,12 +2419,14 @@ function AgentKitTool({ value, active }) {
2404
2419
  const surface = useAgentKitSurface();
2405
2420
  const metadata = value.metadata ?? {};
2406
2421
  const input = asRecord(value.input) ?? {};
2407
- const output = typeof value.output === "string"
2408
- ? value.output
2409
- : value.output === undefined
2410
- ? undefined
2411
- : JSON.stringify(value.output);
2412
- return (_jsx(ChatRunningContext.Provider, { value: active === true || value.status === "running", children: _jsx(SuppressInlineOpenAppContext.Provider, { value: surface.props.suppressInlineOpenApp === true, children: _jsx(ToolCallDisplay, { toolName: value.name, toolCallId: value.id, args: input, argsText: JSON.stringify(input), result: output, isRunning: value.status === "running", outcome: value.status === "failed" ? "unknown" : undefined, structuredMeta: metadata, mcpApp: asRecord(metadata.mcpApp), chatUI: asRecord(metadata.chatUI), activity: metadata.activity === true, isActiveTail: active === true }) }) }));
2422
+ const output = value.status === "failed" && value.error?.message
2423
+ ? value.error.message
2424
+ : typeof value.output === "string"
2425
+ ? value.output
2426
+ : value.output === undefined
2427
+ ? undefined
2428
+ : JSON.stringify(value.output);
2429
+ return (_jsx(ChatRunningContext.Provider, { value: active === true || value.status === "running", children: _jsx(SuppressInlineOpenAppContext.Provider, { value: surface.props.suppressInlineOpenApp === true, children: _jsx(ToolCallDisplay, { toolName: value.name, toolCallId: value.id, args: input, argsText: JSON.stringify(input), result: output, isError: value.status === "failed", isRunning: value.status === "running", structuredMeta: metadata, mcpApp: asRecord(metadata.mcpApp), chatUI: asRecord(metadata.chatUI), activity: metadata.activity === true, isActiveTail: active === true }) }) }));
2413
2430
  }
2414
2431
  function AgentKitApproval({ value, runId, }) {
2415
2432
  const surface = useAgentKitSurface();