@agent-native/core 0.54.1 → 0.56.0

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 (186) hide show
  1. package/README.md +16 -1
  2. package/dist/action-ui.d.ts +17 -0
  3. package/dist/action-ui.d.ts.map +1 -0
  4. package/dist/action-ui.js +23 -0
  5. package/dist/action-ui.js.map +1 -0
  6. package/dist/action.d.ts +8 -1
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js +3 -0
  9. package/dist/action.js.map +1 -1
  10. package/dist/agent/production-agent.d.ts +2 -0
  11. package/dist/agent/production-agent.d.ts.map +1 -1
  12. package/dist/agent/production-agent.js +11 -1
  13. package/dist/agent/production-agent.js.map +1 -1
  14. package/dist/agent/thread-data-builder.d.ts +4 -0
  15. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  16. package/dist/agent/thread-data-builder.js +4 -0
  17. package/dist/agent/thread-data-builder.js.map +1 -1
  18. package/dist/agent/types.d.ts +2 -0
  19. package/dist/agent/types.d.ts.map +1 -1
  20. package/dist/agent/types.js.map +1 -1
  21. package/dist/cli/connect.d.ts +3 -1
  22. package/dist/cli/connect.d.ts.map +1 -1
  23. package/dist/cli/connect.js +7 -1
  24. package/dist/cli/connect.js.map +1 -1
  25. package/dist/cli/index.js +1 -1
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/plan-local.d.ts +40 -0
  28. package/dist/cli/plan-local.d.ts.map +1 -1
  29. package/dist/cli/plan-local.js +495 -9
  30. package/dist/cli/plan-local.js.map +1 -1
  31. package/dist/cli/skills.d.ts +17 -2
  32. package/dist/cli/skills.d.ts.map +1 -1
  33. package/dist/cli/skills.js +135 -36
  34. package/dist/cli/skills.js.map +1 -1
  35. package/dist/client/AgentChatHome.d.ts +23 -0
  36. package/dist/client/AgentChatHome.d.ts.map +1 -0
  37. package/dist/client/AgentChatHome.js +13 -0
  38. package/dist/client/AgentChatHome.js.map +1 -0
  39. package/dist/client/AgentPanel.d.ts +29 -2
  40. package/dist/client/AgentPanel.d.ts.map +1 -1
  41. package/dist/client/AgentPanel.js +116 -68
  42. package/dist/client/AgentPanel.js.map +1 -1
  43. package/dist/client/AssistantChat.d.ts.map +1 -1
  44. package/dist/client/AssistantChat.js +145 -21
  45. package/dist/client/AssistantChat.js.map +1 -1
  46. package/dist/client/FeedbackButton.d.ts +7 -1
  47. package/dist/client/FeedbackButton.d.ts.map +1 -1
  48. package/dist/client/FeedbackButton.js +13 -3
  49. package/dist/client/FeedbackButton.js.map +1 -1
  50. package/dist/client/MultiTabAssistantChat.d.ts +1 -2
  51. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  53. package/dist/client/agent-sidebar-state.d.ts +2 -0
  54. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  55. package/dist/client/agent-sidebar-state.js +15 -4
  56. package/dist/client/agent-sidebar-state.js.map +1 -1
  57. package/dist/client/chat/index.d.ts +7 -0
  58. package/dist/client/chat/index.d.ts.map +1 -1
  59. package/dist/client/chat/index.js +6 -0
  60. package/dist/client/chat/index.js.map +1 -1
  61. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  62. package/dist/client/chat/run-recovery.js +11 -9
  63. package/dist/client/chat/run-recovery.js.map +1 -1
  64. package/dist/client/chat/runtime.d.ts +354 -0
  65. package/dist/client/chat/runtime.d.ts.map +1 -0
  66. package/dist/client/chat/runtime.js +2 -0
  67. package/dist/client/chat/runtime.js.map +1 -0
  68. package/dist/client/chat/tool-call-display.d.ts +5 -1
  69. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  70. package/dist/client/chat/tool-call-display.js +22 -5
  71. package/dist/client/chat/tool-call-display.js.map +1 -1
  72. package/dist/client/chat/tool-render-registry.d.ts +35 -0
  73. package/dist/client/chat/tool-render-registry.d.ts.map +1 -0
  74. package/dist/client/chat/tool-render-registry.js +83 -0
  75. package/dist/client/chat/tool-render-registry.js.map +1 -0
  76. package/dist/client/chat/widgets/DataChartRenderer.d.ts +5 -0
  77. package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -0
  78. package/dist/client/chat/widgets/DataChartRenderer.js +33 -0
  79. package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -0
  80. package/dist/client/chat/widgets/DataChartWidget.d.ts +5 -0
  81. package/dist/client/chat/widgets/DataChartWidget.d.ts.map +1 -0
  82. package/dist/client/chat/widgets/DataChartWidget.js +15 -0
  83. package/dist/client/chat/widgets/DataChartWidget.js.map +1 -0
  84. package/dist/client/chat/widgets/DataInsightsWidget.d.ts +5 -0
  85. package/dist/client/chat/widgets/DataInsightsWidget.d.ts.map +1 -0
  86. package/dist/client/chat/widgets/DataInsightsWidget.js +18 -0
  87. package/dist/client/chat/widgets/DataInsightsWidget.js.map +1 -0
  88. package/dist/client/chat/widgets/DataTableWidget.d.ts +9 -0
  89. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -0
  90. package/dist/client/chat/widgets/DataTableWidget.js +95 -0
  91. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -0
  92. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +2 -0
  93. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -0
  94. package/dist/client/chat/widgets/builtin-tool-renderers.js +82 -0
  95. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -0
  96. package/dist/client/chat/widgets/data-widget-types.d.ts +2 -0
  97. package/dist/client/chat/widgets/data-widget-types.d.ts.map +1 -0
  98. package/dist/client/chat/widgets/data-widget-types.js +2 -0
  99. package/dist/client/chat/widgets/data-widget-types.js.map +1 -0
  100. package/dist/client/chat-view-transition.d.ts +35 -0
  101. package/dist/client/chat-view-transition.d.ts.map +1 -0
  102. package/dist/client/chat-view-transition.js +66 -0
  103. package/dist/client/chat-view-transition.js.map +1 -0
  104. package/dist/client/composer/PromptComposer.d.ts +1 -1
  105. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  106. package/dist/client/composer/PromptComposer.js +2 -2
  107. package/dist/client/composer/PromptComposer.js.map +1 -1
  108. package/dist/client/composer/TiptapComposer.d.ts +2 -1
  109. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  110. package/dist/client/composer/TiptapComposer.js +2 -1
  111. package/dist/client/composer/TiptapComposer.js.map +1 -1
  112. package/dist/client/index.d.ts +7 -1
  113. package/dist/client/index.d.ts.map +1 -1
  114. package/dist/client/index.js +6 -1
  115. package/dist/client/index.js.map +1 -1
  116. package/dist/client/route-state.d.ts +6 -0
  117. package/dist/client/route-state.d.ts.map +1 -1
  118. package/dist/client/route-state.js +16 -1
  119. package/dist/client/route-state.js.map +1 -1
  120. package/dist/client/sse-event-processor.d.ts +3 -0
  121. package/dist/client/sse-event-processor.d.ts.map +1 -1
  122. package/dist/client/sse-event-processor.js +2 -0
  123. package/dist/client/sse-event-processor.js.map +1 -1
  124. package/dist/client/use-chat-threads.d.ts.map +1 -1
  125. package/dist/client/use-chat-threads.js +19 -4
  126. package/dist/client/use-chat-threads.js.map +1 -1
  127. package/dist/data-widgets/index.d.ts +326 -0
  128. package/dist/data-widgets/index.d.ts.map +1 -0
  129. package/dist/data-widgets/index.js +232 -0
  130. package/dist/data-widgets/index.js.map +1 -0
  131. package/dist/index.browser.d.ts +2 -0
  132. package/dist/index.browser.d.ts.map +1 -1
  133. package/dist/index.browser.js +2 -0
  134. package/dist/index.browser.js.map +1 -1
  135. package/dist/index.d.ts +2 -0
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +2 -0
  138. package/dist/index.js.map +1 -1
  139. package/dist/provider-api/corpus-jobs.d.ts +160 -0
  140. package/dist/provider-api/corpus-jobs.d.ts.map +1 -1
  141. package/dist/provider-api/corpus-jobs.js +44 -0
  142. package/dist/provider-api/corpus-jobs.js.map +1 -1
  143. package/dist/provider-api/index.d.ts +39 -0
  144. package/dist/provider-api/index.d.ts.map +1 -1
  145. package/dist/provider-api/index.js +53 -0
  146. package/dist/provider-api/index.js.map +1 -1
  147. package/dist/scripts/dev/index.d.ts +1 -0
  148. package/dist/scripts/dev/index.d.ts.map +1 -1
  149. package/dist/scripts/dev/index.js +129 -127
  150. package/dist/scripts/dev/index.js.map +1 -1
  151. package/dist/server/action-discovery.d.ts.map +1 -1
  152. package/dist/server/action-discovery.js +5 -0
  153. package/dist/server/action-discovery.js.map +1 -1
  154. package/dist/server/agent-chat-plugin.d.ts +8 -0
  155. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  156. package/dist/server/agent-chat-plugin.js +34 -21
  157. package/dist/server/agent-chat-plugin.js.map +1 -1
  158. package/dist/server/prompts/framework-core-compact.d.ts +4 -1
  159. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  160. package/dist/server/prompts/framework-core-compact.js +11 -4
  161. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  162. package/dist/server/prompts/framework-core.d.ts +4 -1
  163. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  164. package/dist/server/prompts/framework-core.js +15 -5
  165. package/dist/server/prompts/framework-core.js.map +1 -1
  166. package/dist/server/prompts/shared-rules.d.ts +4 -1
  167. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  168. package/dist/server/prompts/shared-rules.js +4 -1
  169. package/dist/server/prompts/shared-rules.js.map +1 -1
  170. package/dist/styles/agent-native.css +62 -0
  171. package/dist/vite/client.d.ts.map +1 -1
  172. package/dist/vite/client.js +5 -0
  173. package/dist/vite/client.js.map +1 -1
  174. package/docs/content/actions.md +52 -0
  175. package/docs/content/components.md +24 -1
  176. package/docs/content/drop-in-agent.md +9 -2
  177. package/docs/content/external-agents.md +14 -4
  178. package/docs/content/faq.md +5 -4
  179. package/docs/content/getting-started.md +39 -87
  180. package/docs/content/key-concepts.md +34 -15
  181. package/docs/content/mcp-apps.md +2 -0
  182. package/docs/content/mcp-protocol.md +2 -2
  183. package/docs/content/native-chat-ui.md +210 -0
  184. package/docs/content/template-plan.md +16 -1
  185. package/docs/content/what-is-agent-native.md +10 -2
  186. package/package.json +2 -1
