mito-ai 0.1.52__py3-none-any.whl → 0.1.53__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 (38) hide show
  1. mito_ai/_version.py +1 -1
  2. mito_ai/anthropic_client.py +4 -3
  3. mito_ai/utils/anthropic_utils.py +28 -3
  4. mito_ai/utils/tokens.py +29 -0
  5. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  6. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  7. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  8. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.5ec1e525d244fc8588cf.js → mito_ai-0.1.53.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.4b7cd47a24bb24ef84ea.js +408 -64
  9. mito_ai-0.1.53.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.4b7cd47a24bb24ef84ea.js.map +1 -0
  10. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.89927e1d3b5962d57ae3.js → mito_ai-0.1.53.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.4395ab9342efa39fc0a2.js +3 -3
  11. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.89927e1d3b5962d57ae3.js.map → mito_ai-0.1.53.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.4395ab9342efa39fc0a2.js.map +1 -1
  12. {mito_ai-0.1.52.dist-info → mito_ai-0.1.53.dist-info}/METADATA +1 -1
  13. {mito_ai-0.1.52.dist-info → mito_ai-0.1.53.dist-info}/RECORD +37 -36
  14. mito_ai-0.1.52.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.5ec1e525d244fc8588cf.js.map +0 -1
  15. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  16. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  17. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  18. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  19. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  20. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  21. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  22. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  23. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  24. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  25. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  26. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  27. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  28. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  29. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  30. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  31. {mito_ai-0.1.52.data → mito_ai-0.1.53.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
  32. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  33. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  34. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  35. {mito_ai-0.1.52.data → mito_ai-0.1.53.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  36. {mito_ai-0.1.52.dist-info → mito_ai-0.1.53.dist-info}/WHEEL +0 -0
  37. {mito_ai-0.1.52.dist-info → mito_ai-0.1.53.dist-info}/entry_points.txt +0 -0
  38. {mito_ai-0.1.52.dist-info → mito_ai-0.1.53.dist-info}/licenses/LICENSE +0 -0
@@ -5998,9 +5998,11 @@ __webpack_require__.r(__webpack_exports__);
5998
5998
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
5999
5999
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
6000
6000
  /* 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");
6001
+ /* harmony import */ var _AppDeploy_auth__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../AppDeploy/auth */ "./lib/Extensions/AppDeploy/auth.js");
6002
+ /* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
6003
+ /* harmony import */ var _AppDeploy_authPopupUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../AppDeploy/authPopupUtils */ "./lib/Extensions/AppDeploy/authPopupUtils.js");
6003
6004
  /* harmony import */ var _style_AppsList_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AppsList.css */ "./style/AppsList.css");
