mito-ai 0.1.52__py3-none-any.whl → 0.1.54__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 (47) hide show
  1. mito_ai/_version.py +1 -1
  2. mito_ai/anthropic_client.py +4 -3
  3. mito_ai/completions/models.py +1 -1
  4. mito_ai/completions/prompt_builders/agent_system_message.py +10 -7
  5. mito_ai/streamlit_conversion/prompts/streamlit_app_creation_prompt.py +18 -2
  6. mito_ai/streamlit_conversion/streamlit_agent_handler.py +12 -12
  7. mito_ai/streamlit_preview/handlers.py +13 -6
  8. mito_ai/streamlit_preview/manager.py +4 -1
  9. mito_ai/streamlit_preview/utils.py +4 -4
  10. mito_ai/tests/streamlit_conversion/test_streamlit_agent_handler.py +7 -7
  11. mito_ai/tests/streamlit_preview/test_streamlit_preview_handler.py +4 -3
  12. mito_ai/utils/anthropic_utils.py +28 -3
  13. mito_ai/utils/tokens.py +29 -0
  14. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  15. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/package.json +4 -4
  16. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +3 -3
  17. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.5ec1e525d244fc8588cf.js → mito_ai-0.1.54.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.31462f8f6a76b1cefbeb.js +575 -104
  18. mito_ai-0.1.54.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.31462f8f6a76b1cefbeb.js.map +1 -0
  19. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.89927e1d3b5962d57ae3.js → mito_ai-0.1.54.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.3f3c98eaba66bf084c66.js +3 -3
  20. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.89927e1d3b5962d57ae3.js.map → mito_ai-0.1.54.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.3f3c98eaba66bf084c66.js.map +1 -1
  21. {mito_ai-0.1.52.dist-info → mito_ai-0.1.54.dist-info}/METADATA +1 -1
  22. {mito_ai-0.1.52.dist-info → mito_ai-0.1.54.dist-info}/RECORD +46 -45
  23. {mito_ai-0.1.52.dist-info → mito_ai-0.1.54.dist-info}/WHEEL +1 -1
  24. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.5ec1e525d244fc8588cf.js.map +0 -1
  25. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  26. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  27. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  28. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  29. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  30. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  31. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  32. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  33. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  34. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  35. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  36. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  37. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  38. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  39. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  40. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  41. {mito_ai-0.1.52.data → mito_ai-0.1.54.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
  42. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  43. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  44. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  45. {mito_ai-0.1.52.data → mito_ai-0.1.54.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  46. {mito_ai-0.1.52.dist-info → mito_ai-0.1.54.dist-info}/entry_points.txt +0 -0
  47. {mito_ai-0.1.52.dist-info → mito_ai-0.1.54.dist-info}/licenses/LICENSE +0 -0
@@ -3740,7 +3740,7 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
3740
3740
  break;
3741
3741
  }
3742
3742
  // TODO: If we created a validated type in the agent response validation function, then we woulnd't need to do these checks
3743
- if (agentResponse.type === 'edit_streamlit_app' && (agentResponse.edit_streamlit_app_prompt === undefined || agentResponse.edit_streamlit_app_prompt === null)) {
3743
+ if (agentResponse.type === 'edit_streamlit_app' && (agentResponse.streamlit_app_prompt === undefined || agentResponse.streamlit_app_prompt === null)) {
3744
3744
  await markAgentForStopping();
3745
3745
  isAgentFinished = true;
3746
3746
  break;
@@ -3785,12 +3785,13 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
3785
3785
  }
3786
3786
  if (agentResponse.type === 'create_streamlit_app') {
3787
3787
  // Create new preview using the service
3788
- const streamlitPreviewResponse = await streamlitPreviewManager.openAppPreview(app, agentTargetNotebookPanelRef.current);
3788
+ const createStreamlitAppPrompt = agentResponse.streamlit_app_prompt || '';
3789
+ const streamlitPreviewResponse = await streamlitPreviewManager.openAppPreview(app, agentTargetNotebookPanelRef.current, createStreamlitAppPrompt);
3789
3790
  if (streamlitPreviewResponse.type === 'error') {
3790
3791
  messageToShareWithAgent = streamlitPreviewResponse.message;
3791
3792
  }
3792
3793
  }
3793
- if (agentResponse.type === 'edit_streamlit_app' && agentResponse.edit_streamlit_app_prompt) {
3794
+ if (agentResponse.type === 'edit_streamlit_app' && agentResponse.streamlit_app_prompt) {
3794
3795
  // Ensure there is an active preview to edit
3795
3796
  let streamlitPreviewResponse = await streamlitPreviewManager.openAppPreview(app, agentTargetNotebookPanelRef.current);
3796
3797
  if (streamlitPreviewResponse.type === 'error') {
@@ -3798,7 +3799,7 @@ const useAgentExecution = ({ notebookTracker, app, streamlitPreviewManager, webs
3798
3799
  continue;
3799
3800
  }
3800
3801
  // Edit the existing preview
3801
- streamlitPreviewResponse = await streamlitPreviewManager.editExistingPreview(agentResponse.edit_streamlit_app_prompt, agentTargetNotebookPanelRef.current);
3802
+ streamlitPreviewResponse = await streamlitPreviewManager.editExistingPreview(agentResponse.streamlit_app_prompt, agentTargetNotebookPanelRef.current);
3802
3803
  if (streamlitPreviewResponse.type === 'error') {
3803
3804
  messageToShareWithAgent = streamlitPreviewResponse.message;
3804
3805
  }
@@ -4959,9 +4960,9 @@ function validateAndCorrectAgentResponse(agentResponse) {
4959
4960
  // No empty strings in the assumptions
4960
4961
  correctedResponse.analysis_assumptions = (_a = correctedResponse.analysis_assumptions) === null || _a === void 0 ? void 0 : _a.filter(assumption => assumption.trim() !== '');
4961
4962
  }
4962
- // Correct edit_streamlit_app_prompt - ensure it's a string when present
4963
- const editStreamlitAppPromptType = typeof correctedResponse.edit_streamlit_app_prompt;
4964
- correctedResponse.edit_streamlit_app_prompt = editStreamlitAppPromptType === 'string' ? correctedResponse.edit_streamlit_app_prompt : undefined;
4963
+ // Correct streamlit_app_prompt - ensure it's a string when present
4964
+ const editStreamlitAppPromptType = typeof correctedResponse.streamlit_app_prompt;
4965
+ correctedResponse.streamlit_app_prompt = editStreamlitAppPromptType === 'string' ? correctedResponse.streamlit_app_prompt : undefined;
4965
4966
  // For now we don't validate the cell_update object itself, as this is more complex and has
4966
4967
  // not caused issues thus far.
4967
4968
  return correctedResponse;
@@ -5998,9 +5999,11 @@ __webpack_require__.r(__webpack_exports__);
5998
5999
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
5999
6000
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
6000
6001
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__);
6001
- /* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
6002
- /* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
6002
+ /* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
6003
+ /* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
6004
+ /* harmony import */ var _AppDeploy_authPopupUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppDeploy/authPopupUtils */ "./lib/Extensions/AppDeploy/authPopupUtils.js");
6003
6005
  /* harmony import */ var _style_AppsList_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AppsList.css */ "./style/AppsList.css");
6006
+ /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
6004
6007
  /*
6005
6008
  * Copyright (c) Saga Inc.
6006
6009
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6011,48 +6014,46 @@ __webpack_require__.r(__webpack_exports__);
6011
6014
 
6012
6015
 
6013
6016
 
6017
+
6018
+
6014
6019
  const AppsList = ({ appManagerService }) => {
6015
6020
  const [apps, setApps] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);
6016
6021
  const [loading, setLoading] = react__WEBPACK_IMPORTED_MODULE_0__.useState(true);
6017
6022
  const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);
6018
- // Fetch apps on component mount
6019
- react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
6020
- const loadApps = async () => {
6021
- try {
6022
- console.log('[AppsList] Starting to load apps...');
6023
- setLoading(true);
6024
- setError(null);
6025
- console.log('[AppsList] Calling fetchUserApps...');
6026
- const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.fetchUserApps)(appManagerService);
6027
- console.log('[AppsList] fetchUserApps response:', response);
6028
- if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.isGetAppsSuccess)(response)) {
6029
- setApps(response.apps);
6030
- }
6031
- else {
6032
- setError(response.errorMessage || 'Failed to load apps');
6033
- setApps([]);
6034
- }
6023
+ const refreshApps = async () => {
6024
+ try {
6025
+ console.log('[AppsList] Refreshing apps...');
6026
+ setLoading(true);
6027
+ setError(null);
6028
+ const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__.fetchUserApps)(appManagerService);
6029
+ console.log('[AppsList] fetchUserApps response:', response);
6030
+ if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__.isGetAppsSuccess)(response)) {
6031
+ setApps(response.apps);
6035
6032
  }
6036
- catch (err) {
6037
- console.error('[AppsList] Error loading apps:', err);
6038
- setError(err instanceof Error ? err.message : 'An unexpected error occurred');
6033
+ else {
6034
+ setError(response.errorMessage || 'Failed to load apps');
6039
6035
  setApps([]);
6040
6036
  }
6041
- finally {
6042
- setLoading(false);
6043
- }
6044
- };
6045
- console.log('[AppsList] Component mounted, calling loadApps...');
6046
- void loadApps();
6047
- }, [appManagerService]);
6048
- const refreshApps = async () => {
6049
- const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.fetchUserApps)(appManagerService);
6050
- if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.isGetAppsSuccess)(response)) {
6051
- setApps(response.apps);
6052
- setError(null);
6053
6037
  }
6054
- else {
6055
- setError(response.errorMessage || 'Failed to refresh apps');
6038
+ catch (err) {
6039
+ console.error('[AppsList] Error loading apps:', err);
6040
+ setError(err instanceof Error ? err.message : 'An unexpected error occurred');
6041
+ setApps([]);
6042
+ }
6043
+ finally {
6044
+ setLoading(false);
6045
+ }
6046
+ };
6047
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
6048
+ void refreshApps();
6049
+ }, []);
6050
+ const handleLogin = async () => {
6051
+ try {
6052
+ await (0,_AppDeploy_authPopupUtils__WEBPACK_IMPORTED_MODULE_5__.showAuthenticationPopup)();
6053
+ await refreshApps();
6054
+ }
6055
+ catch (err) {
6056
+ console.warn('[AppsList] Login popup closed or failed:', err);
6056
6057
  }
6057
6058
  };
6058
6059
  const copyToClipboard = async (url, appName) => {
@@ -6093,15 +6094,26 @@ const AppsList = ({ appManagerService }) => {
6093
6094
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("h3", { className: "apps-list-title" }, "Your Apps"),
6094
6095
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-actions" },
6095
6096
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, disabled: loading, className: "apps-list-button", title: "Refresh apps" }, loading ? 'Loading...' : 'Refresh'),
6096
- react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => {
6097
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: async () => {
6097
6098
  console.log('Logout clicked');
6098
- void (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
6099
+ try {
6100
+ await (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_6__.logoutAndClearJWTTokens)();
6101
+ }
6102
+ catch (err) {
6103
+ console.error('[AppsList] Error during logout:', err);
6104
+ }
6105
+ finally {
6106
+ await refreshApps();
6107
+ }
6099
6108
  }, className: "apps-list-button", title: "Logout" }, "Logout"))),
6100
- loading ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-loading" }, "Loading apps...")) : error ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error" },
6101
- "Error: ",
6102
- error,
6103
- react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error-actions" },
6104
- react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, className: "apps-list-button primary" }, "Try Again")))) : apps.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-empty" }, "No apps deployed yet")) : (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", null, apps.map((app) => (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { key: app.name, className: "app-item" },
6109
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-content" }, loading ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-loading" }, "Loading apps...")) : error ? (error === 'User not authenticated' ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-auth-message" },
6110
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-auth-text" }, "User not authenticated"),
6111
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: handleLogin, className: "button-base button-purple apps-list-auth-login-button" }, "Login"))) : (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error" },
6112
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,
6113
+ "Error: ",
6114
+ error,
6115
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error-actions" },
6116
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, className: "apps-list-button primary" }, "Try Again")))))) : apps.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-empty" }, "No apps deployed yet")) : (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", null, apps.map((app) => (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { key: app.name, className: "app-item" },
6105
6117
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-header" },
6106
6118
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-content" },
6107
6119
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-name" }, app.name),
@@ -6114,7 +6126,7 @@ const AppsList = ({ appManagerService }) => {
6114
6126
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url-container" },
6115
6127
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url" }, app.url),
6116
6128
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => copyToClipboard(app.url, app.name), className: "app-item-copy-button", title: `Copy URL for ${app.name}` },
6117
- react__WEBPACK_IMPORTED_MODULE_0__.createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.copyIcon.react, { width: "14px", height: "14px", fill: "var(--jp-ui-font-color2)" }))))))))));
6129
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.copyIcon.react, { width: "14px", height: "14px", fill: "var(--jp-ui-font-color2)" })))))))))));
6118
6130
  };
6119
6131
 
6120
6132
 
@@ -6331,6 +6343,112 @@ const ManageAppsPlugin = {
6331
6343
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ManageAppsPlugin);
6332
6344
 
6333
6345
 
6346
+ /***/ }),
6347
+
6348
+ /***/ "./lib/Extensions/AppPreview/PlaceholderWidget.js":
6349
+ /*!********************************************************!*\
6350
+ !*** ./lib/Extensions/AppPreview/PlaceholderWidget.js ***!
6351
+ \********************************************************/
6352
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6353
+
6354
+ __webpack_require__.r(__webpack_exports__);
6355
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6356
+ /* harmony export */ PlaceholderWidget: () => (/* binding */ PlaceholderWidget)
6357
+ /* harmony export */ });
6358
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lumino/widgets */ "webpack/sharing/consume/default/@lumino/widgets");
6359
+ /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_0__);
6360
+ /*
6361
+ * Copyright (c) Saga Inc.
6362
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
6363
+ */
6364
+
6365
+ /**
6366
+ * Simple placeholder widget for loading state.
6367
+ */
6368
+ class PlaceholderWidget extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_0__.Widget {
6369
+ constructor() {
6370
+ var _a, _b;
6371
+ super();
6372
+ this.addClass('jp-placeholder-widget');
6373
+ const container = document.createElement('div');
6374
+ container.style.display = 'flex';
6375
+ container.style.flexDirection = 'column';
6376
+ container.style.alignItems = 'center';
6377
+ container.style.justifyContent = 'center';
6378
+ container.style.height = '100%';
6379
+ container.style.width = '100%';
6380
+ container.style.padding = '40px 20px';
6381
+ container.style.textAlign = 'center';
6382
+ const emojiContainer = document.createElement('div');
6383
+ emojiContainer.style.fontSize = '64px';
6384
+ emojiContainer.style.minHeight = '80px';
6385
+ emojiContainer.style.display = 'flex';
6386
+ emojiContainer.style.alignItems = 'center';
6387
+ emojiContainer.style.justifyContent = 'center';
6388
+ emojiContainer.style.marginBottom = '24px';
6389
+ emojiContainer.style.transition = 'opacity 0.3s ease-in-out';
6390
+ const emojis = ['🚧', '🧱', '🏗️', '🔨', '🔧', '⚙️', '🛠️', '🔩', '📐'];
6391
+ let currentEmojiIndex = 0;
6392
+ emojiContainer.textContent = (_a = emojis[currentEmojiIndex]) !== null && _a !== void 0 ? _a : '';
6393
+ const emojiInterval = setInterval(() => {
6394
+ emojiContainer.style.opacity = '0';
6395
+ setTimeout(() => {
6396
+ var _a;
6397
+ currentEmojiIndex = (currentEmojiIndex + 1) % emojis.length;
6398
+ emojiContainer.textContent = (_a = emojis[currentEmojiIndex]) !== null && _a !== void 0 ? _a : '';
6399
+ emojiContainer.style.opacity = '1';
6400
+ }, 150);
6401
+ }, 2000);
6402
+ const message = document.createElement('div');
6403
+ message.textContent = 'Building your app. This might take a couple of minutes.';
6404
+ message.style.fontSize = '16px';
6405
+ message.style.fontWeight = '500';
6406
+ message.style.color = 'var(--jp-content-font-color1)';
6407
+ message.style.marginBottom = '12px';
6408
+ message.style.textAlign = 'center';
6409
+ message.style.lineHeight = '1.5';
6410
+ const statusMessages = [
6411
+ 'Starting build...',
6412
+ 'Processing cells...',
6413
+ 'Analyzing notebook structure...',
6414
+ 'Converting to Streamlit format...',
6415
+ 'Configuring app components...',
6416
+ 'Evaluating Streamlit Apps...',
6417
+ 'Initializing server...',
6418
+ 'Almost there...',
6419
+ 'Finalizing your app...',
6420
+ 'Preparing preview...'
6421
+ ];
6422
+ const statusMessage = document.createElement('div');
6423
+ let currentStatusIndex = 0;
6424
+ statusMessage.textContent = (_b = statusMessages[currentStatusIndex]) !== null && _b !== void 0 ? _b : '';
6425
+ statusMessage.style.fontSize = '13px';
6426
+ statusMessage.style.color = 'var(--jp-content-font-color3)';
6427
+ statusMessage.style.textAlign = 'center';
6428
+ statusMessage.style.lineHeight = '1.4';
6429
+ statusMessage.style.transition = 'opacity 0.2s ease-in-out';
6430
+ const statusInterval = setInterval(() => {
6431
+ statusMessage.style.opacity = '0';
6432
+ setTimeout(() => {
6433
+ var _a;
6434
+ currentStatusIndex = (currentStatusIndex + 1) % statusMessages.length;
6435
+ statusMessage.textContent = (_a = statusMessages[currentStatusIndex]) !== null && _a !== void 0 ? _a : '';
6436
+ statusMessage.style.opacity = '1';
6437
+ }, 200);
6438
+ }, 20000);
6439
+ // Clean up intervals when widget is disposed
6440
+ this.disposed.connect(() => {
6441
+ clearInterval(emojiInterval);
6442
+ clearInterval(statusInterval);
6443
+ });
6444
+ container.appendChild(emojiContainer);
6445
+ container.appendChild(message);
6446
+ container.appendChild(statusMessage);
6447
+ this.node.appendChild(container);
6448
+ }
6449
+ }
6450
+
6451
+
6334
6452
  /***/ }),
