mito-ai 0.1.43__py3-none-any.whl → 0.1.44__py3-none-any.whl

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.

Potentially problematic release.


This version of mito-ai might be problematic. Click here for more details.

Files changed (52) hide show
  1. mito_ai/__init__.py +3 -3
  2. mito_ai/_version.py +1 -1
  3. mito_ai/{app_builder → app_deploy}/__init__.py +1 -1
  4. mito_ai/{app_builder → app_deploy}/handlers.py +39 -28
  5. mito_ai/{app_builder → app_deploy}/models.py +13 -13
  6. mito_ai/app_manager/handlers.py +33 -0
  7. mito_ai/app_manager/models.py +15 -1
  8. mito_ai/completions/handlers.py +13 -0
  9. mito_ai/completions/models.py +4 -1
  10. mito_ai/completions/prompt_builders/agent_system_message.py +6 -4
  11. mito_ai/completions/providers.py +5 -11
  12. mito_ai/streamlit_conversion/streamlit_agent_handler.py +1 -1
  13. mito_ai/streamlit_conversion/streamlit_utils.py +10 -0
  14. mito_ai/streamlit_preview/handlers.py +47 -71
  15. mito_ai/streamlit_preview/utils.py +41 -0
  16. mito_ai/tests/streamlit_preview/test_streamlit_preview_handler.py +88 -0
  17. mito_ai/tests/streamlit_preview/test_streamlit_preview_manager.py +4 -1
  18. mito_ai/utils/telemetry_utils.py +15 -5
  19. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  20. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  21. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  22. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -5
  23. mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.81703ac2bc645e5c2fc2.js → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.cf2e3ad2797fbb53826b.js +1202 -701
  24. mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.cf2e3ad2797fbb53826b.js.map +1 -0
  25. mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.502aef26f0416fab7435.js → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.5482493d1270f55b7283.js +5 -5
  26. mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.502aef26f0416fab7435.js.map → mito_ai-0.1.44.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.5482493d1270f55b7283.js.map +1 -1
  27. {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/METADATA +1 -1
  28. {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/RECORD +51 -49
  29. mito_ai-0.1.43.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.81703ac2bc645e5c2fc2.js.map +0 -1
  30. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  31. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  32. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  33. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  34. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  35. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  36. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js +0 -0
  37. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js.map +0 -0
  38. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js +0 -0
  39. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js.map +0 -0
  40. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  41. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  42. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  43. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  44. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js +0 -0
  45. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js.map +0 -0
  46. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  47. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  48. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  49. {mito_ai-0.1.43.data → mito_ai-0.1.44.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  50. {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/WHEEL +0 -0
  51. {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/entry_points.txt +0 -0
  52. {mito_ai-0.1.43.dist-info → mito_ai-0.1.44.dist-info}/licenses/LICENSE +0 -0
@@ -213,9 +213,10 @@ __webpack_require__.r(__webpack_exports__);
213
213
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
214
214
  /* harmony export */ ChatHistoryManager: () => (/* binding */ ChatHistoryManager)
215
215
  /* harmony export */ });
216
- /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
217
- /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
218
- /* harmony import */ var _utils_user__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/user */ "./lib/utils/user.js");
216
+ /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
217
+ /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
218
+ /* harmony import */ var _utils_user__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/user */ "./lib/utils/user.js");
219
+ /* harmony import */ var _validationUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validationUtils */ "./lib/Extensions/AiChat/validationUtils.js");
219
220
  /*
220
221
  * Copyright (c) Saga Inc.
221
222
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -223,6 +224,7 @@ __webpack_require__.r(__webpack_exports__);
223
224
 
224
225
 
225
226
 
227
+
226
228
  /*
227
229
  The ChatHistoryManager is responsible for managing the AI chat history.
228
230
 
@@ -271,6 +273,11 @@ class ChatHistoryManager {
271
273
  this._allAssumptions.clear();
272
274
  this.displayOptimizedChatHistory.forEach(item => {
273
275
  var _a;
276
+ // Validate the agent response if it exists
277
+ if (item.agentResponse !== undefined) {
278
+ item.agentResponse = (0,_validationUtils__WEBPACK_IMPORTED_MODULE_0__.validateAndCorrectAgentResponse)(item.agentResponse);
279
+ }
280
+ // Process the assumptions
274
281
  if ((_a = item.agentResponse) === null || _a === void 0 ? void 0 : _a.analysis_assumptions) {
275
282
  item.agentResponse.analysis_assumptions.forEach(assumption => {
276
283
  this._allAssumptions.add(assumption);
@@ -308,12 +315,13 @@ class ChatHistoryManager {
308
315
  });
309
316
  }
310
317
  async addChatInputMessage(input, activeThreadId, messageIndex, additionalContext) {
311
- const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellCode)(this.notebookTracker) || '';
312
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(this.notebookTracker) || '';
318
+ const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellCode)(this.notebookTracker) || '';
319
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker) || '';
320
+ const activeNotebookContext = this.contextManager.getActiveNotebookContext();
313
321
  const chatMessageMetadata = {
314
322
  promptType: 'chat',
315
- variables: this.contextManager.variables,
316
- files: this.contextManager.files,
323
+ variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
324
+ files: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files) || [],
317
325
  activeCellCode: activeCellCode,
318
326
  activeCellId: activeCellID,
319
327
  input: input,
@@ -330,16 +338,17 @@ class ChatHistoryManager {
330
338
  });
331
339
  return chatMessageMetadata;
332
340
  }
333
- addAgentExecutionMessage(activeThreadId, input, additionalContext) {
334
- const aiOptimizedCells = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getAIOptimizedCells)(this.notebookTracker);
341
+ addAgentExecutionMessage(activeThreadId, notebookPanel, input, additionalContext) {
342
+ const aiOptimizedCells = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getAIOptimizedCellsInNotebookPanel)(notebookPanel);
343
+ const notebookContext = this.contextManager.getNotebookContext(notebookPanel.id);
335
344
  const agentExecutionMetadata = {
336
345
  promptType: 'agent:execution',
337
- variables: this.contextManager.variables,
338
- files: this.contextManager.files,
346
+ variables: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.variables) || [],
347
+ files: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.files) || [],
339
348
  aiOptimizedCells: aiOptimizedCells,
340
349
  input: input || '',
341
350
  threadId: activeThreadId,
342
- isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_1__.isChromeBasedBrowser)(),
351
+ isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_2__.isChromeBasedBrowser)(),
343
352
  additionalContext: additionalContext
344
353
  };
345
354
  // We use this function in two ways:
@@ -364,16 +373,14 @@ class ChatHistoryManager {
364
373
  });
365
374
  return agentExecutionMetadata;
366
375
  }
367
- dropMessagesStartingAtIndex(index) {
368
- this.displayOptimizedChatHistory.splice(index);
369
- }
370
376
  addSmartDebugMessage(activeThreadId, errorMessage) {
371
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(this.notebookTracker) || '';
372
- const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellCodeByID)(this.notebookTracker, activeCellID) || '';
377
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker) || '';
378
+ const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByID)(this.notebookTracker, activeCellID) || '';
379
+ const activeNotebookContext = this.contextManager.getActiveNotebookContext();
373
380
  const smartDebugMetadata = {
374
381
  promptType: 'smartDebug',
375
- variables: this.contextManager.variables,
376
- files: this.contextManager.files,
382
+ variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
383
+ files: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files) || [],
377
384
  activeCellCode: activeCellCode,
378
385
  activeCellId: activeCellID,
379
386
  errorMessage: errorMessage,
@@ -387,18 +394,19 @@ class ChatHistoryManager {
387
394
  });
388
395
  return smartDebugMetadata;
389
396
  }
390
- addAgentSmartDebugMessage(activeThreadId, errorMessage) {
391
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(this.notebookTracker);
392
- const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellCode)(this.notebookTracker);
397
+ addAgentSmartDebugMessage(activeThreadId, errorMessage, notebookPanel) {
398
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
399
+ const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByIDInNotebookPanel)(notebookPanel, activeCellID);
400
+ const notebookContext = this.contextManager.getNotebookContext(notebookPanel.id);
393
401
  const agentSmartDebugMetadata = {
394
402
  promptType: 'agent:autoErrorFixup',
395
- aiOptimizedCells: (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getAIOptimizedCells)(this.notebookTracker),
396
- variables: this.contextManager.variables,
397
- files: this.contextManager.files,
403
+ aiOptimizedCells: (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getAIOptimizedCellsInNotebookPanel)(notebookPanel),
404
+ variables: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.variables) || [],
405
+ files: (notebookContext === null || notebookContext === void 0 ? void 0 : notebookContext.files) || [],
398
406
  errorMessage: errorMessage,
399
407
  error_message_producing_code_cell_id: activeCellID || '',
400
408
  threadId: activeThreadId,
401
- isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_1__.isChromeBasedBrowser)()
409
+ isChromeBrowser: (0,_utils_user__WEBPACK_IMPORTED_MODULE_2__.isChromeBasedBrowser)()
402
410
  };
403
411
  this.displayOptimizedChatHistory.push({
404
412
  message: getDisplayedOptimizedUserMessage(errorMessage, activeCellCode),
@@ -409,11 +417,12 @@ class ChatHistoryManager {
409
417
  return agentSmartDebugMetadata;
410
418
  }
411
419
  addExplainCodeMessage(activeThreadId) {
412
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(this.notebookTracker);
413
- const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellCodeByID)(this.notebookTracker, activeCellID);
420
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker);
421
+ const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getCellCodeByID)(this.notebookTracker, activeCellID);
422
+ const activeNotebookContext = this.contextManager.getActiveNotebookContext();
414
423
  const codeExplainMetadata = {
415
424
  promptType: 'codeExplain',
416
- variables: this.contextManager.variables,
425
+ variables: (activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables) || [],
417
426
  activeCellCode,
418
427
  threadId: activeThreadId
419
428
  };
@@ -440,7 +449,7 @@ class ChatHistoryManager {
440
449
  else {
441
450
  type = 'openai message';
442
451
  }
443
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(this.notebookTracker);
452
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(this.notebookTracker);
444
453
  this.displayOptimizedChatHistory.push({
445
454
  message: aiMessage,
446
455
  type: type,
@@ -467,13 +476,14 @@ class ChatHistoryManager {
467
476
  }
468
477
  addAIMessageFromAgentResponse(agentResponse) {
469
478
  var _a;
479
+ agentResponse = (0,_validationUtils__WEBPACK_IMPORTED_MODULE_0__.validateAndCorrectAgentResponse)(agentResponse);
470
480
  let content = agentResponse.message;
471
481
  if (agentResponse.type === 'cell_update') {
472
482
  // For cell_update messages, we want to display the code the agent wrote along with
473
483
  // the message it sent. For all other agent responses, we ignore all other fields
474
484
  // and just display the message.
475
485
  const code = (_a = agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code;
476
- const codeWithMarkdownFormatting = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.addMarkdownCodeFormatting)(code);
486
+ const codeWithMarkdownFormatting = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_3__.addMarkdownCodeFormatting)(code);
477
487
  if (codeWithMarkdownFormatting !== undefined) {
478
488
  content = content + '\n\n' + codeWithMarkdownFormatting;
479
489
  }
@@ -489,6 +499,9 @@ class ChatHistoryManager {
489
499
  agentResponse: this.deduplicateAssumptions(agentResponse)
490
500
  });
491
501
  }
502
+ dropMessagesStartingAtIndex(index) {
503
+ this.displayOptimizedChatHistory.splice(index);
504
+ }
492
505
  }
493
506
  const getDisplayedOptimizedUserMessage = (input, activeCellCode, messageToAgent = false) => {
494
507
  // Don't include the active cell code if it is an agent planning message
@@ -686,7 +699,29 @@ __webpack_require__.r(__webpack_exports__);
686
699
 
687
700
 
688
701
 
689
- const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, isDropdownFromButton = false, onFilterChange, onClose, }) => {
702
+ const priortizeByType = (options, maxPerType) => {
703
+ /*
704
+ Makes sure that some of each type are displayed at the top of the dropdown so
705
+ users can easily see what types of options are available to them.
706
+ */
707
+ const typeCounts = {};
708
+ const prioritizedOptions = [];
709
+ const extraOptions = [];
710
+ for (const option of options) {
711
+ const type = option.type;
712
+ const currentCount = typeCounts[type] || 0;
713
+ if (currentCount < maxPerType) {
714
+ prioritizedOptions.push(option);
715
+ typeCounts[type] = currentCount + 1;
716
+ }
717
+ else {
718
+ extraOptions.push(option);
719
+ }
720
+ }
721
+ // Return prioritized options first, then extras at the bottom
722
+ return [...prioritizedOptions, ...extraOptions];
723
+ };
724
+ const ChatDropdown = ({ options, onSelect, filterText, isDropdownFromButton = false, onFilterChange, onClose, }) => {
690
725
  const [selectedIndex, setSelectedIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);
691
726
  const [localFilterText, setLocalFilterText] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filterText);
692
727
  const searchInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
@@ -761,7 +796,7 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
761
796
  variable: variable
762
797
  })),
763
798
  ];
764
- const filteredOptions = allOptions.filter((option) => {
799
+ let searchFilteredOptions = allOptions.filter((option) => {
765
800
  if (option.type === 'variable') {
766
801
  return option.variable.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase()) &&
767
802
  option.variable.type !== "<class 'module'>" &&
@@ -777,7 +812,12 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
777
812
  else {
778
813
  return option.rule.toLowerCase().includes(effectiveFilterText.toLowerCase());
779
814
  }
780
- }).slice(0, maxDropdownItems);
815
+ });
816
+ // If user is searching (has filter text), show all matches
817
+ // Otherwise, show only 3 of each type by default
818
+ if (effectiveFilterText.trim() === '') {
819
+ searchFilteredOptions = priortizeByType(searchFilteredOptions, 3);
820
+ }
781
821
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
782
822
  setSelectedIndex(0);
783
823
  }, [options, rules, effectiveFilterText]);
@@ -786,18 +826,18 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
786
826
  case 'ArrowDown':
787
827
  case 'Down':
788
828
  event.preventDefault();
789
- setSelectedIndex((prev) => prev < filteredOptions.length - 1 ? prev + 1 : 0);
829
+ setSelectedIndex((prev) => prev < searchFilteredOptions.length - 1 ? prev + 1 : 0);
790
830
  break;
791
831
  case 'ArrowUp':
792
832
  case 'Up':
793
833
  event.preventDefault();
794
- setSelectedIndex((prev) => prev > 0 ? prev - 1 : filteredOptions.length - 1);
834
+ setSelectedIndex((prev) => prev > 0 ? prev - 1 : searchFilteredOptions.length - 1);
795
835
  break;
796
836
  case 'Enter':
797
837
  case 'Return':
798
838
  case 'Tab': {
799
839
  event.preventDefault();
800
- const selectedOption = filteredOptions[selectedIndex];
840
+ const selectedOption = searchFilteredOptions[selectedIndex];
801
841
  if (selectedOption !== undefined) {
802
842
  if (selectedOption.type === 'variable') {
803
843
  onSelect(selectedOption);
@@ -813,7 +853,7 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
813
853
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
814
854
  document.addEventListener('keydown', handleKeyDown);
815
855
  return () => document.removeEventListener('keydown', handleKeyDown);
816
- }, [filteredOptions, selectedIndex]);
856
+ }, [searchFilteredOptions, selectedIndex]);
817
857
  // Handle click outside to close dropdown
818
858
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
819
859
  const handleClickOutside = (event) => {
@@ -851,8 +891,8 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
851
891
  isDropdownFromButton && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-dropdown-search" },
852
892
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, type: "text", placeholder: "Search variables and rules...", value: localFilterText, onChange: handleSearchInputChange, onKeyDown: handleSearchInputKeyDown, className: "chat-dropdown-search-input" }))),
853
893
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "chat-dropdown-list", "data-testid": "chat-dropdown-list" },
854
- filteredOptions.length === 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { className: "chat-dropdown-item", "data-testid": "chat-dropdown-empty-item" }, "No variables found")),
855
- filteredOptions.map((option, index) => {
894
+ searchFilteredOptions.length === 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { className: "chat-dropdown-item", "data-testid": "chat-dropdown-empty-item" }, "No variables found")),
895
+ searchFilteredOptions.map((option, index) => {
856
896
  switch (option.type) {
857
897
  case 'variable': {
858
898
  const uniqueKey = option.variable.parent_df
@@ -990,7 +1030,6 @@ __webpack_require__.r(__webpack_exports__);
990
1030
  const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditing, contextManager, notebookTracker, agentModeEnabled = false, agentExecutionStatus = 'idle', }) => {
991
1031
  var _a;
992
1032
  const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialContent);
993
- const [expandedVariables, setExpandedVariables] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
994
1033
  const textAreaRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
995
1034
  const [activeCellID, setActiveCellID] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_notebook__WEBPACK_IMPORTED_MODULE_3__.getActiveCellID)(notebookTracker));
996
1035
  const activeCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_3__.getActiveCellCode)(notebookTracker) || '';
@@ -1175,22 +1214,22 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1175
1214
  });
1176
1215
  return result;
1177
1216
  };
1178
- // Update the expandedVariables arr when the variable manager changes
1179
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
1217
+ const getExpandedVarialbes = () => {
1218
+ const activeNotebookContext = contextManager === null || contextManager === void 0 ? void 0 : contextManager.getActiveNotebookContext();
1180
1219
  const expandedVariables = [
1181
1220
  // Add base variables (excluding DataFrames)
1182
- ...((contextManager === null || contextManager === void 0 ? void 0 : contextManager.variables.filter(variable => variable.type !== "pd.DataFrame")) || []),
1221
+ ...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter(variable => variable.type !== "pd.DataFrame")) || []),
1183
1222
  // Add DataFrames
1184
- ...((contextManager === null || contextManager === void 0 ? void 0 : contextManager.variables.filter((variable) => variable.type === "pd.DataFrame")) || []),
1223
+ ...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter((variable) => variable.type === "pd.DataFrame")) || []),
1185
1224
  // Add series with parent DataFrame references
1186
- ...((contextManager === null || contextManager === void 0 ? void 0 : contextManager.variables.filter((variable) => variable.type === "pd.DataFrame").flatMap((df) => Object.entries(df.value).map(([seriesName, _]) => ({
1225
+ ...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables.filter((variable) => variable.type === "pd.DataFrame").flatMap((df) => Object.entries(df.value).map(([seriesName, _]) => ({
1187
1226
  variable_name: seriesName,
1188
1227
  type: "col",
1189
1228
  value: "replace_me",
1190
1229
  parent_df: df.variable_name,
1191
1230
  })))) || []),
1192
1231
  // Add files
1193
- ...((contextManager === null || contextManager === void 0 ? void 0 : contextManager.files.map(file => {
1232
+ ...((activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files.map(file => {
1194
1233
  var _a;
1195
1234
  return ({
1196
1235
  variable_name: file.file_name,
@@ -1200,8 +1239,8 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1200
1239
  });
1201
1240
  })) || [])
1202
1241
  ];
1203
- setExpandedVariables(expandedVariables);
1204
- }, [contextManager === null || contextManager === void 0 ? void 0 : contextManager.variables, contextManager === null || contextManager === void 0 ? void 0 : contextManager.files]);
1242
+ return expandedVariables;
1243
+ };
1205
1244
  // Automatically add active cell context when in Chat mode and there's active cell code
1206
1245
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
1207
1246
  if (!agentModeEnabled) {
@@ -1263,7 +1302,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1263
1302
  }
1264
1303
  }
1265
1304
  } }),
1266
- isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_9__["default"], { options: expandedVariables, onSelect: handleOptionSelect, filterText: dropdownFilter, isDropdownFromButton: isDropdownFromButton, onFilterChange: setDropdownFilter, onClose: handleDropdownClose }))),
1305
+ isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_9__["default"], { options: getExpandedVarialbes(), onSelect: handleOptionSelect, filterText: dropdownFilter, isDropdownFromButton: isDropdownFromButton, onFilterChange: setDropdownFilter, onClose: handleDropdownClose }))),
1267
1306
  isEditing &&
1268
1307
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "message-edit-buttons" },
1269
1308
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => onSave(input, undefined, mapAdditionalContext()) }, "Save"),
@@ -1383,11 +1422,11 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1383
1422
  if (messagePart.length > 14) {
1384
1423
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
1385
1424
  message.role === 'user' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_UserCodeBlock__WEBPACK_IMPORTED_MODULE_7__["default"], { code: messagePart, renderMimeRegistry: renderMimeRegistry, agentModeEnabled: agentModeEnabled })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__["default"], { code: messagePart, codeSummary: (_b = (_a = agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code_summary) !== null && _b !== void 0 ? _b : ((agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'run_all_cells' ? 'Running all cells' : undefined), isCodeComplete: isCodeComplete, renderMimeRegistry: renderMimeRegistry, previewAICode: previewAICode, acceptAICode: acceptAICode, rejectAICode: rejectAICode, isLastAiMessage: isLastAiMessage, codeReviewStatus: codeReviewStatus, agentModeEnabled: agentModeEnabled })),
1386
- isLastAiMessage && isCodeComplete && codeReviewStatus === 'chatPreview' &&
1425
+ !agentModeEnabled && isLastAiMessage && isCodeComplete && codeReviewStatus === 'chatPreview' &&
1387
1426
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-message-buttons' },
1388
1427
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => { previewAICode(); }, text: 'Overwrite Active Cell', icon: _icons_PlayButtonIcon__WEBPACK_IMPORTED_MODULE_10__["default"], title: 'Write the Ai generated code to the active cell in the jupyter notebook, replacing the current code.', variant: 'gray', width: 'fit-contents' }),
1389
1428
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => { void (0,_utils_copyToClipboard__WEBPACK_IMPORTED_MODULE_11__["default"])(messagePart); }, text: 'Copy', icon: _icons_CopyIcon__WEBPACK_IMPORTED_MODULE_12__["default"], title: 'Copy the Ai generated code to your clipboard', variant: 'gray', width: 'fit-contents' })),
1390
- isLastAiMessage && isCodeComplete && codeReviewStatus === 'codeCellPreview' &&
1429
+ !agentModeEnabled && isLastAiMessage && isCodeComplete && codeReviewStatus === 'codeCellPreview' &&
1391
1430
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-message-buttons' },
1392
1431
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_13__["default"], { onClick: () => { acceptAICode(); }, text: `Accept code ${operatingSystem === 'mac' ? '⌘Y' : 'Ctrl+Y'}`, title: 'Accept the Ai generated code', variant: 'green', width: 'fit-contents' }),
1393
1432
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_13__["default"], { onClick: () => { rejectAICode(); }, text: `Reject code ${operatingSystem === 'mac' ? '⌘U' : 'Ctrl+U'}`, title: 'Reject the Ai generated code and revert to the previous version of the code cell', variant: 'red', width: 'fit-contents' })),
@@ -1468,7 +1507,7 @@ const Citation = ({ citationIndex, cellId, line, notebookTracker }) => {
1468
1507
  // we set the end line to the start line if only a single line number is provided.
1469
1508
  const lineEnd = typeof line === 'number' ? line : line.end;
1470
1509
  // Scroll to the cell and highlight the lines
1471
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_2__.scrollToAndHighlightCell)(notebookTracker, cellId, lineStart, lineEnd);
1510
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_2__.scrollToAndHighlightCell)(notebookTracker.currentWidget, cellId, lineStart, lineEnd);
1472
1511
  };
1473
1512
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "citation-button", onClick: handleClick, title: getLineDisplayText(line) }, citationIndex));
1474
1513
  };
@@ -1958,42 +1997,43 @@ __webpack_require__.r(__webpack_exports__);
1958
1997
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__);
1959
1998
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
1960
1999
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__);
1961
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
1962
- /* harmony import */ var _components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../components/AgentComponents/ErrorFixupToolUI */ "./lib/components/AgentComponents/ErrorFixupToolUI.js");
1963
- /* harmony import */ var _components_DropdownMenu__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../components/DropdownMenu */ "./lib/components/DropdownMenu.js");
1964
- /* harmony import */ var _components_IconButton__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../components/IconButton */ "./lib/components/IconButton.js");
1965
- /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
1966
- /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
2000
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
2001
+ /* harmony import */ var _components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../components/AgentComponents/ErrorFixupToolUI */ "./lib/components/AgentComponents/ErrorFixupToolUI.js");
2002
+ /* harmony import */ var _components_DropdownMenu__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../components/DropdownMenu */ "./lib/components/DropdownMenu.js");
2003
+ /* harmony import */ var _components_IconButton__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../components/IconButton */ "./lib/components/IconButton.js");
2004
+ /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
1967
2005
  /* harmony import */ var _components_ModelSelector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/ModelSelector */ "./lib/components/ModelSelector.js");
