mito-ai 0.1.41__py3-none-any.whl → 0.1.42__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (54) hide show
  1. mito_ai/__init__.py +7 -0
  2. mito_ai/_version.py +1 -1
  3. mito_ai/app_manager/__init__.py +4 -0
  4. mito_ai/app_manager/handlers.py +129 -0
  5. mito_ai/app_manager/models.py +58 -0
  6. mito_ai/completions/completion_handlers/agent_execution_handler.py +1 -1
  7. mito_ai/completions/completion_handlers/chat_completion_handler.py +2 -2
  8. mito_ai/completions/completion_handlers/utils.py +77 -37
  9. mito_ai/completions/models.py +2 -0
  10. mito_ai/completions/prompt_builders/utils.py +7 -0
  11. mito_ai/tests/completions/completion_handlers_utils_test.py +51 -0
  12. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +100 -100
  13. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  14. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  15. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.01a962c68c8fae380f30.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.a9a35b6fcc54a7bcb32c.js +807 -44
  16. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.a9a35b6fcc54a7bcb32c.js.map +1 -0
  17. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +198 -0
  18. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +1 -0
  19. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.9a70f033717ba8689564.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.c7d9d8635826165de52e.js +23 -23
  20. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.c7d9d8635826165de52e.js.map +1 -0
  21. mito_ai-0.1.42.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 +533 -0
  22. mito_ai-0.1.42.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 +1 -0
  23. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_mjs.16430abf3466c3153f59.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js +2977 -610
  24. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js.map +1 -0
  25. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.61289bff0db44828605b.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +1 -481
  26. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +1 -0
  27. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_core_dist_esm_singleton_apis_fetchAuthSession_mjs-node_modul-758875.dc495fd682071d97070c.js → mito_ai-0.1.42.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 +2 -60
  28. mito_ai-0.1.42.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 +1 -0
  29. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.9795f79265ddb416864b.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +2 -240
  30. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +1 -0
  31. {mito_ai-0.1.41.dist-info → mito_ai-0.1.42.dist-info}/METADATA +1 -1
  32. {mito_ai-0.1.41.dist-info → mito_ai-0.1.42.dist-info}/RECORD +44 -40
  33. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.01a962c68c8fae380f30.js.map +0 -1
  34. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_aws-amplify_core_dist_esm_singleton_apis_fetchAuthSession_mjs.182232e7bc6311fe4528.js +0 -63
  35. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_aws-amplify_core_dist_esm_singleton_apis_fetchAuthSession_mjs.182232e7bc6311fe4528.js.map +0 -1
  36. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.9a70f033717ba8689564.js.map +0 -1
  37. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_mjs.16430abf3466c3153f59.js.map +0 -1
  38. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_core_dist_esm_singleton_Amplify_mjs.3c0035b95fe369aede82.js +0 -2345
  39. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_core_dist_esm_singleton_Amplify_mjs.3c0035b95fe369aede82.js.map +0 -1
  40. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_core_dist_esm_singleton_apis_fetchAuthSession_mjs-node_modul-758875.dc495fd682071d97070c.js.map +0 -1
  41. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.61289bff0db44828605b.js.map +0 -1
  42. mito_ai-0.1.41.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.9795f79265ddb416864b.js.map +0 -1
  43. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  44. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  45. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  46. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  47. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  48. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  49. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  50. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  51. {mito_ai-0.1.41.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  52. {mito_ai-0.1.41.dist-info → mito_ai-0.1.42.dist-info}/WHEEL +0 -0
  53. {mito_ai-0.1.41.dist-info → mito_ai-0.1.42.dist-info}/entry_points.txt +0 -0
  54. {mito_ai-0.1.41.dist-info → mito_ai-0.1.42.dist-info}/licenses/LICENSE +0 -0
@@ -771,7 +771,8 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
771
771
  return option.file.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase());
772
772
  }
773
773
  else if (option.type === 'db') {
774
- return option.variable.value.toLowerCase().includes(effectiveFilterText.toLowerCase());
774
+ return option.variable.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase()) ||
775
+ option.variable.value.toLowerCase().includes(effectiveFilterText.toLowerCase());
775
776
  }