@@ -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":"AAAA,OAAO,KASN,MAAM,OAAO,CAAC;AAWf,OAAO,KAAK,EAEV,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAML,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAoC/B,OAAO,KAAK,EACV,0BAA0B,EAE3B,MAAM,qBAAqB,CAAC;AA4D7B,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,qCAAqC,EACrC,mCAAmC,EACnC,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAK1E,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,CAAC;AACvD,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAqWD,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B,MAAM,CASR;AAID,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,wBAAwB,GACjC,IAAI,CAAC;IACR,gEAAgE;IAChE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzD,qDAAqD;IACrD,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,wDAAwD;IACxD,yBAAyB,IAAI,IAAI,CAAC;IAClC,sFAAsF;IACtF,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,mBAAmB,EACnC,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,IAAI,CAAC;IACR,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpD,4CAA4C;IAC5C,SAAS,IAAI,OAAO,CAAC;IACrB,+BAA+B;IAC/B,aAAa,IAAI,IAAI,CAAC;IACtB,gFAAgF;IAChF,oBAAoB,IAAI,kBAAkB,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC1C,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACpD,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC1D,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,6BAA6B,CAAC;IACnD;;4EAEwE;IACxE,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,KACE,IAAI,CAAC;IACV,+DAA+D;IAC/D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,qBAAqB,CAAC,EAAE,0BAA0B,CAAC;IACnD,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACzC,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACtC,+DAA+D;IAC/D,yBAAyB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5C,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IACpD,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,uDAAuD;IACvD,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,kEAAkE;IAClE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;IAC5D,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;IACjD;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,gBAAgB,CAAC;IAC3E;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IACxE,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAsDjD,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,QAI9C;AA6CD,OAAO,EACL,iBAAiB,EAElB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAu5E7B,eAAO,MAAM,aAAa,gGAyFxB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useRef, useEffect, useCallback, useMemo, forwardRef, useImperativeHandle, } from "react";
2
+ import { useState, useRef, useEffect, useCallback, useMemo, useLayoutEffect, forwardRef, useImperativeHandle, } from "react";
3
3
  import { AssistantRuntimeProvider, useLocalRuntime, useThreadRuntime, useThread, useAui, useComposer, useComposerRuntime, ThreadPrimitive, } from "@assistant-ui/react";
