mito-ai 0.1.45__py3-none-any.whl → 0.1.46__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.
Files changed (69) hide show
  1. mito_ai/__init__.py +10 -1
  2. mito_ai/_version.py +1 -1
  3. mito_ai/anthropic_client.py +90 -5
  4. mito_ai/chat_history/handlers.py +63 -0
  5. mito_ai/chat_history/urls.py +32 -0
  6. mito_ai/completions/handlers.py +18 -20
  7. mito_ai/constants.py +3 -0
  8. mito_ai/streamlit_conversion/agent_utils.py +148 -30
  9. mito_ai/streamlit_conversion/prompts/prompt_constants.py +147 -24
  10. mito_ai/streamlit_conversion/prompts/streamlit_app_creation_prompt.py +2 -1
  11. mito_ai/streamlit_conversion/prompts/streamlit_error_correction_prompt.py +2 -2
  12. mito_ai/streamlit_conversion/prompts/streamlit_finish_todo_prompt.py +4 -3
  13. mito_ai/streamlit_conversion/prompts/update_existing_app_prompt.py +50 -0
  14. mito_ai/streamlit_conversion/streamlit_agent_handler.py +101 -107
  15. mito_ai/streamlit_conversion/streamlit_system_prompt.py +1 -0
  16. mito_ai/streamlit_conversion/streamlit_utils.py +13 -10
  17. mito_ai/streamlit_conversion/validate_streamlit_app.py +77 -82
  18. mito_ai/streamlit_preview/handlers.py +3 -4
  19. mito_ai/streamlit_preview/utils.py +11 -7
  20. mito_ai/tests/chat_history/test_chat_history.py +211 -0
  21. mito_ai/tests/message_history/test_message_history_utils.py +43 -19
  22. mito_ai/tests/providers/test_anthropic_client.py +178 -6
  23. mito_ai/tests/streamlit_conversion/test_apply_patch_to_text.py +368 -0
  24. mito_ai/tests/streamlit_conversion/test_fix_diff_headers.py +533 -0
  25. mito_ai/tests/streamlit_conversion/test_streamlit_agent_handler.py +71 -74
  26. mito_ai/tests/streamlit_conversion/test_streamlit_utils.py +16 -16
  27. mito_ai/tests/streamlit_conversion/test_validate_streamlit_app.py +17 -14
  28. mito_ai/tests/streamlit_preview/test_streamlit_preview_handler.py +2 -2
  29. mito_ai/tests/user/__init__.py +2 -0
  30. mito_ai/tests/user/test_user.py +120 -0
  31. mito_ai/user/handlers.py +33 -0
  32. mito_ai/user/urls.py +21 -0
  33. mito_ai/utils/anthropic_utils.py +8 -6
  34. mito_ai/utils/message_history_utils.py +4 -3
  35. mito_ai/utils/telemetry_utils.py +7 -4
  36. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  37. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  38. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  39. mito_ai-0.1.45.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.0c3368195d954d2ed033.js → mito_ai-0.1.46.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.20f12766ecd3d430568e.js +955 -173
  40. mito_ai-0.1.46.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.20f12766ecd3d430568e.js.map +1 -0
  41. mito_ai-0.1.45.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.684f82575fcc2e3b350c.js → mito_ai-0.1.46.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.54126ab6511271265443.js +5 -5
  42. mito_ai-0.1.45.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.684f82575fcc2e3b350c.js.map → mito_ai-0.1.46.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.54126ab6511271265443.js.map +1 -1
  43. {mito_ai-0.1.45.dist-info → mito_ai-0.1.46.dist-info}/METADATA +1 -1
  44. {mito_ai-0.1.45.dist-info → mito_ai-0.1.46.dist-info}/RECORD +68 -58
  45. mito_ai-0.1.45.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.0c3368195d954d2ed033.js.map +0 -1
  46. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  47. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  48. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  49. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  50. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  51. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  52. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  53. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  54. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  55. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  56. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  57. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  58. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  59. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  60. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  61. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  62. {mito_ai-0.1.45.data → mito_ai-0.1.46.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
  63. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  64. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  65. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  66. {mito_ai-0.1.45.data → mito_ai-0.1.46.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  67. {mito_ai-0.1.45.dist-info → mito_ai-0.1.46.dist-info}/WHEEL +0 -0
  68. {mito_ai-0.1.45.dist-info → mito_ai-0.1.46.dist-info}/entry_points.txt +0 -0
  69. {mito_ai-0.1.45.dist-info → mito_ai-0.1.46.dist-info}/licenses/LICENSE +0 -0
@@ -166,6 +166,7 @@ __webpack_require__.r(__webpack_exports__);
166
166
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
167
167
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
168
168
  /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
169
+ /* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
169
170
  /* harmony import */ var _style_CTACarousel_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/CTACarousel.css */ "./style/CTACarousel.css");
170
171
  /*
171
172
  * Copyright (c) Saga Inc.
@@ -174,6 +175,7 @@ __webpack_require__.r(__webpack_exports__);
174
175
 
175
176
 
176
177
 
178
+
177
179
  const CTACarousel = ({ app }) => {
178
180
  const [currentIndex, setCurrentIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);
179
181
  // Define messages inside component to access app prop
@@ -194,6 +196,9 @@ const CTACarousel = ({ app }) => {
194
196
  ];
195
197
  const currentMessage = CTACAROUSEL_MESSAGES[Math.min(currentIndex, CTACAROUSEL_MESSAGES.length - 1)].content;
196
198
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "cta-carousel" },
199
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "cta-logo-container" },
200
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_3__["default"], { width: "60", height: "30" })),
201
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "cta-title" }, "Data Copilot"),
197
202
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "cta-carousel-container" },
198
203
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "cta-message", "data-testid": "cta-message" }, currentMessage)),
199
204
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "cta-carousel-dots" }, CTACAROUSEL_MESSAGES.map((_, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: index, className: `cta-carousel-dot ${index === currentIndex ? 'active' : ''}`, onClick: () => setCurrentIndex(index), "data-testid": "cta-carousel-dot", role: "button" }))))));
@@ -1027,7 +1032,7 @@ __webpack_require__.r(__webpack_exports__);
1027
1032
 
1028
1033
 
1029
1034
 
1030
- const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditing, contextManager, notebookTracker, agentModeEnabled = false, agentExecutionStatus = 'idle', }) => {
1035
+ const ChatInput = ({ app, initialContent, onSave, onCancel, isEditing, contextManager, notebookTracker, agentModeEnabled = false, agentExecutionStatus = 'idle', operatingSystem = 'mac', displayOptimizedChatHistoryLength = 0, agentTargetNotebookPanelRef, isSignedUp = true, }) => {
1031
1036
  var _a;
1032
1037
  const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialContent);
1033
1038
  const textAreaRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
@@ -1242,6 +1247,30 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1242
1247
  ];
1243
1248
  return expandedVariables;
1244
1249
  };
1250
+ const getPlaceholderText = () => {
1251
+ var _a;
1252
+ if (!isSignedUp && displayOptimizedChatHistoryLength === 0) {
1253
+ return 'Sign up above to use Mito AI';
1254
+ }
1255
+ else if (agentExecutionStatus === 'working') {
1256
+ return `Agent is editing ${(_a = agentTargetNotebookPanelRef === null || agentTargetNotebookPanelRef === void 0 ? void 0 : agentTargetNotebookPanelRef.current) === null || _a === void 0 ? void 0 : _a.context.path.split('/').pop()}`;
1257
+ }
1258
+ else if (agentExecutionStatus === 'stopping') {
1259
+ return 'Agent is stopping...';
1260
+ }
1261
+ else if (agentModeEnabled) {
1262
+ return 'Ask agent to do anything';
1263
+ }
1264
+ else if (isEditing) {
1265
+ return 'Edit your message';
1266
+ }
1267
+ else if (displayOptimizedChatHistoryLength < 2) {
1268
+ return `Ask question (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`;
1269
+ }
1270
+ else {
1271
+ return `Ask followup (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`;
1272
+ }
1273
+ };
1245
1274
  // Automatically add active cell context when in Chat mode and there's active cell code
1246
1275
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
1247
1276
  if (!agentModeEnabled) {
@@ -1276,7 +1305,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1276
1305
  } }, "\uFF20 Add Context"),
1277
1306
  additionalContext.map((context, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_8__["default"], { key: `${context.type}-${context.value}-${index}`, title: context.display || context.value, type: context.type, onRemove: () => setAdditionalContext(additionalContext.filter((_, i) => i !== index)), notebookTracker: notebookTracker, activeCellID: activeCellID })))),
1278
1307
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-input-text-area-container' },
1279
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: textAreaRef, className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("message", "message-user", 'chat-input', { "agent-mode": agentModeEnabled }), placeholder: placeholder, value: input, disabled: agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping', onChange: handleInputChange, onKeyDown: (e) => {
1308
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: textAreaRef, className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("message", "message-user", 'chat-input', { "agent-mode": agentModeEnabled }), placeholder: getPlaceholderText(), value: input, disabled: agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping', onChange: handleInputChange, onKeyDown: (e) => {
1280
1309
  // If dropdown is visible, only handle escape to close it
1281
1310
  if (isDropdownVisible) {
1282
1311
  if (e.key === 'Escape') {
@@ -1399,7 +1428,7 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1399
1428
  setNextSteps(agentResponse.next_steps);
1400
1429
  }
1401
1430
  if (isEditing) {
1402
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatInput__WEBPACK_IMPORTED_MODULE_4__["default"], { app: app, initialContent: message.content.replace(/```[\s\S]*?```/g, '').trim(), placeholder: "Edit your message", onSave: handleSave, onCancel: handleCancel, isEditing: isEditing, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: false }));
1431
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatInput__WEBPACK_IMPORTED_MODULE_4__["default"], { app: app, initialContent: message.content.replace(/```[\s\S]*?```/g, '').trim(), onSave: handleSave, onCancel: handleCancel, isEditing: isEditing, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: false }));
1403
1432
  }
1404
1433
  if (mitoAIConnectionError) {
1405
1434
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("message") },
@@ -1897,7 +1926,7 @@ const DEFAULT_SUGGESTION_OPTIONS = [
1897
1926
  prompt: "Graph the countries that have the highest trade surplus with America. Use the data from https://raw.githubusercontent.com/mito-ds/mito/refs/heads/dev/jupyterhub/us_tarrifs.csv"
1898
1927
  }
1899
1928
  ];
1900
- const ScrollableSuggestions = ({ onSelectSuggestion }) => {
1929
+ const ScrollableSuggestions = ({ onSelectSuggestion, }) => {
1901
1930
  const suggestionsRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
1902
1931
  // Apply the scroll mask to the suggestions container when it mounts, updates, or is scrolled
1903
1932
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -1998,43 +2027,46 @@ __webpack_require__.r(__webpack_exports__);
1998
2027
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__);
1999
2028
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
2000
2029
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__);
2001
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
2002
- /* harmony import */ var _components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../components/AgentComponents/ErrorFixupToolUI */ "./lib/components/AgentComponents/ErrorFixupToolUI.js");
2003
- /* harmony import */ var _components_DropdownMenu__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../components/DropdownMenu */ "./lib/components/DropdownMenu.js");
2004
- /* harmony import */ var _components_IconButton__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../components/IconButton */ "./lib/components/IconButton.js");
2005
- /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
2030
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
2031
+ /* harmony import */ var _components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../components/AgentComponents/ErrorFixupToolUI */ "./lib/components/AgentComponents/ErrorFixupToolUI.js");
2032
+ /* harmony import */ var _components_DropdownMenu__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../components/DropdownMenu */ "./lib/components/DropdownMenu.js");
2033
+ /* harmony import */ var _components_IconButton__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../components/IconButton */ "./lib/components/IconButton.js");
2034
+ /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
2006
2035
  /* harmony import */ var _components_ModelSelector__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/ModelSelector */ "./lib/components/ModelSelector.js");
2007
- /* harmony import */ var _components_NextStepsPills__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../components/NextStepsPills */ "./lib/components/NextStepsPills.js");
2008
- /* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
2009
- /* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
2010
- /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
2011
- /* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
2012
- /* harmony import */ var _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../icons/UndoIcon */ "./lib/icons/UndoIcon.js");
2013
- /* harmony import */ var _utils_agentActions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils/agentActions */ "./lib/utils/agentActions.js");
2014
- /* harmony import */ var _utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../utils/blacklistedWords */ "./lib/utils/blacklistedWords.js");
2015
- /* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/checkpoint */ "./lib/utils/checkpoint.js");
2016
- /* harmony import */ var _utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../utils/chatHistory */ "./lib/utils/chatHistory.js");
2017
- /* harmony import */ var _utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../utils/codeDiff */ "./lib/utils/codeDiff.js");
2018
- /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
2019
- /* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
2020
- /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
2021
- /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
2036
+ /* harmony import */ var _components_NextStepsPills__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../components/NextStepsPills */ "./lib/components/NextStepsPills.js");
2037
+ /* harmony import */ var _components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../components/TextAndIconButton */ "./lib/components/TextAndIconButton.js");
2038
+ /* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
2039
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
2040
+ /* harmony import */ var _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../icons/UndoIcon */ "./lib/icons/UndoIcon.js");
2041
+ /* harmony import */ var _utils_agentActions__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../utils/agentActions */ "./lib/utils/agentActions.js");
2042
+ /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
2043
+ /* harmony import */ var _utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../utils/blacklistedWords */ "./lib/utils/blacklistedWords.js");
2044
+ /* harmony import */ var _utils_checkpoint__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../utils/checkpoint */ "./lib/utils/checkpoint.js");
2045
+ /* harmony import */ var _utils_chatHistory__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../utils/chatHistory */ "./lib/utils/chatHistory.js");
2046
+ /* harmony import */ var _utils_codeDiff__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../utils/codeDiff */ "./lib/utils/codeDiff.js");
2047
+ /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
2048
+ /* harmony import */ var _utils_cellOutput__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/cellOutput */ "./lib/utils/cellOutput.js");
2049
+ /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
2050
+ /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
2022
2051
  /* harmony import */ var _utils_waitForNotebookReady__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/waitForNotebookReady */ "./lib/utils/waitForNotebookReady.js");
2023
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
2024
- /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
2025
- /* harmony import */ var _SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../SettingsManager/profiler/ProfilerPage */ "./lib/Extensions/SettingsManager/profiler/ProfilerPage.js");
2026
- /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
2027
- /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
2052
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
2053
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
2054
+ /* harmony import */ var _utils_userSignupState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/userSignupState */ "./lib/utils/userSignupState.js");
2055
+ /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
2056
+ /* harmony import */ var _SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../SettingsManager/profiler/ProfilerPage */ "./lib/Extensions/SettingsManager/profiler/ProfilerPage.js");
2057
+ /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
2058
+ /* harmony import */ var _SignUpForm__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./SignUpForm */ "./lib/Extensions/AiChat/SignUpForm.js");
2059
+ /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
2028
2060
  /* harmony import */ var _FirstMessage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FirstMessage */ "./lib/Extensions/AiChat/FirstMessage.js");