6005
+ /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
6004
6006
  /*
6005
6007
  * Copyright (c) Saga Inc.
6006
6008
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6011,48 +6013,46 @@ __webpack_require__.r(__webpack_exports__);
6011
6013
 
6012
6014
 
6013
6015
 
6016
+
6017
+
6014
6018
  const AppsList = ({ appManagerService }) => {
6015
6019
  const [apps, setApps] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);
6016
6020
  const [loading, setLoading] = react__WEBPACK_IMPORTED_MODULE_0__.useState(true);
6017
6021
  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
- }
6022
+ const refreshApps = async () => {
6023
+ try {
6024
+ console.log('[AppsList] Refreshing apps...');
6025
+ setLoading(true);
6026
+ setError(null);
6027
+ const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__.fetchUserApps)(appManagerService);
6028
+ console.log('[AppsList] fetchUserApps response:', response);
6029
+ if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_4__.isGetAppsSuccess)(response)) {
6030
+ setApps(response.apps);
6035
6031
  }
6036
- catch (err) {
6037
- console.error('[AppsList] Error loading apps:', err);
6038
- setError(err instanceof Error ? err.message : 'An unexpected error occurred');
6032
+ else {
6033
+ setError(response.errorMessage || 'Failed to load apps');
6039
6034
  setApps([]);
6040
6035
  }
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
6036
  }
6054
- else {
6055
- setError(response.errorMessage || 'Failed to refresh apps');
6037
+ catch (err) {
6038
+ console.error('[AppsList] Error loading apps:', err);
6039
+ setError(err instanceof Error ? err.message : 'An unexpected error occurred');
6040
+ setApps([]);
6041
+ }
6042
+ finally {
6043
+ setLoading(false);
6044
+ }
6045
+ };
6046
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
6047
+ void refreshApps();
6048
+ }, []);
6049
+ const handleLogin = async () => {
6050
+ try {
6051
+ await (0,_AppDeploy_authPopupUtils__WEBPACK_IMPORTED_MODULE_5__.showAuthenticationPopup)();
6052
+ await refreshApps();
6053
+ }
6054
+ catch (err) {
6055
+ console.warn('[AppsList] Login popup closed or failed:', err);
6056
6056
  }
6057
6057
  };
6058
6058
  const copyToClipboard = async (url, appName) => {
@@ -6093,15 +6093,26 @@ const AppsList = ({ appManagerService }) => {
6093
6093
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("h3", { className: "apps-list-title" }, "Your Apps"),
6094
6094
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-actions" },
6095
6095
  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: () => {
6096
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: async () => {
6097
6097
  console.log('Logout clicked');
6098
- void (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
6098
+ try {
6099
+ await (0,_AppDeploy_auth__WEBPACK_IMPORTED_MODULE_6__.logoutAndClearJWTTokens)();
6100
+ }
6101
+ catch (err) {
6102
+ console.error('[AppsList] Error during logout:', err);
6103
+ }
6104
+ finally {
6105
+ await refreshApps();
6106
+ }
6099
6107
  }, 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" },
6108
+ 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" },
6109
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-auth-text" }, "User not authenticated"),
6110
+ 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" },
6111
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,
6112
+ "Error: ",
6113
+ error,
6114
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error-actions" },
6115
+ 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
6116
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-header" },
6106
6117
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-content" },
6107
6118
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-name" }, app.name),
@@ -6114,7 +6125,7 @@ const AppsList = ({ appManagerService }) => {
6114
6125
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url-container" },
6115
6126
  react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url" }, app.url),
6116
6127
  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)" }))))))))));
6128
+ 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
6129
  };
6119
6130
 
6120
6131
 
@@ -10279,9 +10290,13 @@ __webpack_require__.r(__webpack_exports__);
10279
10290
  /* harmony export */ });