776
777
  else {
777
778
  return option.rule.toLowerCase().includes(effectiveFilterText.toLowerCase());
@@ -997,15 +998,33 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
997
998
  const [dropdownFilter, setDropdownFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
998
999
  const [additionalContext, setAdditionalContext] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
999
1000
  const [isDropdownFromButton, setIsDropdownFromButton] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
1000
- const handleFileUploaded = (fileName) => {
1001
- // Add the uploaded file to the additional context
1002
- setAdditionalContext(prev => [
1003
- ...prev, {
1004
- type: 'file',
1005
- value: fileName,
1006
- display: fileName
1007
- }
1008
- ]);
1001
+ const handleFileUpload = (file) => {
1002
+ if (file.type.startsWith('image/')) {
1003
+ const reader = new FileReader();
1004
+ reader.onload = () => {
1005
+ const base64String = reader.result;
1006
+ const base64Data = base64String.split(',')[1]; // Remove data URL prefix
1007
+ // Add the uploaded file to the additional context
1008
+ setAdditionalContext(prev => [
1009
+ ...prev, {
1010
+ type: file.type || 'image',
1011
+ value: base64Data || '',
1012
+ display: file.name
1013
+ }
1014
+ ]);
1015
+ };
1016
+ reader.readAsDataURL(file);
1017
+ }
1018
+ else {
1019
+ // Add the uploaded file to the additional context
1020
+ setAdditionalContext(prev => [
1021
+ ...prev, {
1022
+ type: 'file',
1023
+ value: file.name,
1024
+ display: file.name
1025
+ }
1026
+ ]);
1027
+ }
1009
1028
  };
1010
1029
  // Debounce the active cell ID change to avoid multiple rerenders.
1011
1030
  // We use this to avoid a flickering screen when the active cell changes.
@@ -1150,15 +1169,32 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1150
1169
  setIsDropdownFromButton(false);
1151
1170
  };
1152
1171
  const mapAdditionalContext = () => {
1153
- return additionalContext.map(context => {
1154
- if (context.type === 'db') {
1155
- return {
1156
- type: context.type,
1157
- value: context.value
1158
- };
1172
+ const result = [];
1173
+ additionalContext.forEach(contextItem => {
1174
+ if (contextItem.type === 'db') {
1175
+ result.push({
1176
+ type: contextItem.type,
1177
+ value: contextItem.value
1178
+ });
1179
+ }
1180
+ else if (contextItem.type.startsWith('image/')) {
1181
+ // If the user uploaded an image, we:
1182
+ // 1. Keep the original context item. This is the base64 encoded image
1183
+ // that will be processed in ChatTaskpane.tsx.
1184
+ // 2. Add a second item to the additionalContext array, which will
1185
+ // have the image's filename, and be used in the prompt.
1186
+ result.push(contextItem);
1187
+ const fileName = contextItem.display || contextItem.value.split('/').pop() || 'image';
1188
+ result.push({
1189
+ type: 'img',
1190
+ value: fileName
1191
+ });
1192
+ }
1193
+ else {
1194
+ result.push(contextItem);
1159
1195
  }
1160
- return context;
1161
1196
  });
1197
+ return result;
1162
1198
  };
1163
1199
  // Update the expandedVariables arr when the variable manager changes
1164
1200
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -1211,7 +1247,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1211
1247
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("chat-input-container") },
1212
1248
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'context-container' },
1213
1249
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_DatabaseButton__WEBPACK_IMPORTED_MODULE_6__["default"], { app: app }),
1214
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AttachFileButton__WEBPACK_IMPORTED_MODULE_7__["default"], { onFileUploaded: handleFileUploaded, notebookTracker: notebookTracker }),
1250
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AttachFileButton__WEBPACK_IMPORTED_MODULE_7__["default"], { onFileUploaded: handleFileUpload, notebookTracker: notebookTracker }),
1215
1251
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "context-button", onClick: () => {
1216
1252
  var _a;
1217
1253
  setDropdownVisible(true);
@@ -1965,6 +2001,7 @@ __webpack_require__.r(__webpack_exports__);
1965
2001
  /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
1966
2002
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
1967
2003
  /* harmony import */ var _utils_waitForNotebookReady__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../utils/waitForNotebookReady */ "./lib/utils/waitForNotebookReady.js");
2004
+ /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
1968
2005
  /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
1969
2006
  /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
1970
2007
  /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
@@ -1977,7 +2014,6 @@ __webpack_require__.r(__webpack_exports__);
1977
2014
  /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
1978
2015
  /* harmony import */ var _style_ChatTaskpane_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/ChatTaskpane.css */ "./style/ChatTaskpane.css");
1979
2016
  /* harmony import */ var _style_TextButton_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../style/TextButton.css */ "./style/TextButton.css");
1980
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
1981
2017
  /*
1982
2018
  * Copyright (c) Saga Inc.
1983
2019
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -2015,6 +2051,7 @@ __webpack_require__.r(__webpack_exports__);
2015
2051
 
2016
2052
 
2017
2053
 
2054
+
2018
2055
  // Internal imports - Chat components
2019
2056
 
2020
2057
 
@@ -2028,7 +2065,6 @@ __webpack_require__.r(__webpack_exports__);
2028
2065
 
2029
2066
 
2030
2067
 
2031
-
2032
2068
  const AGENT_EXECUTION_DEPTH_LIMIT = 20;
2033
2069
  const getDefaultChatHistoryManager = (notebookTracker, contextManager) => {
2034
2070
  const chatHistoryManager = new _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__.ChatHistoryManager(contextManager, notebookTracker);
@@ -2415,6 +2451,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2415
2451
  if (messageIndex !== undefined) {
2416
2452
  agentExecutionMetadata.index = messageIndex;
2417
2453
  }
2454
+ // Extract images from additionalContext and update agentExecutionMetadata
2455
+ additionalContext = (0,_utils__WEBPACK_IMPORTED_MODULE_12__.extractImagesFromContext)(additionalContext, agentExecutionMetadata);
2418
2456
  agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutput)(notebookTracker, sendCellIDOutput);
2419
2457
  setChatHistoryManager(newChatHistoryManager);
2420
2458
  setLoadingAIResponse(true);
@@ -2455,6 +2493,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2455
2493
  if (activeCellOutput !== undefined) {
2456
2494
  chatMessageMetadata.base64EncodedActiveCellOutput = activeCellOutput;
2457
2495
  }
2496
+ // Extract images from additionalContext and update chatMessageMetadata
2497
+ additionalContext = (0,_utils__WEBPACK_IMPORTED_MODULE_12__.extractImagesFromContext)(additionalContext, chatMessageMetadata);
2458
2498
  const completionRequest = {
2459
2499
  type: 'chat',
2460
2500
  message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__.UUID.uuid4(),
@@ -3443,6 +3483,7 @@ const IChatTracker = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('m
3443
3483
 
3444
3484
  __webpack_require__.r(__webpack_exports__);
3445
3485
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3486
+ /* harmony export */ extractImagesFromContext: () => (/* binding */ extractImagesFromContext),
3446
3487
  /* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput)
3447
3488
  /* harmony export */ });
3448
3489
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
@@ -3472,6 +3513,18 @@ const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
3472
3513
  }
3473
3514
  return undefined;
3474
3515
  };
3516
+ const extractImagesFromContext = (additionalContext, metadata) => {
3517
+ // Move any (base64 encoded) images from additionalContext into metadata.
3518
+ // The metadata is used on the backend to "attach" the image to the prompt;
3519
+ // plus the base64 encoded image is too big to include directly in the prompt.
3520
+ additionalContext === null || additionalContext === void 0 ? void 0 : additionalContext.map((context) => {
3521
+ if (context.type.startsWith('image/')) {
3522
+ metadata.base64EncodedUploadedImage = context.value;
3523
+ }
3524
+ });
3525
+ // Remove images from the additionalContext array and return the filtered result.
3526
+ return additionalContext === null || additionalContext === void 0 ? void 0 : additionalContext.filter(c => !c.type.startsWith('image/'));
3527
+ };
3475
3528
 