2029
- /* harmony import */ var _ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ChatMessage/ChatInput */ "./lib/Extensions/AiChat/ChatMessage/ChatInput.js");
2030
- /* harmony import */ var _ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./ChatMessage/ChatMessage */ "./lib/Extensions/AiChat/ChatMessage/ChatMessage.js");
2031
- /* harmony import */ var _ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ChatMessage/RevertQuestionnaire */ "./lib/Extensions/AiChat/ChatMessage/RevertQuestionnaire.js");
2032
- /* harmony import */ var _ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ChatMessage/ScrollableSuggestions */ "./lib/Extensions/AiChat/ChatMessage/ScrollableSuggestions.js");
2061
+ /* harmony import */ var _ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./ChatMessage/ChatInput */ "./lib/Extensions/AiChat/ChatMessage/ChatInput.js");
2062
+ /* harmony import */ var _ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./ChatMessage/ChatMessage */ "./lib/Extensions/AiChat/ChatMessage/ChatMessage.js");
2063
+ /* harmony import */ var _ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./ChatMessage/RevertQuestionnaire */ "./lib/Extensions/AiChat/ChatMessage/RevertQuestionnaire.js");
2064
+ /* harmony import */ var _ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./ChatMessage/ScrollableSuggestions */ "./lib/Extensions/AiChat/ChatMessage/ScrollableSuggestions.js");
2033
2065
  /* harmony import */ var _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ChatHistoryManager */ "./lib/Extensions/AiChat/ChatHistoryManager.js");
2034
2066
  /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
2035
2067
  /* harmony import */ var _style_ChatTaskpane_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/ChatTaskpane.css */ "./style/ChatTaskpane.css");
2036
2068
  /* harmony import */ var _style_TextButton_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../style/TextButton.css */ "./style/TextButton.css");
2037
- /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
2069
+ /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
2038
2070
  /*
2039
2071
  * Copyright (c) Saga Inc.
2040
2072
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -2059,7 +2091,6 @@ __webpack_require__.r(__webpack_exports__);
2059
2091
  // Internal imports - Icons
2060
2092
 
2061
2093
 
2062
-
2063
2094
  // Internal imports - Utils
2064
2095
 
2065
2096
 
@@ -2074,6 +2105,9 @@ __webpack_require__.r(__webpack_exports__);
2074
2105
 
2075
2106
 
2076
2107
 
2108
+
2109
+
2110
+
2077
2111
  // Internal imports - Chat components
2078
2112
 
2079
2113
 
@@ -2083,6 +2117,7 @@ __webpack_require__.r(__webpack_exports__);
2083
2117
 
2084
2118
 
2085
2119
 
2120
+
2086
2121
  // Styles
2087
2122
 
2088
2123
 
@@ -2094,7 +2129,7 @@ const getDefaultChatHistoryManager = (notebookTracker, contextManager) => {
2094
2129
  return chatHistoryManager;
2095
2130
  };
2096
2131
  const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app, operatingSystem, websocketClient, }) => {
2097
- var _a;
2132
+ const [isSignedUp, setIsSignedUp] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);
2098
2133
  const [chatHistoryManager, setChatHistoryManager] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(() => getDefaultChatHistoryManager(notebookTracker, contextManager));
2099
2134
  const chatHistoryManagerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(chatHistoryManager);
2100
2135
  const [loadingAIResponse, setLoadingAIResponse] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);
@@ -2288,6 +2323,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2288
2323
  }
2289
2324
  return newChatHistoryManager;
2290
2325
  };
2326
+ // Main initialization effect - runs once on mount
2291
2327
  (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
2292
2328
  const initializeChatHistory = async () => {
2293
2329
  try {
@@ -2335,7 +2371,9 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2335
2371
  addAIMessageFromResponseAndUpdateState(error.hint ? error.hint : `${error}`, 'chat', newChatHistoryManager, true);
2336
2372
  }
2337
2373
  };
2374
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__.logEvent)('opened_ai_chat_taskpane');
2338
2375
  void initializeChatHistory();
2376
+ void refreshUserSignupState(); // Get user signup state when the component first mounts
2339
2377
  }, [websocketClient]);
2340
2378
  (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
2341
2379
  /*
@@ -2360,10 +2398,15 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2360
2398
  */
2361
2399
  chatHistoryManagerRef.current = chatHistoryManager;
2362
2400
  }, [chatHistoryManager]);
2401
+ // Function to refresh user signup state using the shared helper
2402
+ const refreshUserSignupState = async () => {
2403
+ const signupState = await (0,_utils_userSignupState__WEBPACK_IMPORTED_MODULE_12__.checkUserSignupState)();
2404
+ setIsSignedUp(signupState.isSignedUp);
2405
+ };
2363
2406
  // Scroll to bottom whenever chat history updates, but only if in follow mode
2364
2407
  (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
2365
2408
  if (autoScrollFollowMode) {
2366
- (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_11__.scrollToDiv)(chatMessagesRef);
2409
+ (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_13__.scrollToDiv)(chatMessagesRef);
2367
2410
  }
2368
2411
  }, [chatHistoryManager.getDisplayOptimizedHistory().length, chatHistoryManager, autoScrollFollowMode]);
2369
2412
  // Add scroll event handler to detect manual scrolling
@@ -2485,7 +2528,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2485
2528
  if (messageIndex !== undefined) {
2486
2529
  agentExecutionMetadata.index = messageIndex;
2487
2530
  }
2488
- agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutputInNotebook)(agentTargetNotebookPanel, sendCellIDOutput);
2531
+ agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_14__.getBase64EncodedCellOutputInNotebook)(agentTargetNotebookPanel, sendCellIDOutput);
2489
2532
  setChatHistoryManager(newChatHistoryManager);
2490
2533
  setLoadingAIResponse(true);
2491
2534
  // Step 2: Send the message to the AI
@@ -2521,7 +2564,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2521
2564
  // Add the active cell output to the metadata afterwards setting the chatHistoryManager so that
2522
2565
  // we don't have to wait on turning the output into a base64 image before we can add the user's message
2523
2566
  // to the chat.
2524
- const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_13__.getActiveCellOutput)(notebookTracker);
2567
+ const activeCellOutput = await (0,_utils_cellOutput__WEBPACK_IMPORTED_MODULE_15__.getActiveCellOutput)(notebookTracker);
2525
2568
  if (activeCellOutput !== undefined) {
2526
2569
  chatMessageMetadata.base64EncodedActiveCellOutput = activeCellOutput;
2527
2570
  }
@@ -2549,7 +2592,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2549
2592
  const abortController = new AbortController();
2550
2593
  activeRequestControllerRef.current = abortController;
2551
2594
  // Capture the completion request for debugging
2552
- (0,_SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_14__.captureCompletionRequest)(completionRequest);
2595
+ (0,_SettingsManager_profiler_ProfilerPage__WEBPACK_IMPORTED_MODULE_16__.captureCompletionRequest)(completionRequest);
2553
2596
  if (completionRequest.stream) {
2554
2597
  // Reset the streaming response and set streaming state
2555
2598
  streamingContentRef.current = '';
@@ -2717,7 +2760,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2717
2760
  };
2718
2761
  const startAgentExecution = async (input, messageIndex, additionalContext) => {
2719
2762
  agentTargetNotebookPanelRef.current = notebookTracker.currentWidget;
2720
- await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.createCheckpoint)(app, setHasCheckpoint);
2763
+ await (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_17__.createCheckpoint)(app, setHasCheckpoint);
2721
2764
  setAgentExecutionStatus('working');
2722
2765
  // Enable follow mode when user starts agent execution
2723
2766
  setAutoScrollFollowMode(true);
@@ -2749,9 +2792,9 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2749
2792
  const aiDisplayOptimizedChatItem = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
2750
2793
  // # TODO: Make this is a helper function so we can also use it in the auto error fixup!
2751
2794
  if (aiDisplayOptimizedChatItem) {
2752
- const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.getCodeBlockFromMessage)(aiDisplayOptimizedChatItem.message);
2795
+ const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_18__.getCodeBlockFromMessage)(aiDisplayOptimizedChatItem.message);
2753
2796
  if (aiGeneratedCode) {
2754
- const securityCheck = (0,_utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_17__.checkForBlacklistedWords)(aiGeneratedCode);
2797
+ const securityCheck = (0,_utils_blacklistedWords__WEBPACK_IMPORTED_MODULE_19__.checkForBlacklistedWords)(aiGeneratedCode);
2755
2798
  if (!securityCheck.safe) {
2756
2799
  console.error('Security Warning:', securityCheck.reason);
2757
2800
  addAIMessageFromResponseAndUpdateState(`I cannot execute this code without your approval because this code did not pass my security checks. ${securityCheck.reason}. For your safety, I am stopping execution of this plan.`, 'agent:execution', chatHistoryManager);
@@ -2787,8 +2830,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2787
2830
  }
2788
2831
  if (agentResponse.type === 'cell_update' && agentResponse.cell_update) {
2789
2832
  // Run the code and handle any errors
2790
- await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.acceptAndRunCellUpdate)(agentResponse.cell_update, agentTargetNotebookPanelRef.current);
2791
- const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, markAgentForStopping, chatHistoryManagerRef);
2833
+ await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_20__.acceptAndRunCellUpdate)(agentResponse.cell_update, agentTargetNotebookPanelRef.current);
2834
+ const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_20__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, markAgentForStopping, chatHistoryManagerRef);
2792
2835
  if (status === 'interupted') {
2793
2836
  break;
2794
2837
  }
@@ -2808,12 +2851,12 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2808
2851
  sendCellIDOutput = agentResponse.get_cell_output_cell_id;
2809
2852
  }
2810
2853
  if (agentResponse.type === 'run_all_cells') {
2811
- const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.runAllCells)(app, agentTargetNotebookPanelRef.current);
2854
+ const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_20__.runAllCells)(app, agentTargetNotebookPanelRef.current);
2812
2855
  // If run_all_cells resulted in an error, handle it through the error fixup process
2813
2856
  if (!result.success && result.errorMessage && result.errorCellId) {
2814
2857
  // Set the error cell as active so the error retry logic can work with it
2815
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByIDInNotebookPanel)(agentTargetNotebookPanelRef.current, result.errorCellId);
2816
- const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_18__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, markAgentForStopping, chatHistoryManagerRef);
2858
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.setActiveCellByIDInNotebookPanel)(agentTargetNotebookPanelRef.current, result.errorCellId);
2859
+ const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_20__.retryIfExecutionError)(agentTargetNotebookPanelRef.current, app, sendAgentSmartDebugMessage, shouldContinueAgentExecution, markAgentForStopping, chatHistoryManagerRef);
2817
2860
  if (status === 'interupted') {
2818
2861
  break;
2819
2862
  }
@@ -2834,33 +2877,33 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2834
2877
  if (!aiMessage) {
2835
2878
  return;
2836
2879
  }
2837
- const updateCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellCodeByID)(notebookTracker, updateCellID);
2880
+ const updateCellCode = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.getCellCodeByID)(notebookTracker, updateCellID);
2838
2881
  if (updateCellID === undefined || updateCellCode === undefined) {
2839
2882
  return;
2840
2883
  }
2841
2884
  // Extract the code from the AI's message and then calculate the code diffs
2842
- const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.getCodeBlockFromMessage)(aiMessage);
2843
- const aiGeneratedCodeCleaned = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.removeMarkdownCodeFormatting)(aiGeneratedCode || '');
2844
- const { unifiedCodeString, unifiedDiffs } = (0,_utils_codeDiff__WEBPACK_IMPORTED_MODULE_20__.getCodeDiffsAndUnifiedCodeString)(updateCellCode, aiGeneratedCodeCleaned);
2885
+ const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_18__.getCodeBlockFromMessage)(aiMessage);
2886
+ const aiGeneratedCodeCleaned = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_18__.removeMarkdownCodeFormatting)(aiGeneratedCode || '');
2887
+ const { unifiedCodeString, unifiedDiffs } = (0,_utils_codeDiff__WEBPACK_IMPORTED_MODULE_22__.getCodeDiffsAndUnifiedCodeString)(updateCellCode, aiGeneratedCodeCleaned);
2845
2888
  // Store the code cell ID where we write the code diffs so that we can
2846
2889
  // accept or reject the code diffs to the correct cell
2847
2890
  cellStateBeforeDiff.current = { codeCellID: updateCellID, code: updateCellCode };
2848
2891
  // Temporarily write the unified code string to the active cell so we can display
2849
2892
  // the code diffs to the user
2850
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, unifiedCodeString, updateCellID);
2893
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.writeCodeToCellByID)(notebookTracker, unifiedCodeString, updateCellID);
2851
2894
  updateCodeCellsExtensions(unifiedDiffs);
2852
2895
  // Briefly highlight the code cell to draw the user's attention to it
2853
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.highlightCodeCell)(notebookTracker, updateCellID);
2896
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.highlightCodeCell)(notebookTracker, updateCellID);
2854
2897
  };
2855
2898
  const displayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
2856
2899
  const previewAICodeToActiveCell = () => {
2857
2900
  setCodeReviewStatus('codeCellPreview');
2858
- const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getActiveCellID)(notebookTracker);
2901
+ const activeCellID = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.getActiveCellID)(notebookTracker);
2859
2902
  const lastAIDisplayMessage = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
2860
2903
  if (activeCellID === undefined || lastAIDisplayMessage === undefined) {
2861
2904
  return;
2862
2905
  }
2863
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.scrollToCell)(notebookTracker.currentWidget, activeCellID, undefined, 'end');
2906
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.scrollToCell)(notebookTracker.currentWidget, activeCellID, undefined, 'end');
2864
2907
  updateCodeDiffStripes(lastAIDisplayMessage.message, activeCellID);
2865
2908
  updateCellToolbarButtons();
2866
2909
  };
@@ -2870,7 +2913,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2870
2913
  if (!lastAIMessage || !cellStateBeforeDiff.current) {
2871
2914
  return;
2872
2915
  }
2873
- const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_16__.getCodeBlockFromMessage)(lastAIMessage.message);
2916
+ const aiGeneratedCode = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_18__.getCodeBlockFromMessage)(lastAIMessage.message);
2874
2917
  if (!aiGeneratedCode) {
2875
2918
  return;
2876
2919
  }
@@ -2879,10 +2922,10 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2879
2922
  // Write to the cell that has the code diffs
2880
2923
  writeCodeToCellAndTurnOffDiffs(aiGeneratedCode, targetCellID);
2881
2924
  // Focus on the active cell after the code is written
2882
- const targetCell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.getCellByID)(notebookTracker, targetCellID);
2925
+ const targetCell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.getCellByID)(notebookTracker, targetCellID);
2883
2926
  if (targetCell) {
2884
2927
  // Make the target cell the active cell
2885
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.setActiveCellByID)(notebookTracker, targetCellID);
2928
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.setActiveCellByID)(notebookTracker, targetCellID);
2886
2929
  // Focus on the active cell
2887
2930
  targetCell.activate();
2888
2931
  }
@@ -2908,7 +2951,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2908
2951
  updateCodeCellsExtensions(undefined);
2909
2952
  cellStateBeforeDiff.current = undefined;