1968
- /* harmony import */ var _components_NextStepsPills__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../components/NextStepsPills */ "./lib/components/NextStepsPills.js");
1969
- /* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
1970
- /* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
1971
- /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
1972
- /* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
1973
- /* harmony import */ var _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../icons/UndoIcon */ "./lib/icons/UndoIcon.js");
2006
+ /* harmony import */ var _components_NextStepsPills__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../components/NextStepsPills */ "./lib/components/NextStepsPills.js");
2007
+ /* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
2008
+ /* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
2009
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
2010
+ /* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
2011
+ /* harmony import */ var _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../icons/UndoIcon */ "./lib/icons/UndoIcon.js");
1974
2012
  /* harmony import */ var _utils_agentActions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils/agentActions */ "./lib/utils/agentActions.js");
1975
2013
  /* harmony import */ var _utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../utils/blacklistedWords */ "./lib/utils/blacklistedWords.js");
1976
2014
  /* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/checkpoint */ "./lib/utils/checkpoint.js");
1977
- /* harmony import */ var _utils_chatHistory__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../utils/chatHistory */ "./lib/utils/chatHistory.js");
1978
- /* harmony import */ var _utils_codeDiff__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../utils/codeDiff */ "./lib/utils/codeDiff.js");
1979
- /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
2015
+ /* harmony import */ var _utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../utils/chatHistory */ "./lib/utils/chatHistory.js");
2016
+ /* harmony import */ var _utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../utils/codeDiff */ "./lib/utils/codeDiff.js");
2017
+ /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
2018
+ /* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
1980
2019
  /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
1981
2020
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
1982
2021
  /* harmony import */ var _utils_waitForNotebookReady__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/waitForNotebookReady */ "./lib/utils/waitForNotebookReady.js");
1983
2022
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
1984
- /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
2023
+ /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
1985
2024
  /* harmony import */ var _SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../SettingsManager/profiler/ProfilerPage */ "./lib/Extensions/SettingsManager/profiler/ProfilerPage.js");
1986
- /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
1987
- /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
2025
+ /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
2026
+ /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
1988
2027
  /* harmony import */ var _FirstMessage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FirstMessage */ "./lib/Extensions/AiChat/FirstMessage.js");
1989
- /* harmony import */ var _ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./ChatMessage/ChatInput */ "./lib/Extensions/AiChat/ChatMessage/ChatInput.js");
1990
- /* harmony import */ var _ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./ChatMessage/ChatMessage */ "./lib/Extensions/AiChat/ChatMessage/ChatMessage.js");
1991
- /* harmony import */ var _ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./ChatMessage/RevertQuestionnaire */ "./lib/Extensions/AiChat/ChatMessage/RevertQuestionnaire.js");
1992
- /* harmony import */ var _ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ChatMessage/ScrollableSuggestions */ "./lib/Extensions/AiChat/ChatMessage/ScrollableSuggestions.js");
2028
+ /* harmony import */ var _ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ChatMessage/ChatInput */ "./lib/Extensions/AiChat/ChatMessage/ChatInput.js");
2029
+ /* harmony import */ var _ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./ChatMessage/ChatMessage */ "./lib/Extensions/AiChat/ChatMessage/ChatMessage.js");
2030
+ /* harmony import */ var _ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ChatMessage/RevertQuestionnaire */ "./lib/Extensions/AiChat/ChatMessage/RevertQuestionnaire.js");
2031
+ /* harmony import */ var _ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ChatMessage/ScrollableSuggestions */ "./lib/Extensions/AiChat/ChatMessage/ScrollableSuggestions.js");
1993
2032
  /* harmony import */ var _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ChatHistoryManager */ "./lib/Extensions/AiChat/ChatHistoryManager.js");
1994
2033
  /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
1995
2034
  /* harmony import */ var _style_ChatTaskpane_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/ChatTaskpane.css */ "./style/ChatTaskpane.css");
1996
2035
  /* harmony import */ var _style_TextButton_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../style/TextButton.css */ "./style/TextButton.css");
2036
+ /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
1997
2037
  /*
1998
2038
  * Copyright (c) Saga Inc.
1999
2039
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -2015,7 +2055,6 @@ __webpack_require__.r(__webpack_exports__);
2015
2055
 
2016
2056
 
2017
2057
 
2018
-
2019
2058
  // Internal imports - Icons
2020
2059
 
2021
2060
 
@@ -2033,6 +2072,7 @@ __webpack_require__.r(__webpack_exports__);
2033
2072
 
2034
2073
 
2035
2074
 
2075
+
2036
2076
  // Internal imports - Chat components
2037
2077
 
2038
2078
 
@@ -2046,12 +2086,14 @@ __webpack_require__.r(__webpack_exports__);
2046
2086
 
2047
2087
 
2048
2088
 
2089
+
2049
2090
  const AGENT_EXECUTION_DEPTH_LIMIT = 20;
2050
2091
  const getDefaultChatHistoryManager = (notebookTracker, contextManager) => {
2051
2092
  const chatHistoryManager = new _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__.ChatHistoryManager(contextManager, notebookTracker);
2052
2093
  return chatHistoryManager;
2053
2094
  };
2054
2095
  const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app, operatingSystem, websocketClient, }) => {
2096
+ var _a;
2055
2097
  const [chatHistoryManager, setChatHistoryManager] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(() => getDefaultChatHistoryManager(notebookTracker, contextManager));
2056
2098
  const chatHistoryManagerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(chatHistoryManager);
2057
2099
  const [loadingAIResponse, setLoadingAIResponse] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);
@@ -2097,6 +2139,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2097
2139
  3. idle: the agent is idle
2098
2140
  */
2099
2141
  const [agentExecutionStatus, setAgentExecutionStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('idle');
2142
+ const agentTargetNotebookPanelRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);
2100
2143
  // We use a ref to always access the most up-to-date value during a function's execution. Refs immediately reflect changes,
2101
2144
  // unlike state variables, which are captured at the beginning of a function and may not reflect updates made during execution.
2102
2145
  const shouldContinueAgentExecution = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(true);
@@ -2381,13 +2424,16 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2381
2424
  await _sendMessageAndSaveResponse(smartDebugCompletionRequest, newChatHistoryManager);
2382
2425
  };
2383
2426
  const sendAgentSmartDebugMessage = async (errorMessage) => {
2427
+ if (agentTargetNotebookPanelRef.current === null) {
2428
+ return;
2429
+ }
2384
2430
  // Step 0: reset the state for a new message
2385
2431
  resetForNewMessage();
2386
2432
  // Enable follow mode when sending agent debug message (same behavior as other modes)
2387
2433
  setAutoScrollFollowMode(true);
2388
2434
  // Step 1: Create message metadata
2389
2435
  const newChatHistoryManager = getDuplicateChatHistoryManager();
2390
- const agentSmartDebugMessage = newChatHistoryManager.addAgentSmartDebugMessage(activeThreadIdRef.current, errorMessage);
2436
+ const agentSmartDebugMessage = newChatHistoryManager.addAgentSmartDebugMessage(activeThreadIdRef.current, errorMessage, agentTargetNotebookPanelRef.current);
2391
2437
  setChatHistoryManager(newChatHistoryManager);
2392
2438
  setLoadingAIResponse(true);
2393
2439
  // Step 2: Send the message to the AI
@@ -2422,17 +2468,21 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2422
2468
  const sendAgentExecutionMessage = async (input, messageIndex, sendCellIDOutput = undefined, additionalContext) => {
2423
2469
  // Step 0: reset the state for a new message
2424
2470
  resetForNewMessage();
2471
+ const agentTargetNotebookPanel = agentTargetNotebookPanelRef.current;
2472
+ if (agentTargetNotebookPanel === null) {
2473
+ return;
2474
+ }
2425
2475
  // Step 1: Add the user's message to the chat history
2426
2476
  const newChatHistoryManager = getDuplicateChatHistoryManager();
2427
2477
  if (messageIndex !== undefined) {
2428
2478
  // Drop all of the messages starting at the message index
2429
2479
  newChatHistoryManager.dropMessagesStartingAtIndex(messageIndex);
2430
2480
  }
2431
- const agentExecutionMetadata = newChatHistoryManager.addAgentExecutionMessage(activeThreadIdRef.current, input, additionalContext);
2481
+ const agentExecutionMetadata = newChatHistoryManager.addAgentExecutionMessage(activeThreadIdRef.current, agentTargetNotebookPanel, input, additionalContext);
2432
2482
  if (messageIndex !== undefined) {
2433
2483
  agentExecutionMetadata.index = messageIndex;
2434
2484
  }
2435
- agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutput)(notebookTracker, sendCellIDOutput);
2485
+ agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutputInNotebook)(agentTargetNotebookPanel, sendCellIDOutput);
2436
2486
  setChatHistoryManager(newChatHistoryManager);
2437
2487
  setLoadingAIResponse(true);
2438
2488
  // Step 2: Send the message to the AI
@@ -2468,7 +2518,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2468
2518
  // Add the active cell output to the metadata afterwards setting the chatHistoryManager so that
2469
2519
  // we don't have to wait on turning the output into a base64 image before we can add the user's message
2470
2520
  // to the chat.
2471
- const activeCellOutput = await (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.getActiveCellOutput)(notebookTracker);
2521
+ const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__.getActiveCellOutput)(notebookTracker);
2472
2522
  if (activeCellOutput !== undefined) {
2473
2523
  chatMessageMetadata.base64EncodedActiveCellOutput = activeCellOutput;
2474
2524
  }
@@ -2629,6 +2679,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2629
2679
  setAgentExecutionStatus('idle');
2630
2680
  };
2631
2681
  const startAgentExecution = async (input, messageIndex, additionalContext) => {
2682
+ agentTargetNotebookPanelRef.current = notebookTracker.currentWidget;
2632
2683
  await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.createCheckpoint)(app, setHasCheckpoint);
2633
2684
  setAgentExecutionStatus('working');
2634
2685
  // Enable follow mode when user starts agent execution
@@ -2673,6 +2724,11 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2673
2724
  }
2674
2725
  }
2675
2726
  const agentResponse = aiDisplayOptimizedChatItem === null || aiDisplayOptimizedChatItem === void 0 ? void 0 : aiDisplayOptimizedChatItem.agentResponse;
2727
+ if (agentTargetNotebookPanelRef.current === null) {
2728
+ // If the agent target notebook panel is not set, we don't know where to run the code so we stop
2729
+ isAgentFinished = true;
2730
+ break;
2731
+ }
2676
2732
  if (agentResponse === undefined) {
2677
2733
  // If the agent response is undefined, we need to send a message to the agent
2678
2734
  isAgentFinished = true;
@@ -2690,8 +2746,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2690
2746
  }
2691
2747
  if (agentResponse.type === 'cell_update' && agentResponse.cell_update) {
2692
2748
  // Run the code and handle any errors
2693
- await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.acceptAndRunCellUpdate)(agentResponse.cell_update, notebookTracker, app, previewAICodeToActiveCell, acceptAICode);
2694
- const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(notebookTracker, app, getDuplicateChatHistoryManager, addAIMessageFromResponseAndUpdateState, sendAgentSmartDebugMessage, previewAICodeToActiveCell, acceptAICode, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
2749
+ await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.acceptAndRunCellUpdate)(agentResponse.cell_update, agentTargetNotebookPanelRef.current);
2750
+ const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
2695
2751
  if (status === 'interupted') {
2696
2752
  break;
2697
2753
  }
@@ -2711,12 +2767,12 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2711
2767
  sendCellIDOutput = agentResponse.get_cell_output_cell_id;
2712
2768
  }
2713
2769
  if (agentResponse.type === 'run_all_cells') {
2714
- const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.runAllCells)(app, notebookTracker);
2770
+ const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.runAllCells)(app, agentTargetNotebookPanelRef.current);
2715
2771
  // If run_all_cells resulted in an error, handle it through the error fixup process
2716
2772
  if (!result.success && result.errorMessage && result.errorCellId) {
2717
2773
  // Set the error cell as active so the error retry logic can work with it
2718
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.setActiveCellByID)(notebookTracker, result.errorCellId);
2719
- const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(notebookTracker, app, getDuplicateChatHistoryManager, addAIMessageFromResponseAndUpdateState, sendAgentSmartDebugMessage, previewAICodeToActiveCell, acceptAICode, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
2774
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByIDInNotebookPanel)(agentTargetNotebookPanelRef.current, result.errorCellId);
2775
+ const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
2720
2776
  if (status === 'interupted') {
2721
2777
  break;
2722
2778
  }
@@ -2736,33 +2792,33 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2736
2792
  if (!aiMessage) {
2737
2793
  return;
2738
2794
  }
2739
- const updateCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.getCellCodeByID)(notebookTracker, updateCellID);
2795
+ const updateCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellCodeByID)(notebookTracker, updateCellID);
2740
2796
  if (updateCellID === undefined || updateCellCode === undefined) {
2741
2797
  return;
2742
2798
  }
2743
2799
  // Extract the code from the AI's message and then calculate the code diffs
2744
2800
  const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.getCodeBlockFromMessage)(aiMessage);
2745
2801
  const aiGeneratedCodeCleaned = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.removeMarkdownCodeFormatting)(aiGeneratedCode || '');
2746
- const { unifiedCodeString, unifiedDiffs } = (0,_utils_codeDiff__WEBPACK_IMPORTED_MODULE_19__.getCodeDiffsAndUnifiedCodeString)(updateCellCode, aiGeneratedCodeCleaned);
2802
+ const { unifiedCodeString, unifiedDiffs } = (0,_utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__.getCodeDiffsAndUnifiedCodeString)(updateCellCode, aiGeneratedCodeCleaned);
2747
2803
  // Store the code cell ID where we write the code diffs so that we can
2748
2804
  // accept or reject the code diffs to the correct cell
2749
2805
  cellStateBeforeDiff.current = { codeCellID: updateCellID, code: updateCellCode };
2750
2806
  // Temporarily write the unified code string to the active cell so we can display
2751
2807
  // the code diffs to the user
2752
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.writeCodeToCellByID)(notebookTracker, unifiedCodeString, updateCellID);
2808
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, unifiedCodeString, updateCellID);
2753
2809
  updateCodeCellsExtensions(unifiedDiffs);
2754
2810
  // Briefly highlight the code cell to draw the user's attention to it
2755
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.highlightCodeCell)(notebookTracker, updateCellID);
2811
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.highlightCodeCell)(notebookTracker, updateCellID);
2756
2812
  };
2757
2813
  const displayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
2758
2814
  const previewAICodeToActiveCell = () => {
2759
2815
  setCodeReviewStatus('codeCellPreview');
2760
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.getActiveCellID)(notebookTracker);
2816
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getActiveCellID)(notebookTracker);
2761
2817
  const lastAIDisplayMessage = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
2762
2818
  if (activeCellID === undefined || lastAIDisplayMessage === undefined) {
2763
2819
  return;
2764
2820
  }
2765
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.scrollToCell)(notebookTracker, activeCellID, undefined, 'end');
2821
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.scrollToCell)(notebookTracker.currentWidget, activeCellID, undefined, 'end');
2766
2822
  updateCodeDiffStripes(lastAIDisplayMessage.message, activeCellID);
2767
2823
  updateCellToolbarButtons();
2768
2824
  };
@@ -2781,10 +2837,10 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2781
2837
  // Write to the cell that has the code diffs
2782
2838
  writeCodeToCellAndTurnOffDiffs(aiGeneratedCode, targetCellID);
2783
2839
  // Focus on the active cell after the code is written
2784
- const targetCell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.getCellByID)(notebookTracker, targetCellID);
2840
+ const targetCell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellByID)(notebookTracker, targetCellID);
2785
2841
  if (targetCell) {
2786
2842
  // Make the target cell the active cell
2787
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.setActiveCellByID)(notebookTracker, targetCellID);
2843
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByID)(notebookTracker, targetCellID);
2788
2844
  // Focus on the active cell
2789
2845
  targetCell.activate();
2790
2846
  }
@@ -2810,7 +2866,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2810
2866
  updateCodeCellsExtensions(undefined);
2811
2867
  cellStateBeforeDiff.current = undefined;
2812
2868
  if (codeCellID !== undefined) {
2813
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.writeCodeToCellByID)(notebookTracker, code, codeCellID);
2869
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, code, codeCellID);
2814
2870
  updateCellToolbarButtons();
2815
2871
  }
2816
2872
  };
@@ -2821,17 +2877,17 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2821
2877
  the first time we create the chat. Registering the command when it is already created causes
2822
2878
  errors.
2823
2879
  */
2824
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE, {
2880
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE, {
2825
2881
  execute: () => {
2826
2882
  previewAICodeToActiveCell();
2827
2883
  }
2828
2884
  });
2829
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_APPLY_LATEST_CODE, {
2885
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE, {
2830
2886
  execute: () => {
2831
2887
  acceptAICode();
2832
2888
  }
2833
2889
  });
2834
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_REJECT_LATEST_CODE, {
2890
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE, {
2835
2891
  execute: () => {
2836
2892
  rejectAICode();
2837
2893
  }
@@ -2840,23 +2896,21 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2840
2896
  Add a new command to the JupyterLab command registry that sends the current chat message.
2841
2897
  We use this to automatically send the message when the user adds an error to the chat.
2842
2898
  */
2843
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE, {
2899
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE, {
2844
2900
  execute: async (args) => {
2845
2901
  if (args === null || args === void 0 ? void 0 : args.input) {
2846
2902
  await sendSmartDebugMessage(args.input.toString());
2847
2903
  }
2848
2904
  }
2849
2905
  });
2850
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE, {
2906
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE, {
2851
2907
  execute: async () => {
2852
2908
  await sendExplainCodeMessage();
2853
2909
  }
2854
2910
  });
2855
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, {
2911
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, {
2856
2912
  execute: async (args) => {
2857
2913
  if (args === null || args === void 0 ? void 0 : args.input) {
2858
- // Make sure we're in agent mode
2859
- console.log('Setting agent mode to true');
2860
2914
  // If its not already in agent mode, start a new chat in agent mode
2861
2915
  if (!agentModeEnabledRef.current) {
2862
2916
  await startNewChat();
@@ -2871,7 +2925,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2871
2925
  /*
2872
2926
  Register the code cell toolbar buttons for accepting and rejecting code.
2873
2927
  */
2874
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE, {
2928
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE, {
2875
2929
  label: `Accept ${operatingSystem === 'mac' ? '⌘Y' : 'Ctrl+Y'}`,
2876
2930
  className: 'text-button-mito-ai button-base button-green',
2877
2931
  caption: 'Accept Code',
@@ -2889,7 +2943,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2889
2943
  }
2890
2944
  }
2891
2945
  });
2892
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE, {
2946
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE, {
2893
2947
  label: `Reject ${operatingSystem === 'mac' ? '⌘U' : 'Ctrl+U'}`,
2894
2948
  className: 'text-button-mito-ai button-base button-red',
2895
2949
  caption: 'Reject Code',
@@ -2910,13 +2964,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2910
2964
  // Register keyboard shortcuts
2911
2965
  const accelYDisposable = app.commands.addKeyBinding({
2912
2966
  command: codeReviewStatus === 'chatPreview' ?
2913
- _commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE :
2914
- _commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_APPLY_LATEST_CODE,
2967
+ _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE :
2968
+ _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE,
2915
2969
  keys: ['Accel Y'],
2916
2970
  selector: 'body',
2917
2971
  });
2918
2972
  const accelDDisposable = app.commands.addKeyBinding({
2919
- command: _commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_REJECT_LATEST_CODE,
2973
+ command: _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE,
2920
2974
  keys: ['Accel U'],
2921
2975
  selector: 'body',
2922
2976
  preventDefault: true,
@@ -2933,8 +2987,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2933
2987
  // Without this, the user needs to take some action, like switching to a different cell
2934
2988
  // and then switching back in order for the Jupyter to re-evaluate if it should
2935
2989
  // show the toolbar buttons.
2936
- app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE);
2937
- app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_20__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE);
2990
+ app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE);
2991
+ app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE);
2938
2992
  };
2939
2993
  const codeDiffStripesCompartments = react__WEBPACK_IMPORTED_MODULE_1___default().useRef(new Map());
2940
2994
  // Function to update the extensions of code cells
@@ -2962,13 +3016,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2962
3016
  codeDiffStripesCompartments.current.set(cellId, compartment);
2963
3017
  // Apply the initial configuration
2964
3018
  editorView.dispatch({
2965
- effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_21__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : [])),
3019
+ effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : [])),
2966
3020
  });
2967
3021
  }
2968
3022
  else {
2969
3023
  // Reconfigure the compartment
2970
3024
  editorView.dispatch({
2971
- effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_21__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : []),
3025
+ effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : []),
2972
3026
  });
2973
3027
  }
2974
3028
  }
@@ -2983,7 +3037,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2983
3037
  // In agent mode, we group consecutive error messages together.
2984
3038
  // In chat mode, we display messages individually as they were sent
2985
3039
  if (agentModeEnabled) {
2986
- processedDisplayOptimizedChatHistory = (0,_utils_chatHistory__WEBPACK_IMPORTED_MODULE_22__.processChatHistoryForErrorGrouping)(chatHistoryManager.getDisplayOptimizedHistory());
3040
+ processedDisplayOptimizedChatHistory = (0,_utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__.processChatHistoryForErrorGrouping)(chatHistoryManager.getDisplayOptimizedHistory());
2987
3041
  }
2988
3042
  else {
2989
3043
  processedDisplayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
@@ -2995,16 +3049,16 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2995
3049
  return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane" },
2996
3050
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header" },
2997
3051
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-left" },
2998
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_23__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.settingsIcon.react, null), title: "Mito AI Settings", onClick: () => {
2999
- void app.commands.execute(_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_24__.COMMAND_MITO_AI_SETTINGS);
3052
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_24__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.settingsIcon.react, null), title: "Mito AI Settings", onClick: () => {
3053
+ void app.commands.execute(_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__.COMMAND_MITO_AI_SETTINGS);
3000
3054
  } })),
3001
3055
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-right" },
3002
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_23__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.addIcon.react, null), title: "Start New Chat", onClick: async () => { await startNewChat(); } }),
3003
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_DropdownMenu__WEBPACK_IMPORTED_MODULE_25__["default"], { trigger: react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "icon-button", title: "Chat Threads", onClick: fetchChatThreads },
3056
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_24__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.addIcon.react, null), title: "Start New Chat", onClick: async () => { await startNewChat(); } }),
3057
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_DropdownMenu__WEBPACK_IMPORTED_MODULE_26__["default"], { trigger: react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "icon-button", title: "Chat Threads", onClick: fetchChatThreads },
3004
3058
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.historyIcon.react, null)), items: chatThreads.length > 0
3005
3059
  ? chatThreads.map(thread => ({
3006
3060
  label: thread.name,
3007
- primaryIcon: activeThreadIdRef.current === thread.thread_id ? _icons__WEBPACK_IMPORTED_MODULE_26__.OpenIndicatorLabIcon.react : undefined,
3061
+ primaryIcon: activeThreadIdRef.current === thread.thread_id ? _icons__WEBPACK_IMPORTED_MODULE_27__.OpenIndicatorLabIcon.react : undefined,
3008
3062
  onClick: () => fetchChatHistoryAndSetActiveThread(thread.thread_id),
3009
3063
  secondaryActions: [
3010
3064
  {
@@ -3023,26 +3077,26 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3023
3077
  displayOptimizedChatHistory.length === 0 &&
3024
3078
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-empty-message" },
3025
3079
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { style: { margin: '0 auto 8px', display: 'block', textAlign: 'center' } },
3026
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_27__["default"], { width: "60", height: "30" })),
3080
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__["default"], { width: "60", height: "30" })),
3027
3081
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { style: { display: 'block', textAlign: 'center', fontWeight: 'bold', fontSize: '20px', marginBottom: '15px' } }, "Data Copilot"),
3028
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CTACarousel__WEBPACK_IMPORTED_MODULE_28__["default"], { app: app })),
3082
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CTACarousel__WEBPACK_IMPORTED_MODULE_29__["default"], { app: app })),
3029
3083
  processedDisplayOptimizedChatHistory.map((displayOptimizedChat, index) => {
3030
3084
  if (isGroupedErrorMessages(displayOptimizedChat)) {
3031
- return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_29__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry }));
3085
+ return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry }));
3032
3086
  }