10280
10291
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
10281
10292
  /* 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");
10293
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "webpack/sharing/consume/default/react-dom");
10294
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
10295
+ /* harmony import */ var _style_ModelSelector_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../style/ModelSelector.css */ "./style/ModelSelector.css");
10296
+ /* harmony import */ var _icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/NucleausIcon */ "./lib/icons/NucleausIcon.js");
10297
+ /* harmony import */ var _icons_BrainIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/BrainIcon */ "./lib/icons/BrainIcon.js");
10298
+ /* harmony import */ var _icons_LightningIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/LightningIcon */ "./lib/icons/LightningIcon.js");
10299
+ /* harmony import */ var _utils_models__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/models */ "./lib/utils/models.js");
10285
10300
  /*
10286
10301
  * Copyright (c) Saga Inc.
10287
10302
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -10290,18 +10305,94 @@ __webpack_require__.r(__webpack_exports__);
10290
10305
 
10291
10306
 
10292
10307
 
10308
+
10309
+
10310
+
10293
10311
  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' }
10312
+ {
10313
+ displayName: 'GPT 4.1',
10314
+ fullName: 'gpt-4.1',
10315
+ type: 'smart',
10316
+ goodFor: [
10317
+ 'Complex data analysis',
10318
+ 'Advanced debugging',
10319
+ 'Statistical analysis and modeling',
10320
+ 'Multi-step data workflows'
10321
+ ],
10322
+ provider: 'OpenAI',
10323
+ tokenLimit: '1M',
10324
+ speed: 'Medium',
10325
+ complexityHandling: 'High'
10326
+ },
10327
+ {
10328
+ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_HAIKU_DISPLAY_NAME,
10329
+ fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_HAIKU_MODEL_NAME,
10330
+ type: 'fast',
10331
+ goodFor: [
10332
+ 'Quick data exploration',
10333
+ 'Pandas operations',
10334
+ 'Basic data cleaning',
10335
+ 'Fast code iterations'
10336
+ ],
10337
+ provider: 'Anthropic',
10338
+ tokenLimit: '200K',
10339
+ speed: 'Fast',
10340
+ complexityHandling: 'Medium'
10341
+ },
10342
+ {
10343
+ displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_DISPLAY_NAME,
10344
+ fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_MODEL_NAME,
10345
+ type: 'smart',
10346
+ goodFor: [
10347
+ 'Complex data analysis',
10348
+ 'Advanced debugging',
10349
+ 'Statistical analysis and modeling',
10350
+ 'Multi-step data workflows'
10351
+ ],
10352
+ provider: 'Anthropic',
10353
+ tokenLimit: '1M',
10354
+ speed: 'Medium',
10355
+ complexityHandling: 'High'
10356
+ },
10357
+ {
10358
+ displayName: 'Gemini 2.5 Pro',
10359
+ fullName: 'gemini-2.5-pro-preview-03-25',
10360
+ type: 'smart',
10361
+ goodFor: [
10362
+ 'Complex data analysis',
10363
+ 'Advanced debugging',
10364
+ 'Statistical analysis and modeling',
10365
+ 'Multi-step data workflows'
10366
+ ],
10367
+ provider: 'Google',
10368
+ tokenLimit: '1M',
10369
+ speed: 'Medium',
10370
+ complexityHandling: 'High'
10371
+ },
10372
+ {
10373
+ displayName: 'Gemini 3 Pro',
10374
+ fullName: 'gemini-3-pro-preview',
10375
+ type: 'smart',
10376
+ goodFor: [
10377
+ 'Most complex data analysis',
10378
+ 'Advanced debugging',
10379
+ 'Statistical analysis and modeling',
10380
+ 'Multi-step data workflows'
10381
+ ],
10382
+ provider: 'Google',
10383
+ tokenLimit: '1M',
10384
+ speed: 'Slow',
10385
+ complexityHandling: 'High'
10386
+ }
10298
10387
  ];
10299
10388
  const ALL_MODEL_DISPLAY_NAMES = MODEL_MAPPINGS.map(mapping => mapping.displayName);
10300
10389
  // Maximum length for displayed model name before truncating
10301
- const DEFAULT_MODEL = _utils_models__WEBPACK_IMPORTED_MODULE_2__.CLAUDE_SONNET_DISPLAY_NAME;
10390
+ const DEFAULT_MODEL = _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_DISPLAY_NAME;
10302
10391
  const ModelSelector = ({ onConfigChange }) => {
10303
10392
  const [selectedModel, setSelectedModel] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(DEFAULT_MODEL);
10304
10393
  const [isOpen, setIsOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
10394
+ const [hoveredModel, setHoveredModel] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
10395
+ const dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
10305
10396
  // Load config from localStorage on component mount and notify parent
10306
10397
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
10307
10398
  var _a;
@@ -10354,17 +10445,60 @@ const ModelSelector = ({ onConfigChange }) => {
10354
10445
  document.removeEventListener('mousedown', handleClickOutside);
10355
10446
  };
10356
10447
  }, []);
10448
+ // Set CSS custom properties for tooltip positioning
10449
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
10450
+ if (isOpen && dropdownRef.current) {
10451
+ const rect = dropdownRef.current.getBoundingClientRect();
10452
+ // Align bottom of tooltip with bottom of dropdown (which is at rect.top)
10453
+ // Tooltip height is approximately 180px
10454
+ const tooltipHeight = 180;
10455
+ const tooltipBottom = rect.top;
10456
+ const tooltipTop = tooltipBottom - tooltipHeight;
10457
+ document.documentElement.style.setProperty('--tooltip-top', `${tooltipTop - 32}px`);
10458
+ document.documentElement.style.setProperty('--tooltip-left', `${rect.left + 160}px`);
10459
+ }
10460
+ }, [isOpen]);
10357
10461
  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" },
10462
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: dropdownRef, className: `model-selector-dropdown`, onClick: () => setIsOpen(!isOpen), "data-testid": "model-selector" },
10359
10463
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "selected-model" },
10360
10464
  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 })),
10465
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_NucleausIcon__WEBPACK_IMPORTED_MODULE_4__["default"], { height: 10, width: 10 })),
10362
10466
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-name" }, selectedModel),
10363
10467
  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))))))));
10468
+ 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 => {
10469
+ const modelMapping = MODEL_MAPPINGS.find(m => m.displayName === model);
10470
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: model, className: `model-option ${model === selectedModel ? 'selected' : ''}`, onClick: (e) => {
10471
+ e.stopPropagation();
10472
+ handleModelChange(model);
10473
+ }, onMouseEnter: () => setHoveredModel(modelMapping || null), "data-testid": "model-option" },
10474
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-option-name" }, model),
10475
+ (modelMapping === null || modelMapping === void 0 ? void 0 : modelMapping.type) === 'smart' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-type-icon" },
10476
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_BrainIcon__WEBPACK_IMPORTED_MODULE_5__["default"], { height: 12, width: 12 }))),
10477
+ (modelMapping === null || modelMapping === void 0 ? void 0 : modelMapping.type) === 'fast' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-type-icon" },
10478
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_LightningIcon__WEBPACK_IMPORTED_MODULE_6__["default"], { height: 12, width: 12 })))));
10479
+ })))),
10480
+ isOpen && hoveredModel && react_dom__WEBPACK_IMPORTED_MODULE_1___default().createPortal(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip" },
10481
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-content" },
10482
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-header" },
10483
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-title-row" },
10484
+ 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 }))),
10485
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-title" }, hoveredModel.displayName)),
10486
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata" },
10487
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10488
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Provider:"),
10489
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.provider)),
10490
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10491
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Tokens:"),
10492
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.tokenLimit)),
10493
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10494
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Speed:"),
10495
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.speed)),
10496
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-metadata-item" },
10497
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-label" }, "Complexity:"),
10498
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "model-tooltip-metadata-value" }, hoveredModel.complexityHandling)))),
10499
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-section" },
10500
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "model-tooltip-section-label" }, "Good For:"),
10501
+ 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
10502
  };
10369
10503
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ModelSelector);
10370
10504
 
@@ -10750,6 +10884,31 @@ const AppIcon = () => {
10750
10884
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppIcon);
10751
10885
 
10752
10886
 
10887
+ /***/ }),
10888
+
10889
+ /***/ "./lib/icons/BrainIcon.js":
10890
+ /*!********************************!*\
10891
+ !*** ./lib/icons/BrainIcon.js ***!
10892
+ \********************************/
10893
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10894
+
10895
+ __webpack_require__.r(__webpack_exports__);
10896
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10897
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
10898
+ /* harmony export */ });
10899
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
10900
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
10901
+ /*
10902
+ * Copyright (c) Saga Inc.
10903
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
10904
+ */
10905
+
10906
+ 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" },
10907
+ 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" }),
10908
+ 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" })));
10909
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BrainIcon);
10910
+
10911
+
10753
10912
  /***/ }),