4
4
  import { CompositeAttachmentAdapter } from "@assistant-ui/react";
5
5
  import { createAgentChatAdapter, } from "./agent-chat-adapter.js";
@@ -14,6 +14,7 @@ import { cn } from "./utils.js";
14
14
  import { useNearBottomAutoscroll } from "./conversation/index.js";
15
15
  import { TextAttachmentAdapter } from "./composer/attachment-accept.js";
16
16
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "./components/ui/tooltip.js";
17
+ import { AGENT_CHAT_VIEW_TRANSITION_PREPARE_EVENT } from "./chat-view-transition.js";
17
18
  import { GuidedQuestionFlow, useGuidedQuestionFlow, } from "./guided-questions.js";
18
19
  import { useDevMode } from "./use-dev-mode.js";
19
20
  import { agentNativePath } from "./api-path.js";
@@ -32,6 +33,7 @@ import { BuilderSetupCard, LoopLimitContinueCard, RunErrorRecoveryCard, PlanMode
32
33
  import { repoHasAssistantMessage, getRepoMessages, getRepoMessage, shouldImportServerThreadData, } from "./chat/repo-helpers.js";
33
34
  export { AssistantMessageListErrorBoundary, AssistantUiStaleIndexErrorBoundary, assistantUiRecoverableRenderErrorKind, isAssistantUiRecoverableRenderError, isAssistantUiStaleIndexError, } from "./assistant-ui-recovery.js";
34
35
  export { displayableUserMessageText } from "./chat/message-components.js";
36
+ const useBrowserLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
35
37
  function createUserMessageRunConfig(references, requestMode, recoveryAction, trackInRunsTray, approvedToolCalls) {
36
38
  const custom = {};
37
39
  if (references && references.length > 0) {
@@ -73,6 +75,7 @@ function cloneContentParts(content) {
73
75
  ...part,
74
76
  args: { ...part.args },
75
77
  ...(part.mcpApp ? { mcpApp: { ...part.mcpApp } } : {}),
78
+ ...(part.chatUI ? { chatUI: { ...part.chatUI } } : {}),
76
79
  });
77
80
  }
78
81
  function clearPendingSelection() {
@@ -85,6 +88,12 @@ function clearPendingSelection() {
85
88
  window.dispatchEvent(new CustomEvent("agent-panel:selection-cleared"));
86
89
  }
87
90
  }
91
+ // Thread ids the server has already told us don't exist (a prior mount's
92
+ // /threads/:id probe returned 404). Module-scoped so it survives remounts:
93
+ // re-probing a known-absent thread on every navigation just re-spams DevTools
94
+ // with 404s for a thread that has no server row yet (e.g. a freshly created,
95
+ // not-yet-sent chat). Reset on a full page reload.
96
+ const knownAbsentThreadIds = new Set();
88
97
  async function waitForThreadRunToClear(apiUrl, threadId) {
89
98
  if (!threadId)
90
99
  return;
@@ -179,6 +188,7 @@ function contentPartFollowKey(part) {
179
188
  String(part.argsText ?? "").length,
180
189
  String(part.result ?? "").length,
181
190
  part.mcpApp ? 1 : 0,
191
+ part.chatUI?.renderer ?? "",
182
192
  ].join(":");
183
193
  }
184
194
  if (type === "image")
@@ -246,6 +256,45 @@ export function latestNonRecoveryUserMessageText(messages) {
246
256
  return "";
247
257
  }
248
258
  export const CHAT_STORAGE_PREFIX = "agent-chat:";
259
+ const THREAD_SNAPSHOT_CACHE_PREFIX = `${CHAT_STORAGE_PREFIX}thread-snapshot:`;
260
+ function threadSnapshotCacheKey(apiUrl, threadId) {
261
+ return `${THREAD_SNAPSHOT_CACHE_PREFIX}${apiUrl}:${threadId}`;
262
+ }
263
+ function normalizeCachedThreadSnapshot(value) {
264
+ if (!value || typeof value !== "object")
265
+ return null;
266
+ const snapshot = value;
267
+ if (typeof snapshot.threadData !== "string")
268
+ return null;
269
+ return {
270
+ threadData: snapshot.threadData,
271
+ title: typeof snapshot.title === "string" ? snapshot.title : "",
272
+ preview: typeof snapshot.preview === "string" ? snapshot.preview : "",
273
+ messageCount: typeof snapshot.messageCount === "number" &&
274
+ Number.isFinite(snapshot.messageCount)
275
+ ? snapshot.messageCount
276
+ : 0,
277
+ };
278
+ }
279
+ function readCachedThreadSnapshot(apiUrl, threadId) {
280
+ if (!threadId || typeof sessionStorage === "undefined")
281
+ return null;
282
+ try {
283
+ const raw = sessionStorage.getItem(threadSnapshotCacheKey(apiUrl, threadId));
284
+ return raw ? normalizeCachedThreadSnapshot(JSON.parse(raw)) : null;
285
+ }
286
+ catch {
287
+ return null;
288
+ }
289
+ }
290
+ function writeCachedThreadSnapshot(apiUrl, threadId, snapshot) {
291
+ if (!threadId || typeof sessionStorage === "undefined")
292
+ return;
293
+ try {
294
+ sessionStorage.setItem(threadSnapshotCacheKey(apiUrl, threadId), JSON.stringify(snapshot));
295
+ }
296
+ catch { }
297
+ }
249
298
  /** Remove persisted chat for a given tabId (or "default"). */
250
299
  export function clearChatStorage(tabId) {
251
300
  try {
@@ -600,7 +649,11 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
600
649
  }, [isRunning, tabId, threadId]);
601
650
  // ─── Chat persistence ──────────────────────────────────────────────
602
651
  const hasRestoredRef = useRef(false);
603
- const [isRestoring, setIsRestoring] = useState(!!(threadId || loadHistoryRepository) && !isNewThread);
652
+ const [initialCachedThreadSnapshot] = useState(() => readCachedThreadSnapshot(apiUrl, threadId));
653
+ const hasImportedInitialCachedSnapshotRef = useRef(false);
654
+ const [isRestoring, setIsRestoring] = useState(!!(threadId || loadHistoryRepository) &&
655
+ !isNewThread &&
656
+ !initialCachedThreadSnapshot);
604
657
  const onSaveThreadRef = useRef(onSaveThread);
605
658
  onSaveThreadRef.current = onSaveThread;
606
659
  const onGenerateTitleRef = useRef(onGenerateTitle);
@@ -694,6 +747,40 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
694
747
  return null;
695
748
  }