3476
3529
 
3477
3530
  /***/ }),
@@ -3683,7 +3736,7 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3683
3736
  type: 'build-app',
3684
3737
  message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__.UUID.uuid4(),
3685
3738
  notebook_path: notebookPath,
3686
- jwt_token: jwtToken || appBuilderService.client.serverSettings.token
3739
+ jwt_token: jwtToken
3687
3740
  });
3688
3741
  if (response.error) {
3689
3742
  _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(response.error.title, 'error', {
@@ -3828,9 +3881,11 @@ const AuthPopup = ({ isOpen, onClose, onSuccess }) => {
3828
3881
  __webpack_require__.r(__webpack_exports__);
3829
3882
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3830
3883
  /* harmony export */ getAuthHeaders: () => (/* binding */ getAuthHeaders),
3831
- /* harmony export */ getJWTToken: () => (/* binding */ getJWTToken)
3884
+ /* harmony export */ getJWTToken: () => (/* binding */ getJWTToken),
3885
+ /* harmony export */ logoutAndClearJWTTokens: () => (/* binding */ logoutAndClearJWTTokens)
3832
3886
  /* harmony export */ });
3833
3887
  /* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/core/dist/esm/singleton/apis/fetchAuthSession.mjs");
3888
+ /* harmony import */ var aws_amplify_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aws-amplify/auth */ "./node_modules/@aws-amplify/auth/dist/esm/providers/cognito/apis/signOut.mjs");
3834
3889
  /* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/AppBuilder/aws-config.js");
3835
3890
  /*
3836
3891
  * Copyright (c) Saga Inc.
@@ -3867,6 +3922,35 @@ const getAuthHeaders = async () => {
3867
3922
  }
3868
3923
  return {};
3869
3924
  };
3925
+ /**
3926
+ * Logout user and clear all AWS Amplify/Cognito localStorage items
3927
+ */
3928
+ const logoutAndClearJWTTokens = async () => {
3929
+ try {
3930
+ // Sign out from AWS Cognito using Amplify
3931
+ await (0,aws_amplify_auth__WEBPACK_IMPORTED_MODULE_2__.signOut)();
3932
+ console.log('User logged out successfully');
3933
+ }
3934
+ catch (error) {
3935
+ console.error('Error during logout:', error);
3936
+ throw error;
3937
+ }
3938
+ finally {
3939
+ // Remove all keys that start with common Amplify prefixes
3940
+ const keysToRemove = [];
3941
+ for (let i = 0; i < localStorage.length; i++) {
3942
+ const key = localStorage.key(i);
3943
+ if (key && (key.startsWith('CognitoIdentityServiceProvider.'))) {
3944
+ keysToRemove.push(key);
3945
+ }
3946
+ }
3947
+ // Remove all identified keys
3948
+ keysToRemove.forEach(key => {
3949
+ localStorage.removeItem(key);
3950
+ });
3951
+ console.log('Auth tokens cleared successfully');
3952
+ }
3953
+ };
3870
3954
 
3871
3955
 
3872
3956
  /***/ }),
@@ -4174,6 +4258,312 @@ with tempfile.TemporaryDirectory() as temp_dir:
4174
4258
  };
4175
4259
 
4176
4260
 