6335
6453
 
6336
6454
  /***/ "./lib/Extensions/AppPreview/StreamlitPreviewPlugin.js":
@@ -6352,16 +6470,17 @@ __webpack_require__.r(__webpack_exports__);
6352
6470
  /* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_2__);
6353
6471
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
6354
6472
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__);
6355
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
6356
- /* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
6357
- /* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
6358
- /* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
6359
- /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6360
- /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
6473
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
6474
+ /* harmony import */ var _AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../AppDeploy/DeployStreamlitApp */ "./lib/Extensions/AppDeploy/DeployStreamlitApp.js");
6475
+ /* harmony import */ var _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../AppDeploy/AppDeployPlugin */ "./lib/Extensions/AppDeploy/AppDeployPlugin.js");
6476
+ /* harmony import */ var _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
6477
+ /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../commands */ "./lib/commands.js");
6478
+ /* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../icons */ "./lib/icons/index.js");
6361
6479
  /* harmony import */ var _style_StreamlitPreviewPlugin_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/StreamlitPreviewPlugin.css */ "./style/StreamlitPreviewPlugin.css");
6362
6480
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AppPreview/utils.js");
6363
- /* harmony import */ var _UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./UpdateAppDropdown */ "./lib/Extensions/AppPreview/UpdateAppDropdown.js");
6364
- /* harmony import */ var _utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/notebookMetadata */ "./lib/utils/notebookMetadata.js");
6481
+ /* harmony import */ var _UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./UpdateAppDropdown */ "./lib/Extensions/AppPreview/UpdateAppDropdown.js");
6482
+ /* harmony import */ var _utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../utils/notebookMetadata */ "./lib/utils/notebookMetadata.js");
6483
+ /* harmony import */ var _PlaceholderWidget__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PlaceholderWidget */ "./lib/Extensions/AppPreview/PlaceholderWidget.js");
6365
6484
  /*
6366
6485
  * Copyright (c) Saga Inc.
6367
6486
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6381,6 +6500,7 @@ __webpack_require__.r(__webpack_exports__);
6381
6500
 
6382
6501
 
6383
6502
 
6503
+
6384
6504
  /**
6385
6505
  * The token for the StreamlitPreview service.
6386
6506
  */