2910
2953
  if (codeCellID !== undefined) {
2911
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_19__.writeCodeToCellByID)(notebookTracker, code, codeCellID);
2954
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_21__.writeCodeToCellByID)(notebookTracker, code, codeCellID);
2912
2955
  updateCellToolbarButtons();
2913
2956
  }
2914
2957
  };
@@ -2919,17 +2962,17 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2919
2962
  the first time we create the chat. Registering the command when it is already created causes
2920
2963
  errors.
2921
2964
  */
2922
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE, {
2965
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE, {
2923
2966
  execute: () => {
2924
2967
  previewAICodeToActiveCell();
2925
2968
  }
2926
2969
  });
2927
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE, {
2970
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_APPLY_LATEST_CODE, {
2928
2971
  execute: () => {
2929
2972
  acceptAICode();
2930
2973
  }
2931
2974
  });
2932
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE, {
2975
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_REJECT_LATEST_CODE, {
2933
2976
  execute: () => {
2934
2977
  rejectAICode();
2935
2978
  }
@@ -2938,19 +2981,19 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2938
2981
  Add a new command to the JupyterLab command registry that sends the current chat message.
2939
2982
  We use this to automatically send the message when the user adds an error to the chat.
2940
2983
  */
2941
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE, {
2984
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_SEND_DEBUG_ERROR_MESSAGE, {
2942
2985
  execute: async (args) => {
2943
2986
  if (args === null || args === void 0 ? void 0 : args.input) {
2944
2987
  await sendSmartDebugMessage(args.input.toString());
2945
2988
  }
2946
2989
  }
2947
2990
  });
2948
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE, {
2991
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_SEND_EXPLAIN_CODE_MESSAGE, {
2949
2992
  execute: async () => {
2950
2993
  await sendExplainCodeMessage();
2951
2994
  }
2952
2995
  });
2953
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, {
2996
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, {
2954
2997
  execute: async (args) => {
2955
2998
  if (args === null || args === void 0 ? void 0 : args.input) {
2956
2999
  // If its not already in agent mode, start a new chat in agent mode
@@ -2967,7 +3010,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2967
3010
  /*
2968
3011
  Register the code cell toolbar buttons for accepting and rejecting code.
2969
3012
  */
2970
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE, {
3013
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE, {
2971
3014
  label: `Accept ${operatingSystem === 'mac' ? '⌘Y' : 'Ctrl+Y'}`,
2972
3015
  className: 'text-button-mito-ai button-base button-green',
2973
3016
  caption: 'Accept Code',
@@ -2985,7 +3028,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2985
3028
  }
2986
3029
  }
2987
3030
  });
2988
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE, {
3031
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE, {
2989
3032
  label: `Reject ${operatingSystem === 'mac' ? '⌘U' : 'Ctrl+U'}`,
2990
3033
  className: 'text-button-mito-ai button-base button-red',
2991
3034
  caption: 'Reject Code',
@@ -3006,13 +3049,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3006
3049
  // Register keyboard shortcuts
3007
3050
  const accelYDisposable = app.commands.addKeyBinding({
3008
3051
  command: codeReviewStatus === 'chatPreview' ?
3009
- _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE :
3010
- _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_APPLY_LATEST_CODE,
3052
+ _commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_PREVIEW_LATEST_CODE :
3053
+ _commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_APPLY_LATEST_CODE,
3011
3054
  keys: ['Accel Y'],
3012
3055
  selector: 'body',
3013
3056
  });
3014
3057
  const accelDDisposable = app.commands.addKeyBinding({
3015
- command: _commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_REJECT_LATEST_CODE,
3058
+ command: _commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_REJECT_LATEST_CODE,
3016
3059
  keys: ['Accel U'],
3017
3060
  selector: 'body',
3018
3061
  preventDefault: true,
@@ -3029,8 +3072,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3029
3072
  // Without this, the user needs to take some action, like switching to a different cell
3030
3073
  // and then switching back in order for the Jupyter to re-evaluate if it should
3031
3074
  // show the toolbar buttons.
3032
- app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE);
3033
- app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_21__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE);
3075
+ app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_CELL_TOOLBAR_ACCEPT_CODE);
3076
+ app.commands.notifyCommandChanged(_commands__WEBPACK_IMPORTED_MODULE_23__.COMMAND_MITO_AI_CELL_TOOLBAR_REJECT_CODE);
3034
3077
  };
3035
3078
  const codeDiffStripesCompartments = react__WEBPACK_IMPORTED_MODULE_1___default().useRef(new Map());
3036
3079
  // Function to update the extensions of code cells
@@ -3058,13 +3101,13 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3058
3101
  codeDiffStripesCompartments.current.set(cellId, compartment);
3059
3102
  // Apply the initial configuration
3060
3103
  editorView.dispatch({
3061
- effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : [])),
3104
+ effects: _codemirror_state__WEBPACK_IMPORTED_MODULE_0__.StateEffect.appendConfig.of(compartment.of(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_24__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : [])),
3062
3105
  });
3063
3106
  }
3064
3107
  else {
3065
3108
  // Reconfigure the compartment
3066
3109
  editorView.dispatch({
3067
- effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_22__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : []),
3110
+ effects: compartment.reconfigure(unifiedDiffLines !== undefined && isActiveCodeCell ? (0,_CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_24__.codeDiffStripesExtension)({ unifiedDiffLines: unifiedDiffLines }) : []),
3068
3111
  });
3069
3112
  }
3070
3113
  }
@@ -3079,7 +3122,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3079
3122
  // In agent mode, we group consecutive error messages together.
3080
3123
  // In chat mode, we display messages individually as they were sent
3081
3124
  if (agentModeEnabled) {
3082
- processedDisplayOptimizedChatHistory = (0,_utils_chatHistory__WEBPACK_IMPORTED_MODULE_23__.processChatHistoryForErrorGrouping)(chatHistoryManager.getDisplayOptimizedHistory());
3125
+ processedDisplayOptimizedChatHistory = (0,_utils_chatHistory__WEBPACK_IMPORTED_MODULE_25__.processChatHistoryForErrorGrouping)(chatHistoryManager.getDisplayOptimizedHistory());
3083
3126
  }
3084
3127
  else {
3085
3128
  processedDisplayOptimizedChatHistory = chatHistoryManager.getDisplayOptimizedHistory();
@@ -3088,19 +3131,21 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3088
3131
  const isGroupedErrorMessages = (item) => {
3089
3132
  return Array.isArray(item);
3090
3133
  };
3091
- return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane" },
3134
+ return (
3135
+ // We disable the chat taskpane if the user is not signed up AND there are no chat history items
3136
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_26__.classNames)('chat-taskpane', { 'disabled': !(isSignedUp || displayOptimizedChatHistory.length > 0) }) },
3092
3137
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header" },
3093
3138
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-left" },
3094
- 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: () => {
3095
- void app.commands.execute(_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_25__.COMMAND_MITO_AI_SETTINGS);
3139
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_27__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.settingsIcon.react, null), title: "Mito AI Settings", onClick: () => {
3140
+ void app.commands.execute(_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_28__.COMMAND_MITO_AI_SETTINGS);
3096
3141
  } })),
3097
3142
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-taskpane-header-right" },
3098
- 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(); } }),
3099
- 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 },
3143
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_IconButton__WEBPACK_IMPORTED_MODULE_27__["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(); } }),
3144
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_DropdownMenu__WEBPACK_IMPORTED_MODULE_29__["default"], { trigger: react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "icon-button", title: "Chat Threads", onClick: fetchChatThreads },
3100
3145
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.historyIcon.react, null)), items: chatThreads.length > 0
3101
3146
  ? chatThreads.map(thread => ({
3102
3147
  label: thread.name,
3103
- primaryIcon: activeThreadIdRef.current === thread.thread_id ? _icons__WEBPACK_IMPORTED_MODULE_27__.OpenIndicatorLabIcon.react : undefined,
3148
+ primaryIcon: activeThreadIdRef.current === thread.thread_id ? _icons__WEBPACK_IMPORTED_MODULE_30__.OpenIndicatorLabIcon.react : undefined,
3104
3149
  onClick: () => fetchChatHistoryAndSetActiveThread(thread.thread_id),
3105
3150
  secondaryActions: [
3106
3151
  {
@@ -3117,38 +3162,36 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3117
3162
  }], alignment: "right" }))),
3118
3163
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-messages", ref: chatMessagesRef },
3119
3164
  displayOptimizedChatHistory.length === 0 &&
3120
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-empty-message" },
3121
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { style: { margin: '0 auto 8px', display: 'block', textAlign: 'center' } },
3122
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_28__["default"], { width: "60", height: "30" })),
3123
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { style: { display: 'block', textAlign: 'center', fontWeight: 'bold', fontSize: '20px', marginBottom: '15px' } }, "Data Copilot"),
3124
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CTACarousel__WEBPACK_IMPORTED_MODULE_29__["default"], { app: app })),
3165
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-empty-message" }, isSignedUp === false
3166
+ ? react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_SignUpForm__WEBPACK_IMPORTED_MODULE_31__["default"], { onSignUpSuccess: refreshUserSignupState })
3167
+ : react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CTACarousel__WEBPACK_IMPORTED_MODULE_32__["default"], { app: app })),
3125
3168
  processedDisplayOptimizedChatHistory.map((displayOptimizedChat, index) => {
3126
3169
  if (isGroupedErrorMessages(displayOptimizedChat)) {
3127
- return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_30__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry }));
3170
+ return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_AgentComponents_ErrorFixupToolUI__WEBPACK_IMPORTED_MODULE_33__["default"], { key: index, messages: displayOptimizedChat, renderMimeRegistry: renderMimeRegistry }));
3128
3171
  }
3129
3172
  else {
3130
- 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 }));
3173
+ return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatMessage__WEBPACK_IMPORTED_MODULE_34__["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 }));
3131
3174
  }
3132
3175
  }).filter(message => message !== null),
3133
3176
  loadingAIResponse &&
3134
3177
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-loading-message" },
3135
3178
  "Thinking ",
3136
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_32__["default"], null)),
3179
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_35__["default"], null)),
3137
3180
  hasCheckpoint &&
3138
3181
  agentModeEnabled &&
3139
3182
  agentExecutionStatus === 'idle' &&
3140
3183
  displayOptimizedChatHistory.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: 'message message-assistant-chat' },
3141
- 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: () => {
3142
- void (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_15__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
3184
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_36__["default"], { text: "Revert changes", icon: _icons_UndoIcon__WEBPACK_IMPORTED_MODULE_37__["default"], title: "Revert changes", onClick: () => {
3185
+ void (0,_utils_checkpoint__WEBPACK_IMPORTED_MODULE_17__.restoreCheckpoint)(app, notebookTracker, setHasCheckpoint);
3143
3186
  setDisplayedNextStepsIfAvailable(false);
3144
3187
  setHasCheckpoint(false);
3145
3188
  setShowRevertQuestionnaire(true);
3146
- (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_11__.scrollToDiv)(chatMessagesRef);
3189
+ (0,_utils_scroll__WEBPACK_IMPORTED_MODULE_13__.scrollToDiv)(chatMessagesRef);
3147
3190
  }, variant: "gray", width: "fit-contents", iconPosition: "left" }),
3148
3191
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("p", { className: "text-muted text-sm" }, "Undo the most recent changes made by the agent"))),
3149
- showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_35__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))),
3192
+ showRevertQuestionnaire && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_RevertQuestionnaire__WEBPACK_IMPORTED_MODULE_38__["default"], { onDestroy: () => setShowRevertQuestionnaire(false), getDuplicateChatHistoryManager: getDuplicateChatHistoryManager, setChatHistoryManager: setChatHistoryManager }))),
3150
3193
  displayOptimizedChatHistory.length === 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "suggestions-container" },
3151
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_36__["default"], { onSelectSuggestion: (prompt) => {
3194
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ScrollableSuggestions__WEBPACK_IMPORTED_MODULE_39__["default"], { onSelectSuggestion: (prompt) => {
3152
3195
  if (agentModeEnabled) {
3153
3196
  void startAgentExecution(prompt);
3154
3197
  }
@@ -3157,15 +3200,11 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3157
3200
  }
3158
3201
  } }))),