3033
3087
  else {
3034
- return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_30__["default"], { key: index, message: displayOptimizedChat.message, promptType: displayOptimizedChat.promptType, agentResponse: displayOptimizedChat.agentResponse, codeCellID: displayOptimizedChat.codeCellID, mitoAIConnectionError: displayOptimizedChat.type === 'connection error', mitoAIConnectionErrorType: displayOptimizedChat.mitoAIConnectionErrorType || null, messageIndex: index, notebookTracker: notebookTracker, renderMimeRegistry: renderMimeRegistry, app: app, isLastAiMessage: index === lastAIMessagesIndex, isLastMessage: index === displayOptimizedChatHistory.length - 1, operatingSystem: operatingSystem, previewAICode: previewAICodeToActiveCell, acceptAICode: acceptAICode, rejectAICode: rejectAICode, onUpdateMessage: handleUpdateMessage, contextManager: contextManager, codeReviewStatus: codeReviewStatus, setNextSteps: setNextSteps, agentModeEnabled: agentModeEnabled, additionalContext: displayOptimizedChat.additionalContext }));
3088
+ return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_31__["default"], { key: index, message: displayOptimizedChat.message, promptType: displayOptimizedChat.promptType, agentResponse: displayOptimizedChat.agentResponse, codeCellID: displayOptimizedChat.codeCellID, mitoAIConnectionError: displayOptimizedChat.type === 'connection error', mitoAIConnectionErrorType: displayOptimizedChat.mitoAIConnectionErrorType || null, messageIndex: index, notebookTracker: notebookTracker, renderMimeRegistry: renderMimeRegistry, app: app, isLastAiMessage: index === lastAIMessagesIndex, isLastMessage: index === displayOptimizedChatHistory.length - 1, operatingSystem: operatingSystem, previewAICode: previewAICodeToActiveCell, acceptAICode: acceptAICode, rejectAICode: rejectAICode, onUpdateMessage: handleUpdateMessage, contextManager: contextManager, codeReviewStatus: codeReviewStatus, setNextSteps: setNextSteps, agentModeEnabled: agentModeEnabled, additionalContext: displayOptimizedChat.additionalContext }));
3035
3089
  }
3036
3090
  }).filter(message => message !== null),
3037
3091
  loadingAIResponse &&
3038
3092
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-loading-message" },
3039
3093
  "Thinking ",
3040
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_31__["default"], null)),
3094
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__["default"], null)),
3041
3095
  hasCheckpoint &&
3042
3096
  agentModeEnabled &&
3043
3097
  agentExecutionStatus === 'idle' &&
3044
3098
  displayOptimizedChatHistory.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: 'message message-assistant-chat' },
3045
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_32__["default"], { text: "Revert changes", icon: _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_33__["default"], title: "Revert changes", onClick: () => {
3099
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_33__["default"], { text: "Revert changes", icon: _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_34__["default"], title: "Revert changes", onClick: () => {
3046
3100
  void (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
3047
3101
  setDisplayedNextStepsIfAvailable(false);
3048
3102
  setHasCheckpoint(false);
@@ -3050,9 +3104,9 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3050
3104
  (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_11__.scrollToDiv)(chatMessagesRef);
3051
3105
  }, variant: "gray", width: "fit-contents", iconPosition: "left" }),
3052
3106
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("p", { className: "text-muted text-sm" }, "Undo the most recent changes made by the agent"))),
3053
- showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_34__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))),
3107
+ showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))),
3054
3108
  displayOptimizedChatHistory.length === 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "suggestions-container" },
3055
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_35__["default"], { onSelectSuggestion: (prompt) => {
3109
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__["default"], { onSelectSuggestion: (prompt) => {
3056
3110
  if (agentModeEnabled) {
3057
3111
  void startAgentExecution(prompt);
3058
3112
  }
@@ -3061,15 +3115,15 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3061
3115
  }
3062
3116
  } }))),
3063
3117
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: `connected-input-container ${nextSteps.length > 0 ? 'has-next-steps' : ''}` },
3064
- nextSteps.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_NextStepsPills__WEBPACK_IMPORTED_MODULE_36__["default"], { nextSteps: nextSteps, onSelectNextStep: agentModeEnabled ? startAgentExecution : sendChatInputMessage, displayedNextStepsIfAvailable: displayedNextStepsIfAvailable, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable })),
3065
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_37__["default"], { app: app, initialContent: '', placeholder: agentExecutionStatus === 'working' ? 'Agent is working...' :
3118
+ nextSteps.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_NextStepsPills__WEBPACK_IMPORTED_MODULE_37__["default"], { nextSteps: nextSteps, onSelectNextStep: agentModeEnabled ? startAgentExecution : sendChatInputMessage, displayedNextStepsIfAvailable: displayedNextStepsIfAvailable, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable })),
3119
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_38__["default"], { app: app, initialContent: '', placeholder: agentExecutionStatus === 'working' ? `Agent is editing ${(_a = agentTargetNotebookPanelRef.current) === null || _a === void 0 ? void 0 : _a.context.path.split('/').pop()}` :
3066
3120
  agentExecutionStatus === 'stopping' ? 'Agent is stopping...' :
3067
3121
  agentModeEnabled ? 'Ask agent to do anything' :
3068
3122
  displayOptimizedChatHistory.length < 2 ? `Ask question (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`
3069
3123
  : `Ask followup (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`, onSave: agentModeEnabled ? startAgentExecution : sendChatInputMessage, onCancel: undefined, isEditing: false, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecutionStatus })),
3070
3124
  agentExecutionStatus !== 'working' && agentExecutionStatus !== 'stopping' && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls" },
3071
3125
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls-left" },
3072
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_ToggleButton__WEBPACK_IMPORTED_MODULE_38__["default"], { leftText: "Chat", leftTooltip: "Chat mode suggests an edit to the active cell and let's you decide to accept or reject it.", rightText: "Agent", rightTooltip: "Agent mode writes and executes code until it's finished your request.", isLeftSelected: !agentModeEnabled, onChange: async (isLeftSelected) => {
3126
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_ToggleButton__WEBPACK_IMPORTED_MODULE_39__["default"], { leftText: "Chat", leftTooltip: "Chat mode suggests an edit to the active cell and let's you decide to accept or reject it.", rightText: "Agent", rightTooltip: "Agent mode writes and executes code until it's finished your request.", isLeftSelected: !agentModeEnabled, onChange: async (isLeftSelected) => {
3073
3127
  await startNewChat(); // TODO: delete thread instead of starting new chat
3074
3128
  setAgentModeEnabled(!isLeftSelected);
3075
3129
  // Clear agent checkpoint when switching modes
@@ -3105,7 +3159,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3105
3159
  " \u23CE"))),
3106
3160
  (agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping') && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "button-base button-red stop-agent-button", onClick: markAgentForStopping, disabled: agentExecutionStatus === 'stopping', "data-testid": "stop-agent-button" }, agentExecutionStatus === 'stopping' ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "stop-agent-button-content" },
3107
3161
  "Stopping",
3108
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_39__["default"], null),
3162
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__["default"], null),
3109
3163
  " ")) : ('Stop Agent')))));
3110
3164
  };
3111
3165
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatTaskpane);
@@ -3161,7 +3215,7 @@ class ChatWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.React
3161
3215
  this._lastErrorChanged = new _lumino_signaling__WEBPACK_IMPORTED_MODULE_3__.Signal(this);
3162
3216
  // Create the websocket client
3163
3217
  this.websocketClient = new _websockets_completions_CompletionsWebsocketClient__WEBPACK_IMPORTED_MODULE_5__.CompletionWebsocketClient({
3164
- serverSettings: options.app.serviceManager.serverSettings
3218
+ serverSettings: options.app.serviceManager.serverSettings,
3165
3219
  });
3166
3220
  this.websocketClient.messages.connect(this.onMessage, this);
3167
3221
  // Initialize the websocket client
@@ -3462,9 +3516,11 @@ const IChatTracker = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('m
3462
3516
 
3463
3517
  __webpack_require__.r(__webpack_exports__);
3464
3518
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3465
- /* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput)
3519
+ /* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput),
3520
+ /* harmony export */ getBase64EncodedCellOutputInNotebook: () => (/* binding */ getBase64EncodedCellOutputInNotebook)
3466
3521
  /* harmony export */ });
3467
3522
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
3523
+ /* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
3468
3524
  /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
3469
3525
  /*
3470
3526
  * Copyright (c) Saga Inc.
@@ -3472,20 +3528,23 @@ __webpack_require__.r(__webpack_exports__);
3472
3528
  */
3473
3529
 
3474
3530
 
3531
+
3475
3532
  const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
3476
- if (cellID === undefined) {
3533
+ const notebookPanel = notebookTracker.currentWidget;
3534
+ return getBase64EncodedCellOutputInNotebook(notebookPanel, cellID);
3535
+ };
3536
+ const getBase64EncodedCellOutputInNotebook = async (notebookPanel, cellID) => {
3537
+ if (cellID === undefined || notebookPanel === null) {
3477
3538
  return undefined;
3478
3539
  }
3479
- // Check if the cell id is part of the notebook
3480
- const cellIndex = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellIndexByID)(notebookTracker, cellID);
3540
+ const cellIndex = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellIndexByIDInNotebookPanel)(notebookPanel, cellID);
3481
3541
  if (cellIndex === undefined) {
3482
3542
  // Log that the cell id is not part of the notebook
3483
- console.log(`Cell with id ${cellID} not found in notebook`);
3543
+ console.log(`Cell with id ${cellID} not found in notebook ${notebookPanel.context.path}`);
3484
3544
  void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.logEvent)('get_cell_output_requested_non_existent_cell');
3485
3545
  return undefined;
3486
3546
  }
3487
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.scrollToCell)(notebookTracker, cellID, 0);
3488
- const activeCellOutput = await (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellOutput)(notebookTracker);
3547
+ const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_2__.getCellOutputByIDInNotebook)(notebookPanel, cellID);
3489
3548
  if (activeCellOutput !== undefined) {
3490
3549
  return activeCellOutput;
3491
3550
  }
@@ -3495,20 +3554,83 @@ const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
3495
3554
 
3496
3555
  /***/ }),
3497
3556
 
3498
- /***/ "./lib/Extensions/AppBuilder/AppBuilderPlugin.js":
3499
- /*!*******************************************************!*\
3500
- !*** ./lib/Extensions/AppBuilder/AppBuilderPlugin.js ***!
3501
- \*******************************************************/
3557
+ /***/ "./lib/Extensions/AiChat/validationUtils.js":
3558
+ /*!**************************************************!*\
3559
+ !*** ./lib/Extensions/AiChat/validationUtils.js ***!
3560
+ \**************************************************/
3502
3561
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3503
3562
 
3504
3563
  __webpack_require__.r(__webpack_exports__);
3505
3564
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3506
- /* harmony export */ IAppBuilderService: () => (/* binding */ IAppBuilderService),
3565
+ /* harmony export */ validateAndCorrectAgentResponse: () => (/* binding */ validateAndCorrectAgentResponse)
3566
+ /* harmony export */ });
3567
+ /*
3568
+ * Copyright (c) Saga Inc.
3569
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3570
+ */
3571
+ /**
3572
+ * Validates and corrects an AgentResponse to ensure it adheres to the expected format.
3573
+ * Handles common mistakes like string instead of array, missing fields, etc.
3574
+ */
3575
+ function validateAndCorrectAgentResponse(agentResponse) {
3576
+ // Create a copy to avoid mutating the original
3577
+ const correctedResponse = { ...agentResponse };
3578
+ // Ensure type is valid. Default to finished_task if not valid.
3579
+ const validTypes = ['cell_update', 'get_cell_output', 'run_all_cells', 'finished_task'];
3580
+ correctedResponse.type = (correctedResponse.type && validTypes.includes(correctedResponse.type))
3581
+ ? correctedResponse.type
3582
+ : 'finished_task';
3583
+ // Ensure message is a string. Default to empty string if not valid.
3584
+ if (!correctedResponse.message || typeof correctedResponse.message !== 'string') {
3585
+ correctedResponse.message = '';
3586
+ }
3587
+ // Correct get_cell_output_cell_id if present
3588
+ const getCellOutputCellIdType = typeof correctedResponse.get_cell_output_cell_id;
3589
+ correctedResponse.get_cell_output_cell_id = getCellOutputCellIdType === 'string' ? correctedResponse.get_cell_output_cell_id : undefined;
3590
+ // Correct next_steps - handle string to array conversion
3591
+ if (correctedResponse.next_steps !== undefined && correctedResponse.next_steps !== null) {
3592
+ correctedResponse.next_steps = correctStringArray(correctedResponse.next_steps);
3593
+ }
3594
+ // Correct analysis_assumptions - handle string to array conversion
3595
+ if (correctedResponse.analysis_assumptions !== undefined && correctedResponse.analysis_assumptions !== null) {
3596
+ correctedResponse.analysis_assumptions = correctStringArray(correctedResponse.analysis_assumptions);
3597
+ }
3598
+ // For now we don't validate the cell_update object itself, as this is more complex and has
3599
+ // not caused issues thus far.
3600
+ return correctedResponse;
3601
+ }
3602
+ /**
3603
+ * Corrects a value to be a string array, handling various input formats.
3604
+ * Handles cases where the AI returns a string instead of an array of strings.
3605
+ */
3606
+ function correctStringArray(value) {
3607
+ // If it's already a valid array of strings, return it
3608
+ if (Array.isArray(value)) {
3609
+ return value;
3610
+ }
3611
+ if (typeof value === 'string') {
3612
+ return [value];
3613
+ }
3614
+ return null;
3615
+ }
3616
+
3617
+
3618
+ /***/ }),
3619
+
3620
+ /***/ "./lib/Extensions/AppDeploy/AppDeployPlugin.js":
3621
+ /*!*****************************************************!*\
3622
+ !*** ./lib/Extensions/AppDeploy/AppDeployPlugin.js ***!
3623
+ \*****************************************************/
3624
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3625
+
3626
+ __webpack_require__.r(__webpack_exports__);
3627
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3628
+ /* harmony export */ IAppDeployService: () => (/* binding */ IAppDeployService),
3507
3629
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3508
3630
  /* harmony export */ });
3509
3631
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
3510
3632
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__);
3511
- /* harmony import */ var _websockets_appBuilder_appBuilderWebsocketClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../websockets/appBuilder/appBuilderWebsocketClient */ "./lib/websockets/appBuilder/appBuilderWebsocketClient.js");
3633
+ /* harmony import */ var _websockets_appDeploy_appDeployWebsocketClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../websockets/appDeploy/appDeployWebsocketClient */ "./lib/websockets/appDeploy/appDeployWebsocketClient.js");
3512
3634
  /*
3513
3635
  * Copyright (c) Saga Inc.
3514
3636
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3516,49 +3638,49 @@ __webpack_require__.r(__webpack_exports__);
3516
3638
 
3517
3639
 
3518
3640
  /**
3519
- * The token for the AppBuilder service.
3641
+ * The token for the AppDeploy service.
3520
3642
  */
3521
- const IAppBuilderService = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('mito-ai:IAppBuilderService', 'Token for the AppBuilder service that provides access to the websocket client');
3643
+ const IAppDeployService = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('mito-ai:IAppDeployService', 'Token for the AppDeploy service that provides access to the websocket client');
3522
3644
  /**
3523
- * Implementation of the AppBuilder service.
3645
+ * Implementation of the AppDeploy service.
3524
3646
  */
3525
- class AppBuilderService {
3647
+ class AppDeployService {
3526
3648
  /**
3527
- * Create a new AppBuilder service.
3649
+ * Create a new AppDeploy service.
3528
3650
  */
3529
3651
  constructor(app) {
3530
3652
  // Create the websocket client with the app's server settings
3531
- this.client = new _websockets_appBuilder_appBuilderWebsocketClient__WEBPACK_IMPORTED_MODULE_1__.AppBuilderWebsocketClient({
3653
+ this.client = new _websockets_appDeploy_appDeployWebsocketClient__WEBPACK_IMPORTED_MODULE_1__.AppDeployWebsocketClient({
3532
3654
  serverSettings: app.serviceManager.serverSettings
3533
3655
  });
3534
3656
  // Initialize the websocket connection in the background
3535
3657
  void this.client.initialize().catch(error => {
3536
- console.error('Failed to initialize AppBuilder websocket client:', error);
3658
+ console.error('Failed to initialize AppDeploy websocket client:', error);
3537
3659
  // We don't need to throw the error since the client will attempt to reconnect when used
3538
3660
  });
3539
3661
  }
3540
3662
  }
3541
3663
  /**
3542
- * The AppBuilder plugin that provides the websocket client.
3664
+ * The AppDeploy plugin that provides the websocket client.
3543
3665
  */
3544
- const AppBuilderPlugin = {
3545
- id: 'mito-ai:app-builder',
3666
+ const AppDeployPlugin = {
3667
+ id: 'mito-ai:app-deploy',
3546
3668
  autoStart: true,
3547
- provides: IAppBuilderService,
3669
+ provides: IAppDeployService,
3548
3670
  activate: (app) => {
3549
- console.log('mito-ai: AppBuilderPlugin activated');
3550
- return new AppBuilderService(app);
3671
+ console.log('mito-ai: AppDeployPlugin activated');
3672
+ return new AppDeployService(app);
3551
3673
  }
3552
3674
  };
3553
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppBuilderPlugin);
3675
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppDeployPlugin);
3554
3676
 
3555
3677
 
3556
3678
  /***/ }),
3557
3679
 
3558
- /***/ "./lib/Extensions/AppBuilder/DeployAppNotification.js":
3559
- /*!************************************************************!*\
3560
- !*** ./lib/Extensions/AppBuilder/DeployAppNotification.js ***!
3561
- \************************************************************/
3680
+ /***/ "./lib/Extensions/AppDeploy/DeployAppNotification.js":
3681
+ /*!***********************************************************!*\
3682
+ !*** ./lib/Extensions/AppDeploy/DeployAppNotification.js ***!
3683
+ \***********************************************************/
3562
3684
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3563
3685
 
3564
3686
  __webpack_require__.r(__webpack_exports__);
@@ -3567,12 +3689,14 @@ __webpack_require__.r(__webpack_exports__);
3567
3689
  /* harmony export */ });
3568
3690
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
3569
3691
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
3692
+ /* harmony import */ var _AppManager_CheckAppStatusAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AppManager/CheckAppStatusAPI */ "./lib/Extensions/AppManager/CheckAppStatusAPI.js");
3570
3693
  /*
3571
3694
  * Copyright (c) Saga Inc.
3572
3695
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3573
3696
  */
3574
3697
 
3575
- const deployAppNotification = (url) => {
3698
+
3699
+ const deployAppNotification = (url, appManagerService) => {
3576
3700
  // Total deployment time in milliseconds (3 minutes = 180000ms)
3577
3701
  const totalDeploymentTime = 180000;
3578
3702
  // Create an array of deployment steps
@@ -3591,27 +3715,70 @@ const deployAppNotification = (url) => {
3591
3715
  });
3592
3716
  // Calculate time between steps (evenly distribute throughout the total deployment time)
3593
3717
  const stepInterval = totalDeploymentTime / (deploymentSteps.length - 1);
3718
+ let retryCount = 5;
3594
3719
  // Update message at each step interval
3595
3720
  for (let i = 1; i < deploymentSteps.length; i++) {
3596
3721
  setTimeout(() => {
3597
3722
  const isLastStep = i === deploymentSteps.length - 1;
3598
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
3599
- id: notificationId,
3600
- message: deploymentSteps[i],
3601
- type: isLastStep ? 'default' : 'in-progress',
3602
- autoClose: false,
3603
- ...(isLastStep && {
3604
- actions: [
3605
- {
3606
- label: "Launch Application Now",
3607
- displayType: 'accent',
3608
- callback: () => {
3609
- window.open(url, '_blank');
3610
- }
3723
+ if (isLastStep) {
3724
+ const checkUrlAndUpdate = async () => {
3725
+ if (retryCount < 0) {
3726
+ console.log("Retries done");
3727
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
3728
+ id: notificationId,
3729
+ message: "Unable to deploy. Your app is not reachable",
3730
+ type: 'warning',
3731
+ autoClose: false
3732
+ });
3733
+ return;
3734
+ }
3735
+ try {
3736
+ console.log("Awaiting response");
3737
+ const urlIsUp = await (0,_AppManager_CheckAppStatusAPI__WEBPACK_IMPORTED_MODULE_1__.checkAppStatus)(url, appManagerService);
3738
+ console.log(`App status check result for ${url}: ${urlIsUp}`);
3739
+ if (urlIsUp) {
3740
+ // Update notification with the button
3741
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
3742
+ id: notificationId,
3743
+ message: deploymentSteps[i],
3744
+ type: 'default',
3745
+ autoClose: false,
3746
+ actions: [
3747
+ {
3748
+ label: "Launch Application Now",
3749
+ displayType: 'accent',
3750
+ callback: () => {
3751
+ window.open(url, '_blank');
3752
+ }
3753
+ }
3754
+ ]
3755
+ });
3611
3756
  }
3612
- ]
3613
- })
3614
- });
3757
+ else {
3758
+ // Retry after 30s
3759
+ console.log("In retry for url to be up");
3760
+ retryCount = retryCount - 1;
3761
+ setTimeout(() => void checkUrlAndUpdate(), 30000);
3762
+ }
3763
+ }
3764
+ catch (error) {
3765
+ // Retry after 30s
3766
+ console.error("Error checking app status:", error);
3767
+ retryCount = retryCount - 1;
3768
+ setTimeout(() => void checkUrlAndUpdate(), 30000);
3769
+ }
3770
+ };
3771
+ void checkUrlAndUpdate();
3772
+ }
3773
+ else {
3774
+ // Regular intermediate step
3775
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
3776
+ id: notificationId,
3777
+ message: deploymentSteps[i],
3778
+ type: 'in-progress',
3779
+ autoClose: false
3780
+ });
3781
+ }
3615
3782
  }, i * stepInterval);
3616
3783
  }
3617
3784
  };
@@ -3619,27 +3786,25 @@ const deployAppNotification = (url) => {
3619
3786
 
3620
3787
  /***/ }),
3621
3788
 
3622
- /***/ "./lib/Extensions/AppBuilder/NotebookToStreamlit.js":
3623
- /*!**********************************************************!*\
3624
- !*** ./lib/Extensions/AppBuilder/NotebookToStreamlit.js ***!
3625
- \**********************************************************/
3789
+ /***/ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js":
3790
+ /*!********************************************************!*\
3791
+ !*** ./lib/Extensions/AppDeploy/DeployStreamlitApp.js ***!
3792
+ \********************************************************/
3626
3793
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3627
3794
 
3628
3795
  __webpack_require__.r(__webpack_exports__);
3629
3796
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3630
- /* harmony export */ convertNotebookToStreamlit: () => (/* binding */ convertNotebookToStreamlit)
3797
+ /* harmony export */ deployStreamlitApp: () => (/* binding */ deployStreamlitApp)
3631
3798
  /* harmony export */ });
3632
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
3633
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
3634
- /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
3635
- /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
3636
- /* harmony import */ var _requirementsUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./requirementsUtils */ "./lib/Extensions/AppBuilder/requirementsUtils.js");
3637
- /* harmony import */ var _fileUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fileUtils */ "./lib/Extensions/AppBuilder/fileUtils.js");
3638
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
3639
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__);
3640
- /* harmony import */ var _DeployAppNotification__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DeployAppNotification */ "./lib/Extensions/AppBuilder/DeployAppNotification.js");
3641
- /* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auth */ "./lib/Extensions/AppBuilder/auth.js");
3642
- /* harmony import */ var _authPopupUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./authPopupUtils */ "./lib/Extensions/AppBuilder/authPopupUtils.js");
3799
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
3800
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
3801
+ /* harmony import */ var _requirementsUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./requirementsUtils */ "./lib/Extensions/AppDeploy/requirementsUtils.js");
3802
+ /* harmony import */ var _fileUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fileUtils */ "./lib/Extensions/AppDeploy/fileUtils.js");
3803
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
3804
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
3805
+ /* harmony import */ var _DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DeployAppNotification */ "./lib/Extensions/AppDeploy/DeployAppNotification.js");
3806
+ /* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth */ "./lib/Extensions/AppDeploy/auth.js");
3807
+ /* harmony import */ var _authPopupUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./authPopupUtils */ "./lib/Extensions/AppDeploy/authPopupUtils.js");
3643
3808
  /*
3644
3809
  * Copyright (c) Saga Inc.
3645
3810
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3651,23 +3816,23 @@ __webpack_require__.r(__webpack_exports__);
3651
3816
 
3652
3817
 
3653
3818
 
3654
-
3655
3819
  /*
3656
- This function generates a requirements.txt file that lists the dependencies for the streamlit app
3820
+ This function generates the requirements.txt file needed to host the streamlit app,
3821
+ and deploys it!
3657
3822
  */