@@ -6419,16 +6539,33 @@ class StreamlitAppPreviewManager {
6419
6539
  /**
6420
6540
  * Create a new Streamlit app preview, replacing any existing preview.
6421
6541
  */
6422
- async openAppPreview(app, notebookPanel) {
6542
+ async openAppPreview(app, notebookPanel, createStreamlitAppPrompt = '') {
6423
6543
  // If the user has a different app open, we first close that one
6424
6544
  if (!this.isCurrentPreivewForCurrentNotebook(notebookPanel)) {
6425
6545
  this.closeCurrentPreview();
6426
6546
  }
6547
+ // Create and show placeholder panel immediately
6548
+ let placeholderWidget = null;
6549
+ if (!this.isCurrentPreivewForCurrentNotebook(notebookPanel)) {
6550
+ const placeholderContent = new _PlaceholderWidget__WEBPACK_IMPORTED_MODULE_5__.PlaceholderWidget();
6551
+ placeholderWidget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: placeholderContent });
6552
+ placeholderWidget.title.label = (0,_utils__WEBPACK_IMPORTED_MODULE_6__.getAppPreviewNameFromNotebookPanel)(notebookPanel);
6553
+ placeholderWidget.title.closable = true;
6554
+ // Add placeholder to main area with split-right mode
6555
+ app.shell.add(placeholderWidget, 'main', {
6556
+ mode: 'split-right',
6557
+ ref: notebookPanel.id
6558
+ });
6559
+ }
6427
6560
  // First save the notebook to ensure the app is up to date
6428
6561
  await notebookPanel.context.save();
6429
6562
  const notebookPath = notebookPanel.context.path;
6430
- const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_5__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6431
- const streamlitPreviewResponse = await (0,_utils__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreviewAndNotify)(notebookPath, notebookID);
6563
+ const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_7__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6564
+ const streamlitPreviewResponse = await (0,_utils__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreviewAndNotify)(notebookPath, notebookID, false, createStreamlitAppPrompt);
6565
+ // Close placeholder before handling response (always dispose if it exists)
6566
+ if (placeholderWidget) {
6567
+ placeholderWidget.dispose();
6568
+ }
6432
6569
  if (streamlitPreviewResponse.type === 'error') {
6433
6570
  return streamlitPreviewResponse;
6434
6571
  }
@@ -6462,9 +6599,9 @@ class StreamlitAppPreviewManager {
6462
6599
  // Because we are parsing the notebook on the backend by reading
6463
6600
  // the file system, it only sees the last saved version of the notebook.
6464
6601
  await notebookPanel.context.save();
6465
- const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_5__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6602
+ const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_7__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6466
6603
  // Update the app with the edit prompt
6467
- const streamlitPreviewResponse = await (0,_utils__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreviewAndNotify)(notebookPanel.context.path, notebookID, true, // force_recreate
6604
+ const streamlitPreviewResponse = await (0,_utils__WEBPACK_IMPORTED_MODULE_6__.startStreamlitPreviewAndNotify)(notebookPanel.context.path, notebookID, false, // force_recreate
6468
6605
  editPrompt, 'Editing Streamlit app...', 'Streamlit app updated successfully!');
6469
6606
  return streamlitPreviewResponse;
6470
6607
  }
@@ -6505,22 +6642,22 @@ class StreamlitAppPreviewManager {
6505
6642
  createPreviewWidget(app, notebookPanel, appDeployService, appManagerService, previewData) {
6506
6643
  const iframeWidget = new IFrameWidget(previewData.url);
6507
6644
  // Log that the preview is open
6508
- void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_7__.logEvent)('opened_streamlit_app_preview');
6645
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_8__.logEvent)('opened_streamlit_app_preview');
6509
6646
  // Create main area widget
6510
6647
  const widget = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.MainAreaWidget({ content: iframeWidget });
6511
6648
  const notebookPath = notebookPanel.context.path;
6512
- const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_5__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6649
+ const notebookID = (0,_utils_notebookMetadata__WEBPACK_IMPORTED_MODULE_7__.getNotebookIDAndSetIfNonexistant)(notebookPanel);
6513
6650
  widget.title.label = (0,_utils__WEBPACK_IMPORTED_MODULE_6__.getAppPreviewNameFromNotebookPanel)(notebookPanel);
6514
6651
  widget.title.closable = true;
6515
6652
  // Create toolbar buttons
6516
6653
  const editAppButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
6517
6654
  className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
6518
6655
  onClick: () => {
6519
- (0,_UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_8__.showUpdateAppDropdown)(editAppButton.node, notebookPanel);
6656
+ (0,_UpdateAppDropdown__WEBPACK_IMPORTED_MODULE_9__.showUpdateAppDropdown)(editAppButton.node, notebookPanel);
6520
6657
  },
6521
6658
  tooltip: 'Edit Streamlit App',
6522
6659
  label: 'Edit App',
6523
- icon: _icons__WEBPACK_IMPORTED_MODULE_9__.EditLabIcon,
6660
+ icon: _icons__WEBPACK_IMPORTED_MODULE_10__.EditLabIcon,
6524
6661
  iconClass: 'mito-ai-deploy-icon'
6525
6662
  });
6526
6663
  const recreateAppButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
@@ -6530,30 +6667,30 @@ class StreamlitAppPreviewManager {
6530
6667
  },
6531
6668
  tooltip: 'Recreate new App from scratch based on the current state of the notebook',
6532
6669
  label: 'Recreate App',
6533
- icon: _icons__WEBPACK_IMPORTED_MODULE_9__.ResetCircleLabIcon,
6670
+ icon: _icons__WEBPACK_IMPORTED_MODULE_10__.ResetCircleLabIcon,
6534
6671
  iconClass: 'mito-ai-deploy-icon'
6535
6672
  });
6536
6673
  const deployButton = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ToolbarButton({
6537
6674
  className: 'text-button-mito-ai button-base button-small jp-ToolbarButton mito-deploy-button',
6538
6675
  onClick: () => {
6539
- void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_10__.deployStreamlitApp)(notebookPanel, appDeployService, appManagerService);
6676
+ void (0,_AppDeploy_DeployStreamlitApp__WEBPACK_IMPORTED_MODULE_11__.deployStreamlitApp)(notebookPanel, appDeployService, appManagerService);
6540
6677
  },
6541
6678
  tooltip: 'Deploy Streamlit App',
6542
6679
  label: 'Deploy App',
6543
- icon: _icons__WEBPACK_IMPORTED_MODULE_9__.DeployLabIcon,
6680
+ icon: _icons__WEBPACK_IMPORTED_MODULE_10__.DeployLabIcon,
6544
6681
  iconClass: 'mito-ai-deploy-icon'
6545
6682
  });
6546
6683
  // Insert the buttons into the toolbar
6547
6684
  widget.toolbar.insertAfter('spacer', 'edit-app-button', editAppButton);
6548
6685
  widget.toolbar.insertAfter('edit-app-button', 'recreate-app-button', recreateAppButton);
