@agent-native/toolkit 0.201.1 → 0.202.0-nightly-20261006033736

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 (229) hide show
  1. package/agent-native.eject.json +39 -12
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +292 -23
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/context.d.ts +5 -0
  6. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/context.js +5 -0
  8. package/dist/app/agentkit/react/context.js.map +1 -1
  9. package/dist/app/agentkit/react/styles.css +78 -3
  10. package/dist/app/auth/AuthPage.d.ts.map +1 -1
  11. package/dist/app/auth/AuthPage.js +7 -14
  12. package/dist/app/auth/AuthPage.js.map +1 -1
  13. package/dist/app/auth/server.d.ts +6 -0
  14. package/dist/app/auth/server.d.ts.map +1 -0
  15. package/dist/app/auth/server.js +19 -0
  16. package/dist/app/auth/server.js.map +1 -0
  17. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  18. package/dist/app/chat/AgentKitAssistantChat.js +164 -83
  19. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  20. package/dist/app/chat/AgentSidebar.d.ts +2 -1
  21. package/dist/app/chat/AgentSidebar.d.ts.map +1 -1
  22. package/dist/app/chat/AgentSidebar.js +2 -2
  23. package/dist/app/chat/AgentSidebar.js.map +1 -1
  24. package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
  25. package/dist/app/chat/agentkit-chat/guided-questions.js +13 -3
  26. package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
  27. package/dist/app/chat/chat/surface-types.d.ts +2 -0
  28. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  29. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  30. package/dist/app/i18n/catalogs/ar-SA.js +41 -0
  31. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  32. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  33. package/dist/app/i18n/catalogs/de-DE.js +41 -0
  34. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  35. package/dist/app/i18n/catalogs/en-US.d.ts +41 -0
  36. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  37. package/dist/app/i18n/catalogs/en-US.js +41 -0
  38. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  39. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  40. package/dist/app/i18n/catalogs/es-ES.js +41 -0
  41. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  42. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  43. package/dist/app/i18n/catalogs/fr-FR.js +41 -0
  44. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  45. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  46. package/dist/app/i18n/catalogs/hi-IN.js +41 -0
  47. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  48. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  49. package/dist/app/i18n/catalogs/ja-JP.js +41 -0
  50. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  51. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  52. package/dist/app/i18n/catalogs/ko-KR.js +41 -0
  53. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  54. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  55. package/dist/app/i18n/catalogs/pt-BR.js +41 -0
  56. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  57. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  58. package/dist/app/i18n/catalogs/zh-CN.js +41 -0
  59. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  60. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  61. package/dist/app/i18n/catalogs/zh-TW.js +41 -0
  62. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  63. package/dist/app/shared/StarfieldBackground.d.ts +1 -6
  64. package/dist/app/shared/StarfieldBackground.d.ts.map +1 -1
  65. package/dist/app/shared/StarfieldBackground.js +1 -368
  66. package/dist/app/shared/StarfieldBackground.js.map +1 -1
  67. package/dist/app/shared/WaveBackground.d.ts +5 -0
  68. package/dist/app/shared/WaveBackground.d.ts.map +1 -0
  69. package/dist/app/shared/WaveBackground.js +34 -0
  70. package/dist/app/shared/WaveBackground.js.map +1 -0
  71. package/dist/app/shared/WebGlWaveBackground.d.ts +9 -0
  72. package/dist/app/shared/WebGlWaveBackground.d.ts.map +1 -0
  73. package/dist/app/shared/WebGlWaveBackground.js +433 -0
  74. package/dist/app/shared/WebGlWaveBackground.js.map +1 -0
  75. package/dist/app/shared/index.d.ts +1 -0
  76. package/dist/app/shared/index.d.ts.map +1 -1
  77. package/dist/app/shared/index.js +1 -0
  78. package/dist/app/shared/index.js.map +1 -1
  79. package/dist/app/shared/ocean/bloom-blur.wgsl +43 -0
  80. package/dist/app/shared/ocean/bloom-blur.wgsl.js +1 -0
  81. package/dist/app/shared/ocean/bloom-bright.wgsl +21 -0
  82. package/dist/app/shared/ocean/bloom-bright.wgsl.js +1 -0
  83. package/dist/app/shared/ocean/bloom-composite.wgsl +40 -0
  84. package/dist/app/shared/ocean/bloom-composite.wgsl.js +1 -0
  85. package/dist/app/shared/ocean/brand-colors.d.ts +9 -0
  86. package/dist/app/shared/ocean/brand-colors.d.ts.map +1 -0
  87. package/dist/app/shared/ocean/brand-colors.js +45 -0
  88. package/dist/app/shared/ocean/brand-colors.js.map +1 -0
  89. package/dist/app/shared/ocean/camera.d.ts +5 -0
  90. package/dist/app/shared/ocean/camera.d.ts.map +1 -0
  91. package/dist/app/shared/ocean/camera.js +24 -0
  92. package/dist/app/shared/ocean/camera.js.map +1 -0
  93. package/dist/app/shared/ocean/hero-ocean-background.d.ts +8 -0
  94. package/dist/app/shared/ocean/hero-ocean-background.d.ts.map +1 -0
  95. package/dist/app/shared/ocean/hero-ocean-background.js +186 -0
  96. package/dist/app/shared/ocean/hero-ocean-background.js.map +1 -0
  97. package/dist/app/shared/ocean/ifft-stage.wgsl +36 -0
  98. package/dist/app/shared/ocean/ifft-stage.wgsl.js +1 -0
  99. package/dist/app/shared/ocean/initial-spectrum.wgsl +36 -0
  100. package/dist/app/shared/ocean/initial-spectrum.wgsl.js +1 -0
  101. package/dist/app/shared/ocean/noise.wgsl +24 -0
  102. package/dist/app/shared/ocean/noise.wgsl.js +1 -0
  103. package/dist/app/shared/ocean/normal-foam.wgsl +32 -0
  104. package/dist/app/shared/ocean/normal-foam.wgsl.js +1 -0
  105. package/dist/app/shared/ocean/ocean-colors.d.ts +6 -0
  106. package/dist/app/shared/ocean/ocean-colors.d.ts.map +1 -0
  107. package/dist/app/shared/ocean/ocean-colors.js +6 -0
  108. package/dist/app/shared/ocean/ocean-colors.js.map +1 -0
  109. package/dist/app/shared/ocean/ocean-common.wgsl +15 -0
  110. package/dist/app/shared/ocean/ocean-common.wgsl.js +1 -0
  111. package/dist/app/shared/ocean/ocean-graph.d.ts +12 -0
  112. package/dist/app/shared/ocean/ocean-graph.d.ts.map +1 -0
  113. package/dist/app/shared/ocean/ocean-graph.js +16 -0
  114. package/dist/app/shared/ocean/ocean-graph.js.map +1 -0
  115. package/dist/app/shared/ocean/particles.wgsl +139 -0
  116. package/dist/app/shared/ocean/particles.wgsl.js +1 -0
  117. package/dist/app/shared/ocean/present.wgsl +40 -0
  118. package/dist/app/shared/ocean/present.wgsl.js +1 -0
  119. package/dist/app/shared/ocean/renderer.d.ts +66 -0
  120. package/dist/app/shared/ocean/renderer.d.ts.map +1 -0
  121. package/dist/app/shared/ocean/renderer.js +535 -0
  122. package/dist/app/shared/ocean/renderer.js.map +1 -0
  123. package/dist/app/shared/ocean/spectrum.wgsl +35 -0
  124. package/dist/app/shared/ocean/spectrum.wgsl.js +1 -0
  125. package/dist/app/shared/ocean/tuning.d.ts +48 -0
  126. package/dist/app/shared/ocean/tuning.d.ts.map +1 -0
  127. package/dist/app/shared/ocean/tuning.js +74 -0
  128. package/dist/app/shared/ocean/tuning.js.map +1 -0
  129. package/dist/app/shared/ocean/webgpu-support.d.ts +3 -0
  130. package/dist/app/shared/ocean/webgpu-support.d.ts.map +1 -0
  131. package/dist/app/shared/ocean/webgpu-support.js +13 -0
  132. package/dist/app/shared/ocean/webgpu-support.js.map +1 -0
  133. package/dist/app/sharing/AccessRequestApprovalPage.d.ts +23 -0
  134. package/dist/app/sharing/AccessRequestApprovalPage.d.ts.map +1 -0
  135. package/dist/app/sharing/AccessRequestApprovalPage.js +95 -0
  136. package/dist/app/sharing/AccessRequestApprovalPage.js.map +1 -0
  137. package/dist/app/sharing/AccessRequestsSection.d.ts +5 -0
  138. package/dist/app/sharing/AccessRequestsSection.d.ts.map +1 -0
  139. package/dist/app/sharing/AccessRequestsSection.js +47 -0
  140. package/dist/app/sharing/AccessRequestsSection.js.map +1 -0
  141. package/dist/app/sharing/ResourceAccessScreen.d.ts +53 -0
  142. package/dist/app/sharing/ResourceAccessScreen.d.ts.map +1 -0
  143. package/dist/app/sharing/ResourceAccessScreen.js +132 -0
  144. package/dist/app/sharing/ResourceAccessScreen.js.map +1 -0
  145. package/dist/app/sharing/ShareButton.d.ts.map +1 -1
  146. package/dist/app/sharing/ShareButton.js +4 -2
  147. package/dist/app/sharing/ShareButton.js.map +1 -1
  148. package/dist/app/sharing/ShareDialog.d.ts.map +1 -1
  149. package/dist/app/sharing/ShareDialog.js +7 -5
  150. package/dist/app/sharing/ShareDialog.js.map +1 -1
  151. package/dist/app/sharing/index.d.ts +2 -0
  152. package/dist/app/sharing/index.d.ts.map +1 -1
  153. package/dist/app/sharing/index.js +2 -0
  154. package/dist/app/sharing/index.js.map +1 -1
  155. package/dist/app/styles/agent-native.css +21 -1
  156. package/dist/app/styles/tokens/agent-kit.css +3 -1
  157. package/dist/composer/AgentSuggestionBar.d.ts +1 -1
  158. package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
  159. package/dist/composer/AgentSuggestionBar.js +75 -6
  160. package/dist/composer/AgentSuggestionBar.js.map +1 -1
  161. package/package.json +14 -4
  162. package/src/app/agentkit/react/components.tsx +492 -60
  163. package/src/app/agentkit/react/context.tsx +10 -0
  164. package/src/app/agentkit/react/lifecycle.spec.tsx +487 -1
  165. package/src/app/agentkit/react/styles.css +78 -3
  166. package/src/app/auth/AuthPage.spec.tsx +11 -7
  167. package/src/app/auth/AuthPage.tsx +16 -35
  168. package/src/app/auth/server.spec.ts +68 -0
  169. package/src/app/auth/server.ts +29 -0
  170. package/src/app/chat/AgentKitAssistantChat.spec.tsx +287 -290
  171. package/src/app/chat/AgentKitAssistantChat.tsx +219 -116
  172. package/src/app/chat/AgentSidebar.tsx +3 -0
  173. package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +85 -0
  174. package/src/app/chat/agentkit-chat/guided-questions.tsx +12 -5
  175. package/src/app/chat/chat/surface-types.ts +2 -0
  176. package/src/app/i18n/catalogs/ar-SA.ts +44 -0
  177. package/src/app/i18n/catalogs/de-DE.ts +55 -0
  178. package/src/app/i18n/catalogs/en-US.ts +46 -0
  179. package/src/app/i18n/catalogs/es-ES.ts +53 -0
  180. package/src/app/i18n/catalogs/fr-FR.ts +53 -0
  181. package/src/app/i18n/catalogs/hi-IN.ts +47 -0
  182. package/src/app/i18n/catalogs/ja-JP.ts +54 -0
  183. package/src/app/i18n/catalogs/ko-KR.ts +50 -0
  184. package/src/app/i18n/catalogs/pt-BR.ts +52 -0
  185. package/src/app/i18n/catalogs/zh-CN.ts +42 -0
  186. package/src/app/i18n/catalogs/zh-TW.ts +43 -0
  187. package/src/app/shared/StarfieldBackground.tsx +4 -423
  188. package/src/app/shared/WaveBackground.spec.tsx +104 -0
  189. package/src/app/shared/WaveBackground.tsx +60 -0
  190. package/src/app/shared/WebGlWaveBackground.spec.tsx +106 -0
  191. package/src/app/shared/WebGlWaveBackground.tsx +499 -0
  192. package/src/app/shared/index.ts +1 -0
  193. package/src/app/shared/ocean/bloom-blur.wgsl +43 -0
  194. package/src/app/shared/ocean/bloom-bright.wgsl +21 -0
  195. package/src/app/shared/ocean/bloom-composite.wgsl +40 -0
  196. package/src/app/shared/ocean/brand-colors.ts +49 -0
  197. package/src/app/shared/ocean/camera.ts +28 -0
  198. package/src/app/shared/ocean/hero-ocean-background.spec.tsx +369 -0
  199. package/src/app/shared/ocean/hero-ocean-background.tsx +238 -0
  200. package/src/app/shared/ocean/ifft-stage.wgsl +36 -0
  201. package/src/app/shared/ocean/initial-spectrum.wgsl +36 -0
  202. package/src/app/shared/ocean/noise.wgsl +24 -0
  203. package/src/app/shared/ocean/normal-foam.wgsl +32 -0
  204. package/src/app/shared/ocean/ocean-colors.ts +11 -0
  205. package/src/app/shared/ocean/ocean-common.wgsl +15 -0
  206. package/src/app/shared/ocean/ocean-graph.ts +29 -0
  207. package/src/app/shared/ocean/particles.wgsl +139 -0
  208. package/src/app/shared/ocean/present.wgsl +40 -0
  209. package/src/app/shared/ocean/renderer.spec.ts +100 -0
  210. package/src/app/shared/ocean/renderer.ts +693 -0
  211. package/src/app/shared/ocean/spectrum.wgsl +35 -0
  212. package/src/app/shared/ocean/tuning.ts +131 -0
  213. package/src/app/shared/ocean/webgpu-support.ts +12 -0
  214. package/src/app/sharing/AccessRequestApprovalPage.spec.tsx +276 -0
  215. package/src/app/sharing/AccessRequestApprovalPage.tsx +307 -0
  216. package/src/app/sharing/AccessRequestsSection.tsx +163 -0
  217. package/src/app/sharing/ResourceAccessScreen.spec.tsx +235 -0
  218. package/src/app/sharing/ResourceAccessScreen.tsx +331 -0
  219. package/src/app/sharing/ShareButton.spec.tsx +171 -5
  220. package/src/app/sharing/ShareButton.tsx +15 -2
  221. package/src/app/sharing/ShareDialog.spec.tsx +71 -2
  222. package/src/app/sharing/ShareDialog.tsx +24 -2
  223. package/src/app/sharing/index.ts +2 -0
  224. package/src/app/styles/agent-native.css +21 -1
  225. package/src/app/styles/agent-native.spec.ts +16 -3
  226. package/src/app/styles/tokens/agent-kit.css +3 -1
  227. package/src/composer/AgentSuggestionBar.overflow.spec.tsx +277 -0
  228. package/src/composer/AgentSuggestionBar.tsx +113 -8
  229. package/src/wgsl-env.d.ts +6 -0
