@agent-native/toolkit 0.198.8 → 0.199.0-nightly-20261001064935

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 (130) hide show
  1. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  2. package/dist/app/agentkit/react/components.js +142 -56
  3. package/dist/app/agentkit/react/components.js.map +1 -1
  4. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  5. package/dist/app/chat/AgentKitAssistantChat.js +34 -27
  6. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  7. package/dist/app/chat/AgentPanel.d.ts +2 -1
  8. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  9. package/dist/app/chat/AgentPanel.js +7 -4
  10. package/dist/app/chat/AgentPanel.js.map +1 -1
  11. package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
  12. package/dist/app/chat/MultiTabAssistantChat.js +21 -4
  13. package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
  14. package/dist/app/chat/chat/run-recovery.d.ts +2 -1
  15. package/dist/app/chat/chat/run-recovery.d.ts.map +1 -1
  16. package/dist/app/chat/chat/run-recovery.js +13 -9
  17. package/dist/app/chat/chat/run-recovery.js.map +1 -1
  18. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  19. package/dist/app/i18n/catalogs/ar-SA.js +24 -2
  20. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  21. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  22. package/dist/app/i18n/catalogs/de-DE.js +24 -2
  23. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  24. package/dist/app/i18n/catalogs/en-US.d.ts +24 -2
  25. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  26. package/dist/app/i18n/catalogs/en-US.js +24 -2
  27. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  28. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  29. package/dist/app/i18n/catalogs/es-ES.js +24 -2
  30. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  31. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  32. package/dist/app/i18n/catalogs/fr-FR.js +24 -2
  33. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  34. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  35. package/dist/app/i18n/catalogs/hi-IN.js +24 -2
  36. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  37. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  38. package/dist/app/i18n/catalogs/ja-JP.js +24 -2
  39. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  40. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  41. package/dist/app/i18n/catalogs/ko-KR.js +24 -2
  42. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  43. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  44. package/dist/app/i18n/catalogs/pt-BR.js +24 -2
  45. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  46. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  47. package/dist/app/i18n/catalogs/zh-CN.js +24 -2
  48. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  49. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  50. package/dist/app/i18n/catalogs/zh-TW.js +24 -2
  51. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  52. package/dist/app/labs/LabsSettings.d.ts.map +1 -1
  53. package/dist/app/labs/LabsSettings.js +10 -2
  54. package/dist/app/labs/LabsSettings.js.map +1 -1
  55. package/dist/app/org/OrgSwitcher.d.ts.map +1 -1
  56. package/dist/app/org/OrgSwitcher.js +51 -9
  57. package/dist/app/org/OrgSwitcher.js.map +1 -1
  58. package/dist/app/settings/SettingsPanel.d.ts.map +1 -1
  59. package/dist/app/settings/SettingsPanel.js +4 -145
  60. package/dist/app/settings/SettingsPanel.js.map +1 -1
  61. package/dist/app/settings/SettingsTabsPage.d.ts.map +1 -1
  62. package/dist/app/settings/SettingsTabsPage.js +27 -16
  63. package/dist/app/settings/SettingsTabsPage.js.map +1 -1
  64. package/dist/app/settings/model/ChatGPTSubscriptionRow.d.ts +24 -2
  65. package/dist/app/settings/model/ChatGPTSubscriptionRow.d.ts.map +1 -1
  66. package/dist/app/settings/model/ChatGPTSubscriptionRow.js +97 -26
  67. package/dist/app/settings/model/ChatGPTSubscriptionRow.js.map +1 -1
  68. package/dist/app/settings/model/ModelSettingsPage.d.ts.map +1 -1
  69. package/dist/app/settings/model/ModelSettingsPage.js +73 -22
  70. package/dist/app/settings/model/ModelSettingsPage.js.map +1 -1
  71. package/dist/app/settings/model/model-page-state.d.ts +12 -2
  72. package/dist/app/settings/model/model-page-state.d.ts.map +1 -1
  73. package/dist/app/settings/model/model-page-state.js +14 -1
  74. package/dist/app/settings/model/model-page-state.js.map +1 -1
  75. package/dist/app/settings/shell/bridge.d.ts +1 -1
  76. package/dist/app/settings/shell/bridge.d.ts.map +1 -1
  77. package/dist/app/settings/shell/bridge.js +1 -4
  78. package/dist/app/settings/shell/bridge.js.map +1 -1
  79. package/dist/app/settings/usage/UsagePage.d.ts.map +1 -1
  80. package/dist/app/settings/usage/UsagePage.js +3 -2
  81. package/dist/app/settings/usage/UsagePage.js.map +1 -1
  82. package/dist/composer/TiptapComposer.d.ts +1 -0
  83. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  84. package/dist/composer/TiptapComposer.js +10 -4
  85. package/dist/composer/TiptapComposer.js.map +1 -1
  86. package/dist/composer/runtime-adapters.d.ts +1 -0
  87. package/dist/composer/runtime-adapters.d.ts.map +1 -1
  88. package/dist/composer/runtime-adapters.js.map +1 -1
  89. package/package.json +4 -4
  90. package/src/app/agentkit/react/components.tsx +295 -98
  91. package/src/app/agentkit/react/lifecycle.spec.tsx +758 -17
  92. package/src/app/chat/AgentKitAssistantChat.spec.tsx +116 -7
  93. package/src/app/chat/AgentKitAssistantChat.tsx +100 -45
  94. package/src/app/chat/AgentPanel.header.spec.ts +9 -0
  95. package/src/app/chat/AgentPanel.tsx +10 -1
  96. package/src/app/chat/MultiTabAssistantChat.spec.tsx +115 -1
  97. package/src/app/chat/MultiTabAssistantChat.tsx +24 -4
  98. package/src/app/chat/chat/run-recovery.spec.tsx +31 -0
  99. package/src/app/chat/chat/run-recovery.tsx +22 -5
  100. package/src/app/i18n/catalogs/ar-SA.ts +31 -2
  101. package/src/app/i18n/catalogs/de-DE.ts +33 -2
  102. package/src/app/i18n/catalogs/en-US.ts +33 -2
  103. package/src/app/i18n/catalogs/es-ES.ts +34 -2
  104. package/src/app/i18n/catalogs/fr-FR.ts +33 -2
  105. package/src/app/i18n/catalogs/hi-IN.ts +34 -2
  106. package/src/app/i18n/catalogs/ja-JP.ts +31 -2
  107. package/src/app/i18n/catalogs/ko-KR.ts +31 -2
  108. package/src/app/i18n/catalogs/pt-BR.ts +33 -2
  109. package/src/app/i18n/catalogs/zh-CN.ts +32 -2
  110. package/src/app/i18n/catalogs/zh-TW.ts +32 -2
  111. package/src/app/labs/LabsSettings.tsx +13 -3
  112. package/src/app/org/OrgSwitcher.spec.tsx +75 -0
  113. package/src/app/org/OrgSwitcher.tsx +104 -34
  114. package/src/app/settings/SettingsPanel.connections.spec.tsx +25 -5
  115. package/src/app/settings/SettingsPanel.tsx +3 -286
  116. package/src/app/settings/SettingsTabsPage.spec.tsx +110 -17
  117. package/src/app/settings/SettingsTabsPage.tsx +36 -20
  118. package/src/app/settings/model/ChatGPTSubscriptionRow.tsx +316 -60
  119. package/src/app/settings/model/ModelSettingsPage.spec.tsx +599 -20
  120. package/src/app/settings/model/ModelSettingsPage.tsx +114 -25
  121. package/src/app/settings/model/model-page-state.spec.ts +46 -0
  122. package/src/app/settings/model/model-page-state.ts +27 -2
  123. package/src/app/settings/shell/bridge.spec.ts +3 -13
  124. package/src/app/settings/shell/bridge.ts +2 -5
  125. package/src/app/settings/shell/pages/app-group-pages.spec.tsx +50 -2
  126. package/src/app/settings/usage/UsagePage.spec.tsx +25 -1
  127. package/src/app/settings/usage/UsagePage.tsx +21 -1
  128. package/src/composer/PromptComposer.context.spec.tsx +22 -3
  129. package/src/composer/TiptapComposer.tsx +13 -4
  130. package/src/composer/runtime-adapters.tsx +1 -0