4261
+ /***/ }),
4262
+
4263
+ /***/ "./lib/Extensions/AppManager/AppsList.js":
4264
+ /*!***********************************************!*\
4265
+ !*** ./lib/Extensions/AppManager/AppsList.js ***!
4266
+ \***********************************************/
4267
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4268
+
4269
+ __webpack_require__.r(__webpack_exports__);
4270
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4271
+ /* harmony export */ AppsList: () => (/* binding */ AppsList)
4272
+ /* harmony export */ });
4273
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
4274
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
4275
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ "webpack/sharing/consume/default/@jupyterlab/ui-components");
4276
+ /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__);
4277
+ /* harmony import */ var _AppBuilder_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../AppBuilder/auth */ "./lib/Extensions/AppBuilder/auth.js");
4278
+ /* harmony import */ var _ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ListAppsAPI */ "./lib/Extensions/AppManager/ListAppsAPI.js");
4279
+ /* harmony import */ var _style_AppsList_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AppsList.css */ "./style/AppsList.css");
4280
+ /*
4281
+ * Copyright (c) Saga Inc.
4282
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4283
+ */
4284
+ //app-list.tsx
4285
+
4286
+
4287
+
4288
+
4289
+
4290
+ const AppsList = ({ appManagerService }) => {
4291
+ const [apps, setApps] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);
4292
+ const [loading, setLoading] = react__WEBPACK_IMPORTED_MODULE_0__.useState(true);
4293
+ const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);
4294
+ // Fetch apps on component mount
4295
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
4296
+ const loadApps = async () => {
4297
+ try {
4298
+ console.log('[AppsList] Starting to load apps...');
4299
+ setLoading(true);
4300
+ setError(null);
4301
+ console.log('[AppsList] Calling fetchUserApps...');
4302
+ const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.fetchUserApps)(appManagerService);
4303
+ console.log('[AppsList] fetchUserApps response:', response);
4304
+ if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.isGetAppsSuccess)(response)) {
4305
+ setApps(response.apps);
4306
+ }
4307
+ else {
4308
+ setError(response.errorMessage || 'Failed to load apps');
4309
+ setApps([]);
4310
+ }
4311
+ }
4312
+ catch (err) {
4313
+ console.error('[AppsList] Error loading apps:', err);
4314
+ setError(err instanceof Error ? err.message : 'An unexpected error occurred');
4315
+ setApps([]);
4316
+ }
4317
+ finally {
4318
+ setLoading(false);
4319
+ }
4320
+ };
4321
+ console.log('[AppsList] Component mounted, calling loadApps...');
4322
+ void loadApps();
4323
+ }, [appManagerService]);
4324
+ const refreshApps = async () => {
4325
+ const response = await (0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.fetchUserApps)(appManagerService);
4326
+ if ((0,_ListAppsAPI__WEBPACK_IMPORTED_MODULE_3__.isGetAppsSuccess)(response)) {
4327
+ setApps(response.apps);
4328
+ setError(null);
4329
+ }
4330
+ else {
4331
+ setError(response.errorMessage || 'Failed to refresh apps');
4332
+ }
4333
+ };
4334
+ const copyToClipboard = async (url, appName) => {
4335
+ try {
4336
+ await navigator.clipboard.writeText(url);
4337
+ console.log(`Copied URL for ${appName}: ${url}`);
4338
+ }
4339
+ catch (err) {
4340
+ console.error('Failed to copy URL:', err);
4341
+ // Fallback for older browsers
4342
+ const textArea = document.createElement('textarea');
4343
+ textArea.value = url;
4344
+ document.body.appendChild(textArea);
4345
+ textArea.select();
4346
+ document.execCommand('copy');
4347
+ document.body.removeChild(textArea);
4348
+ }
4349
+ };
4350
+ const getStatusColor = (status) => {
4351
+ switch (status) {
4352
+ case 'active':
4353
+ return '#4caf50';
4354
+ case 'error':
4355
+ return '#f44336';
4356
+ case 'deploying':
4357
+ return '#2196f3';
4358
+ case 'shut down':
4359
+ return '#9e9e9e';
4360
+ default:
4361
+ return '#9e9e9e';
4362
+ }
4363
+ };
4364
+ const getStatusText = (status) => {
4365
+ return status.charAt(0).toUpperCase() + status.slice(1);
4366
+ };
4367
+ return (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-container" },
4368
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-header" },
4369
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("h3", { className: "apps-list-title" }, "Your Apps"),
4370
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-actions" },
4371
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: refreshApps, disabled: loading, className: "apps-list-button", title: "Refresh apps" }, loading ? 'Loading...' : 'Refresh'),
4372
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => {
4373
+ console.log('Logout clicked');
4374
+ void (0,_AppBuilder_auth__WEBPACK_IMPORTED_MODULE_4__.logoutAndClearJWTTokens)();
4375
+ }, className: "apps-list-button", title: "Logout" }, "Logout"))),
4376
+ 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" },
4377
+ "Error: ",
4378
+ error,
4379
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "apps-list-error-actions" },
4380
+ 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" },
4381
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-header" },
4382
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-content" },
4383
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-name" }, app.name),
4384
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-status-container" },
4385
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("span", { className: "app-item-status-indicator", style: { backgroundColor: getStatusColor(app.status) } }),
4386
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("span", { className: "app-item-status-text" }, getStatusText(app.status))),
4387
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-created" },
4388
+ "Created: ",
4389
+ app.createdAt))),
4390
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url-container" },
4391
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: "app-item-url" }, app.url),
4392
+ react__WEBPACK_IMPORTED_MODULE_0__.createElement("button", { onClick: () => copyToClipboard(app.url, app.name), className: "app-item-copy-button", title: `Copy URL for ${app.name}` },
4393
+ 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)" }))))))))));
4394
+ };
4395
+
4396
+
4397
+ /***/ }),
4398
+
4399
+ /***/ "./lib/Extensions/AppManager/ListAppsAPI.js":
4400
+ /*!**************************************************!*\
4401
+ !*** ./lib/Extensions/AppManager/ListAppsAPI.js ***!
4402
+ \**************************************************/
4403
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4404
+
4405
+ __webpack_require__.r(__webpack_exports__);
4406
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4407
+ /* harmony export */ fetchUserApps: () => (/* binding */ fetchUserApps),
4408
+ /* harmony export */ isGetAppsFailure: () => (/* binding */ isGetAppsFailure),
4409
+ /* harmony export */ isGetAppsSuccess: () => (/* binding */ isGetAppsSuccess)
4410
+ /* harmony export */ });
4411
+ /* harmony import */ var _AppBuilder_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../AppBuilder/auth */ "./lib/Extensions/AppBuilder/auth.js");
4412
+ /*
4413
+ * Copyright (c) Saga Inc.
4414
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4415
+ */
4416
+
4417
+ // Type guards for working with the discriminated union
4418
+ const isGetAppsSuccess = (response) => {
4419
+ return response.success === true;
4420
+ };
4421
+ const isGetAppsFailure = (response) => {
4422
+ return response.success === false;
4423
+ };
4424
+ const fetchUserApps = async (appManagerService) => {
4425
+ try {
4426
+ const jwtToken = await (0,_AppBuilder_auth__WEBPACK_IMPORTED_MODULE_0__.getJWTToken)();
4427
+ if (!jwtToken) {
4428
+ return {
4429
+ success: false,
4430
+ errorMessage: 'User not authenticated'
4431
+ };
4432
+ }
4433
+ // Create the request message with proper typing
4434
+ const request = {
4435
+ type: 'manage-app',
4436
+ jwt_token: jwtToken
4437
+ };
4438
+ // Using websocket service with correct message structure and proper typing
4439
+ const response = await appManagerService.client.sendMessage(request);
4440
+ // Check if the response indicates an error
4441
+ if (response.error) {
4442
+ return {
4443
+ success: false,
4444
+ errorMessage: response.error.title || 'Failed to fetch apps'
4445
+ };
4446
+ }
4447
+ // Transform the response to match expected format
4448
+ const apps = (response.apps || []).map(app => {
4449
+ var _a;
4450
+ return ({
4451
+ name: app.app_name,
4452
+ url: app.url,
4453
+ status: (_a = app.status) === null || _a === void 0 ? void 0 : _a.toLowerCase(),
4454
+ createdAt: app.created_at
4455
+ });
4456
+ });
4457
+ return {
4458
+ success: true,
4459
+ apps
4460
+ };
4461
+ }
4462
+ catch (error) {
4463
+ console.error('Error fetching apps:', error);
4464
+ return {
4465
+ success: false,
4466
+ errorMessage: error instanceof Error ? error.message : 'Failed to fetch apps'
4467
+ };
4468
+ }
4469
+ };
4470
+
4471
+
4472
+ /***/ }),
4473
+
4474
+ /***/ "./lib/Extensions/AppManager/ManageAppsPlugin.js":
4475
+ /*!*******************************************************!*\
4476
+ !*** ./lib/Extensions/AppManager/ManageAppsPlugin.js ***!
4477
+ \*******************************************************/
4478
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4479
+
4480
+ __webpack_require__.r(__webpack_exports__);
4481
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4482
+ /* harmony export */ IAppManagerService: () => (/* binding */ IAppManagerService),
4483
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4484
+ /* harmony export */ });
4485
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
4486
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);
4487
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
4488
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
4489
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
4490
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
4491
+ /* harmony import */ var _AppsList__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AppsList */ "./lib/Extensions/AppManager/AppsList.js");
4492
+ /* harmony import */ var _websockets_appManager_appManagerWebsocketClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../websockets/appManager/appManagerWebsocketClient */ "./lib/websockets/appManager/appManagerWebsocketClient.js");
4493
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
4494
+ /*
4495
+ * Copyright (c) Saga Inc.
4496
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4497
+ */
4498
+
4499
+
4500
+
4501
+
4502
+
4503
+
4504
+ /**
4505
+ * The token for the AppManager service.
4506
+ */
4507
+ const IAppManagerService = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IAppManagerService', 'Token for the AppManager service that provides access to the websocket client');
4508
+ /**
4509
+ * Implementation of the AppManager service.
4510
+ */
4511
+ class AppManagerService {
4512
+ /**
4513
+ * Create a new AppManager service.
4514
+ */
4515
+ constructor(app) {
4516
+ // Create the websocket client with the app's server settings
4517
+ this.client = new _websockets_appManager_appManagerWebsocketClient__WEBPACK_IMPORTED_MODULE_3__.AppManagerWebsocketClient({
4518
+ serverSettings: app.serviceManager.serverSettings
4519
+ });
4520
+ // Initialize the websocket connection in the background
4521
+ void this.client.initialize().catch(error => {
4522
+ console.error('Failed to initialize AppManager websocket client:', error);
4523
+ // We don't need to throw the error since the client will attempt to reconnect when used
4524
+ });
4525
+ }
4526
+ }
4527
+ class ManageAppsWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.ReactWidget {
4528
+ constructor(appManagerService) {
4529
+ super();
4530
+ this._appManagerService = appManagerService;
4531
+ }
4532
+ render() {
4533
+ // Pass the appManagerService as a prop to the AppsList component
4534
+ return react__WEBPACK_IMPORTED_MODULE_2__.createElement(_AppsList__WEBPACK_IMPORTED_MODULE_4__.AppsList, {
4535
+ appManagerService: this._appManagerService
4536
+ });
4537
+ }
4538
+ }
4539
+ const ManageAppsPlugin = {
4540
+ id: 'manage-apps:manage-app-plugin',
4541
+ autoStart: true,
4542
+ provides: IAppManagerService,
4543
+ activate: (app) => {
4544
+ console.log('ManageApps plugin activated');
4545
+ // Create the AppManager service
4546
+ const appManagerService = new AppManagerService(app);
4547
+ // Create and add the ManageApps widget
4548
+ const widget = new ManageAppsWidget(appManagerService);
4549
+ widget.title.label = 'Manage apps';
4550
+ widget.id = 'manage-apps-widget';
4551
+ // For now, only show the manage apps widget if beta mode is enabled
4552
+ (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_5__.getSetting)('beta_mode').then(value => {
4553
+ if (value === 'true') {
4554
+ // Add to right sidebar
4555
+ app.shell.add(widget, 'right');
4556
+ }
4557
+ }).catch(error => {
4558
+ console.error('Error checking beta mode:', error);
4559
+ });
4560
+ // Return the service so other plugins can use it
4561
+ return appManagerService;
4562
+ }
4563
+ };
4564
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ManageAppsPlugin);
4565
+
4566
+
4177
4567
  /***/ }),