10754
10913
 
10755
10914
  /***/ "./lib/icons/CodeIcon.js":
@@ -10877,6 +11036,30 @@ const ExpandIcon = ({ isExpanded }) => (react__WEBPACK_IMPORTED_MODULE_0___defau
10877
11036
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExpandIcon);
10878
11037
 
10879
11038
 
11039
+ /***/ }),
11040
+
11041
+ /***/ "./lib/icons/LightningIcon.js":
11042
+ /*!************************************!*\
11043
+ !*** ./lib/icons/LightningIcon.js ***!
11044
+ \************************************/
11045
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11046
+
11047
+ __webpack_require__.r(__webpack_exports__);
11048
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11049
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11050
+ /* harmony export */ });
11051
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
11052
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
11053
+ /*
11054
+ * Copyright (c) Saga Inc.
11055
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11056
+ */
11057
+
11058
+ 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" },
11059
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })));
11060
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LightningIcon);
11061
+
11062
+
10880
11063
  /***/ }),
10881
11064
 
10882
11065
  /***/ "./lib/icons/MagicWand.js":
@@ -12726,6 +12909,8 @@ const uploadFileToBackend = async (file, notebookTracker, onFileUploaded) => {
12726
12909
 
12727
12910
  __webpack_require__.r(__webpack_exports__);
12728
12911
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12912
+ /* harmony export */ CLAUDE_HAIKU_DISPLAY_NAME: () => (/* binding */ CLAUDE_HAIKU_DISPLAY_NAME),
12913
+ /* harmony export */ CLAUDE_HAIKU_MODEL_NAME: () => (/* binding */ CLAUDE_HAIKU_MODEL_NAME),
12729
12914
  /* harmony export */ CLAUDE_SONNET_DISPLAY_NAME: () => (/* binding */ CLAUDE_SONNET_DISPLAY_NAME),
12730
12915
  /* harmony export */ CLAUDE_SONNET_MODEL_NAME: () => (/* binding */ CLAUDE_SONNET_MODEL_NAME),
12731
12916
  /* harmony export */ GPT_4_1_DISPLAY_NAME: () => (/* binding */ GPT_4_1_DISPLAY_NAME),
@@ -12735,8 +12920,10 @@ __webpack_require__.r(__webpack_exports__);
12735
12920
  * Copyright (c) Saga Inc.
12736
12921
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
12737
12922
  */
12738
- const CLAUDE_SONNET_DISPLAY_NAME = 'Claude 4.5 Sonnet';
12923
+ const CLAUDE_SONNET_DISPLAY_NAME = 'Claude Sonnet 4.5';
12739
12924
  const CLAUDE_SONNET_MODEL_NAME = 'claude-sonnet-4-5-20250929';
12925
+ const CLAUDE_HAIKU_DISPLAY_NAME = 'Claude Haiku 4.5';
12926
+ const CLAUDE_HAIKU_MODEL_NAME = 'claude-haiku-4-5-20251001';
12740
12927
  const GPT_4_1_DISPLAY_NAME = 'GPT 4.1';
12741
12928
  const GPT_4_1_MODEL_NAME = 'gpt-4.1';
12742
12929
 
@@ -14920,16 +15107,28 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14920
15107
 
14921
15108
  /* apps-list.css */
14922
15109
  .apps-list-container {
14923
- padding: 16px;
15110
+ display: flex;
15111
+ flex-direction: column;
15112
+ height: 100%;
14924
15113
  font-size: 13px;
14925
15114
  font-family: var(--jp-ui-font-family);
15115
+ overflow: hidden;
14926
15116
  }
14927
15117
 
14928
15118
  .apps-list-header {
14929
15119
  display: flex;
14930
15120
  justify-content: space-between;
14931
15121
  align-items: center;
14932
- margin-bottom: 16px;
15122
+ padding: 16px;
15123
+ flex-shrink: 0;
15124
+ border-bottom: 1px solid var(--jp-border-color2);
15125
+ }
15126
+
15127
+ .apps-list-content {
15128
+ flex: 1;
15129
+ overflow-y: auto;
15130
+ padding: 16px;
15131
+ min-height: 0;
14933
15132
  }
14934
15133
 
14935
15134
  .apps-list-title {
@@ -14989,6 +15188,30 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
14989
15188
  margin-top: 8px;
14990
15189
  }
14991
15190
 
15191
+ .apps-list-auth-message {
15192
+ color: var(--jp-ui-font-color1);
15193
+ background-color: var(--jp-layout-color0);
15194
+ border: 1px solid var(--jp-border-color2);
15195
+ border-radius: 4px;
15196
+ padding: 24px 16px;
15197
+ text-align: center;
15198
+ display: flex;
15199
+ flex-direction: column;
15200
+ align-items: center;
15201
+ gap: 12px;
15202
+ }
15203
+
15204
+ .apps-list-auth-text {
15205
+ font-size: 14px;
15206
+ font-weight: bold;
15207
+ font-family: var(--jp-ui-font-family);
15208
+ }
15209
+
15210
+ .apps-list-auth-login-button {
15211
+ font-size: 13px;
15212
+ min-width: 96px;
15213
+ }
15214
+
14992
15215
  .apps-list-empty {
14993
15216
  color: var(--jp-ui-font-color2);
14994
15217
  text-align: center;
@@ -15078,7 +15301,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
15078
15301
  .app-item-copy-button:hover {
15079
15302
  background-color: var(--jp-layout-color2);
15080
15303
  }
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":""}]);
15304
+ `, "",{"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
15305
  // Exports
15083
15306
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15084
15307
 
@@ -17724,6 +17947,25 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17724
17947
  transition: background-color 0.2s;
17725
17948
  white-space: nowrap;
17726
17949
  /* Prevent text wrapping */
17950
+ display: flex;
17951
+ align-items: center;
17952
+ justify-content: space-between;
17953
+ gap: 8px;
17954
+ }
17955
+
17956
+ .model-option-name {
17957
+ flex: 1;
17958
+ min-width: 0;
17959
+ overflow: hidden;
17960
+ text-overflow: ellipsis;
17961
+ }
17962
+
17963
+ .model-type-icon {
17964
+ display: flex;
17965
+ align-items: center;
17966
+ justify-content: center;
17967
+ flex-shrink: 0;
17968
+ opacity: 0.7;
17727
17969
  }
17728
17970
 
17729
17971
  .model-option:hover {
@@ -17787,7 +18029,109 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
17787
18029
  .model-name {
17788
18030
  display: none;
17789
18031
  }
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":""}]);
18032
+ }
18033
+
18034
+ /* Model tooltip - appears to the right of the dropdown, rendered via portal */
18035
+ .model-tooltip {
18036
+ position: fixed;
18037
+ top: var(--tooltip-top, 200px);
18038
+ left: var(--tooltip-left, 200px);
18039
+ background-color: var(--jp-layout-color1);
18040
+ border: 1px solid var(--jp-layout-color2);
18041
+ border-radius: 4px;
18042
+ padding: 12px;
18043
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
18044
+ z-index: 10000; /* High z-index to appear above Jupyter notebook */
18045
+ width: 280px;
18046
+ pointer-events: none; /* Prevent tooltip from blocking mouse events */
18047
+ }
18048
+
18049
+ .model-tooltip-content {
18050
+ display: flex;
18051
+ flex-direction: column;
18052
+ gap: 12px;
18053
+ }
18054
+
18055
+ .model-tooltip-header {
18056
+ display: flex;
18057
+ flex-direction: column;
18058
+ gap: 8px;
18059
+ }
18060
+
18061
+ .model-tooltip-title-row {
18062
+ display: flex;
18063
+ align-items: center;
18064
+ gap: 6px;
18065
+ }
18066
+
18067
+ .model-tooltip-title-icon {
18068
+ flex-shrink: 0;
18069
+ opacity: 0.8;
18070
+ display: flex;
18071
+ align-items: center;
18072
+ justify-content: center;
18073
+ line-height: 1;
18074
+ }
18075
+
18076
+ .model-tooltip-title {
18077
+ font-size: 14px;
18078
+ font-weight: 600;
18079
+ color: var(--jp-content-font-color1);
18080
+ line-height: 1.2;
18081
+ }
18082
+
18083
+ .model-tooltip-metadata {
18084
+ display: grid;
18085
+ grid-template-columns: 1fr 1fr;
18086
+ gap: 6px 12px;
18087
+ font-size: 11px;
18088
+ }
18089
+
18090
+ .model-tooltip-metadata-item {
18091
+ display: flex;
18092
+ gap: 4px;
18093
+ }
18094
+
18095
+ .model-tooltip-metadata-label {
18096
+ color: var(--jp-content-font-color2);
18097
+ font-weight: 500;
18098
+ }
18099
+
18100
+ .model-tooltip-metadata-value {
18101
+ color: var(--jp-content-font-color1);
18102
+ font-weight: 600;
18103
+ }
18104
+
18105
+ .model-tooltip-section {
18106
+ display: flex;
18107
+ flex-direction: column;
18108
+ gap: 6px;
18109
+ }
18110
+
18111
+ .model-tooltip-section-label {
18112
+ font-size: 11px;
18113
+ font-weight: 600;
18114
+ color: var(--jp-content-font-color1);
18115
+ text-transform: uppercase;
18116
+ letter-spacing: 0.5px;
18117
+ }
18118
+
18119
+ .model-tooltip-bullet-list {
18120
+ margin: 0;
18121
+ padding-left: 16px;
18122
+ list-style-type: disc;
18123
+ }
18124
+
18125
+ .model-tooltip-bullet-item {
18126
+ font-size: 12px;
18127
+ color: var(--jp-content-font-color2);
18128
+ line-height: 1.5;
18129
+ margin-bottom: 4px;
18130
+ }
18131
+
18132
+ .model-tooltip-bullet-item:last-child {
18133
+ margin-bottom: 0;
18134
+ }`, "",{"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;EAC1B,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,QAAQ;AACV;;AAEA;EACE,OAAO;EACP,YAAY;EACZ,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,cAAc;EACd,YAAY;AACd;;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;;AAEA,8EAA8E;AAC9E;EACE,eAAe;EACf,8BAA8B;EAC9B,gCAAgC;EAChC,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,yCAAyC;EACzC,cAAc,EAAE,kDAAkD;EAClE,YAAY;EACZ,oBAAoB,EAAE,+CAA+C;AACvE;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;AACV;;AAEA;EACE,cAAc;EACd,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,cAAc;AAChB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,aAAa;EACb,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,oCAAoC;EACpC,yBAAyB;EACzB,qBAAqB;AACvB;;AAEA;EACE,SAAS;EACT,kBAAkB;EAClB,qBAAqB;AACvB;;AAEA;EACE,eAAe;EACf,oCAAoC;EACpC,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB","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
18135
  // Exports
17792
18136
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
17793
18137
 
@@ -21892,4 +22236,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
21892
22236
  /***/ })
21893
22237
 
21894
22238
  }]);
21895
- //# sourceMappingURL=lib_index_js.5ec1e525d244fc8588cf.js.map
22239
+ //# sourceMappingURL=lib_index_js.4b7cd47a24bb24ef84ea.js.map