3658
- const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) => {
3659
- let jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_3__.getJWTToken)();
3823
+ const deployStreamlitApp = async (notebookTracker, appDeployService, appManagerService) => {
3824
+ let jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_2__.getJWTToken)();
3660
3825
  if (!jwtToken) {
3661
3826
  // No token found, show authentication popup
3662
3827
  console.log('User not authenticated, redirected to signup');
3663
3828
  try {
3664
- const user = await (0,_authPopupUtils__WEBPACK_IMPORTED_MODULE_4__.showAuthenticationPopup)();
3829
+ const user = await (0,_authPopupUtils__WEBPACK_IMPORTED_MODULE_3__.showAuthenticationPopup)();
3665
3830
  console.log('User authenticated successfully:', user);
3666
3831
  // Try to get the JWT token again after successful authentication
3667
- jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_3__.getJWTToken)();
3832
+ jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_2__.getJWTToken)();
3668
3833
  if (!jwtToken) {
3669
3834
  console.error('JWT token still not available after authentication');
3670
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit('Authentication failed - JWT token not found', 'error', {
3835
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit('Authentication failed - JWT token not found', 'error', {
3671
3836
  autoClose: false
3672
3837
  });
3673
3838
  return;
@@ -3684,54 +3849,44 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3684
3849
  return;
3685
3850
  }
3686
3851
  const notebookPath = notebookPanel.context.path;
3687
- const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.basename(notebookPath, '.ipynb');
3688
- console.log('Notebook path:', notebookPath);
3689
- console.log('Notebook name:', notebookName);
3690
- console.log('Current working directory info:', notebookPanel.context);
3691
3852
  // Build the requirements.txt file
3692
- console.debug("Building requirements.txt file");
3693
- const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_5__.generateRequirementsTxt)(notebookTracker);
3853
+ const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_4__.generateRequirementsTxt)(notebookTracker);
3694
3854
  // Save the files to the current directory
3695
- await (0,_fileUtils__WEBPACK_IMPORTED_MODULE_6__.saveFileWithKernel)(notebookTracker, './requirements.txt', requirementsContent);
3855
+ await (0,_fileUtils__WEBPACK_IMPORTED_MODULE_5__.saveFileWithKernel)(notebookTracker, './requirements.txt', requirementsContent);
3696
3856
  // After building the files, we need to send a request to the backend to deploy the app
3697
- if (appBuilderService) {
3698
- try {
3699
- console.log("Sending request to deploy the app");
3700
- // Use the JWT token that was already obtained or refreshed above
3701
- const response = await appBuilderService.client.sendMessage({
3702
- type: 'build-app',
3703
- message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__.UUID.uuid4(),
3704
- notebook_path: notebookPath,
3705
- jwt_token: jwtToken
3857
+ try {
3858
+ console.log("Sending request to deploy the app");
3859
+ // Use the JWT token that was already obtained or refreshed above
3860
+ const response = await appDeployService.client.sendMessage({
3861
+ type: 'deploy-app',
3862
+ message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.UUID.uuid4(),
3863
+ notebook_path: notebookPath,
3864
+ jwt_token: jwtToken
3865
+ });
3866
+ if (response.error) {
3867
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit(response.error.title, 'error', {
3868
+ autoClose: false
3706
3869
  });
3707
- if (response.error) {
3708
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(response.error.title, 'error', {
3709
- autoClose: false
3710
- });
3711
- }
3712
- else {
3713
- console.log("App deployment response:", response);
3714
- const url = response.url;
3715
- (0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_7__.deployAppNotification)(url);
3716
- }
3717
3870
  }
3718
- catch (error) {
3719
- // TODO: Do something with the error
3720
- console.error("Error deploying app:", error);
3871
+ else {
3872
+ console.log("App deployment response:", response);
3873
+ const url = response.url;
3874
+ (0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__.deployAppNotification)(url, appManagerService);
3721
3875
  }
3722
3876
  }
3723
- else {
3724
- console.warn("AppBuilderService not provided - app will not be deployed");
3877
+ catch (error) {
3878
+ // TODO: Do something with the error
3879
+ console.error("Error deploying app:", error);
3725
3880
  }
3726
3881
  };
3727
3882
 
3728
3883
 
3729
3884
  /***/ }),
3730
3885
 
3731
- /***/ "./lib/Extensions/AppBuilder/auth-popup-deploy.js":
3732
- /*!********************************************************!*\
3733
- !*** ./lib/Extensions/AppBuilder/auth-popup-deploy.js ***!
3734
- \********************************************************/
3886
+ /***/ "./lib/Extensions/AppDeploy/auth-popup-deploy.js":
3887
+ /*!*******************************************************!*\
3888
+ !*** ./lib/Extensions/AppDeploy/auth-popup-deploy.js ***!
3889
+ \*******************************************************/
3735
3890
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3736
3891
 
3737
3892
  __webpack_require__.r(__webpack_exports__);
@@ -3838,10 +3993,10 @@ const AuthPopup = ({ isOpen, onClose, onSuccess }) => {
3838
3993
 
3839
3994
  /***/ }),
3840
3995
 
3841
- /***/ "./lib/Extensions/AppBuilder/auth.js":
3842
- /*!*******************************************!*\
3843
- !*** ./lib/Extensions/AppBuilder/auth.js ***!
3844
- \*******************************************/
3996
+ /***/ "./lib/Extensions/AppDeploy/auth.js":
3997
+ /*!******************************************!*\
3998
+ !*** ./lib/Extensions/AppDeploy/auth.js ***!
3999
+ \******************************************/
3845
4000
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3846
4001
 
3847
4002
  __webpack_require__.r(__webpack_exports__);
@@ -3852,7 +4007,7 @@ __webpack_require__.r(__webpack_exports__);
3852
4007
  /* harmony export */ });
3853
4008
  /* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/core/dist/esm/singleton/apis/fetchAuthSession.mjs");
3854
4009
  /* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/auth/dist/esm/providers/cognito/apis/signOut.mjs");
3855
- /* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/AppBuilder/aws-config.js");
4010
+ /* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/AppDeploy/aws-config.js");
3856
4011
  /*
3857
4012
  * Copyright (c) Saga Inc.
3858
4013
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3921,10 +4076,10 @@ const logoutAndClearJWTTokens = async () => {
3921
4076
 
3922
4077
  /***/ }),
3923
4078
 
3924
- /***/ "./lib/Extensions/AppBuilder/authPopupUtils.js":
3925
- /*!*****************************************************!*\
3926
- !*** ./lib/Extensions/AppBuilder/authPopupUtils.js ***!
3927
- \*****************************************************/
4079
+ /***/ "./lib/Extensions/AppDeploy/authPopupUtils.js":
4080
+ /*!****************************************************!*\
4081
+ !*** ./lib/Extensions/AppDeploy/authPopupUtils.js ***!
4082
+ \****************************************************/
3928
4083
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3929
4084
 
3930
4085
  __webpack_require__.r(__webpack_exports__);
@@ -3934,7 +4089,7 @@ __webpack_require__.r(__webpack_exports__);
3934
4089
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
3935
4090
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3936
4091
  /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");
3937
- /* harmony import */ var _auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth-popup-deploy */ "./lib/Extensions/AppBuilder/auth-popup-deploy.js");
4092
+ /* harmony import */ var _auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth-popup-deploy */ "./lib/Extensions/AppDeploy/auth-popup-deploy.js");
3938
4093
  /*
3939
4094
  * Copyright (c) Saga Inc.
3940
4095
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3973,10 +4128,10 @@ const showAuthenticationPopup = () => {
3973
4128
 
3974
4129
  /***/ }),
3975
4130
 
3976
- /***/ "./lib/Extensions/AppBuilder/aws-config.js":
3977
- /*!*************************************************!*\
3978
- !*** ./lib/Extensions/AppBuilder/aws-config.js ***!
3979
- \*************************************************/
4131
+ /***/ "./lib/Extensions/AppDeploy/aws-config.js":
4132
+ /*!************************************************!*\
4133
+ !*** ./lib/Extensions/AppDeploy/aws-config.js ***!
4134
+ \************************************************/
3980
4135
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3981
4136
 
3982
4137
  __webpack_require__.r(__webpack_exports__);
@@ -4016,10 +4171,10 @@ configureAmplify();
4016
4171
 
4017
4172
  /***/ }),
4018
4173
 
4019
- /***/ "./lib/Extensions/AppBuilder/fileUtils.js":
4020
- /*!************************************************!*\
4021
- !*** ./lib/Extensions/AppBuilder/fileUtils.js ***!
4022
- \************************************************/
4174
+ /***/ "./lib/Extensions/AppDeploy/fileUtils.js":
4175
+ /*!***********************************************!*\
4176
+ !*** ./lib/Extensions/AppDeploy/fileUtils.js ***!
4177
+ \***********************************************/
4023
4178
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4024
4179
 
4025
4180
  __webpack_require__.r(__webpack_exports__);
@@ -4084,10 +4239,10 @@ print(f"File saved successfully to ${filePath}")
4084
4239
 
4085
4240
  /***/ }),
4086
4241
 
4087
- /***/ "./lib/Extensions/AppBuilder/requirementsUtils.js":
4088
- /*!********************************************************!*\
4089
- !*** ./lib/Extensions/AppBuilder/requirementsUtils.js ***!
4090
- \********************************************************/
4242
+ /***/ "./lib/Extensions/AppDeploy/requirementsUtils.js":
4243
+ /*!*******************************************************!*\
4244
+ !*** ./lib/Extensions/AppDeploy/requirementsUtils.js ***!
4245
+ \*******************************************************/
4091
4246
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4092
4247
 
4093
4248
  __webpack_require__.r(__webpack_exports__);
@@ -4240,7 +4395,7 @@ __webpack_require__.r(__webpack_exports__);
4240
4395
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
4241
4396
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
4242
4397
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__);
4243
- /* harmony import */ var _AppBuilder_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AppBuilder/auth */ "./lib/Extensions/AppBuilder/auth.js");
4398
+ /* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
4244
4399
  /* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
4245
4400
  /* harmony import */ var _style_AppsList_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AppsList.css */ "./style/AppsList.css");
4246
4401
  /*
@@ -4337,7 +4492,7 @@ const AppsList = ({ appManagerService }) => {
4337
4492
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, disabled: loading, className: "apps-list-button", title: "Refresh apps" }, loading ? 'Loading...' : 'Refresh'),
4338
4493
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => {
4339
4494
  console.log('Logout clicked');
4340
- void (0,_AppBuilder_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
4495
+ void (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
4341
4496
  }, className: "apps-list-button", title: "Logout" }, "Logout"))),
4342
4497
  loading ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-loading" }, "Loading apps...")) : error ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error" },
4343
4498
  "Error: ",
@@ -4360,6 +4515,49 @@ const AppsList = ({ appManagerService }) => {
4360
4515
  };
4361
4516
 
4362
4517
 
4518
+ /***/ }),
4519
+
4520
+ /***/ "./lib/Extensions/AppManager/CheckAppStatusAPI.js":
4521
+ /*!********************************************************!*\
4522
+ !*** ./lib/Extensions/AppManager/CheckAppStatusAPI.js ***!
4523
+ \********************************************************/
4524
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4525
+
4526
+ __webpack_require__.r(__webpack_exports__);
4527
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4528
+ /* harmony export */ checkAppStatus: () => (/* binding */ checkAppStatus)
4529
+ /* harmony export */ });
4530
+ /*
4531
+ * Copyright (c) Saga Inc.
4532
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4533
+ */
4534
+ /**
4535
+ * Check if an app URL is accessible through the backend.
4536
+ */
4537
+ const checkAppStatus = async (appUrl, appManagerService) => {
4538
+ try {
4539
+ // Create the request message with proper typing
4540
+ const request = {
4541
+ type: 'check-app-status',
4542
+ app_url: appUrl
4543
+ };
4544
+ // Using websocket service
4545
+ const response = await appManagerService.client.sendMessage(request);
4546
+ // Check if the response indicates an error
4547
+ if (response.error) {
4548
+ console.error('Error checking app status:', response.error.title);
4549
+ return false;
4550
+ }
4551
+ console.log('App is accessible:', response.is_accessible);
4552
+ return response.is_accessible;
4553
+ }
4554
+ catch (error) {
4555
+ console.error('Error checking app status:', error);
4556
+ return false;
4557
+ }
4558
+ };
4559
+
4560
+
4363
4561
  /***/ }),
4364
4562
 
4365
4563
  /***/ "./lib/Extensions/AppManager/ListAppsAPI.js":
@@ -4374,7 +4572,7 @@ __webpack_require__.r(__webpack_exports__);
4374
4572
  /* harmony export */ isGetAppsFailure: () => (/* binding */ isGetAppsFailure),
4375
4573
  /* harmony export */ isGetAppsSuccess: () => (/* binding */ isGetAppsSuccess)
4376
4574
  /* harmony export */ });
4377
- /* harmony import */ var _AppBuilder_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../AppBuilder/auth */ "./lib/Extensions/AppBuilder/auth.js");
4575
+ /* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
4378
4576
  /*
4379
4577
  * Copyright (c) Saga Inc.
4380
4578
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -4389,7 +4587,7 @@ const isGetAppsFailure = (response) => {
4389
4587
  };
4390
4588
  const fetchUserApps = async (appManagerService) => {
4391
4589
  try {
4392
- const jwtToken = await (0,_AppBuilder_auth__WEBPACK_IMPORTED_MODULE_0__.getJWTToken)();
4590
+ const jwtToken = await (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_0__.getJWTToken)();
4393
4591
  if (!jwtToken) {
4394
4592
  return {
4395
4593
  success: false,
@@ -4530,6 +4728,211 @@ const ManageAppsPlugin = {
4530
4728
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ManageAppsPlugin);
4531
4729
 
4532
4730
 
4731
+ /***/ }),
4732
+
4733
+ /***/ "./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js":
4734
+ /*!*************************************************************!*\
4735
+ !*** ./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js ***!
4736
+ \*************************************************************/
4737
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4738
+
4739
+ __webpack_require__.r(__webpack_exports__);
4740
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4741
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4742
+ /* harmony export */ });
4743
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
4744
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
4745
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
4746
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
4747
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
4748
+ /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__);
4749
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
4750
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_3__);
4751
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
4752
+ /* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
4753
+ /* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
4754
+ /* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
4755
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
4756
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
4757
+ /* harmony import */ var _style_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/StreamlitPreviewPlugin.css */ "./style/StreamlitPreviewPlugin.css");
4758
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AppPreview/utils.js");
4759
+ /*
4760
+ * Copyright (c) Saga Inc.
4761
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4762
+ */
4763
+
4764
+
4765
+
4766
+
4767
+
4768
+
4769
+
4770
+
4771
+
4772
+
4773
+
4774
+
4775
+
4776
+
4777
+ /**
4778
+ * Simple HTML widget for displaying iframe content.
4779
+ */
4780
+ class IFrameWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__.Widget {
4781
+ constructor(url) {
4782
+ super();
4783
+ this.addClass('jp-iframe-widget');
4784
+ const iframe = document.createElement('iframe');
4785
+ iframe.src = url;
4786
+ iframe.style.width = '100%';
4787
+ iframe.style.height = '100%';
4788
+ iframe.style.border = 'none';
4789
+ this.node.appendChild(iframe);
4790
+ }
4791
+ setUrl(url) {
4792
+ const iframe = this.node.querySelector('iframe');
4793
+ if (iframe) {
4794
+ iframe.src = url;
4795
+ }
4796
+ }
4797
+ }
4798
+ /**
4799
+ * The streamlit preview plugin.
4800
+ */
4801
+ const StreamlitPreviewPlugin = {
4802
+ id: 'mito-ai:streamlit-preview',
4803
+ autoStart: true,
4804
+ requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_5__.IAppDeployService, _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_6__.IAppManagerService],
4805
+ activate: (app, notebookTracker, palette, appDeployService, appManagerService) => {
4806
+ console.log('mito-ai: StreamlitPreviewPlugin activated');
4807
+ // Add command to command palette
4808
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
4809
+ label: 'Preview as Streamlit',
4810
+ caption: 'Convert current notebook to Streamlit app and preview it',
4811
+ execute: async () => {
4812
+ await previewNotebookAsStreamlit(app, notebookTracker, appDeployService, appManagerService);
4813
+ }
4814
+ });
4815
+ // Add to command palette
4816
+ palette.addItem({
4817
+ command: _commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
4818
+ category: 'Mito AI'
4819
+ });
4820
+ }
4821
+ };
4822
+ /**
4823
+ * Preview the current notebook as a Streamlit app.
4824
+ */
4825
+ async function previewNotebookAsStreamlit(app, notebookTracker, appDeployService, appManagerService) {
4826
+ const notebookPanel = notebookTracker.currentWidget;
4827
+ if (!notebookPanel) {
4828
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.error('No notebook is currently active');
4829
+ return;
4830
+ }
4831
+ // First save the notebook to ensure the app is up to date
4832
+ await notebookPanel.context.save();
4833
+ const notebookPath = notebookPanel.context.path;
4834
+ const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.PathExt.basename(notebookPath, '.ipynb');
4835
+ let globalNotificationId;
4836
+ try {
4837
+ const { previewData, notificationId } = await (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath);
4838
+ globalNotificationId = notificationId;
4839
+ // Create iframe widget
4840
+ // TODO: Instead of having this widget creation code in the previewNotebookAsStreamlit function,
4841
+ // I wonder if we can make it part of the StreamlitPreviewPlugin. What we want is the following:
4842
+ // a react component that takes the app, notebookTracker, and appDeployService as a prop and is
4843
+ // already set up with this layout. Each time it opens, we're just deciding which notebook to display.
4844
+ const iframeWidget = new IFrameWidget(previewData.url);
4845
+ // Create main area widget
4846
+ const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
4847
+ widget.title.label = `App Preview (${notebookName})`;
4848
+ widget.title.closable = true;
4849
+ // Add toolbar button to the MainAreaWidget's toolbar
4850
+ const deployButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
4851
+ className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
4852
+ onClick: () => {
4853
+ void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__.deployStreamlitApp)(notebookTracker, appDeployService, appManagerService);
4854
+ },
4855
+ tooltip: 'Deploy Streamlit App',
4856
+ label: 'Deploy App',
4857
+ icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
4858
+ iconClass: 'mito-ai-deploy-icon'
4859
+ });
4860
+ // Add toolbar button to the MainAreaWidget's toolbar
4861
+ const refreshButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
4862
+ className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
4863
+ onClick: () => {
4864
+ void (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath, true);
4865
+ },
4866
+ tooltip: 'Rebuild Streamlit App',
4867
+ label: 'Rebuild App',
4868
+ icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
4869
+ iconClass: 'mito-ai-deploy-icon'
4870
+ });
4871
+ // Insert the button into the toolbar
4872
+ widget.toolbar.insertAfter('spacer', 'refresh-app-button', refreshButton);
4873
+ widget.toolbar.insertAfter('spacer', 'deploy-app-button', deployButton);
4874
+ // Handle widget disposal
4875
+ widget.disposed.connect(() => {
4876
+ console.log('Widget disposed, stopping preview');
4877
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__.stopStreamlitPreview)(previewData.id);
4878
+ });
4879
+ // Add widget to main area with split-right mode
4880
+ app.shell.add(widget, 'main', {
4881
+ mode: 'split-right',
4882
+ ref: notebookPanel.id
4883
+ });
4884
+ }
4885
+ catch (error) {
4886
+ console.error('Error starting streamlit preview:', error);
4887
+ // Update notification to error
4888
+ if (globalNotificationId) {
4889
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
4890
+ id: globalNotificationId,
4891
+ message: `Failed to start preview: ${error instanceof Error ? error.message : 'Unknown error'}`,
4892
+ type: 'error',
4893
+ autoClose: false
4894
+ });
4895
+ }
4896
+ }
4897
+ }
4898
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StreamlitPreviewPlugin);
4899
+
4900
+
4901
+ /***/ }),
4902
+
4903
+ /***/ "./lib/Extensions/AppPreview/utils.js":
4904
+ /*!********************************************!*\
4905
+ !*** ./lib/Extensions/AppPreview/utils.js ***!
4906
+ \********************************************/
4907
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4908
+
4909
+ __webpack_require__.r(__webpack_exports__);
4910
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4911
+ /* harmony export */ startStreamlitPreviewAndNotify: () => (/* binding */ startStreamlitPreviewAndNotify)
4912
+ /* harmony export */ });
4913
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
4914
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
4915
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
4916
+ /*
4917
+ * Copyright (c) Saga Inc.
4918
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4919
+ */
4920
+
4921
+
4922
+ const startStreamlitPreviewAndNotify = async (notebookPath, force_recreate = false) => {
4923
+ const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit('Building App Preview...', 'in-progress', { autoClose: false });
4924
+ const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.startStreamlitPreview)(notebookPath, force_recreate);
4925
+ // Update notification to success
4926
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
4927
+ id: notificationId,
4928
+ message: 'Streamlit preview started successfully!',
4929
+ type: 'default',
4930
+ autoClose: false
4931
+ });
4932
+ return { previewData, notificationId };
4933
+ };
4934
+
4935
+
4533
4936
  /***/ }),
4534
4937
 
4535
4938
  /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
@@ -4560,42 +4963,36 @@ __webpack_require__.r(__webpack_exports__);
4560
4963
 
4561
4964
 
4562
4965
  // The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
4563
- // that can be used to look up the service in the dependency injection system,
4564
- // so we define a new token for the ContextManager
4565
- const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
4566
- class ContextManager {
4567
- constructor(app, notebookTracker) {
4568
- this._variables = [];
4569
- this._files = [];
4570
- // Setup the kernel listener to update context as kernel messages are received
4571
- this.setupKernelListener(app, notebookTracker);
4572
- }
4573
- get variables() {
4574
- return this._variables;
4575
- }
4576
- setVariables(newVars) {
4577
- this._variables = newVars;
4578
- }
4579
- get files() {
4580
- return this._files;
4581
- }
4582
- setFiles(newFiles) {
4583
- this._files = newFiles;
4584
- }
4585
- // Setup kernel execution listener
4586
- setupKernelListener(app, notebookTracker) {
4587
- notebookTracker.currentChanged.connect(async (tracker, notebookPanel) => {
4588
- if (!notebookPanel) {
4966
+ // that can be used to look up the service in the dependency injection system,
4967
+ // so we define a new token for the ContextManager
4968
+ const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
4969
+ class ContextManager {
4970
+ constructor(app, notebookTracker) {
4971
+ this.notebookContexts = new Map();
4972
+ this._startKernelListener = async (app, notebookPanel) => {
4973
+ if (notebookPanel === null) {
4589
4974
  return;
4590
4975
  }
4591
- // Listen for kernel refresh events
4976
+ // Initialize context for this notebook if it doesn't exist
4977
+ if (!this.notebookContexts.has(notebookPanel.id)) {
4978
+ this.notebookContexts.set(notebookPanel.id, { variables: [], files: [] });
4979
+ }
4980
+ // As soon as the notebook is opened, fetch the files since these are not related to the kernel,
4981
+ // but to the notebook itself. This is useful so we can tell the agent which files are available
4982
+ // or let the user select a file from the dropdown menu before the kernel is started.
4983
+ // We use the notebookPanel.id to identify the notebook because we might need to access
4984
+ // NotebookContext even before the kernel is started. For example, to figure out
4985
+ // which files are available.
4986
+ const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
4987
+ this.updateNotebookFiles(notebookPanel.id, updatedFiles);
4988
+ // Listen for kernel restart or shut down events and clear the variables for this notebook
4592
4989
  notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
4593
- if (status === 'restarting') {
4594
- this.setVariables([]); // Clear variables on kernel refresh
4990
+ if (status === 'restarting' || status === 'terminating' || status === 'unknown') {
4991
+ // Clear the variables for this specific notebook, but don't clear the files
4992
+ // as they have not changed.
4993
+ this.updateNotebookVariables(notebookPanel.id, []); // Clear variables for this specific notebook
4595
4994
  }
4596
4995
  });
4597
- // As soon as the notebook is opened, fetch the files so we don't have to wait for the first message.
4598
- await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.fetchFilesAndUpdateState)(app, notebookTracker, this.setFiles.bind(this));
4599
4996
  // Listen to kernel messages
4600
4997
  notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
4601
4998
  // Watch for execute_input messages, which indicate is a request to execute code.
@@ -4603,11 +5000,46 @@ class ContextManager {
4603
5000
  // from the kernel when a code cell prints a value to the output cell, which is not what we want.
4604
5001
  // TODO: Check if there is a race condition where we might end up fetching variables before the
4605
5002
  // code is executed. I don't think this is the case because the kernel runs in one thread I believe.
5003
+ // TODO: Eventually we should create a document manager listener so if the user uploads a new file
5004
+ // to jupyter, we can update the available files even if they have not executed a kernel message.
4606
5005
  if (msg.header.msg_type === 'execute_input') {
4607
- await (0,_VariableInspector__WEBPACK_IMPORTED_MODULE_3__.fetchVariablesAndUpdateState)(notebookPanel, this.setVariables.bind(this));
4608
- await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.fetchFilesAndUpdateState)(app, notebookTracker, this.setFiles.bind(this));
5006
+ void (0,_VariableInspector__WEBPACK_IMPORTED_MODULE_3__.fetchVariablesAndUpdateState)(notebookPanel, this.updateNotebookVariables.bind(this, notebookPanel.id));
5007
+ const updatedFiles = await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.getFiles)(app, notebookPanel);
5008
+ this.updateNotebookFiles(notebookPanel.id, updatedFiles);
4609
5009
  }
4610
5010
  });
5011
+ };
5012
+ this.notebookTracker = notebookTracker;
5013
+ // Setup the kernel listener to update context as kernel messages are received
5014
+ this.setupKernelListener(app, notebookTracker);
5015
+ }
5016
+ getNotebookContext(notebookId) {
5017
+ return this.notebookContexts.get(notebookId);
5018
+ }
5019
+ getActiveNotebookContext() {
5020
+ const activeNotebook = this.notebookTracker.currentWidget;
5021
+ if (!activeNotebook)
5022
+ return undefined;
5023
+ return this.getNotebookContext(activeNotebook.id);
5024
+ }
5025
+ updateNotebookVariables(notebookID, variables) {
5026
+ const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
5027
+ context.variables = variables;
5028
+ this.notebookContexts.set(notebookID, context);
5029
+ }
5030
+ updateNotebookFiles(notebookID, files) {
5031
+ const context = this.notebookContexts.get(notebookID) || { variables: [], files: [] };
5032
+ context.files = files;
5033
+ this.notebookContexts.set(notebookID, context);
5034
+ }
5035
+ // Setup kernel execution listener
5036
+ setupKernelListener(app, notebookTracker) {
5037
+ // Start the kernel listener for the currently active notebook
5038
+ const notebookPanel = notebookTracker.currentWidget;
5039
+ void this._startKernelListener(app, notebookPanel);
5040
+ // Update the kernel listener whenever the active notebook changes
5041
+ notebookTracker.currentChanged.connect(async (_, notebookPanel) => {
5042
+ void this._startKernelListener(app, notebookPanel);
4611
5043
  });
4612
5044
  }
4613
5045
  }