696
749
  }, [apiUrl, importThreadData, loadHistoryRepository, threadId]);
750
+ const cacheCurrentThreadSnapshot = useCallback(() => {
751
+ if (!threadId || messages.length === 0)
752
+ return;
753
+ const repo = threadRuntime.export();
754
+ const threadData = JSON.stringify(stripBase64FromRepo(repo));
755
+ const { title, preview } = extractThreadMeta(repo);
756
+ writeCachedThreadSnapshot(apiUrl, threadId, {
757
+ threadData,
758
+ title,
759
+ preview,
760
+ messageCount: messages.length,
761
+ });
762
+ }, [apiUrl, messages.length, threadId, threadRuntime]);
763
+ useBrowserLayoutEffect(() => {
764
+ if (hasImportedInitialCachedSnapshotRef.current)
765
+ return;
766
+ if (!initialCachedThreadSnapshot)
767
+ return;
768
+ hasImportedInitialCachedSnapshotRef.current = true;
769
+ try {
770
+ importThreadData(initialCachedThreadSnapshot.threadData, {
771
+ markTitleGenerated: Boolean(initialCachedThreadSnapshot.title),
772
+ });
773
+ }
774
+ finally {
775
+ setIsRestoring(false);
776
+ }
777
+ }, [importThreadData, initialCachedThreadSnapshot]);
778
+ useEffect(() => {
779
+ window.addEventListener(AGENT_CHAT_VIEW_TRANSITION_PREPARE_EVENT, cacheCurrentThreadSnapshot);
780
+ return () => {
781
+ window.removeEventListener(AGENT_CHAT_VIEW_TRANSITION_PREPARE_EVENT, cacheCurrentThreadSnapshot);
782
+ };
783
+ }, [cacheCurrentThreadSnapshot]);
697
784
  const wasRecentlyStoppedRun = useCallback((runId) => {
698
785
  const stopped = userStoppedRunRef.current;
699
786
  return Boolean(stopped &&
@@ -904,6 +991,11 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
904
991
  // can only 404 and makes normal app startup look broken in DevTools.
905
992
  setIsRestoring(false);
906
993
  }
994
+ else if (threadId && knownAbsentThreadIds.has(threadId)) {
995
+ // A prior mount already learned this thread has no server row (404).
996
+ // Skip the re-probe so remounts don't re-spam 404s for the same id.
997
+ setIsRestoring(false);
998
+ }
907
999
  else if (threadId) {
908
1000
  (async () => {
909
1001
  try {
@@ -911,13 +1003,33 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
911
1003
  if (res.ok) {
912
1004
  const data = await res.json();
913
1005
  if (data.threadData) {
914
- importThreadData(data.threadData, { markTitleGenerated: true });
1006
+ const repo = importThreadData(data.threadData, {
1007
+ markTitleGenerated: true,
1008
+ });
1009
+ if (repo) {
1010
+ const { title, preview } = extractThreadMeta(repo);
1011
+ writeCachedThreadSnapshot(apiUrl, threadId, {
1012
+ threadData: typeof data.threadData === "string"
1013
+ ? data.threadData
1014
+ : JSON.stringify(data.threadData),
1015
+ title: data.title || title,
1016
+ preview,
1017
+ messageCount: Array.isArray(repo.messages)
1018
+ ? repo.messages.length
1019
+ : 0,
1020
+ });
1021
+ }
915
1022
  }
916
1023
  // Also skip title generation if thread already has a title
917
1024
  if (data.title) {
918
1025
  titleGeneratedRef.current = true;
919
1026
  }
920
1027
  }
1028
+ else if (res.status === 404) {
1029
+ // No server row for this thread yet — remember it so later remounts
1030
+ // skip the probe instead of re-fetching a known 404.
1031
+ knownAbsentThreadIds.add(threadId);
1032
+ }
921
1033
  }
922
1034
  catch {
923
1035
  // Start fresh
@@ -1071,15 +1183,18 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1071
1183
  return;
1072
1184
  const repo = threadRuntime.export();
1073
1185
  const { title, preview } = extractThreadMeta(repo);
1074
- lastSaveTimeRef.current = now;
1075
- savedTitleRef.current = title;
1076
- onSaveThreadRef.current(threadId, {
1077
- threadData: JSON.stringify(stripBase64FromRepo(repo)),
1186
+ const threadData = JSON.stringify(stripBase64FromRepo(repo));
1187
+ const snapshot = {
1188
+ threadData,
1078
1189
  title,
1079
1190
  preview,
1080
1191
  messageCount: messages.length,
1081
- });
1082
- }, [messages, isRunning, threadId, threadRuntime]);
1192
+ };
1193
+ lastSaveTimeRef.current = now;
1194
+ savedTitleRef.current = title;
1195
+ writeCachedThreadSnapshot(apiUrl, threadId, snapshot);
1196
+ onSaveThreadRef.current(threadId, snapshot);
1197
+ }, [apiUrl, messages, isRunning, threadId, threadRuntime]);
1083
1198
  // Persist full thread data after each completed response
1084
1199
  useEffect(() => {
1085
1200
  if (!hasRestoredRef.current)
@@ -1092,13 +1207,16 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1092
1207
  if (threadId && onSaveThreadRef.current) {
1093
1208
  // Save to server via the hook callback
1094
1209
  const { title, preview } = extractThreadMeta(repo);
1095
- savedTitleRef.current = title;
1096
- onSaveThreadRef.current(threadId, {
1097
- threadData: JSON.stringify(stripBase64FromRepo(repo)),
1210
+ const threadData = JSON.stringify(stripBase64FromRepo(repo));
1211
+ const snapshot = {
1212
+ threadData,
1098
1213
  title,
1099
1214
  preview,
1100
1215
  messageCount: messages.length,
1101
- });
1216
+ };
1217
+ savedTitleRef.current = title;
1218
+ writeCachedThreadSnapshot(apiUrl, threadId, snapshot);
1219
+ onSaveThreadRef.current(threadId, snapshot);
1102
1220
  }
1103
1221
  else {
1104
1222
  // Legacy: save to sessionStorage
@@ -1108,7 +1226,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1108
1226
  }
1109
1227
  catch { }
1110
1228
  }
1111
- }, [messages, isRunning, threadId, tabId, threadRuntime]);
1229
+ }, [apiUrl, messages, isRunning, threadId, tabId, threadRuntime]);
1112
1230
  useEffect(() => {
1113
1231
  onMessageCountChange?.(messages.length);
1114
1232
  }, [messages.length, onMessageCountChange]);