@@ -8,7 +8,7 @@ import { createAgentNativeChatRuntime } from "@agent-native/core/client/agent-ch
8
8
  import { useAgentDynamicSuggestionsResult } from "@agent-native/core/client/agent-chat";
9
9
  import { formatChatErrorText, localizeKnownChatErrorText, } from "@agent-native/core/client/agent-chat";
10
10
  import { dispatchAgentChatRunning } from "@agent-native/core/client/agent-chat";
11
- import { useAgentEngineConfigured, } from "@agent-native/core/client/agent-chat";
11
+ import { fetchAgentEngineConfiguredState, useAgentEngineConfigured, } from "@agent-native/core/client/agent-chat";
12
12
  import { agentNativePath } from "@agent-native/core/client/api-path";
13
13
  import { compareAndSetClientAppState, deleteClientAppState, isClientAppStateMutationPending, readClientAppState, } from "@agent-native/core/client/application-state";
14
14
  import { signOut } from "@agent-native/core/client/hooks";
@@ -24,7 +24,7 @@ import { writeClipboardText } from "@agent-native/toolkit/clipboard";
24
24
  import { AgentSuggestionBar, agentSuggestionPrompt, snapshotComposerContextItems, } from "@agent-native/toolkit/composer";
25
25
  import { appendRealtimeVoiceTranscriptToRepository, realtimeVoiceTranscriptRegistry, } from "@agent-native/toolkit/composer/realtime-voice-transcript";