3159
3202
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: `connected-input-container ${nextSteps.length > 0 ? 'has-next-steps' : ''}` },
3160
- 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 })),
3161
- 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()}` :
3162
- agentExecutionStatus === 'stopping' ? 'Agent is stopping...' :
3163
- agentModeEnabled ? 'Ask agent to do anything' :
3164
- displayOptimizedChatHistory.length < 2 ? `Ask question (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`
3165
- : `Ask followup (${operatingSystem === 'mac' ? '⌘' : 'Ctrl'}E), @ to mention`, onSave: agentModeEnabled ? startAgentExecution : sendChatInputMessage, onCancel: undefined, isEditing: false, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecutionStatus })),
3203
+ nextSteps.length > 0 && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_NextStepsPills__WEBPACK_IMPORTED_MODULE_40__["default"], { nextSteps: nextSteps, onSelectNextStep: agentModeEnabled ? startAgentExecution : sendChatInputMessage, displayedNextStepsIfAvailable: displayedNextStepsIfAvailable, setDisplayedNextStepsIfAvailable: setDisplayedNextStepsIfAvailable })),
3204
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_ChatMessage_ChatInput__WEBPACK_IMPORTED_MODULE_41__["default"], { app: app, initialContent: '', onSave: agentModeEnabled ? startAgentExecution : sendChatInputMessage, onCancel: undefined, isEditing: false, contextManager: contextManager, notebookTracker: notebookTracker, agentModeEnabled: agentModeEnabled, agentExecutionStatus: agentExecutionStatus, operatingSystem: operatingSystem, displayOptimizedChatHistoryLength: displayOptimizedChatHistory.length, agentTargetNotebookPanelRef: agentTargetNotebookPanelRef, isSignedUp: isSignedUp })),
3166
3205
  agentExecutionStatus !== 'working' && agentExecutionStatus !== 'stopping' && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls" },
3167
3206
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "chat-controls-left" },
3168
- 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) => {
3207
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_ToggleButton__WEBPACK_IMPORTED_MODULE_42__["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) => {
3169
3208
  await startNewChat(); // TODO: delete thread instead of starting new chat
3170
3209
  setAgentModeEnabled(!isLeftSelected);
3171
3210
  // Clear agent checkpoint when switching modes
@@ -3201,7 +3240,7 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
3201
3240
  " \u23CE"))),
3202
3241
  (agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping') && (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", { className: "button-base button-red stop-agent-button", onClick: () => void markAgentForStopping('userStop'), disabled: agentExecutionStatus === 'stopping', "data-testid": "stop-agent-button" }, agentExecutionStatus === 'stopping' ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "stop-agent-button-content" },
3203
3242
  "Stopping",
3204
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_40__["default"], null),
3243
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_43__["default"], null),
3205
3244
  " ")) : ('Stop Agent')))));
3206
3245
  };
3207
3246
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatTaskpane);
@@ -3475,6 +3514,59 @@ const getFirstMessageFromCookie = () => {
3475
3514
  };
3476
3515
 
3477
3516
 
3517
+ /***/ }),
3518
+
3519
+ /***/ "./lib/Extensions/AiChat/SignUpForm.js":
3520
+ /*!*********************************************!*\
3521
+ !*** ./lib/Extensions/AiChat/SignUpForm.js ***!
3522
+ \*********************************************/
3523
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3524
+
3525
+ __webpack_require__.r(__webpack_exports__);
3526
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3527
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3528
+ /* harmony export */ });
3529
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
3530
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3531
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
3532
+ /* harmony import */ var _icons_MitoLogo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../icons/MitoLogo */ "./lib/icons/MitoLogo.js");
3533
+ /* harmony import */ var _utils_userSignupEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/userSignupEvents */ "./lib/utils/userSignupEvents.js");
3534
+ /* harmony import */ var _style_SignUpForm_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/SignUpForm.css */ "./style/SignUpForm.css");
3535
+ /*
3536
+ * Copyright (c) Saga Inc.
3537
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3538
+ */
3539
+
3540
+
3541
+
3542
+
3543
+
3544
+ const SignUpForm = ({ onSignUpSuccess }) => {
3545
+ const [email, setEmail] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
3546
+ const handleSubmit = async (e) => {
3547
+ e.preventDefault();
3548
+ try {
3549
+ await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.setUserKey)('user_email', email);
3550
+ onSignUpSuccess === null || onSignUpSuccess === void 0 ? void 0 : onSignUpSuccess();
3551
+ // Emit signup success event for other components to listen to
3552
+ _utils_userSignupEvents__WEBPACK_IMPORTED_MODULE_3__.userSignupEvents.emitSignupSuccess();
3553
+ }
3554
+ catch (error) {
3555
+ console.error('Failed to set user email:', error);
3556
+ }
3557
+ };
3558
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "signup-form-container" },
3559
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "signup-form-header-logo" },
3560
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_MitoLogo__WEBPACK_IMPORTED_MODULE_4__["default"], { width: "60", height: "30" })),
3561
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "signup-form-header" }, "Sign Up for Mito"),
3562
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "signup-form-message", "data-testid": "signup-form-message" }, "To avoid abuse of our free AI credits, we ask that you login to use Mito AI. No credit card required, just an email."),
3563
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { onSubmit: handleSubmit, style: { marginTop: '15px' } },
3564
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "email", value: email, onChange: (e) => setEmail(e.target.value), placeholder: "Your work email", className: "signup-form-input", required: true }),
3565
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "submit", className: "button-base signup-form-button" }, "Sign Up"))));
3566
+ };
3567
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SignUpForm);
3568
+
3569
+
3478
3570
  /***/ }),
3479
3571
 
3480
3572
  /***/ "./lib/Extensions/AiChat/jupyterSettingsManager.js":
@@ -4992,14 +5084,18 @@ __webpack_require__.r(__webpack_exports__);
4992
5084
  /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__);
4993
5085
  /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
4994
5086
  /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_3__);
4995
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
4996
- /* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
4997
- /* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
4998
- /* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
4999
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
5000
- /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
5087
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
5088
+ /* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
5089
+ /* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
5090
+ /* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
5091
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
5092
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
5001
5093
  /* harmony import */ var _style_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/StreamlitPreviewPlugin.css */ "./style/StreamlitPreviewPlugin.css");
5002
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AppPreview/utils.js");
5094
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AppPreview/utils.js");
5095
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
5096
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
5097
+ /* harmony import */ var _UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./UpdateAppDropdown */ "./lib/Extensions/AppPreview/UpdateAppDropdown.js");
5098
+ /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");
5003
5099
  /*
5004
5100
  * Copyright (c) Saga Inc.
5005
5101
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -5018,6 +5114,10 @@ __webpack_require__.r(__webpack_exports__);
5018
5114
 
5019
5115
 
5020
5116
 
5117
+
5118
+
5119
+
5120
+
5021
5121
  /**
5022
5122
  * Simple HTML widget for displaying iframe content.
5023
5123
  */
@@ -5039,17 +5139,71 @@ class IFrameWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_3__.Widget {
5039
5139
  }
5040
5140
  }
5041
5141
  }
5142
+ async function showRecreateAppConfirmation(notebookPath) {
5143
+ const result = await (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.showDialog)({
5144
+ title: 'Recreate App',
5145
+ body: 'This will recreate the app from scratch, discarding all your current edits. This action cannot be undone. Are you sure you want to continue?',
5146
+ buttons: [
5147
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Dialog.cancelButton({ label: 'Cancel' }),
5148
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Dialog.warnButton({ label: 'Recreate App' })
5149
+ ],
5150
+ defaultButton: 1
5151
+ });
5152
+ if (result.button.accept) {
5153
+ void (0,_utils__WEBPACK_IMPORTED_MODULE_7__.startStreamlitPreviewAndNotify)(notebookPath, true, undefined, 'Recreating app from scratch...', 'App recreated successfully!');
5154
+ }
5155
+ }
5156
+ /**
5157
+ * Show the update app dropdown.
5158
+ */
5159
+ function showUpdateAppDropdown(buttonElement, notebookPath) {
5160
+ // Remove any existing dropdown
5161
+ const existingDropdown = document.querySelector('.update-app-dropdown');
5162
+ if (existingDropdown) {
5163
+ existingDropdown.remove();
5164
+ }
5165
+ // Create dropdown container
5166
+ const dropdownContainer = document.createElement('div');
5167
+ dropdownContainer.className = 'update-app-dropdown';
5168
+ dropdownContainer.style.position = 'absolute';
5169
+ dropdownContainer.style.zIndex = '1000';
5170
+ // Position the dropdown below the button
5171
+ const buttonRect = buttonElement.getBoundingClientRect();
5172
+ dropdownContainer.style.top = `${buttonRect.bottom + 4}px`;
5173
+ dropdownContainer.style.left = `${buttonRect.left}px`;
5174
+ // Add to document
5175
+ document.body.appendChild(dropdownContainer);
5176
+ // Render the React component
5177
+ (0,react_dom_client__WEBPACK_IMPORTED_MODULE_6__.createRoot)(dropdownContainer).render(react__WEBPACK_IMPORTED_MODULE_5__.createElement(_UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_8__["default"], { onSubmit: async (message) => {
5178
+ await (0,_utils__WEBPACK_IMPORTED_MODULE_7__.startStreamlitPreviewAndNotify)(notebookPath, true, message, 'Updating app...', 'App updated successfully!');
5179
+ dropdownContainer.remove();
5180
+ }, onClose: () => {
5181
+ dropdownContainer.remove();
5182
+ } }));
5183
+ // Close dropdown when clicking outside
5184
+ const handleClickOutside = (event) => {
5185
+ if (!dropdownContainer.contains(event.target) &&
5186
+ !buttonElement.contains(event.target)) {
5187
+ dropdownContainer.remove();
5188
+ document.removeEventListener('mousedown', handleClickOutside);
5189
+ }
5190
+ };
5191
+ // Add click outside listener after a small delay to avoid immediate closure
5192
+ setTimeout(() => {
5193
+ document.addEventListener('mousedown', handleClickOutside);
5194
+ }, 100);
5195
+ }
5042
5196
  /**
5043
5197
  * The streamlit preview plugin.
5044
5198
  */
5045
5199
  const StreamlitPreviewPlugin = {
5046
5200
  id: 'mito-ai:streamlit-preview',
5047
5201
  autoStart: true,
5048
- 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],
5202
+ requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_9__.IAppDeployService, _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_10__.IAppManagerService],
5049
5203
  activate: (app, notebookTracker, palette, appDeployService, appManagerService) => {
5050
5204
  console.log('mito-ai: StreamlitPreviewPlugin activated');
5051
5205
  // Add command to command palette
5052
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
5206
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_11__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
5053
5207
  label: 'Preview as Streamlit',
5054
5208
  caption: 'Convert current notebook to Streamlit app and preview it',
5055
5209
  execute: async () => {
@@ -5058,7 +5212,7 @@ const StreamlitPreviewPlugin = {
5058
5212
  });
5059
5213
  // Add to command palette
5060
5214
  palette.addItem({
5061
- command: _commands__WEBPACK_IMPORTED_MODULE_7__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
5215
+ command: _commands__WEBPACK_IMPORTED_MODULE_11__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
5062
5216
  category: 'Mito AI'
5063
5217
  });
5064
5218
  }
@@ -5076,10 +5230,11 @@ async function previewNotebookAsStreamlit(app, notebookTracker, appDeployService
5076
5230
  await notebookPanel.context.save();
5077
5231
  const notebookPath = notebookPanel.context.path;
5078
5232
  const notebookName = _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_2__.PathExt.basename(notebookPath, '.ipynb');
5079
- let globalNotificationId;
5080
5233
  try {
5081
- const { previewData, notificationId } = await (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath);
5082
- globalNotificationId = notificationId;
5234
+ const previewData = await (0,_utils__WEBPACK_IMPORTED_MODULE_7__.startStreamlitPreviewAndNotify)(notebookPath);
5235
+ if (previewData === undefined) {
5236
+ return;
5237
+ }
5083
5238
  // Create iframe widget
5084
5239
  // TODO: Instead of having this widget creation code in the previewNotebookAsStreamlit function,
5085
5240
  // I wonder if we can make it part of the StreamlitPreviewPlugin. What we want is the following:
@@ -5090,35 +5245,47 @@ async function previewNotebookAsStreamlit(app, notebookTracker, appDeployService
5090
5245
  const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
5091
5246
  widget.title.label = `App Preview (${notebookName})`;
5092
5247
  widget.title.closable = true;
5093
- // Add toolbar button to the MainAreaWidget's toolbar
5094
- const deployButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
5248
+ /* ******************************************************
5249
+ * Create Streamlit App Toolbar Buttons
5250
+ ****************************************************** */
5251
+ const editAppButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
5095
5252
  className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
5096
5253
  onClick: () => {
5097
- void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_9__.deployStreamlitApp)(notebookTracker, appDeployService, appManagerService);
5254
+ showUpdateAppDropdown(editAppButton.node, notebookPath);
5098
5255
  },
5099
- tooltip: 'Deploy Streamlit App',
5100
- label: 'Deploy App',
5101
- icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
5256
+ tooltip: 'Edit Streamlit App',
5257
+ label: 'Edit App',
5258
+ icon: _icons__WEBPACK_IMPORTED_MODULE_12__.EditLabIcon,
5259
+ iconClass: 'mito-ai-deploy-icon'
5260
+ });
5261
+ const recreateAppButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
5262
+ className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
5263
+ onClick: async () => {
5264
+ await showRecreateAppConfirmation(notebookPath);
5265
+ },
5266
+ tooltip: 'Recreate new App from scratch based on the current state of the notebook',
5267
+ label: 'Recreate App',
5268
+ icon: _icons__WEBPACK_IMPORTED_MODULE_12__.ResetCircleLabIcon,
5102
5269
  iconClass: 'mito-ai-deploy-icon'
5103
5270
  });
5104
- // Add toolbar button to the MainAreaWidget's toolbar
5105
- const refreshButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
5271
+ const deployButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
5106
5272
  className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
5107
5273
  onClick: () => {
5108
- void (0,_utils__WEBPACK_IMPORTED_MODULE_8__.startStreamlitPreviewAndNotify)(notebookPath, true);
5274
+ void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_13__.deployStreamlitApp)(notebookTracker, appDeployService, appManagerService);
5109
5275
  },
5110
- tooltip: 'Rebuild Streamlit App',
5111
- label: 'Rebuild App',
5112
- icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
5276
+ tooltip: 'Deploy Streamlit App',
5277
+ label: 'Deploy App',
5278
+ icon: _icons__WEBPACK_IMPORTED_MODULE_12__.DeployLabIcon,
5113
5279
  iconClass: 'mito-ai-deploy-icon'
5114
5280
  });
5115
5281
  // Insert the button into the toolbar
5116
- widget.toolbar.insertAfter('spacer', 'refresh-app-button', refreshButton);
5117
- widget.toolbar.insertAfter('spacer', 'deploy-app-button', deployButton);
5282
+ widget.toolbar.insertAfter('spacer', 'edit-app-button', editAppButton);
5283
+ widget.toolbar.insertAfter('edit-app-button', 'recreate-app-button', recreateAppButton);
5284
+ widget.toolbar.insertAfter('recreate-app-button', 'deploy-app-button', deployButton);
5118
5285
  // Handle widget disposal
5119
5286
  widget.disposed.connect(() => {
5120
5287
  console.log('Widget disposed, stopping preview');
5121
- void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_11__.stopStreamlitPreview)(previewData.id);
5288
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_14__.stopStreamlitPreview)(previewData.id);
5122
5289
  });
5123
5290
  // Add widget to main area with split-right mode
5124
5291
  app.shell.add(widget, 'main', {
@@ -5128,20 +5295,59 @@ async function previewNotebookAsStreamlit(app, notebookTracker, appDeployService
5128
5295
  }
5129
5296
  catch (error) {
5130
5297
  console.error('Error starting streamlit preview:', error);
5131
- // Update notification to error
5132
- if (globalNotificationId) {
5133
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
5134
- id: globalNotificationId,
5135
- message: `Failed to start preview: ${error instanceof Error ? error.message : 'Unknown error'}`,
5136
- type: 'error',
5137
- autoClose: false
5138
- });
5139
- }
5140
5298
  }
5141
5299
  }
5142
5300
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StreamlitPreviewPlugin);
5143
5301
 
5144
5302
 
5303
+ /***/ }),
5304
+
5305
+ /***/ "./lib/Extensions/AppPreview/UpdateAppDropdown.js":
5306
+ /*!********************************************************!*\
5307
+ !*** ./lib/Extensions/AppPreview/UpdateAppDropdown.js ***!
5308
+ \********************************************************/
5309
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
5310
+
5311
+ __webpack_require__.r(__webpack_exports__);
5312
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5313
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
5314
+ /* harmony export */ });
5315
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
5316
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
5317
+ /* harmony import */ var _style_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/EditAppDropdown.css */ "./style/EditAppDropdown.css");
5318
+ /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
5319
+ /*
5320
+ * Copyright (c) Saga Inc.
5321
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
5322
+ */
5323
+
5324
+
5325
+
5326
+ const UpdateAppDropdown = ({ onSubmit, onClose }) => {
5327
+ const [message, setMessage] = react__WEBPACK_IMPORTED_MODULE_0___default().useState('');
5328
+ const handleSubmit = () => {
5329
+ if (message.trim()) {
5330
+ onSubmit(message);
5331
+ onClose();
5332
+ }
5333
+ };
5334
+ const handleKeyDown = (e) => {
5335
+ if (e.key === 'Escape') {
5336
+ onClose();
5337
+ }
5338
+ };
5339
+ const disabled = message.trim() === '';
5340
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "update-app-dropdown", onKeyDown: handleKeyDown },
5341
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "update-app-dropdown-content" },
5342
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { htmlFor: "update-description", className: "update-app-dropdown-label" }, "How would you like to modify the app?"),
5343
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { id: "update-description", value: message, onChange: (e) => setMessage(e.target.value), placeholder: "Describe your changes (e.g., Change the title, Remove a plot, etc.)", className: "update-app-dropdown-textarea", autoFocus: true }),
5344
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "update-app-dropdown-buttons" },
5345
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: onClose, className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_2__.classNames)("update-app-dropdown-button", "update-app-dropdown-button-cancel") }, "Cancel"),
5346
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: handleSubmit, disabled: disabled, className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_2__.classNames)('update-app-dropdown-button', 'update-app-dropdown-button-submit', { 'disabled': disabled }) }, "Submit")))));
5347
+ };
5348
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (UpdateAppDropdown);
5349
+
5350
+
5145
5351
  /***/ }),
5146
5352
 
5147
5353
  /***/ "./lib/Extensions/AppPreview/utils.js":
@@ -5163,17 +5369,29 @@ __webpack_require__.r(__webpack_exports__);
5163
5369
  */
5164
5370
 
5165
5371
 
5166
- const startStreamlitPreviewAndNotify = async (notebookPath, force_recreate = false) => {
5167
- const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit('Building App Preview...', 'in-progress', { autoClose: false });
5168
- const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.startStreamlitPreview)(notebookPath, force_recreate);
5169
- // Update notification to success
5170
- _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
5171
- id: notificationId,
5172
- message: 'Streamlit preview started successfully!',
5173
- type: 'default',
5174
- autoClose: 5 * 1000
5175
- });
5176
- return { previewData, notificationId };
5372
+ const startStreamlitPreviewAndNotify = async (notebookPath, force_recreate = false, edit_prompt = '', start_notification_message = 'Building App Preview...', success_notification_message = 'Streamlit preview started successfully!') => {
5373
+ const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.emit(start_notification_message, 'in-progress', { autoClose: false });
5374
+ try {
5375
+ const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.startStreamlitPreview)(notebookPath, force_recreate, edit_prompt);
5376
+ // Update notification to success
5377
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
5378
+ id: notificationId,
5379
+ message: success_notification_message,
5380
+ type: 'success',
5381
+ autoClose: 5 * 1000
5382
+ });
5383
+ return previewData;
5384
+ }
5385
+ catch (error) {
5386
+ // Display error notification
5387
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Notification.update({
5388
+ id: notificationId,
5389
+ message: "Failed to start app preview: " + String(error),
5390
+ type: 'error',
5391
+ autoClose: 5 * 1000
5392
+ });
5393
+ return undefined;
5394
+ }
5177
5395
  };
5178
5396
 
5179
5397
 
@@ -5820,11 +6038,13 @@ __webpack_require__.r(__webpack_exports__);
5820
6038
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
5821
6039
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
5822
6040
  /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_1__);
5823
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6041
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
5824
6042
  /* harmony import */ var _style_NotebookFooter_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/NotebookFooter.css */ "./style/NotebookFooter.css");
5825
- /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
5826
- /* harmony import */ var _icons_NotebookFooter_CodeIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../icons/NotebookFooter/CodeIcon */ "./lib/icons/NotebookFooter/CodeIcon.js");
5827
- /* harmony import */ var _icons_NotebookFooter_TextIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../icons/NotebookFooter/TextIcon */ "./lib/icons/NotebookFooter/TextIcon.js");
6043
+ /* harmony import */ var _components_LoadingCircle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/LoadingCircle */ "./lib/components/LoadingCircle.js");
6044
+ /* harmony import */ var _icons_NotebookFooter_CodeIcon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../icons/NotebookFooter/CodeIcon */ "./lib/icons/NotebookFooter/CodeIcon.js");
6045
+ /* harmony import */ var _icons_NotebookFooter_TextIcon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../icons/NotebookFooter/TextIcon */ "./lib/icons/NotebookFooter/TextIcon.js");
6046
+ /* harmony import */ var _utils_userSignupEvents__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/userSignupEvents */ "./lib/utils/userSignupEvents.js");
6047
+ /* harmony import */ var _utils_userSignupState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/userSignupState */ "./lib/utils/userSignupState.js");
5828
6048
  /*
5829
6049
  * Copyright (c) Saga Inc.
5830
6050
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -5837,16 +6057,48 @@ __webpack_require__.r(__webpack_exports__);
5837
6057
 
5838
6058
 
5839
6059
 
6060
+
6061
+
5840
6062
  const NotebookFooter = ({ notebookTracker, app }) => {
5841
6063
  var _a;
5842
6064
  const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
5843
6065
  const [inputValue, setInputValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
5844
6066
  const [isGenerating, setIsGenerating] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
6067
+ const [isSignedUp, setIsSignedUp] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);
6068
+ // Function to refresh user signup state using the shared helper
6069
+ const refreshUserSignupState = async () => {
6070
+ const signupState = await (0,_utils_userSignupState__WEBPACK_IMPORTED_MODULE_3__.checkUserSignupState)();
6071
+ setIsSignedUp(signupState.isSignedUp);
6072
+ };
6073
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
6074
+ void refreshUserSignupState();
6075
+ }, []);
6076
+ // Listen for signup success events from other components
6077
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
6078
+ const handleSignupSuccess = () => {
6079
+ void refreshUserSignupState();
6080
+ };
6081
+ _utils_userSignupEvents__WEBPACK_IMPORTED_MODULE_4__.userSignupEvents.signupSuccess.connect(handleSignupSuccess);
6082
+ // Cleanup the event listener when component unmounts
6083
+ return () => {
6084
+ _utils_userSignupEvents__WEBPACK_IMPORTED_MODULE_4__.userSignupEvents.signupSuccess.disconnect(handleSignupSuccess);
6085
+ };
6086
+ }, []);
5845
6087
  // If the notebook is not loaded yet, don't render anything
5846
- // This must come after the useEffects
5847
6088
  if (notebook === undefined || notebook.model === null) {
5848
6089
  return null;
5849
6090
  }
6091
+ const getPlaceholder = () => {
6092
+ if (isGenerating) {
6093
+ return 'Generating notebook...';
6094
+ }
6095
+ else if (isSignedUp) {
6096
+ return 'What analysis can I help you with?';
6097
+ }
6098
+ else {
6099
+ return 'Sign up to use Mito AI (see taskpane on the left)';
6100
+ }
6101
+ };
5850
6102
  const addCell = (cellType = 'code') => {
5851
6103
  if (notebook.widgets.length && notebook.widgets.length > 0) {
5852
6104
  notebook.activeCellIndex = notebook.widgets.length - 1;
@@ -5870,8 +6122,8 @@ const NotebookFooter = ({ notebookTracker, app }) => {
5870
6122
  if (submittedInput !== '') {
5871
6123
  setIsGenerating(true);
5872
6124
  setInputValue('');
5873
- await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_OPEN_CHAT, { focusChatInput: false });
5874
- await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_3__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, { input: submittedInput });
6125
+ await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_5__.COMMAND_MITO_AI_OPEN_CHAT, { focusChatInput: false });
6126
+ await app.commands.execute(_commands__WEBPACK_IMPORTED_MODULE_5__.COMMAND_MITO_AI_SEND_AGENT_MESSAGE, { input: submittedInput });
5875
6127
  setIsGenerating(false);
5876
6128
  }
5877
6129
  };
@@ -5905,20 +6157,20 @@ const NotebookFooter = ({ notebookTracker, app }) => {
5905
6157
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "notebook-footer-container" },
5906
6158
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "input-container" },
5907
6159
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: `input-wrapper ${isGenerating ? 'generating' : ''}` },
5908
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "input-icon-left" }, isGenerating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_4__["default"], null)) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "\u2726"))),
5909
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text", value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, onKeyPress: handleKeyPress, onFocus: handleInputFocus, onBlur: handleInputBlur, placeholder: isGenerating ? 'Generating notebook...' : 'What analysis can I help you with?', className: "prompt-input", autoComplete: "off", spellCheck: false, disabled: isGenerating }),
6160
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "input-icon-left" }, isGenerating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_6__["default"], null)) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "\u2726"))),
6161
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text", value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, onKeyPress: handleKeyPress, onFocus: handleInputFocus, onBlur: handleInputBlur, placeholder: getPlaceholder(), className: "prompt-input", autoComplete: "off", spellCheck: false, disabled: isGenerating || !isSignedUp }),
5910
6162
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "input-icons-right" },
5911
6163
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "input-action-button", onClick: handleInputSubmit, onMouseDown: (e) => e.stopPropagation() }, "\u25B6")))),
5912
6164
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "button-row" },
5913
6165
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => addCell('code'), className: "footer-button", onMouseDown: (e) => e.stopPropagation() },
5914
6166
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "button-content" },
5915
6167
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "button-icon" },
5916
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NotebookFooter_CodeIcon__WEBPACK_IMPORTED_MODULE_5__["default"], null)),
6168
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NotebookFooter_CodeIcon__WEBPACK_IMPORTED_MODULE_7__["default"], null)),
5917
6169
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "button-label" }, "Python"))),
5918
6170
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => addCell('markdown'), className: "footer-button", onMouseDown: (e) => e.stopPropagation() },
5919
6171
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "button-content" },
5920
6172
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "button-icon" },
5921
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NotebookFooter_TextIcon__WEBPACK_IMPORTED_MODULE_6__["default"], null)),
6173
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NotebookFooter_TextIcon__WEBPACK_IMPORTED_MODULE_8__["default"], null)),
5922
6174
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "button-label" }, "Text"))))));
5923
6175
  };
5924
6176
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotebookFooter);
@@ -8229,7 +8481,7 @@ const AttachFileButton = ({ onFileUploaded, notebookTracker }) => {
8229
8481
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { position: 'relative' } },
8230
8482
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: fileInputRef, type: "file", style: { display: 'none' }, onChange: handleFileSelect, accept: "*" }),
8231
8483
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_3__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_PaperClipIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null), title: isUploading ? 'Uploading...' : 'Attach File', onClick: handleClick, className: 'icon-button-hover', disabled: isUploading, style: {
8232
- opacity: isUploading ? 0.5 : 1,
8484
+ ...(isUploading && { opacity: 0.5 }),
8233
8485
  cursor: isUploading ? 'not-allowed' : 'pointer'
8234
8486
  } })));
8235
8487
  };
@@ -9403,8 +9655,10 @@ __webpack_require__.r(__webpack_exports__);
9403
9655
  /* harmony export */ AppBuilderExcludeCellLabIcon: () => (/* binding */ AppBuilderExcludeCellLabIcon),
9404
9656
  /* harmony export */ AppBuilderIncludeCellLabIcon: () => (/* binding */ AppBuilderIncludeCellLabIcon),
9405
9657
  /* harmony export */ DeployLabIcon: () => (/* binding */ DeployLabIcon),
9658
+ /* harmony export */ EditLabIcon: () => (/* binding */ EditLabIcon),
9406
9659
  /* harmony export */ NucleusLabIcon: () => (/* binding */ NucleusLabIcon),
9407
9660
  /* harmony export */ OpenIndicatorLabIcon: () => (/* binding */ OpenIndicatorLabIcon),
9661
+ /* harmony export */ ResetCircleLabIcon: () => (/* binding */ ResetCircleLabIcon),
9408
9662
  /* harmony export */ lightBulbLabIcon: () => (/* binding */ lightBulbLabIcon)
9409
9663
  /* harmony export */ });
9410
9664
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
@@ -9415,6 +9669,8 @@ __webpack_require__.r(__webpack_exports__);
9415
9669
  /* harmony import */ var _src_icons_AppBuilderExcludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/icons/AppBuilderExcludeCellIcon.svg */ "./src/icons/AppBuilderExcludeCellIcon.svg");
9416
9670
  /* harmony import */ var _src_icons_AppBuilderIncludeCellIcon_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/icons/AppBuilderIncludeCellIcon.svg */ "./src/icons/AppBuilderIncludeCellIcon.svg");
9417
9671
  /* harmony import */ var _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/icons/App/DeployIcon.svg */ "./src/icons/App/DeployIcon.svg");
9672
+ /* harmony import */ var _src_icons_PencilIcon_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/icons/PencilIcon.svg */ "./src/icons/PencilIcon.svg");
9673
+ /* harmony import */ var _src_icons_ResetCircleIcon_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/icons/ResetCircleIcon.svg */ "./src/icons/ResetCircleIcon.svg");
9418
9674
  /*
9419
9675
  * Copyright (c) Saga Inc.
9420
9676
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -9426,6 +9682,8 @@ __webpack_require__.r(__webpack_exports__);
9426
9682
 
9427
9683
 
9428
9684
 
9685
+
9686
+
9429
9687
  const lightBulbLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
9430
9688
  name: 'lightbulb-icon',
9431
9689
  svgstr: _src_icons_LightbulbIcon_svg__WEBPACK_IMPORTED_MODULE_1__
@@ -9450,6 +9708,14 @@ const DeployLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__
9450
9708
  name: 'deploy-icon',
9451
9709
  svgstr: _src_icons_App_DeployIcon_svg__WEBPACK_IMPORTED_MODULE_6__
9452
9710
  });
9711
+ const EditLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
9712
+ name: 'edit-icon',
9713
+ svgstr: _src_icons_PencilIcon_svg__WEBPACK_IMPORTED_MODULE_7__
9714
+ });
9715
+ const ResetCircleLabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({
9716
+ name: 'reset-circle-icon',
9717
+ svgstr: _src_icons_ResetCircleIcon_svg__WEBPACK_IMPORTED_MODULE_8__
9718
+ });
9453
9719
 
9454
9720
 
9455
9721
  /***/ }),
@@ -9520,12 +9786,16 @@ __webpack_require__.r(__webpack_exports__);
9520
9786
 
9521
9787
  __webpack_require__.r(__webpack_exports__);
9522
9788
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9789
+ /* harmony export */ getChatHistoryThread: () => (/* binding */ getChatHistoryThread),
9790
+ /* harmony export */ getChatHistoryThreads: () => (/* binding */ getChatHistoryThreads),
9523
9791
  /* harmony export */ getDatabaseConnections: () => (/* binding */ getDatabaseConnections),
9524
9792
  /* harmony export */ getRule: () => (/* binding */ getRule),
9525
9793
  /* harmony export */ getRules: () => (/* binding */ getRules),
9526
9794
  /* harmony export */ getSetting: () => (/* binding */ getSetting),
9795
+ /* harmony export */ getUserKey: () => (/* binding */ getUserKey),
9527
9796
  /* harmony export */ logEvent: () => (/* binding */ logEvent),
9528
9797
  /* harmony export */ setRule: () => (/* binding */ setRule),
9798
+ /* harmony export */ setUserKey: () => (/* binding */ setUserKey),
9529
9799
  /* harmony export */ startStreamlitPreview: () => (/* binding */ startStreamlitPreview),
9530
9800
  /* harmony export */ stopStreamlitPreview: () => (/* binding */ stopStreamlitPreview),
9531
9801
  /* harmony export */ updateSettings: () => (/* binding */ updateSettings)
@@ -9535,6 +9805,7 @@ __webpack_require__.r(__webpack_exports__);
9535
9805
  * Copyright (c) Saga Inc.
9536
9806
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
9537
9807
  */
9808
+
9538
9809
  /************************************
9539
9810
 
9540
9811
  LOG ENDPOINTS
@@ -9557,7 +9828,6 @@ const logEvent = async (logEvent, params) => {
9557
9828
  SETTINGS ENDPOINTS
9558
9829
 
9559
9830
  ************************************/
9560
-
9561
9831
  const getSetting = async (settingsKey) => {
9562
9832
  var _a;
9563
9833
  const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`settings/${settingsKey}`);
@@ -9623,10 +9893,14 @@ const getDatabaseConnections = async () => {
9623
9893
  STREAMLIT PREVIEW ENDPOINTS
9624
9894
 
9625
9895
  ************************************/
9626
- const startStreamlitPreview = async (notebookPath, force_recreate = false) => {
9896
+ const startStreamlitPreview = async (notebookPath, force_recreate = false, edit_prompt = '') => {
9627
9897
  const response = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('streamlit-preview', {
9628
9898
  method: 'POST',
9629
- body: JSON.stringify({ notebook_path: notebookPath, force_recreate: force_recreate }),
9899
+ body: JSON.stringify({
9900
+ notebook_path: notebookPath,
9901
+ force_recreate: force_recreate,
9902
+ edit_prompt: edit_prompt
9903
+ })
9630
9904
  });
9631
9905
  if (response.error) {
9632
9906
  throw new Error(response.error.message);
@@ -9641,6 +9915,44 @@ const stopStreamlitPreview = async (previewId) => {
9641
9915
  throw new Error(response.error.message);
9642
9916
  }
9643
9917
  };
9918
+ /************************************
9919
+
9920
+ USER ENDPOINTS
9921
+
9922
+ ************************************/
9923
+ const getUserKey = async (key) => {
9924
+ var _a;
9925
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`user/${key}`);
9926
+ if (resp.error) {
9927
+ throw new Error(resp.error.message);
9928
+ }
9929
+ return (_a = resp.data) === null || _a === void 0 ? void 0 : _a.value;
9930
+ };
9931
+ const setUserKey = async (key, value) => {
9932
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`user/${key}`, {
9933
+ method: 'PUT',
9934
+ body: JSON.stringify({ value: value }),
9935
+ });
9936
+ if (resp.error) {
9937
+ throw new Error(resp.error.message);
9938
+ }
9939
+ return resp.data || '';
9940
+ };
9941
+ const getChatHistoryThreads = async () => {
9942
+ var _a;
9943
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('chat-history/threads');
9944
+ if (resp.error) {
9945
+ throw new Error(resp.error.message);
9946
+ }
9947
+ return ((_a = resp.data) === null || _a === void 0 ? void 0 : _a.threads) || [];
9948
+ };
9949
+ const getChatHistoryThread = async (threadId) => {
9950
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`chat-history/threads/${threadId}`);
9951
+ if (resp.error) {
9952
+ throw new Error(resp.error.message);
9953
+ }
9954
+ return resp.data;
9955
+ };
9644
9956
 
9645
9957
 
9646
9958
  /***/ }),
@@ -11306,6 +11618,117 @@ const isElectronBasedFrontend = () => {
11306
11618
  };
11307
11619
 
11308
11620
 
11621
+ /***/ }),
11622
+
11623
+ /***/ "./lib/utils/userSignupEvents.js":
11624
+ /*!***************************************!*\
11625
+ !*** ./lib/utils/userSignupEvents.js ***!
11626
+ \***************************************/
11627
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11628
+
11629
+ __webpack_require__.r(__webpack_exports__);
11630
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11631
+ /* harmony export */ userSignupEvents: () => (/* binding */ userSignupEvents)
11632
+ /* harmony export */ });
11633
+ /* harmony import */ var _lumino_signaling__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lumino/signaling */ "webpack/sharing/consume/default/@lumino/signaling");
11634
+ /* harmony import */ var _lumino_signaling__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lumino_signaling__WEBPACK_IMPORTED_MODULE_0__);
11635
+ /*
11636
+ * Copyright (c) Saga Inc.
11637
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11638
+ */
11639
+
11640
+ /**
11641
+ * Event emitter for user signup events
11642
+ */
11643
+ class UserSignupEventEmitter {
11644
+ constructor() {
11645
+ this._signupSuccess = new _lumino_signaling__WEBPACK_IMPORTED_MODULE_0__.Signal(this);
11646
+ }
11647
+ /**
11648
+ * Signal emitted when a user successfully signs up
11649
+ */
11650
+ get signupSuccess() {
11651
+ return this._signupSuccess;
11652
+ }
11653
+ /**
11654
+ * Emit a signup success event
11655
+ */
11656
+ emitSignupSuccess() {
11657
+ this._signupSuccess.emit();
11658
+ }
11659
+ }
11660
+ // Create a singleton instance
11661
+ const userSignupEvents = new UserSignupEventEmitter();
11662
+
11663
+
11664
+ /***/ }),
11665
+
11666
+ /***/ "./lib/utils/userSignupState.js":
11667
+ /*!**************************************!*\
11668
+ !*** ./lib/utils/userSignupState.js ***!
11669
+ \**************************************/
11670
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11671
+
11672
+ __webpack_require__.r(__webpack_exports__);
11673
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11674
+ /* harmony export */ checkUserSignupState: () => (/* binding */ checkUserSignupState)
11675
+ /* harmony export */ });
11676
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
11677
+ /*
11678
+ * Copyright (c) Saga Inc.
11679
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11680
+ */
11681
+
11682
+ /**
11683
+ * Determines if a user should be considered "signed up" based on:
11684
+ * 1. Having an email address, OR
11685
+ * 2. Having existing chat history threads
11686
+ *
11687
+ * This ensures consistent behavior across all components that need to check
11688
+ * if a user should have access to Mito AI features.
11689
+ */
11690
+ const checkUserSignupState = async () => {
11691
+ try {
11692
+ // Check if user has an email address
11693
+ const userEmail = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_0__.getUserKey)('user_email');
11694
+ const hasEmail = userEmail !== "" && userEmail !== undefined;
11695
+ if (hasEmail) {
11696
+ return {
11697
+ isSignedUp: true,
11698
+ hasEmail: true,
11699
+ hasChatHistory: false
11700
+ };
11701
+ }
11702
+ // Check for existing chat history threads
11703
+ const chatThreads = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_0__.getChatHistoryThreads)();
11704
+ const hasThreads = chatThreads.length > 0;
11705
+ if (!hasThreads) {
11706
+ return {
11707
+ isSignedUp: false,
11708
+ hasEmail: false,
11709
+ hasChatHistory: false
11710
+ };
11711
+ }
11712
+ // Verify the first thread has actual content (not just default empty thread)
11713
+ const firstThread = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_0__.getChatHistoryThread)(chatThreads[0].thread_id);
11714
+ const hasActualChatHistory = firstThread.display_history.length > 0;
11715
+ return {
11716
+ isSignedUp: hasActualChatHistory,
11717
+ hasEmail: false,
11718
+ hasChatHistory: hasActualChatHistory
11719
+ };
11720
+ }
11721
+ catch (error) {
11722
+ console.error('Failed to check user signup state:', error);
11723
+ return {
11724
+ isSignedUp: false,
11725
+ hasEmail: false,
11726
+ hasChatHistory: false
11727
+ };
11728
+ }
11729
+ };
11730
+
11731
+
11309
11732
  /***/ }),
11310
11733
 
11311
11734
  /***/ "./lib/utils/version_check.js":
@@ -13320,7 +13743,21 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
13320
13743
 
13321
13744
  .cta-carousel-button {
13322
13745
  margin-top: 8px;
13323
- }`, "",{"version":3,"sources":["webpack://./style/CTACarousel.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;AACrB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;IACnB,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,oCAAoC;AACxC;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,yCAAyC;IACzC,eAAe;IACf,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,eAAe;AACnB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.cta-carousel {\n width: 100%;\n}\n\n.cta-carousel-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n}\n\n.cta-message {\n display: block;\n text-align: center;\n font-size: 14px;\n color: var(--jp-ui-font-color3);\n margin-bottom: 15px;\n flex: 1;\n line-height: 1.3;\n min-height: 2.5em;\n padding: 0 8px;\n opacity: 1;\n transition: opacity 0.5s ease-in-out;\n}\n\n.cta-carousel-dots {\n display: flex;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.cta-carousel-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: var(--jp-layout-color3);\n cursor: pointer;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.cta-carousel-dot.active {\n background-color: var(--purple-500);\n}\n\n.cta-carousel-button {\n margin-top: 8px;\n}"],"sourceRoot":""}]);
13746
+ }
13747
+
13748
+ .cta-logo-container {
13749
+ margin: 0 auto 8px;
13750
+ display: block;
13751
+ text-align: center;
13752
+ }
13753
+
13754
+ .cta-title {
13755
+ display: block;
13756
+ text-align: center;
13757
+ font-weight: bold;
13758
+ font-size: 20px;
13759
+ margin-bottom: 15px;
13760
+ }`, "",{"version":3,"sources":["webpack://./style/CTACarousel.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;AACrB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;IACnB,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,oCAAoC;AACxC;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,yCAAyC;IACzC,eAAe;IACf,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,cAAc;IACd,kBAAkB;AACtB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,mBAAmB;AACvB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.cta-carousel {\n width: 100%;\n}\n\n.cta-carousel-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n}\n\n.cta-message {\n display: block;\n text-align: center;\n font-size: 14px;\n color: var(--jp-ui-font-color3);\n margin-bottom: 15px;\n flex: 1;\n line-height: 1.3;\n min-height: 2.5em;\n padding: 0 8px;\n opacity: 1;\n transition: opacity 0.5s ease-in-out;\n}\n\n.cta-carousel-dots {\n display: flex;\n justify-content: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.cta-carousel-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: var(--jp-layout-color3);\n cursor: pointer;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.cta-carousel-dot.active {\n background-color: var(--purple-500);\n}\n\n.cta-carousel-button {\n margin-top: 8px;\n}\n\n.cta-logo-container {\n margin: 0 auto 8px;\n display: block;\n text-align: center;\n}\n\n.cta-title {\n display: block;\n text-align: center;\n font-weight: bold;\n font-size: 20px;\n margin-bottom: 15px;\n}"],"sourceRoot":""}]);
13324
13761
  // Exports
13325
13762
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
13326
13763
 
@@ -13814,6 +14251,17 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
13814
14251
  container-type: inline-size;
13815
14252
  }
13816
14253
 
14254
+ .chat-taskpane.disabled button:not(.signup-form-container):not(.signup-form-container *):not(.chat-taskpane-header-left):not(.chat-taskpane-header-left *) {
14255
+ opacity: 0.5;
14256
+ pointer-events: none;
14257
+ }
14258
+
14259
+ .chat-taskpane.disabled textarea:not(.signup-form-container):not(.signup-form-container *) {
14260
+ opacity: 0.5;
14261
+ pointer-events: none;
14262
+ cursor: not-allowed;
14263
+ }
14264
+
13817
14265
  .suggestions-container {
13818
14266
  max-width: 600px;
13819
14267
  margin: 0 auto;
@@ -14006,7 +14454,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14006
14454
  display: none;
14007
14455
  }
14008
14456
  }
14009
- `, "",{"version":3,"sources":["webpack://./style/ChatTaskpane.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,yDAAyD;EACzD,6BAA6B;EAC7B,WAAW;EACX,sBAAsB;EACtB,kBAAkB;EAClB;;;;KAIG;EACH,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;EACnB,oBAAoB;EACpB;;;;GAIC;EACD,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,aAAa;EACb,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,mBAAmB;EACnB,iBAAiB;EACjB,mBAAmB;EACnB,gBAAgB;EAChB,2BAA2B;EAC3B,MAAM;EACN,sCAAsC;EACtC,8CAA8C;EAC9C,kDAAkD;EAClD,UAAU;EACV,wCAAwC;AAC1C;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,OAAO;EACP,gBAAgB;EAChB,oBAAoB;EACpB,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,mBAAmB;EACnB,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,8BAA8B;EAC9B,aAAa;EACb,gCAAgC;EAChC,2BAA2B;EAC3B,iBAAiB;EACjB,kBAAkB;EAClB,cAAc,EAAE,qDAAqD;AACvE;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,cAAc;AAChB;;AAEA,+CAA+C;AAC/C;EACE;IACE,aAAa;EACf;AACF;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,mBAAmB;EACnB,2BAA2B;AAC7B;AACA;EACE,oBAAoB;AACtB;AACA;EACE,mCAAmC;EACnC,wBAAwB;EACxB,iBAAiB;AACnB;;AAEA;EACE,mCAAmC;EACnC,6CAA6C;AAC/C;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,kBAAkB;EAClB,mBAAmB;EACnB,QAAQ;EACR,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,WAAW;AACb;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,WAAW;EACX,UAAU;AACZ;;AAEA,yCAAyC;AACzC;EACE,aAAa;EACb,iBAAiB;EACjB,gBAAgB;EAChB,QAAQ;EACR,oBAAoB;EACpB,aAAa;EACb,sCAAsC;EACtC,iCAAiC;EACjC,mEAAmE;EACnE,oBAAoB;EACpB,sBAAsB;EACtB,4BAA4B;EAC5B,8BAA8B;AAChC;;AAEA,0CAA0C;AAC1C;EACE,yCAAyC;EACzC,+BAA+B;EAC/B,yCAAyC;EACzC,mBAAmB;EACnB,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,6CAA6C;EAC7C,cAAc;EACd,kCAAkC;EAClC,mBAAmB;EACnB,kBAAkB;EAClB,4CAA4C;EAC5C,gBAAgB;EAChB,6BAA6B;EAC7B,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;AACzB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA,iFAAiF;AACjF;EACE;IACE,aAAa;EACf;AACF","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-taskpane {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--chat-background-color) !important;\n --jp-sidebar-min-width: 350px;\n width: 100%;\n box-sizing: border-box;\n overflow-y: hidden;\n /* \n Don't set padding on top from the taskpane so we can instead\n set the padding on the chat-taskpane-header instead to make \n sure the sticky header covers all of the content behind it. \n */\n padding-top: 0px;\n padding-left: 10px;\n padding-right: 10px;\n padding-bottom: 10px;\n /*\n 'container-type: inline-size' enables container queries on this element.\n This allows child elements to use @container rules to react to the width of .chat-taskpane,\n rather than the viewport.\n */\n container-type: inline-size;\n}\n\n.suggestions-container {\n max-width: 600px;\n margin: 0 auto;\n display: flex;\n justify-content: flex-start;\n}\n\n.chat-taskpane-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-top: 10px;\n padding-bottom: 5px;\n position: sticky;\n /* Make the header sticky */\n top: 0;\n /* Stick to the top of the container */\n background-color: var(--chat-background-color);\n /* Ensure background color covers content behind */\n z-index: 1;\n /* Ensure it stays above other content */\n}\n\n.chat-taskpane-header-left {\n display: flex;\n gap: 8px;\n}\n\n.chat-taskpane-header-right {\n display: flex;\n gap: 8px;\n}\n\n.chat-taskpane-header-title {\n font-size: 14px;\n font-weight: bold;\n margin: 0;\n}\n\n.chat-taskpane-header-buttons {\n display: flex;\n gap: 8px;\n}\n\n.chat-messages {\n flex: 1;\n overflow-y: auto;\n padding-bottom: 10px;\n display: flex;\n flex-direction: column;\n}\n\n.chat-empty-message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: auto;\n min-height: 200px;\n max-height: 100%;\n text-align: center;\n color: var(--muted-text-color);\n padding: 20px;\n /* Add container query support */\n container-type: inline-size;\n user-select: none;\n overflow-y: hidden;\n margin: auto 0; /* This centers it vertically in the flex container */\n}\n\n.chat-empty-message .long-message {\n font-size: 16px;\n line-height: 1.5;\n max-width: 80%;\n margin: 0 auto;\n}\n\n/* Use container query instead of media query */\n@container (max-width: 300px) {\n .chat-empty-message .long-message {\n display: none;\n }\n}\n\n.chat-loading-message {\n margin-top: 20px;\n margin-bottom: 20px;\n}\n\n.chat-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.chat-controls-left {\n display: flex;\n gap: 4px;\n align-items: center;\n justify-content: flex-start;\n}\n.chat-controls-left > * {\n margin: 0 !important;\n}\n.submit-button {\n background-color: var(--purple-400);\n color: var(--purple-700);\n padding: 2px 10px;\n}\n\n.submit-button:hover {\n background-color: var(--purple-500);\n transition: background-color 0.2s ease-in-out;\n}\n\n.stop-agent-button {\n margin-top: 8px;\n}\n\n.stop-agent-button-content {\n display: flex;\n text-align: center;\n align-items: center;\n gap: 8px;\n justify-content: center;\n}\n\n.agent-controls {\n display: flex;\n gap: 8px;\n width: 100%;\n}\n\n.agent-start-button {\n flex: 1;\n}\n\n.agent-cancel-button {\n width: 32px;\n padding: 0;\n}\n\n/* Add suggestion box container styling */\n.chat-suggestions {\n display: flex;\n flex-wrap: nowrap;\n overflow-x: auto;\n gap: 8px;\n padding-bottom: 16px;\n margin: 8px 0;\n /* smooth scrolling on touch devices */\n -webkit-overflow-scrolling: touch;\n /* Mask properties will be applied dynamically through JavaScript */\n mask-size: 100% 100%;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-repeat: no-repeat;\n}\n\n/* Add individual suggestion box styling */\n.suggestion-box {\n background-color: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 16px;\n padding: 6px 12px;\n font-size: 14px;\n cursor: pointer;\n transition: background-color 0.2s ease-in-out;\n flex-shrink: 0;\n /* wrap text onto multiple lines */\n white-space: normal;\n text-align: center;\n /* limit width for wrapping into two lines */\n max-width: 140px;\n /* align content vertically */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.suggestion-box:hover {\n background-color: var(--jp-border-color2);\n}\n\n/* Hide the 'Submit' text in the submit button when the chat-taskpane is narrow */\n@container (max-width: 350px) {\n .submit-button .submit-text {\n display: none;\n }\n}\n"],"sourceRoot":""}]);
14457
+ `, "",{"version":3,"sources":["webpack://./style/ChatTaskpane.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,yDAAyD;EACzD,6BAA6B;EAC7B,WAAW;EACX,sBAAsB;EACtB,kBAAkB;EAClB;;;;KAIG;EACH,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;EACnB,oBAAoB;EACpB;;;;GAIC;EACD,2BAA2B;AAC7B;;AAEA;EACE,YAAY;EACZ,oBAAoB;AACtB;;AAEA;EACE,YAAY;EACZ,oBAAoB;EACpB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,aAAa;EACb,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,mBAAmB;EACnB,iBAAiB;EACjB,mBAAmB;EACnB,gBAAgB;EAChB,2BAA2B;EAC3B,MAAM;EACN,sCAAsC;EACtC,8CAA8C;EAC9C,kDAAkD;EAClD,UAAU;EACV,wCAAwC;AAC1C;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,OAAO;EACP,gBAAgB;EAChB,oBAAoB;EACpB,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,mBAAmB;EACnB,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,8BAA8B;EAC9B,aAAa;EACb,gCAAgC;EAChC,2BAA2B;EAC3B,iBAAiB;EACjB,kBAAkB;EAClB,cAAc,EAAE,qDAAqD;AACvE;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,cAAc;AAChB;;AAEA,+CAA+C;AAC/C;EACE;IACE,aAAa;EACf;AACF;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;AACrB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,mBAAmB;EACnB,2BAA2B;AAC7B;AACA;EACE,oBAAoB;AACtB;AACA;EACE,mCAAmC;EACnC,wBAAwB;EACxB,iBAAiB;AACnB;;AAEA;EACE,mCAAmC;EACnC,6CAA6C;AAC/C;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,kBAAkB;EAClB,mBAAmB;EACnB,QAAQ;EACR,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,WAAW;AACb;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,WAAW;EACX,UAAU;AACZ;;AAEA,yCAAyC;AACzC;EACE,aAAa;EACb,iBAAiB;EACjB,gBAAgB;EAChB,QAAQ;EACR,oBAAoB;EACpB,aAAa;EACb,sCAAsC;EACtC,iCAAiC;EACjC,mEAAmE;EACnE,oBAAoB;EACpB,sBAAsB;EACtB,4BAA4B;EAC5B,8BAA8B;AAChC;;AAEA,0CAA0C;AAC1C;EACE,yCAAyC;EACzC,+BAA+B;EAC/B,yCAAyC;EACzC,mBAAmB;EACnB,iBAAiB;EACjB,eAAe;EACf,eAAe;EACf,6CAA6C;EAC7C,cAAc;EACd,kCAAkC;EAClC,mBAAmB;EACnB,kBAAkB;EAClB,4CAA4C;EAC5C,gBAAgB;EAChB,6BAA6B;EAC7B,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;AACzB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA,iFAAiF;AACjF;EACE;IACE,aAAa;EACf;AACF","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-taskpane {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--chat-background-color) !important;\n --jp-sidebar-min-width: 350px;\n width: 100%;\n box-sizing: border-box;\n overflow-y: hidden;\n /* \n Don't set padding on top from the taskpane so we can instead\n set the padding on the chat-taskpane-header instead to make \n sure the sticky header covers all of the content behind it. \n */\n padding-top: 0px;\n padding-left: 10px;\n padding-right: 10px;\n padding-bottom: 10px;\n /*\n 'container-type: inline-size' enables container queries on this element.\n This allows child elements to use @container rules to react to the width of .chat-taskpane,\n rather than the viewport.\n */\n container-type: inline-size;\n}\n\n.chat-taskpane.disabled button:not(.signup-form-container):not(.signup-form-container *):not(.chat-taskpane-header-left):not(.chat-taskpane-header-left *) {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.chat-taskpane.disabled textarea:not(.signup-form-container):not(.signup-form-container *) {\n opacity: 0.5;\n pointer-events: none;\n cursor: not-allowed;\n}\n\n.suggestions-container {\n max-width: 600px;\n margin: 0 auto;\n display: flex;\n justify-content: flex-start;\n}\n\n.chat-taskpane-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-top: 10px;\n padding-bottom: 5px;\n position: sticky;\n /* Make the header sticky */\n top: 0;\n /* Stick to the top of the container */\n background-color: var(--chat-background-color);\n /* Ensure background color covers content behind */\n z-index: 1;\n /* Ensure it stays above other content */\n}\n\n.chat-taskpane-header-left {\n display: flex;\n gap: 8px;\n}\n\n.chat-taskpane-header-right {\n display: flex;\n gap: 8px;\n}\n\n.chat-taskpane-header-title {\n font-size: 14px;\n font-weight: bold;\n margin: 0;\n}\n\n.chat-taskpane-header-buttons {\n display: flex;\n gap: 8px;\n}\n\n.chat-messages {\n flex: 1;\n overflow-y: auto;\n padding-bottom: 10px;\n display: flex;\n flex-direction: column;\n}\n\n.chat-empty-message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: auto;\n min-height: 200px;\n max-height: 100%;\n text-align: center;\n color: var(--muted-text-color);\n padding: 20px;\n /* Add container query support */\n container-type: inline-size;\n user-select: none;\n overflow-y: hidden;\n margin: auto 0; /* This centers it vertically in the flex container */\n}\n\n.chat-empty-message .long-message {\n font-size: 16px;\n line-height: 1.5;\n max-width: 80%;\n margin: 0 auto;\n}\n\n/* Use container query instead of media query */\n@container (max-width: 300px) {\n .chat-empty-message .long-message {\n display: none;\n }\n}\n\n.chat-loading-message {\n margin-top: 20px;\n margin-bottom: 20px;\n}\n\n.chat-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.chat-controls-left {\n display: flex;\n gap: 4px;\n align-items: center;\n justify-content: flex-start;\n}\n.chat-controls-left > * {\n margin: 0 !important;\n}\n.submit-button {\n background-color: var(--purple-400);\n color: var(--purple-700);\n padding: 2px 10px;\n}\n\n.submit-button:hover {\n background-color: var(--purple-500);\n transition: background-color 0.2s ease-in-out;\n}\n\n.stop-agent-button {\n margin-top: 8px;\n}\n\n.stop-agent-button-content {\n display: flex;\n text-align: center;\n align-items: center;\n gap: 8px;\n justify-content: center;\n}\n\n.agent-controls {\n display: flex;\n gap: 8px;\n width: 100%;\n}\n\n.agent-start-button {\n flex: 1;\n}\n\n.agent-cancel-button {\n width: 32px;\n padding: 0;\n}\n\n/* Add suggestion box container styling */\n.chat-suggestions {\n display: flex;\n flex-wrap: nowrap;\n overflow-x: auto;\n gap: 8px;\n padding-bottom: 16px;\n margin: 8px 0;\n /* smooth scrolling on touch devices */\n -webkit-overflow-scrolling: touch;\n /* Mask properties will be applied dynamically through JavaScript */\n mask-size: 100% 100%;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-repeat: no-repeat;\n}\n\n/* Add individual suggestion box styling */\n.suggestion-box {\n background-color: var(--jp-layout-color1);\n color: var(--jp-ui-font-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 16px;\n padding: 6px 12px;\n font-size: 14px;\n cursor: pointer;\n transition: background-color 0.2s ease-in-out;\n flex-shrink: 0;\n /* wrap text onto multiple lines */\n white-space: normal;\n text-align: center;\n /* limit width for wrapping into two lines */\n max-width: 140px;\n /* align content vertically */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.suggestion-box:hover {\n background-color: var(--jp-border-color2);\n}\n\n/* Hide the 'Submit' text in the submit button when the chat-taskpane is narrow */\n@container (max-width: 350px) {\n .submit-button .submit-text {\n display: none;\n }\n}\n"],"sourceRoot":""}]);
14010
14458
  // Exports
14011
14459
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
14012
14460
 
@@ -14702,10 +15150,115 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14702
15150
 
14703
15151
  /***/ }),
14704
15152
 
14705
- /***/ "./node_modules/css-loader/dist/cjs.js!./style/ErrorFixupToolUI.css":
14706
- /*!**************************************************************************!*\
14707
- !*** ./node_modules/css-loader/dist/cjs.js!./style/ErrorFixupToolUI.css ***!
14708
- \**************************************************************************/
15153
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/EditAppDropdown.css":
15154
+ /*!*************************************************************************!*\
15155
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/EditAppDropdown.css ***!
15156
+ \*************************************************************************/
15157
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
15158
+
15159
+ __webpack_require__.r(__webpack_exports__);
15160
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15161
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15162
+ /* harmony export */ });
15163
+ /* 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");
15164
+ /* 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__);
15165
+ /* 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");
15166
+ /* 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__);
15167
+ // Imports
15168
+
15169
+
15170
+ 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()));
15171
+ // Module
15172
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15173
+ * Copyright (c) Saga Inc.
15174
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
15175
+ */
15176
+
15177
+ /* UpdateAppDropdown Styles */
15178
+
15179
+ .update-app-dropdown {
15180
+ position: absolute;
15181
+ top: 100%;
15182
+ left: 0;
15183
+ z-index: 1000;
15184
+ background-color: var(--jp-layout-color1);
15185
+ border: 1px solid var(--jp-border-color1);
15186
+ border-radius: 3px;
15187
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
15188
+ min-width: 300px;
15189
+ max-width: 500px;
15190
+ }
15191
+
15192
+ .update-app-dropdown-content {
15193
+ padding: 12px;
15194
+ }
15195
+
15196
+ .update-app-dropdown-label {
15197
+ display: block;
15198
+ margin-bottom: 8px;
15199
+ font-weight: 500;
15200
+ color: var(--jp-ui-font-color1);
15201
+ font-size: var(--jp-ui-font-size1);
15202
+ }
15203
+
15204
+ .update-app-dropdown-textarea {
15205
+ width: 100%;
15206
+ min-height: 100px;
15207
+ padding: 8px;
15208
+ border: 1px solid var(--jp-border-color1);
15209
+ border-radius: 3px;
15210
+ font-family: var(--jp-ui-font-family);
15211
+ font-size: var(--jp-ui-font-size1);
15212
+ resize: vertical;
15213
+ box-sizing: border-box;
15214
+ background-color: var(--jp-input-background);
15215
+ color: var(--jp-ui-font-color1);
15216
+ }
15217
+
15218
+ .update-app-dropdown-buttons {
15219
+ display: flex;
15220
+ justify-content: flex-end;
15221
+ gap: 8px;
15222
+ margin-top: 12px;
15223
+ }
15224
+
15225
+ .update-app-dropdown-button {
15226
+ padding: 4px 8px;
15227
+ border: none;
15228
+ border-radius: 3px;
15229
+ cursor: pointer;
15230
+ font-family: var(--jp-ui-font-family);
15231
+ font-size: var(--jp-ui-font-size0);
15232
+ }
15233
+
15234
+ .update-app-dropdown-button-cancel {
15235
+ background-color: var(--jp-layout-color2);
15236
+ color: var(--jp-ui-font-color1);
15237
+ }
15238
+
15239
+ .update-app-dropdown-button-submit {
15240
+
15241
+ background-color: var(--purple-300);
15242
+ color: var(--purple-700);
15243
+ cursor: pointer;
15244
+ }
15245
+
15246
+ .update-app-dropdown-button-submit.disabled {
15247
+ background-color: var(--jp-layout-color2);
15248
+ color: var(--jp-ui-font-color2);
15249
+ cursor: not-allowed;
15250
+ }
15251
+ `, "",{"version":3,"sources":["webpack://./style/EditAppDropdown.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,6BAA6B;;AAE7B;IACI,kBAAkB;IAClB,SAAS;IACT,OAAO;IACP,aAAa;IACb,yCAAyC;IACzC,yCAAyC;IACzC,kBAAkB;IAClB,yCAAyC;IACzC,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,gBAAgB;IAChB,+BAA+B;IAC/B,kCAAkC;AACtC;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,YAAY;IACZ,yCAAyC;IACzC,kBAAkB;IAClB,qCAAqC;IACrC,kCAAkC;IAClC,gBAAgB;IAChB,sBAAsB;IACtB,4CAA4C;IAC5C,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,yBAAyB;IACzB,QAAQ;IACR,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,qCAAqC;IACrC,kCAAkC;AACtC;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;AACnC;;AAEA;;IAEI,mCAAmC;IACnC,wBAAwB;IACxB,eAAe;AACnB;;AAEA;IACI,yCAAyC;IACzC,+BAA+B;IAC/B,mBAAmB;AACvB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* UpdateAppDropdown Styles */\n\n.update-app-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-border-color1);\n border-radius: 3px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n min-width: 300px;\n max-width: 500px;\n}\n\n.update-app-dropdown-content {\n padding: 12px;\n}\n\n.update-app-dropdown-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--jp-ui-font-color1);\n font-size: var(--jp-ui-font-size1);\n}\n\n.update-app-dropdown-textarea {\n width: 100%;\n min-height: 100px;\n padding: 8px;\n border: 1px solid var(--jp-border-color1);\n border-radius: 3px;\n font-family: var(--jp-ui-font-family);\n font-size: var(--jp-ui-font-size1);\n resize: vertical;\n box-sizing: border-box;\n background-color: var(--jp-input-background);\n color: var(--jp-ui-font-color1);\n}\n\n.update-app-dropdown-buttons {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 12px;\n}\n\n.update-app-dropdown-button {\n padding: 4px 8px;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-family: var(--jp-ui-font-family);\n font-size: var(--jp-ui-font-size0);\n}\n\n.update-app-dropdown-button-cancel {\n background-color: var(--jp-layout-color2);\n color: var(--jp-ui-font-color1);\n}\n\n.update-app-dropdown-button-submit {\n \n background-color: var(--purple-300);\n color: var(--purple-700);\n cursor: pointer;\n}\n\n.update-app-dropdown-button-submit.disabled {\n background-color: var(--jp-layout-color2);\n color: var(--jp-ui-font-color2);\n cursor: not-allowed;\n}\n"],"sourceRoot":""}]);
15252
+ // Exports
15253
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15254
+
15255
+
15256
+ /***/ }),
15257
+
15258
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/ErrorFixupToolUI.css":
15259
+ /*!**************************************************************************!*\
15260
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/ErrorFixupToolUI.css ***!
15261
+ \**************************************************************************/
14709
15262
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
14710
15263
 