@@ -1,5 +1,6 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { hasActiveAgentRuns, selectAgentSuggestions, isCurrentAgentSuggestion, } from "@agent-native/agentkit";
3
+ import { CHATGPT_SUBSCRIPTION_ENGINE_NAME } from "@agent-native/core/agent/chatgpt-subscription-contract";
3
4
  import { appendAgentChatContextToMessage, filterAgentChatContextItems, formatAgentChatContextItemsForPrompt, getAgentChatContextState, normalizeAgentChatContextItem, publishAgentChatContextItems, reportAgentChatSubmitResult, refreshAgentChatContext, subscribeAgentChatContext, } from "@agent-native/core/client/agent-chat";
4
5
  import { AGENT_NATIVE_PROTOCOL_METADATA_KEY } from "@agent-native/core/client/agent-chat";
5
6
  import { readAssistantChatComposerDraft, writeAssistantChatComposerDraft, } from "@agent-native/core/client/agent-chat";
@@ -1395,14 +1396,16 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1395
1396
  const currentPendingSelection = pendingSelectionRef.current;
1396
1397
  const selectionRevision = selectionRevisionRef.current;
1397
1398
  const attachments = options.attachments ?? [];
1398
- const needsFileStorage = files.length > 0 ||
1399
- attachments.some((attachment) => !attachment.displayOnly && !attachment.url);
1399
+ const needsFileStorage = !options.deferredFileParts &&
1400
+ (files.length > 0 ||
1401
+ attachments.some((attachment) => !attachment.displayOnly && !attachment.url));
1400
1402
  if (needsFileStorage && !fileStorageConfigured) {
1401
1403
  throw new Error(t("onboarding.fileStorage.title"));
1402
1404
  }