4178
4568
 
4179
4569
  /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
@@ -7078,7 +7468,7 @@ const AttachFileButton = ({ onFileUploaded, notebookTracker }) => {
7078
7468
  }
7079
7469
  console.log(`Successfully uploaded all ${totalChunks} chunks for file: ${file.name}`);
7080
7470
  // Notify the parent component that the file was uploaded
7081
- onFileUploaded(file.name);
7471
+ onFileUploaded(file);
7082
7472
  };
7083
7473
  const uploadChunk = async (chunk, filename, chunkNumber, totalChunks, notebookDir) => {
7084
7474
  try {
@@ -7148,7 +7538,7 @@ const AttachFileButton = ({ onFileUploaded, notebookTracker }) => {
7148
7538
  console.log('File uploaded successfully:', resp.data);
7149
7539
  // Notify the parent component that the file was uploaded,
7150
7540
  // which will update the context manager.
7151
- onFileUploaded(file.name);
7541
+ onFileUploaded(file);
7152
7542
  }
7153
7543
  };
7154
7544
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { position: 'relative' } },
@@ -7575,9 +7965,10 @@ __webpack_require__.r(__webpack_exports__);
7575
7965
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7576
7966
  /* harmony import */ var _style_SelectedContextContainer_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../style/SelectedContextContainer.css */ "./style/SelectedContextContainer.css");
7577
7967
  /* harmony import */ var _icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/RuleIcon */ "./lib/icons/RuleIcon.js");