@@ -1829,12 +1947,18 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1829
1947
  (!userStoppedRunRef.current.runId ||
1830
1948
  !visibleRunError.runId ||
1831
1949
  userStoppedRunRef.current.runId === visibleRunError.runId));
1950
+ const hasActiveChatWork = showRunningInUI ||
1951
+ isAutoResuming ||
1952
+ queuedMessages.length > 0 ||
1953
+ reconnectContent.length > 0;
1832
1954
  const isFreshEmptyChat = messages.length === 0 &&
1955
+ !hasActiveChatWork &&
1833
1956
  !isRestoring &&
1834
1957
  !isReconnecting &&
1835
- !authError &&
1836
- !missingApiKey;
1958
+ !authError;
1837
1959
  const centeredEmptyState = centerComposerWhenEmpty && isFreshEmptyChat;
1960
+ const showEmptyState = messages.length === 0 && !isReconnecting && !hasActiveChatWork;
1961
+ const showComposerSlot = Boolean(composerSlot) && (!centerComposerWhenEmpty || centeredEmptyState);
1838
1962
  // Clarifying-question surface: the `ask-question` action writes a
1839
1963
  // GuidedQuestionPayload to application_state under "guided-questions". The
1840
1964
  // hook polls that key, and on submit/skip composes the answer as a normal