1403
1405
  // Persist only URLs or opaque file handles; application_state is
1404
1406
  // not a file store and must never receive attachment bodies.
1405
- const fileParts = await uploadAgentChatAttachments(control, attachments, files);
1407
+ const fileParts = options.deferredFileParts ??
1408
+ (await uploadAgentChatAttachments(control, attachments, files));
1406
1409
  const selectionChangedDuringUpload = selectionRevision !== selectionRevisionRef.current;
1407
1410
  const context = options.recoveryAction
1408
1411
  ? ""
@@ -1737,17 +1740,18 @@ const AgentKitAssistantChatBody = forwardRef(function AgentKitAssistantChatBody(
1737
1740
  })),
1738
1741
  ],
1739
1742
  }), [isThreadRunning, submit]);
1740
- const sendRecoveryMessage = useCallback(async (text, recoveryAction, images, attachments, references, recoveryOptions) => {
1743
+ const sendRecoveryMessage = useCallback(async (text, recoveryAction, images, fileParts, references, recoveryOptions) => {
1741
1744
  return submit(text, [], [], { intent: isThreadRunning() ? "queued" : "immediate" }, {
1742
1745
  hideUserMessage: true,
1743
1746
  recoveryAction,
1744
1747
  recoveryReferences: references,
1745
1748
  ...recoveryOptions,
1746
- attachments: [
1747
- ...(attachments ?? []),
1749
+ deferredFileParts: [
1750
+ ...(fileParts ?? []),
1748
1751
  ...(images ?? []).map((url) => ({
1749
- type: "image",
1752
+ type: "file",
1750
1753
  name: "image",
1754
+ mediaType: "image",
1751
1755
  url,
1752
1756
  })),
1753
1757
  ],
@@ -2081,7 +2085,7 @@ function AgentKitTranscript({ children, threadId }) {
2081
2085
  }
2082
2086
  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
2083
2087
  ? t("agentChat.message.threadNotFound")
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)] }));
2088
+ : 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, 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)] }));
2085
2089
  }
