@agent-native/core 0.19.3 → 0.20.1

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 (144) hide show
  1. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  2. package/dist/agent/engine/builder-engine.js +12 -1
  3. package/dist/agent/engine/builder-engine.js.map +1 -1
  4. package/dist/agent/production-agent.d.ts.map +1 -1
  5. package/dist/agent/production-agent.js +5 -0
  6. package/dist/agent/production-agent.js.map +1 -1
  7. package/dist/agent/thread-data-builder.d.ts +17 -0
  8. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  9. package/dist/agent/thread-data-builder.js +210 -0
  10. package/dist/agent/thread-data-builder.js.map +1 -1
  11. package/dist/cli/code-agent-executor.d.ts +2 -0
  12. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  13. package/dist/cli/code-agent-executor.js +39 -1
  14. package/dist/cli/code-agent-executor.js.map +1 -1
  15. package/dist/cli/code-agent-runs.d.ts +3 -0
  16. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  17. package/dist/cli/code-agent-runs.js +3 -0
  18. package/dist/cli/code-agent-runs.js.map +1 -1
  19. package/dist/client/AgentPanel.d.ts.map +1 -1
  20. package/dist/client/AgentPanel.js +8 -3
  21. package/dist/client/AgentPanel.js.map +1 -1
  22. package/dist/client/AssistantChat.d.ts +58 -0
  23. package/dist/client/AssistantChat.d.ts.map +1 -1
  24. package/dist/client/AssistantChat.js +122 -50
  25. package/dist/client/AssistantChat.js.map +1 -1
  26. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  27. package/dist/client/agent-chat-adapter.js +172 -13
  28. package/dist/client/agent-chat-adapter.js.map +1 -1
  29. package/dist/client/agent-sidebar-state.d.ts +2 -0
  30. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  31. package/dist/client/agent-sidebar-state.js +32 -0
  32. package/dist/client/agent-sidebar-state.js.map +1 -1
  33. package/dist/client/code-agent-chat-adapter.d.ts +81 -0
  34. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -0
  35. package/dist/client/code-agent-chat-adapter.js +297 -0
  36. package/dist/client/code-agent-chat-adapter.js.map +1 -0
  37. package/dist/client/composer/PromptComposer.d.ts +11 -0
  38. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  39. package/dist/client/composer/PromptComposer.js +7 -3
  40. package/dist/client/composer/PromptComposer.js.map +1 -1
  41. package/dist/client/composer/TiptapComposer.d.ts +12 -1
  42. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  43. package/dist/client/composer/TiptapComposer.js +16 -7
  44. package/dist/client/composer/TiptapComposer.js.map +1 -1
  45. package/dist/client/composer/index.d.ts +1 -0
  46. package/dist/client/composer/index.d.ts.map +1 -1
  47. package/dist/client/composer/index.js +1 -0
  48. package/dist/client/composer/index.js.map +1 -1
  49. package/dist/client/composer/prompt-attachments.d.ts +11 -0
  50. package/dist/client/composer/prompt-attachments.d.ts.map +1 -0
  51. package/dist/client/composer/prompt-attachments.js +45 -0
  52. package/dist/client/composer/prompt-attachments.js.map +1 -0
  53. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  54. package/dist/client/conversation/AgentConversation.js +124 -1
  55. package/dist/client/conversation/AgentConversation.js.map +1 -1
  56. package/dist/client/conversation/code-agent-transcript.d.ts +25 -0
  57. package/dist/client/conversation/code-agent-transcript.d.ts.map +1 -0
  58. package/dist/client/conversation/code-agent-transcript.js +200 -0
  59. package/dist/client/conversation/code-agent-transcript.js.map +1 -0
  60. package/dist/client/conversation/index.d.ts +2 -1
  61. package/dist/client/conversation/index.d.ts.map +1 -1
  62. package/dist/client/conversation/index.js +1 -0
  63. package/dist/client/conversation/index.js.map +1 -1
  64. package/dist/client/conversation/types.d.ts +8 -0
  65. package/dist/client/conversation/types.d.ts.map +1 -1
  66. package/dist/client/conversation/types.js.map +1 -1
  67. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  68. package/dist/client/conversation/use-near-bottom-autoscroll.js +26 -9
  69. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  70. package/dist/client/index.d.ts +5 -2
  71. package/dist/client/index.d.ts.map +1 -1
  72. package/dist/client/index.js +5 -2
  73. package/dist/client/index.js.map +1 -1
  74. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  75. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  76. package/dist/client/settings/useBuilderStatus.js +21 -3
  77. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  78. package/dist/client/settings/useBuilderStatus.spec.js +16 -2
  79. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
  80. package/dist/client/sse-event-processor.d.ts.map +1 -1
  81. package/dist/client/sse-event-processor.js +3 -0
  82. package/dist/client/sse-event-processor.js.map +1 -1
  83. package/dist/client/use-chat-models.d.ts +6 -1
  84. package/dist/client/use-chat-models.d.ts.map +1 -1
  85. package/dist/client/use-chat-models.js +7 -3
  86. package/dist/client/use-chat-models.js.map +1 -1
  87. package/dist/client/use-chat-models.spec.d.ts +2 -0
  88. package/dist/client/use-chat-models.spec.d.ts.map +1 -0
  89. package/dist/client/use-chat-models.spec.js +39 -0
  90. package/dist/client/use-chat-models.spec.js.map +1 -0
  91. package/dist/code-agents/background-controller.d.ts.map +1 -1
  92. package/dist/code-agents/background-controller.js +16 -0
  93. package/dist/code-agents/background-controller.js.map +1 -1
  94. package/dist/code-agents/index.d.ts +2 -0
  95. package/dist/code-agents/index.d.ts.map +1 -1
  96. package/dist/code-agents/index.js +2 -0
  97. package/dist/code-agents/index.js.map +1 -1
  98. package/dist/code-agents/prompt-attachments.d.ts +11 -0
  99. package/dist/code-agents/prompt-attachments.d.ts.map +1 -0
  100. package/dist/code-agents/prompt-attachments.js +23 -0
  101. package/dist/code-agents/prompt-attachments.js.map +1 -0
  102. package/dist/code-agents/transcript-normalizer.js +14 -5
  103. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  104. package/dist/code-agents/transcript-order.d.ts +16 -0
  105. package/dist/code-agents/transcript-order.d.ts.map +1 -0
  106. package/dist/code-agents/transcript-order.js +47 -0
  107. package/dist/code-agents/transcript-order.js.map +1 -0
  108. package/dist/db/client.d.ts.map +1 -1
  109. package/dist/db/client.js +1 -0
  110. package/dist/db/client.js.map +1 -1
  111. package/dist/extensions/routes.d.ts.map +1 -1
  112. package/dist/extensions/routes.js +18 -14
  113. package/dist/extensions/routes.js.map +1 -1
  114. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  115. package/dist/integrations/pending-tasks-retry-job.js +11 -1
  116. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  117. package/dist/integrations/plugin.d.ts.map +1 -1
  118. package/dist/integrations/plugin.js +6 -1
  119. package/dist/integrations/plugin.js.map +1 -1
  120. package/dist/mcp/build-server.d.ts.map +1 -1
  121. package/dist/mcp/build-server.js +6 -2
  122. package/dist/mcp/build-server.js.map +1 -1
  123. package/dist/secrets/substitution.d.ts +18 -0
  124. package/dist/secrets/substitution.d.ts.map +1 -1
  125. package/dist/secrets/substitution.js +74 -0
  126. package/dist/secrets/substitution.js.map +1 -1
  127. package/dist/server/deep-link.d.ts +0 -18
  128. package/dist/server/deep-link.d.ts.map +1 -1
  129. package/dist/server/deep-link.js +2 -1
  130. package/dist/server/deep-link.js.map +1 -1
  131. package/dist/server/open-route.d.ts.map +1 -1
  132. package/dist/server/open-route.js +23 -4
  133. package/dist/server/open-route.js.map +1 -1
  134. package/dist/shared/agent-sidebar-url.d.ts +6 -0
  135. package/dist/shared/agent-sidebar-url.d.ts.map +1 -0
  136. package/dist/shared/agent-sidebar-url.js +37 -0
  137. package/dist/shared/agent-sidebar-url.js.map +1 -0
  138. package/dist/shared/index.d.ts +1 -0
  139. package/dist/shared/index.d.ts.map +1 -1
  140. package/dist/shared/index.js +1 -0
  141. package/dist/shared/index.js.map +1 -1
  142. package/dist/styles/agent-conversation.css +403 -0
  143. package/dist/styles/agent-native.css +2 -0
  144. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import type { ChatModelAdapter, ExportedMessageRepository } from "@assistant-ui/react";