6549
- if (app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_11__.COMMAND_MITO_AI_BETA_MODE_ENABLED)) {
6686
+ if (app.commands.hasCommand(_commands__WEBPACK_IMPORTED_MODULE_12__.COMMAND_MITO_AI_BETA_MODE_ENABLED)) {
6550
6687
  widget.toolbar.insertAfter('recreate-app-button', 'deploy-app-button', deployButton);
6551
6688
  }
6552
6689
  // Handle widget disposal
6553
6690
  widget.disposed.connect(() => {
6554
6691
  console.log('Widget disposed, stopping preview');
6555
6692
  if (previewData) {
6556
- void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_7__.stopStreamlitPreview)(previewData.id);
6693
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_8__.stopStreamlitPreview)(previewData.id);
6557
6694
  }
6558
6695
  // Clear our reference when the widget is disposed
6559
6696
  if (this.currentPreview === widget) {
@@ -6569,14 +6706,14 @@ class StreamlitAppPreviewManager {
6569
6706
  const StreamlitPreviewPlugin = {
6570
6707
  id: 'mito-ai:streamlit-preview',
6571
6708
  autoStart: true,
6572
- requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_12__.IAppDeployService, _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_13__.IAppManagerService],
6709
+ requires: [_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__.INotebookTracker, _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _AppDeploy_AppDeployPlugin__WEBPACK_IMPORTED_MODULE_13__.IAppDeployService, _AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_14__.IAppManagerService],
6573
6710
  provides: IStreamlitPreviewManager,
6574
6711
  activate: (app, notebookTracker, palette, appDeployService, appManagerService) => {
6575
6712
  console.log('mito-ai: StreamlitPreviewPlugin activated');
6576
6713
  // Create the service instance
6577
6714
  const streamlitPreviewManager = new StreamlitAppPreviewManager(appDeployService, appManagerService);
6578
6715
  // Add command to command palette
6579
- app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_11__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
6716
+ app.commands.addCommand(_commands__WEBPACK_IMPORTED_MODULE_12__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT, {
6580
6717
  label: 'Preview as Streamlit',
6581
6718
  caption: 'Convert current notebook to Streamlit app and preview it',
6582
6719
  execute: async () => {
@@ -6592,7 +6729,7 @@ const StreamlitPreviewPlugin = {
6592
6729
  });
6593
6730
  // Add to command palette
6594
6731
  palette.addItem({
6595
- command: _commands__WEBPACK_IMPORTED_MODULE_11__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
6732
+ command: _commands__WEBPACK_IMPORTED_MODULE_12__.COMMAND_MITO_AI_PREVIEW_AS_STREAMLIT,
6596
6733
  category: 'Mito AI'
6597
6734
  });
6598
6735
  // Return the service so other plugins can use it
@@ -6728,7 +6865,8 @@ __webpack_require__.r(__webpack_exports__);
6728
6865
 
6729
6866
  const startStreamlitPreviewAndNotify = async (notebookPath, notebookID, force_recreate = false, edit_prompt = '', start_notification_message = 'Building App Preview...', success_notification_message = 'Streamlit preview started successfully!') => {
6730
6867
  const notificationId = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(start_notification_message, 'in-progress', { autoClose: false });
6731
- const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.startStreamlitPreview)(notebookPath, notebookID, force_recreate, edit_prompt);
6868
+ // TODO: I can have one function for creating new streamlit app and another function for editing a streamlit app
6869
+ const previewData = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.startStreamlitAppPreview)(notebookPath, notebookID, force_recreate, edit_prompt);
6732
6870
  if (previewData.type === 'success') {
6733
6871
  // Update notification to success
6734
6872
  _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.update({
@@ -6760,7 +6898,7 @@ async function showRecreateAppConfirmation(notebookPath, notebookID) {
6760
6898
  defaultButton: 1
6761
6899
  });
6762
6900
  if (result.button.accept) {
6763
- void startStreamlitPreviewAndNotify(notebookPath, notebookID, true, undefined, 'Recreating app from scratch...', 'App recreated successfully!');
6901
+ void startStreamlitPreviewAndNotify(notebookPath, notebookID, true, '', 'Recreating app from scratch...', 'App recreated successfully!');
6764
6902
  }
6765
6903
  }
6766
6904
  const getAppPreviewNameFromNotebookPanel = (notebookPanel) => {
@@ -10279,9 +10417,13 @@ __webpack_require__.r(__webpack_exports__);
10279
10417
  /* harmony export */ });
10280
10418
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
10281
10419
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
10282
- /* harmony import */ var _style_ModelSelector_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../style/ModelSelector.css */ "./style/ModelSelector.css");
10283
- /* harmony import */ var _icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/NucleausIcon */ "./lib/icons/NucleausIcon.js");
10284
- /* harmony import */ var _utils_models__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/models */ "./lib/utils/models.js");
10420
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "webpack/sharing/consume/default/react-dom");
10421
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
10422
+ /* harmony import */ var _style_ModelSelector_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../style/ModelSelector.css */ "./style/ModelSelector.css");
10423
+ /* harmony import */ var _icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/NucleausIcon */ "./lib/icons/NucleausIcon.js");
10424
+ /* harmony import */ var _icons_BrainIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/BrainIcon */ "./lib/icons/BrainIcon.js");
10425
+ /* harmony import */ var _icons_LightningIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/LightningIcon */ "./lib/icons/LightningIcon.js");
10426
+ /* harmony import */ var _utils_models__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/models */ "./lib/utils/models.js");
10285
10427
  /*
10286
10428
  * Copyright (c) Saga Inc.
10287
10429
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -10290,18 +10432,94 @@ __webpack_require__.r(__webpack_exports__);
10290
10432
 
10291
10433
 
10292
10434
 
10435
+
10436
+
10437
+
10293
10438
  const MODEL_MAPPINGS = [
10294
- { displayName: 'GPT 4.1', fullName: 'gpt-4.1' },
10295
- { displayName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_DISPLAY_NAME, fullName: _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_MODEL_NAME },
10296
- { displayName: 'Gemini 2.5 Pro', fullName: 'gemini-2.5-pro-preview-03-25' },
10297
- { displayName: 'Gemini 3 Pro', fullName: 'gemini-3-pro-preview' }
10439
+ {
10440
+ displayName: 'GPT 4.1',
10441
+ fullName: 'gpt-4.1',
10442
+ type: 'smart',
10443
+ goodFor: [
10444
+ 'Complex data analysis',
10445
+ 'Advanced debugging',
10446
+ 'Statistical analysis and modeling',
10447
+ 'Multi-step data workflows'
10448
+ ],
10449
+ provider: 'OpenAI',
10450
+ tokenLimit: '1M',
10451
+ speed: 'Medium',
10452
+ complexityHandling: 'High'
10453
+ },
10454
+ {
10455
+ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_HAIKU_DISPLAY_NAME,
10456
+ fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_HAIKU_MODEL_NAME,
10457
+ type: 'fast',
10458
+ goodFor: [
10459
+ 'Quick data exploration',
10460
+ 'Pandas operations',
10461
+ 'Basic data cleaning',
10462
+ 'Fast code iterations'
10463
+ ],
10464
+ provider: 'Anthropic',
10465
+ tokenLimit: '200K',
10466
+ speed: 'Fast',
10467
+ complexityHandling: 'Medium'
10468
+ },
10469
+ {
10470
+ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_DISPLAY_NAME,
10471
+ fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_MODEL_NAME,
10472
+ type: 'smart',
10473
+ goodFor: [
10474
+ 'Complex data analysis',
10475
+ 'Advanced debugging',
10476
+ 'Statistical analysis and modeling',
10477
+ 'Multi-step data workflows'
10478
+ ],
10479
+ provider: 'Anthropic',
10480
+ tokenLimit: '1M',
10481
+ speed: 'Medium',
10482
+ complexityHandling: 'High'
10483
+ },
10484
+ {
10485
+ displayName: 'Gemini 2.5 Pro',
10486
+ fullName: 'gemini-2.5-pro',
10487
+ type: 'smart',
10488
+ goodFor: [
10489
+ 'Complex data analysis',
10490
+ 'Advanced debugging',
10491
+ 'Statistical analysis and modeling',
10492
+ 'Multi-step data workflows'
10493
+ ],
10494
+ provider: 'Google',
10495
+ tokenLimit: '1M',
10496
+ speed: 'Medium',
10497
+ complexityHandling: 'High'
10498
+ },
10499
+ {
10500
+ displayName: 'Gemini 3 Pro',
10501
+ fullName: 'gemini-3-pro-preview',
10502
+ type: 'smart',
10503
+ goodFor: [
10504
+ 'Most complex data analysis',
10505
+ 'Advanced debugging',
10506
+ 'Statistical analysis and modeling',
10507
+ 'Multi-step data workflows'
10508
+ ],
10509
+ provider: 'Google',
10510
+ tokenLimit: '1M',
10511
+ speed: 'Slow',
10512
+ complexityHandling: 'High'
10513
+ }
10298
10514
  ];
10299
10515
  const ALL_MODEL_DISPLAY_NAMES = MODEL_MAPPINGS.map(mapping => mapping.displayName);
10300
10516
  // Maximum length for displayed model name before truncating
10301
- const DEFAULT_MODEL = _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_DISPLAY_NAME;
10517
+ const DEFAULT_MODEL = _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_DISPLAY_NAME;
10302
10518
  const ModelSelector = ({ onConfigChange }) => {
10303
10519
  const [selectedModel, setSelectedModel] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(DEFAULT_MODEL);
10304
10520
  const [isOpen, setIsOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
10521
+ const [hoveredModel, setHoveredModel] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
10522
+ const dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
10305
10523
  // Load config from localStorage on component mount and notify parent
10306
10524
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
10307
10525
  var _a;
@@ -10354,17 +10572,60 @@ const ModelSelector = ({ onConfigChange }) => {
10354
10572
  document.removeEventListener('mousedown', handleClickOutside);
10355
10573
  };
10356
10574
  }, []);
10575
+ // Set CSS custom properties for tooltip positioning
10576
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
10577
+ if (isOpen && dropdownRef.current) {
10578
+ const rect = dropdownRef.current.getBoundingClientRect();
10579
+ // Align bottom of tooltip with bottom of dropdown (which is at rect.top)
10580
+ // Tooltip height is approximately 180px
10581
+ const tooltipHeight = 180;
10582
+ const tooltipBottom = rect.top;
10583
+ const tooltipTop = tooltipBottom - tooltipHeight;
10584
+ document.documentElement.style.setProperty('--tooltip-top', `${tooltipTop - 32}px`);
10585
+ document.documentElement.style.setProperty('--tooltip-left', `${rect.left + 160}px`);
10586
+ }
10587
+ }, [isOpen]);
10357
10588
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-selector" },
10358
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: `model-selector-dropdown`, onClick: () => setIsOpen(!isOpen), title: selectedModel, "data-testid": "model-selector" },
10589
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: dropdownRef, className: `model-selector-dropdown`, onClick: () => setIsOpen(!isOpen), "data-testid": "model-selector" },
10359
10590
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "selected-model" },
10360
10591
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-icon" },
10361
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_3__["default"], { height: 10, width: 10 })),
10592
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_4__["default"], { height: 10, width: 10 })),
10362
10593
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-name" }, selectedModel),
10363
10594
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "dropdown-arrow" }, "\u25BC")),
10364
- isOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: `model-options dropup`, style: { minWidth: '150px' } }, ALL_MODEL_DISPLAY_NAMES.map(model => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: model, className: `model-option ${model === selectedModel ? 'selected' : ''}`, onClick: (e) => {
10365
- e.stopPropagation();
10366
- handleModelChange(model);
10367
- }, title: model, "data-testid": "model-option" }, model))))))));
10595
+ isOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: `model-options dropup`, style: { minWidth: '150px' }, onMouseLeave: () => setHoveredModel(null) }, ALL_MODEL_DISPLAY_NAMES.map(model => {
10596
+ const modelMapping = MODEL_MAPPINGS.find(m => m.displayName === model);
10597
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: model, className: `model-option ${model === selectedModel ? 'selected' : ''}`, onClick: (e) => {
10598
+ e.stopPropagation();
10599
+ handleModelChange(model);
10600
+ }, onMouseEnter: () => setHoveredModel(modelMapping || null), "data-testid": "model-option" },
10601
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-option-name" }, model),
10602
+ (modelMapping === null || modelMapping === void 0 ? void 0 : modelMapping.type) === 'smart' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-type-icon" },
10603
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_BrainIcon__WEBPACK_IMPORTED_MODULE_5__["default"], { height: 12, width: 12 }))),
10604
+ (modelMapping === null || modelMapping === void 0 ? void 0 : modelMapping.type) === 'fast' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-type-icon" },
10605
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_LightningIcon__WEBPACK_IMPORTED_MODULE_6__["default"], { height: 12, width: 12 })))));
10606
+ })))),
10607
+ isOpen && hoveredModel && react_dom__WEBPACK_IMPORTED_MODULE_1___default().createPortal(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip" },
10608
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-content" },
10609
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-header" },
10610
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-title-row" },
10611
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-title-icon" }, hoveredModel.type === 'smart' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_BrainIcon__WEBPACK_IMPORTED_MODULE_5__["default"], { height: 16, width: 16 })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_LightningIcon__WEBPACK_IMPORTED_MODULE_6__["default"], { height: 16, width: 16 }))),
10612
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-title" }, hoveredModel.displayName)),
10613
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata" },
10614
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10615
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Provider:"),
10616
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.provider)),
10617
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10618
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Tokens:"),
10619
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.tokenLimit)),
10620
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10621
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Speed:"),
10622
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.speed)),
10623
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10624
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Complexity:"),
10625
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.complexityHandling)))),
10626
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-section" },
10627
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-section-label" }, "Good For:"),
10628
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "model-tooltip-bullet-list" }, hoveredModel.goodFor.map((item, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { key: index, className: "model-tooltip-bullet-item" }, item))))))), document.body)));
10368
10629
  };
10369
10630
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ModelSelector);
10370
10631
 
@@ -10750,6 +11011,31 @@ const AppIcon = () => {
10750
11011
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppIcon);
10751
11012
 
10752
11013
 
11014
+ /***/ }),
11015
+
11016
+ /***/ "./lib/icons/BrainIcon.js":
11017
+ /*!********************************!*\
11018
+ !*** ./lib/icons/BrainIcon.js ***!
11019
+ \********************************/
11020
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11021
+
11022
+ __webpack_require__.r(__webpack_exports__);
11023
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11024
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11025
+ /* harmony export */ });
11026
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
11027
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
11028
+ /*
11029
+ * Copyright (c) Saga Inc.
11030
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11031
+ */
11032
+
11033
+ const BrainIcon = ({ height = 14, width = 14, fill = 'currentColor' }) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: width, height: height, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: fill, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
11034
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M12 5a3 3 0 1 0-5.997.142 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588 4 4 0 0 0 7.636 2.106 3.2 3.2 0 0 0 .164-.546c.628-.5 1.2-1.1 1.7-1.8a3.2 3.2 0 0 0 .164-.546 4 4 0 0 0 7.636-2.106 4 4 0 0 0 .556-6.588 4 4 0 0 0-2.526-5.77A3 3 0 1 0 12 5Z" }),
11035
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M8 12h.01M12 12h.01M16 12h.01M8 8h.01M12 8h.01M16 8h.01M8 16h.01M12 16h.01M16 16h.01" })));
11036
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BrainIcon);
11037
+
11038
+
10753
11039
  /***/ }),
10754
11040
 
10755
11041
  /***/ "./lib/icons/CodeIcon.js":
@@ -10877,6 +11163,30 @@ const ExpandIcon = ({ isExpanded }) => (react__WEBPACK_IMPORTED_MODULE_0___defau
10877
11163
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExpandIcon);
10878
11164
 
10879
11165
 
11166
+ /***/ }),
11167
+
11168
+ /***/ "./lib/icons/LightningIcon.js":
11169
+ /*!************************************!*\
11170
+ !*** ./lib/icons/LightningIcon.js ***!
11171
+ \************************************/
11172
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11173
+
11174
+ __webpack_require__.r(__webpack_exports__);
11175
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11176
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11177
+ /* harmony export */ });
11178
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
11179
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
11180
+ /*
11181
+ * Copyright (c) Saga Inc.
11182
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11183
+ */
11184
+
11185
+ const LightningIcon = ({ height = 14, width = 14, fill = 'currentColor' }) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: width, height: height, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: fill, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
11186
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })));
11187
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LightningIcon);
11188
+
11189
+
10880
11190
  /***/ }),
10881
11191
 
10882
11192
  /***/ "./lib/icons/MagicWand.js":