2086
2090
  function renderThreadSlot(slot, threadId, tabId) {
2087
2091
  return typeof slot === "function"
@@ -2328,7 +2332,7 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2328
2332
  composerContext?.onRemoveContextItem(key);
2329
2333
  else
2330
2334
  onRemoveContextItem(key);
2331
- }, onRetryContextItem: composerContext?.onRetryContextItem, onInspectContextItem: composerContext?.onInspectContextItem, interceptBuildRequestsForBuilder: isInBuilderFrame(), selectedModel: props.selectedModel ?? props.defaultModel, selectedEngine: props.selectedEngine, selectedEffort: props.selectedEffort, availableModels: props.availableModels, modelListLoading: props.modelListLoading, onModelChange: props.onModelChange, onEffortChange: props.onEffortChange, availableAgents: props.availableAgents, selectedAgent: props.selectedAgent, agentOnly: props.hostedHarness, onAgentChange: props.onAgentChange, showModelSelector: props.showModelSelector, mode: props.execMode === "plan" ? "plan" : "act", planModeDisabled: props.planModeDisabled, planModeDisabledReason: props.planModeDisabledReason, onModeChange: (mode) => props.onExecModeChange?.(mode === "plan" ? "plan" : "build"), layoutVariant: props.composerLayoutVariant, plusMenuMode: props.plusMenuMode, placeholder: composerPlaceholder({
2335
+ }, onRetryContextItem: composerContext?.onRetryContextItem, interceptBuildRequestsForBuilder: isInBuilderFrame(), selectedModel: props.selectedModel ?? props.defaultModel, selectedEngine: props.selectedEngine, selectedEffort: props.selectedEffort, availableModels: props.availableModels, modelListLoading: props.modelListLoading, onModelChange: props.onModelChange, onEffortChange: props.onEffortChange, availableAgents: props.availableAgents, selectedAgent: props.selectedAgent, agentOnly: props.hostedHarness, onAgentChange: props.onAgentChange, showModelSelector: props.showModelSelector, mode: props.execMode === "plan" ? "plan" : "act", planModeDisabled: props.planModeDisabled, planModeDisabledReason: props.planModeDisabledReason, onModeChange: (mode) => props.onExecModeChange?.(mode === "plan" ? "plan" : "build"), layoutVariant: props.composerLayoutVariant, plusMenuMode: props.plusMenuMode, placeholder: composerPlaceholder({
2332
2336
  props,
2333
2337
  canChat,
2334
2338
  providerStatus,
@@ -2336,7 +2340,7 @@ function AgentKitComposerSurface({ threadId, props, composerContext, canChat, se
2336
2340
  isRunning,
2337
2341
  thread,
2338
2342
  t,
2339
- }), onConnectProvider: props.onConnectProvider, onConnectLocalRuntime: props.onConnectLocalRuntime, imageModelMenu: props.imageModelMenu, voiceEnabled: true, toolbarSlot: props.composerToolbarSlot, extraActionButton: props.composerExtraActionButton, includeDefaultSlashCommands: true, includeDefaultSlashSkills: true, onSlashCommand: props.onSlashCommand, modelStatusChecksEnabled: props.showModelSelector !== false &&
2343
+ }), 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 &&
2340
2344
  props.availableModels === undefined, attachmentsEnabled: fileStorageConfigured, onAttachmentRequest: requestFileStorage, contextButtonTooltipDisabled: fileStoragePromptOpen, onAttachmentError: setComposerError, onSubmit: submitComposer, composerRef: composerRef, stopButton: isRunning ? (_jsx("button", { type: "button", onClick: () => {
2341
2345
  setComposerError(null);
2342
2346
  void (async () => {
@@ -2419,13 +2423,19 @@ function AgentKitTool({ value, active }) {
2419
2423
  const surface = useAgentKitSurface();
2420
2424
  const metadata = value.metadata ?? {};
2421
2425
  const input = asRecord(value.input) ?? {};
2422
- const output = value.status === "failed" && value.error?.message
2423
- ? value.error.message
2424
- : typeof value.output === "string"
2426
+ const errorOutput = value.status === "failed"
2427
+ ? Array.from(new Set([
2428
+ value.error?.message?.trim(),
2429
+ formatErrorDetails(value.error?.details),
2430
+ formatErrorDetails(value.output),
2431
+ ].filter((detail) => Boolean(detail?.trim())))).join("\n\n") || undefined
2432
+ : undefined;
2433
+ const output = errorOutput ??
2434
+ (typeof value.output === "string"
2425
2435
  ? value.output
2426
2436
  : value.output === undefined
2427
2437
  ? undefined
2428
- : JSON.stringify(value.output);
2438
+ : JSON.stringify(value.output));
2429
2439
  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 }) }) }));
2430
2440
  }