14711
15264
  __webpack_require__.r(__webpack_exports__);
@@ -16389,6 +16942,107 @@ a {
16389
16942
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
16390
16943
 
16391
16944
 
16945
+ /***/ }),
16946
+
16947
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/SignUpForm.css":
16948
+ /*!********************************************************************!*\
16949
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/SignUpForm.css ***!
16950
+ \********************************************************************/
16951
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
16952
+
16953
+ __webpack_require__.r(__webpack_exports__);
16954
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16955
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
16956
+ /* harmony export */ });
16957
+ /* 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");
16958
+ /* 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__);
16959
+ /* 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");
16960
+ /* 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__);
16961
+ // Imports
16962
+
16963
+
16964
+ 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()));
16965
+ // Module
16966
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
16967
+ * Copyright (c) Saga Inc.
16968
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
16969
+ */
16970
+
16971
+ .signup-form-header {
16972
+ display: block;
16973
+ text-align: center;
16974
+ font-weight: bold;
16975
+ font-size: 20px;
16976
+ margin-bottom: 15px;
16977
+ color: var(--jp-ui-font-color0);
16978
+ }
16979
+
16980
+ .signup-form-header-logo {
16981
+ margin: 0 auto 8px;
16982
+ display: block;
16983
+ text-align: center;
16984
+ }
16985
+
16986
+ .signup-form-message {
16987
+ font-size: 14px;
16988
+ color: var(--jp-ui-font-color1);
16989
+ }
16990
+
16991
+ /* Form container to control layout */
16992
+ .signup-form-container form {
16993
+ display: flex;
16994
+ flex-wrap: wrap;
16995
+ gap: 8px;
16996
+ align-items: flex-start;
16997
+ }
16998
+
16999
+ .signup-form-input {
17000
+ padding: 8px 12px;
17001
+ border: 1px solid var(--jp-border-color1);
17002
+ border-radius: var(--jp-border-radius);
17003
+ flex: 2;
17004
+ min-width: 200px;
17005
+ margin-bottom: 0;
17006
+ height: 36px;
17007
+ box-sizing: border-box;
17008
+ }
17009
+
17010
+ .signup-form-input:focus {
17011
+ border-color: var(--purple-600);
17012
+ outline: none;
17013
+ }
17014
+
17015
+ .signup-form-button {
17016
+ height: 36px;
17017
+ box-sizing: border-box;
17018
+ background-color: var(--purple-700);
17019
+ color: white;
17020
+ flex: 1;
17021
+ }
17022
+
17023
+ .signup-form-button:hover {
17024
+ background-color: var(--purple-600);
17025
+ }
17026
+
17027
+ /* When the form wraps, make button full width */
17028
+ @media (max-width: 300px) {
17029
+ .signup-form-container form {
17030
+ flex-direction: column;
17031
+ }
17032
+
17033
+ .signup-form-input {
17034
+ width: 100%;
17035
+ min-width: unset;
17036
+ }
17037
+
17038
+ .signup-form-button {
17039
+ width: 100%;
17040
+ }
17041
+ }`, "",{"version":3,"sources":["webpack://./style/SignUpForm.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,mBAAmB;IACnB,+BAA+B;AACnC;;AAEA;IACI,kBAAkB;IAClB,cAAc;IACd,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,+BAA+B;AACnC;;AAEA,qCAAqC;AACrC;IACI,aAAa;IACb,eAAe;IACf,QAAQ;IACR,uBAAuB;AAC3B;;AAEA;IACI,iBAAiB;IACjB,yCAAyC;IACzC,sCAAsC;IACtC,OAAO;IACP,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,sBAAsB;AAC1B;;AAEA;IACI,+BAA+B;IAC/B,aAAa;AACjB;;AAEA;IACI,YAAY;IACZ,sBAAsB;IACtB,mCAAmC;IACnC,YAAY;IACZ,OAAO;AACX;;AAEA;IACI,mCAAmC;AACvC;;AAEA,gDAAgD;AAChD;IACI;QACI,sBAAsB;IAC1B;;IAEA;QACI,WAAW;QACX,gBAAgB;IACpB;;IAEA;QACI,WAAW;IACf;AACJ","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.signup-form-header {\n display: block;\n text-align: center;\n font-weight: bold;\n font-size: 20px;\n margin-bottom: 15px;\n color: var(--jp-ui-font-color0);\n}\n\n.signup-form-header-logo {\n margin: 0 auto 8px;\n display: block;\n text-align: center;\n}\n\n.signup-form-message {\n font-size: 14px;\n color: var(--jp-ui-font-color1);\n}\n\n/* Form container to control layout */\n.signup-form-container form {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: flex-start;\n}\n\n.signup-form-input {\n padding: 8px 12px;\n border: 1px solid var(--jp-border-color1);\n border-radius: var(--jp-border-radius);\n flex: 2;\n min-width: 200px;\n margin-bottom: 0;\n height: 36px;\n box-sizing: border-box;\n}\n\n.signup-form-input:focus {\n border-color: var(--purple-600);\n outline: none;\n}\n\n.signup-form-button {\n height: 36px;\n box-sizing: border-box;\n background-color: var(--purple-700);\n color: white;\n flex: 1;\n}\n\n.signup-form-button:hover {\n background-color: var(--purple-600);\n}\n\n/* When the form wraps, make button full width */\n@media (max-width: 300px) {\n .signup-form-container form {\n flex-direction: column;\n }\n \n .signup-form-input {\n width: 100%;\n min-width: unset;\n }\n \n .signup-form-button {\n width: 100%;\n }\n}"],"sourceRoot":""}]);
17042
+ // Exports
17043
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
17044
+
17045
+
16392
17046
  /***/ }),
16393
17047
 
16394
17048
  /***/ "./node_modules/css-loader/dist/cjs.js!./style/StreamlitPreviewPlugin.css":
@@ -16797,6 +17451,26 @@ module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" viewBox=
16797
17451
 
16798
17452
  /***/ }),
16799
17453
 
17454
+ /***/ "./src/icons/PencilIcon.svg":
17455
+ /*!**********************************!*\
17456
+ !*** ./src/icons/PencilIcon.svg ***!
17457
+ \**********************************/
17458
+ /***/ ((module) => {
17459
+
17460
+ module.exports = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill='currentColor'>\n <path d=\"M9.88308 1.82456C9.68326 1.49798 9.43085 1.18192 9.1259 0.876387C8.8209 0.570854 8.5054 0.317998 8.18991 0.117862C7.88492 -0.0717913 7.48531 -0.0296413 7.22238 0.223215L1.15425 6.29155C1.12269 6.32317 1.10167 6.35476 1.08065 6.39691L0.0289843 9.38893C-0.0341088 9.55749 0.00796491 9.73662 0.134151 9.86302C0.218298 9.94732 0.333977 10 0.449651 10C0.502235 10 0.554818 9.98947 0.596894 9.97894L3.58363 8.92541C3.6257 8.91488 3.65723 8.88326 3.6888 8.85168L9.76744 2.78325C10.0304 2.51987 10.0724 2.13008 9.88311 1.82454L9.88308 1.82456ZM1.56439 6.80777C1.86938 6.98685 2.18488 7.2397 2.47934 7.53471C2.77382 7.82972 3.01568 8.14578 3.19449 8.45128L1.46976 9.06235C1.41717 8.957 1.34357 8.85164 1.25942 8.76734C1.16476 8.67252 1.0701 8.60931 0.964937 8.55664L1.56439 6.80777Z\" />\n </g>\n</svg>";
17461
+
17462
+ /***/ }),
17463
+
17464
+ /***/ "./src/icons/ResetCircleIcon.svg":
17465
+ /*!***************************************!*\
17466
+ !*** ./src/icons/ResetCircleIcon.svg ***!
17467
+ \***************************************/
17468
+ /***/ ((module) => {
17469
+
17470
+ module.exports = "<svg width=\"33\" height=\"33\" viewBox=\"0 0 33 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"currentColor\">\n <path d=\"M27.8204 5.193C24.7983 2.1709 20.7805 0.506836 16.5068 0.506836C7.78625 0.506836 0.506836 7.78625 0.506836 16.5068C0.506836 25.2274 7.78625 32.5068 16.5068 32.5068C25.2274 32.5068 32.5068 25.2274 32.5068 16.5068C32.5068 12.2332 30.8426 8.2151 27.8207 5.19329L27.8204 5.193ZM23.627 21.5962L21.7553 17.7403L23.4737 16.9062L24.3955 18.8053L24.4401 18.6209C24.608 17.9267 24.6932 17.2155 24.6932 16.5068C24.6932 11.6336 20.7854 7.66893 15.9819 7.66893C11.1788 7.66893 7.27066 11.6336 7.27066 16.5068C7.27066 21.3572 11.1414 25.3073 15.9137 25.3444V27.2546C10.0885 27.217 5.36066 22.41 5.36066 16.5067C5.36066 10.5804 10.1253 5.75855 15.9819 5.75855C21.8385 5.75855 26.6032 10.5801 26.6032 16.5067C26.6032 17.2903 26.5175 18.0775 26.3484 18.8468L26.315 18.999L27.9027 18.0676L28.8693 19.7151L24.9693 22.003C24.3869 22.4896 23.6689 21.9597 23.6268 21.5962L23.627 21.5962Z\"/>\n </g>\n</svg>\n";
17471
+
17472
+ /***/ }),
17473
+
16800
17474
  /***/ "./style/AgentComponentHeader.css":
16801
17475
  /*!****************************************!*\
16802
17476
  !*** ./style/AgentComponentHeader.css ***!
@@ -17659,6 +18333,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
17659
18333
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_DropdownMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_DropdownMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_DropdownMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
17660
18334
 
17661
18335
 
18336
+ /***/ }),
18337
+
18338
+ /***/ "./style/EditAppDropdown.css":
18339
+ /*!***********************************!*\
18340
+ !*** ./style/EditAppDropdown.css ***!
18341
+ \***********************************/
18342
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18343
+
18344
+ __webpack_require__.r(__webpack_exports__);
18345
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18346
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
18347
+ /* harmony export */ });
18348
+ /* 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");
18349
+ /* 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__);
18350
+ /* 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");
18351
+ /* 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__);
18352
+ /* 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");
18353
+ /* 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__);
18354
+ /* 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");
18355
+ /* 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__);
18356
+ /* 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");
18357
+ /* 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__);
18358
+ /* 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");
18359
+ /* 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__);
18360
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./EditAppDropdown.css */ "./node_modules/css-loader/dist/cjs.js!./style/EditAppDropdown.css");
18361
+
18362
+
18363
+
18364
+
18365
+
18366
+
18367
+
18368
+
18369
+
18370
+
18371
+
18372
+ var options = {};
18373
+
18374
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
18375
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
18376
+
18377
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
18378
+
18379
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
18380
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
18381
+
18382
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
18383
+
18384
+
18385
+
18386
+
18387
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_EditAppDropdown_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
18388
+
18389
+
17662
18390
  /***/ }),
17663
18391
 
17664
18392
  /***/ "./style/ErrorFixupToolUI.css":
@@ -18415,6 +19143,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
18415
19143
  /* 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);
18416
19144
 
18417
19145
 
19146
+ /***/ }),
19147
+
19148
+ /***/ "./style/SignUpForm.css":
19149
+ /*!******************************!*\
19150
+ !*** ./style/SignUpForm.css ***!
19151
+ \******************************/
19152
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19153
+
19154
+ __webpack_require__.r(__webpack_exports__);
19155
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19156
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
19157
+ /* harmony export */ });
19158
+ /* 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");
19159
+ /* 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__);
19160
+ /* 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");
19161
+ /* 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__);
19162
+ /* 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");
19163
+ /* 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__);
19164
+ /* 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");
19165
+ /* 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__);
19166
+ /* 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");
19167
+ /* 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__);
19168
+ /* 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");
19169
+ /* 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__);
19170
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_SignUpForm_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./SignUpForm.css */ "./node_modules/css-loader/dist/cjs.js!./style/SignUpForm.css");
19171
+
19172
+
19173
+
19174
+
19175
+
19176
+
19177
+
19178
+
19179
+
19180
+
19181
+
19182
+ var options = {};
19183
+
19184
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
19185
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
19186
+
19187
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
19188
+
19189
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
19190
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
19191
+
19192
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_SignUpForm_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
19193
+
19194
+
19195
+
19196
+
19197
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_SignUpForm_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_SignUpForm_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_SignUpForm_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
19198
+
19199
+
18418
19200
  /***/ }),
18419
19201
 
18420
19202
  /***/ "./style/StreamlitPreviewPlugin.css":
@@ -18688,4 +19470,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
18688
19470
  /***/ })
18689
19471
 
18690
19472
  }]);
18691
- //# sourceMappingURL=lib_index_js.0c3368195d954d2ed033.js.map
19473
+ //# sourceMappingURL=lib_index_js.20f12766ecd3d430568e.js.map