@@ -4634,7 +5066,7 @@ const ContextManagerPlugin = {
4634
5066
 
4635
5067
  __webpack_require__.r(__webpack_exports__);
4636
5068
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4637
- /* harmony export */ fetchFilesAndUpdateState: () => (/* binding */ fetchFilesAndUpdateState)
5069
+ /* harmony export */ getFiles: () => (/* binding */ getFiles)
4638
5070
  /* harmony export */ });
4639
5071
  /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
4640
5072
  /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
@@ -4646,15 +5078,9 @@ __webpack_require__.r(__webpack_exports__);
4646
5078
  /*
4647
5079
  Fetches all files in the current directory and updates the state of the files.
4648
5080
  */
4649
- const fetchFilesAndUpdateState = async (app, notebookTracker, setFiles) => {
5081
+ const getFiles = async (app, notebookPanel) => {
4650
5082
  const fileManager = app.serviceManager.contents;
4651
- // Get the current notebook
4652
- const currentNotebook = notebookTracker.currentWidget;
4653
- if (!currentNotebook) {
4654
- return;
4655
- }
4656
- // Get the directory path using PathExt.dirname from @jupyterlab/coreutils
4657
- const relativeNotebookPath = currentNotebook.context.path;
5083
+ const relativeNotebookPath = notebookPanel.context.path;
4658
5084
  const relativeDirectoryPath = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__.PathExt.dirname(relativeNotebookPath);
4659
5085
  try {
4660
5086
  const contents = await fileManager.get(relativeDirectoryPath);
@@ -4673,16 +5099,16 @@ const fetchFilesAndUpdateState = async (app, notebookTracker, setFiles) => {
4673
5099
  file_name: file.name
4674
5100
  }));
4675
5101
  // Update the state of the files
4676
- setFiles(files);
5102
+ return files;
4677
5103
  }
4678
5104
  else {
4679
5105
  // If the contents are not a directory, set the files to an empty array
4680
- setFiles([]);
5106
+ return [];
4681
5107
  }
4682
5108
  }
4683
5109
  catch (error) {
4684
5110
  console.error('Error listing directory contents:', error);
4685
- return;
5111
+ return [];
4686
5112
  }
4687
5113
  };
4688
5114
 
@@ -4819,7 +5245,9 @@ def structured_globals():
4819
5245
 
4820
5246
  print(structured_globals())