2431
2441
  function AgentKitApproval({ value, runId, }) {
@@ -2560,28 +2570,20 @@ function AgentKitRunFailure({ error, runId, threadId, }) {
2560
2570
  const value = retryMetadata?.[key] ?? retryCustomMetadata?.[key];
2561
2571
  return typeof value === "string" && value.trim() ? value : undefined;
2562
2572
  };
2563
- const retryAttachments = lastUserMessage?.parts.flatMap((part) => part.type === "file"
2564
- ? [
2565
- {
2566
- type: "file",
2567
- name: part.name,
2568
- ...(part.mediaType ? { contentType: part.mediaType } : {}),
2569
- ...(part.url ? { url: part.url } : {}),
2570
- },
2571
- ]
2572
- : []) ?? [];
2573
+ const retryFileParts = lastUserMessage?.parts.filter((part) => part.type === "file") ?? [];
2574
+ const retryHasUnavailableAttachment = retryFileParts.some((part) => !part.url && !part.fileId);
2573
2575
  const retryReferences = Array.isArray(retryMetadata?.references)
2574
2576
  ? retryMetadata.references
2575
2577
  : [];
2576
2578
  const retryRequestMode = metadataString("requestMode");
2577
- return (_jsx(RunErrorRecoveryCard, { info: info, onContinue: () => void surface.sendRecoveryMessage(RECOVERY_CONTINUE_PROMPT, "continue"), onRetry: () => void surface.sendRecoveryMessage(retryText || "Please retry the last request.", "retry", undefined, retryAttachments, retryReferences, {
2579
+ return (_jsx(RunErrorRecoveryCard, { info: info, onContinue: () => void surface.sendRecoveryMessage(RECOVERY_CONTINUE_PROMPT, "continue"), onRetry: () => void surface.sendRecoveryMessage(retryText || "Please retry the last request.", "retry", undefined, retryFileParts, retryReferences, {
2578
2580
  recoveryModel: metadataString("model"),
2579
2581
  recoveryEngine: metadataString("engine"),
2580
2582
  recoveryEffort: metadataString("effort"),
2581
2583
  ...(retryRequestMode === "plan" || retryRequestMode === "act"
2582
2584
  ? { recoveryRequestMode: retryRequestMode }
2583
2585
  : {}),
2584
- }), onFork: async () => {
2586
+ }), retryHasUnavailableAttachment: retryHasUnavailableAttachment, onFork: async () => {
2585
2587
  if (!lastUserMessage)
2586
2588
  return surface.props.onForkChat?.();
2587
2589
  const fork = await control.fork(lastUserMessage.id);
@@ -2591,7 +2593,12 @@ function AgentKitRunFailure({ error, runId, threadId, }) {
2591
2593
  }
2592
2594
  function AgentKitConnectionError({ error, threadId, recover, recovering, recoveryError, }) {
2593
2595
  const t = useT();
2594
- return (_jsxs("div", { className: "rounded-md border border-border px-3 py-2 text-xs text-muted-foreground", "data-error-code": error.code, "data-thread-id": threadId, role: "alert", children: [_jsx("strong", { className: "mr-2 font-medium text-foreground", children: t("agentChat.error.failed") }), _jsx("span", { children: formatAgentKitErrorText(error, t) }), error.retryable ? (_jsx("button", { type: "button", disabled: recovering, onClick: () => void recover().catch(() => undefined), className: "ml-3 rounded px-2 py-1 hover:bg-accent hover:text-foreground disabled:opacity-60", children: recovering
2596
+ const surface = useAgentKitSurface();
2597
+ const chatGPTPlanUsageError = surface.props.selectedEngine === CHATGPT_SUBSCRIPTION_ENGINE_NAME &&
2598
+ `${error.code} ${error.message}`.match(/subscription_sharing_usage_limit_(exceeded|unavailable)/)?.[1];
2599
+ return (_jsxs("div", { className: "rounded-md border border-border px-3 py-2 text-xs text-muted-foreground", "data-error-code": error.code, "data-thread-id": threadId, role: "alert", children: [_jsx("strong", { className: "mr-2 font-medium text-foreground", children: t("agentChat.error.failed") }), chatGPTPlanUsageError ? (_jsxs(_Fragment, { children: [_jsx("span", { children: t(chatGPTPlanUsageError === "exceeded"
2600
+ ? "agentChat.error.chatgptPlanUsageLimit"
2601
+ : "agentChat.error.chatgptPlanUsageUnavailable") }), _jsx("a", { href: "https://chatgpt.com/settings/usage", target: "_blank", rel: "noreferrer", className: "ml-3 font-medium text-foreground underline-offset-2 hover:underline", children: t("agentChat.composer.chatgptManageUsage") })] })) : (_jsx("span", { children: formatAgentKitErrorText(error, t) })), error.retryable ? (_jsx("button", { type: "button", disabled: recovering, onClick: () => void recover().catch(() => undefined), className: "ml-3 rounded px-2 py-1 hover:bg-accent hover:text-foreground disabled:opacity-60", children: recovering
2595
2602
  ? t("agentChat.common.loading")
2596
2603
  : t("agentChat.agentPanel.chatgptSubscriptionReconnect") })) : null, recoveryError ? (_jsx("span", { className: "mt-2 block", role: "alert", children: formatAgentKitErrorText({ code: "runtime_error", message: recoveryError.message }, t) })) : null] }));
2597
2604
  }