@@ -1894,7 +2018,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1894
2018
  window.location.reload();
1895
2019
  }, className: authSessionAvailable
1896
2020
  ? "text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md"
1897
- : "text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent", children: "Refresh chat" })] })] })) : missingApiKey && messages.length === 0 ? (_jsx("div", { className: "flex flex-col items-center justify-center h-full px-2", children: _jsx(BuilderSetupCard, { onConnected: handleBuilderConnected, bouncePulse: missingKeyBouncePulse }) })) : isRestoring ? (_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-end", children: _jsx("div", { className: "h-8 w-32 rounded-lg bg-muted animate-pulse" }) }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("div", { className: "h-4 w-48 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-64 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-40 rounded bg-muted animate-pulse" })] })] })) : messages.length === 0 && !isReconnecting ? (_jsxs("div", { className: cn("agent-empty-state", emptyStateDisplay === "hidden"
2021
+ : "text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent", children: "Refresh chat" })] })] })) : isRestoring ? (_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-end", children: _jsx("div", { className: "h-8 w-32 rounded-lg bg-muted animate-pulse" }) }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("div", { className: "h-4 w-48 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-64 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-40 rounded bg-muted animate-pulse" })] })] })) : showEmptyState ? (_jsxs("div", { className: cn("agent-empty-state", emptyStateDisplay === "hidden"
1898
2022
  ? "sr-only"
1899
2023
  : "flex h-full flex-col items-center justify-center gap-4 px-4 py-16"), children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-muted", children: _jsx(IconMessage, { className: "h-5 w-5 text-muted-foreground" }) }), _jsx("p", { className: "sr-only", children: emptyStateText ?? "How can I help you?" }), emptyStateAddon, resolvedSuggestions && resolvedSuggestions.length > 0 ? (_jsx("div", { className: "flex flex-col gap-1.5 w-full max-w-[280px]", children: resolvedSuggestions.map((suggestion) => (_jsx("button", { onClick: () => {
