@datalayer/agent-runtimes 1.0.10 → 1.0.17

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 (448) hide show
  1. package/README.md +82 -1
  2. package/lib/{AgentLexical.d.ts → AgentDocument.d.ts} +5 -5
  3. package/lib/{AgentLexical.js → AgentDocument.js} +156 -26
  4. package/lib/AgentNode.js +32 -31
  5. package/lib/AgentNotebook.js +172 -17
  6. package/lib/AppExamples2.css +47 -0
  7. package/lib/AppExamples2.d.ts +3 -0
  8. package/lib/AppExamples2.js +21 -0
  9. package/lib/{agent-lexical-main.js → agent-document-main.js} +2 -2
  10. package/lib/agents/AgentRuntimeChat.d.ts +73 -0
  11. package/lib/agents/AgentRuntimeChat.js +198 -0
  12. package/lib/api/index.d.ts +12 -0
  13. package/lib/api/index.js +46 -0
  14. package/lib/api/runtimes/checkpoints.d.ts +122 -0
  15. package/lib/api/runtimes/checkpoints.js +118 -0
  16. package/lib/api/runtimes/environments.d.ts +9 -0
  17. package/lib/api/runtimes/environments.js +29 -0
  18. package/lib/api/runtimes/healthz.d.ts +15 -0
  19. package/lib/api/runtimes/healthz.js +44 -0
  20. package/lib/api/runtimes/index.d.ts +12 -0
  21. package/lib/api/runtimes/index.js +16 -0
  22. package/lib/api/runtimes/runtimes.d.ts +138 -0
  23. package/lib/api/runtimes/runtimes.js +230 -0
  24. package/lib/api/runtimes/snapshots.d.ts +38 -0
  25. package/lib/api/runtimes/snapshots.js +82 -0
  26. package/lib/api/scheduler/index.d.ts +6 -0
  27. package/lib/api/scheduler/index.js +10 -0
  28. package/lib/api/scheduler/schedules.d.ts +85 -0
  29. package/lib/api/scheduler/schedules.js +78 -0
  30. package/lib/api/spacer/documents.d.ts +12 -0
  31. package/lib/api/spacer/documents.js +43 -0
  32. package/lib/api/spacer/healthz.d.ts +15 -0
  33. package/lib/api/spacer/healthz.js +44 -0
  34. package/lib/api/spacer/index.d.ts +15 -0
  35. package/lib/api/spacer/index.js +19 -0
  36. package/lib/api/spacer/items.d.ts +25 -0
  37. package/lib/api/spacer/items.js +55 -0
  38. package/lib/api/spacer/lexicals.d.ts +34 -0
  39. package/lib/api/spacer/lexicals.js +89 -0
  40. package/lib/api/spacer/notebooks.d.ts +34 -0
  41. package/lib/api/spacer/notebooks.js +89 -0
  42. package/lib/api/spacer/spaces.d.ts +84 -0
  43. package/lib/api/spacer/spaces.js +170 -0
  44. package/lib/api/spacer/users.d.ts +9 -0
  45. package/lib/api/spacer/users.js +29 -0
  46. package/lib/chat/Chat.d.ts +1 -1
  47. package/lib/chat/Chat.js +54 -54
  48. package/lib/chat/ChatFloating.d.ts +2 -2
  49. package/lib/chat/ChatFloating.js +136 -25
  50. package/lib/chat/ChatSidebar.js +20 -22
  51. package/lib/chat/base/ChatBase.js +429 -39
  52. package/lib/chat/display/EmptyState.js +21 -21
  53. package/lib/chat/document/EphemeralDocument.d.ts +23 -0
  54. package/lib/chat/document/EphemeralDocument.js +270 -0
  55. package/lib/chat/header/ChatHeaderBase.d.ts +12 -2
  56. package/lib/chat/header/ChatHeaderBase.js +78 -23
  57. package/lib/chat/index.d.ts +1 -0
  58. package/lib/chat/index.js +2 -0
  59. package/lib/chat/notebook/EphemeralNotebook.d.ts +24 -0
  60. package/lib/chat/notebook/EphemeralNotebook.js +252 -0
  61. package/lib/chat/prompt/InputFooter.js +4 -1
  62. package/lib/client/AgentRuntimesClient.d.ts +127 -0
  63. package/lib/client/AgentRuntimesClient.js +36 -0
  64. package/lib/client/AgentsMixin.js +28 -28
  65. package/lib/client/SdkAgentRuntimesClient.d.ts +1 -1
  66. package/lib/client/SdkAgentRuntimesClient.js +1 -1
  67. package/lib/client/mixins/RuntimesMixin.d.ts +93 -0
  68. package/lib/client/mixins/RuntimesMixin.js +229 -0
  69. package/lib/client/mixins/SpacerMixin.d.ts +210 -0
  70. package/lib/client/mixins/SpacerMixin.js +615 -0
  71. package/lib/client/utils/spacerUtils.d.ts +18 -0
  72. package/lib/client/utils/spacerUtils.js +32 -0
  73. package/lib/collaboration/DatalayerCollaboration.d.ts +13 -0
  74. package/lib/collaboration/DatalayerCollaboration.js +28 -0
  75. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +58 -0
  76. package/lib/collaboration/DatalayerCollaborationProvider.js +148 -0
  77. package/lib/collaboration/index.d.ts +2 -0
  78. package/lib/collaboration/index.js +6 -0
  79. package/lib/components/AgentSummary.d.ts +19 -0
  80. package/lib/components/AgentSummary.js +89 -0
  81. package/lib/components/a2ui/A2uiSurfaceComposed.d.ts +13 -0
  82. package/lib/components/a2ui/A2uiSurfaceComposed.js +110 -0
  83. package/lib/components/a2ui/index.d.ts +2 -0
  84. package/lib/components/a2ui/index.js +6 -0
  85. package/lib/components/a2ui/styles.d.ts +14 -0
  86. package/lib/components/a2ui/styles.js +142 -0
  87. package/lib/components/context/SpaceSelect.d.ts +2 -0
  88. package/lib/components/context/SpaceSelect.js +42 -0
  89. package/lib/components/flashes/FlashDisclaimer.d.ts +2 -0
  90. package/lib/components/flashes/FlashDisclaimer.js +17 -0
  91. package/lib/components/icons/ArtifactIcon.d.ts +10 -0
  92. package/lib/components/icons/ArtifactIcon.js +58 -0
  93. package/lib/components/icons/index.d.ts +1 -0
  94. package/lib/components/icons/index.js +5 -0
  95. package/lib/components/index.d.ts +5 -0
  96. package/lib/components/index.js +5 -0
  97. package/lib/components/nbgrader/NbGradesDetails.d.ts +5 -0
  98. package/lib/components/nbgrader/NbGradesDetails.js +19 -0
  99. package/lib/components/nbgrader/index.d.ts +1 -0
  100. package/lib/components/nbgrader/index.js +5 -0
  101. package/lib/components/progress/CreditsIndicator.d.ts +33 -0
  102. package/lib/components/progress/CreditsIndicator.js +23 -0
  103. package/lib/components/progress/index.d.ts +2 -0
  104. package/lib/components/progress/index.js +6 -0
  105. package/lib/components/runtimes/RuntimeCellVariables.d.ts +39 -0
  106. package/lib/components/runtimes/RuntimeCellVariables.js +172 -0
  107. package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +37 -0
  108. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +101 -0
  109. package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +57 -0
  110. package/lib/components/runtimes/RuntimeLauncherDialog.js +275 -0
  111. package/lib/components/runtimes/RuntimePickerBase.d.ts +69 -0
  112. package/lib/components/runtimes/RuntimePickerBase.js +122 -0
  113. package/lib/components/runtimes/RuntimePickerCell.d.ts +34 -0
  114. package/lib/components/runtimes/RuntimePickerCell.js +104 -0
  115. package/lib/components/runtimes/RuntimePickerNotebook.d.ts +42 -0
  116. package/lib/components/runtimes/RuntimePickerNotebook.js +232 -0
  117. package/lib/components/runtimes/RuntimeReservationControl.d.ts +47 -0
  118. package/lib/components/runtimes/RuntimeReservationControl.js +42 -0
  119. package/lib/components/runtimes/RuntimeSimplePicker.d.ts +38 -0
  120. package/lib/components/runtimes/RuntimeSimplePicker.js +155 -0
  121. package/lib/components/runtimes/RuntimeTransfer.d.ts +16 -0
  122. package/lib/components/runtimes/RuntimeTransfer.js +5 -0
  123. package/lib/components/runtimes/RuntimeUtils.d.ts +17 -0
  124. package/lib/components/runtimes/RuntimeUtils.js +178 -0
  125. package/lib/components/runtimes/RuntimeVariables.d.ts +38 -0
  126. package/lib/components/runtimes/RuntimeVariables.js +75 -0
  127. package/lib/components/runtimes/index.d.ts +11 -0
  128. package/lib/components/runtimes/index.js +15 -0
  129. package/lib/components/scheduler/ScheduleMenu.d.ts +54 -0
  130. package/lib/components/scheduler/ScheduleMenu.js +154 -0
  131. package/lib/components/scheduler/index.d.ts +1 -0
  132. package/lib/components/scheduler/index.js +5 -0
  133. package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +33 -0
  134. package/lib/components/snapshots/SandboxSnapshotMenu.js +169 -0
  135. package/lib/components/snapshots/index.d.ts +1 -0
  136. package/lib/components/snapshots/index.js +5 -0
  137. package/lib/components/snippets/SnippetDialog.d.ts +42 -0
  138. package/lib/components/snippets/SnippetDialog.js +42 -0
  139. package/lib/components/students/StudentItemStatus.d.ts +7 -0
  140. package/lib/components/students/StudentItemStatus.js +68 -0
  141. package/lib/components/students/index.d.ts +1 -0
  142. package/lib/components/students/index.js +5 -0
  143. package/lib/components/tokens/SpaceVariantToken.d.ts +5 -0
  144. package/lib/components/tokens/SpaceVariantToken.js +23 -0
  145. package/lib/components/tokens/index.d.ts +1 -0
  146. package/lib/components/tokens/index.js +5 -0
  147. package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +4 -0
  148. package/lib/components/toolbars/AssignmentEditorToolbar.js +18 -0
  149. package/lib/components/toolbars/DocumentEditorToolbar.d.ts +2 -0
  150. package/lib/components/toolbars/DocumentEditorToolbar.js +12 -0
  151. package/lib/components/toolbars/NotebookEditorToolbar.d.ts +29 -0
  152. package/lib/components/toolbars/NotebookEditorToolbar.js +30 -0
  153. package/lib/context/ContextInspector.d.ts +1 -14
  154. package/lib/context/ContextInspector.js +3 -73
  155. package/lib/context/CostUsageChart.d.ts +4 -3
  156. package/lib/context/CostUsageChart.js +236 -35
  157. package/lib/context/MessageHistory.d.ts +30 -0
  158. package/lib/context/MessageHistory.js +129 -0
  159. package/lib/context/TokenUsageChart.d.ts +4 -3
  160. package/lib/context/TokenUsageChart.js +180 -30
  161. package/lib/context/TurnGraphChart.d.ts +1 -1
  162. package/lib/context/TurnGraphChart.js +6 -6
  163. package/lib/examples/A2UiAgentExample.d.ts +22 -0
  164. package/lib/examples/A2UiAgentExample.js +442 -0
  165. package/lib/examples/A2UiComponentsGalleryExample.d.ts +3 -0
  166. package/lib/examples/A2UiComponentsGalleryExample.js +863 -0
  167. package/lib/examples/A2UiContactCardExample.js +9 -5
  168. package/lib/examples/A2UiRestaurantExample.js +23 -8
  169. package/lib/examples/A2UiViewerExample.js +75 -3
  170. package/lib/examples/AgUiAgenticExample.d.ts +1 -12
  171. package/lib/examples/AgUiAgenticExample.js +52 -8
  172. package/lib/examples/AgUiBackendToolRenderingExample.d.ts +1 -16
  173. package/lib/examples/AgUiBackendToolRenderingExample.js +32 -17
  174. package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -17
  175. package/lib/examples/AgUiHaikuGenUiExample.js +49 -33
  176. package/lib/examples/AgUiHumanInTheLoopExample.d.ts +1 -12
  177. package/lib/examples/AgUiHumanInTheLoopExample.js +21 -6
  178. package/lib/examples/AgUiSharedStateExample.d.ts +1 -14
  179. package/lib/examples/AgUiSharedStateExample.js +21 -6
  180. package/lib/examples/AgUiToolsBasedGenUiExample.d.ts +1 -14
  181. package/lib/examples/AgUiToolsBasedGenUiExample.js +21 -6
  182. package/lib/examples/AgentCheckpointsExample.d.ts +1 -1
  183. package/lib/examples/AgentCheckpointsExample.js +9 -10
  184. package/lib/examples/AgentCodemodeExample.js +3 -3
  185. package/lib/examples/AgentEvalsExample.js +5 -5
  186. package/lib/examples/AgentGuardrailsExample.js +17 -12
  187. package/lib/examples/AgentHooksExample.js +14 -55
  188. package/lib/examples/AgentInferenceProviderExample.js +4 -4
  189. package/lib/examples/AgentLoopExample.d.ts +10 -0
  190. package/lib/examples/AgentLoopExample.js +304 -0
  191. package/lib/examples/AgentMCPExample.js +7 -7
  192. package/lib/examples/AgentMemoryExample.js +4 -4
  193. package/lib/examples/AgentMonitoringExample.js +114 -44
  194. package/lib/examples/AgentNotificationsExample.js +4 -4
  195. package/lib/examples/AgentOtelExample.d.ts +3 -3
  196. package/lib/examples/AgentOtelExample.js +15 -10
  197. package/lib/examples/AgentOutputsExample.js +6 -6
  198. package/lib/examples/AgentParametersExample.js +21 -33
  199. package/lib/examples/AgentSandboxExample.js +5 -5
  200. package/lib/examples/AgentSkillsExample.js +7 -7
  201. package/lib/examples/AgentSubagentsExample.js +4 -4
  202. package/lib/examples/AgentToolApprovalsExample.js +5 -5
  203. package/lib/examples/AgentTriggersExample.js +9 -9
  204. package/lib/examples/AgentspecsExample.js +63 -41
  205. package/lib/examples/ChatCustomExample.js +23 -77
  206. package/lib/examples/ChatExample.js +13 -44
  207. package/lib/examples/LexicalAgentExample.js +43 -91
  208. package/lib/examples/LexicalAgentSidebarExample.js +45 -73
  209. package/lib/examples/NotebookAgentExample.js +52 -81
  210. package/lib/examples/NotebookAgentSidebarExample.js +43 -71
  211. package/lib/examples/NotebookCollaborationExample.js +11 -9
  212. package/lib/examples/NotebookExample.js +5 -2
  213. package/lib/examples/components/AuthRequiredView.js +1 -1
  214. package/lib/examples/components/ExampleErrorBoundary.d.ts +46 -0
  215. package/lib/examples/components/ExampleErrorBoundary.js +67 -0
  216. package/lib/examples/components/haiku/haiku-card.css +11 -0
  217. package/lib/examples/components/weather/weather-card.css +11 -0
  218. package/lib/examples/example-selector.js +3 -1
  219. package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
  220. package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
  221. package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
  222. package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
  223. package/lib/examples/index.d.ts +3 -1
  224. package/lib/examples/index.js +3 -1
  225. package/lib/examples/main.js +340 -93
  226. package/lib/examples/utils/a2ui.d.ts +2 -0
  227. package/lib/examples/utils/a2ui.js +97 -2
  228. package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
  229. package/lib/examples/utils/agentSummaryStore.js +23 -0
  230. package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
  231. package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
  232. package/lib/examples/utils/runtimeTargetStore.js +27 -0
  233. package/lib/examples/utils/teardownAgents.d.ts +13 -0
  234. package/lib/examples/utils/teardownAgents.js +78 -0
  235. package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
  236. package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
  237. package/lib/examples2/CellExample.d.ts +6 -0
  238. package/lib/examples2/CellExample.js +20 -0
  239. package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
  240. package/lib/examples2/DatalayerNotebookExample.js +109 -0
  241. package/lib/examples2/NativeNavigationExample.d.ts +8 -0
  242. package/lib/examples2/NativeNavigationExample.js +97 -0
  243. package/lib/examples2/NotebookExample.d.ts +6 -0
  244. package/lib/examples2/NotebookExample.js +19 -0
  245. package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
  246. package/lib/examples2/NotebookMutationsKernel.js +105 -0
  247. package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
  248. package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
  249. package/lib/examples2/ReactRouterExample.d.ts +6 -0
  250. package/lib/examples2/ReactRouterExample.js +175 -0
  251. package/lib/examples2/example-selector.d.ts +22 -0
  252. package/lib/examples2/example-selector.js +45 -0
  253. package/lib/examples2/index.d.ts +2 -0
  254. package/lib/examples2/index.js +6 -0
  255. package/lib/examples2/lexical-theme.css +436 -0
  256. package/lib/examples2/main.d.ts +2 -0
  257. package/lib/examples2/main.js +330 -0
  258. package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
  259. package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
  260. package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
  261. package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
  262. package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
  263. package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
  264. package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
  265. package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
  266. package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
  267. package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
  268. package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
  269. package/lib/hooks/index.d.ts +9 -1
  270. package/lib/hooks/index.js +13 -1
  271. package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
  272. package/lib/hooks/useAIAgentsWebSocket.js +39 -3
  273. package/lib/hooks/useAgentRuntimes.d.ts +15 -3
  274. package/lib/hooks/useAgentRuntimes.js +186 -27
  275. package/lib/hooks/useAgentsService.js +5 -5
  276. package/lib/hooks/useCellOutputshot.d.ts +4 -0
  277. package/lib/hooks/useCellOutputshot.js +25 -0
  278. package/lib/hooks/useCheckpoints.d.ts +8 -8
  279. package/lib/hooks/useCheckpoints.js +36 -26
  280. package/lib/hooks/useConfig.d.ts +1 -1
  281. package/lib/hooks/useMonitoring.d.ts +7 -5
  282. package/lib/hooks/useMonitoring.js +16 -10
  283. package/lib/hooks/useNotifications.d.ts +11 -11
  284. package/lib/hooks/useNotifications.js +1 -1
  285. package/lib/hooks/useProgressStore.d.ts +25 -0
  286. package/lib/hooks/useProgressStore.js +58 -0
  287. package/lib/hooks/useProgressTask.d.ts +9 -0
  288. package/lib/hooks/useProgressTask.js +41 -0
  289. package/lib/hooks/useProjects.d.ts +628 -0
  290. package/lib/hooks/useProjects.js +190 -0
  291. package/lib/hooks/useRuntimes.d.ts +5 -0
  292. package/lib/hooks/useRuntimes.js +34 -0
  293. package/lib/hooks/useToolApprovals.d.ts +6 -6
  294. package/lib/index.d.ts +1 -0
  295. package/lib/index.js +1 -0
  296. package/lib/jupyter/exec/Python.d.ts +5 -0
  297. package/lib/jupyter/exec/Python.js +100 -0
  298. package/lib/jupyter/exec/Snippets.d.ts +105 -0
  299. package/lib/jupyter/exec/Snippets.js +101 -0
  300. package/lib/jupyter/exec/index.d.ts +2 -0
  301. package/lib/jupyter/exec/index.js +6 -0
  302. package/lib/jupyter/index.d.ts +2 -0
  303. package/lib/jupyter/index.js +6 -0
  304. package/lib/jupyter/kernelsHandler.d.ts +8 -0
  305. package/lib/jupyter/kernelsHandler.js +39 -0
  306. package/lib/mocks/models/CourseMock.d.ts +6 -0
  307. package/lib/mocks/models/CourseMock.js +29 -0
  308. package/lib/mocks/models/SpaceMock.d.ts +6 -0
  309. package/lib/mocks/models/SpaceMock.js +25 -0
  310. package/lib/models/Assignment.d.ts +7 -0
  311. package/lib/models/Assignment.js +5 -0
  312. package/lib/models/Cell.d.ts +8 -0
  313. package/lib/models/Cell.js +5 -0
  314. package/lib/models/CodeBlock.d.ts +10 -0
  315. package/lib/models/CodeBlock.js +5 -0
  316. package/lib/models/CodeSandboxSnapshot.d.ts +92 -0
  317. package/lib/models/CodeSandboxSnapshot.js +13 -0
  318. package/lib/models/CodeSandboxSnapshotDTO.d.ts +173 -0
  319. package/lib/models/CodeSandboxSnapshotDTO.js +139 -0
  320. package/lib/models/CodefeedBlocks.d.ts +7 -0
  321. package/lib/models/CodefeedBlocks.js +5 -0
  322. package/lib/models/Content.d.ts +5 -0
  323. package/lib/models/Content.js +5 -0
  324. package/lib/models/Course.d.ts +17 -0
  325. package/lib/models/Course.js +5 -0
  326. package/lib/models/Dataset.d.ts +16 -0
  327. package/lib/models/Dataset.js +5 -0
  328. package/lib/models/Document.d.ts +8 -0
  329. package/lib/models/Document.js +5 -0
  330. package/lib/models/Environment.d.ts +86 -0
  331. package/lib/models/Environment.js +5 -0
  332. package/lib/models/EnvironmentDTO.d.ts +125 -0
  333. package/lib/models/EnvironmentDTO.js +88 -0
  334. package/lib/models/Exercise.d.ts +16 -0
  335. package/lib/models/Exercise.js +5 -0
  336. package/lib/models/Item.d.ts +20 -0
  337. package/lib/models/Item.js +5 -0
  338. package/lib/models/ItemDTO.d.ts +74 -0
  339. package/lib/models/ItemDTO.js +186 -0
  340. package/lib/models/ItemType.d.ts +2 -0
  341. package/lib/models/ItemType.js +5 -0
  342. package/lib/models/Lesson.d.ts +5 -0
  343. package/lib/models/Lesson.js +5 -0
  344. package/lib/models/LexicalDTO.d.ts +155 -0
  345. package/lib/models/LexicalDTO.js +157 -0
  346. package/lib/models/Library.d.ts +10 -0
  347. package/lib/models/Library.js +5 -0
  348. package/lib/models/Notebook.d.ts +11 -0
  349. package/lib/models/Notebook.js +5 -0
  350. package/lib/models/NotebookDTO.d.ts +96 -0
  351. package/lib/models/NotebookDTO.js +153 -0
  352. package/lib/models/Page.d.ts +41 -0
  353. package/lib/models/Page.js +25 -0
  354. package/lib/models/PageTag.d.ts +19 -0
  355. package/lib/models/PageTag.js +94 -0
  356. package/lib/models/ProjectDTO.d.ts +89 -0
  357. package/lib/models/ProjectDTO.js +131 -0
  358. package/lib/models/Runtime.d.ts +160 -0
  359. package/lib/models/Runtime.js +18 -0
  360. package/lib/models/RuntimeDTO.d.ts +172 -0
  361. package/lib/models/RuntimeDTO.js +204 -0
  362. package/lib/models/Space.d.ts +35 -0
  363. package/lib/models/Space.js +66 -0
  364. package/lib/models/SpaceDTO.d.ts +334 -0
  365. package/lib/models/SpaceDTO.js +244 -0
  366. package/lib/models/SpaceItem.d.ts +10 -0
  367. package/lib/models/SpaceItem.js +5 -0
  368. package/lib/models/SpaceMember.d.ts +6 -0
  369. package/lib/models/SpaceMember.js +5 -0
  370. package/lib/models/StudentItem.d.ts +21 -0
  371. package/lib/models/StudentItem.js +5 -0
  372. package/lib/models/index.d.ts +32 -0
  373. package/lib/models/index.js +39 -0
  374. package/lib/protocols/AGUIAdapter.js +1 -1
  375. package/lib/runtimes/actions.d.ts +102 -0
  376. package/lib/runtimes/actions.js +249 -0
  377. package/lib/runtimes/apis.d.ts +273 -0
  378. package/lib/runtimes/apis.js +5 -0
  379. package/lib/runtimes/index.d.ts +5 -0
  380. package/lib/runtimes/index.js +9 -0
  381. package/lib/runtimes/settings.d.ts +15 -0
  382. package/lib/runtimes/settings.js +31 -0
  383. package/lib/runtimes/snapshots.d.ts +25 -0
  384. package/lib/runtimes/snapshots.js +150 -0
  385. package/lib/runtimes/utils.d.ts +7 -0
  386. package/lib/runtimes/utils.js +14 -0
  387. package/lib/services/DatalayerServiceManager.d.ts +23 -0
  388. package/lib/services/DatalayerServiceManager.js +90 -0
  389. package/lib/services/reconnectToRuntime.d.ts +32 -0
  390. package/lib/services/reconnectToRuntime.js +59 -0
  391. package/lib/services/sandboxServiceManagers.d.ts +31 -0
  392. package/lib/services/sandboxServiceManagers.js +57 -0
  393. package/lib/specs/agents/agents.d.ts +70 -26
  394. package/lib/specs/agents/agents.js +3994 -1639
  395. package/lib/specs/index.d.ts +1 -0
  396. package/lib/specs/index.js +1 -0
  397. package/lib/specs/loops.d.ts +34 -0
  398. package/lib/specs/loops.js +188 -0
  399. package/lib/specs/mcpServers.d.ts +1 -0
  400. package/lib/specs/mcpServers.js +17 -0
  401. package/lib/specs/models.d.ts +4 -0
  402. package/lib/specs/models.js +30 -0
  403. package/lib/specs/skills.d.ts +1 -0
  404. package/lib/specs/skills.js +18 -0
  405. package/lib/specs/tools.d.ts +15 -0
  406. package/lib/specs/tools.js +285 -0
  407. package/lib/state/index.d.ts +4 -0
  408. package/lib/state/index.js +10 -0
  409. package/lib/state/substates/CellState.d.ts +12 -0
  410. package/lib/state/substates/CellState.js +22 -0
  411. package/lib/state/substates/DocumentState.d.ts +10 -0
  412. package/lib/state/substates/DocumentState.js +14 -0
  413. package/lib/state/substates/GradeState.d.ts +10 -0
  414. package/lib/state/substates/GradeState.js +14 -0
  415. package/lib/state/substates/JupyterLabState.d.ts +16 -0
  416. package/lib/state/substates/JupyterLabState.js +17 -0
  417. package/lib/state/substates/NbformatState.d.ts +13 -0
  418. package/lib/state/substates/NbformatState.js +16 -0
  419. package/lib/state/substates/RuntimesState.d.ts +87 -0
  420. package/lib/state/substates/RuntimesState.js +192 -0
  421. package/lib/state/substates/SpaceState.d.ts +11 -0
  422. package/lib/state/substates/SpaceState.js +16 -0
  423. package/lib/state/substates/index.d.ts +8 -0
  424. package/lib/state/substates/index.js +14 -0
  425. package/lib/stores/agentRuntimeStore.d.ts +25 -2
  426. package/lib/stores/agentRuntimeStore.js +114 -19
  427. package/lib/stories/Button.stories.d.ts +1 -1
  428. package/lib/stories/Header.stories.d.ts +3 -3
  429. package/lib/test-setup.js +10 -0
  430. package/lib/types/agents-lifecycle.d.ts +5 -5
  431. package/lib/types/agents.d.ts +3 -3
  432. package/lib/types/agentspecs.d.ts +3 -1
  433. package/lib/types/chat.d.ts +135 -3
  434. package/lib/types/config.d.ts +19 -1
  435. package/lib/types/index.d.ts +1 -0
  436. package/lib/types/index.js +1 -0
  437. package/lib/types/loops.d.ts +64 -0
  438. package/lib/types/loops.js +5 -0
  439. package/lib/types/tools.d.ts +16 -0
  440. package/lib/utils/Cells.d.ts +2 -0
  441. package/lib/utils/Cells.js +28 -0
  442. package/package.json +24 -18
  443. package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
  444. package/scripts/codegen/generate_agents.py +21 -4
  445. package/scripts/codegen/generate_loops.py +443 -0
  446. package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
  447. package/lib/examples/A2UiComponentGalleryExample.js +0 -361
  448. /package/lib/{agent-lexical-main.d.ts → agent-document-main.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /*
3
3
  * Copyright (c) 2025-2026 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
@@ -16,9 +16,12 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
16
16
  * @module chat/base/ChatBase
17
17
  */
18
18
  import { useContext } from 'react';
19
- import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
20
- import { Text, Spinner } from '@primer/react';
21
- import { Box, setupPrimerPortals, useThemeStore, getColorPalette, } from '@datalayer/primer-addons';
19
+ import React, { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
20
+ import { Text, Spinner, IconButton } from '@primer/react';
21
+ import { SkeletonText } from '@primer/react/experimental';
22
+ import { SidebarExpandIcon } from '@primer/octicons-react';
23
+ import { notebookStore, JupyterReactTheme } from '@datalayer/jupyter-react';
24
+ import { Box, setupPrimerPortals, useThemeStore, getColorPalette, getThemeConfig, useSystemColorMode, } from '@datalayer/primer-addons';
22
25
  import { AlertIcon, PersonIcon } from '@primer/octicons-react';
23
26
  import { AiAgentIcon } from '@datalayer/icons-react';
24
27
  import { QueryClientProvider, QueryClientContext } from '@tanstack/react-query';
@@ -33,13 +36,99 @@ import { useAgentRuntimeWebSocket } from '../../hooks/useAgentRuntimes';
33
36
  import { agentRuntimeStore, useAgentRuntimeStore, useAgentRuntimeWsState, } from '../../stores/agentRuntimeStore';
34
37
  import { ChatBaseHeader } from '../header/ChatHeaderBase';
35
38
  import { ChatEmptyState } from '../display/EmptyState';
39
+ import { FloatingBrandButton } from '../display/FloatingBrandButton';
36
40
  import { PoweredByTag } from '../display/PoweredByTag';
37
41
  import { ChatMessageList, } from '../messages/ChatMessageList';
38
42
  import { InputToolbar } from '../prompt/InputFooter';
39
43
  import { ToolApprovalBanner, ToolApprovalDialog, } from '../tools';
44
+ import { EphemeralNotebook } from '../notebook/EphemeralNotebook';
45
+ // EphemeralDocument statically imports `@datalayer/jupyter-lexical` (which
46
+ // initialises Lumino-backed nodes on load). Lazy-load it so notebook-only chats
47
+ // never pull lexical into the bundle or trigger its module side effects.
48
+ const EphemeralDocument = React.lazy(() => import('../document/EphemeralDocument').then(m => ({
49
+ default: m.EphemeralDocument,
50
+ })));
51
+ import { useNotebookTools } from '../../tools/adapters/agent-runtimes/notebookHooks';
40
52
  // Tracks pending prompts already auto-sent for a given conversation scope.
41
53
  // This prevents layout-driven unmount/remount cycles from re-sending prompts.
42
54
  const sentPendingPromptKeys = new Set();
55
+ /**
56
+ * Inline skeleton placeholder rendered inside the companion surface (notebook
57
+ * or document) while the agent runtime is still launching and the real
58
+ * ephemeral notebook/document is not yet ready. Shown in place of the surface
59
+ * content (never as an overlay) so structure appears as early as possible.
60
+ */
61
+ function CompanionSurfaceSkeleton({ mode }) {
62
+ return (_jsx(Box, { "aria-label": mode === 'notebook' ? 'Preparing notebook…' : 'Preparing document…', sx: {
63
+ flex: 1,
64
+ minHeight: 0,
65
+ overflow: 'hidden',
66
+ display: 'flex',
67
+ flexDirection: 'column',
68
+ gap: 3,
69
+ p: 4,
70
+ }, children: mode === 'notebook' ? (_jsx(_Fragment, { children: [0, 1, 2].map(i => (_jsxs(Box, { sx: {
71
+ p: 3,
72
+ border: '1px solid',
73
+ borderColor: 'border.muted',
74
+ borderRadius: 2,
75
+ bg: 'canvas.subtle',
76
+ display: 'flex',
77
+ flexDirection: 'column',
78
+ gap: 2,
79
+ }, children: [_jsx(SkeletonText, { lines: 1 }), _jsx(SkeletonText, { lines: i === 0 ? 2 : 3 })] }, i))) })) : (_jsxs(Box, { sx: {
80
+ maxWidth: 860,
81
+ width: '100%',
82
+ mx: 'auto',
83
+ display: 'flex',
84
+ flexDirection: 'column',
85
+ gap: 3,
86
+ }, children: [_jsx(SkeletonText, { lines: 1 }), _jsx(SkeletonText, { lines: 4 }), _jsx(SkeletonText, { lines: 3 }), _jsx(SkeletonText, { lines: 5 })] })) }));
87
+ }
88
+ // JupyterReactTheme forwards unknown props (e.g. `style`) to its inner Primer
89
+ // `BaseStyles`. `style` is not part of its typings, so we widen the type here.
90
+ const ThemedJupyterReactTheme = JupyterReactTheme;
91
+ /**
92
+ * Theme boundary shared by every chat variant.
93
+ *
94
+ * Makes the chat follow the active Datalayer theme *variant* (matrix, earth,
95
+ * …) — its colours AND fonts — not merely the color mode, while keeping the
96
+ * jupyter-react Primer context required by `KernelIndicator`.
97
+ *
98
+ * Implementation notes:
99
+ * - We deliberately DON'T nest a `DatalayerThemeProvider` here. The host layout
100
+ * already provides one, and it themes Primer portals by writing styles onto
101
+ * `document.body`. Nesting another (especially one carrying layout styles
102
+ * like `display: contents`) clobbers those body/portal styles and breaks
103
+ * every overlay menu globally.
104
+ * - Instead we re-assert the variant's CSS custom properties (`--bgColor-*`,
105
+ * `--fgColor-*`, `--fontStack-*`, …) INLINE on `JupyterReactTheme`'s
106
+ * `BaseStyles`. Inline styles win over the `@primer/primitives`
107
+ * `[data-color-mode]` rules that `JupyterReactTheme` re-scopes, so the chat
108
+ * subtree renders in the selected theme (colours + fonts). `JupyterReactTheme`
109
+ * also supplies the matching Primer theme object + resolved color mode for
110
+ * jupyter-react components.
111
+ * - `display: contents` keeps the boundary from emitting a layout box (so the
112
+ * chat height/flex chain is preserved); CSS custom properties and inherited
113
+ * properties (color, font) still cascade through it.
114
+ */
115
+ function ThemedChatBoundary({ children }) {
116
+ const colorMode = useThemeStore(s => s.colorMode);
117
+ const themeVariant = useThemeStore(s => s.theme);
118
+ const systemMode = useSystemColorMode();
119
+ const themeConfig = getThemeConfig(themeVariant);
120
+ const resolvedMode = colorMode === 'auto' ? systemMode : colorMode;
121
+ const modeStyles = resolvedMode === 'dark'
122
+ ? themeConfig.themeStyles.dark
123
+ : themeConfig.themeStyles.light;
124
+ const themeBackground = modeStyles.backgroundColor ?? '';
125
+ return (_jsx(ThemedJupyterReactTheme, { colormode: resolvedMode, theme: themeConfig.primerTheme, backgroundColor: themeBackground, loadJupyterLabCss: false, style: {
126
+ ...modeStyles,
127
+ color: 'var(--fgColor-default)',
128
+ fontSize: 'var(--text-body-size-medium)',
129
+ display: 'contents',
130
+ }, children: children }));
131
+ }
43
132
  const AI_AGENTS_API_PREFIX = '/api/ai-agents/v1';
44
133
  const isDevTraceEnabled = () => {
45
134
  try {
@@ -203,23 +292,85 @@ function extractChatMessagesFromFullContext(fullContext) {
203
292
  return rawMessages
204
293
  .map((msg, index) => {
205
294
  const role = String(msg.role || '').toLowerCase();
206
- // Only hydrate conversational turns in the visible history.
207
- // System/tool messages may contain internal prompts and metadata.
208
- if (role !== 'user' && role !== 'assistant') {
209
- return null;
210
- }
211
295
  const timestampValue = typeof msg.timestamp === 'string' && msg.timestamp.length > 0
212
296
  ? msg.timestamp
213
297
  : new Date().toISOString();
214
- const createdAt = new Date(timestampValue);
215
- const content = typeof msg.content === 'string'
298
+ const createdAtRaw = new Date(timestampValue);
299
+ const createdAt = Number.isNaN(createdAtRaw.getTime())
300
+ ? new Date()
301
+ : createdAtRaw;
302
+ const rawContent = typeof msg.content === 'string'
216
303
  ? msg.content
217
304
  : JSON.stringify(msg.content ?? '');
305
+ const isToolCall = Boolean(msg.isToolCall);
306
+ const isToolResult = Boolean(msg.isToolResult);
307
+ const toolCallId = typeof msg.toolCallId === 'string' && msg.toolCallId.length > 0
308
+ ? msg.toolCallId
309
+ : undefined;
310
+ const toolName = typeof msg.toolName === 'string' && msg.toolName.length > 0
311
+ ? msg.toolName
312
+ : undefined;
313
+ // Tool-call turns arrive as assistant messages whose `content` is the
314
+ // JSON-encoded tool arguments. Reconstruct a structured `toolCalls`
315
+ // entry so it renders as a tool card (matching the live stream) instead
316
+ // of leaking raw JSON into the transcript.
317
+ if (isToolCall) {
318
+ let args = {};
319
+ if (rawContent) {
320
+ try {
321
+ const parsed = JSON.parse(rawContent);
322
+ if (parsed &&
323
+ typeof parsed === 'object' &&
324
+ !Array.isArray(parsed)) {
325
+ args = parsed;
326
+ }
327
+ }
328
+ catch {
329
+ args = {};
330
+ }
331
+ }
332
+ const resolvedToolCallId = toolCallId || `history-tc-${index}`;
333
+ return {
334
+ id: `history-toolcall-${index}-${timestampValue}`,
335
+ role: 'assistant',
336
+ content: '',
337
+ createdAt,
338
+ toolCalls: [
339
+ {
340
+ type: 'tool-call',
341
+ toolCallId: resolvedToolCallId,
342
+ toolName: toolName || 'tool',
343
+ args,
344
+ status: 'completed',
345
+ },
346
+ ],
347
+ };
348
+ }
349
+ // Tool results arrive as `role: 'tool'` messages; keep them (with the
350
+ // matching toolCallId) so `convertHistoryToDisplayItems` can merge the
351
+ // result into its tool card.
352
+ if (isToolResult || role === 'tool') {
353
+ return {
354
+ id: `history-toolresult-${index}-${timestampValue}`,
355
+ role: 'tool',
356
+ content: rawContent,
357
+ createdAt,
358
+ metadata: {
359
+ toolCallId,
360
+ toolName,
361
+ },
362
+ };
363
+ }
364
+ // Only hydrate conversational turns in the visible history.
365
+ // System messages may contain internal prompts and metadata.
366
+ if (role !== 'user' && role !== 'assistant') {
367
+ return null;
368
+ }
218
369
  return {
219
370
  id: `history-${role}-${index}-${timestampValue}`,
220
371
  role,
221
- content,
222
- createdAt: Number.isNaN(createdAt.getTime()) ? new Date() : createdAt,
372
+ content: rawContent,
373
+ createdAt,
223
374
  };
224
375
  })
225
376
  .filter((m) => m !== null);
@@ -281,7 +432,7 @@ function parseApprovedMcpToolsByServer(mcpStatusData) {
281
432
  * ChatBase component — Universal chat panel supporting store, protocol, and custom modes.
282
433
  */
283
434
  export function ChatBase(props) {
284
- const { agentRuntimeConfig, protocol: protocolProp, useStore: useStoreMode = true, } = props;
435
+ const { agentRuntimeConfig, protocol: protocolProp, useStore: useStoreMode = true, disableInternalJupyterTheme = false, } = props;
285
436
  // Resolve protocol: string Protocol overrides type in agentRuntimeConfig or
286
437
  // is combined with a full ProtocolConfig object.
287
438
  const protocolType = typeof protocolProp === 'string' ? protocolProp : undefined;
@@ -307,19 +458,21 @@ export function ChatBase(props) {
307
458
  protocol: protocol,
308
459
  useStore: effectiveUseStoreMode,
309
460
  };
461
+ const content = _jsx(ChatBaseInner, { ...innerProps });
462
+ const wrappedContent = disableInternalJupyterTheme ? (content) : (_jsx(ThemedChatBoundary, { children: content }));
310
463
  if (!existingQueryClient) {
311
- return (_jsx(QueryClientProvider, { client: internalQueryClient, children: _jsx(ChatBaseInner, { ...innerProps }) }));
464
+ return (_jsx(QueryClientProvider, { client: internalQueryClient, children: wrappedContent }));
312
465
  }
313
- return _jsx(ChatBaseInner, { ...innerProps });
466
+ return wrappedContent;
314
467
  }
315
468
  // ---------------------------------------------------------------------------
316
469
  // ChatBaseInner — contains all actual logic
317
470
  // ---------------------------------------------------------------------------
318
- function ChatBaseInner({ title, subtitle, showHeader = false, showTokenUsage = true, showLoadingIndicator = true, showErrors = true, showInput = true, showModelSelector = true, showToolsMenu = true, showSkillsMenu = true, disableInputPrompt = false, codemodeEnabled = false, onToggleCodemode, initialModel, availableModels, mcpServers, initialSkills: _initialSkills, className, loadingState, headerActions, kernelIndicatorState, kernel, kernelEnvironmentName, kernelCpu, kernelMemory, kernelGpu, chatViewMode, onChatViewModeChange,
471
+ function ChatBaseInner({ title, subtitle, showHeader = false, showTokenUsage = true, showLoadingIndicator = true, showErrors = true, showInput = true, showModelSelector = true, showToolsMenu = true, showSkillsMenu = true, disableInputPrompt = false, overlay, launching = false, launchingMessage, autoConnect = true, codemodeEnabled = false, onToggleCodemode, initialModel, availableModels, mcpServers, initialSkills: _initialSkills, className, loadingState, headerActions, kernelIndicatorState, kernel, kernelEnvironmentName, kernelCpu, kernelMemory, kernelGpu, chatViewMode, onChatViewModeChange,
319
472
  // Mode selection
320
473
  useStore: useStoreMode = true, protocol: protocolRaw, onSendMessage, enableStreaming = false,
321
474
  // Extended props
322
- brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderToolResult, footerContent, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools,
475
+ brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderToolResult, footerContent, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools: frontendToolsProp, enableEphemeralNotebook = false, initialEphemeralNotebookOpen = true, onEphemeralNotebookOpenChange, enableEphemeralDocument = false, initialEphemeralSurfaceMode, onEphemeralSurfaceModeChange, collapsed = false, onExpandFromCollapsed, ephemeralNotebookToolbar,
323
476
  // Tool invocation hooks
324
477
  onToolCallStart, onToolCallComplete,
325
478
  // Identity/Authorization props
@@ -344,10 +497,114 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
344
497
  const protocolConfig = typeof protocolRaw === 'object'
345
498
  ? protocolRaw
346
499
  : undefined;
347
- const configuredAiAgentsBaseUrl = useCoreStore((s) => s.configuration?.aiagentsRunUrl);
500
+ const configuredAiAgentsBaseUrl = useCoreStore((s) => s.configuration?.aiAgentsUrl);
348
501
  const activeAgentId = protocolConfig?.agentId || runtimeId;
349
502
  const historyScopeId = runtimeId || activeAgentId;
350
503
  const aiAgentsAuthToken = protocolConfig?.authToken;
504
+ // ── Ephemeral notebook (in-memory) ──────────────────────────────────────
505
+ // A stable notebook id scoped to this chat instance. Must match the id used
506
+ // by `useNotebookTools` so the agent's notebook tools drive this notebook.
507
+ const generatedNotebookIdRef = useRef(`ephemeral-notebook-${Math.random().toString(36).slice(2, 10)}`);
508
+ // Scope the ephemeral notebook to the STABLE runtime identity first (the pod
509
+ // name / route id that stays constant across navigation), falling back to the
510
+ // agent id. This keeps the persisted notebook model addressable by the same
511
+ // key when navigating away from and back to the same runtime page.
512
+ const notebookScopeId = runtimeId || protocolConfig?.agentId || activeAgentId;
513
+ const ephemeralNotebookId = notebookScopeId
514
+ ? `ephemeral-notebook-${notebookScopeId}`
515
+ : generatedNotebookIdRef.current;
516
+ const persistedEphemeralNbformat = useAgentRuntimeStore(s => s.getEphemeralNotebookModel(ephemeralNotebookId));
517
+ const setEphemeralNotebookModel = useAgentRuntimeStore(s => s.setEphemeralNotebookModel);
518
+ const handleEphemeralNotebookChange = useCallback((model) => {
519
+ setEphemeralNotebookModel(ephemeralNotebookId, model);
520
+ }, [ephemeralNotebookId, setEphemeralNotebookModel]);
521
+ // ── Ephemeral document (in-memory Lexical) ──────────────────────────────
522
+ // Scoped to the same stable runtime identity as the notebook so the persisted
523
+ // document survives navigation away from and back to the runtime page.
524
+ const ephemeralDocumentId = notebookScopeId
525
+ ? `ephemeral-document-${notebookScopeId}`
526
+ : `ephemeral-document-${generatedNotebookIdRef.current}`;
527
+ const persistedEphemeralDocument = useAgentRuntimeStore(s => s.getEphemeralDocumentModel(ephemeralDocumentId));
528
+ const setEphemeralDocumentModel = useAgentRuntimeStore(s => s.setEphemeralDocumentModel);
529
+ const handleEphemeralDocumentChange = useCallback((model) => {
530
+ setEphemeralDocumentModel(ephemeralDocumentId, model);
531
+ }, [ephemeralDocumentId, setEphemeralDocumentModel]);
532
+ // ── Companion surface mode (none / notebook / document) ─────────────────
533
+ const defaultSurfaceMode = initialEphemeralSurfaceMode ??
534
+ (enableEphemeralNotebook && initialEphemeralNotebookOpen
535
+ ? 'notebook'
536
+ : 'none');
537
+ const [ephemeralSurfaceMode, setEphemeralSurfaceMode] = useState(defaultSurfaceMode);
538
+ const handleEphemeralSurfaceModeChange = useCallback((mode) => {
539
+ setEphemeralSurfaceMode(mode);
540
+ onEphemeralSurfaceModeChange?.(mode);
541
+ // Back-compat: keep the legacy notebook open-state callback in sync.
542
+ onEphemeralNotebookOpenChange?.(mode === 'notebook');
543
+ }, [onEphemeralSurfaceModeChange, onEphemeralNotebookOpenChange]);
544
+ const notebookVisible = enableEphemeralNotebook && ephemeralSurfaceMode === 'notebook';
545
+ const documentVisible = enableEphemeralDocument && ephemeralSurfaceMode === 'document';
546
+ const surfaceVisible = notebookVisible || documentVisible;
547
+ const surfaceCollapsed = surfaceVisible && collapsed && Boolean(onExpandFromCollapsed);
548
+ // Track the ephemeral notebook's live kernel connection so the chat header
549
+ // renders the same rich `KernelIndicator` details (kernel id, client id,
550
+ // server/ws url, status) as the notebook editor. Without this the header
551
+ // falls back to the sandbox-status placeholder ("disconnected", "no-kernel").
552
+ const [notebookKernel, setNotebookKernel] = useState(null);
553
+ useEffect(() => {
554
+ if (!notebookVisible) {
555
+ setNotebookKernel(null);
556
+ return;
557
+ }
558
+ const readKernel = () => {
559
+ const notebook = notebookStore
560
+ .getState()
561
+ .selectNotebook(ephemeralNotebookId);
562
+ const adapter = notebook?.adapter;
563
+ return adapter?.kernel ?? null;
564
+ };
565
+ const sync = () => {
566
+ const next = readKernel();
567
+ setNotebookKernel(prev => (prev?.id === next?.id ? prev : next));
568
+ };
569
+ sync();
570
+ // Poll: the kernel connection appears asynchronously after the notebook
571
+ // mounts and can change on restart. Also react to store mutations.
572
+ const intervalId = window.setInterval(sync, 750);
573
+ const unsubscribe = notebookStore.subscribe(sync);
574
+ return () => {
575
+ window.clearInterval(intervalId);
576
+ unsubscribe();
577
+ };
578
+ }, [notebookVisible, ephemeralNotebookId]);
579
+ // When a companion surface is shown, the chat can be docked as a sidebar
580
+ // (default) or floated over it, driven by the header view-mode toggle.
581
+ const surfaceChatFloating = surfaceVisible &&
582
+ (chatViewMode === 'floating' || chatViewMode === 'floating-small');
583
+ // Notebook frontend tools are always created (hooks must be unconditional)
584
+ // but only merged into the tools sent to the agent while the notebook is
585
+ // visible, so the agent can manipulate the live notebook cells. Document
586
+ // (lexical) tools are reported upward by the lazily-loaded EphemeralDocument
587
+ // and merged in while the document is visible.
588
+ const notebookTools = useNotebookTools(ephemeralNotebookId);
589
+ const [documentTools, setDocumentTools] = useState([]);
590
+ const handleDocumentToolsReady = useCallback((tools) => {
591
+ setDocumentTools(tools);
592
+ }, []);
593
+ const frontendTools = useMemo(() => {
594
+ if (notebookVisible) {
595
+ return [...(frontendToolsProp || []), ...notebookTools];
596
+ }
597
+ if (documentVisible) {
598
+ return [...(frontendToolsProp || []), ...documentTools];
599
+ }
600
+ return frontendToolsProp;
601
+ }, [
602
+ notebookVisible,
603
+ documentVisible,
604
+ frontendToolsProp,
605
+ notebookTools,
606
+ documentTools,
607
+ ]);
351
608
  const aiAgentsBaseUrl = useMemo(() => normalizeAiAgentsBaseUrl(configuredAiAgentsBaseUrl || DEFAULT_SERVICE_URLS.AI_AGENTS), [configuredAiAgentsBaseUrl]);
352
609
  const aiAgentsApprovalWsRef = useRef(null);
353
610
  const resolvedToolCallSuppressionsRef = useRef(new Map());
@@ -806,8 +1063,10 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
806
1063
  const historyRetryAttemptsRef = useRef(new Map());
807
1064
  // Adapter-ready flag — flipped to true once the protocol adapter is initialised
808
1065
  const [adapterReady, setAdapterReady] = useState(false);
809
- // Guard so the pending prompt is sent at most once
810
- const pendingPromptSentRef = useRef(false);
1066
+ // Guard so each distinct pending prompt is sent at most once. Stores the
1067
+ // last-sent key (not a boolean) so that changing `pendingPrompt` to a new
1068
+ // value — e.g. re-submitting an interactive surface — triggers a fresh send.
1069
+ const pendingPromptSentRef = useRef(null);
811
1070
  const pendingPromptKey = pendingPrompt &&
812
1071
  [
813
1072
  runtimeId || historyEndpoint || protocol?.endpoint || protocol?.agentId,
@@ -826,8 +1085,13 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
826
1085
  const [_enabledTools, setEnabledTools] = useState([]);
827
1086
  const wsState = useAgentRuntimeWsState();
828
1087
  // ---- Data queries ----
829
- const configQuery = useConfig(Boolean(protocol?.enableConfigQuery), protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
830
- const skillsQuery = useSkills(Boolean(protocol?.enableConfigQuery) && showSkillsMenu, protocol?.configEndpoint, protocol?.authToken);
1088
+ // Config-derived queries (models, skills, context, sandbox) must only run
1089
+ // once the runtime endpoint exists. `autoConnect` is our single signal for
1090
+ // "endpoint ready", so we gate every config query on it to avoid firing
1091
+ // requests at a not-yet-created runtime during the launch overlay.
1092
+ const configQueriesEnabled = Boolean(protocol?.enableConfigQuery) && autoConnect;
1093
+ const configQuery = useConfig(configQueriesEnabled, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
1094
+ const skillsQuery = useSkills(configQueriesEnabled && showSkillsMenu, protocol?.configEndpoint, protocol?.authToken);
831
1095
  const { enableSkill: wsEnableSkill, disableSkill: wsDisableSkill, approveSkill: wsApproveSkill, unapproveSkill: wsUnapproveSkill, } = useSkillActions(activeAgentId);
832
1096
  // Optimistic skill-approval overrides so inline approval updates the
833
1097
  // Skills selector immediately before the next WS snapshot lands.
@@ -895,9 +1159,9 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
895
1159
  });
896
1160
  return set;
897
1161
  }, [localSkillApproval, skillsQuery.data]);
898
- const contextSnapshotQuery = useContextSnapshot(Boolean(protocol?.enableConfigQuery) && showTokenUsage, protocol?.configEndpoint, protocol?.agentId, protocol?.authToken);
1162
+ const contextSnapshotQuery = useContextSnapshot(configQueriesEnabled && showTokenUsage, protocol?.configEndpoint, protocol?.agentId, protocol?.authToken);
899
1163
  const agentUsage = externalContextSnapshot ?? contextSnapshotQuery.data;
900
- const sandboxStatusQuery = useSandbox(Boolean(protocol?.enableConfigQuery) && showHeader, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
1164
+ const sandboxStatusQuery = useSandbox(configQueriesEnabled && showHeader, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
901
1165
  // ---- Refs ----
902
1166
  const adapterRef = useRef(null);
903
1167
  const unsubscribeRef = useRef(null);
@@ -1568,6 +1832,11 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
1568
1832
  useEffect(() => {
1569
1833
  if (!protocol)
1570
1834
  return;
1835
+ // Skip opening a protocol connection when auto-connect is disabled (e.g.
1836
+ // the runtime endpoint is still being created). The chat shell, companion
1837
+ // surface and launching overlay still render; we simply do not connect.
1838
+ if (!autoConnect)
1839
+ return;
1571
1840
  const adapter = createProtocolAdapter(protocol);
1572
1841
  if (!adapter)
1573
1842
  return;
@@ -1925,7 +2194,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
1925
2194
  adapterRef.current?.disconnect();
1926
2195
  };
1927
2196
  // eslint-disable-next-line react-hooks/exhaustive-deps
1928
- }, [protocolKey, onStateUpdate, useStoreMode]);
2197
+ }, [protocolKey, onStateUpdate, useStoreMode, autoConnect]);
1929
2198
  // Helper to run a frontend tool and send result back via adapter
1930
2199
  function executeFrontendTool(toolHandler, toolCallMsg, toolCallId) {
1931
2200
  (async () => {
@@ -2139,17 +2408,21 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
2139
2408
  ]);
2140
2409
  // Send pending prompt once history loaded and adapter/handler available
2141
2410
  useEffect(() => {
2142
- if (!pendingPrompt || pendingPromptSentRef.current)
2411
+ if (!pendingPrompt)
2143
2412
  return;
2413
+ // Already handled this exact prompt in the current component instance.
2414
+ if (pendingPromptKey && pendingPromptSentRef.current === pendingPromptKey) {
2415
+ return;
2416
+ }
2144
2417
  if (pendingPromptKey && sentPendingPromptKeys.has(pendingPromptKey)) {
2145
- pendingPromptSentRef.current = true;
2418
+ pendingPromptSentRef.current = pendingPromptKey;
2146
2419
  return;
2147
2420
  }
2148
2421
  if (!historyLoaded)
2149
2422
  return;
2150
2423
  if (!adapterReady && !onSendMessage)
2151
2424
  return;
2152
- pendingPromptSentRef.current = true;
2425
+ pendingPromptSentRef.current = pendingPromptKey ?? null;
2153
2426
  if (pendingPromptKey) {
2154
2427
  sentPendingPromptKeys.add(pendingPromptKey);
2155
2428
  }
@@ -2533,10 +2806,33 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
2533
2806
  protocol.enableConfigQuery === false ||
2534
2807
  !!configQuery.data ||
2535
2808
  !!skillsQuery.data;
2809
+ const resolvedDescription = description || configQuery.data?.welcomeMessage || '';
2810
+ const serverSuggestions = configQuery.data?.suggestions;
2811
+ const resolvedSuggestions = suggestions && suggestions.length > 0
2812
+ ? suggestions
2813
+ : Array.isArray(serverSuggestions) && serverSuggestions.length > 0
2814
+ ? serverSuggestions
2815
+ .map(item => String(item || '').trim())
2816
+ .filter(Boolean)
2817
+ .map(item => ({ title: item, message: item }))
2818
+ : undefined;
2819
+ const messagesContent = children ? (children) : (_jsx(Box, { sx: {
2820
+ display: 'flex',
2821
+ flexDirection: 'column',
2822
+ minHeight: 0,
2823
+ bg: 'canvas.default',
2824
+ }, children: _jsx(ChatMessageList, { displayItems: displayItems, isLoading: isLoading, isStreaming: isStreaming, showLoadingIndicator: showLoadingIndicator, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: defaultAvatarConfig, padding: padding, renderToolResult: renderToolResult, approvalConfig: approvalConfig, messagesEndRef: messagesEndRef, onRespond: handleRespond, emptyContent: launching ? null : (_jsx(ChatEmptyState, { emptyState: emptyState, brandIcon: brandIcon, description: resolvedDescription, suggestions: resolvedSuggestions, submitOnSuggestionClick: submitOnSuggestionClick, onSuggestionSubmit: handleSuggestionSubmit, onSuggestionFill: handleSuggestionFill })) }) }));
2825
+ const inputToolbar = showInput ? (_jsx(InputToolbar, { input: input, setInput: setInput, isLoading: isLoading, kernelStatus: liveKernelStatus, connectionConfirmed: connectionConfirmed, placeholder: placeholder, autoFocus: autoFocus, focusTrigger: focusTrigger, padding: padding, onSend: () => handleSend(), onStop: handleStop, disableInputPrompt: disableInputPrompt || !!overlay || launching, showTokenUsage: showTokenUsage, agentUsage: agentUsage, showModelSelector: showModelSelector, showToolsMenu: showToolsMenu, showSkillsMenu: showSkillsMenu, codemodeEnabled: codemodeEnabled, onToggleCodemode: onToggleCodemode, isA2AProtocol: isA2AProtocol, hasConfigData: !!configQuery.data, hasSkillsData: !!skillsQuery.data, models: availableModels || configQuery.data?.models || [], selectedModel: selectedModel, onModelSelect: setSelectedModel, availableTools: configQuery.data?.builtinTools || [], mcpServers: filteredMcpServers, enabledMcpTools: enabledMcpTools, enabledMcpToolCount: getEnabledMcpToolNames().length, onToggleMcpTool: toggleMcpTool, onToggleAllMcpServerTools: toggleAllMcpServerTools, approvedMcpTools: approvedMcpTools, onToggleMcpToolApproval: toggleMcpToolApproval, skills: skillsQuery.data?.skills || [], skillsLoading: !!skillsQuery.isLoading, enabledSkills: enabledSkills, onToggleSkill: toggleSkill, onToggleAllSkills: toggleAllSkills, approvedSkills: approvedSkills, onToggleSkillApproval: toggleSkillApproval, apiBase: indicatorApiBase, authToken: protocol?.authToken, mcpStatusData: effectiveMcpStatusData })) : null;
2826
+ // Shared header element. It is rendered either at the top of the chat (when
2827
+ // no ephemeral notebook is shown) or INSIDE the chat body column (when the
2828
+ // notebook is visible) so the header always follows the chat body across all
2829
+ // view modes (docked sidebar, floating popup, floating-small).
2830
+ const chatHeaderElement = showHeader ? (_jsx(ChatBaseHeader, { title: title, subtitle: subtitle, brandIcon: brandIcon, headerContent: headerContent, headerActions: headerActions, showInformation: showInformation, onInformationClick: onInformationClick, padding: padding, kernelIndicatorState: kernelIndicatorState, runtimeStatus: sandboxStatusData ?? sandboxStatusQuery.data, kernel: notebookVisible ? (notebookKernel ?? kernel) : kernel, kernelEnvironmentName: kernelEnvironmentName, kernelCpu: kernelCpu, kernelMemory: kernelMemory, kernelGpu: kernelGpu, headerButtons: headerButtons, messageCount: messages.length, onNewChat: handleNewChat, onClear: handleClear, chatViewMode: chatViewMode, onChatViewModeChange: onChatViewModeChange, showEphemeralSurfaceControl: enableEphemeralNotebook || enableEphemeralDocument, enableEphemeralNotebookOption: enableEphemeralNotebook, enableEphemeralDocumentOption: enableEphemeralDocument, ephemeralSurfaceMode: ephemeralSurfaceMode, onEphemeralSurfaceModeChange: handleEphemeralSurfaceModeChange })) : null;
2536
2831
  // ========================================================================
2537
2832
  // Render
2538
2833
  // ========================================================================
2539
2834
  return (_jsxs(Box, { className: className, sx: {
2835
+ position: 'relative',
2540
2836
  display: 'flex',
2541
2837
  flexDirection: 'column',
2542
2838
  height: '100%',
@@ -2547,7 +2843,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
2547
2843
  border,
2548
2844
  boxShadow,
2549
2845
  overflow: 'hidden',
2550
- }, children: [showHeader && (_jsx(ChatBaseHeader, { title: title, subtitle: subtitle, brandIcon: brandIcon, headerContent: headerContent, headerActions: headerActions, showInformation: showInformation, onInformationClick: onInformationClick, padding: padding, kernelIndicatorState: kernelIndicatorState, runtimeStatus: sandboxStatusData ?? sandboxStatusQuery.data, kernel: kernel, kernelEnvironmentName: kernelEnvironmentName, kernelCpu: kernelCpu, kernelMemory: kernelMemory, kernelGpu: kernelGpu, headerButtons: headerButtons, messageCount: messages.length, onNewChat: handleNewChat, onClear: handleClear, chatViewMode: chatViewMode, onChatViewModeChange: onChatViewModeChange })), showToolApprovalBanner &&
2846
+ }, children: [!surfaceVisible && chatHeaderElement, showToolApprovalBanner &&
2551
2847
  pendingApprovals &&
2552
2848
  pendingApprovals.length > 0 && (_jsx(ToolApprovalBannerSection, { pendingApprovals: pendingApprovals, onApprove: handleBannerApprove, onReject: handleBannerReject })), showErrors && error && (_jsxs(Box, { sx: {
2553
2849
  display: 'flex',
@@ -2557,18 +2853,112 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
2557
2853
  bg: 'danger.subtle',
2558
2854
  borderBottom: '1px solid',
2559
2855
  borderColor: 'danger.muted',
2560
- }, children: [_jsx(AlertIcon, { size: 16 }), _jsx(Text, { sx: { color: 'danger.fg', fontSize: 1 }, children: error.message })] })), _jsx(Box, { ref: messagesContainerRef, sx: {
2856
+ }, children: [_jsx(AlertIcon, { size: 16 }), _jsx(Text, { sx: { color: 'danger.fg', fontSize: 1 }, children: error.message })] })), surfaceVisible ? (_jsxs(Box, { sx: {
2561
2857
  flex: 1,
2562
- flexGrow: 1,
2563
2858
  minHeight: 0,
2859
+ display: 'flex',
2860
+ overflow: 'hidden',
2861
+ position: 'relative',
2862
+ }, children: [_jsx(Box, { sx: {
2863
+ flex: 1,
2864
+ minWidth: 0,
2865
+ minHeight: 0,
2866
+ display: 'flex',
2867
+ flexDirection: 'column',
2868
+ overflow: 'hidden',
2869
+ ...(surfaceChatFloating
2870
+ ? null
2871
+ : surfaceCollapsed
2872
+ ? null
2873
+ : {
2874
+ borderRight: '1px solid',
2875
+ borderColor: 'border.default',
2876
+ }),
2877
+ }, children: launching || overlay ? (_jsx(CompanionSurfaceSkeleton, { mode: notebookVisible ? 'notebook' : 'document' })) : notebookVisible ? (_jsx(EphemeralNotebook, { notebookId: ephemeralNotebookId, runtimePodName: runtimeId || activeAgentId, nbformat: persistedEphemeralNbformat ?? undefined, onNbformatChange: handleEphemeralNotebookChange, toolbarComponent: ephemeralNotebookToolbar })) : (_jsx(React.Suspense, { fallback: null, children: _jsx(EphemeralDocument, { documentId: ephemeralDocumentId, runtimePodName: runtimeId || activeAgentId, content: persistedEphemeralDocument ?? undefined, onContentChange: handleEphemeralDocumentChange, onToolsReady: handleDocumentToolsReady }) })) }), !surfaceCollapsed && (_jsxs(Box, { sx: surfaceChatFloating
2878
+ ? {
2879
+ position: 'absolute',
2880
+ right: 16,
2881
+ width: chatViewMode === 'floating-small' ? 360 : 440,
2882
+ maxWidth: 'calc(100% - 32px)',
2883
+ ...(chatViewMode === 'floating-small'
2884
+ ? { bottom: 16, height: '62%' }
2885
+ : { top: 16, bottom: 16 }),
2886
+ display: 'flex',
2887
+ flexDirection: 'column',
2888
+ minHeight: 0,
2889
+ overflow: 'hidden',
2890
+ bg: 'canvas.default',
2891
+ border: '1px solid',
2892
+ borderColor: 'border.default',
2893
+ borderRadius: 2,
2894
+ boxShadow: 'shadow.large',
2895
+ zIndex: 5,
2896
+ }
2897
+ : {
2898
+ flexShrink: 0,
2899
+ width: 440,
2900
+ minWidth: 320,
2901
+ maxWidth: '48%',
2902
+ minHeight: 0,
2903
+ display: 'flex',
2904
+ flexDirection: 'column',
2905
+ overflow: 'hidden',
2906
+ bg: 'canvas.default',
2907
+ }, children: [chatHeaderElement, _jsx(Box, { ref: messagesContainerRef, sx: {
2908
+ flex: 1,
2909
+ minHeight: 0,
2910
+ overflow: 'auto',
2911
+ bg: 'canvas.default',
2912
+ }, children: messagesContent }), footerContent, inputToolbar] })), surfaceCollapsed &&
2913
+ onExpandFromCollapsed &&
2914
+ (chatViewMode === 'sidebar' ? (_jsx(Box, { sx: {
2915
+ position: 'absolute',
2916
+ top: 8,
2917
+ right: 8,
2918
+ zIndex: 6,
2919
+ }, children: _jsx(IconButton, { icon: SidebarExpandIcon, "aria-label": "Open chat", onClick: onExpandFromCollapsed, variant: "default", size: "small" }) })) : (_jsx(FloatingBrandButton, { isOpen: false, onToggle: onExpandFromCollapsed, position: "bottom-right", tooltip: "Open chat" })))] })) : (_jsxs(_Fragment, { children: [_jsx(Box, { ref: messagesContainerRef, sx: {
2920
+ flex: 1,
2921
+ flexGrow: 1,
2922
+ minHeight: 0,
2923
+ overflow: 'auto',
2924
+ bg: 'canvas.default',
2925
+ }, children: messagesContent }), footerContent, inputToolbar] })), showPoweredBy && _jsx(PoweredByTag, { ...poweredByProps }), overlay && (_jsxs(Box, { sx: {
2926
+ position: 'absolute',
2927
+ inset: 0,
2928
+ zIndex: 20,
2929
+ display: 'flex',
2930
+ alignItems: 'center',
2931
+ justifyContent: 'center',
2932
+ p: 3,
2564
2933
  overflow: 'auto',
2565
- bg: 'canvas.default',
2566
- }, children: children ? (children) : (_jsx(Box, { sx: {
2567
- display: 'flex',
2568
- flexDirection: 'column',
2569
- minHeight: 0,
2570
- bg: 'canvas.default',
2571
- }, children: _jsx(ChatMessageList, { displayItems: displayItems, isLoading: isLoading, isStreaming: isStreaming, showLoadingIndicator: showLoadingIndicator, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: defaultAvatarConfig, padding: padding, renderToolResult: renderToolResult, approvalConfig: approvalConfig, messagesEndRef: messagesEndRef, onRespond: handleRespond, emptyContent: _jsx(ChatEmptyState, { emptyState: emptyState, brandIcon: brandIcon, description: description, suggestions: suggestions, submitOnSuggestionClick: submitOnSuggestionClick, onSuggestionSubmit: handleSuggestionSubmit, onSuggestionFill: handleSuggestionFill }) }) })) }), footerContent, showInput && (_jsx(InputToolbar, { input: input, setInput: setInput, isLoading: isLoading, kernelStatus: liveKernelStatus, connectionConfirmed: connectionConfirmed, placeholder: placeholder, autoFocus: autoFocus, focusTrigger: focusTrigger, padding: padding, onSend: () => handleSend(), onStop: handleStop, disableInputPrompt: disableInputPrompt, showTokenUsage: showTokenUsage, agentUsage: agentUsage, showModelSelector: showModelSelector, showToolsMenu: showToolsMenu, showSkillsMenu: showSkillsMenu, codemodeEnabled: codemodeEnabled, onToggleCodemode: onToggleCodemode, isA2AProtocol: isA2AProtocol, hasConfigData: !!configQuery.data, hasSkillsData: !!skillsQuery.data, models: availableModels || configQuery.data?.models || [], selectedModel: selectedModel, onModelSelect: setSelectedModel, availableTools: configQuery.data?.builtinTools || [], mcpServers: filteredMcpServers, enabledMcpTools: enabledMcpTools, enabledMcpToolCount: getEnabledMcpToolNames().length, onToggleMcpTool: toggleMcpTool, onToggleAllMcpServerTools: toggleAllMcpServerTools, approvedMcpTools: approvedMcpTools, onToggleMcpToolApproval: toggleMcpToolApproval, skills: skillsQuery.data?.skills || [], skillsLoading: !!skillsQuery.isLoading, enabledSkills: enabledSkills, onToggleSkill: toggleSkill, onToggleAllSkills: toggleAllSkills, approvedSkills: approvedSkills, onToggleSkillApproval: toggleSkillApproval, apiBase: indicatorApiBase, authToken: protocol?.authToken, mcpStatusData: effectiveMcpStatusData })), showPoweredBy && _jsx(PoweredByTag, { ...poweredByProps })] }));
2934
+ }, children: [_jsx(Box, { "aria-hidden": true, sx: {
2935
+ position: 'absolute',
2936
+ inset: 0,
2937
+ bg: 'canvas.default',
2938
+ opacity: 0.4,
2939
+ backdropFilter: 'blur(1px)',
2940
+ } }), _jsx(Box, { sx: { position: 'relative', zIndex: 1, maxWidth: '100%' }, children: overlay })] })), launching && !overlay && (_jsxs(Box, { sx: {
2941
+ position: 'absolute',
2942
+ inset: 0,
2943
+ zIndex: 15,
2944
+ display: 'flex',
2945
+ alignItems: 'center',
2946
+ justifyContent: 'center',
2947
+ p: 3,
2948
+ }, children: [_jsx(Box, { "aria-hidden": true, sx: {
2949
+ position: 'absolute',
2950
+ inset: 0,
2951
+ bg: 'canvas.default',
2952
+ opacity: 0.35,
2953
+ backdropFilter: 'blur(1px)',
2954
+ } }), _jsxs(Box, { sx: {
2955
+ position: 'relative',
2956
+ zIndex: 1,
2957
+ display: 'flex',
2958
+ flexDirection: 'column',
2959
+ alignItems: 'center',
2960
+ gap: 3,
2961
+ }, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: launchingMessage || 'Launching your agent…' })] })] }))] }));
2572
2962
  }
2573
2963
  /**
2574
2964
  * Internal component rendering the top-of-chat approval banner + review dialog.