26
26
  import { cn } from "@agent-native/toolkit/utils";
27
- import { IconAlertTriangle, IconMessage, IconPlayerStopFilled, IconQuote, IconRefresh, IconX, } from "@tabler/icons-react";
27
+ import { IconAlertTriangle, IconLoader2, IconMessage, IconPlayerStopFilled, IconQuote, IconRefresh, IconX, } from "@tabler/icons-react";
28
28
  import React, { createContext, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from "react";
29
29
  import { AgentKitChat, AgentKitComposer, AgentApprovalPrompt, AgentMessageView, useAgentKit, useAgentKitControl, useAgentThread, } from "../agentkit/react/index.js";
30
30
  import { AgentKitRoot } from "../agentkit/react/root.js";
@@ -333,6 +333,11 @@ export const AgentKitAssistantChat = forwardRef(function AgentKitAssistantChat(p
333
333
  },
334
334
  agents: t("agentChat.activity.agents"),
335
335
  tasks: t("agentChat.activity.tasks"),
336
+ toolInput: t("agentChat.tool.input"),
337
+ toolResult: t("agentChat.tool.result"),
338
+ activityValueIdentifierHidden: t("agentChat.tool.identifierHidden"),
339
+ activityValueOmitted: t("agentChat.tool.contentOmitted"),
340
+ activityValueCircular: t("agentChat.tool.circularReference"),
336
341
  working: t("agentChat.status.working"),
337
342
  workingFor: t("agentChat.status.workingFor", {
338
343
  duration: "{{duration}}",
@@ -656,23 +661,50 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
656
661
  tabId: props.tabId,
657
662
  threadId,
658
663
  });
664
+ const [submissionReadiness, setSubmissionReadiness] = useState(null);
665
+ const readinessRequestIdRef = useRef(0);
666
+ const providerReadinessRequestRef = useRef(null);
667
+ const latestResolvedReadinessRef = useRef(null);
668
+ const passiveReadinessRef = useRef(readiness.state);
669
+ const providerReadinessPassRef = useRef(null);
670
+ const latestSubmissionReadinessRef = useRef(readiness.state);
671
+ useEffect(() => {
672
+ if (passiveReadinessRef.current !== readiness.state) {
673
+ const explicitReadinessPassed = providerReadinessPassRef.current === readinessRequestIdRef.current &&
674
+ latestResolvedReadinessRef.current?.requestId ===
675
+ readinessRequestIdRef.current &&
676
+ latestResolvedReadinessRef.current.state === "configured";
677
+ if (readiness.state === "unavailable" && explicitReadinessPassed) {
678
+ return;
679
+ }
680
+ passiveReadinessRef.current = readiness.state;
681
+ readinessRequestIdRef.current += 1;
682
+ providerReadinessRequestRef.current = null;
683
+ providerReadinessPassRef.current = null;
684
+ latestSubmissionReadinessRef.current = readiness.state;
685
+ setSubmissionReadiness(null);
686
+ return;
687
+ }
688
+ if (submissionReadiness === readiness.state) {
689
+ latestSubmissionReadinessRef.current = readiness.state;
690
+ setSubmissionReadiness(null);
691
+ }
692
+ }, [readiness.state, submissionReadiness]);
659
693
  const modelCatalogPending = props.showModelSelector !== false && props.modelListLoading === true;
660
694
  const modelListUnavailable = props.showModelSelector !== false && props.modelListError === true;
661
- const canChat = !providerChecksEnabled || readiness.canChat;
662
- const setupMissing = providerChecksEnabled &&
663
- readiness.missing &&
664
- !modelCatalogPending &&
665
- !modelListUnavailable;
666
- const providerStatus = modelListUnavailable
667
- ? "unavailable"
668
- : modelCatalogPending
669
- ? "unknown"
670
- : providerChecksEnabled
671
- ? readiness.state
672
- : "configured";
673
- const providerSubmissionPending = !canChat &&
674
- !setupMissing &&
675
- (providerStatus === "unknown" || providerStatus === "unavailable");
695
+ const effectiveReadiness = submissionReadiness ?? readiness.state;
696
+ const canChat = !providerChecksEnabled || effectiveReadiness === "configured";
697
+ const setupMissing = providerChecksEnabled && effectiveReadiness === "missing";
698
+ const providerStatus = setupMissing
699
+ ? "missing"
700
+ : modelListUnavailable
701
+ ? "unavailable"
702
+ : modelCatalogPending
703
+ ? "unknown"
704
+ : providerChecksEnabled
705
+ ? effectiveReadiness
706
+ : "configured";
707
+ const composerPreflightRunActiveRef = useRef(null);
676
708
  const retryProviderStatus = useCallback(() => {
677
709
  window.dispatchEvent(new Event("agent-engine:configured-changed"));
678
710
  }, []);
@@ -812,6 +844,12 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
812
844
  if (setupMissing)
813
845
  setSetupBouncePulse((pulse) => pulse + 1);
814
846
  }, [setupMissing]);