@@ -11351,7 +11661,7 @@ __webpack_require__.r(__webpack_exports__);
11351
11661
  /* harmony export */ logEvent: () => (/* binding */ logEvent),
11352
11662
  /* harmony export */ setRule: () => (/* binding */ setRule),
11353
11663
  /* harmony export */ setUserKey: () => (/* binding */ setUserKey),
11354
- /* harmony export */ startStreamlitPreview: () => (/* binding */ startStreamlitPreview),
11664
+ /* harmony export */ startStreamlitAppPreview: () => (/* binding */ startStreamlitAppPreview),
11355
11665
  /* harmony export */ stopStreamlitPreview: () => (/* binding */ stopStreamlitPreview),
11356
11666
  /* harmony export */ updateSettings: () => (/* binding */ updateSettings)
11357
11667
  /* harmony export */ });
@@ -11448,14 +11758,14 @@ const getDatabaseConnections = async () => {
11448
11758
  STREAMLIT PREVIEW ENDPOINTS
11449
11759
 
11450
11760
  ************************************/
11451
- const startStreamlitPreview = async (notebookPath, notebookID, force_recreate = false, edit_prompt = '') => {
11761
+ const startStreamlitAppPreview = async (notebookPath, notebookID, force_recreate = false, streamlit_app_prompt = '') => {
11452
11762
  const response = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('streamlit-preview', {
11453
11763
  method: 'POST',
11454
11764
  body: JSON.stringify({
11455
11765
  notebook_path: notebookPath,
11456
11766
  notebook_id: notebookID,
11457
11767
  force_recreate: force_recreate,
11458
- edit_prompt: edit_prompt
11768
+ streamlit_app_prompt: streamlit_app_prompt
11459
11769
  })
11460
11770
  });
11461
11771
  if (response.error) {
@@ -12726,6 +13036,8 @@ const uploadFileToBackend = async (file, notebookTracker, onFileUploaded) => {
12726
13036
 
12727
13037
  __webpack_require__.r(__webpack_exports__);
12728
13038
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13039
+ /* harmony export */ CLAUDE_HAIKU_DISPLAY_NAME: () => (/* binding */ CLAUDE_HAIKU_DISPLAY_NAME),
13040
+ /* harmony export */ CLAUDE_HAIKU_MODEL_NAME: () => (/* binding */ CLAUDE_HAIKU_MODEL_NAME),
12729
13041
  /* harmony export */ CLAUDE_SONNET_DISPLAY_NAME: () => (/* binding */ CLAUDE_SONNET_DISPLAY_NAME),
12730
13042
  /* harmony export */ CLAUDE_SONNET_MODEL_NAME: () => (/* binding */ CLAUDE_SONNET_MODEL_NAME),
12731
13043
  /* harmony export */ GPT_4_1_DISPLAY_NAME: () => (/* binding */ GPT_4_1_DISPLAY_NAME),
@@ -12735,8 +13047,10 @@ __webpack_require__.r(__webpack_exports__);
12735
13047
  * Copyright (c) Saga Inc.
12736
13048
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
12737
13049
  */
12738
- const CLAUDE_SONNET_DISPLAY_NAME = 'Claude 4.5 Sonnet';
13050
+ const CLAUDE_SONNET_DISPLAY_NAME = 'Claude Sonnet 4.5';
12739
13051
  const CLAUDE_SONNET_MODEL_NAME = 'claude-sonnet-4-5-20250929';
13052
+ const CLAUDE_HAIKU_DISPLAY_NAME = 'Claude Haiku 4.5';
13053
+ const CLAUDE_HAIKU_MODEL_NAME = 'claude-haiku-4-5-20251001';
12740
13054
  const GPT_4_1_DISPLAY_NAME = 'GPT 4.1';
12741
13055
  const GPT_4_1_MODEL_NAME = 'gpt-4.1';
12742
13056
 
@@ -14920,16 +15234,28 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14920
15234
 
14921
15235
  /* apps-list.css */
14922
15236
  .apps-list-container {
14923
- padding: 16px;
15237
+ display: flex;
15238
+ flex-direction: column;
15239
+ height: 100%;
14924
15240
  font-size: 13px;
14925
15241
  font-family: var(--jp-ui-font-family);
15242
+ overflow: hidden;
14926
15243
  }
14927
15244
 
14928
15245
  .apps-list-header {
14929
15246
  display: flex;
14930
15247
  justify-content: space-between;
14931
15248
  align-items: center;
14932
- margin-bottom: 16px;
15249
+ padding: 16px;
15250
+ flex-shrink: 0;
15251
+ border-bottom: 1px solid var(--jp-border-color2);
15252
+ }
15253
+
15254
+ .apps-list-content {
15255
+ flex: 1;
15256
+ overflow-y: auto;
15257
+ padding: 16px;
15258
+ min-height: 0;
14933
15259
  }
14934
15260
 
14935
15261
  .apps-list-title {
@@ -14989,6 +15315,30 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14989
15315
  margin-top: 8px;
14990
15316
  }
14991
15317
 
15318
+ .apps-list-auth-message {
15319
+ color: var(--jp-ui-font-color1);
15320
+ background-color: var(--jp-layout-color0);
15321
+ border: 1px solid var(--jp-border-color2);
15322
+ border-radius: 4px;
15323
+ padding: 24px 16px;
15324
+ text-align: center;
15325
+ display: flex;
15326
+ flex-direction: column;
15327
+ align-items: center;
15328
+ gap: 12px;
15329
+ }
15330
+
15331
+ .apps-list-auth-text {
15332
+ font-size: 14px;
15333
+ font-weight: bold;
15334
+ font-family: var(--jp-ui-font-family);
15335
+ }
15336
+
15337
+ .apps-list-auth-login-button {
15338
+ font-size: 13px;
15339
+ min-width: 96px;
15340
+ }
15341
+
14992
15342
  .apps-list-empty {
14993
15343
  color: var(--jp-ui-font-color2);
14994
15344
  text-align: center;
@@ -15078,7 +15428,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15078
15428
  .app-item-copy-button:hover {
15079
15429
  background-color: var(--jp-layout-color2);
15080
15430
  }
15081
- `, "",{"version":3,"sources":["webpack://./style/AppsList.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,kBAAkB;AAClB;EACE,aAAa;EACb,eAAe;EACf,qCAAqC;AACvC;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,mBAAmB;AACrB;;AAEA;EACE,SAAS;EACT,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,6BAA6B;EAC7B,+BAA+B;EAC/B,yCAAyC;EACzC,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACnB,sCAAsC;AACxC;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,wCAAwC;EACxC,YAAY;EACZ,YAAY;AACd;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,kBAAkB;EAClB,eAAe;EACf,yCAAyC;EACzC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,kBAAkB;EAClB,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,kBAAkB;AACpB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,iBAAiB;EACjB,+BAA+B;EAC/B,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;EACrB,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;AACzC;;AAEA;EACE,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,yCAAyC;AAC3C","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* apps-list.css */\n.apps-list-container {\n padding: 16px;\n font-size: 13px;\n font-family: var(--jp-ui-font-family);\n}\n\n.apps-list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.apps-list-title {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.apps-list-actions {\n display: flex;\n gap: 8px;\n}\n\n.apps-list-button {\n padding: 4px 8px;\n font-size: 11px;\n background-color: transparent;\n color: var(--jp-ui-font-color2);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n cursor: pointer;\n font-weight: normal;\n transition: background-color 0.2s ease;\n}\n\n.apps-list-button:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.apps-list-button:disabled {\n cursor: not-allowed;\n}\n\n.apps-list-button.primary {\n background-color: var(--jp-brand-color1);\n color: white;\n border: none;\n}\n\n.apps-list-loading {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.apps-list-error {\n color: #f44336;\n text-align: center;\n padding: 20px 0;\n background-color: var(--jp-layout-color1);\n border: 1px solid #f44336;\n border-radius: 4px;\n}\n\n.apps-list-error-actions {\n margin-top: 8px;\n}\n\n.apps-list-empty {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.app-item {\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n padding: 12px;\n margin-bottom: 8px;\n background-color: var(--jp-layout-color0);\n}\n\n.app-item-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.app-item-content {\n flex: 1;\n}\n\n.app-item-name {\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n margin-bottom: 4px;\n}\n\n.app-item-status-container {\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.app-item-status-indicator {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 6px;\n}\n\n.app-item-status-text {\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n.app-item-last-deployed {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n}\n\n.app-item-url-container {\n display: flex;\n align-items: center;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n padding: 6px 8px;\n}\n\n.app-item-url {\n flex: 1;\n color: var(--jp-ui-font-color1);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--jp-code-font-family);\n}\n\n.app-item-copy-button {\n border: none;\n background: transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 8px;\n border-radius: 2px;\n}\n\n.app-item-copy-button:hover {\n background-color: var(--jp-layout-color2);\n}\n"],"sourceRoot":""}]);
15431
+ `, "",{"version":3,"sources":["webpack://./style/AppsList.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,kBAAkB;AAClB;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,eAAe;EACf,qCAAqC;EACrC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;EACnB,aAAa;EACb,cAAc;EACd,gDAAgD;AAClD;;AAEA;EACE,OAAO;EACP,gBAAgB;EAChB,aAAa;EACb,aAAa;AACf;;AAEA;EACE,SAAS;EACT,eAAe;EACf,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,6BAA6B;EAC7B,+BAA+B;EAC/B,yCAAyC;EACzC,kBAAkB;EAClB,eAAe;EACf,mBAAmB;EACnB,sCAAsC;AACxC;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,wCAAwC;EACxC,YAAY;EACZ,YAAY;AACd;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,kBAAkB;EAClB,eAAe;EACf,yCAAyC;EACzC,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAClB,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;AACX;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,qCAAqC;AACvC;;AAEA;EACE,eAAe;EACf,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,kBAAkB;EAClB,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,uBAAuB;EACvB,kBAAkB;AACpB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,iBAAiB;EACjB,+BAA+B;EAC/B,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;EACrB,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,iBAAiB;AACnB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,uCAAuC;AACzC;;AAEA;EACE,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,yCAAyC;AAC3C","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* apps-list.css */\n.apps-list-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-size: 13px;\n font-family: var(--jp-ui-font-family);\n overflow: hidden;\n}\n\n.apps-list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--jp-border-color2);\n}\n\n.apps-list-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n min-height: 0;\n}\n\n.apps-list-title {\n margin: 0;\n font-size: 14px;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.apps-list-actions {\n display: flex;\n gap: 8px;\n}\n\n.apps-list-button {\n padding: 4px 8px;\n font-size: 11px;\n background-color: transparent;\n color: var(--jp-ui-font-color2);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n cursor: pointer;\n font-weight: normal;\n transition: background-color 0.2s ease;\n}\n\n.apps-list-button:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.apps-list-button:disabled {\n cursor: not-allowed;\n}\n\n.apps-list-button.primary {\n background-color: var(--jp-brand-color1);\n color: white;\n border: none;\n}\n\n.apps-list-loading {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.apps-list-error {\n color: #f44336;\n text-align: center;\n padding: 20px 0;\n background-color: var(--jp-layout-color1);\n border: 1px solid #f44336;\n border-radius: 4px;\n}\n\n.apps-list-error-actions {\n margin-top: 8px;\n}\n\n.apps-list-auth-message {\n color: var(--jp-ui-font-color1);\n background-color: var(--jp-layout-color0);\n border: 1px solid var(--jp-border-color2);\n border-radius: 4px;\n padding: 24px 16px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.apps-list-auth-text {\n font-size: 14px;\n font-weight: bold;\n font-family: var(--jp-ui-font-family);\n}\n\n.apps-list-auth-login-button {\n font-size: 13px;\n min-width: 96px;\n}\n\n.apps-list-empty {\n color: var(--jp-ui-font-color2);\n text-align: center;\n padding: 20px 0;\n}\n\n.app-item {\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n padding: 12px;\n margin-bottom: 8px;\n background-color: var(--jp-layout-color0);\n}\n\n.app-item-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 8px;\n}\n\n.app-item-content {\n flex: 1;\n}\n\n.app-item-name {\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n margin-bottom: 4px;\n}\n\n.app-item-status-container {\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n}\n\n.app-item-status-indicator {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 6px;\n}\n\n.app-item-status-text {\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n.app-item-last-deployed {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n}\n\n.app-item-url-container {\n display: flex;\n align-items: center;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-border-color2);\n border-radius: 3px;\n padding: 6px 8px;\n}\n\n.app-item-url {\n flex: 1;\n color: var(--jp-ui-font-color1);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--jp-code-font-family);\n}\n\n.app-item-copy-button {\n border: none;\n background: transparent;\n cursor: pointer;\n padding: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 8px;\n border-radius: 2px;\n}\n\n.app-item-copy-button:hover {\n background-color: var(--jp-layout-color2);\n}\n"],"sourceRoot":""}]);
15082
15432
  // Exports
15083
15433
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15084
15434
 
@@ -15320,7 +15670,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15320
15670
 
15321
15671
  /* Tab styling for sign in/sign up tabs */
15322
15672
  .modal-content .amplify-tabs__item {
15323
- color: var(--jp-ui-font-color2) !important;
15673
+ color: var(--purple-500) !important;
15324
15674
  border-bottom: 2px solid transparent !important;
15325
15675
  }
15326
15676
 
@@ -15338,7 +15688,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15338
15688
 
15339
15689
 
15340
15690
  .modal-content .amplify-tabs__item:hover {
15341
- color: var(--jp-ui-font-color1) !important;
15691
+ color: var(--purple-700) !important;
15342
15692
  }
15343
15693
 
15344
15694
  /* Override any default blue tab styling from Amplify */
@@ -15614,7 +15964,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15614
15964
  margin: 0;
15615
15965
  font-family: var(--jp-ui-font-family);
15616
15966
  font-style: italic;
15617
- }`, "",{"version":3,"sources":["webpack://./style/AuthPopup.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Auth popup specific styling to integrate AWS Amplify with Mito theme */\n.modal-content .amplify-authenticator {\n --amplify-colors-font-primary: var(--jp-ui-font-color1);\n --amplify-colors-font-secondary: var(--jp-ui-font-color2);\n --amplify-colors-background-primary: var(--jp-layout-color0);\n --amplify-colors-background-secondary: var(--jp-layout-color1);\n --amplify-colors-border-primary: var(--jp-border-color1);\n --amplify-colors-brand-primary-10: var(--purple-700);\n --amplify-colors-brand-primary-80: var(--purple-500);\n --amplify-colors-brand-primary-90: var(--purple-400);\n --amplify-colors-brand-primary-100: var(--purple-300);\n --amplify-radii-small: 4px;\n --amplify-radii-medium: 4px;\n --amplify-space-small: 8px;\n --amplify-space-medium: 12px;\n --amplify-space-large: 16px;\n --amplify-font-sizes-small: 14px;\n --amplify-font-sizes-medium: 14px;\n \n /* Remove the blue top border on active tabs */\n --amplify-components-tabs-item-active-border-width: 0;\n --amplify-components-tabs-item-border-width: 0;\n \n /* Ensure active tab bottom border uses purple */\n --amplify-components-tabs-item-active-border-color: var(--purple-500);\n --amplify-components-tabs-item-active-color: var(--purple-700);\n}\n\n/* Ensure modal content has adequate width for auth form */\n.modal-content:has(.amplify-authenticator) {\n width: 480px;\n max-width: 90vw;\n min-width: 400px;\n}\n\n/* Style the authenticator container */\n.modal-content .amplify-authenticator__modal {\n background: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n/* Constrain authenticator content within modal bounds */\n.modal-content .amplify-authenticator {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Specifically target the data-amplify-container to prevent overflow */\n.modal-content [data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n\n\n/* Constrain the tabs container */\n.modal-content .amplify-tabs {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Ensure form fields don't overflow */\n.modal-content .amplify-field,\n.modal-content .amplify-field__group {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Align form elements with Mito styling */\n.modal-content .amplify-field__label {\n color: var(--jp-ui-font-color1) !important;\n font-weight: 500 !important;\n}\n\n.modal-content .amplify-input,\n.modal-content .amplify-select {\n background: var(--jp-layout-color0) !important;\n border: 1px solid var(--jp-border-color1) !important;\n color: var(--jp-ui-font-color1) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-input:focus,\n.modal-content .amplify-select:focus {\n border-color: var(--purple-500) !important;\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1) !important;\n}\n\n\n\n/* Style Amplify buttons to match Mito theme */\n.modal-content .amplify-button--primary {\n background-color: var(--purple-400) !important;\n color: var(--purple-700) !important;\n border: none !important;\n border-radius: 4px !important;\n font-weight: 500 !important;\n padding: 8px 16px !important;\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n.modal-content .amplify-button--primary:hover {\n background-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-button--link {\n color: var(--purple-600) !important;\n text-decoration: none !important;\n}\n\n.modal-content .amplify-button--link:hover {\n color: var(--purple-700) !important;\n text-decoration: underline !important;\n}\n\n/* Error and success message styling */\n.modal-content .amplify-alert--error {\n background-color: var(--red-300) !important;\n color: var(--red-900) !important;\n border: 1px solid var(--red-400) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-alert--info {\n background-color: var(--purple-300) !important;\n color: var(--purple-700) !important;\n border: 1px solid var(--purple-400) !important;\n border-radius: 4px !important;\n}\n\n/* Tab styling for sign in/sign up tabs */\n.modal-content .amplify-tabs__item {\n color: var(--jp-ui-font-color2) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Ensure inactive tabs don't have purple styling */\n.modal-content .amplify-tabs__item[data-state=\"inactive\"] {\n color: var(--jp-ui-font-color2) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n\n\n.modal-content .amplify-tabs__item:hover {\n color: var(--jp-ui-font-color1) !important;\n}\n\n/* Override any default blue tab styling from Amplify */\n.modal-content .amplify-tabs__list {\n border-bottom: 1px solid var(--jp-border-color1) !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"]:after,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:after {\n background-color: var(--purple-500) !important;\n border-color: var(--purple-500) !important;\n}\n\n/* Override any Amplify default blue colors */\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Additional selectors to ensure default active state on initial load */\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom: 2px solid var(--purple-500) !important;\n}\n\n\n\n/* Loading spinner colors */\n.modal-content .amplify-loader {\n border-top-color: var(--purple-500) !important;\n}\n\n/* Additional purple color overrides for any remaining blue elements */\n.modal-content .amplify-tabs__item[data-state=\"active\"] *,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] * {\n color: var(--purple-700) !important;\n}\n\n/* Override focus states to use purple */\n.modal-content .amplify-tabs__item:focus,\n.modal-content .amplify-tabs__item:focus-visible {\n border-bottom-color: var(--purple-500) !important;\n outline-color: var(--purple-500) !important;\n}\n\n/* Ensure any nested tab content uses purple theme */\n.modal-content [data-amplify-authenticator] [data-amplify-router] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Remove any top borders, outlines, or blue styling from tabs */\n.modal-content .amplify-tabs__item {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"],\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n box-shadow: none !important;\n}\n\n/* Remove any pseudo-element borders that might create blue lines */\n.modal-content .amplify-tabs__item:before,\n.modal-content .amplify-tabs__item:after,\n.modal-content .amplify-tabs__item[data-state=\"active\"]:before,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:before {\n display: none !important;\n border: none !important;\n background: none !important;\n}\n\n\n\n/* Additional containment rules for better layout */\n.modal-content .amplify-authenticator * {\n box-sizing: border-box !important;\n}\n\n/* Prevent any Amplify containers from overflowing */\n.modal-content [data-amplify-authenticator],\n.modal-content [data-amplify-router],\n.modal-content [data-amplify-authenticator-signin],\n.modal-content [data-amplify-authenticator-signup] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n/* Remove any default margins or padding that might cause overflow */\n.modal-content [data-amplify-container] * {\n max-width: 100% !important;\n}\n\n/* Ensure modal content itself doesn't allow horizontal scroll */\n.modal-content:has(.amplify-authenticator) {\n overflow-x: hidden !important;\n}\n\n/* Target main Amplify containers but not inputs */\n.modal-content div[data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Ensure tab panels fit within bounds */\n.modal-content .amplify-tabs__panel {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n padding: 16px !important;\n}\n\n/* Ensure tab list doesn't overflow */\n.modal-content .amplify-tabs__list {\n width: 100% !important;\n max-width: 100% !important;\n display: flex !important;\n justify-content: space-around !important;\n}\n\n.modal-content .amplify-tabs__item {\n flex: 1 !important;\n text-align: center !important;\n max-width: 50% !important;\n}\n\n/* Add this to your AuthPopup.css file */\n\n/* Hide password requirements by default */\n.password-requirements {\n display: none;\n padding: 16px 20px;\n background-color: var(--jp-layout-color2);\n border-top: 1px solid var(--jp-border-color1);\n font-size: 13px;\n}\n\n/* Show password requirements when sign-up form is present */\n.modal-content:has([data-amplify-authenticator-signup]) .password-requirements {\n display: block;\n}\n\n/* Style the requirements content */\n.password-requirements p {\n margin: 0 0 8px 0;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.password-requirements ul {\n margin: 0;\n padding-left: 20px;\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n/* Success message styling */\n.auth-success-message {\n padding: 32px 24px;\n text-align: center;\n background: var(--jp-layout-color0);\n border-radius: 8px;\n}\n\n.success-icon {\n margin-bottom: 20px;\n display: flex;\n justify-content: center;\n}\n\n.success-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n.success-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n.success-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0 0 24px 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}\n\n.success-actions {\n display: flex;\n justify-content: center;\n gap: 12px;\n}\n\n/* Progress bar animation */\n@keyframes progressFill {\n from { width: 0%; }\n to { width: 100%; }\n}\n\n/* Welcome message container styling */\n.welcome-message-container {\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n padding: 32px 24px;\n margin: 16px 0;\n background-color: var(--jp-layout-color0);\n text-align: center;\n}\n\n/* Welcome message title */\n.welcome-message-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n/* Welcome message description */\n.welcome-message-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n/* Progress bar container */\n.progress-bar-container {\n width: 100%;\n height: 4px;\n background-color: var(--jp-border-color1);\n border-radius: 2px;\n overflow: hidden;\n margin-top: 20px;\n margin-bottom: 12px;\n}\n\n/* Progress bar fill with CSS animation */\n.progress-bar-fill {\n width: 0%;\n height: 100%;\n background-color: var(--purple-500);\n border-radius: 2px;\n animation: progressFill 3s linear forwards;\n}\n\n/* Progress bar timer text */\n.progress-bar-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}"],"sourceRoot":""}]);
15967
+ }`, "",{"version":3,"sources":["webpack://./style/AuthPopup.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Auth popup specific styling to integrate AWS Amplify with Mito theme */\n.modal-content .amplify-authenticator {\n --amplify-colors-font-primary: var(--jp-ui-font-color1);\n --amplify-colors-font-secondary: var(--jp-ui-font-color2);\n --amplify-colors-background-primary: var(--jp-layout-color0);\n --amplify-colors-background-secondary: var(--jp-layout-color1);\n --amplify-colors-border-primary: var(--jp-border-color1);\n --amplify-colors-brand-primary-10: var(--purple-700);\n --amplify-colors-brand-primary-80: var(--purple-500);\n --amplify-colors-brand-primary-90: var(--purple-400);\n --amplify-colors-brand-primary-100: var(--purple-300);\n --amplify-radii-small: 4px;\n --amplify-radii-medium: 4px;\n --amplify-space-small: 8px;\n --amplify-space-medium: 12px;\n --amplify-space-large: 16px;\n --amplify-font-sizes-small: 14px;\n --amplify-font-sizes-medium: 14px;\n \n /* Remove the blue top border on active tabs */\n --amplify-components-tabs-item-active-border-width: 0;\n --amplify-components-tabs-item-border-width: 0;\n \n /* Ensure active tab bottom border uses purple */\n --amplify-components-tabs-item-active-border-color: var(--purple-500);\n --amplify-components-tabs-item-active-color: var(--purple-700);\n}\n\n/* Ensure modal content has adequate width for auth form */\n.modal-content:has(.amplify-authenticator) {\n width: 480px;\n max-width: 90vw;\n min-width: 400px;\n}\n\n/* Style the authenticator container */\n.modal-content .amplify-authenticator__modal {\n background: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n/* Constrain authenticator content within modal bounds */\n.modal-content .amplify-authenticator {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Specifically target the data-amplify-container to prevent overflow */\n.modal-content [data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n\n\n/* Constrain the tabs container */\n.modal-content .amplify-tabs {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Ensure form fields don't overflow */\n.modal-content .amplify-field,\n.modal-content .amplify-field__group {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Align form elements with Mito styling */\n.modal-content .amplify-field__label {\n color: var(--jp-ui-font-color1) !important;\n font-weight: 500 !important;\n}\n\n.modal-content .amplify-input,\n.modal-content .amplify-select {\n background: var(--jp-layout-color0) !important;\n border: 1px solid var(--jp-border-color1) !important;\n color: var(--jp-ui-font-color1) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-input:focus,\n.modal-content .amplify-select:focus {\n border-color: var(--purple-500) !important;\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1) !important;\n}\n\n\n\n/* Style Amplify buttons to match Mito theme */\n.modal-content .amplify-button--primary {\n background-color: var(--purple-400) !important;\n color: var(--purple-700) !important;\n border: none !important;\n border-radius: 4px !important;\n font-weight: 500 !important;\n padding: 8px 16px !important;\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n.modal-content .amplify-button--primary:hover {\n background-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-button--link {\n color: var(--purple-600) !important;\n text-decoration: none !important;\n}\n\n.modal-content .amplify-button--link:hover {\n color: var(--purple-700) !important;\n text-decoration: underline !important;\n}\n\n/* Error and success message styling */\n.modal-content .amplify-alert--error {\n background-color: var(--red-300) !important;\n color: var(--red-900) !important;\n border: 1px solid var(--red-400) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-alert--info {\n background-color: var(--purple-300) !important;\n color: var(--purple-700) !important;\n border: 1px solid var(--purple-400) !important;\n border-radius: 4px !important;\n}\n\n/* Tab styling for sign in/sign up tabs */\n.modal-content .amplify-tabs__item {\n color: var(--purple-500) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Ensure inactive tabs don't have purple styling */\n.modal-content .amplify-tabs__item[data-state=\"inactive\"] {\n color: var(--jp-ui-font-color2) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n\n\n.modal-content .amplify-tabs__item:hover {\n color: var(--purple-700) !important;\n}\n\n/* Override any default blue tab styling from Amplify */\n.modal-content .amplify-tabs__list {\n border-bottom: 1px solid var(--jp-border-color1) !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"]:after,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:after {\n background-color: var(--purple-500) !important;\n border-color: var(--purple-500) !important;\n}\n\n/* Override any Amplify default blue colors */\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Additional selectors to ensure default active state on initial load */\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom: 2px solid var(--purple-500) !important;\n}\n\n\n\n/* Loading spinner colors */\n.modal-content .amplify-loader {\n border-top-color: var(--purple-500) !important;\n}\n\n/* Additional purple color overrides for any remaining blue elements */\n.modal-content .amplify-tabs__item[data-state=\"active\"] *,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] * {\n color: var(--purple-700) !important;\n}\n\n/* Override focus states to use purple */\n.modal-content .amplify-tabs__item:focus,\n.modal-content .amplify-tabs__item:focus-visible {\n border-bottom-color: var(--purple-500) !important;\n outline-color: var(--purple-500) !important;\n}\n\n/* Ensure any nested tab content uses purple theme */\n.modal-content [data-amplify-authenticator] [data-amplify-router] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Remove any top borders, outlines, or blue styling from tabs */\n.modal-content .amplify-tabs__item {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"],\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n box-shadow: none !important;\n}\n\n/* Remove any pseudo-element borders that might create blue lines */\n.modal-content .amplify-tabs__item:before,\n.modal-content .amplify-tabs__item:after,\n.modal-content .amplify-tabs__item[data-state=\"active\"]:before,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:before {\n display: none !important;\n border: none !important;\n background: none !important;\n}\n\n\n\n/* Additional containment rules for better layout */\n.modal-content .amplify-authenticator * {\n box-sizing: border-box !important;\n}\n\n/* Prevent any Amplify containers from overflowing */\n.modal-content [data-amplify-authenticator],\n.modal-content [data-amplify-router],\n.modal-content [data-amplify-authenticator-signin],\n.modal-content [data-amplify-authenticator-signup] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n/* Remove any default margins or padding that might cause overflow */\n.modal-content [data-amplify-container] * {\n max-width: 100% !important;\n}\n\n/* Ensure modal content itself doesn't allow horizontal scroll */\n.modal-content:has(.amplify-authenticator) {\n overflow-x: hidden !important;\n}\n\n/* Target main Amplify containers but not inputs */\n.modal-content div[data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Ensure tab panels fit within bounds */\n.modal-content .amplify-tabs__panel {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n padding: 16px !important;\n}\n\n/* Ensure tab list doesn't overflow */\n.modal-content .amplify-tabs__list {\n width: 100% !important;\n max-width: 100% !important;\n display: flex !important;\n justify-content: space-around !important;\n}\n\n.modal-content .amplify-tabs__item {\n flex: 1 !important;\n text-align: center !important;\n max-width: 50% !important;\n}\n\n/* Add this to your AuthPopup.css file */\n\n/* Hide password requirements by default */\n.password-requirements {\n display: none;\n padding: 16px 20px;\n background-color: var(--jp-layout-color2);\n border-top: 1px solid var(--jp-border-color1);\n font-size: 13px;\n}\n\n/* Show password requirements when sign-up form is present */\n.modal-content:has([data-amplify-authenticator-signup]) .password-requirements {\n display: block;\n}\n\n/* Style the requirements content */\n.password-requirements p {\n margin: 0 0 8px 0;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.password-requirements ul {\n margin: 0;\n padding-left: 20px;\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n/* Success message styling */\n.auth-success-message {\n padding: 32px 24px;\n text-align: center;\n background: var(--jp-layout-color0);\n border-radius: 8px;\n}\n\n.success-icon {\n margin-bottom: 20px;\n display: flex;\n justify-content: center;\n}\n\n.success-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n.success-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n.success-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0 0 24px 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}\n\n.success-actions {\n display: flex;\n justify-content: center;\n gap: 12px;\n}\n\n/* Progress bar animation */\n@keyframes progressFill {\n from { width: 0%; }\n to { width: 100%; }\n}\n\n/* Welcome message container styling */\n.welcome-message-container {\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n padding: 32px 24px;\n margin: 16px 0;\n background-color: var(--jp-layout-color0);\n text-align: center;\n}\n\n/* Welcome message title */\n.welcome-message-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n/* Welcome message description */\n.welcome-message-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n/* Progress bar container */\n.progress-bar-container {\n width: 100%;\n height: 4px;\n background-color: var(--jp-border-color1);\n border-radius: 2px;\n overflow: hidden;\n margin-top: 20px;\n margin-bottom: 12px;\n}\n\n/* Progress bar fill with CSS animation */\n.progress-bar-fill {\n width: 0%;\n height: 100%;\n background-color: var(--purple-500);\n border-radius: 2px;\n animation: progressFill 3s linear forwards;\n}\n\n/* Progress bar timer text */\n.progress-bar-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}"],"sourceRoot":""}]);
15618
15968
  // Exports