7578
- /* harmony import */ var _icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/CodeIcon */ "./lib/icons/CodeIcon.js");
7579
- /* harmony import */ var _icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/DatabaseIcon */ "./lib/icons/DatabaseIcon.js");
7580
- /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/notebook */ "./lib/utils/notebook.js");
7968
+ /* harmony import */ var _icons_CodeIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/CodeIcon */ "./lib/icons/CodeIcon.js");
7969
+ /* harmony import */ var _icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/DatabaseIcon */ "./lib/icons/DatabaseIcon.js");
7970
+ /* harmony import */ var _icons_PhotoIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/PhotoIcon */ "./lib/icons/PhotoIcon.js");
7971
+ /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/notebook */ "./lib/utils/notebook.js");
7581
7972
  /*
7582
7973
  * Copyright (c) Saga Inc.
7583
7974
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -7588,22 +7979,24 @@ __webpack_require__.r(__webpack_exports__);
7588
7979
 
7589
7980
 
7590
7981
 
7982
+
7591
7983
  const SelectedContextContainer = ({ title, type, onRemove, onClick, notebookTracker, activeCellID }) => {
7592
7984
  const [isHovered, setIsHovered] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7593
7985
  let icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null);
7594
- switch (type) {
7595
- case 'rule':
7596
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null);
7597
- break;
7598
- case 'variable':
7599
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null);
7600
- break;
7601
- case 'db':
7602
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null);
7603
- break;
7604
- case 'active_cell':
7605
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null);
7606
- break;
7986
+ if (type.startsWith('image/')) {
7987
+ icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_PhotoIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null);
7988
+ }
7989
+ else if (type === 'rule') {
7990
+ icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null);
7991
+ }
7992
+ else if (type === 'variable') {
7993
+ icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null);
7994
+ }
7995
+ else if (type === 'db') {
7996
+ icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_5__["default"], null);
7997
+ }
7998
+ else if (type === 'active_cell') {
7999
+ icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null);
7607
8000
  }
7608
8001
  const handleClick = () => {
7609
8002
  var _a;
@@ -7611,13 +8004,13 @@ const SelectedContextContainer = ({ title, type, onRemove, onClick, notebookTrac
7611
8004
  // Handle active cell context click
7612
8005
  if (notebookTracker && activeCellID) {
7613
8006
  // Find the cell
7614
- const cell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_5__.getCellByID)(notebookTracker, activeCellID);
8007
+ const cell = (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_6__.getCellByID)(notebookTracker, activeCellID);
7615
8008
  if (cell) {
7616
8009
  // Scroll to the cell
7617
8010
  void ((_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content.scrollToCell(cell, 'center'));
7618
8011
  // Highlight the cell
7619
8012
  setTimeout(() => {
7620
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_5__.highlightCodeCell)(notebookTracker, activeCellID);
8013
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_6__.highlightCodeCell)(notebookTracker, activeCellID);
7621
8014
  }, 500);
7622
8015
  }
7623
8016
  }
@@ -8185,6 +8578,33 @@ const PencilIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createEle
8185
8578
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PencilIcon);
8186
8579
 
8187
8580
 
8581
+ /***/ }),
8582
+
8583
+ /***/ "./lib/icons/PhotoIcon.js":
8584
+ /*!********************************!*\
8585
+ !*** ./lib/icons/PhotoIcon.js ***!
8586
+ \********************************/
8587
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8588
+
8589
+ __webpack_require__.r(__webpack_exports__);
8590
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8591
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
8592
+ /* harmony export */ });
8593
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8594
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8595
+ /*
8596
+ * Copyright (c) Saga Inc.
8597
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8598
+ */
8599
+
8600
+ const PhotoIcon = () => {
8601
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: "14", height: "14", viewBox: "0 0 98 76", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
8602
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", { fill: "currentColor" },
8603
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M14.85 0.129997H83.15C91.32 0.129997 98 6.82 98 14.98V61.02C98 69.18 91.32 75.87 83.15 75.87H14.85C6.68 75.87 0 69.18 0 61.02V14.98C0 6.82 6.68 0.129997 14.85 0.129997ZM70.01 11.03C74.21 11.03 77.61 14.43 77.61 18.63C77.61 22.83 74.21 26.24 70.01 26.24C65.81 26.24 62.4 22.83 62.4 18.63C62.4 14.43 65.81 11.03 70.01 11.03ZM21.03 52.61L38.48 24.28C39.94 22.6 43.25 22.6 44.71 24.28L56.04 42.66L60.53 35.37C61.57 34.17 63.92 34.17 64.96 35.37L77.35 55.49C79.69 59.29 77.22 63.95 73.08 63.95C57.73 63.95 42.38 63.95 27.03 63.95C21.14 63.95 17.73 57.96 21.03 52.61Z" }))));
8604
+ };
8605
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PhotoIcon);
8606
+
8607
+
8188
8608
  /***/ }),
8189
8609
 
8190
8610
  /***/ "./lib/icons/PlayButtonIcon.js":
@@ -8365,6 +8785,7 @@ __webpack_require__.r(__webpack_exports__);
8365
8785
  /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
8366
8786
  /* harmony import */ var _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Extensions/VersionCheck */ "./lib/Extensions/VersionCheck/index.js");
8367
8787
  /* harmony import */ var _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Extensions/NotebookFooter */ "./lib/Extensions/NotebookFooter/index.js");