4821
5247
  `;
4822
- // Function to fetch variables and sync with the frontend
5248
+ /*
5249
+ Function to fetch variables and sync with the frontend
5250
+ */
4823
5251
  function fetchVariablesAndUpdateState(notebookPanel, setVariables) {
4824
5252
  var _a;
4825
5253
  const kernel = (_a = notebookPanel.context.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel;
@@ -4835,7 +5263,7 @@ function fetchVariablesAndUpdateState(notebookPanel, setVariables) {
4835
5263
  // Listen for the output from the kernel
4836
5264
  future.onIOPub = (msg) => {
4837
5265
  // A 'stream' message represents standard output (stdout) or standard error (stderr) produced
4838
- // during the execution of code in the kernel.
5266
+ // during the execution of code in the kernel.
4839
5267
  if (_jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__.KernelMessage.isStreamMsg(msg)) {
4840
5268
  if (msg.content.name === 'stdout') {
4841
5269
  try {
@@ -6214,10 +6642,11 @@ const ContextManagerSection = ({ contextManager }) => {
6214
6642
  // Force a re-render by toggling the state
6215
6643
  setRefreshKey(prev => prev + 1);
6216
6644
  };
6645
+ const activeNotebookContext = contextManager.getActiveNotebookContext();
6217
6646
  const copyContextManagerToClipboard = async () => {
6218
6647
  const jsonContent = JSON.stringify({
6219
- variables: contextManager.variables,
6220
- files: contextManager.files
6648
+ variables: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables,
6649
+ files: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files
6221
6650
  }, null, 2);
6222
6651
  try {
6223
6652
  await navigator.clipboard.writeText(jsonContent);
@@ -6234,8 +6663,8 @@ const ContextManagerSection = ({ contextManager }) => {
6234
6663
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base", onClick: copyContextManagerToClipboard }, "Copy")),
6235
6664
  refreshKey > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "settings-option" },
6236
6665
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("pre", { className: "json-container" }, JSON.stringify({
6237
- variables: contextManager.variables,
6238
- files: contextManager.files
6666
+ variables: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.variables,
6667
+ files: activeNotebookContext === null || activeNotebookContext === void 0 ? void 0 : activeNotebookContext.files
6239
6668
  }, null, 2))))));
6240
6669
  };
6241
6670
 
@@ -6516,142 +6945,6 @@ const SupportPage = () => {
6516
6945
  };
6517
6946
 
6518
6947
 
6519
- /***/ }),
6520
-
6521
- /***/ "./lib/Extensions/StreamlitPreview/StreamlitPreviewPlugin.js":
6522
- /*!*******************************************************************!*\
6523
- !*** ./lib/Extensions/StreamlitPreview/StreamlitPreviewPlugin.js ***!
6524
- \*******************************************************************/
6525
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6526
-
6527
- __webpack_require__.r(__webpack_exports__);
6528
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6529
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
6530
- /* harmony export */ });
6531
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
6532
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
6533
- /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
6534
- /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
6535
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/coreutils */ "webpack/sharing/consume/default/@jupyterlab/coreutils");
6536
- /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__);
6537
- /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
6538
- /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_3__);
6539
- /* harmony import */ var _AiChat_token__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AiChat/token */ "./lib/Extensions/AiChat/token.js");
6540
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
6541
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6542
- /*
6543
- * Copyright (c) Saga Inc.
6544
- * Distributed under the terms of the GNU Affero General Public License v3.0 License.
6545
- */
6546
-
6547
-
6548
-
6549
-
6550
-
6551
-
6552
-
6553
-
6554
-
6555
- /**
6556
- * Simple HTML widget for displaying iframe content.
6557
- */
6558
- class IFrameWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__.Widget {
6559
- constructor(url) {
6560
- super();
6561
- this.addClass('jp-iframe-widget');
6562
- const iframe = document.createElement('iframe');
6563
- iframe.src = url;
6564
- iframe.style.width = '100%';
6565
- iframe.style.height = '100%';
6566
- iframe.style.border = 'none';
6567
- this.node.appendChild(iframe);
6568
- }
6569
- setUrl(url) {
6570
- const iframe = this.node.querySelector('iframe');
6571
- if (iframe) {
6572
- iframe.src = url;
6573
- }
6574
- }
6575
- }
6576
- /**
6577
- * The streamlit preview plugin.
6578
- */
6579
- const StreamlitPreviewPlugin = {
6580
- id: 'mito-ai:streamlit-preview',
6581
- autoStart: true,
6582
- requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AiChat_token__WEBPACK_IMPORTED_MODULE_4__.IChatTracker],
6583
- activate: (app, notebookTracker, palette) => {
6584
- console.log('mito-ai: StreamlitPreviewPlugin activated');
6585
- // Add command to command palette
6586
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_5__.previewAsStreamlit, {
6587
- label: 'Preview as Streamlit',
6588
- caption: 'Convert current notebook to Streamlit app and preview it',
6589
- execute: async () => {
6590
- await previewNotebookAsStreamlit(app, notebookTracker);
6591
- }
6592
- });
6593
- // Add to command palette
6594
- palette.addItem({
6595
- command: _commands__WEBPACK_IMPORTED_MODULE_5__.previewAsStreamlit,
6596
- category: 'Mito AI'
6597
- });
6598
- }
6599
- };
6600
- /**
6601
- * Preview the current notebook as a Streamlit app.
6602
- */
6603
- async function previewNotebookAsStreamlit(app, notebookTracker) {
6604
- const notebookPanel = notebookTracker.currentWidget;
6605
- if (!notebookPanel) {
6606
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.error('No notebook is currently active');
6607
- return;
6608
- }
6609
- // First save the notebook to ensure the app is up to date
6610
- await notebookPanel.context.save();
6611
- const notebookPath = notebookPanel.context.path;
6612
- const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.PathExt.basename(notebookPath, '.ipynb');
6613
- // Show building notification
6614
- const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit('Building App Preview...', 'in-progress', { autoClose: false });
6615
- try {
6616
- const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreview)(notebookPath);
6617
- // Create iframe widget
6618
- const iframeWidget = new IFrameWidget(previewData.url);
6619
- // Create main area widget
6620
- const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
6621
- widget.title.label = `App Preview (${notebookName})`;
6622
- widget.title.closable = true;
6623
- // Handle widget disposal
6624
- widget.disposed.connect(() => {
6625
- console.log('Widget disposed, stopping preview');
6626
- void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.stopStreamlitPreview)(previewData.id);
6627
- });
6628
- // Add widget to main area with split-right mode
6629
- app.shell.add(widget, 'main', {
6630
- mode: 'split-right',
6631
- ref: notebookPanel.id
6632
- });
6633
- // Update notification to success
6634
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
6635
- id: notificationId,
6636
- message: 'Streamlit preview started successfully!',
6637
- type: 'default',
6638
- autoClose: false
6639
- });
6640
- }
6641
- catch (error) {
6642
- console.error('Error starting streamlit preview:', error);
6643
- // Update notification to error
6644
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
6645
- id: notificationId,
6646
- message: `Failed to start preview: ${error instanceof Error ? error.message : 'Unknown error'}`,
6647
- type: 'error',
6648
- autoClose: false
6649
- });
6650
- }
6651
- }
6652
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StreamlitPreviewPlugin);
6653
-
6654
-
6655
6948
  /***/ }),
6656
6949
 
6657
6950
  /***/ "./lib/Extensions/ToolbarButtons/ToolbarButtonsPlugin.js":
@@ -6666,12 +6959,10 @@ __webpack_require__.r(__webpack_exports__);
6666
6959
  /* harmony export */ });
6667
6960
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
6668
6961
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
6669
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6670
- /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
6671
- /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
6672
- /* harmony import */ var _AppBuilder_NotebookToStreamlit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppBuilder/NotebookToStreamlit */ "./lib/Extensions/AppBuilder/NotebookToStreamlit.js");
6673
- /* harmony import */ var _AppBuilder_AppBuilderPlugin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../AppBuilder/AppBuilderPlugin */ "./lib/Extensions/AppBuilder/AppBuilderPlugin.js");
6674
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
6962
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6963
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
6964
+ /* harmony import */ var _utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/cellMetadata */ "./lib/utils/cellMetadata.js");
6965
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
6675
6966
  /*
6676
6967
  * Copyright (c) Saga Inc.
6677
6968
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6681,8 +6972,6 @@ __webpack_require__.r(__webpack_exports__);
6681
6972
 
6682
6973
 
6683
6974
 
6684
-
6685
-
6686
6975
  const ToolbarButtonsPlugin = {
6687
6976
  // Important: The Cell Toolbar Buttons are added to the toolbar registry via the schema/toolbar-buttons.json file.
6688
6977
  // The id here must be mito-ai:toolbar-buttons otherwise the buttons are not successfully added. My understanding is that
@@ -6691,28 +6980,27 @@ const ToolbarButtonsPlugin = {
6691
6980
  description: 'Adds an "explain code cell with AI" button to the cell toolbar',
6692
6981
  autoStart: true,
6693
6982
  requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker],
6694
- optional: [_AppBuilder_AppBuilderPlugin__WEBPACK_IMPORTED_MODULE_1__.IAppBuilderService],
6695
- activate: (app, notebookTracker, appBuilderService) => {
6983
+ activate: (app, notebookTracker) => {
6696
6984
  const { commands } = app;
6697
6985
  // Important: To add a button to the cell toolbar, the command must start with "toolbar-button:"
6698
6986
  // and the command must match the command in the schema/plugin.json file.
6699
6987
  commands.addCommand('toolbar-button:explain-code', {
6700
- icon: _icons__WEBPACK_IMPORTED_MODULE_2__.lightBulbLabIcon,
6988
+ icon: _icons__WEBPACK_IMPORTED_MODULE_1__.lightBulbLabIcon,
6701
6989
  caption: 'Explain code in AI Chat',
6702
6990
  execute: async () => {
6703
6991
  /*
6704
6992
  In order to click on the cell toolbar button, that cell must be the active cell,
6705
6993
  so the ChatHistoryManager will take care of providing the cell context.
6706
6994
  */
6707
- await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_OPEN_CHAT);
6708
- await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE);
6995
+ await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_OPEN_CHAT);
6996
+ await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE);
6709
6997
  },
6710
- isVisible: () => { var _a; return ((_a = notebookTracker.activeCell) === null || _a === void 0 ? void 0 : _a.model.type) === 'code' && app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE); }
6998
+ isVisible: () => { var _a; return ((_a = notebookTracker.activeCell) === null || _a === void 0 ? void 0 : _a.model.type) === 'code' && app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE); }
6711
6999
  });
6712
7000
  commands.addCommand('toolbar-button:toggle-include-cell-in-app', {
6713
7001
  icon: () => {
6714
- const includeCellInApp = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_4__.getActiveCellIncludeInApp)(notebookTracker);
6715
- return includeCellInApp ? _icons__WEBPACK_IMPORTED_MODULE_2__.AppBuilderIncludeCellLabIcon : _icons__WEBPACK_IMPORTED_MODULE_2__.AppBuilderExcludeCellLabIcon;
7002
+ const includeCellInApp = (0,_utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__.getActiveCellIncludeInApp)(notebookTracker);
7003
+ return includeCellInApp ? _icons__WEBPACK_IMPORTED_MODULE_1__.AppBuilderIncludeCellLabIcon : _icons__WEBPACK_IMPORTED_MODULE_1__.AppBuilderExcludeCellLabIcon;
6716
7004
  },
6717
7005
  caption: 'Toggle cell output visibility in Streamlit app',
6718
7006
  execute: async () => {
@@ -6731,45 +7019,31 @@ const ToolbarButtonsPlugin = {
6731
7019
  - Use AI to identify and remove hanging variables
6732
7020
  - Parse code to find and remove lone variable references and literals
6733
7021
  */
6734
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_4__.toggleActiveCellIncludeInAppMetadata)(notebookTracker);
7022
+ (0,_utils_cellMetadata__WEBPACK_IMPORTED_MODULE_3__.toggleActiveCellIncludeInAppMetadata)(notebookTracker);
6735
7023
  // Force command refresh to update the icon
6736
7024
  commands.notifyCommandChanged('toolbar-button:toggle-include-cell-in-app');
6737
7025
  },
6738
7026
  isVisible: () => {
6739
- return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
6740
- }
6741
- });
6742
- commands.addCommand('toolbar-button:convert-to-streamlit', {
6743
- label: 'Deploy App',
6744
- caption: 'Convert to Streamlit',
6745
- className: 'text-button-mito-ai button-base button-purple button-small',
6746
- execute: async () => {
6747
- void (0,_AppBuilder_NotebookToStreamlit__WEBPACK_IMPORTED_MODULE_5__.convertNotebookToStreamlit)(notebookTracker, appBuilderService);
6748
- },
6749
- isVisible: () => {
6750
- // Default to hidden, will be updated after async check since we are not allowed to
6751
- // use async commands in isVisible.
6752
- return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
7027
+ return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
6753
7028
  }
6754
7029
  });
6755
7030
  commands.addCommand('toolbar-button:preview-as-streamlit', {
6756
- label: 'Preview App',
6757
- caption: 'Preview as Streamlit',
7031
+ label: 'App Mode',
7032
+ caption: 'Preview notebook as app and turn on App Mode',
6758
7033
  className: 'text-button-mito-ai button-base button-purple button-small',
6759
7034
  execute: async () => {
6760
7035
  void app.commands.execute('mito-ai:preview-as-streamlit');
6761
7036
  },
6762
7037
  isVisible: () => {
6763
- return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
7038
+ return app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED);
6764
7039
  }
6765
7040
  });
6766
7041
  // Check if the beta mode is enabled. After checking, tell Jupyter to
6767
7042
  // re-evaluate convert-to-streamlit visibility now that we have had the
6768
7043
  // opportunity to set the mito-ai:beta-mode-enabled command if beta mode is enabled.
6769
- (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_6__.getSetting)('beta_mode').then(value => {
7044
+ (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_4__.getSetting)('beta_mode').then(value => {
6770
7045
  if (value === 'true') {
6771
- commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_BETA_MODE_ENABLED, { execute: () => { } });
6772
- commands.notifyCommandChanged('toolbar-button:convert-to-streamlit');
7046
+ commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_2__.COMMAND_MITO_AI_BETA_MODE_ENABLED, { execute: () => { } });
6773
7047
  commands.notifyCommandChanged('toolbar-button:toggle-include-cell-in-app');
6774
7048
  commands.notifyCommandChanged('toolbar-button:preview-as-streamlit');
6775
7049
  }
@@ -7264,13 +7538,13 @@ __webpack_require__.r(__webpack_exports__);
7264
7538
  /* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE),
7265
7539
  /* harmony export */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE: () => (/* binding */ COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE),
7266
7540
  /* harmony export */ COMMAND_MITO_AI_OPEN_CHAT: () => (/* binding */ COMMAND_MITO_AI_OPEN_CHAT),
7541
+ /* harmony export */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT),
7267
7542
  /* harmony export */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE: () => (/* binding */ COMMAND_MITO_AI_PREVIEW_LATEST_CODE),
7268
7543
  /* harmony export */ COMMAND_MITO_AI_REJECT_LATEST_CODE: () => (/* binding */ COMMAND_MITO_AI_REJECT_LATEST_CODE),
7269
7544
  /* harmony export */ COMMAND_MITO_AI_SEND_AGENT_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_AGENT_MESSAGE),
7270
7545
  /* harmony export */ COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE),
7271
7546
  /* harmony export */ COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE),
7272
- /* harmony export */ COMMAND_MITO_AI_SEND_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_MESSAGE),
7273
- /* harmony export */ previewAsStreamlit: () => (/* binding */ previewAsStreamlit)
7547
+ /* harmony export */ COMMAND_MITO_AI_SEND_MESSAGE: () => (/* binding */ COMMAND_MITO_AI_SEND_MESSAGE)
7274
7548
  /* harmony export */ });
7275
7549
  /*
7276
7550
  * Copyright (c) Saga Inc.
@@ -7290,7 +7564,7 @@ const COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE = `toolbar-button:reject-code`;
7290
7564
  // Beta mode commands
7291
7565
  const COMMAND_MITO_AI_BETA_MODE_ENABLED = `${MITO_AI}:beta-mode-enabled`;
7292
7566
  // Streamlit commands
7293
- const previewAsStreamlit = 'mito-ai:preview-as-streamlit';
7567
+ const COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT = 'mito-ai:preview-as-streamlit';
7294
7568
 
7295
7569
 
7296
7570
  /***/ }),
@@ -7972,9 +8246,7 @@ __webpack_require__.r(__webpack_exports__);
7972
8246
 
7973
8247
 
7974
8248
  const MODEL_MAPPINGS = [
7975
- { displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.GPT_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.GPT_MODEL_NAME },
7976
8249
  { displayName: 'GPT 4.1', fullName: 'gpt-4.1' },
7977
- { displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_OPUS_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_OPUS_MODEL_NAME },
7978
8250
  { displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_MODEL_NAME },
7979
8251
  { displayName: 'Gemini 2.5 Pro', fullName: 'gemini-2.5-pro-preview-03-25' }
7980
8252
  ];
@@ -8886,6 +9158,7 @@ __webpack_require__.r(__webpack_exports__);
8886
9158
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8887
9159
  /* harmony export */ AppBuilderExcludeCellLabIcon: () => (/* binding */ AppBuilderExcludeCellLabIcon),
8888
9160
  /* harmony export */ AppBuilderIncludeCellLabIcon: () => (/* binding */ AppBuilderIncludeCellLabIcon),
9161
+ /* harmony export */ DeployLabIcon: () => (/* binding */ DeployLabIcon),
8889
9162
  /* harmony export */ NucleusLabIcon: () => (/* binding */ NucleusLabIcon),
8890
9163
  /* harmony export */ OpenIndicatorLabIcon: () => (/* binding */ OpenIndicatorLabIcon),
8891
9164
  /* harmony export */ lightBulbLabIcon: () => (/* binding */ lightBulbLabIcon)
@@ -8897,6 +9170,7 @@ __webpack_require__.r(__webpack_exports__);
8897
9170
  /* harmony import */ var _src_icons_OpenIndicatorIcon_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/icons/OpenIndicatorIcon.svg */ "./src/icons/OpenIndicatorIcon.svg");
8898
9171
  /* harmony import */ var _src_icons_AppBuilderExcludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/icons/AppBuilderExcludeCellIcon.svg */ "./src/icons/AppBuilderExcludeCellIcon.svg");
8899
9172
  /* harmony import */ var _src_icons_AppBuilderIncludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/icons/AppBuilderIncludeCellIcon.svg */ "./src/icons/AppBuilderIncludeCellIcon.svg");
9173
+ /* harmony import */ var _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/icons/App/DeployIcon.svg */ "./src/icons/App/DeployIcon.svg");
8900
9174
  /*
8901
9175
  * Copyright (c) Saga Inc.
8902
9176
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -8907,6 +9181,7 @@ __webpack_require__.r(__webpack_exports__);
8907
9181
 
8908
9182
 
8909
9183
 
9184
+
8910
9185
  const lightBulbLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
8911
9186
  name: 'lightbulb-icon',
8912
9187
  svgstr: _src_icons_LightbulbIcon_svg__WEBPACK_IMPORTED_MODULE_1__
@@ -8927,6 +9202,10 @@ const AppBuilderIncludeCellLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPO
8927
9202
  name: 'app-builder-include-cell-icon',
8928
9203
  svgstr: _src_icons_AppBuilderIncludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_5__
8929
9204
  });
9205
+ const DeployLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
9206
+ name: 'deploy-icon',
9207
+ svgstr: _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__
9208
+ });
8930
9209
 
8931
9210
 
8932
9211
  /***/ }),
@@ -8945,8 +9224,8 @@ __webpack_require__.r(__webpack_exports__);
8945
9224
  /* harmony import */ var _Extensions_ContextManager_ContextManagerPlugin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Extensions/ContextManager/ContextManagerPlugin */ "./lib/Extensions/ContextManager/ContextManagerPlugin.js");
8946
9225
  /* harmony import */ var _Extensions_ErrorMimeRenderer_ErrorMimeRendererPlugin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Extensions/ErrorMimeRenderer/ErrorMimeRendererPlugin */ "./lib/Extensions/ErrorMimeRenderer/ErrorMimeRendererPlugin.js");
8947
9226
  /* harmony import */ var _Extensions_ToolbarButtons_ToolbarButtonsPlugin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Extensions/ToolbarButtons/ToolbarButtonsPlugin */ "./lib/Extensions/ToolbarButtons/ToolbarButtonsPlugin.js");
8948
- /* harmony import */ var _Extensions_AppBuilder_AppBuilderPlugin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Extensions/AppBuilder/AppBuilderPlugin */ "./lib/Extensions/AppBuilder/AppBuilderPlugin.js");
8949
- /* harmony import */ var _Extensions_StreamlitPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Extensions/StreamlitPreview/StreamlitPreviewPlugin */ "./lib/Extensions/StreamlitPreview/StreamlitPreviewPlugin.js");
9227
+ /* harmony import */ var _Extensions_AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Extensions/AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
9228
+ /* harmony import */ var _Extensions_AppPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Extensions/AppPreview/StreamlitPreviewPlugin */ "./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js");
8950
9229
  /* harmony import */ var _Extensions_emptyCell_EmptyCellPlugin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Extensions/emptyCell/EmptyCellPlugin */ "./lib/Extensions/emptyCell/EmptyCellPlugin.js");
8951
9230
  /* harmony import */ var _Extensions_status__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Extensions/status */ "./lib/Extensions/status/index.js");
8952
9231
  /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
@@ -8975,8 +9254,8 @@ __webpack_require__.r(__webpack_exports__);
8975
9254
  _Extensions_AiChat_AiChatPlugin__WEBPACK_IMPORTED_MODULE_0__["default"],
8976
9255
  _Extensions_ErrorMimeRenderer_ErrorMimeRendererPlugin__WEBPACK_IMPORTED_MODULE_1__["default"],
8977
9256
  _Extensions_ContextManager_ContextManagerPlugin__WEBPACK_IMPORTED_MODULE_2__["default"],
8978
- _Extensions_AppBuilder_AppBuilderPlugin__WEBPACK_IMPORTED_MODULE_3__["default"],
8979
- _Extensions_StreamlitPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__["default"],
9257
+ _Extensions_AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_3__["default"],
9258
+ _Extensions_AppPreview_StreamlitPreviewPlugin__WEBPACK_IMPORTED_MODULE_4__["default"],
8980
9259
  _Extensions_ToolbarButtons_ToolbarButtonsPlugin__WEBPACK_IMPORTED_MODULE_5__["default"],
8981
9260
  _Extensions_emptyCell_EmptyCellPlugin__WEBPACK_IMPORTED_MODULE_6__.emptyCellPlaceholder,
8982
9261
  _Extensions_status__WEBPACK_IMPORTED_MODULE_7__.statusItem,
@@ -9100,10 +9379,10 @@ const getDatabaseConnections = async () => {
9100
9379
  STREAMLIT PREVIEW ENDPOINTS
9101
9380
 
9102
9381
  ************************************/
9103
- const startStreamlitPreview = async (notebookPath) => {
9382
+ const startStreamlitPreview = async (notebookPath, force_recreate = false) => {
9104
9383
  const response = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('streamlit-preview', {
9105
9384
  method: 'POST',
9106
- body: JSON.stringify({ notebook_path: notebookPath }),
9385
+ body: JSON.stringify({ notebook_path: notebookPath, force_recreate: force_recreate }),
9107
9386
  });
9108
9387
  if (response.error) {
9109
9388
  throw new Error(response.error.message);
@@ -9227,13 +9506,14 @@ const getXsrfToken = () => {
9227
9506
  __webpack_require__.r(__webpack_exports__);
9228
9507
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9229
9508
  /* harmony export */ acceptAndRunCellUpdate: () => (/* binding */ acceptAndRunCellUpdate),
9230
- /* harmony export */ acceptAndRunCode: () => (/* binding */ acceptAndRunCode),
9231
9509
  /* harmony export */ retryIfExecutionError: () => (/* binding */ retryIfExecutionError),
9232
9510
  /* harmony export */ runAllCells: () => (/* binding */ runAllCells)
9233
9511
  /* harmony export */ });
9234
- /* harmony import */ var _Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Extensions/ErrorMimeRenderer/errorUtils */ "./lib/Extensions/ErrorMimeRenderer/errorUtils.js");
9235
- /* harmony import */ var _sleep__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sleep */ "./lib/utils/sleep.js");
9236
- /* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
9512
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
9513
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
9514
+ /* harmony import */ var _Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Extensions/ErrorMimeRenderer/errorUtils */ "./lib/Extensions/ErrorMimeRenderer/errorUtils.js");
9515
+ /* harmony import */ var _sleep__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sleep */ "./lib/utils/sleep.js");
9516
+ /* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
9237
9517
  /*
9238
9518
  * Copyright (c) Saga Inc.
9239
9519
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -9241,70 +9521,71 @@ __webpack_require__.r(__webpack_exports__);
9241
9521
 
9242
9522
 
9243
9523
 
9244
- const acceptAndRunCellUpdate = async (cellUpdate, notebookTracker, app, previewAICodeToActiveCell, acceptAICode) => {
9524
+
9525
+
9526
+ const acceptAndRunCellUpdate = async (cellUpdate, notebookPanel) => {
9245
9527
  // If the cellUpdate is creating a new code cell, insert it
9246
- // before previewing and accepting the code.
9528
+ // before previewing and accepting the code. It is safe to do this
9529
+ // in the background agent because it does not effect the active cell
9530
+ // in other notebooks.
9247
9531
  if (cellUpdate.type === 'new') {
9248
9532
  // makes the cell the active cell
9249
- (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.createCodeCellAtIndexAndActivate)(notebookTracker, cellUpdate.index);
9533
+ (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.createCodeCellAtIndexAndActivate)(notebookPanel, cellUpdate.index);
9250
9534
  }
9251
9535
  else {
9252
- (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.setActiveCellByID)(notebookTracker, cellUpdate.id);
9536
+ (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.setActiveCellByIDInNotebookPanel)(notebookPanel, cellUpdate.id);
9253
9537
  }
9254
- // The target cell should now be the active cell
9255
- await acceptAndRunCode(app, notebookTracker, previewAICodeToActiveCell, acceptAICode, cellUpdate.cell_type);
9256
- };
9257
- const acceptAndRunCode = async (app, notebookTracker, previewAICodeToActiveCell, acceptAICode, cellType) => {
9258
- /*
9259
- PreviewAICode applies the code to the current active code cell,
9260
- so make sure that correct cell is active before calling
9261
- this function
9262
- */
9263
- previewAICodeToActiveCell();
9264
- acceptAICode();
9538
+ const notebook = notebookPanel.content;
9539
+ const context = notebookPanel.context;
9540
+ if (notebook === undefined) {
9541
+ return;
9542
+ }
9543
+ const cellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
9544
+ (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.writeCodeToCellByIDInNotebookPanel)(notebookPanel, cellUpdate.code, cellID);
9265
9545
  // We always create code cells, and then convert to markdown if necessary.
9266
- if (cellType === 'markdown') {
9267
- await app.commands.execute("notebook:change-cell-to-markdown");
9546
+ if (cellUpdate.cell_type === 'markdown') {
9547
+ _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.changeCellType(notebook, 'markdown');
9268
9548
  }
9269
- else if (cellType === 'code') {
9270
- await app.commands.execute("notebook:change-cell-to-code");
9549
+ else if (cellUpdate.cell_type === 'code') {
9550
+ _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.changeCellType(notebook, 'code');
9271
9551
  }
9272
9552
  // This awaits until after the execution is finished.
9273
9553
  // Note that it is important that we just run the cell and don't run and advance the cell.
9274
9554
  // We rely on the active cell remaining the same after running the cell in order to get the output
9275
9555
  // of the cell to send to the agent. This is changeable in the future, but for now its an invariant we rely on.
9276
- await app.commands.execute("notebook:run-cell");
9556
+ await _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.run(notebook, context === null || context === void 0 ? void 0 : context.sessionContext);
9277
9557
  // Scroll to the bottom of the active cell to show the output
9278
- const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(notebookTracker);
9558
+ // as long as we are not operating in background agent mode.
9559
+ const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellIDInNotebookPanel)(notebookPanel);
9279
9560
  if (activeCellID) {
9280
- (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.scrollToCell)(notebookTracker, activeCellID, undefined, 'end');
9561
+ (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.scrollToCell)(notebookPanel, activeCellID, undefined, 'end');
9281
9562
  }
9282
9563
  // By sleeping here, we make sure that this function returns after the variable manager
9283
9564
  // has updated the state of the variables. This ensures that on the next Ai message
9284
9565
  // gets the most up to date data.
9285
- await (0,_sleep__WEBPACK_IMPORTED_MODULE_1__.sleep)(1000);
9566
+ await (0,_sleep__WEBPACK_IMPORTED_MODULE_2__.sleep)(1000);
9286
9567
  };
9287
- const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHistoryManager, addAIMessageFromResponseAndUpdateState, sendAgentSmartDebugMessage, previewAICodeToActiveCell, acceptAICode, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef) => {
9288
- var _a, _b, _c;
9289
- const cell = (_b = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.activeCell;
9568
+ const retryIfExecutionError = async (notebookPanel, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef) => {
9569
+ var _a;
9570
+ const cell = notebookPanel.content.activeCell;
9290
9571
  // Note: If you update the max retries, update the message we display on each failure
9291
9572
  // attempt to ensure we don't say "third attempt" over and over again.
9292
9573
  const MAX_RETRIES = 3;
9293
9574
  let attempts = 0;
9294
9575
  let runAllCellsAttempts = 0;
9295
9576
  const MAX_RUN_ALL_CELLS_ATTEMPTS = 2; // Only allow two run_all_cells attempt per error cycle
9296
- while ((0,_notebook__WEBPACK_IMPORTED_MODULE_0__.didCellExecutionError)(cell) && attempts < MAX_RETRIES) {
9577
+ while ((0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(cell) && attempts < MAX_RETRIES) {
9297
9578
  if (!shouldContinueAgentExecution.current) {
9298
9579
  finalizeAgentStop();
9299
9580
  return 'interupted';
9300
9581
  }
9301
9582
  // If the code cell has an error, we need to send the error to the AI
9302
9583
  // and get it to fix the error.
9303
- const errorOutput = (_c = cell === null || cell === void 0 ? void 0 : cell.model.outputs) === null || _c === void 0 ? void 0 : _c.toJSON().find(output => output.output_type === "error");
9584
+ const errorOutput = (_a = cell === null || cell === void 0 ? void 0 : cell.model.outputs) === null || _a === void 0 ? void 0 : _a.toJSON().find(output => output.output_type === "error");
9304
9585
  if (!errorOutput) {
9305
9586
  return 'success'; // If no error output, we're done
9306
9587
  }
9307
- const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
9588
+ const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
9308
9589
  await sendAgentSmartDebugMessage(errorMessage);
9309
9590
  const aiDisplayOptimizedChatItem = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
9310
9591
  // Handle different response types from the agent when fixing errors
@@ -9315,7 +9596,7 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
9315
9596
  if (agentResponse.type === 'cell_update') {
9316
9597
  const cellUpdate = agentResponse.cell_update;
9317
9598
  if (cellUpdate !== undefined && cellUpdate !== null) {
9318
- await acceptAndRunCellUpdate(cellUpdate, notebookTracker, app, previewAICodeToActiveCell, acceptAICode);
9599
+ await acceptAndRunCellUpdate(cellUpdate, notebookPanel);
9319
9600
  }
9320
9601
  }
9321
9602
  else if (agentResponse.type === 'run_all_cells') {
@@ -9326,7 +9607,7 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
9326
9607
  }
9327
9608
  runAllCellsAttempts++;
9328
9609
  // Execute runAllCells to fix NameError issues
9329
- const result = await runAllCells(app, notebookTracker);
9610
+ const result = await runAllCells(app, notebookPanel);
9330
9611
  if (!result.success) {
9331
9612
  // If run_all_cells resulted in an error, we should continue with error handling
9332
9613
  // The error will be caught in the main loop
@@ -9339,32 +9620,29 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
9339
9620
  }
9340
9621
  attempts++;
9341
9622
  // If this was the last attempt and it still failed
9342
- if (attempts === MAX_RETRIES && (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.didCellExecutionError)(cell)) {
9623
+ if (attempts === MAX_RETRIES && (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(cell)) {
9343
9624
  return 'failure';
9344
9625
  }
9345
9626
  }
9346
9627
  return 'success';
9347
9628
  };
9348
- const runAllCells = async (app, notebookTracker) => {
9629
+ const runAllCells = async (app, notebookPanel) => {
9349
9630
  var _a, _b;
9350
- await app.commands.execute("notebook:run-all-cells");
9631
+ const notebook = notebookPanel.content;
9632
+ const sessionContext = (_a = notebookPanel.context) === null || _a === void 0 ? void 0 : _a.sessionContext;
9633
+ await _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.NotebookActions.runAll(notebook, sessionContext);
9351
9634
  // Give the execution some time to complete and update variables
9352
9635
  // This ensures that the variable manager has time to update the state
9353
- await (0,_sleep__WEBPACK_IMPORTED_MODULE_1__.sleep)(2000);
9354
- // Check all cells for errors after execution
9355
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
9356
- if (!notebook) {
9357
- return { success: false, errorMessage: "No active notebook found" };
9358
- }
9636
+ await (0,_sleep__WEBPACK_IMPORTED_MODULE_2__.sleep)(2000);
9359
9637
  // Iterate through all cells to find any with errors
9360
9638
  for (let i = 0; i < notebook.widgets.length; i++) {
9361
9639
  const cell = notebook.widgets[i];
9362
9640
  if (cell && cell.model.type === 'code') {
9363
9641
  const codeCell = cell;
9364
- if ((0,_notebook__WEBPACK_IMPORTED_MODULE_0__.didCellExecutionError)(codeCell)) {
9642
+ if ((0,_notebook__WEBPACK_IMPORTED_MODULE_1__.didCellExecutionError)(codeCell)) {
9365
9643
  const errorOutput = (_b = codeCell.model.outputs) === null || _b === void 0 ? void 0 : _b.toJSON().find(output => output.output_type === "error");
9366
9644
  if (errorOutput) {
9367
- const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
9645
+ const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_3__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
9368
9646
  return {
9369
9647
  success: false,
9370
9648
  errorMessage: errorMessage,
@@ -9503,7 +9781,147 @@ const checkForBlacklistedWords = (code) => {
9503
9781
  };
9504
9782
  }
9505
9783
  }
9506
- return { safe: true };
9784
+ return { safe: true };
9785
+ };
9786
+
9787
+
9788
+ /***/ }),
9789
+
9790
+ /***/ "./lib/utils/cellMetadata.js":
9791
+ /*!***********************************!*\
9792
+ !*** ./lib/utils/cellMetadata.js ***!
9793
+ \***********************************/
9794
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9795
+
9796
+ __webpack_require__.r(__webpack_exports__);
9797
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9798
+ /* harmony export */ getActiveCellIncludeInApp: () => (/* binding */ getActiveCellIncludeInApp),
9799
+ /* harmony export */ getIncludeCellInApp: () => (/* binding */ getIncludeCellInApp),
9800
+ /* harmony export */ toggleActiveCellIncludeInAppMetadata: () => (/* binding */ toggleActiveCellIncludeInAppMetadata),
9801
+ /* harmony export */ toggleIncludeCellInAppMetadata: () => (/* binding */ toggleIncludeCellInAppMetadata)
9802
+ /* harmony export */ });
9803
+ /* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
9804
+ /*
9805
+ * Copyright (c) Saga Inc.
9806
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
9807
+ */
9808
+
9809
+ const INCLUDE_CELL_IN_APP = 'include-cell-in-app';
9810
+ const toggleActiveCellIncludeInAppMetadata = (notebookTracker) => {
9811
+ const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(notebookTracker);
9812
+ toggleIncludeCellInAppMetadata(notebookTracker, activeCellID);
9813
+ };
9814
+ const toggleIncludeCellInAppMetadata = (notebookTracker, cellID) => {
9815
+ if (cellID === undefined) {
9816
+ return;
9817
+ }
9818
+ const cell = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellByID)(notebookTracker, cellID);
9819
+ if (!cell) {
9820
+ return undefined;
9821
+ }
9822
+ if (Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
9823
+ const originalVisibility = cell.model.getMetadata(INCLUDE_CELL_IN_APP);
9824
+ cell.model.setMetadata(INCLUDE_CELL_IN_APP, !originalVisibility);
9825
+ }
9826
+ else {
9827
+ // If the metadata doesn't exist yet, that means the user has not yet toggled the visibility.
9828
+ // The default value is to show the output, so the first toggle should set the visibiltiy to false.
9829
+ cell.model.setMetadata(INCLUDE_CELL_IN_APP, false);
9830
+ }
9831
+ };
9832
+ const getActiveCellIncludeInApp = (notebookTracker) => {
9833
+ const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getActiveCellID)(notebookTracker);
9834
+ return getIncludeCellInApp(notebookTracker, activeCellID);
9835
+ };
9836
+ const getIncludeCellInApp = (notebookTracker, cellID) => {
9837
+ /*
9838
+ Checks the cell metadata tag to see if the user has marked that this cell should not be included in the app.
9839
+ */
9840
+ const cell = (0,_notebook__WEBPACK_IMPORTED_MODULE_0__.getCellByID)(notebookTracker, cellID);
9841
+ if (!cell) {
9842
+ return false;
9843
+ }
9844
+ if (!Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
9845
+ cell.model.setMetadata(INCLUDE_CELL_IN_APP, true);
9846
+ }
9847
+ return cell.model.getMetadata(INCLUDE_CELL_IN_APP);
9848
+ };
9849
+
9850
+
9851
+ /***/ }),
9852
+
9853
+ /***/ "./lib/utils/cellOutput.js":
9854
+ /*!*********************************!*\
9855
+ !*** ./lib/utils/cellOutput.js ***!
9856
+ \*********************************/
9857
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9858
+
9859
+ __webpack_require__.r(__webpack_exports__);
9860
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9861
+ /* harmony export */ getActiveCellOutput: () => (/* binding */ getActiveCellOutput),
9862
+ /* harmony export */ getCellOutputByID: () => (/* binding */ getCellOutputByID),
9863
+ /* harmony export */ getCellOutputByIDInNotebook: () => (/* binding */ getCellOutputByIDInNotebook)
9864
+ /* harmony export */ });
9865
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/cells */ "webpack/sharing/consume/default/@jupyterlab/cells");
9866
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__);
9867
+ /* harmony import */ var _notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./notebook */ "./lib/utils/notebook.js");
9868
+ /*
9869
+ * Copyright (c) Saga Inc.
9870
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
9871
+ */
9872
+
9873
+
9874
+ const getActiveCellOutput = async (notebookTracker) => {
9875
+ const activeCellID = (0,_notebook__WEBPACK_IMPORTED_MODULE_1__.getActiveCellID)(notebookTracker);
9876
+ return getCellOutputByID(notebookTracker, activeCellID);
9877
+ };
9878
+ const getCellOutputByID = async (notebookTracker, codeCellID) => {
9879
+ const notebookPanel = notebookTracker.currentWidget;
9880
+ return getCellOutputByIDInNotebook(notebookPanel, codeCellID);
9881
+ };
9882
+ const getCellOutputByIDInNotebook = async (notebookPanel, codeCellID) => {
9883
+ // TODO: There is a bug where if the cell is not actually rendered on the screen,
9884
+ // then the output is not captured. This is pretty unlikely to happen currently because
9885
+ // the agent scrolls to the cell.
9886
+ var _a;
9887
+ if (codeCellID === undefined || notebookPanel === null) {
9888
+ return undefined;
9889
+ }
9890
+ const cell = notebookPanel.content.widgets.find(cell => cell.model.id === codeCellID);
9891
+ if (!(cell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__.CodeCell)) {
9892
+ return undefined;
9893
+ }
9894
+ const outputNode = (_a = cell.outputArea) === null || _a === void 0 ? void 0 : _a.node;
9895
+ if (!outputNode)
9896
+ return undefined;
9897
+ // Find the top-level Jupyter image output div
9898
+ // so we can check if there is a base64 encoded image
9899
+ // already constructed for us.
9900
+ const renderedImageDiv = outputNode.querySelector('.jp-RenderedImage.jp-OutputArea-output');
9901
+ // If the image is the top-level output, then just use that instead
9902
+ // of capturing the entire output node. This is much faster and handles
9903
+ // matplotlib graphs.
9904
+ if (renderedImageDiv) {
9905
+ const img = renderedImageDiv.querySelector('img');
9906
+ if (img && img.src.startsWith('data:image')) {
9907
+ console.log('image found in top-level output');
9908
+ // Remove the data URL prefix
9909
+ // The img is initially in the format data:image/png;base64, <base64_data>
9910
+ // We want to return the base64 data.
9911
+ const base64 = img.src.split(',')[1];
9912
+ return base64;
9913
+ }
9914
+ }
9915
+ // Fallback: (optional) handle other output types, or use captureNode if needed
9916
+ // Previously, we used html2canvas to capture the entire output node. This would
9917
+ // give us the output even if it was html, svg, text, etc. However, starting around
9918
+ // Chrome release 138, html2canvas became untenably slow. https://issues.chromium.org/issues/429073017
9919
+ if (outputNode) {
9920
+ // If the AI requested, a cell output that we cannot provide, we just tell it
9921
+ // "Cell Output is present in notebook, but not available to share with the AI right now"
9922
+ return "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rNkrAoqAIqAIKAKKgCKgCCgCioAioAgoAoqAIqAIKAKKgCKgjliVAUVAEVAEFAFFQBFQBBQBRUARUAQUAUVAEVAEFAFFQBFQBJqMwHDjiP3888+jUPXq1cuMPPLI0TB5+NNPP5mff/5Zfrprz549zfjjj+9+640ioAgoAoqAItAKBP7++28zbNiwpKgxxhijFUWWWsZvv/1murq6TI8ePcxoo41Wat7NzKy7495MbDTv4ROBIvZzEUTKaGvt4r1IvUf0tL/++msCAf0C/YPS8I+A2AOMx0cdddRuVeHuzHu3Ano4YlZ13HD0MptclaY5YocOHWpef/118+qrrxruJ5tsMjP11FObxRZbzIwyyiilVuubb74xvXv3juZ5xRVXmEUWWSQaJg+POOIIc9FFF8lPd11ooYXM1Vdf7X43++aLL74wL7/8snnllVfMOOOMY+aee24zxxxzmO44CG82Vp2Y//TTT5+wtdlmm5n+/ft3IovKkyLgENhuu+3Mvffem+jlBx54wD3Xm85A4PLLLzf9+vVLmBk8eLCZccYZO4OxBrmg//z222+Tfuymm25qMFX7o3V33NuPoHLQbgReeukls/baaydsDBo0yKyxxhqpLBW1n1MzbiCgaFtrJ+8NVE+jRBB47733zPLLL5+EHH744aZPnz6RWPqoVQi0atwi9sBKK61kzjzzzFZVr5RyujPvPgA4lPHLCPHuxxtvPPlZdf3hhx/Mu+++W/U89mDKKac0E088cSyoY55l6ReLMK06rgh6I17a0h2xzALsv//+5vbbb4+iOeaYY5oTTjjBrLjiitHwPA+/++47s+CCC0aTNuKIHTBggLnggguq0rfKEcuqgEMOOcRceeWVVTzw4PzzzzfLLLNMNKyshy+++KIZMmRIkt1WW21lJpxwwrKybno+ncK7GDQbbrihGThwYNPrrQV0TwQ6RV633nprgwN20kknNY899lj3BLOFXN92223mjTfeMKOPPrrp27dv00u+7LLLkn6Bgu6++24z00wzNb3MMguQwQsTit3JEdspuGPXiF2ywgormHnmmafM19PRebW6rXU0GDmYe/755816662XpDzxxBOdUzaWVVH7OZZno8+KtrV28t5oHRuJNyLJu++kOOyww8wWW2zRCEQap0kI5Bm35JHXueaay/zyyy+m3Y7Y7sx7URG48847K2zX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";
9923
+ }
9924
+ return undefined;
9507
9925
  };
9508
9926
 
9509
9927
 
@@ -9994,23 +10412,19 @@ const stripFileEnding = (rule) => {
9994
10412
 
9995
10413
  __webpack_require__.r(__webpack_exports__);
9996
10414
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9997
- /* harmony export */ CLAUDE_OPUS_DISPLAY_NAME: () => (/* binding */ CLAUDE_OPUS_DISPLAY_NAME),
9998
- /* harmony export */ CLAUDE_OPUS_MODEL_NAME: () => (/* binding */ CLAUDE_OPUS_MODEL_NAME),
9999
10415
  /* harmony export */ CLAUDE_SONNET_DISPLAY_NAME: () => (/* binding */ CLAUDE_SONNET_DISPLAY_NAME),
10000
10416
  /* harmony export */ CLAUDE_SONNET_MODEL_NAME: () => (/* binding */ CLAUDE_SONNET_MODEL_NAME),
10001
- /* harmony export */ GPT_DISPLAY_NAME: () => (/* binding */ GPT_DISPLAY_NAME),
10002
- /* harmony export */ GPT_MODEL_NAME: () => (/* binding */ GPT_MODEL_NAME)
10417
+ /* harmony export */ GPT_4_1_DISPLAY_NAME: () => (/* binding */ GPT_4_1_DISPLAY_NAME),
10418
+ /* harmony export */ GPT_4_1_MODEL_NAME: () => (/* binding */ GPT_4_1_MODEL_NAME)
10003
10419
  /* harmony export */ });
10004
10420
  /*
10005
10421
  * Copyright (c) Saga Inc.
10006
10422
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
10007
10423
  */
10008
- const CLAUDE_OPUS_DISPLAY_NAME = 'Claude 4.1 Opus';
10009
- const CLAUDE_OPUS_MODEL_NAME = 'claude-opus-4-1-20250805';
10010
10424
  const CLAUDE_SONNET_DISPLAY_NAME = 'Claude 4 Sonnet';
10011
10425
  const CLAUDE_SONNET_MODEL_NAME = 'claude-sonnet-4-20250514';
10012
- const GPT_DISPLAY_NAME = 'GPT 5 (max)';
10013
- const GPT_MODEL_NAME = 'gpt-5';
10426
+ const GPT_4_1_DISPLAY_NAME = 'GPT 4.1';
10427
+ const GPT_4_1_MODEL_NAME = 'gpt-4.1';
10014
10428
 
10015
10429
 
10016
10430
  /***/ }),
@@ -10026,156 +10440,82 @@ __webpack_require__.r(__webpack_exports__);
10026
10440
  /* harmony export */ createCodeCellAtIndexAndActivate: () => (/* binding */ createCodeCellAtIndexAndActivate),
10027
10441
  /* harmony export */ didCellExecutionError: () => (/* binding */ didCellExecutionError),
10028
10442
  /* harmony export */ getAIOptimizedCells: () => (/* binding */ getAIOptimizedCells),
10443
+ /* harmony export */ getAIOptimizedCellsInNotebookPanel: () => (/* binding */ getAIOptimizedCellsInNotebookPanel),
10029
10444
  /* harmony export */ getActiveCell: () => (/* binding */ getActiveCell),
10030
10445
  /* harmony export */ getActiveCellCode: () => (/* binding */ getActiveCellCode),
10031
10446
  /* harmony export */ getActiveCellID: () => (/* binding */ getActiveCellID),
10032
- /* harmony export */ getActiveCellIncludeInApp: () => (/* binding */ getActiveCellIncludeInApp),
10033
- /* harmony export */ getActiveCellOutput: () => (/* binding */ getActiveCellOutput),
10447
+ /* harmony export */ getActiveCellIDInNotebookPanel: () => (/* binding */ getActiveCellIDInNotebookPanel),
10448
+ /* harmony export */ getActiveCellInNotebookPanel: () => (/* binding */ getActiveCellInNotebookPanel),
10034
10449
  /* harmony export */ getCellByID: () => (/* binding */ getCellByID),
10450
+ /* harmony export */ getCellByIDInNotebookPanel: () => (/* binding */ getCellByIDInNotebookPanel),
10035
10451
  /* harmony export */ getCellCodeByID: () => (/* binding */ getCellCodeByID),
10452
+ /* harmony export */ getCellCodeByIDInNotebookPanel: () => (/* binding */ getCellCodeByIDInNotebookPanel),
10036
10453
  /* harmony export */ getCellIndexByID: () => (/* binding */ getCellIndexByID),
10037
- /* harmony export */ getCellOutputByID: () => (/* binding */ getCellOutputByID),
10038
- /* harmony export */ getIncludeCellInApp: () => (/* binding */ getIncludeCellInApp),
10454
+ /* harmony export */ getCellIndexByIDInNotebookPanel: () => (/* binding */ getCellIndexByIDInNotebookPanel),
10039
10455
  /* harmony export */ getNotebookName: () => (/* binding */ getNotebookName),
10040
10456
  /* harmony export */ highlightCodeCell: () => (/* binding */ highlightCodeCell),
10041
10457
  /* harmony export */ highlightLinesOfCodeInCodeCell: () => (/* binding */ highlightLinesOfCodeInCodeCell),
10042
10458
  /* harmony export */ scrollToAndHighlightCell: () => (/* binding */ scrollToAndHighlightCell),
10043
10459
  /* harmony export */ scrollToCell: () => (/* binding */ scrollToCell),
10044
10460
  /* harmony export */ setActiveCellByID: () => (/* binding */ setActiveCellByID),
10045
- /* harmony export */ toggleActiveCellIncludeInAppMetadata: () => (/* binding */ toggleActiveCellIncludeInAppMetadata),
10046
- /* harmony export */ toggleIncludeCellInAppMetadata: () => (/* binding */ toggleIncludeCellInAppMetadata),
10047
- /* harmony export */ writeCodeToCellByID: () => (/* binding */ writeCodeToCellByID)
10461
+ /* harmony export */ setActiveCellByIDInNotebookPanel: () => (/* binding */ setActiveCellByIDInNotebookPanel),
10462
+ /* harmony export */ writeCodeToCellByID: () => (/* binding */ writeCodeToCellByID),
10463
+ /* harmony export */ writeCodeToCellByIDInNotebookPanel: () => (/* binding */ writeCodeToCellByIDInNotebookPanel)
10048
10464
  /* harmony export */ });
10049
10465
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
10050
10466
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
10051
- /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/cells */ "webpack/sharing/consume/default/@jupyterlab/cells");
10052
- /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1__);
10053
- /* harmony import */ var _strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./strings */ "./lib/utils/strings.js");
10467
+ /* harmony import */ var _strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./strings */ "./lib/utils/strings.js");
10054
10468
  /*
10055
10469
  * Copyright (c) Saga Inc.
10056
10470
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
10057
10471
  */
10058
10472
 
10059
10473
 
10060
-
10061
- const INCLUDE_CELL_IN_APP = 'include-cell-in-app';
10062
10474
  const getActiveCell = (notebookTracker) => {
10063
- var _a;
10064
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
10065
- const activeCell = notebook === null || notebook === void 0 ? void 0 : notebook.activeCell;
10475
+ const notebookPanel = notebookTracker.currentWidget;
10476
+ return getActiveCellInNotebookPanel(notebookPanel);
10477
+ };
10478
+ const getActiveCellInNotebookPanel = (notebookPanel) => {
10479
+ const activeCell = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content.activeCell;
10066
10480
  return activeCell || undefined;
10067
10481
  };
10068
10482
  const getCellByID = (notebookTracker, cellID) => {
10069
- var _a;
10070
- if (cellID === undefined) {
10071
- return undefined;
10072
- }
10073
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
10074
- return notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === cellID);
10075
- };
10076
- const toggleActiveCellIncludeInAppMetadata = (notebookTracker) => {
10077
- const activeCellID = getActiveCellID(notebookTracker);
10078
- toggleIncludeCellInAppMetadata(notebookTracker, activeCellID);
10483
+ const notebook = notebookTracker.currentWidget;
10484
+ return getCellByIDInNotebookPanel(notebook, cellID);
10079
10485
  };
10080
- const toggleIncludeCellInAppMetadata = (notebookTracker, cellID) => {
10486
+ const getCellByIDInNotebookPanel = (notebookPanel, cellID) => {
10081
10487
  if (cellID === undefined) {
10082
- return;
10083
- }
10084
- const cell = getCellByID(notebookTracker, cellID);
10085
- if (!cell) {
10086
10488
  return undefined;
10087
10489
  }
10088
- if (Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
10089
- const originalVisibility = cell.model.getMetadata(INCLUDE_CELL_IN_APP);
10090
- cell.model.setMetadata(INCLUDE_CELL_IN_APP, !originalVisibility);
10091
- }
10092
- else {
10093
- // If the metadata doesn't exist yet, that means the user has not yet toggled the visibility.
10094
- // The default value is to show the output, so the first toggle should set the visibiltiy to false.
10095
- cell.model.setMetadata(INCLUDE_CELL_IN_APP, false);
10096
- }
10097
- };
10098
- const getActiveCellIncludeInApp = (notebookTracker) => {
10099
- const activeCellID = getActiveCellID(notebookTracker);
10100
- return getIncludeCellInApp(notebookTracker, activeCellID);
10101
- };
10102
- const getIncludeCellInApp = (notebookTracker, cellID) => {
10103
- /*
10104
- Checks the cell metadata tag to see if the user has marked that this cell should not be included in the app.
10105
- */
10106
- const cell = getCellByID(notebookTracker, cellID);
10107
- if (!cell) {
10108
- return false;
10109
- }
10110
- if (!Object.prototype.hasOwnProperty.call(cell.model.metadata, INCLUDE_CELL_IN_APP)) {
10111
- cell.model.setMetadata(INCLUDE_CELL_IN_APP, true);
10112
- }
10113
- return cell.model.getMetadata(INCLUDE_CELL_IN_APP);
10490
+ return notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content.widgets.find(cell => cell.model.id === cellID);
10114
10491
  };
10115
10492
  const getActiveCellID = (notebookTracker) => {
10493
+ const notebookPanel = notebookTracker.currentWidget;
10494
+ return getActiveCellIDInNotebookPanel(notebookPanel);
10495
+ };
10496
+ const getActiveCellIDInNotebookPanel = (notebookPanel) => {
10116
10497
  var _a;
10117
- return (_a = getActiveCell(notebookTracker)) === null || _a === void 0 ? void 0 : _a.model.id;
10498
+ return (_a = getActiveCellInNotebookPanel(notebookPanel)) === null || _a === void 0 ? void 0 : _a.model.id;
10118
10499
  };
10119
10500
  const getActiveCellCode = (notebookTracker) => {
10120
10501
  const activeCell = getActiveCell(notebookTracker);
10121
10502
  return activeCell === null || activeCell === void 0 ? void 0 : activeCell.model.sharedModel.source;
10122
10503
  };
10123
10504
  const getCellCodeByID = (notebookTracker, codeCellID) => {
10124
- const cell = getCellByID(notebookTracker, codeCellID);
10125
- return cell === null || cell === void 0 ? void 0 : cell.model.sharedModel.source;
10126
- };
10127
- const getActiveCellOutput = async (notebookTracker) => {
10128
- const activeCellID = getActiveCellID(notebookTracker);
10129
- return getCellOutputByID(notebookTracker, activeCellID);
10505
+ const notebookPanel = notebookTracker.currentWidget;
10506
+ return getCellCodeByIDInNotebookPanel(notebookPanel, codeCellID);
10130
10507
  };
10131
- const getCellOutputByID = async (notebookTracker, codeCellID) => {
10132
- // TODO: There is a bug where if the cell is not actually rendered on the screen,
10133
- // then the output is not captured. This is pretty unlikely to happen currently because
10134
- // the agent scrolls to the cell.
10135
- var _a, _b;
10136
- if (codeCellID === undefined) {
10137
- return undefined;
10138
- }
10139
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
10140
- const cell = notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === codeCellID);
10141
- if (!(cell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_1__.CodeCell)) {
10142
- return undefined;
10143
- }
10144
- const outputNode = (_b = cell.outputArea) === null || _b === void 0 ? void 0 : _b.node;
10145
- if (!outputNode)
10146
- return undefined;
10147
- // Find the top-level Jupyter image output div
10148
- // so we can check if there is a base64 encoded image
10149
- // already constructed for us.
10150
- const renderedImageDiv = outputNode.querySelector('.jp-RenderedImage.jp-OutputArea-output');
10151
- // If the image is the top-level output, then just use that instead
10152
- // of capturing the entire output node. This is much faster and handles
10153
- // matplotlib graphs.
10154
- if (renderedImageDiv) {
10155
- const img = renderedImageDiv.querySelector('img');
10156
- if (img && img.src.startsWith('data:image')) {
10157
- console.log('image found in top-level output');
10158
- // Remove the data URL prefix
10159
- // The img is initially in the format data:image/png;base64, <base64_data>
10160
- // We want to return the base64 data.
10161
- const base64 = img.src.split(',')[1];
10162
- return base64;
10163
- }
10164
- }
10165
- // Fallback: (optional) handle other output types, or use captureNode if needed
10166
- // Previously, we used html2canvas to capture the entire output node. This would
10167
- // give us the output even if it was html, svg, text, etc. However, starting around
10168
- // Chrome release 138, html2canvas became untenably slow. https://issues.chromium.org/issues/429073017
10169
- if (outputNode) {
10170
- // If the AI requested, a cell output that we cannot provide, we just tell it
10171
- // "Cell Output is present in notebook, but not available to share with the AI right now"
10172
- return "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rNkrAoqAIqAIKAKKgCKgCCgCioAioAgoAoqAIqAIKAKKgCKgjliVAUVAEVAEFAFFQBFQBBQBRUARUAQUAUVAEVAEFAFFQBFQBJqMwHDjiP3888+jUPXq1cuMPPLI0TB5+NNPP5mff/5Zfrprz549zfjjj+9+640ioAgoAoqAItAKBP7++28zbNiwpKgxxhijFUWWWsZvv/1murq6TI8ePcxoo41Wat7NzKy7495MbDTv4ROBIvZzEUTKaGvt4r1IvUf0tL/++msCAf0C/YPS8I+A2AOMx0cdddRuVeHuzHu3Ano4YlZ13HD0MptclaY5YocOHWpef/118+qrrxruJ5tsMjP11FObxRZbzIwyyiilVuubb74xvXv3juZ5xRVXmEUWWSQaJg+POOIIc9FFF8lPd11ooYXM1Vdf7X43++aLL74wL7/8snnllVfMOOOMY+aee24zxxxzmO44CG82Vp2Y//TTT5+wtdlmm5n+/ft3IovKkyLgENhuu+3Mvffem+jlBx54wD3Xm85A4PLLLzf9+vVLmBk8eLCZccYZO4OxBrmg//z222+Tfuymm25qMFX7o3V33NuPoHLQbgReeukls/baaydsDBo0yKyxxhqpLBW1n1MzbiCgaFtrJ+8NVE+jRBB47733zPLLL5+EHH744aZPnz6RWPqoVQi0atwi9sBKK61kzjzzzFZVr5RyujPvPgA4lPHLCPHuxxtvPPlZdf3hhx/Mu+++W/U89mDKKac0E088cSyoY55l6ReLMK06rgh6I17a0h2xzALsv//+5vbbb4+iOeaYY5oTTjjBrLjiitHwPA+/++47s+CCC0aTNuKIHTBggLnggguq0rfKEcuqgEMOOcRceeWVVTzw4PzzzzfLLLNMNKyshy+++KIZMmRIkt1WW21lJpxwwrKybno+ncK7GDQbbrihGThwYNPrrQV0TwQ6RV633nprgwN20kknNY899lj3BLOFXN92223mjTfeMKOPPrrp27dv00u+7LLLkn6Bgu6++24z00wzNb3MMguQwQsTit3JEdspuGPXiF2ywgormHnmmafM19PRebW6rXU0GDmYe/755816662XpDzxxBOdUzaWVVH7OZZno8+KtrV28t5oHRuJNyLJu++kOOyww8wWW2zRCEQap0kI5Bm35JHXueaay/zyyy+m3Y7Y7sx7URG48847K2zX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";
10173
- }
10174
- return undefined;
10508
+ const getCellCodeByIDInNotebookPanel = (notebookPanel, codeCellID) => {
10509
+ const cell = getCellByIDInNotebookPanel(notebookPanel, codeCellID);
10510
+ return cell === null || cell === void 0 ? void 0 : cell.model.sharedModel.source;
10175
10511
  };
10176
10512
  const getCellIndexByID = (notebookTracker, cellID) => {
10177
- var _a, _b;
10178
- const cellList = (_b = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model) === null || _b === void 0 ? void 0 : _b.cells;
10513
+ const notebookPanel = notebookTracker.currentWidget;
10514
+ return getCellIndexByIDInNotebookPanel(notebookPanel, cellID);
10515
+ };
10516
+ const getCellIndexByIDInNotebookPanel = (notebookPanel, cellID) => {
10517
+ var _a;
10518
+ const cellList = (_a = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.model) === null || _a === void 0 ? void 0 : _a.cells;
10179
10519
  if (cellList === undefined) {
10180
10520
  return undefined;
10181
10521
  }
@@ -10190,28 +10530,38 @@ const getCellIndexByID = (notebookTracker, cellID) => {
10190
10530
  return undefined;
10191
10531
  };
10192
10532
  const setActiveCellByID = (notebookTracker, cellID) => {
10193
- const cellIndex = getCellIndexByID(notebookTracker, cellID);
10194
10533
  const notebookPanel = notebookTracker.currentWidget;
10195
- if (notebookPanel !== undefined && notebookPanel !== null && cellIndex !== undefined) {
10534
+ setActiveCellByIDInNotebookPanel(notebookPanel, cellID);
10535
+ };
10536
+ const setActiveCellByIDInNotebookPanel = (notebookPanel, cellID) => {
10537
+ const cellIndex = getCellIndexByIDInNotebookPanel(notebookPanel, cellID);
10538
+ if (cellIndex !== undefined && notebookPanel !== null) {
10196
10539
  notebookPanel.content.activeCellIndex = cellIndex;
10197
10540
  }
10198
10541
  };
10199
10542
  const writeCodeToCellByID = (notebookTracker, code, codeCellID) => {
10200
- var _a;
10201
- if (code === undefined) {
10543
+ const notebookPanel = notebookTracker.currentWidget;
10544
+ writeCodeToCellByIDInNotebookPanel(notebookPanel, code, codeCellID);
10545
+ };
10546
+ const writeCodeToCellByIDInNotebookPanel = (notebookPanel, code, codeCellID) => {
10547
+ if (code === undefined || codeCellID === undefined) {
10202
10548
  return;
10203
10549
  }
10204
- const codeMirrorValidCode = (0,_strings__WEBPACK_IMPORTED_MODULE_2__.removeMarkdownCodeFormatting)(code);
10205
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
10550
+ const codeMirrorValidCode = (0,_strings__WEBPACK_IMPORTED_MODULE_1__.removeMarkdownCodeFormatting)(code);
10551
+ const notebook = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.content;
10206
10552
  const cell = notebook === null || notebook === void 0 ? void 0 : notebook.widgets.find(cell => cell.model.id === codeCellID);
10207
10553
  if (cell) {
10208
10554
  cell.model.sharedModel.source = codeMirrorValidCode;
10209
10555
  }
10210
10556
  };
10211
10557
  const getAIOptimizedCells = (notebookTracker) => {
10212
- var _a, _b;
10213
- const cellList = (_b = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model) === null || _b === void 0 ? void 0 : _b.cells;
10214
- if (cellList == undefined) {
10558
+ const notebookPanel = notebookTracker.currentWidget;
10559
+ return getAIOptimizedCellsInNotebookPanel(notebookPanel);
10560
+ };
10561
+ const getAIOptimizedCellsInNotebookPanel = (notebookPanel) => {
10562
+ var _a;
10563
+ const cellList = (_a = notebookPanel === null || notebookPanel === void 0 ? void 0 : notebookPanel.model) === null || _a === void 0 ? void 0 : _a.cells;
10564
+ if (cellList == undefined || cellList == null) {
10215
10565
  return [];
10216
10566
  }
10217
10567
  // In order to get the cell index, we need to iterate over the cells and call the `get` method
@@ -10228,12 +10578,11 @@ const getAIOptimizedCells = (notebookTracker) => {
10228
10578
  }
10229
10579
  return cells;
10230
10580
  };
10231
- function createCodeCellAtIndexAndActivate(notebookTracker, index) {
10581
+ function createCodeCellAtIndexAndActivate(notebookPanel, index) {
10232
10582
  /*
10233
10583
  Create a new code cell at index and make it the active cell.
10234
10584
  */
10235
- var _a;
10236
- const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
10585
+ const notebook = notebookPanel.content;
10237
10586
  if (notebook === undefined) {
10238
10587
  return;
10239
10588
  }
@@ -10280,7 +10629,7 @@ const highlightCodeCell = (notebookTracker, codeCellID) => {
10280
10629
  }, 500);
10281
10630
  }
10282
10631
  };
10283
- const highlightLinesOfCodeInCodeCell = (notebookTracker, codeCellID, startLine, endLine) => {
10632
+ const highlightLinesOfCodeInCodeCell = (notebookPanel, codeCellID, startLine, endLine) => {
10284
10633
  /*
10285
10634
  Briefly highlights a range of lines in a code cell, to draw the user's attention to it.
10286
10635
 
@@ -10293,7 +10642,7 @@ const highlightLinesOfCodeInCodeCell = (notebookTracker, codeCellID, startLine,
10293
10642
  endLine: The 0-indexed end line number to highlight (inclusive).
10294
10643
  */
10295
10644
  // Get the cell with the given ID
10296
- const cell = getCellByID(notebookTracker, codeCellID);
10645
+ const cell = getCellByIDInNotebookPanel(notebookPanel, codeCellID);
10297
10646
  if (!cell) {
10298
10647
  return;
10299
10648
  }
@@ -10337,42 +10686,44 @@ const highlightLinesOfCodeInCodeCell = (notebookTracker, codeCellID, startLine,
10337
10686
  });
10338
10687
  }, 2000);
10339
10688
  };
10340
- const scrollToAndHighlightCell = (notebookTracker, cellID, startLine, endLine, position = 'center') => {
10689
+ const scrollToAndHighlightCell = (notebookPanel, cellID, startLine, endLine, position = 'center') => {
10690
+ if (notebookPanel === null) {
10691
+ return;
10692
+ }
10341
10693
  // Scroll to the cell
10342
- scrollToCell(notebookTracker, cellID, startLine, position);
10694
+ scrollToCell(notebookPanel, cellID, startLine, position);
10343
10695
  // Wait for the scroll animation to complete before highlighting the lines
10344
10696
  // The default smooth scroll takes about 300-500ms to complete
10345
10697
  setTimeout(() => {
10346
10698
  if (startLine !== undefined) {
10347
10699
  // If no end line was provided, then we just highlight the single line
10348
10700
  endLine = endLine || startLine;
10349
- highlightLinesOfCodeInCodeCell(notebookTracker, cellID, startLine, endLine);
10701
+ highlightLinesOfCodeInCodeCell(notebookPanel, cellID, startLine, endLine);
10350
10702
  }
10351
10703
  else {
10352
10704
  // If no start line was provided, then we just highlight the entire cell
10353
- highlightLinesOfCodeInCodeCell(notebookTracker, cellID, undefined, undefined);
10705
+ highlightLinesOfCodeInCodeCell(notebookPanel, cellID, undefined, undefined);
10354
10706
  }
10355
10707
  }, 500);
10356
10708
  };
10357
- const scrollToCell = (notebookTracker, cellID, startLine, position = 'center') => {
10358
- var _a;
10709
+ const scrollToCell = (notebookPanel, cellID, startLine, position = 'center') => {
10359
10710
  // Get the cell
10360
- const cell = getCellByID(notebookTracker, cellID);
10361
- if (!cell) {
10711
+ const cell = getCellByIDInNotebookPanel(notebookPanel, cellID);
10712
+ if (!cell || notebookPanel === null) {
10362
10713
  return;
10363
10714
  }
10364
10715
  // If line numbers are provided, figure out what position to scroll to
10365
10716
  // based on the start line's position in the cell
10366
- const code = getCellCodeByID(notebookTracker, cellID);
10717
+ const code = getCellCodeByIDInNotebookPanel(notebookPanel, cellID);
10367
10718
  startLine = startLine || 0;
10368
10719
  const relativeLinePosition = startLine / ((code === null || code === void 0 ? void 0 : code.split('\n').length) || 1);
10369
10720
  // These positions must be of type BaseScrollToAlignment defined in @jupyterlab/ui-components
10370
10721
  position = relativeLinePosition < 0.5 ? 'start' : 'end';
10371
10722
  // If the cell is not the active cell, the scrolling does not work.
10372
10723
  // It scrolls to the cell and then flashes back to the active cell.
10373
- setActiveCellByID(notebookTracker, cellID);
10724
+ setActiveCellByIDInNotebookPanel(notebookPanel, cellID);
10374
10725
  // Use the new JupyterLab scrollToCell method instead of DOM node scrollIntoView
10375
- void ((_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content.scrollToCell(cell, position));
10726
+ void notebookPanel.content.scrollToCell(cell, position);
10376
10727
  };
10377
10728
 
10378
10729
 
@@ -10683,7 +11034,8 @@ const STRIPE_PAYMENT_LINK = "https://jl76z192i0.execute-api.us-east-1.amazonaws.
10683
11034
  __webpack_require__.r(__webpack_exports__);
10684
11035
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10685
11036
  /* harmony export */ getOperatingSystem: () => (/* binding */ getOperatingSystem),
10686
- /* harmony export */ isChromeBasedBrowser: () => (/* binding */ isChromeBasedBrowser)
11037
+ /* harmony export */ isChromeBasedBrowser: () => (/* binding */ isChromeBasedBrowser),
11038
+ /* harmony export */ isElectronBasedFrontend: () => (/* binding */ isElectronBasedFrontend)
10687
11039
  /* harmony export */ });
10688
11040
  /*
10689
11041
  * Copyright (c) Saga Inc.
@@ -10700,6 +11052,14 @@ const getOperatingSystem = () => {
10700
11052
  const isChromeBasedBrowser = () => {
10701
11053
  return /chrome/i.test(navigator.userAgent) && !/edge|edg/i.test(navigator.userAgent);
10702
11054
  };
11055
+ const isElectronBasedFrontend = () => {
11056
+ /*
11057
+ Checks if the user is using an Electron-based browser.
11058
+ This tells us that they are using Mito Desktop or JupyterLab Desktop.
11059
+ */
11060
+ const userAgent = navigator.userAgent.toLowerCase();
11061
+ return userAgent.includes('electron');
11062
+ };
10703
11063
 
10704
11064
 
10705
11065
  /***/ }),
@@ -11272,15 +11632,15 @@ class BaseWebsocketClient {
11272
11632
 
11273
11633
  /***/ }),
11274
11634
 
11275
- /***/ "./lib/websockets/appBuilder/appBuilderWebsocketClient.js":
11276
- /*!****************************************************************!*\
11277
- !*** ./lib/websockets/appBuilder/appBuilderWebsocketClient.js ***!
11278
- \****************************************************************/
11635
+ /***/ "./lib/websockets/appDeploy/appDeployWebsocketClient.js":
11636
+ /*!**************************************************************!*\
11637
+ !*** ./lib/websockets/appDeploy/appDeployWebsocketClient.js ***!
11638
+ \**************************************************************/
11279
11639
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11280
11640
 
11281
11641
  __webpack_require__.r(__webpack_exports__);
11282
11642
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11283
- /* harmony export */ AppBuilderWebsocketClient: () => (/* binding */ AppBuilderWebsocketClient)
11643
+ /* harmony export */ AppDeployWebsocketClient: () => (/* binding */ AppDeployWebsocketClient)
11284
11644
  /* harmony export */ });
11285
11645
  /* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
11286
11646
  /*
@@ -11293,7 +11653,7 @@ __webpack_require__.r(__webpack_exports__);
11293
11653
  *
11294
11654
  * It communicates with the backend over a WebSocket for app building functionality.
11295
11655
  */
11296
- class AppBuilderWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
11656
+ class AppDeployWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
11297
11657
  /**
11298
11658
  * Create a new app builder client.
11299
11659
  */
@@ -11302,7 +11662,7 @@ class AppBuilderWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
11302
11662
  /**
11303
11663
  * The service URL for the websocket endpoint.
11304
11664
  */
11305
- this.SERVICE_URL = 'mito-ai/app-builder';
11665
+ this.SERVICE_URL = 'mito-ai/app-deploy';
11306
11666
  }
11307
11667
  /**
11308
11668
  * App builder messages stream.
@@ -11467,11 +11827,13 @@ __webpack_require__.r(__webpack_exports__);
11467
11827
  /* harmony export */ CompletionWebsocketClient: () => (/* binding */ CompletionWebsocketClient)
11468
11828
  /* harmony export */ });
11469
11829
  /* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
11830
+ /* harmony import */ var _utils_user__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/user */ "./lib/utils/user.js");
11470
11831
  /*
11471
11832
  * Copyright (c) Saga Inc.
11472
11833
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11473
11834
  */
11474
11835
 
11836
+
11475
11837
  /**
11476
11838
  * Mito AI completion client
11477
11839
  *
@@ -11487,6 +11849,7 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
11487
11849
  * The service URL for the websocket endpoint.
11488
11850
  */
11489
11851
  this.SERVICE_URL = 'mito-ai/completions';
11852
+ this.isElectron = (0,_utils_user__WEBPACK_IMPORTED_MODULE_1__.isElectronBasedFrontend)();
11490
11853
  }
11491
11854
  /**
11492
11855
  * Completion chunk stream.
@@ -11558,6 +11921,17 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
11558
11921
  // default: /* no-op */
11559
11922
  }
11560
11923
  }
11924
+ // Override sendMessage to automatically add environment info
11925
+ sendMessage(message) {
11926
+ // Add environment info to all messages
11927
+ const messageWithEnvironment = {
11928
+ ...message,
11929
+ environment: {
11930
+ isElectron: this.isElectron,
11931
+ }
11932
+ };
11933
+ return super.sendMessage(messageWithEnvironment);
11934
+ }
11561
11935
  }
11562
11936
 
11563
11937
 
@@ -12758,6 +13132,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
12758
13132
  margin: 0;
12759
13133
  width: 100%;
12760
13134
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
13135
+ overflow-y: auto;
13136
+ max-height: 350px;
12761
13137
  }
12762
13138
 
12763
13139
  .chat-dropdown-item {
@@ -12842,7 +13218,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
12842
13218
  .chat-dropdown-search-input::placeholder {
12843
13219
  color: var(--jp-content-font-color3);
12844
13220
  }
12845
- `, "",{"version":3,"sources":["webpack://./style/ChatDropdown.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,4CAA4C;EAC5C,kBAAkB;EAClB,aAAa;EACb,YAAY;EACZ,kBAAkB;;EAElB,uBAAuB;EACvB,aAAa;EACb,sBAAsB;EACtB,WAAW;EACX,yCAAyC;EACzC,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,yCAAyC;EACzC,qBAAqB;EACrB,UAAU;EACV,SAAS;EACT,WAAW;EACX,wCAAwC;AAC1C;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,oCAAoC;EACpC,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AACrB;;AAEA;;EAEE,yCAAyC;AAC3C;;AAEA;EACE,6BAA6B;EAC7B,uCAAuC;EACvC,eAAe;EACf,WAAW;EACX,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;EACZ,yCAAyC;EACzC,2BAA2B;EAC3B,4BAA4B;AAC9B;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,qCAAqC;EACrC,yCAAyC;EACzC,oCAAoC;EACpC,aAAa;EACb,YAAY;EACZ,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,YAAY;AACd;;AAEA;EACE,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.chat-dropdown {\n /* Position the dropdown in the right place*/\n position: absolute;\n z-index: 9999;\n bottom: 100%;\n margin-bottom: 5px;\n\n /* Style the dropdown */\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid var(--jp-border-color1);\n border-radius: 5px;\n}\n\n.chat-dropdown-list {\n position: relative;\n border: 0px;\n border-radius: 5px;\n background-color: var(--jp-layout-color1);\n list-style-type: none;\n padding: 0;\n margin: 0;\n width: 100%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.chat-dropdown-item {\n padding: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--jp-content-font-color1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.chat-dropdown-item:hover,\n.chat-dropdown-item.selected {\n background-color: var(--jp-layout-color3);\n}\n\n.chat-dropdown-item-type {\n color: var(--jp-brand-color1);\n font-family: var(--jp-code-font-family);\n min-width: 35px;\n width: 35px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-name {\n font-size: 15px;\n display: flex;\n align-items: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-parent-df {\n color: var(--muted-text-color);\n font-size: 12px;\n margin-left: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.dropdown-item-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dropdown-item-disabled:hover {\n background-color: inherit;\n}\n\n.chat-dropdown-search {\n padding: 8px;\n background-color: var(--jp-layout-color1);\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n}\n\n.chat-dropdown-search-input {\n width: 100%;\n padding: 6px 8px;\n border-radius: 3px;\n font-size: 12px;\n font-family: var(--jp-ui-font-family);\n background-color: var(--jp-layout-color1);\n color: var(--jp-content-font-color1);\n outline: none;\n border: none;\n box-sizing: border-box;\n}\n\n.chat-dropdown-search-input:focus {\n outline: none;\n border: none;\n}\n\n.chat-dropdown-search-input::placeholder {\n color: var(--jp-content-font-color3);\n}\n"],"sourceRoot":""}]);
13221
+ `, "",{"version":3,"sources":["webpack://./style/ChatDropdown.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,4CAA4C;EAC5C,kBAAkB;EAClB,aAAa;EACb,YAAY;EACZ,kBAAkB;;EAElB,uBAAuB;EACvB,aAAa;EACb,sBAAsB;EACtB,WAAW;EACX,yCAAyC;EACzC,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,yCAAyC;EACzC,qBAAqB;EACrB,UAAU;EACV,SAAS;EACT,WAAW;EACX,wCAAwC;EACxC,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,oCAAoC;EACpC,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AACrB;;AAEA;;EAEE,yCAAyC;AAC3C;;AAEA;EACE,6BAA6B;EAC7B,uCAAuC;EACvC,eAAe;EACf,WAAW;EACX,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;EACZ,yCAAyC;EACzC,2BAA2B;EAC3B,4BAA4B;AAC9B;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,qCAAqC;EACrC,yCAAyC;EACzC,oCAAoC;EACpC,aAAa;EACb,YAAY;EACZ,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,YAAY;AACd;;AAEA;EACE,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.chat-dropdown {\n /* Position the dropdown in the right place*/\n position: absolute;\n z-index: 9999;\n bottom: 100%;\n margin-bottom: 5px;\n\n /* Style the dropdown */\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid var(--jp-border-color1);\n border-radius: 5px;\n}\n\n.chat-dropdown-list {\n position: relative;\n border: 0px;\n border-radius: 5px;\n background-color: var(--jp-layout-color1);\n list-style-type: none;\n padding: 0;\n margin: 0;\n width: 100%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n overflow-y: auto;\n max-height: 350px;\n}\n\n.chat-dropdown-item {\n padding: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--jp-content-font-color1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.chat-dropdown-item:hover,\n.chat-dropdown-item.selected {\n background-color: var(--jp-layout-color3);\n}\n\n.chat-dropdown-item-type {\n color: var(--jp-brand-color1);\n font-family: var(--jp-code-font-family);\n min-width: 35px;\n width: 35px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-name {\n font-size: 15px;\n display: flex;\n align-items: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chat-dropdown-item-parent-df {\n color: var(--muted-text-color);\n font-size: 12px;\n margin-left: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.dropdown-item-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.dropdown-item-disabled:hover {\n background-color: inherit;\n}\n\n.chat-dropdown-search {\n padding: 8px;\n background-color: var(--jp-layout-color1);\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n}\n\n.chat-dropdown-search-input {\n width: 100%;\n padding: 6px 8px;\n border-radius: 3px;\n font-size: 12px;\n font-family: var(--jp-ui-font-family);\n background-color: var(--jp-layout-color1);\n color: var(--jp-content-font-color1);\n outline: none;\n border: none;\n box-sizing: border-box;\n}\n\n.chat-dropdown-search-input:focus {\n outline: none;\n border: none;\n}\n\n.chat-dropdown-search-input::placeholder {\n color: var(--jp-content-font-color3);\n}\n"],"sourceRoot":""}]);
12846
13222
  // Exports
12847
13223
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
12848
13224
 
@@ -15460,6 +15836,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15460
15836
  align-items: center;
15461
15837
  gap: 4px;
15462
15838
  padding: 8px 10px;
15839
+ overflow-x: hidden;
15463
15840
  }
15464
15841
 
15465
15842
  /* Consistent spacing for all children of context container */
@@ -15478,14 +15855,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15478
15855
 
15479
15856
  font-size: 12px;
15480
15857
  height: 20px;
15481
- width: fit-content;
15858
+ max-width: 100%;
15859
+ min-width: 0;
15482
15860
 
15483
15861
  border: 1px solid var(--jp-border-color1);
15484
15862
  cursor: pointer;
15863
+ }
15485
15864
 
15486
- &:hover {
15487
- background-color: var(--jp-layout-color3);
15488
- }
15865
+ .selected-context-container:hover {
15866
+ background-color: var(--jp-layout-color3);
15489
15867
  }
15490
15868
 
15491
15869
  .selected-context-container .rule-name {
@@ -15504,7 +15882,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15504
15882
  width: 12px;
15505
15883
  max-height: 14px;
15506
15884
  color: var(--jp-content-font-color3);
15507
- }`, "",{"version":3,"sources":["webpack://./style/SelectedContextContainer.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,eAAe;EACf,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;AACnB;;AAEA,6DAA6D;AAC7D;EACE,WAAW;AACb;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,WAAW;;EAEX,eAAe;EACf,YAAY;EACZ,kBAAkB;;EAElB,yCAAyC;EACzC,eAAe;;EAEf;IACE,yCAAyC;EAC3C;AACF;;AAEA;EACE,gBAAgB;EAChB,oCAAoC;EACpC,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,WAAW;EACX,gBAAgB;EAChB,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.context-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n}\n\n/* Consistent spacing for all children of context container */\n.context-container>* {\n margin: 2px;\n}\n\n.selected-context-container {\n display: flex;\n align-items: center;\n text-align: center;\n background-color: var(--jp-layout-color2);\n border-radius: 3px;\n padding: 4px 8px;\n margin: 2px;\n\n font-size: 12px;\n height: 20px;\n width: fit-content;\n\n border: 1px solid var(--jp-border-color1);\n cursor: pointer;\n\n &:hover {\n background-color: var(--jp-layout-color3);\n }\n}\n\n.selected-context-container .rule-name {\n margin-left: 6px;\n color: var(--jp-content-font-color1);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 200px;\n}\n\n.selected-context-container .icon {\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 12px;\n max-height: 14px;\n color: var(--jp-content-font-color3);\n}"],"sourceRoot":""}]);
15885
+ }`, "",{"version":3,"sources":["webpack://./style/SelectedContextContainer.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,eAAe;EACf,mBAAmB;EACnB,QAAQ;EACR,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA,6DAA6D;AAC7D;EACE,WAAW;AACb;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,WAAW;;EAEX,eAAe;EACf,YAAY;EACZ,eAAe;EACf,YAAY;;EAEZ,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,oCAAoC;EACpC,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,WAAW;EACX,gBAAgB;EAChB,oCAAoC;AACtC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.context-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 8px 10px;\n overflow-x: hidden;\n}\n\n/* Consistent spacing for all children of context container */\n.context-container>* {\n margin: 2px;\n}\n\n.selected-context-container {\n display: flex;\n align-items: center;\n text-align: center;\n background-color: var(--jp-layout-color2);\n border-radius: 3px;\n padding: 4px 8px;\n margin: 2px;\n\n font-size: 12px;\n height: 20px;\n max-width: 100%;\n min-width: 0;\n\n border: 1px solid var(--jp-border-color1);\n cursor: pointer;\n}\n\n.selected-context-container:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.selected-context-container .rule-name {\n margin-left: 6px;\n color: var(--jp-content-font-color1);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 200px;\n}\n\n.selected-context-container .icon {\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: 12px;\n max-height: 14px;\n color: var(--jp-content-font-color3);\n}"],"sourceRoot":""}]);
15508
15886
  // Exports
15509
15887
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15510
15888
 
@@ -15627,6 +16005,65 @@ a {
15627
16005
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15628
16006
 
15629
16007
 
16008
+ /***/ }),
16009
+
16010
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css":
16011
+ /*!********************************************************************************!*\
16012
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css ***!
16013
+ \********************************************************************************/
16014
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
16015
+
16016
+ __webpack_require__.r(__webpack_exports__);
16017
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16018
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
16019
+ /* harmony export */ });
16020
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
16021
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
16022
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
16023
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
16024
+ // Imports
16025
+
16026
+
16027
+ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
16028
+ // Module
16029
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
16030
+ * Copyright (c) Saga Inc.
16031
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
16032
+ */
16033
+
16034
+ .mito-deploy-button {
16035
+ display: flex !important;
16036
+ align-items: center !important;
16037
+ gap: 6px !important;
16038
+ padding: 4px 8px !important;
16039
+ color: var(--jp-ui-font-color1) !important;
16040
+ background-color: var(--jp-layout-color2) !important;
16041
+ }
16042
+
16043
+ .mito-deploy-button:hover {
16044
+ background-color: var(--jp-layout-color3) !important;
16045
+ }
16046
+
16047
+ .mito-deploy-button .mito-ai-deploy-icon {
16048
+ display: flex !important;
16049
+ align-items: center !important;
16050
+ height: 10px !important;
16051
+ width: 10px !important;
16052
+ font-size: 12px !important;
16053
+ }
16054
+
16055
+ .mito-deploy-button::slotted(svg),
16056
+ .mito-deploy-button svg {
16057
+ width: 12px !important;
16058
+ height: 12px !important;
16059
+ max-width: 12px !important;
16060
+ max-height: 12px !important;
16061
+ margin-right: 4px !important;
16062
+ }`, "",{"version":3,"sources":["webpack://./style/StreamlitPreviewPlugin.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,2BAA2B;IAC3B,0CAA0C;IAC1C,oDAAoD;AACxD;;AAEA;IACI,oDAAoD;AACxD;;AAEA;IACI,wBAAwB;IACxB,8BAA8B;IAC9B,uBAAuB;IACvB,sBAAsB;IACtB,0BAA0B;AAC9B;;AAEA;;IAEI,sBAAsB;IACtB,uBAAuB;IACvB,0BAA0B;IAC1B,2BAA2B;IAC3B,4BAA4B;AAChC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.mito-deploy-button {\n display: flex !important;\n align-items: center !important;\n gap: 6px !important;\n padding: 4px 8px !important;\n color: var(--jp-ui-font-color1) !important;\n background-color: var(--jp-layout-color2) !important;\n}\n\n.mito-deploy-button:hover {\n background-color: var(--jp-layout-color3) !important;\n}\n\n.mito-deploy-button .mito-ai-deploy-icon {\n display: flex !important;\n align-items: center !important;\n height: 10px !important;\n width: 10px !important;\n font-size: 12px !important;\n}\n\n.mito-deploy-button::slotted(svg),\n.mito-deploy-button svg {\n width: 12px !important;\n height: 12px !important;\n max-width: 12px !important;\n max-height: 12px !important;\n margin-right: 4px !important;\n}"],"sourceRoot":""}]);
16063
+ // Exports
16064
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
16065
+
16066
+
15630
16067
  /***/ }),