1900
2024
  threadRuntime.append({
@@ -1904,7 +2028,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1904
2028
  }, className: "w-full rounded-lg border border-border px-3 py-2 text-left text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground", children: suggestion }, suggestion))) })) : null] })) : (_jsxs("div", { className: "agent-thread-content flex flex-col gap-4 px-4 py-4", children: [_jsx(AssistantMessageListErrorBoundary, { resetKey: messageListResetKey, children: _jsx(ThreadPrimitive.Messages, { components: {
1905
2029
  UserMessage,
1906
2030
  AssistantMessage,
1907
- } }) }), missingApiKey && (_jsx(BuilderSetupCard, { onConnected: handleBuilderConnected, bouncePulse: missingKeyBouncePulse })), visibleLoopLimit && !showRunningInUI && (_jsx(LoopLimitContinueCard, { info: visibleLoopLimit, onContinue: () => {
2031
+ } }) }), visibleLoopLimit && !showRunningInUI && (_jsx(LoopLimitContinueCard, { info: visibleLoopLimit, onContinue: () => {
1908
2032
  setShowContinue(false);
1909
2033
  setLoopLimitInfo(null);
1910
2034
  addToQueue("Continue from where you left off.", undefined, undefined, undefined, undefined, "queued", "continue");
@@ -1927,7 +2051,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1927
2051
  .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
1928
2052
  .trim();
1929
2053
  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));
1930
- })] })) }), 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, guidedQuestions && guidedQuestions.length > 0 && (_jsx("div", { className: "shrink-0 px-3 pb-2 pt-1", children: _jsx("div", { className: "rounded-lg border border-border bg-card/60 shadow-sm", children: _jsx(GuidedQuestionFlow, { questions: guidedQuestions, onSubmit: handleGuidedQuestionsSubmit, onSkip: handleGuidedQuestionsSkip, ...(guidedQuestionsTitle
2054
+ })] })) }), 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" }) }) })), showComposerSlot ? composerSlot : null, guidedQuestions && guidedQuestions.length > 0 && (_jsx("div", { className: "shrink-0 px-3 pb-2 pt-1", children: _jsx("div", { className: "rounded-lg border border-border bg-card/60 shadow-sm", children: _jsx(GuidedQuestionFlow, { questions: guidedQuestions, onSubmit: handleGuidedQuestionsSubmit, onSkip: handleGuidedQuestionsSkip, ...(guidedQuestionsTitle
1931
2055
  ? { title: guidedQuestionsTitle }