847
+ const reportMissingProvider = useCallback(() => {
848
+ bounceSetupCard();
849
+ window.dispatchEvent(new CustomEvent("agent-chat:missing-api-key", {
850
+ detail: { tabId: props.tabId, threadId },
851
+ }));
852
+ }, [bounceSetupCard, props.tabId, threadId]);
815
853
  const lastCustomRunningStateRef = useRef(null);
816
854
  useEffect(() => {
817
855
  const isCustomTransport = typeof props.createTransport === "function";
@@ -1197,19 +1235,70 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1197
1235
  const interval = window.setInterval(() => saveSnapshotRef.current(), 5000);
1198
1236
  return () => window.clearInterval(interval);
1199
1237
  }, [isRunning]);
1200
- const acquireSubmission = useCallback(async () => {
1238
+ const refreshProviderReadiness = useCallback(async () => {
1239
+ if (!providerChecksEnabled)
1240
+ return "configured";
1241
+ let request = providerReadinessRequestRef.current;
1242
+ if (!request || request.requestId !== readinessRequestIdRef.current) {
1243
+ const requestId = ++readinessRequestIdRef.current;
1244
+ providerReadinessPassRef.current = null;
1245
+ request = {
1246
+ requestId,
1247
+ promise: fetchAgentEngineConfiguredState(true, { fresh: true }),
1248
+ };
1249
+ providerReadinessRequestRef.current = request;
1250
+ }
1251
+ let currentRequest = request;
1252
+ while (true) {
1253
+ const nextReadiness = await currentRequest.promise;
1254
+ if (currentRequest.requestId === readinessRequestIdRef.current) {
1255
+ if (providerReadinessRequestRef.current === currentRequest) {
1256
+ providerReadinessRequestRef.current = null;
1257
+ }
1258
+ latestResolvedReadinessRef.current = {
1259
+ requestId: currentRequest.requestId,
1260
+ state: nextReadiness,
1261
+ };
1262
+ latestSubmissionReadinessRef.current = nextReadiness;
1263
+ setSubmissionReadiness(nextReadiness);
1264
+ return nextReadiness;
1265
+ }
1266
+ const latestRequest = providerReadinessRequestRef.current;
1267
+ if (latestRequest &&
1268
+ latestRequest.requestId === readinessRequestIdRef.current &&
1269
+ latestRequest.requestId > currentRequest.requestId) {
1270
+ currentRequest = latestRequest;
1271
+ continue;
1272
+ }
1273
+ const latestResolved = latestResolvedReadinessRef.current;
1274
+ if (latestResolved?.requestId === readinessRequestIdRef.current) {
1275
+ return latestResolved.state;
1276
+ }
1277
+ return latestSubmissionReadinessRef.current;
1278
+ }
1279
+ }, [providerChecksEnabled]);
1280
+ const acquireSubmission = useCallback(async (useReadinessPass = false) => {
1281
+ const readinessPass = providerReadinessPassRef.current;
1282
+ const hasReadinessPass = useReadinessPass &&
1283
+ readinessPass !== null &&
1284
+ readinessPass === readinessRequestIdRef.current &&
1285
+ latestResolvedReadinessRef.current?.requestId === readinessPass &&
1286
+ latestResolvedReadinessRef.current.state === "configured";
1287
+ if (useReadinessPass)
1288
+ providerReadinessPassRef.current = null;
1201
1289
  if (isRestoring ||
1202
1290
  props.composerDisabled ||
1203
1291
  props.composerSubmissionDisabled)
1204
1292
  return null;
1205
- if (!canChat) {
1206
- if (setupMissing) {
1207
- bounceSetupCard();
1208
- window.dispatchEvent(new CustomEvent("agent-chat:missing-api-key", {
1209
- detail: { tabId: props.tabId, threadId },
1210
- }));
1293
+ if (providerChecksEnabled) {
1294
+ const currentReadiness = hasReadinessPass
1295
+ ? "configured"
1296
+ : await refreshProviderReadiness();
1297
+ if (currentReadiness !== "configured") {
1298
+ if (currentReadiness === "missing")
1299
+ reportMissingProvider();
1300
+ return null;
1211
1301
  }
1212
- return null;
1213
1302
  }
1214
1303
  if (history) {
1215
1304
  const release = await history.beginSubmission();
@@ -1219,41 +1308,55 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1219
1308
  }
1220
1309
  return () => undefined;
1221
1310
  }, [
1222
- bounceSetupCard,
1223
- canChat,
1224
1311
  history,
1225
1312
  isRestoring,
1226
1313
  props.composerDisabled,
1227
1314
  props.composerSubmissionDisabled,
1228
- props.tabId,
1229
- setupMissing,
1230
- threadId,
1315
+ providerChecksEnabled,
1316
+ refreshProviderReadiness,
1317
+ reportMissingProvider,
1231
1318
  ]);
1232
1319
  const beforeSubmit = useCallback(async () => {
1320
+ providerReadinessPassRef.current = null;
1321
+ composerPreflightRunActiveRef.current = null;
1233
1322
  if (isRestoring ||
1234
1323
  props.composerDisabled ||
1235
1324
  props.composerSubmissionDisabled)
1236
1325
  return false;
1237
- if (!canChat) {
1238
- if (setupMissing) {
1239
- bounceSetupCard();
1240
- window.dispatchEvent(new CustomEvent("agent-chat:missing-api-key", {
1241
- detail: { tabId: props.tabId, threadId },
1242
- }));
1243
- }
1244
- return providerSubmissionPending;
1326
+ const runWasActive = isThreadRunning();
1327
+ if (!providerChecksEnabled) {
1328
+ composerPreflightRunActiveRef.current = runWasActive;
1329
+ return true;
1330
+ }
1331
+ let currentReadiness = await refreshProviderReadiness();
1332
+ let resolvedReadiness = latestResolvedReadinessRef.current;
1333
+ while (currentReadiness === "configured" &&
1334
+ (!resolvedReadiness ||
1335
+ resolvedReadiness.requestId !== readinessRequestIdRef.current ||
1336
+ resolvedReadiness.state !== "configured")) {
1337
+ currentReadiness = await refreshProviderReadiness();
1338
+ resolvedReadiness = latestResolvedReadinessRef.current;
1339
+ }
1340
+ if (currentReadiness !== "configured") {
1341
+ if (currentReadiness === "missing")
1342
+ reportMissingProvider();
1343
+ return false;
1245
1344
  }
1345
+ if (!resolvedReadiness ||
1346
+ resolvedReadiness.requestId !== readinessRequestIdRef.current) {
1347
+ return false;
1348
+ }
1349
+ composerPreflightRunActiveRef.current = runWasActive;
1350
+ providerReadinessPassRef.current = resolvedReadiness.requestId;
1246
1351
  return true;
1247
1352
  }, [
1248
- bounceSetupCard,
1249
- canChat,
1250
1353
  isRestoring,
1251
1354
  props.composerDisabled,
1252
1355
  props.composerSubmissionDisabled,
1253
- props.tabId,
1254
- providerSubmissionPending,
1255
- setupMissing,
1256
- threadId,
1356
+ providerChecksEnabled,
1357
+ isThreadRunning,
1358
+ refreshProviderReadiness,
1359
+ reportMissingProvider,
1257
1360
  ]);
1258
1361
  const dispatch = useCallback(async (text, files, references, composerOptions, options = {}) => {
1259
1362
  const selectionHydration = pendingSelectionHydrationRef.current;
@@ -1414,11 +1517,7 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1414
1517
  const submittedComposerOptions = captureQueuedRunState(composerOptions, isThreadRunning());
1415
1518
  const release = await acquireSubmission();
1416
1519
  if (!release) {
1417
- if (!setupMissing &&
1418
- (isRestoring ||
1419
- (providerChecksEnabled &&
1420
- (readiness.state === "unknown" ||
1421
- readiness.state === "unavailable")))) {
1520
+ if (isRestoring) {
1422
1521
  try {
1423
1522
  const selectionHydration = pendingSelectionHydrationRef.current;
1424
1523
  await selectionHydration?.promise;
@@ -1494,7 +1593,7 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1494
1593
  throw error;
1495
1594
  }
1496
1595
  }
1497
- const reason = setupMissing
1596
+ const reason = setupMissing || latestSubmissionReadinessRef.current === "missing"
1498
1597
  ? "engine-not-configured"
1499
1598
  : "submission-unavailable";
1500
1599
  reportAgentChatSubmitResult(options.submitMessageId, false, reason);
@@ -1527,37 +1626,18 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1527
1626
  isRestoring,
1528
1627
  isThreadRunning,
1529
1628
  props.tabId,
1530
- providerChecksEnabled,
1531
- readiness.state,
1532
1629
  setupMissing,
1533
1630
  t,
1534
1631
  threadId,
1535
1632
  ]);
1536
1633
  const submitPrepared = useCallback(async (text, files, references, composerOptions, prepare) => {
1537
- const runWasActiveAtSubmit = isThreadRunning();
1538
- const release = await acquireSubmission();
1539
- if (!release) {
1540
- if (providerSubmissionPending &&
1541
- !props.composerDisabled &&
1542
- !props.composerSubmissionDisabled) {
1543
- try {
1544
- const preparedOptions = prepare ? await prepare() : composerOptions;
1545
- const submittedOptions = captureQueuedRunState(preserveQueuedIntent(preparedOptions, composerOptions), runWasActiveAtSubmit);
1546
- const result = await submit(text, files, references, submittedOptions);
1547
- if (result.status === "rejected") {
1548
- throw new Error(t("agentChat.recovery.deferredSubmissionFailed"));
1549
- }
1550
- }
1551
- catch (error) {
1552
- dispatchSetupRequiredEvent(error, props.tabId, threadId);
1553
- throw error;
1554
- }
1555
- }
1556
- else {
1557
- throw new Error(t("agentChat.recovery.deferredSubmissionFailed"));
1558
- }
1559
- return;
1560
- }
1634
+ const runWasActiveAtSubmit = providerReadinessPassRef.current
1635
+ ? (composerPreflightRunActiveRef.current ?? isThreadRunning())
1636
+ : isThreadRunning();
1637
+ composerPreflightRunActiveRef.current = null;
1638
+ const release = await acquireSubmission(true);
1639
+ if (!release)
1640
+ throw new Error(t("agentChat.recovery.deferredSubmissionFailed"));
1561
1641
  try {
1562
1642
  const preparedOptions = prepare ? await prepare() : composerOptions;
1563
1643
  await dispatch(text, files, references, captureQueuedRunState(preserveQueuedIntent(preparedOptions, composerOptions), runWasActiveAtSubmit));
@@ -1576,8 +1656,6 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1576
1656
  props.composerDisabled,
1577
1657
  props.composerSubmissionDisabled,
1578
1658
  props.tabId,
1579
- providerSubmissionPending,
1580
- submit,
1581
1659
  t,
1582
1660
  threadId,
1583
1661
  ]);
@@ -2045,7 +2123,8 @@ function AgentKitTranscript({ children, threadId }) {
2045
2123
  ? []
2046
2124
  : getAgentKitThreadHandoffMessages(thread, surface.handoffSnapshot);
2047
2125
  const guided = useGuidedQuestionFlow({
2048
- enabled: surface.props.isActiveComposer !== false,
2126
+ enabled: surface.props.isActiveComposer !== false &&
2127
+ surface.props.showGuidedQuestions !== false,
2049
2128
  stateKey: "guided-questions",
2050
2129
  queryKey: ["guided-questions", "agentkit"],
2051
2130
  browserTabId: surface.props.browserTabId,
@@ -2117,7 +2196,8 @@ function AgentKitTranscript({ children, threadId }) {
2117
2196
  }
2118
2197
  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
2119
2198
  ? t("agentChat.message.threadNotFound")
2120
- : 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: "agentkit-activities agentkit-activities-summary-content", role: "status", "aria-live": "polite", children: _jsx("span", { className: "agentkit-activities-current", "data-running": "true", "data-agentkit-current-activity": "true", children: _jsx("span", { className: "agentkit-activities-current-label agent-running-shimmer", 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, modelListUnavailable: surface.modelListUnavailable, onRetryProviderStatus: surface.modelListUnavailable
2199
+ : 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: "agentkit-activities agentkit-activities-summary-content", role: "status", "aria-live": "polite", children: _jsx("span", { className: "agentkit-activities-current", "data-running": "true", "data-agentkit-current-activity": "true", children: _jsx("span", { className: "agentkit-activities-current-label agent-running-shimmer", children: t("agentChat.status.thinking") }) }) })) : null, surface.props.showGuidedQuestions !== false &&
2200
+ 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, modelListUnavailable: surface.modelListUnavailable, onRetryProviderStatus: surface.modelListUnavailable
2121
2201
  ? surface.retryModelList
2122
2202
  : 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)] }));
2123
2203
  }
@@ -2350,8 +2430,9 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2350
2430
  props.composerDisabled ||
2351
2431
  props.composerSubmissionDisabled ||
2352
2432
  isSubmissionInFlight ||
2353
- 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, modelListUnavailable ||
2354
- (!canChat && !setupMissing && providerStatus !== "configured") ? (_jsx(GuidedQuestionProviderGate, { providerStatus: providerStatus, modelListUnavailable: modelListUnavailable, onRetry: modelListUnavailable ? retryModelList : 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) ||
2433
+ 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, !setupMissing &&
2434
+ (modelListUnavailable ||
2435
+ (!canChat && providerStatus !== "configured")) ? (_jsx(GuidedQuestionProviderGate, { providerStatus: providerStatus, modelListUnavailable: modelListUnavailable, onRetry: modelListUnavailable ? retryModelList : 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) ||
2355
2436
  props.composerDisabled ||
2356
2437
  isRestoring, submissionDisabled: (!canChat && !providerSubmissionPending) ||
2357
2438
  props.composerSubmissionDisabled === true ||
@@ -2375,7 +2456,7 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2375
2456
  isRunning,
2376
2457
  thread,
2377
2458
  t,
2378
- }), onConnectProvider: props.onConnectProvider, onConnectLocalRuntime: props.onConnectLocalRuntime, imageModelMenu: props.imageModelMenu, voiceEnabled: true, toolbarSlot: _jsxs(_Fragment, { children: [props.selectedEngine === CHATGPT_SUBSCRIPTION_ENGINE_NAME ? (_jsxs("span", { className: "inline-flex items-center gap-2 text-[11px] text-muted-foreground", children: [_jsx("span", { children: t("agentChat.composer.chatgptPlanUsing") }), _jsx("a", { href: "https://chatgpt.com/settings/usage", target: "_blank", rel: "noreferrer", className: "font-medium text-foreground underline-offset-2 hover:underline", children: t("agentChat.composer.chatgptManageUsage") })] })) : null, props.composerToolbarSlot] }), extraActionButton: props.composerExtraActionButton, includeDefaultSlashCommands: true, includeDefaultSlashSkills: true, onSlashCommand: props.onSlashCommand, modelStatusChecksEnabled: props.showModelSelector !== false &&
2459
+ }), onConnectProvider: props.onConnectProvider, onConnectLocalRuntime: props.onConnectLocalRuntime, imageModelMenu: props.imageModelMenu, voiceEnabled: true, toolbarSlot: _jsxs(_Fragment, { children: [props.selectedEngine === CHATGPT_SUBSCRIPTION_ENGINE_NAME ? (_jsxs("span", { className: "inline-flex items-center gap-2 text-[11px] text-muted-foreground", children: [_jsx("span", { children: t("agentChat.composer.chatgptPlanUsing") }), _jsx("a", { href: "https://chatgpt.com/settings/usage", target: "_blank", rel: "noreferrer", className: "font-medium text-foreground underline-offset-2 hover:underline", children: t("agentChat.composer.chatgptManageUsage") })] })) : null, props.composerToolbarSlot] }), extraActionButton: _jsxs(_Fragment, { children: [props.composerExtraActionButton, composerSubmissionPending ? (_jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs text-muted-foreground", role: "status", "aria-live": "polite", "aria-label": t("agentChat.common.waiting"), "data-testid": "provider-preflight-pending", children: [_jsx(IconLoader2, { className: "size-3.5 animate-spin motion-reduce:animate-none" }), _jsx("span", { children: t("agentChat.common.waiting") })] })) : null] }), includeDefaultSlashCommands: true, includeDefaultSlashSkills: true, onSlashCommand: props.onSlashCommand, modelStatusChecksEnabled: props.showModelSelector !== false &&
2379
2460
  props.availableModels === undefined, attachmentsEnabled: fileStorageConfigured, onAttachmentRequest: requestFileStorage, contextButtonTooltipDisabled: fileStoragePromptOpen, onAttachmentError: setComposerError, onSubmit: submitComposer, composerRef: composerRef, stopButton: isRunning ? (_jsx("button", { type: "button", onClick: () => {
2380
2461
  setComposerError(null);
2381
2462
  void (async () => {