15631
16068
 
15632
16069
  /***/ "./node_modules/css-loader/dist/cjs.js!./style/TextAndIconButton.css":
@@ -15904,6 +16341,16 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15904
16341
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15905
16342
 
15906
16343
 
16344
+ /***/ }),
16345
+
16346
+ /***/ "./src/icons/App/DeployIcon.svg":
16347
+ /*!**************************************!*\
16348
+ !*** ./src/icons/App/DeployIcon.svg ***!
16349
+ \**************************************/
16350
+ /***/ ((module) => {
16351
+
16352
+ module.exports = "<svg width=\"1298\" height=\"1286\" viewBox=\"0 0 1298 1286\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"currentColor\">\n <path d=\"M689.8 1007.36C644.524 1028.32 598.8 1047.93 552.76 1066.2L569.733 1285.77C638.785 1254.45 799 1157.24 926.04 893.279C871.201 922.393 816.352 948.581 769.52 970.929C743.254 983.518 716.602 995.58 689.806 1007.36L689.8 1007.36Z\" />\n <path d=\"M815.76 382.387C791.224 382.387 766.698 391.626 748.02 410.084C729.994 427.923 720.056 451.62 720.056 476.824C720.056 502.021 729.983 525.725 748.029 543.564C785.379 580.501 846.166 580.491 883.496 543.564C883.496 543.554 883.507 543.554 883.507 543.554C901.533 525.715 911.48 502.018 911.48 476.814C911.48 451.616 901.542 427.912 883.507 410.073C864.84 391.615 840.304 382.385 815.761 382.385L815.76 382.387Z\" />\n <path d=\"M349.453 462.747C364.328 432.924 380.213 401.747 397.229 370.408C130.563 495.835 32.0558 654.008 0.21582 722.461L220.562 739.112C243.614 682.175 268.75 625.664 296.073 569.925C312.661 535.961 330.401 499.685 349.448 462.748L349.453 462.747Z\" />\n <path d=\"M914.027 33.9479L1263.4 379.428C1280.5 311.901 1289.8 244.215 1294.2 180.815C1294.57 175.502 1294.94 170.2 1295.24 164.841C1295.7 156.815 1296.08 148.893 1296.39 141.029C1296.74 132.003 1297.02 122.915 1297.19 113.789C1297.32 107.513 1297.42 101.3 1297.45 95.1639C1297.53 82.6117 1297.5 70.0025 1297.27 57.2892C1297.21 54.4143 1297.14 51.6017 1297.07 48.7632C1296.68 33.4872 1296.14 18.1379 1295.28 2.66453C1193.44 -3.4552 1054.16 -1.29387 914.028 33.9565L914.027 33.9479Z\" />\n <path d=\"M1106.33 687.12C1113.39 679.36 1120.28 671.423 1126.96 663.235C1127.83 662.162 1128.78 661.11 1129.65 660.021C1136.68 651.261 1143.42 642.172 1150.03 632.933C1152.32 629.735 1154.57 626.506 1156.79 623.272C1161.92 615.824 1166.89 608.209 1171.74 600.46C1174.87 595.46 1177.89 590.408 1180.87 585.345C1184.4 579.345 1187.85 573.272 1191.24 567.105C1194.19 561.694 1197.13 556.282 1199.93 550.802C1202.02 546.729 1203.99 542.542 1206.02 538.401C1211.38 527.391 1216.53 516.287 1221.32 505.079C1222.07 503.318 1222.81 501.542 1223.56 499.766C1232.09 479.354 1239.68 458.667 1246.47 437.829L855.11 50.802C755.386 82.99 670.87 130.214 602.99 191.362C601.24 192.935 599.49 194.523 597.751 196.122C588.876 204.31 580.215 212.685 571.939 221.362C569.001 224.461 566.163 227.748 563.277 230.951C497.903 303.211 443.179 397.524 396.451 488.218C386.039 509.119 376.139 529.354 366.951 548.182C330.524 622.468 297.377 699.395 268.399 776.848C266.362 782.312 262.612 786.697 257.961 789.734C237.472 842.307 218.81 895.171 202.3 948.107L340.153 1084.43C395.164 1067.65 450.101 1048.65 504.7 1027.74C507.538 1024.61 510.887 1021.9 515.075 1020.37C566.689 1001.51 618.023 980.661 668.621 958.427C678.861 953.677 689.111 948.953 699.299 944.062C828.601 882.912 975.019 813.661 1075.33 718.903C1083.84 710.892 1092.02 702.491 1100.07 693.929C1102.19 691.669 1104.26 689.393 1106.34 687.122L1106.33 687.12ZM921.187 581.344C892.114 610.104 853.911 624.48 815.723 624.48C777.535 624.48 739.348 610.105 710.275 581.355C682.051 553.443 666.515 516.328 666.515 476.828C666.515 437.328 682.067 400.213 710.264 372.301C768.426 314.791 863.038 314.812 921.171 372.291C949.411 400.203 964.947 437.318 964.947 476.818C964.947 516.307 949.406 553.432 921.182 581.344L921.187 581.344Z\" />\n <path d=\"M147.088 1138.72L198.905 982.058L302.981 1084.64L147.088 1138.72Z\" />\n </g>\n</svg>\n";
16353
+
15907
16354
  /***/ }),