8788
+ /* harmony import */ var _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Extensions/AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
8368
8789
  /*
8369
8790
  * Copyright (c) Saga Inc.
8370
8791
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -8380,6 +8801,7 @@ __webpack_require__.r(__webpack_exports__);
8380
8801
 
8381
8802
 
8382
8803
 
8804
+
8383
8805
  // This is the main entry point to the mito-ai extension. It must export all of the top level
8384
8806
  // extensions that we want to load.
8385
8807
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([
@@ -8393,7 +8815,8 @@ __webpack_require__.r(__webpack_exports__);
8393
8815
  _Extensions_status__WEBPACK_IMPORTED_MODULE_7__.statusItem,
8394
8816
  _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__["default"],
8395
8817
  _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__.versionCheckPlugin,
8396
- _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"]
8818
+ _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"],
8819
+ _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__["default"]
8397
8820
  ]);
8398
8821
 
8399
8822
 
@@ -10748,6 +11171,101 @@ class AppBuilderWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
10748
11171
  }
10749
11172
 
10750
11173
 
11174
+ /***/ }),
11175
+
11176
+ /***/ "./lib/websockets/appManager/appManagerWebsocketClient.js":
11177
+ /*!****************************************************************!*\
11178
+ !*** ./lib/websockets/appManager/appManagerWebsocketClient.js ***!
11179
+ \****************************************************************/
11180
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11181
+
11182
+ __webpack_require__.r(__webpack_exports__);
11183
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11184
+ /* harmony export */ AppManagerWebsocketClient: () => (/* binding */ AppManagerWebsocketClient)
11185
+ /* harmony export */ });
11186
+ /* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
11187
+ /*
11188
+ * Copyright (c) Saga Inc.
11189
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11190
+ */
11191
+
11192
+ /**
11193
+ * Mito AI app manager client
11194
+ *
11195
+ * It communicates with the backend over a WebSocket for app managing functionality.
11196
+ */
11197
+ class AppManagerWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
11198
+ /**
11199
+ * Create a new app manager client.
11200
+ */
11201
+ constructor(options = {}) {
11202
+ super(options);
11203
+ /**
11204
+ * The service URL for the websocket endpoint.
11205
+ */
11206
+ this.SERVICE_URL = 'mito-ai/app-manager';
11207
+ }
11208
+ /**
11209
+ * App manager messages stream.
11210
+ */
11211
+ get messages() {
11212
+ return this._messages;
11213
+ }
11214
+ /**
11215
+ * Stream of connection status events
11216
+ */
11217
+ get connectionStatus() {
11218
+ return this._connectionStatus;
11219
+ }
11220
+ /**
11221
+ * Get message ID from request (required by BaseWebsocketClient)
11222
+ */
11223
+ getMessageId(request) {
11224
+ return `${request.type}_${Date.now()}_${Math.random().toString(36).substring(7)}`;
11225
+ }
11226
+ /**
11227
+ * Process a message received from the websocket.
11228
+ * Routes responses to the appropriate pending requests.
11229
+ */
11230
+ _onMessage(message) {
11231
+ // Emit the message to stream listeners
11232
+ this._messages.emit(message);
11233
+ // Determine which pending request this message belongs to
11234
+ let pendingId = null;
11235
+ let pendingReply = null;
11236
+ const messageId = message.message_id;
11237
+ // First, try to match by message_id
11238
+ if (messageId && this._pendingRepliesMap.has(messageId)) {
11239
+ pendingId = messageId;
11240
+ pendingReply = this._pendingRepliesMap.get(messageId);
11241
+ }
11242
+ // If no message_id, check if this is a response to a single pending request
11243
+ else if (this._pendingRepliesMap.size === 1 && !messageId) {
11244
+ const entries = Array.from(this._pendingRepliesMap.entries());
11245
+ if (entries.length > 0) {
11246
+ const entry = entries[0];
11247
+ if (entry) {
11248
+ pendingId = entry[0];
11249
+ pendingReply = entry[1];
11250
+ }
11251
+ }
11252
+ }
11253
+ // Guard clause - exit if we couldn't find a matching pending request
11254
+ if (!pendingId || !pendingReply) {
11255
+ return;
11256
+ }
11257
+ // Common cleanup and resolution logic
11258
+ this._pendingRepliesMap.delete(pendingId);
11259
+ if (message.error) {
11260
+ pendingReply.reject(new Error(message.error.title || 'Server error'));
11261
+ }
11262
+ else {
11263
+ pendingReply.resolve(message);
11264
+ }
11265
+ }
11266
+ }
11267
+
11268
+
10751
11269
  /***/ }),
10752
11270
 
10753
11271
  /***/ "./lib/websockets/completions/CompletionsWebsocketClient.js":
@@ -11195,6 +11713,197 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
11195
11713
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11196
11714
 
11197
11715
 