1932
2056
  : {}), ...(guidedQuestionsDescription
1933
2057
  ? { description: guidedQuestionsDescription }
@@ -1945,7 +2069,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1945
2069
  "Thinking" })), composerError && (_jsxs("div", { role: "alert", className: "shrink-0 mx-3 mb-1.5 flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: [_jsx(IconAlertTriangle, { className: "h-3.5 w-3.5 mt-0.5 shrink-0" }), _jsx("span", { className: "flex-1 leading-snug", children: composerError }), _jsx("button", { type: "button", "aria-label": "Dismiss error", onClick: () => setComposerError(null), className: "shrink-0 opacity-70 hover:opacity-100", children: _jsx(IconX, { className: "h-3 w-3" }) })] })), _jsxs(AgentComposerFrame, { layoutVariant: composerLayoutVariant, className: cn(composerAreaClassName, missingApiKey && "cursor-pointer", isComposerDisabled && "opacity-70"), onClick: missingApiKey
1946
2070
  ? () => setMissingKeyBouncePulse((p) => p + 1)
1947
2071
  : undefined, children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, disabled: isComposerDisabled, placeholder: missingApiKey
1948
- ? "Connect an AI engine above to start chatting"
2072
+ ? "Connect AI below to start chatting..."
1949
2073
  : composerDisabled
1950
2074
  ? (composerDisabledPlaceholder ??
1951
2075
  "Open Desktop to use this chat.")
@@ -1957,7 +2081,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1957
2081
  ? (text, references, attachments, options) => void addToQueue(text, undefined, references.length > 0 ? references : undefined, attachments, undefined, options?.intent ?? "immediate", undefined, true)
1958
2082
  : 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, contextItems: composerContextItems, onRemoveContextItem: removeComposerContextItem, plusMenuMode: plusMenuMode, layoutVariant: composerLayoutVariant, providerConnectStatusEnabled: providerStatusChecksEnabled, draftScope: threadId || tabId, interceptBuildRequestsForBuilder: true, onAttachmentError: setComposerError, extraActionButton: contextXRayEnabled ||
1959
2083
  composerExtraActionButton ||
1960
- showRunningInUI ? (_jsxs(_Fragment, { children: [contextXRayEnabled && (_jsx(ContextMeter, { threadId: threadId })), composerExtraActionButton, showRunningInUI && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: stopActiveRun, 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 })] })] }) }) }) }) }) }));
2084
+ showRunningInUI ? (_jsxs(_Fragment, { children: [contextXRayEnabled && (_jsx(ContextMeter, { threadId: threadId })), composerExtraActionButton, showRunningInUI && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: stopActiveRun, 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 })] }), missingApiKey && !authError ? (_jsx(BuilderSetupCard, { onConnected: handleBuilderConnected, bouncePulse: missingKeyBouncePulse })) : null] }) }) }) }) }) }));
1961
2085
  });
1962
2086
  export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = agentNativePath("/_agent-native/agent-chat"), tabId, browserTabId, threadId, contextScope, isActiveComposer, ...props }, ref) {
1963
2087
  const modelRef = useRef(props.selectedModel);