15908
16355
 
15909
16356
  /***/ "./src/icons/AppBuilderExcludeCellIcon.svg":
@@ -17530,6 +17977,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
17530
17977
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_SettingsWidget_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
17531
17978
 
17532
17979
 
17980
+ /***/ }),
17981
+
17982
+ /***/ "./style/StreamlitPreviewPlugin.css":
17983
+ /*!******************************************!*\
17984
+ !*** ./style/StreamlitPreviewPlugin.css ***!
17985
+ \******************************************/
17986
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
17987
+
17988
+ __webpack_require__.r(__webpack_exports__);
17989
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17990
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
17991
+ /* harmony export */ });
17992
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
17993
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
17994
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
17995
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
17996
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
17997
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
17998
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
17999
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
18000
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
18001
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
18002
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
18003
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
18004
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./StreamlitPreviewPlugin.css */ "./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css");
18005
+
18006
+
18007
+
18008
+
18009
+
18010
+
18011
+
18012
+
18013
+
18014
+
18015
+
18016
+ var options = {};
18017
+
18018
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
18019
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
18020
+
18021
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
18022
+
18023
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
18024
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
18025
+
18026
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
18027
+
18028
+
18029
+
18030
+
18031
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
18032
+
18033
+
17533
18034
  /***/ }),
17534
18035
 
17535
18036
  /***/ "./style/TextAndIconButton.css":
@@ -17749,4 +18250,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
17749
18250
  /***/ })
17750
18251
 
17751
18252
  }]);
17752
- //# sourceMappingURL=lib_index_js.81703ac2bc645e5c2fc2.js.map
18253
+ //# sourceMappingURL=lib_index_js.cf2e3ad2797fbb53826b.js.map