11716
+ /***/ }),
11717
+
11718
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AppsList.css":
11719
+ /*!******************************************************************!*\
11720
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AppsList.css ***!
11721
+ \******************************************************************/
11722
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
11723
+
11724
+ __webpack_require__.r(__webpack_exports__);
11725
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11726
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11727
+ /* harmony export */ });
11728
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
11729
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
11730
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
11731
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
11732
+ // Imports
11733
+
11734
+
11735
+ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
11736
+ // Module
11737
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
11738
+ * Copyright (c) Saga Inc.
11739
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11740
+ */
11741
+
11742
+ /* apps-list.css */
11743
+ .apps-list-container {
11744
+ padding: 16px;
11745
+ font-size: 13px;
11746
+ font-family: var(--jp-ui-font-family);
11747
+ }
11748
+
11749
+ .apps-list-header {
11750
+ display: flex;
11751
+ justify-content: space-between;
11752
+ align-items: center;
11753
+ margin-bottom: 16px;
11754
+ }
11755
+
11756
+ .apps-list-title {
11757
+ margin: 0;
11758
+ font-size: 14px;
11759
+ font-weight: bold;
11760
+ color: var(--jp-ui-font-color1);
11761
+ }
11762
+
11763
+ .apps-list-actions {
11764
+ display: flex;
11765
+ gap: 8px;
11766
+ }
11767
+
11768
+ .apps-list-button {
11769
+ padding: 4px 8px;
11770
+ font-size: 11px;
11771
+ background-color: transparent;
11772
+ color: var(--jp-ui-font-color2);
11773
+ border: 1px solid var(--jp-border-color2);
11774
+ border-radius: 3px;
11775
+ cursor: pointer;
11776
+ font-weight: normal;
11777
+ transition: background-color 0.2s ease;
11778
+ }
11779
+
11780
+ .apps-list-button:hover {
11781
+ background-color: var(--jp-layout-color2);
11782
+ }
11783
+
11784
+ .apps-list-button:disabled {
11785
+ cursor: not-allowed;
11786
+ }
11787
+
11788
+ .apps-list-button.primary {
11789
+ background-color: var(--jp-brand-color1);
11790
+ color: white;
11791
+ border: none;
11792
+ }
11793
+
11794
+ .apps-list-loading {
11795
+ color: var(--jp-ui-font-color2);
11796
+ text-align: center;
11797
+ padding: 20px 0;
11798
+ }
11799
+
11800
+ .apps-list-error {
11801
+ color: #f44336;
11802
+ text-align: center;
11803
+ padding: 20px 0;
11804
+ background-color: var(--jp-layout-color1);
11805
+ border: 1px solid #f44336;
11806
+ border-radius: 4px;
11807
+ }
11808
+
11809
+ .apps-list-error-actions {
11810
+ margin-top: 8px;
11811
+ }
11812
+
11813
+ .apps-list-empty {
11814
+ color: var(--jp-ui-font-color2);
11815
+ text-align: center;
11816
+ padding: 20px 0;
11817
+ }
11818
+
11819
+ .app-item {
11820
+ border: 1px solid var(--jp-border-color1);
11821
+ border-radius: 4px;
11822
+ padding: 12px;
11823
+ margin-bottom: 8px;
11824
+ background-color: var(--jp-layout-color0);
11825
+ }
11826
+
11827
+ .app-item-header {
11828
+ display: flex;
11829
+ justify-content: space-between;
11830
+ align-items: flex-start;
11831
+ margin-bottom: 8px;
11832
+ }
11833
+
11834
+ .app-item-content {
11835
+ flex: 1;
11836
+ }
11837
+
11838
+ .app-item-name {
11839
+ font-weight: bold;
11840
+ color: var(--jp-ui-font-color1);
11841
+ margin-bottom: 4px;
11842
+ }
11843
+
11844
+ .app-item-status-container {
11845
+ display: flex;
11846
+ align-items: center;
11847
+ margin-bottom: 4px;
11848
+ }
11849
+
11850
+ .app-item-status-indicator {
11851
+ display: inline-block;
11852
+ width: 8px;
11853
+ height: 8px;
11854
+ border-radius: 50%;
11855
+ margin-right: 6px;
11856
+ }
11857
+
11858
+ .app-item-status-text {
11859
+ color: var(--jp-ui-font-color2);
11860
+ font-size: 12px;
11861
+ }
11862
+
11863
+ .app-item-created {
11864
+ color: var(--jp-ui-font-color2);
11865
+ font-size: 11px;
11866
+ }
11867
+
11868
+ .app-item-url-container {
11869
+ display: flex;
11870
+ align-items: center;
11871
+ background-color: var(--jp-layout-color1);
11872
+ border: 1px solid var(--jp-border-color2);
11873
+ border-radius: 3px;
11874
+ padding: 6px 8px;
11875
+ }
11876
+
11877
+ .app-item-url {
11878
+ flex: 1;
11879
+ color: var(--jp-ui-font-color1);
11880
+ font-size: 11px;
11881
+ overflow: hidden;
11882
+ text-overflow: ellipsis;
11883
+ white-space: nowrap;
11884
+ font-family: var(--jp-code-font-family);
11885
+ }
11886
+
11887
+ .app-item-copy-button {
11888
+ border: none;
11889
+ background: transparent;
11890
+ cursor: pointer;
11891
+ padding: 2px;
11892
+ display: flex;
11893
+ align-items: center;
11894
+ justify-content: center;
11895
+ margin-left: 8px;
11896
+ border-radius: 2px;
11897
+ }
11898
+
11899
+ .app-item-copy-button:hover {
11900
+ background-color: var(--jp-layout-color2);
11901
+ }
11902
+ `, "",{"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-created {\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":""}]);
11903
+ // Exports
11904
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11905
+
11906
+
11198
11907
  /***/ }),
11199
11908
 
11200
11909
  /***/ "./node_modules/css-loader/dist/cjs.js!./style/AssumptionTool.css":
@@ -15157,6 +15866,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
15157
15866
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AlertBlock_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AlertBlock_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AlertBlock_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
15158
15867
 
15159
15868
 
15869
+ /***/ }),
15870
+
15871
+ /***/ "./style/AppsList.css":
15872
+ /*!****************************!*\
15873
+ !*** ./style/AppsList.css ***!
15874
+ \****************************/
15875
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15876
+
15877
+ __webpack_require__.r(__webpack_exports__);
15878
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15879
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15880
+ /* harmony export */ });
15881
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
15882
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
15883
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
15884
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
15885
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
15886
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
15887
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
15888
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
15889
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
15890
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
15891
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
15892
+ /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
15893
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AppsList_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AppsList.css */ "./node_modules/css-loader/dist/cjs.js!./style/AppsList.css");
15894
+
15895
+
15896
+
15897
+
15898
+
15899
+
15900
+
15901
+
15902
+
15903
+
15904
+
15905
+ var options = {};
15906
+
15907
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
15908
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
15909
+
15910
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
15911
+
15912
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
15913
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
15914
+
15915
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AppsList_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
15916
+
15917
+
15918
+
15919
+
15920
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AppsList_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AppsList_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AppsList_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
15921
+
15922
+
15160
15923
  /***/ }),
15161
15924
 
15162
15925
  /***/ "./style/AssumptionTool.css":
@@ -16672,4 +17435,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
16672
17435
  /***/ })
16673
17436
 
16674
17437
  }]);
16675
- //# sourceMappingURL=lib_index_js.01a962c68c8fae380f30.js.map
17438
+ //# sourceMappingURL=lib_index_js.a9a35b6fcc54a7bcb32c.js.map