2
3
  import { type AgentDynamicSuggestionsOption } from "./dynamic-suggestions.js";
3
4
  import type { ReasoningEffort } from "../shared/reasoning-effort.js";
4
5
  import type { ChatThreadScope, ChatThreadSnapshot } from "./use-chat-threads.js";
@@ -38,6 +39,27 @@ export interface AssistantChatHandle {
38
39
  /** Export the currently visible client-side thread for operations like fork. */
39
40
  exportThreadSnapshot(): ChatThreadSnapshot | null;
40
41
  }
42
+ export interface AssistantChatAdapterContext {
43
+ apiUrl: string;
44
+ tabId?: string;
45
+ threadId?: string;
46
+ modelRef: {
47
+ current: string | undefined;
48
+ };
49
+ engineRef: {
50
+ current: string | undefined;
51
+ };
52
+ effortRef: {
53
+ current: ReasoningEffort | undefined;
54
+ };
55
+ execModeRef: {
56
+ current: "build" | "plan" | undefined;
57
+ };
58
+ browserTabId?: string;
59
+ scopeRef: {
60
+ current: ChatThreadScope | null | undefined;
61
+ };
62
+ }
41
63
  export interface AssistantChatProps {
42
64
  /** API endpoint URL. Default: "/_agent-native/agent-chat" */
43
65
  apiUrl?: string;
@@ -78,6 +100,12 @@ export interface AssistantChatProps {
78
100
  onGenerateTitle?: (threadId: string, message: string) => void;
79
101
  /** Optional content rendered just above the composer input */
80
102
  composerSlot?: React.ReactNode;
103
+ /** Class applied to the shared composer area for host-specific sizing/skin. */
104
+ composerAreaClassName?: string;
105
+ /** Optional content rendered inside the composer toolbar after the attach button. */
106
+ composerToolbarSlot?: React.ReactNode;
107
+ /** Optional action rendered beside the voice/send controls. */
108
+ composerExtraActionButton?: React.ReactNode;
81
109
  /** Disable the composer for capability-gated surfaces while still showing history. */
82
110
  composerDisabled?: boolean;
83
111
  /** Placeholder to show while the composer is disabled by the host surface. */
@@ -115,6 +143,36 @@ export interface AssistantChatProps {
115
143
  onEffortChange?: (effort: ReasoningEffort) => void;
116
144
  /** Callback when user clicks "Fork Chat" in the message actions menu */
117
145
  onForkChat?: () => void | boolean | Promise<void | boolean>;
146
+ /** Override Builder/provider connect routing for embedded hosts. */
147
+ onConnectProvider?: () => void;
148
+ /**
149
+ * Controls the shared composer + menu. Sidebar keeps the full menu by default;
150
+ * hosts without the sidebar provider stack can use upload-only.
151
+ */
152
+ plusMenuMode?: "full" | "upload-only" | "hidden";
153
+ /**
154
+ * Enable framework provider/env status checks. Embedded hosts that provide
155
+ * model/provider state through another transport can disable these probes.
156
+ */
157
+ providerStatusChecksEnabled?: boolean;
158
+ /**
159
+ * Advanced host override for non-HTTP transports. Defaults to the production
160
+ * sidebar SSE adapter when omitted.
161
+ */
162
+ createAdapter?: (context: AssistantChatAdapterContext) => ChatModelAdapter;
163
+ /**
164
+ * Explicitly recreate an injected adapter when the host transport identity
165
+ * changes. Omit for the production sidebar so parent rerenders do not reset
166
+ * active chats.
167
+ */
168
+ adapterReloadKey?: unknown;
169
+ /**
170
+ * Advanced host override for thread replay. Defaults to SQL thread fetch when
171
+ * `threadId` is set, or sessionStorage for legacy tab chats.
172
+ */
173
+ loadHistoryRepository?: () => Promise<ExportedMessageRepository | null>;
174
+ /** Re-run `loadHistoryRepository` when the host's external transcript changes. */
175
+ historyReloadKey?: string | number | null;
118
176
  }
119
177
  export declare const CHAT_STORAGE_PREFIX = "agent-chat:";
120
178
  /** Remove persisted chat for a given tabId (or "default"). */
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -289,7 +289,7 @@ const markdownStyles = `
289
289
  .agent-tool-code .agent-markdown-shiki pre span { background: transparent; }
290
290
  .agent-tool-code pre { margin: 0; min-width: max-content; padding: 0.75rem; background: transparent; color: inherit; }
291
291
  .agent-tool-code mark { border-radius: 0.1875rem; background: rgba(245, 158, 11, 0.25); color: inherit; }
292
- .agent-markdown hr { border: none; border-top: 1px solid hsl(var(--border, 0 0% 20%)); margin: 0.75em 0; }
292
+ .agent-markdown hr { border: none; border-top: 1px solid hsl(var(--border, 0 0% 20%)); margin: 0.75em 0 1em; }
293
293
  .agent-markdown a { text-decoration: underline; text-underline-offset: 2px; }
294
294
  .agent-markdown a.agent-markdown-cta { text-decoration: none; }
295
295
  .agent-markdown blockquote { border-left: 2px solid hsl(var(--border, 0 0% 20%)); padding-left: 0.75em; margin: 0.5em 0; opacity: 0.8; }
@@ -1714,7 +1714,7 @@ function ensureMessageMetadata(repo) {
1714
1714
  // Re-export for backwards compatibility
1715
1715
  import { extractThreadMeta, normalizeThreadRepository, } from "../agent/thread-data-builder.js";
1716
1716
  export { extractThreadMeta };
1717
- const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, dynamicSuggestions, emptyStateAddon, showHeader = true, onSwitchToCli, className, apiUrl, tabId, browserTabId, threadId, contextScope, onMessageCountChange, onSaveThread, onGenerateTitle, composerSlot, composerDisabled = false, composerDisabledPlaceholder, isNewThread, onSlashCommand, execMode, onExecModeChange, planModeDisabled, planModeDisabledReason, selectedModel, defaultModel, selectedEngine, selectedEffort, availableModels, onModelChange, onEffortChange, onForkChat, }, ref) {
1717
+ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, dynamicSuggestions, emptyStateAddon, showHeader = true, onSwitchToCli, className, apiUrl, tabId, browserTabId, threadId, contextScope, onMessageCountChange, onSaveThread, onGenerateTitle, composerSlot, composerAreaClassName, composerToolbarSlot, composerExtraActionButton, composerDisabled = false, composerDisabledPlaceholder, isNewThread, onSlashCommand, execMode, onExecModeChange, planModeDisabled, planModeDisabledReason, selectedModel, defaultModel, selectedEngine, selectedEffort, availableModels, onModelChange, onEffortChange, onForkChat, onConnectProvider, plusMenuMode = "full", providerStatusChecksEnabled = true, loadHistoryRepository, historyReloadKey, }, ref) {
1718
1718
  const thread = useThread();
1719
1719
  const threadRuntime = useThreadRuntime();
1720
1720
  const composerRuntime = useComposerRuntime();
@@ -1866,7 +1866,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1866
1866
  }, [isRunning, tabId, threadId]);
1867
1867
  // ─── Chat persistence ──────────────────────────────────────────────
1868
1868
  const hasRestoredRef = useRef(false);
1869
- const [isRestoring, setIsRestoring] = useState(!!threadId && !isNewThread);
1869
+ const [isRestoring, setIsRestoring] = useState(!!(threadId || loadHistoryRepository) && !isNewThread);
1870
1870
  const onSaveThreadRef = useRef(onSaveThread);
1871
1871
  onSaveThreadRef.current = onSaveThread;
1872
1872
  const onGenerateTitleRef = useRef(onGenerateTitle);
@@ -1896,6 +1896,17 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1896
1896
  return repo;
1897
1897
  }, [threadRuntime]);
1898
1898
  const refreshThreadFromServer = useCallback(async () => {
1899
+ if (loadHistoryRepository) {
1900
+ try {
1901
+ const repo = await loadHistoryRepository();
1902
+ if (!repo)
1903
+ return null;
1904
+ return importThreadData(repo);
1905
+ }
1906
+ catch {
1907
+ return null;
1908
+ }
1909
+ }
1899
1910
  if (!threadId)
1900
1911
  return null;
1901
1912
  try {
@@ -1910,7 +1921,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1910
1921
  catch {
1911
1922
  return null;
1912
1923
  }
1913
- }, [apiUrl, importThreadData, threadId]);
1924
+ }, [apiUrl, importThreadData, loadHistoryRepository, threadId]);
1914
1925
  const wasRecentlyStoppedRun = useCallback((runId) => {
1915
1926
  const stopped = userStoppedRunRef.current;
1916
1927
  return Boolean(stopped &&
@@ -2097,7 +2108,24 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2097
2108
  if (hasRestoredRef.current)
2098
2109
  return;
2099
2110
  hasRestoredRef.current = true;
2100
- if (threadId) {
2111
+ if (loadHistoryRepository) {
2112
+ (async () => {
2113
+ try {
2114
+ const repo = await loadHistoryRepository();
2115
+ if (repo) {
2116
+ importThreadData(repo, { markTitleGenerated: true });
2117
+ }
2118
+ titleGeneratedRef.current = true;
2119
+ }
2120
+ catch {
2121
+ // Start fresh
2122
+ }
2123
+ finally {
2124
+ setIsRestoring(false);
2125
+ }
2126
+ })();
2127
+ }
2128
+ else if (threadId) {
2101
2129
  (async () => {
2102
2130
  try {
2103
2131
  const res = await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`);
@@ -2145,6 +2173,32 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2145
2173
  threadRuntime,
2146
2174
  importThreadData,
2147
2175
  reconnectActiveRunForThread,
2176
+ loadHistoryRepository,
2177
+ ]);
2178
+ useEffect(() => {
2179
+ if (!loadHistoryRepository ||
2180
+ !hasRestoredRef.current ||
2181
+ isRestoring ||
2182
+ isRunning) {
2183
+ return;
2184
+ }
2185
+ let cancelled = false;
2186
+ void loadHistoryRepository()
2187
+ .then((repo) => {
2188
+ if (cancelled || !repo)
2189
+ return;
2190
+ importThreadData(repo, { markTitleGenerated: true });
2191
+ })
2192
+ .catch(() => undefined);
2193
+ return () => {
2194
+ cancelled = true;
2195
+ };
2196
+ }, [
2197
+ historyReloadKey,
2198
+ importThreadData,
2199
+ isRestoring,
2200
+ isRunning,
2201
+ loadHistoryRepository,
2148
2202
  ]);