15619
15969
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15620
15970
 
@@ -17724,6 +18074,25 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17724
18074
  transition: background-color 0.2s;
17725
18075
  white-space: nowrap;
17726
18076
  /* Prevent text wrapping */
18077
+ display: flex;
18078
+ align-items: center;
18079
+ justify-content: space-between;
18080
+ gap: 8px;
18081
+ }
18082
+
18083
+ .model-option-name {
18084
+ flex: 1;
18085
+ min-width: 0;
18086
+ overflow: hidden;
18087
+ text-overflow: ellipsis;
18088
+ }
18089
+
18090
+ .model-type-icon {
18091
+ display: flex;
18092
+ align-items: center;
18093
+ justify-content: center;
18094
+ flex-shrink: 0;
18095
+ opacity: 0.7;
17727
18096
  }
17728
18097
 
17729
18098
  .model-option:hover {
@@ -17787,7 +18156,109 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17787
18156
  .model-name {
17788
18157
  display: none;
17789
18158
  }
17790
- }`, "",{"version":3,"sources":["webpack://./style/ModelSelector.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,4DAA4D;;AAE5D;EACE,kBAAkB;EAClB,cAAc;EACd,aAAa;EACb,YAAY,EAAE,mCAAmC;EACjD,aAAa;EACb,mBAAmB,EAAE,sBAAsB;EAC3C,+BAA+B;AACjC;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,kBAAkB;EAClB,YAAY,EAAE,yCAAyC;EACvD,kBAAkB;EAClB,eAAe;EACf,aAAa;EACb,mBAAmB,EAAE,0CAA0C;EAC/D,kBAAkB;EAClB,eAAe;AACjB;;;AAGA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,WAAW;EACX,YAAY;EACZ,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,cAAc;EACd,0BAA0B;EAC1B,gBAAgB;EAChB,cAAc,EAAE,iCAAiC;AACnD;;AAEA,2BAA2B;AAC3B;EACE,kBAAkB;EAClB,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,yCAAyC;EACzC,aAAa;EACb,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,mCAAmC;EACnC,oCAAoC;EACpC,eAAe;EACf,iCAAiC;EACjC,mBAAmB;EACnB,0BAA0B;AAC5B;;AAEA;EACE,yCAAyC;EACzC,wBAAwB;AAC1B;;AAEA;EACE,yCAAyC;EACzC,wBAAwB;AAC1B;;AAEA,4EAA4E;AAC5E;EACE,YAAY;EACZ,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,YAAY;EACZ,kBAAkB;AACpB;;AAEA,iDAAiD;AACjD;EACE,aAAa;EACb,wCAAwC;AAC1C;;AAEA;EACE,qBAAqB;EACrB,gBAAgB;EAChB,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,sBAAsB;AACxB;;AAEA,qDAAqD;AACrD;EACE,aAAa;AACf;;AAEA;EACE,eAAe;AACjB;;AAEA,2CAA2C;AAC3C;;EAEE,uEAAuE;EACvE;IACE,WAAW;EACb;;EAEA;IACE,eAAe;EACjB;;EAEA;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/* ModelSelector.css - responsive design with compact mode */\n\n.model-selector {\n position: relative;\n flex: 0 0 auto;\n margin: 0 8px;\n height: 20px; /* Match height of other elements */\n display: flex;\n align-items: center; /* Center vertically */\n color: var(--jp-ui-font-color2);\n}\n\n.model-selector:hover {\n color: var(--jp-ui-font-color1);\n}\n\n.model-selector-dropdown {\n position: relative;\n height: 20px; /* Fixed height to match other elements */\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center; /* Ensure content is vertically centered */\n width: min-content;\n max-width: 18ch;\n}\n\n\n.selected-model {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 8px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n line-height: 1;\n}\n\n.dropdown-arrow {\n font-size: 8px;\n transition: transform 0.2s;\n margin-left: 4px;\n flex-shrink: 0; /* Prevent arrow from shrinking */\n}\n\n/* Model options dropdown */\n.model-options {\n position: absolute;\n bottom: 100%;\n max-height: 180px;\n overflow-y: auto;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n margin-bottom: 4px;\n box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: auto;\n}\n\n.model-option {\n padding: 4px 8px;\n font-size: 12px;\n /* Keep this size for readability */\n color: var(--jp-content-font-color1);\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n /* Prevent text wrapping */\n}\n\n.model-option:hover {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n.model-option.selected {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n/* When inside chat-controls - ensure proper alignment with other controls */\n.chat-controls .model-selector {\n height: 20px;\n display: flex;\n align-items: center;\n}\n\n.chat-controls .model-selector-dropdown {\n height: 20px;\n align-self: center;\n}\n\n/* Ensure dropdown appears above other elements */\n.model-options {\n z-index: 1010;\n /* Higher z-index to ensure visibility */\n}\n\n.model-name {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: bottom;\n}\n\n/* On wider screens, show only the name of the model*/\n.model-icon {\n display: none;\n}\n\n.model-name {\n display: inline;\n}\n\n/* On compact screens, show only the icon */\n@container (max-width: 260px) {\n\n /* Shift the dropdown to the left to help prevent right-edge overflow */\n .model-options {\n left: -40px;\n }\n\n .model-icon {\n display: inline;\n }\n\n .model-name {\n display: none;\n }\n}"],"sourceRoot":""}]);
18159
+ }
18160
+
18161
+ /* Model tooltip - appears to the right of the dropdown, rendered via portal */
18162
+ .model-tooltip {
18163
+ position: fixed;
18164
+ top: var(--tooltip-top, 200px);
18165
+ left: var(--tooltip-left, 200px);
18166
+ background-color: var(--jp-layout-color1);
18167
+ border: 1px solid var(--jp-layout-color2);
18168
+ border-radius: 4px;
18169
+ padding: 12px;
18170
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
18171
+ z-index: 10000; /* High z-index to appear above Jupyter notebook */
18172
+ width: 280px;
18173
+ pointer-events: none; /* Prevent tooltip from blocking mouse events */
18174
+ }
18175
+
18176
+ .model-tooltip-content {
18177
+ display: flex;
18178
+ flex-direction: column;
18179
+ gap: 12px;
18180
+ }
18181
+
18182
+ .model-tooltip-header {
18183
+ display: flex;
18184
+ flex-direction: column;
18185
+ gap: 8px;
18186
+ }
18187
+
18188
+ .model-tooltip-title-row {
18189
+ display: flex;
18190
+ align-items: center;
18191
+ gap: 6px;
18192
+ }
18193
+
18194
+ .model-tooltip-title-icon {
18195
+ flex-shrink: 0;
18196
+ opacity: 0.8;
18197
+ display: flex;
18198
+ align-items: center;
18199
+ justify-content: center;
18200
+ line-height: 1;
18201
+ }
18202
+
18203
+ .model-tooltip-title {
18204
+ font-size: 14px;
18205
+ font-weight: 600;
18206
+ color: var(--jp-content-font-color1);
18207
+ line-height: 1.2;
18208
+ }
18209
+
18210
+ .model-tooltip-metadata {
18211
+ display: grid;
18212
+ grid-template-columns: 1fr 1fr;
18213
+ gap: 6px 12px;
18214
+ font-size: 11px;
18215
+ }
18216
+
18217
+ .model-tooltip-metadata-item {
18218
+ display: flex;
18219
+ gap: 4px;
18220
+ }
18221
+
18222
+ .model-tooltip-metadata-label {
18223
+ color: var(--jp-content-font-color2);
18224
+ font-weight: 500;
18225
+ }
18226
+
18227
+ .model-tooltip-metadata-value {
18228
+ color: var(--jp-content-font-color1);
18229
+ font-weight: 600;
18230
+ }
18231
+
18232
+ .model-tooltip-section {
18233
+ display: flex;
18234
+ flex-direction: column;
18235
+ gap: 6px;
18236
+ }
18237
+
18238
+ .model-tooltip-section-label {
18239
+ font-size: 11px;
18240
+ font-weight: 600;
18241
+ color: var(--jp-content-font-color1);
18242
+ text-transform: uppercase;
18243
+ letter-spacing: 0.5px;
18244
+ }
18245
+
18246
+ .model-tooltip-bullet-list {
18247
+ margin: 0;
18248
+ padding-left: 16px;
18249
+ list-style-type: disc;
18250
+ }
18251
+
18252
+ .model-tooltip-bullet-item {
18253
+ font-size: 12px;
18254
+ color: var(--jp-content-font-color2);
18255
+ line-height: 1.5;
18256
+ margin-bottom: 4px;
18257
+ }
18258
+
18259
+ .model-tooltip-bullet-item:last-child {
18260
+ margin-bottom: 0;
18261
+ }`, "",{"version":3,"sources":["webpack://./style/ModelSelector.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* ModelSelector.css - responsive design with compact mode */\n\n.model-selector {\n position: relative;\n flex: 0 0 auto;\n margin: 0 8px;\n height: 20px; /* Match height of other elements */\n display: flex;\n align-items: center; /* Center vertically */\n color: var(--jp-ui-font-color2);\n}\n\n.model-selector:hover {\n color: var(--jp-ui-font-color1);\n}\n\n.model-selector-dropdown {\n position: relative;\n height: 20px; /* Fixed height to match other elements */\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center; /* Ensure content is vertically centered */\n width: min-content;\n max-width: 18ch;\n}\n\n\n.selected-model {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 8px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n line-height: 1;\n}\n\n.dropdown-arrow {\n font-size: 8px;\n transition: transform 0.2s;\n margin-left: 4px;\n flex-shrink: 0; /* Prevent arrow from shrinking */\n}\n\n/* Model options dropdown */\n.model-options {\n position: absolute;\n bottom: 100%;\n max-height: 180px;\n overflow-y: auto;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n margin-bottom: 4px;\n box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: auto;\n}\n\n.model-option {\n padding: 4px 8px;\n font-size: 12px;\n /* Keep this size for readability */\n color: var(--jp-content-font-color1);\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n /* Prevent text wrapping */\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.model-option-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-type-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n opacity: 0.7;\n}\n\n.model-option:hover {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n.model-option.selected {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n/* When inside chat-controls - ensure proper alignment with other controls */\n.chat-controls .model-selector {\n height: 20px;\n display: flex;\n align-items: center;\n}\n\n.chat-controls .model-selector-dropdown {\n height: 20px;\n align-self: center;\n}\n\n/* Ensure dropdown appears above other elements */\n.model-options {\n z-index: 1010;\n /* Higher z-index to ensure visibility */\n}\n\n.model-name {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: bottom;\n}\n\n/* On wider screens, show only the name of the model*/\n.model-icon {\n display: none;\n}\n\n.model-name {\n display: inline;\n}\n\n/* On compact screens, show only the icon */\n@container (max-width: 260px) {\n\n /* Shift the dropdown to the left to help prevent right-edge overflow */\n .model-options {\n left: -40px;\n }\n\n .model-icon {\n display: inline;\n }\n\n .model-name {\n display: none;\n }\n}\n\n/* Model tooltip - appears to the right of the dropdown, rendered via portal */\n.model-tooltip {\n position: fixed;\n top: var(--tooltip-top, 200px);\n left: var(--tooltip-left, 200px);\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10000; /* High z-index to appear above Jupyter notebook */\n width: 280px;\n pointer-events: none; /* Prevent tooltip from blocking mouse events */\n}\n\n.model-tooltip-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.model-tooltip-header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.model-tooltip-title-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.model-tooltip-title-icon {\n flex-shrink: 0;\n opacity: 0.8;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.model-tooltip-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n line-height: 1.2;\n}\n\n.model-tooltip-metadata {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 12px;\n font-size: 11px;\n}\n\n.model-tooltip-metadata-item {\n display: flex;\n gap: 4px;\n}\n\n.model-tooltip-metadata-label {\n color: var(--jp-content-font-color2);\n font-weight: 500;\n}\n\n.model-tooltip-metadata-value {\n color: var(--jp-content-font-color1);\n font-weight: 600;\n}\n\n.model-tooltip-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.model-tooltip-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.model-tooltip-bullet-list {\n margin: 0;\n padding-left: 16px;\n list-style-type: disc;\n}\n\n.model-tooltip-bullet-item {\n font-size: 12px;\n color: var(--jp-content-font-color2);\n line-height: 1.5;\n margin-bottom: 4px;\n}\n\n.model-tooltip-bullet-item:last-child {\n margin-bottom: 0;\n}"],"sourceRoot":""}]);
17791
18262
  // Exports
17792
18263
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
17793
18264
 
@@ -21892,4 +22363,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
21892
22363
  /***/ })
21893
22364
 
21894
22365
  }]);
21895
- //# sourceMappingURL=lib_index_js.5ec1e525d244fc8588cf.js.map
22366
+ //# sourceMappingURL=lib_index_js.31462f8f6a76b1cefbeb.js.map