2149
2203
  // If assistant-ui stops the local runtime while the background server run is
2150
2204
  // still alive, immediately switch into the same reconnect path used after a
@@ -2311,6 +2365,10 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2311
2365
  // Check on mount and whenever SettingsPanel dispatches
2312
2366
  // `agent-engine:configured-changed` so the gate flips live without reload.
2313
2367
  useEffect(() => {
2368
+ if (!providerStatusChecksEnabled) {
2369
+ setMissingApiKey(false);
2370
+ return;
2371
+ }
2314
2372
  let cancelled = false;
2315
2373
  const check = async () => {
2316
2374
  const [envKeys, builderStatus, engineStatus] = await Promise.all([
@@ -2344,7 +2402,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2344
2402
  cancelled = true;
2345
2403
  window.removeEventListener("agent-engine:configured-changed", check);
2346
2404
  };
2347
- }, []);
2405
+ }, [providerStatusChecksEnabled]);
2348
2406
  // Listen for auth error events from the adapter
2349
2407
  const checkAuthSession = useCallback(async () => {
2350
2408
  try {
@@ -2799,7 +2857,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2799
2857
  .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
2800
2858
  .trim();
2801
2859
  return (_jsx("div", { className: "flex justify-end group", children: _jsxs("div", { className: "relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide", children: [_jsx(IconClock, { className: "h-3 w-3" }), "Queued"] }), displayText, msg.images && msg.images.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1.5 mt-1.5", children: msg.images.map((img, j) => (_jsx("img", { src: img, alt: "", className: "h-12 w-12 rounded object-cover border border-border/50" }, j))) })), _jsx("button", { type: "button", onClick: () => setQueuedMessages((prev) => prev.filter((m) => m.id !== msg.id)), "aria-label": "Remove from queue", className: "absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm", children: _jsx(IconX, { className: "h-3 w-3" }) })] }) }, msg.id));
2802
- })] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, showPlanModeCallout && (_jsx(PlanModeCallout, { canImplementPlan: canImplementPlan, onImplementPlan: handleImplementPlan, onSwitchToAct: handleSwitchToAct })), _jsx(SelectionAttachedPill, {}), _jsxs(AgentComposerFrame, { className: cn(missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
2860
+ })] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, showPlanModeCallout && (_jsx(PlanModeCallout, { canImplementPlan: canImplementPlan, onImplementPlan: handleImplementPlan, onSwitchToAct: handleSwitchToAct })), _jsx(SelectionAttachedPill, {}), _jsxs(AgentComposerFrame, { className: cn(composerAreaClassName, missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
2803
2861
  ? () => setMissingKeyBouncePulse((p) => p + 1)
2804
2862
  : undefined, children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: isComposerDisabled, placeholder: missingApiKey
2805
2863
  ? "Connect an AI engine above to start chatting…"
@@ -2812,37 +2870,39 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2812
2870
  : "Send a follow-up..."
2813
2871
  : undefined, onSubmit: isRunning
2814
2872
  ? (text, references, attachments, options) => void addToQueue(text, undefined, references.length > 0 ? references : undefined, attachments, undefined, options?.intent ?? "immediate")
2815
- : undefined, onSlashCommand: onSlashCommand, execMode: execMode, onExecModeChange: onExecModeChange, planModeDisabled: planModeDisabled, planModeDisabledReason: planModeDisabledReason, selectedModel: selectedModel ?? defaultModel, selectedEffort: selectedEffort, availableModels: availableModels, onModelChange: onModelChange, onEffortChange: onEffortChange, draftScope: threadId || tabId, interceptBuildRequestsForBuilder: true, extraActionButton: showRunningInUI ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => {
2816
- // Nuclear stop: flip forceStopped so isRunning is false
2817
- // immediately. This unblocks submission even if the
2818
- // runtime or reconnect state is stuck.
2819
- setForceStopped(true);
2820
- const activeRun = getActiveRun();
2821
- const runIdToAbort = reconnectRunIdRef.current ?? activeRun?.runId;
2822
- userStoppedRunRef.current = {
2823
- at: Date.now(),
2824
- ...(runIdToAbort ? { runId: runIdToAbort } : {}),
2825
- };
2826
- setRunErrorInfo(null);
2827
- setDismissedRunErrorKey(null);
2828
- if (runIdToAbort) {
2829
- fetch(`${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`, { method: "POST" }).catch(() => { });
2830
- }
2831
- if (isReconnecting) {
2832
- reconnectAbortRef.current?.abort();
2833
- reconnectAbortRef.current = null;
2834
- reconnectRunIdRef.current = null;
2835
- setIsReconnecting(false);
2836
- setReconnectFrozen(reconnectContent.length > 0);
2837
- }
2838
- threadRuntime.cancelRun();
2839
- window.dispatchEvent(new CustomEvent("agentNative.chatRunning", {
2840
- detail: {
2841
- isRunning: false,
2842
- tabId: tabId || threadId,
2843
- },
2844
- }));
2845
- }, className: "shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80", children: _jsx(IconPlayerStop, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Stop generating" })] })) : undefined })] })] }) }) }) }));
2873
+ : undefined, onSlashCommand: onSlashCommand, execMode: execMode, onExecModeChange: onExecModeChange, planModeDisabled: planModeDisabled, planModeDisabledReason: planModeDisabledReason, selectedModel: selectedModel ?? defaultModel, selectedEffort: selectedEffort, availableModels: availableModels, onModelChange: onModelChange, onEffortChange: onEffortChange, onConnectProvider: onConnectProvider, toolbarSlot: composerToolbarSlot, plusMenuMode: plusMenuMode, providerConnectStatusEnabled: providerStatusChecksEnabled, draftScope: threadId || tabId, interceptBuildRequestsForBuilder: true, extraActionButton: composerExtraActionButton || showRunningInUI ? (_jsxs(_Fragment, { children: [composerExtraActionButton, showRunningInUI && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => {
2874
+ // Nuclear stop: flip forceStopped so isRunning is false
2875
+ // immediately. This unblocks submission even if the
2876
+ // runtime or reconnect state is stuck.
2877
+ setForceStopped(true);
2878
+ const activeRun = getActiveRun();
2879
+ const runIdToAbort = reconnectRunIdRef.current ?? activeRun?.runId;
2880
+ userStoppedRunRef.current = {
2881
+ at: Date.now(),
2882
+ ...(runIdToAbort
2883
+ ? { runId: runIdToAbort }
2884
+ : {}),
2885
+ };
2886
+ setRunErrorInfo(null);
2887
+ setDismissedRunErrorKey(null);
2888
+ if (runIdToAbort) {
2889
+ fetch(`${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`, { method: "POST" }).catch(() => { });
2890
+ }
2891
+ if (isReconnecting) {
2892
+ reconnectAbortRef.current?.abort();
2893
+ reconnectAbortRef.current = null;
2894
+ reconnectRunIdRef.current = null;
2895
+ setIsReconnecting(false);
2896
+ setReconnectFrozen(reconnectContent.length > 0);
2897
+ }
2898
+ threadRuntime.cancelRun();
2899
+ window.dispatchEvent(new CustomEvent("agentNative.chatRunning", {
2900
+ detail: {
2901
+ isRunning: false,
2902
+ tabId: tabId || threadId,
2903
+ },
2904
+ }));
2905
+ }, className: "shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80", children: _jsx(IconPlayerStop, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Stop generating" })] }))] })) : undefined })] })] }) }) }) }));
2846
2906
  });
2847
2907
  export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentNativePath("/_agent-native/agent-chat"), tabId, browserTabId, threadId, contextScope, ...props }, ref) {
2848
2908
  const modelRef = useRef(props.selectedModel);
@@ -2855,17 +2915,29 @@ export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentN
2855
2915
  execModeRef.current = props.execMode;
2856
2916
  const scopeRef = useRef(contextScope);
2857
2917
  scopeRef.current = contextScope;
2858
- const adapter = useMemo(() => createAgentChatAdapter({
2859
- apiUrl,
2860
- tabId,
2861
- threadId,
2862
- modelRef,
2863
- engineRef,
2864
- effortRef,
2865
- execModeRef,
2866
- browserTabId,
2867
- scopeRef,
2868
- }), [apiUrl, tabId, threadId, browserTabId]);
2918
+ const createAdapterRef = useRef(props.createAdapter);
2919
+ createAdapterRef.current = props.createAdapter;
2920
+ const adapter = useMemo(() => {
2921
+ const context = {
2922
+ apiUrl,
2923
+ tabId,
2924
+ threadId,
2925
+ modelRef,
2926
+ engineRef,
2927
+ effortRef,
2928
+ execModeRef,
2929
+ browserTabId,
2930
+ scopeRef,
2931
+ };
2932
+ const createAdapter = createAdapterRef.current;
2933
+ return createAdapter
2934
+ ? createAdapter(context)
2935
+ : createAgentChatAdapter(context);
2936
+ },
2937
+ // Adapter factories must be memoized and use refs for changing values.
2938
+ // `adapterReloadKey` is an explicit opt-in for embedded hosts whose
2939
+ // transport identity can change without changing tab/thread ids.
2940
+ [apiUrl, tabId, threadId, browserTabId, props.adapterReloadKey]);
2869
2941
  const attachmentAdapter = useMemo(() => new CompositeAttachmentAdapter([
2870
2942
  new DownscalingImageAttachmentAdapter(),
2871
2943
  new BinaryDocumentAttachmentAdapter(),
@@ -2874,6 +2946,6 @@ export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentN
2874
2946
  const runtime = useLocalRuntime(adapter, {
2875
2947
  adapters: { attachments: attachmentAdapter },
2876
2948
  });
2877
- return (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(ThreadPrimitive.Root, { className: "flex flex-1 flex-col h-full min-h-0 overflow-x-hidden", children: _jsx(AssistantUiStaleIndexErrorBoundary, { resetKey: `${tabId ?? ""}:${threadId ?? ""}`, componentName: "AssistantChat", children: _jsx(AssistantChatInner, { ref: ref, ...props, browserTabId: browserTabId, contextScope: contextScope, apiUrl: apiUrl, tabId: tabId, threadId: threadId }) }) }) }));
2949
+ return (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(TooltipProvider, { delayDuration: 200, children: _jsx(ThreadPrimitive.Root, { className: "flex flex-1 flex-col h-full min-h-0 overflow-x-hidden", children: _jsx(AssistantUiStaleIndexErrorBoundary, { resetKey: `${tabId ?? ""}:${threadId ?? ""}`, componentName: "AssistantChat", children: _jsx(AssistantChatInner, { ref: ref, ...props, browserTabId: browserTabId, contextScope: contextScope, apiUrl: apiUrl, tabId: tabId, threadId: threadId }) }) }) }) }));
2878
2950
  });
2879
2951
  //# sourceMappingURL=AssistantChat.js.map