mito-ai 0.1.40__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 (64) hide show
  1. mito_ai/__init__.py +19 -6
  2. mito_ai/_version.py +1 -1
  3. mito_ai/app_builder/handlers.py +1 -2
  4. mito_ai/app_manager/__init__.py +4 -0
  5. mito_ai/app_manager/handlers.py +129 -0
  6. mito_ai/app_manager/models.py +58 -0
  7. mito_ai/completions/completion_handlers/agent_execution_handler.py +1 -1
  8. mito_ai/completions/completion_handlers/chat_completion_handler.py +2 -2
  9. mito_ai/completions/completion_handlers/utils.py +77 -37
  10. mito_ai/completions/handlers.py +1 -1
  11. mito_ai/completions/message_history.py +9 -1
  12. mito_ai/completions/models.py +3 -1
  13. mito_ai/completions/prompt_builders/agent_execution_prompt.py +2 -0
  14. mito_ai/completions/prompt_builders/agent_smart_debug_prompt.py +8 -0
  15. mito_ai/completions/prompt_builders/agent_system_message.py +17 -0
  16. mito_ai/completions/prompt_builders/utils.py +7 -0
  17. mito_ai/constants.py +3 -2
  18. mito_ai/file_uploads/__init__.py +3 -0
  19. mito_ai/file_uploads/handlers.py +225 -0
  20. mito_ai/file_uploads/urls.py +21 -0
  21. mito_ai/openai_client.py +1 -1
  22. mito_ai/tests/completions/completion_handlers_utils_test.py +51 -0
  23. mito_ai/tests/file_uploads/__init__.py +2 -0
  24. mito_ai/tests/file_uploads/test_handlers.py +267 -0
  25. mito_ai/tests/message_history/test_message_history_utils.py +57 -4
  26. mito_ai/utils/mito_server_utils.py +7 -0
  27. mito_ai/utils/server_limits.py +1 -1
  28. mito_ai/utils/telemetry_utils.py +26 -9
  29. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +102 -100
  30. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/package.json +4 -2
  31. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +3 -1
  32. mito_ai-0.1.40.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.55d9f8ca386d87856d2d.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.a9a35b6fcc54a7bcb32c.js +2662 -1144
  33. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.a9a35b6fcc54a7bcb32c.js.map +1 -0
  34. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +198 -0
  35. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +1 -0
  36. mito_ai-0.1.40.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.264103d9addd1e166113.js → mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.c7d9d8635826165de52e.js +50 -26
  37. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.c7d9d8635826165de52e.js.map +1 -0
  38. 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
  39. 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
  40. 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 +6941 -0
  41. 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
  42. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +1021 -0
  43. 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 +1 -0
  44. 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 +59698 -0
  45. 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
  46. 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 +7440 -0
  47. 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
  48. mito_ai-0.1.40.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
  49. mito_ai-0.1.42.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +1 -0
  50. {mito_ai-0.1.40.dist-info → mito_ai-0.1.42.dist-info}/METADATA +1 -1
  51. {mito_ai-0.1.40.dist-info → mito_ai-0.1.42.dist-info}/RECORD +61 -40
  52. mito_ai-0.1.40.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.55d9f8ca386d87856d2d.js.map +0 -1
  53. mito_ai-0.1.40.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.264103d9addd1e166113.js.map +0 -1
  54. mito_ai-0.1.40.data/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.9795f79265ddb416864b.js.map +0 -1
  55. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  56. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  57. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  58. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js +0 -0
  59. {mito_ai-0.1.40.data → mito_ai-0.1.42.data}/data/share/jupyter/labextensions/mito_ai/static/style_index_js.5876024bb17dbd6a3ee6.js.map +0 -0
  60. {mito_ai-0.1.40.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
  61. {mito_ai-0.1.40.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
  62. {mito_ai-0.1.40.dist-info → mito_ai-0.1.42.dist-info}/WHEEL +0 -0
  63. {mito_ai-0.1.40.dist-info → mito_ai-0.1.42.dist-info}/entry_points.txt +0 -0
  64. {mito_ai-0.1.40.dist-info → mito_ai-0.1.42.dist-info}/licenses/LICENSE +0 -0
@@ -140,6 +140,7 @@ const AiChatPlugin = {
140
140
  });
141
141
  // Update jupyter settings to work best with mito-ai
142
142
  void (0,_jupyterSettingsManager__WEBPACK_IMPORTED_MODULE_10__.setRenameUntitledFileOnSave)(settingRegistry, documentManager);
143
+ void (0,_jupyterSettingsManager__WEBPACK_IMPORTED_MODULE_10__.setDefaultWindowingMode)(settingRegistry);
143
144
  // By returning a tracker token, we can require the token in other
144
145
  // plugins. This allows us to force plugin load order. For example,
145
146
  // we can ensure that the COMMAND_MITO_AI_OPEN_CHAT is created
@@ -523,10 +524,10 @@ __webpack_require__.r(__webpack_exports__);
523
524
  /* harmony export */ });
524
525
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
525
526
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
526
- /* harmony import */ var _components_TextButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../components/TextButton */ "./lib/components/TextButton.js");
527
- /* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/errors */ "./lib/utils/errors.js");
527
+ /* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/errors */ "./lib/utils/errors.js");
528
528
  /* harmony import */ var _utils_stripe__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/stripe */ "./lib/utils/stripe.js");
529
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
529
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
530
+ /* harmony import */ var _style_AlertBlock_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../style/AlertBlock.css */ "./style/AlertBlock.css");
530
531
  /*
531
532
  * Copyright (c) Saga Inc.
532
533
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -536,26 +537,56 @@ __webpack_require__.r(__webpack_exports__);
536
537
 
537
538
 
538
539
 
540
+ // Add calendly link constant
541
+ const CALENDLY_LINK = 'https://calendly.com/jake_from_mito/mito-meeting';
539
542
  const AlertBlock = ({ content, mitoAIConnectionErrorType }) => {
540
543
  const [showEmailDetails, setShowEmailDetails] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
541
544
  // The first time this AlertBlock is rendered, log the error type
542
545
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
543
- void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.logEvent)('alert_block_displayed', { 'type': mitoAIConnectionErrorType, 'error': content });
546
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.logEvent)('alert_block_displayed', { 'type': mitoAIConnectionErrorType, 'error': content });
544
547
  }, []);
545
- if (mitoAIConnectionErrorType === _utils_errors__WEBPACK_IMPORTED_MODULE_2__.FREE_TIER_LIMIT_REACHED_ERROR_TITLE) {
546
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert" },
547
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null,
548
- "You've used up your free trial of Mito AI for this month. To continue using Mito AI now, upgrade to ",
549
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { href: "https://www.trymito.io/plans", target: "_blank", rel: "noreferrer" }, "Mito Pro"),
550
- " and get access to:"),
551
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", null,
552
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Unlimited AI Chat and Agent"),
553
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Unlimited AI Autocompletes"),
554
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "All Mito Spreadsheet Pro features")),
555
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Or supply your own Open AI Key to continue using the basic version of Mito AI."),
556
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextButton__WEBPACK_IMPORTED_MODULE_3__["default"], { title: "Upgrade to Pro", text: "Upgrade to Pro", action: _utils_stripe__WEBPACK_IMPORTED_MODULE_4__.STRIPE_PAYMENT_LINK, variant: "purple", width: "block" })));
557
- }
558
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert-container" },
548
+ if (mitoAIConnectionErrorType === _utils_errors__WEBPACK_IMPORTED_MODULE_3__.FREE_TIER_LIMIT_REACHED_ERROR_TITLE) {
549
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert-container upgrade" },
550
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert" },
551
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "alert-error-message" }, "Free Trial Limit Reached")),
552
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "alert-actions-title" }, "You've used up your free trial of Mito AI for this month."),
553
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "alert-actions-title", style: { marginTop: '0px', marginBottom: '5px' } }, "Choose how you'd like to continue:"),
554
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ol", { style: { margin: '0', paddingLeft: '20px' } },
555
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null,
556
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { action: _utils_stripe__WEBPACK_IMPORTED_MODULE_4__.STRIPE_PAYMENT_LINK, method: "POST", target: "_blank", style: { display: 'inline' } },
557
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "submit", className: "secondary-option-link", style: {
558
+ background: 'none',
559
+ border: 'none',
560
+ padding: 0,
561
+ font: 'inherit',
562
+ color: 'var(--purple-700)',
563
+ textDecoration: 'underline',
564
+ cursor: 'pointer',
565
+ transition: 'color 0.2s ease'
566
+ } }, "Upgrade to Mito Pro")),
567
+ ' ',
568
+ " for unlimited AI access and dedicated support"),
569
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null,
570
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => {
571
+ window.open(CALENDLY_LINK, '_blank');
572
+ }, className: "secondary-option-link", style: {
573
+ background: 'none',
574
+ border: 'none',
575
+ padding: 0,
576
+ font: 'inherit',
577
+ color: 'var(--purple-700)',
578
+ textDecoration: 'underline',
579
+ cursor: 'pointer',
580
+ transition: 'color 0.2s ease'
581
+ } }, "Schedule a call with our founders"),
582
+ ' ',
583
+ " to get 3 free months of Mito Pro"),
584
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null,
585
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { href: "https://docs.trymito.io/mito-ai/configuring-ai-provider-keys", target: "_blank", rel: "noreferrer", className: "secondary-option-link" }, "Use your own API keys"),
586
+ ' ',
587
+ " to continue using Mito AI"))));
588
+ }
589
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert-container error" },
559
590
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chat-message-alert" },
560
591
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "alert-error-message" },
561
592
  "\u26A0 ",
@@ -612,10 +643,11 @@ __webpack_require__.r(__webpack_exports__);
612
643
 
613
644
 
614
645
 
615
- const AssistantCodeBlock = ({ code, codeSummary, isCodeComplete, renderMimeRegistry, previewAICode, acceptAICode, rejectAICode, isLastAiMessage, codeReviewStatus, agentModeEnabled, isErrorFixup }) => {
646
+ const AssistantCodeBlock = ({ code, codeSummary, isCodeComplete, renderMimeRegistry, previewAICode, acceptAICode, rejectAICode, isLastAiMessage, codeReviewStatus, agentModeEnabled, isErrorFixup, }) => {
616
647
  const [isCodeExpanded, setIsCodeExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
617
648
  const shouldShowToolbar = isLastAiMessage || isCodeComplete;
618
649
  if (agentModeEnabled) {
650
+ // Handle regular code blocks
619
651
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_3__.classNames)('code-block-container', 'agent-mode', {
620
652
  'agent-mode-collapsed': !isCodeExpanded,
621
653
  }) },
@@ -739,7 +771,8 @@ const ChatDropdown = ({ options, onSelect, filterText, maxDropdownItems = 10, is
739
771
  return option.file.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase());
740
772
  }
741
773
  else if (option.type === 'db') {
742
- 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());
743
776
  }
744
777
  else {
745
778
  return option.rule.toLowerCase().includes(effectiveFilterText.toLowerCase());
@@ -932,12 +965,13 @@ __webpack_require__.r(__webpack_exports__);
932
965
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
933
966
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
934
967
  /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/classNames */ "./lib/utils/classNames.js");
935
- /* harmony import */ var _ChatDropdown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ChatDropdown */ "./lib/Extensions/AiChat/ChatMessage/ChatDropdown.js");
968
+ /* harmony import */ var _ChatDropdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ChatDropdown */ "./lib/Extensions/AiChat/ChatMessage/ChatDropdown.js");
936
969
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/notebook */ "./lib/utils/notebook.js");
937
970
  /* harmony import */ var _style_ChatInput_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../style/ChatInput.css */ "./style/ChatInput.css");
938
971
  /* harmony import */ var _style_ChatDropdown_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../style/ChatDropdown.css */ "./style/ChatDropdown.css");
939
972
  /* harmony import */ var _hooks_useDebouncedFunction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../hooks/useDebouncedFunction */ "./lib/hooks/useDebouncedFunction.js");
940
- /* harmony import */ var _components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../components/SelectedContextContainer */ "./lib/components/SelectedContextContainer.js");
973
+ /* harmony import */ var _components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../components/SelectedContextContainer */ "./lib/components/SelectedContextContainer.js");
974
+ /* harmony import */ var _components_AttachFileButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../components/AttachFileButton */ "./lib/components/AttachFileButton.js");
941
975
  /* harmony import */ var _components_DatabaseButton__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../components/DatabaseButton */ "./lib/components/DatabaseButton.js");
942
976
  /*
943
977
  * Copyright (c) Saga Inc.
@@ -952,6 +986,7 @@ __webpack_require__.r(__webpack_exports__);
952
986
 
953
987
 
954
988
 
989
+
955
990
  const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditing, contextManager, notebookTracker, agentModeEnabled = false, agentExecutionStatus = 'idle', }) => {
956
991
  var _a;
957
992
  const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialContent);
@@ -963,6 +998,34 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
963
998
  const [dropdownFilter, setDropdownFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
964
999
  const [additionalContext, setAdditionalContext] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
965
1000
  const [isDropdownFromButton, setIsDropdownFromButton] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
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
+ }
1028
+ };
966
1029
  // Debounce the active cell ID change to avoid multiple rerenders.
967
1030
  // We use this to avoid a flickering screen when the active cell changes.
968
1031
  const debouncedSetActiveCellID = (0,_hooks_useDebouncedFunction__WEBPACK_IMPORTED_MODULE_4__.useDebouncedFunction)((newID) => {
@@ -1106,15 +1169,32 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1106
1169
  setIsDropdownFromButton(false);
1107
1170
  };
1108
1171
  const mapAdditionalContext = () => {
1109
- return additionalContext.map(context => {
1110
- if (context.type === 'db') {
1111
- return {
1112
- type: context.type,
1113
- value: context.value
1114
- };
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);
1115
1195
  }
1116
- return context;
1117
1196
  });
1197
+ return result;
1118
1198
  };
1119
1199
  // Update the expandedVariables arr when the variable manager changes
1120
1200
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -1167,6 +1247,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1167
1247
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("chat-input-container") },
1168
1248
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'context-container' },
1169
1249
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_DatabaseButton__WEBPACK_IMPORTED_MODULE_6__["default"], { app: app }),
1250
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AttachFileButton__WEBPACK_IMPORTED_MODULE_7__["default"], { onFileUploaded: handleFileUpload, notebookTracker: notebookTracker }),
1170
1251
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "context-button", onClick: () => {
1171
1252
  var _a;
1172
1253
  setDropdownVisible(true);
@@ -1174,7 +1255,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1174
1255
  setIsDropdownFromButton(true);
1175
1256
  (_a = textAreaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
1176
1257
  } }, "\uFF20 Add Context"),
1177
- additionalContext.map((context, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_7__["default"], { key: `${context.type}-${context.value}-${index}`, title: context.type === 'db' && context.display ? context.display : context.value, type: context.type, onRemove: () => setAdditionalContext(additionalContext.filter((_, i) => i !== index)), notebookTracker: notebookTracker, activeCellID: activeCellID })))),
1258
+ additionalContext.map((context, index) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_8__["default"], { key: `${context.type}-${context.value}-${index}`, title: context.display || context.value, type: context.type, onRemove: () => setAdditionalContext(additionalContext.filter((_, i) => i !== index)), notebookTracker: notebookTracker, activeCellID: activeCellID })))),
1178
1259
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-input-text-area-container' },
1179
1260
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: textAreaRef, className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_5__.classNames)("message", "message-user", 'chat-input', { "agent-mode": agentModeEnabled }), placeholder: placeholder, value: input, disabled: agentExecutionStatus === 'working' || agentExecutionStatus === 'stopping', onChange: handleInputChange, onKeyDown: (e) => {
1180
1261
  // If dropdown is visible, only handle escape to close it
@@ -1203,7 +1284,7 @@ const ChatInput = ({ app, initialContent, placeholder, onSave, onCancel, isEditi
1203
1284
  }
1204
1285
  }
1205
1286
  } }),
1206
- isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_8__["default"], { options: expandedVariables, onSelect: handleOptionSelect, filterText: dropdownFilter, isDropdownFromButton: isDropdownFromButton, onFilterChange: setDropdownFilter, onClose: handleDropdownClose }))),
1287
+ isDropdownVisible && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ChatDropdown__WEBPACK_IMPORTED_MODULE_9__["default"], { options: expandedVariables, onSelect: handleOptionSelect, filterText: dropdownFilter, isDropdownFromButton: isDropdownFromButton, onFilterChange: setDropdownFilter, onClose: handleDropdownClose }))),
1207
1288
  isEditing &&
1208
1289
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "message-edit-buttons" },
1209
1290
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => onSave(input, undefined, mapAdditionalContext()) }, "Save"),
@@ -1244,6 +1325,7 @@ __webpack_require__.r(__webpack_exports__);
1244
1325
  /* harmony import */ var _components_AgentComponents_GetCellOutputToolUI__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../components/AgentComponents/GetCellOutputToolUI */ "./lib/components/AgentComponents/GetCellOutputToolUI.js");
1245
1326
  /* harmony import */ var _components_AgentComponents_AssumptionToolUI__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../components/AgentComponents/AssumptionToolUI */ "./lib/components/AgentComponents/AssumptionToolUI.js");
1246
1327
  /* harmony import */ var _components_SelectedContextContainer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../components/SelectedContextContainer */ "./lib/components/SelectedContextContainer.js");
1328
+ /* harmony import */ var _components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../components/AgentComponents/RunAllCellsToolUI */ "./lib/components/AgentComponents/RunAllCellsToolUI.js");
1247
1329
  /*
1248
1330
  * Copyright (c) Saga Inc.
1249
1331
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -1267,6 +1349,7 @@ __webpack_require__.r(__webpack_exports__);
1267
1349
 
1268
1350
 
1269
1351
 
1352
+
1270
1353
  const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mitoAIConnectionError, mitoAIConnectionErrorType, notebookTracker, renderMimeRegistry, isLastAiMessage, isLastMessage, operatingSystem, previewAICode, acceptAICode, rejectAICode, onUpdateMessage, contextManager, codeReviewStatus, setNextSteps, agentModeEnabled, additionalContext, }) => {
1271
1354
  const [isEditing, setIsEditing] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
1272
1355
  if (message.role !== 'user' && message.role !== 'assistant') {
@@ -1320,7 +1403,7 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1320
1403
  // An empty code will look like this '```python ```'
1321
1404
  if (messagePart.length > 14) {
1322
1405
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
1323
- message.role === 'user' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_UserCodeBlock__WEBPACK_IMPORTED_MODULE_7__["default"], { code: messagePart, renderMimeRegistry: renderMimeRegistry, agentModeEnabled: agentModeEnabled })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__["default"], { code: messagePart, codeSummary: (_b = (_a = agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code_summary) !== null && _b !== void 0 ? _b : undefined, isCodeComplete: isCodeComplete, renderMimeRegistry: renderMimeRegistry, previewAICode: previewAICode, acceptAICode: acceptAICode, rejectAICode: rejectAICode, isLastAiMessage: isLastAiMessage, codeReviewStatus: codeReviewStatus, agentModeEnabled: agentModeEnabled })),
1406
+ message.role === 'user' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_UserCodeBlock__WEBPACK_IMPORTED_MODULE_7__["default"], { code: messagePart, renderMimeRegistry: renderMimeRegistry, agentModeEnabled: agentModeEnabled })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__["default"], { code: messagePart, codeSummary: (_b = (_a = agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.cell_update) === null || _a === void 0 ? void 0 : _a.code_summary) !== null && _b !== void 0 ? _b : ((agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'run_all_cells' ? 'Running all cells' : undefined), isCodeComplete: isCodeComplete, renderMimeRegistry: renderMimeRegistry, previewAICode: previewAICode, acceptAICode: acceptAICode, rejectAICode: rejectAICode, isLastAiMessage: isLastAiMessage, codeReviewStatus: codeReviewStatus, agentModeEnabled: agentModeEnabled })),
1324
1407
  isLastAiMessage && isCodeComplete && codeReviewStatus === 'chatPreview' &&
1325
1408
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: 'chat-message-buttons' },
1326
1409
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => { previewAICode(); }, text: 'Overwrite Active Cell', icon: _icons_PlayButtonIcon__WEBPACK_IMPORTED_MODULE_10__["default"], title: 'Write the Ai generated code to the active cell in the jupyter notebook, replacing the current code.', variant: 'gray', width: 'fit-contents' }),
@@ -1358,7 +1441,9 @@ const ChatMessage = ({ app, message, promptType, agentResponse, messageIndex, mi
1358
1441
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "message-start-editing-button", onClick: handleEditClick, title: "Edit message" },
1359
1442
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_Pencil__WEBPACK_IMPORTED_MODULE_17__["default"], null))),
1360
1443
  (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'get_cell_output' &&
1361
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_GetCellOutputToolUI__WEBPACK_IMPORTED_MODULE_18__["default"], null)));
1444
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_GetCellOutputToolUI__WEBPACK_IMPORTED_MODULE_18__["default"], null),
1445
+ (agentResponse === null || agentResponse === void 0 ? void 0 : agentResponse.type) === 'run_all_cells' && agentModeEnabled &&
1446
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_AgentComponents_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_19__["default"], null)));
1362
1447
  };
1363
1448
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatMessage);
1364
1449
 
@@ -1916,6 +2001,7 @@ __webpack_require__.r(__webpack_exports__);
1916
2001
  /* harmony import */ var _utils_scroll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/scroll */ "./lib/utils/scroll.js");
1917
2002
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
1918
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");
1919
2005
  /* harmony import */ var _SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
1920
2006
  /* harmony import */ var _CTACarousel__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./CTACarousel */ "./lib/Extensions/AiChat/CTACarousel.js");
1921
2007
  /* harmony import */ var _CodeDiffDisplay__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./CodeDiffDisplay */ "./lib/Extensions/AiChat/CodeDiffDisplay.js");
@@ -1928,7 +2014,6 @@ __webpack_require__.r(__webpack_exports__);
1928
2014
  /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
1929
2015
  /* harmony import */ var _style_ChatTaskpane_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/ChatTaskpane.css */ "./style/ChatTaskpane.css");
1930
2016
  /* harmony import */ var _style_TextButton_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../style/TextButton.css */ "./style/TextButton.css");
1931
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ "./lib/Extensions/AiChat/utils.js");
1932
2017
  /*
1933
2018
  * Copyright (c) Saga Inc.
1934
2019
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -1966,6 +2051,7 @@ __webpack_require__.r(__webpack_exports__);
1966
2051
 
1967
2052
 
1968
2053
 
2054
+
1969
2055
  // Internal imports - Chat components
1970
2056
 
1971
2057
 
@@ -1979,7 +2065,6 @@ __webpack_require__.r(__webpack_exports__);
1979
2065
 
1980
2066
 
1981
2067
 
1982
-
1983
2068
  const AGENT_EXECUTION_DEPTH_LIMIT = 20;
1984
2069
  const getDefaultChatHistoryManager = (notebookTracker, contextManager) => {
1985
2070
  const chatHistoryManager = new _ChatHistoryManager__WEBPACK_IMPORTED_MODULE_7__.ChatHistoryManager(contextManager, notebookTracker);
@@ -2366,6 +2451,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2366
2451
  if (messageIndex !== undefined) {
2367
2452
  agentExecutionMetadata.index = messageIndex;
2368
2453
  }
2454
+ // Extract images from additionalContext and update agentExecutionMetadata
2455
+ additionalContext = (0,_utils__WEBPACK_IMPORTED_MODULE_12__.extractImagesFromContext)(additionalContext, agentExecutionMetadata);
2369
2456
  agentExecutionMetadata.base64EncodedActiveCellOutput = await (0,_utils__WEBPACK_IMPORTED_MODULE_12__.getBase64EncodedCellOutput)(notebookTracker, sendCellIDOutput);
2370
2457
  setChatHistoryManager(newChatHistoryManager);
2371
2458
  setLoadingAIResponse(true);
@@ -2406,6 +2493,8 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2406
2493
  if (activeCellOutput !== undefined) {
2407
2494
  chatMessageMetadata.base64EncodedActiveCellOutput = activeCellOutput;
2408
2495
  }
2496
+ // Extract images from additionalContext and update chatMessageMetadata
2497
+ additionalContext = (0,_utils__WEBPACK_IMPORTED_MODULE_12__.extractImagesFromContext)(additionalContext, chatMessageMetadata);
2409
2498
  const completionRequest = {
2410
2499
  type: 'chat',
2411
2500
  message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__.UUID.uuid4(),
@@ -2642,6 +2731,22 @@ const ChatTaskpane = ({ notebookTracker, renderMimeRegistry, contextManager, app
2642
2731
  // in the next loop iteration
2643
2732
  sendCellIDOutput = agentResponse.get_cell_output_cell_id;
2644
2733
  }
2734
+ if (agentResponse.type === 'run_all_cells') {
2735
+ const result = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_17__.runAllCells)(app, notebookTracker);
2736
+ // If run_all_cells resulted in an error, handle it through the error fixup process
2737
+ if (!result.success && result.errorMessage && result.errorCellId) {
2738
+ // Set the error cell as active so the error retry logic can work with it
2739
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_13__.setActiveCellByID)(notebookTracker, result.errorCellId);
2740
+ const status = await (0,_utils_agentActions__WEBPACK_IMPORTED_MODULE_17__.retryIfExecutionError)(notebookTracker, app, getDuplicateChatHistoryManager, addAIMessageFromResponseAndUpdateState, sendAgentSmartDebugMessage, previewAICodeToActiveCell, acceptAICode, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef);
2741
+ if (status === 'interupted') {
2742
+ break;
2743
+ }
2744
+ if (status === 'failure') {
2745
+ addAIMessageFromResponseAndUpdateState("I apologize, but I encountered an error while running all cells and was unable to fix it after multiple attempts. You may want to check the notebook for errors.", 'agent:execution', chatHistoryManager);
2746
+ break;
2747
+ }
2748
+ }
2749
+ }
2645
2750
  }
2646
2751
  if (agentExecutionDepth > AGENT_EXECUTION_DEPTH_LIMIT) {
2647
2752
  addAIMessageFromResponseAndUpdateState("Since I've been working for a while now, give my work a review and then tell me how to continue.", 'agent:execution', chatHistoryManager);
@@ -3305,6 +3410,7 @@ const getFirstMessageFromCookie = () => {
3305
3410
 
3306
3411
  __webpack_require__.r(__webpack_exports__);
3307
3412
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3413
+ /* harmony export */ setDefaultWindowingMode: () => (/* binding */ setDefaultWindowingMode),
3308
3414
  /* harmony export */ setRenameUntitledFileOnSave: () => (/* binding */ setRenameUntitledFileOnSave)
3309
3415
  /* harmony export */ });
3310
3416
  /*
@@ -3313,6 +3419,7 @@ __webpack_require__.r(__webpack_exports__);
3313
3419
  */
3314
3420
  // Document manager plugin ID
3315
3421
  const DOCMANAGER_PLUGIN_ID = '@jupyterlab/docmanager-extension:plugin';
3422
+ const NOTEBOOK_PLUGIN_ID = '@jupyterlab/notebook-extension:tracker';
3316
3423
  // Set renameUntitledFileOnSave to false when the extension loads
3317
3424
  const setRenameUntitledFileOnSave = async (settingRegistry, _documentManager) => {
3318
3425
  // Note we don't use the documentManager, but we require it as a parameter to make sure
@@ -3321,7 +3428,15 @@ const setRenameUntitledFileOnSave = async (settingRegistry, _documentManager) =>
3321
3428
  await settingRegistry.set(DOCMANAGER_PLUGIN_ID, 'renameUntitledFileOnSave', false);
3322
3429
  }
3323
3430
  catch (error) {
3324
- console.error('Failed to set renameUntitledFileOnSave setting:', error);
3431
+ console.error('[mito-ai jupyter settings manager] Failed to set renameUntitledFileOnSave setting:', error);
3432
+ }
3433
+ };
3434
+ const setDefaultWindowingMode = async (settingRegistry) => {
3435
+ try {
3436
+ await settingRegistry.set(NOTEBOOK_PLUGIN_ID, 'windowingMode', 'defer');
3437
+ }
3438
+ catch (error) {
3439
+ console.log('[mito-ai jupyter settings manager] Failed to set windowingMode to defer', error);
3325
3440
  }
3326
3441
  };
3327
3442
 
@@ -3368,6 +3483,7 @@ const IChatTracker = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.Token('m
3368
3483
 
3369
3484
  __webpack_require__.r(__webpack_exports__);
3370
3485
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3486
+ /* harmony export */ extractImagesFromContext: () => (/* binding */ extractImagesFromContext),
3371
3487
  /* harmony export */ getBase64EncodedCellOutput: () => (/* binding */ getBase64EncodedCellOutput)
3372
3488
  /* harmony export */ });
3373
3489
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
@@ -3397,6 +3513,18 @@ const getBase64EncodedCellOutput = async (notebookTracker, cellID) => {
3397
3513
  }
3398
3514
  return undefined;
3399
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
+ };
3400
3528
 
3401
3529
 
3402
3530
  /***/ }),
@@ -3539,12 +3667,13 @@ __webpack_require__.r(__webpack_exports__);
3539
3667
  /* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_0__);
3540
3668
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
3541
3669
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
3542
- /* harmony import */ var _requirementsUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./requirementsUtils */ "./lib/Extensions/AppBuilder/requirementsUtils.js");
3543
- /* harmony import */ var _fileUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fileUtils */ "./lib/Extensions/AppBuilder/fileUtils.js");
3670
+ /* harmony import */ var _requirementsUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./requirementsUtils */ "./lib/Extensions/AppBuilder/requirementsUtils.js");
3671
+ /* harmony import */ var _fileUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fileUtils */ "./lib/Extensions/AppBuilder/fileUtils.js");
3544
3672
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
3545
3673
  /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__);
3546
- /* harmony import */ var _DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DeployAppNotification */ "./lib/Extensions/AppBuilder/DeployAppNotification.js");
3674
+ /* harmony import */ var _DeployAppNotification__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DeployAppNotification */ "./lib/Extensions/AppBuilder/DeployAppNotification.js");
3547
3675
  /* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auth */ "./lib/Extensions/AppBuilder/auth.js");
3676
+ /* harmony import */ var _authPopupUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./authPopupUtils */ "./lib/Extensions/AppBuilder/authPopupUtils.js");
3548
3677
  /*
3549
3678
  * Copyright (c) Saga Inc.
3550
3679
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -3556,15 +3685,32 @@ __webpack_require__.r(__webpack_exports__);
3556
3685
 
3557
3686
 
3558
3687
 
3688
+
3559
3689
  /*
3560
3690
  This function generates a requirements.txt file that lists the dependencies for the streamlit app
3561
3691
  */
3562
3692
  const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) => {
3563
- // Check authentication before proceeding with deployment
3564
- const isAuthenticated = await (0,_auth__WEBPACK_IMPORTED_MODULE_3__.checkAuthenticationAndRedirect)();
3565
- if (!isAuthenticated) {
3693
+ let jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_3__.getJWTToken)();
3694
+ if (!jwtToken) {
3695
+ // No token found, show authentication popup
3566
3696
  console.log('User not authenticated, redirected to signup');
3567
- return;
3697
+ try {
3698
+ const user = await (0,_authPopupUtils__WEBPACK_IMPORTED_MODULE_4__.showAuthenticationPopup)();
3699
+ console.log('User authenticated successfully:', user);
3700
+ // Try to get the JWT token again after successful authentication
3701
+ jwtToken = await (0,_auth__WEBPACK_IMPORTED_MODULE_3__.getJWTToken)();
3702
+ if (!jwtToken) {
3703
+ console.error('JWT token still not available after authentication');
3704
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit('Authentication failed - JWT token not found', 'error', {
3705
+ autoClose: false
3706
+ });
3707
+ return;
3708
+ }
3709
+ }
3710
+ catch (error) {
3711
+ console.log('Authentication cancelled or failed:', error);
3712
+ return; // Exit early if authentication was cancelled
3713
+ }
3568
3714
  }
3569
3715
  const notebookPanel = notebookTracker.currentWidget;
3570
3716
  if (!notebookPanel) {
@@ -3578,20 +3724,19 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3578
3724
  console.log('Current working directory info:', notebookPanel.context);
3579
3725
  // Build the requirements.txt file
3580
3726
  console.debug("Building requirements.txt file");
3581
- const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_4__.generateRequirementsTxt)(notebookTracker);
3727
+ const requirementsContent = await (0,_requirementsUtils__WEBPACK_IMPORTED_MODULE_5__.generateRequirementsTxt)(notebookTracker);
3582
3728
  // Save the files to the current directory
3583
- await (0,_fileUtils__WEBPACK_IMPORTED_MODULE_5__.saveFileWithKernel)(notebookTracker, './requirements.txt', requirementsContent);
3729
+ await (0,_fileUtils__WEBPACK_IMPORTED_MODULE_6__.saveFileWithKernel)(notebookTracker, './requirements.txt', requirementsContent);
3584
3730
  // After building the files, we need to send a request to the backend to deploy the app
3585
3731
  if (appBuilderService) {
3586
3732
  try {
3587
3733
  console.log("Sending request to deploy the app");
3588
- // Get JWT token for authentication
3589
- const jwtToken = (0,_auth__WEBPACK_IMPORTED_MODULE_3__.getJWTToken)();
3734
+ // Use the JWT token that was already obtained or refreshed above
3590
3735
  const response = await appBuilderService.client.sendMessage({
3591
3736
  type: 'build-app',
3592
3737
  message_id: _lumino_coreutils__WEBPACK_IMPORTED_MODULE_2__.UUID.uuid4(),
3593
3738
  notebook_path: notebookPath,
3594
- jwt_token: jwtToken || appBuilderService.client.serverSettings.token
3739
+ jwt_token: jwtToken
3595
3740
  });
3596
3741
  if (response.error) {
3597
3742
  _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(response.error.title, 'error', {
@@ -3601,7 +3746,7 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3601
3746
  else {
3602
3747
  console.log("App deployment response:", response);
3603
3748
  const url = response.url;
3604
- (0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_6__.deployAppNotification)(url);
3749
+ (0,_DeployAppNotification__WEBPACK_IMPORTED_MODULE_7__.deployAppNotification)(url);
3605
3750
  }
3606
3751
  }
3607
3752
  catch (error) {
@@ -3615,6 +3760,116 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3615
3760
  };
3616
3761
 
3617
3762
 
3763
+ /***/ }),
3764
+
3765
+ /***/ "./lib/Extensions/AppBuilder/auth-popup-deploy.js":
3766
+ /*!********************************************************!*\
3767
+ !*** ./lib/Extensions/AppBuilder/auth-popup-deploy.js ***!
3768
+ \********************************************************/
3769
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3770
+
3771
+ __webpack_require__.r(__webpack_exports__);
3772
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3773
+ /* harmony export */ AuthPopup: () => (/* binding */ AuthPopup)
3774
+ /* harmony export */ });
3775
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
3776
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3777
+ /* harmony import */ var _aws_amplify_ui_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @aws-amplify/ui-react */ "webpack/sharing/consume/default/@aws-amplify/ui-react/@aws-amplify/ui-react");
3778
+ /* harmony import */ var _aws_amplify_ui_react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_aws_amplify_ui_react__WEBPACK_IMPORTED_MODULE_1__);
3779
+ /* harmony import */ var _aws_amplify_ui_react_styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @aws-amplify/ui-react/styles.css */ "./node_modules/@aws-amplify/ui-react/dist/styles.css");
3780
+ /* harmony import */ var _style_ConnectionForm_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../style/ConnectionForm.css */ "./style/ConnectionForm.css");
3781
+ /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../style/button.css */ "./style/button.css");
3782
+ /* harmony import */ var _style_AuthPopup_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/AuthPopup.css */ "./style/AuthPopup.css");
3783
+ /*
3784
+ * Copyright (c) Saga Inc.
3785
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3786
+ */
3787
+ // auth-popup.tsx - Simple authentication popup with CSS-based requirements
3788
+
3789
+
3790
+
3791
+
3792
+
3793
+
3794
+ const AuthPopup = ({ isOpen, onClose, onSuccess }) => {
3795
+ // Track if we've already called onSuccess to prevent infinite loops
3796
+ const hasCalledOnSuccess = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(false);
3797
+ // Track if we should show progress bar
3798
+ const [showProgress, setShowProgress] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(false);
3799
+ // Cleanup on unmount
3800
+ react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {
3801
+ return () => {
3802
+ setShowProgress(false);
3803
+ };
3804
+ }, []);
3805
+ if (!isOpen)
3806
+ return null;
3807
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "modal-overlay" },
3808
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "modal-content" },
3809
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "modal-header" },
3810
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", null, "Sign In / Sign Up"),
3811
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: onClose, className: "modal-close-button", title: "Close" }, "\u00D7")),
3812
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_aws_amplify_ui_react__WEBPACK_IMPORTED_MODULE_1__.Authenticator, { loginMechanisms: ['email'], signUpAttributes: ['name', 'email'], formFields: {
3813
+ signUp: {
3814
+ name: {
3815
+ order: 1,
3816
+ placeholder: 'Enter your full name',
3817
+ label: 'Full Name *',
3818
+ required: true
3819
+ },
3820
+ email: {
3821
+ order: 2,
3822
+ placeholder: 'Enter your email address',
3823
+ label: 'Email *'
3824
+ },
3825
+ password: {
3826
+ order: 3,
3827
+ placeholder: 'Enter your password',
3828
+ label: 'Password *',
3829
+ required: true
3830
+ },
3831
+ confirm_password: {
3832
+ order: 4,
3833
+ placeholder: 'Confirm your password',
3834
+ label: 'Confirm Password *'
3835
+ }
3836
+ }
3837
+ } }, ({ user }) => {
3838
+ // Call onSuccess when user is authenticated, but only once and with delay
3839
+ if (user && !hasCalledOnSuccess.current) {
3840
+ // Show the progress bar
3841
+ setShowProgress(true);
3842
+ // Give users time to see the success message before calling onSuccess
3843
+ setTimeout(() => {
3844
+ if (!hasCalledOnSuccess.current) {
3845
+ hasCalledOnSuccess.current = true;
3846
+ onSuccess(user);
3847
+ }
3848
+ }, 3000); // 3 second delay
3849
+ }
3850
+ // If user is signed in, show the welcome message
3851
+ if (user) {
3852
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "welcome-message-container" },
3853
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "welcome-message-title" }, "Welcome to mito!"),
3854
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "welcome-message-description" }, "You're all set to deploy your app."),
3855
+ showProgress && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "progress-bar-container" },
3856
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "progress-bar-fill" }))),
3857
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "progress-bar-timer" }, "Closing automatically in a few seconds...")));
3858
+ }
3859
+ // If user is not signed in, don't render anything here
3860
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { display: 'none' } });
3861
+ }),
3862
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "password-requirements" },
3863
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Password Requirements:"),
3864
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", null,
3865
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "At least 8 characters long"),
3866
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Contains at least one uppercase letter"),
3867
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Contains at least one lowercase letter"),
3868
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Contains at least one number"),
3869
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", null, "Contains at least one special character"))))));
3870
+ };
3871
+
3872
+
3618
3873
  /***/ }),
3619
3874
 
3620
3875
  /***/ "./lib/Extensions/AppBuilder/auth.js":
@@ -3625,176 +3880,172 @@ const convertNotebookToStreamlit = async (notebookTracker, appBuilderService) =>
3625
3880
 
3626
3881
  __webpack_require__.r(__webpack_exports__);
3627
3882
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3628
- /* harmony export */ checkAuthenticationAndRedirect: () => (/* binding */ checkAuthenticationAndRedirect),
3629
- /* harmony export */ exchangeCodeForTokens: () => (/* binding */ exchangeCodeForTokens),
3630
3883
  /* harmony export */ getAuthHeaders: () => (/* binding */ getAuthHeaders),
3631
3884
  /* harmony export */ getJWTToken: () => (/* binding */ getJWTToken),
3632
- /* harmony export */ isUserAuthenticated: () => (/* binding */ isUserAuthenticated),
3633
- /* harmony export */ redirectToSignin: () => (/* binding */ redirectToSignin),
3634
- /* harmony export */ redirectToSignup: () => (/* binding */ redirectToSignup),
3635
- /* harmony export */ removeJWTToken: () => (/* binding */ removeJWTToken),
3636
- /* harmony export */ setJWTToken: () => (/* binding */ setJWTToken)
3885
+ /* harmony export */ logoutAndClearJWTTokens: () => (/* binding */ logoutAndClearJWTTokens)
3637
3886
  /* harmony export */ });
3638
- /* harmony import */ var _restAPI_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../restAPI/utils */ "./lib/restAPI/utils.js");
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");
3889
+ /* harmony import */ var _aws_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./aws-config */ "./lib/Extensions/AppBuilder/aws-config.js");
3639
3890
  /*
3640
3891
  * Copyright (c) Saga Inc.
3641
3892
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3642
3893
  */
3643
3894
 
3644
- const domain_dev = 'https://mito-app-auth.auth.us-east-1.amazoncognito.com';
3645
- const client_id = '6ara3u3l8sss738hrhbq1qtiqf';
3646
- // Change this to domain_dev for dev deployments
3647
- const active_domain = domain_dev;
3648
- const currentUrl = window.location.href;
3649
- let redirectUrl;
3650
- // As of now we only support localhost:8888 because we have only allowed this redirect url on AWS conito
3651
- // We can modify the redirect to include other ports in the future
3652
- if (currentUrl.includes('localhost')) {
3653
- redirectUrl = 'http://localhost:8888/lab';
3654
- }
3655
- else if (currentUrl.includes('trymito')) {
3656
- redirectUrl = 'https://launch.trymito.io';
3657
- }
3658
- else {
3659
- redirectUrl = currentUrl;
3660
- }
3661
- console.log("currentUrl: ", currentUrl);
3662
- // AWS Cognito configuration
3663
- const COGNITO_CONFIG = {
3664
- SIGNUP_URL: `${active_domain}/signup?client_id=${client_id}&response_type=code&scope=email+openid+profile&redirect_uri=${redirectUrl}`,
3665
- SIGNIN_URL: `${active_domain}/login?client_id=${client_id}&response_type=code&scope=email+openid+profile&redirect_uri=${redirectUrl}`,
3666
- JWT_COOKIE_NAME: 'mito-auth-token',
3667
- JWT_COOKIE_EXPIRY_HOURS: 1
3668
- };
3669
- /**
3670
- * Check if user is authenticated by looking for JWT token in cookies
3671
- */
3672
- const isUserAuthenticated = () => {
3673
- const token = getJWTToken();
3674
- return token !== null && token !== undefined && token !== '';
3675
- };
3895
+
3896
+ // Ensure Amplify is configured before any auth operations
3897
+ (0,_aws_config__WEBPACK_IMPORTED_MODULE_0__.configureAmplify)();
3676
3898
  /**
3677
3899
  * Get JWT token from cookies
3678
3900
  */
3679
- const getJWTToken = () => {
3680
- const cookies = document.cookie.split(';');
3681
- const jwtCookie = cookies.find(cookie => cookie.trim().startsWith(`${COGNITO_CONFIG.JWT_COOKIE_NAME}=`));
3682
- if (jwtCookie) {
3683
- const token = jwtCookie.split('=')[1];
3684
- return token || null;
3901
+ const getJWTToken = async () => {
3902
+ var _a, _b;
3903
+ try {
3904
+ const session = await (0,aws_amplify_auth__WEBPACK_IMPORTED_MODULE_1__.fetchAuthSession)();
3905
+ const accessToken = (_b = (_a = session.tokens) === null || _a === void 0 ? void 0 : _a.accessToken) === null || _b === void 0 ? void 0 : _b.toString();
3906
+ return accessToken || '';
3685
3907
  }
3686
- return null;
3687
- };
3688
- /**
3689
- * Set JWT token as a cookie
3690
- */
3691
- const setJWTToken = (token) => {
3692
- const date = new Date();
3693
- date.setTime(date.getTime() + (COGNITO_CONFIG.JWT_COOKIE_EXPIRY_HOURS * 60 * 60 * 1000));
3694
- const expires = "expires=" + date.toUTCString();
3695
- // Set cookie for all subdomains of trymito.io (production)
3696
- document.cookie = `${COGNITO_CONFIG.JWT_COOKIE_NAME}=${token}; ${expires}; path=/; domain=.trymito.io; SameSite=Lax; Secure`;
3697
- // For localhost development
3698
- if (window.location.hostname === 'localhost') {
3699
- document.cookie = `${COGNITO_CONFIG.JWT_COOKIE_NAME}=${token}; ${expires}; path=/`;
3908
+ catch (error) {
3909
+ console.error('Error getting JWT token:', error);
3910
+ return '';
3700
3911
  }
3701
3912
  };
3702
3913
  /**
3703
- * Remove JWT token from cookies
3914
+ * Get authentication headers for API requests
3704
3915
  */
3705
- const removeJWTToken = () => {
3706
- // Delete for current domain
3707
- document.cookie = `${COGNITO_CONFIG.JWT_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
3708
- // Delete for all subdomains
3709
- document.cookie = `${COGNITO_CONFIG.JWT_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.trymito.io;`;
3916
+ const getAuthHeaders = async () => {
3917
+ const token = await getJWTToken();
3918
+ if (token) {
3919
+ return {
3920
+ 'Authorization': `Bearer ${token}`
3921
+ };
3922
+ }
3923
+ return {};
3710
3924
  };
3711
3925
  /**
3712
- * Exchange authorization code for JWT tokens
3926
+ * Logout user and clear all AWS Amplify/Cognito localStorage items
3713
3927
  */
3714
- const exchangeCodeForTokens = async (code) => {
3928
+ const logoutAndClearJWTTokens = async () => {
3715
3929
  try {
3716
- const response = await (0,_restAPI_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)('auth/token', {
3717
- method: 'POST',
3718
- body: JSON.stringify({ code })
3719
- });
3720
- if (response.error) {
3721
- console.error('Failed to exchange code for tokens:', response.error);
3722
- return false;
3723
- }
3724
- if (response.data) {
3725
- const data = response.data;
3726
- const { access_token } = data;
3727
- // Store the access token as the JWT token
3728
- if (access_token) {
3729
- setJWTToken(access_token);
3730
- return true;
3731
- }
3732
- }
3733
- return false;
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');
3734
3933
  }
3735
3934
  catch (error) {
3736
- console.error('Error exchanging code for tokens:', error);
3737
- return false;
3935
+ console.error('Error during logout:', error);
3936
+ throw error;
3738
3937
  }
3739
- };
3740
- /**
3741
- * Redirect user to AWS Cognito signup page
3742
- */
3743
- const redirectToSignup = () => {
3744
- window.location.href = COGNITO_CONFIG.SIGNUP_URL;
3745
- };
3746
- /**
3747
- * Redirect user to AWS Cognito signin page
3748
- */
3749
- const redirectToSignin = () => {
3750
- window.location.href = COGNITO_CONFIG.SIGNIN_URL;
3751
- };
3752
- /**
3753
- * Handle authentication check and redirect if needed
3754
- * Returns true if user is authenticated, false if redirected
3755
- */
3756
- const checkAuthenticationAndRedirect = async () => {
3757
- if (!isUserAuthenticated()) {
3758
- // Check if there's a code parameter in the URL (indicating return from Cognito)
3759
- const urlParams = new URLSearchParams(window.location.search);
3760
- const code = urlParams.get('code');
3761
- if (code) {
3762
- // User has returned from Cognito with authorization code
3763
- console.log('Received authorization code from Cognito:', code);
3764
- // Exchange the code for JWT tokens
3765
- const success = await exchangeCodeForTokens(code);
3766
- if (success) {
3767
- // Clean up URL
3768
- const newUrl = window.location.pathname;
3769
- window.history.replaceState({}, document.title, newUrl);
3770
- return true;
3771
- }
3772
- else {
3773
- // Failed to exchange code, redirect to signup
3774
- redirectToSignup();
3775
- return false;
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);
3776
3945
  }
3777
3946
  }
3778
- else {
3779
- // No token and no code, redirect to signup
3780
- redirectToSignup();
3781
- return false;
3782
- }
3947
+ // Remove all identified keys
3948
+ keysToRemove.forEach(key => {
3949
+ localStorage.removeItem(key);
3950
+ });
3951
+ console.log('Auth tokens cleared successfully');
3783
3952
  }
3784
- return true;
3785
3953
  };
3954
+
3955
+
3956
+ /***/ }),
3957
+
3958
+ /***/ "./lib/Extensions/AppBuilder/authPopupUtils.js":
3959
+ /*!*****************************************************!*\
3960
+ !*** ./lib/Extensions/AppBuilder/authPopupUtils.js ***!
3961
+ \*****************************************************/
3962
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3963
+
3964
+ __webpack_require__.r(__webpack_exports__);
3965
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3966
+ /* harmony export */ showAuthenticationPopup: () => (/* binding */ showAuthenticationPopup)
3967
+ /* harmony export */ });
3968
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
3969
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3970
+ /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");
3971
+ /* harmony import */ var _auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth-popup-deploy */ "./lib/Extensions/AppBuilder/auth-popup-deploy.js");
3972
+ /*
3973
+ * Copyright (c) Saga Inc.
3974
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
3975
+ */
3976
+
3977
+
3978
+
3786
3979
  /**
3787
- * Get authentication headers for API requests
3980
+ * Shows an authentication popup and returns a promise that resolves when authentication is successful
3788
3981
  */
3789
- const getAuthHeaders = () => {
3790
- const token = getJWTToken();
3791
- if (token) {
3792
- return {
3793
- 'Authorization': `Bearer ${token}`
3982
+ const showAuthenticationPopup = () => {
3983
+ return new Promise((resolve, reject) => {
3984
+ // Create a container for the popup
3985
+ const popupContainer = document.createElement('div');
3986
+ popupContainer.id = 'auth-popup-container';
3987
+ document.body.appendChild(popupContainer);
3988
+ // Create root for React 18
3989
+ const root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(popupContainer);
3990
+ const handleSuccess = (user) => {
3991
+ // Clean up the popup
3992
+ root.unmount();
3993
+ document.body.removeChild(popupContainer);
3994
+ resolve(user);
3794
3995
  };
3795
- }
3796
- return {};
3996
+ const handleClose = () => {
3997
+ // Clean up the popup
3998
+ root.unmount();
3999
+ document.body.removeChild(popupContainer);
4000
+ reject(new Error('Authentication cancelled'));
4001
+ };
4002
+ // Render the AuthPopup
4003
+ root.render(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_auth_popup_deploy__WEBPACK_IMPORTED_MODULE_2__.AuthPopup, { isOpen: true, onSuccess: handleSuccess, onClose: handleClose }));
4004
+ });
4005
+ };
4006
+
4007
+
4008
+ /***/ }),
4009
+
4010
+ /***/ "./lib/Extensions/AppBuilder/aws-config.js":
4011
+ /*!*************************************************!*\
4012
+ !*** ./lib/Extensions/AppBuilder/aws-config.js ***!
4013
+ \*************************************************/
4014
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4015
+
4016
+ __webpack_require__.r(__webpack_exports__);
4017
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4018
+ /* harmony export */ configureAmplify: () => (/* binding */ configureAmplify)
4019
+ /* harmony export */ });
4020
+ /* harmony import */ var aws_amplify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! aws-amplify */ "webpack/sharing/consume/default/aws-amplify/aws-amplify?b926");
4021
+ /* harmony import */ var aws_amplify__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(aws_amplify__WEBPACK_IMPORTED_MODULE_0__);
4022
+ /*
4023
+ * Copyright (c) Saga Inc.
4024
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4025
+ */
4026
+
4027
+ const userPoolIdDev = 'us-east-1_Kk0f9mOfx';
4028
+ const userPoolClientIdDev = '6ara3u3l8sss738hrhbq1qtiqf';
4029
+ // TODO: modify to prod user ID and client ID on after creating teh cognito resources in prod
4030
+ const userPoolId = userPoolIdDev;
4031
+ const userPoolClientId = userPoolClientIdDev;
4032
+ const configureAmplify = () => {
4033
+ aws_amplify__WEBPACK_IMPORTED_MODULE_0__.Amplify.configure({
4034
+ Auth: {
4035
+ Cognito: {
4036
+ userPoolId: userPoolId,
4037
+ userPoolClientId: userPoolClientId,
4038
+ loginWith: {
4039
+ email: true,
4040
+ username: false,
4041
+ }
4042
+ },
4043
+ }
4044
+ });
4045
+ console.log('Amplify configuration loaded successfully');
3797
4046
  };
4047
+ // Configure immediately when this module is imported
4048
+ configureAmplify();
3798
4049
 
3799
4050
 
3800
4051
  /***/ }),
@@ -4009,73 +4260,379 @@ with tempfile.TemporaryDirectory() as temp_dir:
4009
4260
 
4010
4261
  /***/ }),
4011
4262
 
4012
- /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
4013
- /*!***************************************************************!*\
4014
- !*** ./lib/Extensions/ContextManager/ContextManagerPlugin.js ***!
4015
- \***************************************************************/
4263
+ /***/ "./lib/Extensions/AppManager/AppsList.js":
4264
+ /*!***********************************************!*\
4265
+ !*** ./lib/Extensions/AppManager/AppsList.js ***!
4266
+ \***********************************************/
4016
4267
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4017
4268
 
4018
4269
  __webpack_require__.r(__webpack_exports__);
4019
4270
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4020
- /* harmony export */ ContextManager: () => (/* binding */ ContextManager),
4021
- /* harmony export */ ContextManagerPlugin: () => (/* binding */ ContextManagerPlugin),
4022
- /* harmony export */ IContextManager: () => (/* binding */ IContextManager),
4023
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4271
+ /* harmony export */ AppsList: () => (/* binding */ AppsList)
4024
4272
  /* harmony export */ });
4025
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
4026
- /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
4027
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
4028
- /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
4029
- /* harmony import */ var _VariableInspector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./VariableInspector */ "./lib/Extensions/ContextManager/VariableInspector.js");
4030
- /* harmony import */ var _FileInspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FileInspector */ "./lib/Extensions/ContextManager/FileInspector.js");
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");
4031
4280
  /*
4032
4281
  * Copyright (c) Saga Inc.
4033
4282
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4034
4283
  */
4284
+ //app-list.tsx
4035
4285
 
4036
4286
 
4037
4287
 
4038
4288
 
4039
- // The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
4040
- // that can be used to look up the service in the dependency injection system,
4041
- // so we define a new token for the ContextManager
4042
- const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
4043
- class ContextManager {
4044
- constructor(app, notebookTracker) {
4045
- this._variables = [];
4046
- this._files = [];
4047
- // Setup the kernel listener to update context as kernel messages are received
4048
- this.setupKernelListener(app, notebookTracker);
4049
- }
4050
- get variables() {
4051
- return this._variables;
4052
- }
4053
- setVariables(newVars) {
4054
- this._variables = newVars;
4055
- }
4056
- get files() {
4057
- return this._files;
4058
- }
4059
- setFiles(newFiles) {
4060
- this._files = newFiles;
4061
- }
4062
- // Setup kernel execution listener
4063
- setupKernelListener(app, notebookTracker) {
4064
- notebookTracker.currentChanged.connect(async (tracker, notebookPanel) => {
4065
- if (!notebookPanel) {
4066
- return;
4067
- }
4068
- // Listen for kernel refresh events
4069
- notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
4070
- if (status === 'restarting') {
4071
- this.setVariables([]); // Clear variables on kernel refresh
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);
4072
4306
  }
4073
- });
4074
- // As soon as the notebook is opened, fetch the files so we don't have to wait for the first message.
4075
- await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.fetchFilesAndUpdateState)(app, notebookTracker, this.setFiles.bind(this));
4076
- // Listen to kernel messages
4077
- notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
4078
- // Watch for execute_input messages, which indicate is a request to execute code.
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
+
4567
+ /***/ }),
4568
+
4569
+ /***/ "./lib/Extensions/ContextManager/ContextManagerPlugin.js":
4570
+ /*!***************************************************************!*\
4571
+ !*** ./lib/Extensions/ContextManager/ContextManagerPlugin.js ***!
4572
+ \***************************************************************/
4573
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4574
+
4575
+ __webpack_require__.r(__webpack_exports__);
4576
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4577
+ /* harmony export */ ContextManager: () => (/* binding */ ContextManager),
4578
+ /* harmony export */ ContextManagerPlugin: () => (/* binding */ ContextManagerPlugin),
4579
+ /* harmony export */ IContextManager: () => (/* binding */ IContextManager),
4580
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4581
+ /* harmony export */ });
4582
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/notebook */ "webpack/sharing/consume/default/@jupyterlab/notebook");
4583
+ /* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_0__);
4584
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/coreutils */ "webpack/sharing/consume/default/@lumino/coreutils");
4585
+ /* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__);
4586
+ /* harmony import */ var _VariableInspector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./VariableInspector */ "./lib/Extensions/ContextManager/VariableInspector.js");
4587
+ /* harmony import */ var _FileInspector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FileInspector */ "./lib/Extensions/ContextManager/FileInspector.js");
4588
+ /*
4589
+ * Copyright (c) Saga Inc.
4590
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
4591
+ */
4592
+
4593
+
4594
+
4595
+
4596
+ // The provides field in JupyterLab's JupyterFrontEndPlugin expects a token
4597
+ // that can be used to look up the service in the dependency injection system,
4598
+ // so we define a new token for the ContextManager
4599
+ const IContextManager = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_1__.Token('mito-ai:IContextManager');
4600
+ class ContextManager {
4601
+ constructor(app, notebookTracker) {
4602
+ this._variables = [];
4603
+ this._files = [];
4604
+ // Setup the kernel listener to update context as kernel messages are received
4605
+ this.setupKernelListener(app, notebookTracker);
4606
+ }
4607
+ get variables() {
4608
+ return this._variables;
4609
+ }
4610
+ setVariables(newVars) {
4611
+ this._variables = newVars;
4612
+ }
4613
+ get files() {
4614
+ return this._files;
4615
+ }
4616
+ setFiles(newFiles) {
4617
+ this._files = newFiles;
4618
+ }
4619
+ // Setup kernel execution listener
4620
+ setupKernelListener(app, notebookTracker) {
4621
+ notebookTracker.currentChanged.connect(async (tracker, notebookPanel) => {
4622
+ if (!notebookPanel) {
4623
+ return;
4624
+ }
4625
+ // Listen for kernel refresh events
4626
+ notebookPanel.context.sessionContext.statusChanged.connect((sender, status) => {
4627
+ if (status === 'restarting') {
4628
+ this.setVariables([]); // Clear variables on kernel refresh
4629
+ }
4630
+ });
4631
+ // As soon as the notebook is opened, fetch the files so we don't have to wait for the first message.
4632
+ await (0,_FileInspector__WEBPACK_IMPORTED_MODULE_2__.fetchFilesAndUpdateState)(app, notebookTracker, this.setFiles.bind(this));
4633
+ // Listen to kernel messages
4634
+ notebookPanel.context.sessionContext.iopubMessage.connect(async (sender, msg) => {
4635
+ // Watch for execute_input messages, which indicate is a request to execute code.
4079
4636
  // Previosuly, we watched for 'execute_result' messages, but these are only returned
4080
4637
  // from the kernel when a code cell prints a value to the output cell, which is not what we want.
4081
4638
  // TODO: Check if there is a race condition where we might end up fetching variables before the
@@ -4269,10 +4826,17 @@ def structured_globals():
4269
4826
 
4270
4827
  else:
4271
4828
 
4829
+ max_value_length = 4000 # This is roughly 1000 tokens in the LLM
4830
+ truncated_value = str(repr(v)) # Force to string
4831
+
4832
+ if len(truncated_value) > max_value_length:
4833
+ split_length = max_value_length // 2
4834
+ truncated_value = truncated_value[:split_length] + '... <middle of value truncated> ...' + truncated_value[-split_length:]
4835
+
4272
4836
  new_variable = {
4273
4837
  "variable_name": k,
4274
4838
  "type": str(type(v)),
4275
- "value": repr(v)
4839
+ "value": truncated_value
4276
4840
  }
4277
4841
 
4278
4842
  try:
@@ -6648,11 +7212,12 @@ __webpack_require__.r(__webpack_exports__);
6648
7212
  /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
6649
7213
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
6650
7214
  /* harmony import */ var _Extensions_AiChat_ChatMessage_PythonCode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Extensions/AiChat/ChatMessage/PythonCode */ "./lib/Extensions/AiChat/ChatMessage/PythonCode.js");
6651
- /* harmony import */ var _Extensions_AiChat_ChatMessage_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Extensions/AiChat/ChatMessage/AssistantCodeBlock */ "./lib/Extensions/AiChat/ChatMessage/AssistantCodeBlock.js");
7215
+ /* harmony import */ var _Extensions_AiChat_ChatMessage_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Extensions/AiChat/ChatMessage/AssistantCodeBlock */ "./lib/Extensions/AiChat/ChatMessage/AssistantCodeBlock.js");
6652
7216
  /* harmony import */ var _icons_AlertIcon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../icons/AlertIcon */ "./lib/icons/AlertIcon.js");
6653
7217
  /* harmony import */ var _AgentComponentHeader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AgentComponentHeader */ "./lib/components/AgentComponents/AgentComponentHeader.js");
6654
7218
  /* harmony import */ var _style_ErrorFixupToolUI_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/ErrorFixupToolUI.css */ "./style/ErrorFixupToolUI.css");
6655
7219
  /* harmony import */ var _style_AgentComponentHeader_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../style/AgentComponentHeader.css */ "./style/AgentComponentHeader.css");
7220
+ /* harmony import */ var _RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./RunAllCellsToolUI */ "./lib/components/AgentComponents/RunAllCellsToolUI.js");
6656
7221
  /*
6657
7222
  * Copyright (c) Saga Inc.
6658
7223
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6666,6 +7231,7 @@ __webpack_require__.r(__webpack_exports__);
6666
7231
 
6667
7232
 
6668
7233
 
7234
+
6669
7235
  const parsePythonErrorType = (content) => {
6670
7236
  if (!content)
6671
7237
  return 'Error';
@@ -6698,12 +7264,15 @@ const GroupedErrorsAndFixes = ({ messages, renderMimeRegistry, }) => {
6698
7264
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "error-fixup-header" },
6699
7265
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Fixing an error")),
6700
7266
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "error-fixup-messages-container" }, messages.map((messageItem, index) => {
6701
- var _a, _b, _c;
7267
+ var _a, _b, _c, _d;
6702
7268
  const isUserMessage = messageItem.message.role === 'user';
6703
7269
  if (isUserMessage) {
6704
7270
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ErrorDetectedBlock, { key: `error-${index}`, errorMessage: messageItem.message, renderMimeRegistry: renderMimeRegistry }));
6705
7271
  }
6706
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Extensions_AiChat_ChatMessage_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_8__["default"], { key: `assistant-${index}`, code: messageItem.message.content, codeSummary: (_c = (_b = (_a = messageItem.agentResponse) === null || _a === void 0 ? void 0 : _a.cell_update) === null || _b === void 0 ? void 0 : _b.code_summary) !== null && _c !== void 0 ? _c : undefined, isCodeComplete: true, renderMimeRegistry: renderMimeRegistry, previewAICode: () => { }, acceptAICode: () => { }, rejectAICode: () => { }, isLastAiMessage: false, codeReviewStatus: "chatPreview", agentModeEnabled: true, isErrorFixup: true }));
7272
+ if (((_a = messageItem.agentResponse) === null || _a === void 0 ? void 0 : _a.type) === 'run_all_cells') {
7273
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_RunAllCellsToolUI__WEBPACK_IMPORTED_MODULE_8__["default"], { key: `run-all-cells-${index}`, inErrorFixup: true }));
7274
+ }
7275
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Extensions_AiChat_ChatMessage_AssistantCodeBlock__WEBPACK_IMPORTED_MODULE_9__["default"], { key: `assistant-${index}`, code: messageItem.message.content, codeSummary: (_d = (_c = (_b = messageItem.agentResponse) === null || _b === void 0 ? void 0 : _b.cell_update) === null || _c === void 0 ? void 0 : _c.code_summary) !== null && _d !== void 0 ? _d : 'Fixing error', isCodeComplete: true, renderMimeRegistry: renderMimeRegistry, previewAICode: () => { }, acceptAICode: () => { }, rejectAICode: () => { }, isLastAiMessage: false, codeReviewStatus: "chatPreview", agentModeEnabled: true, isErrorFixup: true }));
6707
7276
  }))));
6708
7277
  };
6709
7278
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GroupedErrorsAndFixes);
@@ -6724,7 +7293,7 @@ __webpack_require__.r(__webpack_exports__);
6724
7293
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
6725
7294
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
6726
7295
  /* harmony import */ var _icons_MagnifyingGlassIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../icons/MagnifyingGlassIcon */ "./lib/icons/MagnifyingGlassIcon.js");
6727
- /* harmony import */ var _style_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/GetCellOutputToolUI.css */ "./style/GetCellOutputToolUI.css");
7296
+ /* harmony import */ var _style_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/AgentToolUIComponent.css */ "./style/AgentToolUIComponent.css");
6728
7297
  /*
6729
7298
  * Copyright (c) Saga Inc.
6730
7299
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6733,8 +7302,8 @@ __webpack_require__.r(__webpack_exports__);
6733
7302
 
6734
7303
 
6735
7304
  const GetCellOutputToolUI = () => {
6736
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "get-cell-output-container" },
6737
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "get-cell-output-content" },
7305
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-tool-ui-container" },
7306
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-tool-ui-content" },
6738
7307
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_MagnifyingGlassIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null),
6739
7308
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Taking a look at the cell output"))));
6740
7309
  };
@@ -6743,10 +7312,10 @@ const GetCellOutputToolUI = () => {
6743
7312
 
6744
7313
  /***/ }),
6745
7314
 
6746
- /***/ "./lib/components/DatabaseButton.js":
6747
- /*!******************************************!*\
6748
- !*** ./lib/components/DatabaseButton.js ***!
6749
- \******************************************/
7315
+ /***/ "./lib/components/AgentComponents/RunAllCellsToolUI.js":
7316
+ /*!*************************************************************!*\
7317
+ !*** ./lib/components/AgentComponents/RunAllCellsToolUI.js ***!
7318
+ \*************************************************************/
6750
7319
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6751
7320
 
6752
7321
  __webpack_require__.r(__webpack_exports__);
@@ -6755,10 +7324,9 @@ __webpack_require__.r(__webpack_exports__);
6755
7324
  /* harmony export */ });
6756
7325
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
6757
7326
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
6758
- /* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IconButton */ "./lib/components/IconButton.js");
6759
- /* harmony import */ var _icons_DatabaseOutlineIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/DatabaseOutlineIcon */ "./lib/icons/DatabaseOutlineIcon.js");
6760
- /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
6761
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
7327
+ /* harmony import */ var _icons_PlayButtonIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../icons/PlayButtonIcon */ "./lib/icons/PlayButtonIcon.js");
7328
+ /* harmony import */ var _style_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../style/AgentToolUIComponent.css */ "./style/AgentToolUIComponent.css");
7329
+ /* harmony import */ var _utils_classNames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/classNames */ "./lib/utils/classNames.js");
6762
7330
  /*
6763
7331
  * Copyright (c) Saga Inc.
6764
7332
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -6767,42 +7335,23 @@ __webpack_require__.r(__webpack_exports__);
6767
7335
 
6768
7336
 
6769
7337
 
6770
-
6771
- const DatabaseButton = ({ app }) => {
6772
- const [databaseConnections, setDatabaseConnections] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
6773
- const [isIconVisible, setIsIconVisible] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);
6774
- // Fetch database connections
6775
- const fetchDatabaseConnections = async () => {
6776
- const databaseConnections = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.getDatabaseConnections)();
6777
- setDatabaseConnections(databaseConnections);
6778
- };
6779
- // Fetch database connections
6780
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
6781
- void fetchDatabaseConnections();
6782
- }, []);
6783
- // Determine notification dot type based on connections
6784
- const getNotificationDotType = () => {
6785
- if (!isIconVisible) {
6786
- return null;
6787
- }
6788
- return Object.keys(databaseConnections).length > 0 ? 'success' : 'warning';
6789
- };
6790
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_2__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DatabaseOutlineIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null), title: 'Add Database', onClick: () => {
6791
- void app.commands.execute(_Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_4__.COMMAND_MITO_AI_SETTINGS);
6792
- setIsIconVisible(false);
6793
- }, notificationDotType: getNotificationDotType(), className: 'icon-button-hover', style: {
6794
- height: 'var(--chat-context-button-height)'
6795
- } }));
7338
+ const RunAllCellsToolUI = ({ inErrorFixup }) => {
7339
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_2__.classNames)('agent-tool-ui-container', {
7340
+ 'agent-tool-ui-error-fixup': inErrorFixup,
7341
+ }) },
7342
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "agent-tool-ui-content" },
7343
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_PlayButtonIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null),
7344
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Running all cells"))));
6796
7345
  };
6797
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DatabaseButton);
7346
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RunAllCellsToolUI);
6798
7347
 
6799
7348
 
6800
7349
  /***/ }),
6801
7350
 
6802
- /***/ "./lib/components/DropdownMenu.js":
6803
- /*!****************************************!*\
6804
- !*** ./lib/components/DropdownMenu.js ***!
6805
- \****************************************/
7351
+ /***/ "./lib/components/AttachFileButton.js":
7352
+ /*!********************************************!*\
7353
+ !*** ./lib/components/AttachFileButton.js ***!
7354
+ \********************************************/
6806
7355
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6807
7356
 
6808
7357
  __webpack_require__.r(__webpack_exports__);
@@ -6811,28 +7360,289 @@ __webpack_require__.r(__webpack_exports__);
6811
7360
  /* harmony export */ });
6812
7361
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
6813
7362
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
6814
- /* harmony import */ var _style_DropdownMenu_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../style/DropdownMenu.css */ "./style/DropdownMenu.css");
7363
+ /* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IconButton */ "./lib/components/IconButton.js");
7364
+ /* harmony import */ var _icons_PaperClipIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/PaperClipIcon */ "./lib/icons/PaperClipIcon.js");
7365
+ /* harmony import */ var _restAPI_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../restAPI/utils */ "./lib/restAPI/utils.js");
7366
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
7367
+ /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
6815
7368
  /*
6816
7369
  * Copyright (c) Saga Inc.
6817
7370
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
6818
7371
  */
6819
7372
 
6820
7373
 
6821
- const DropdownMenu = ({ trigger, items, className = '', alignment = 'left', }) => {
6822
- const [isOpen, setIsOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
6823
- const dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
6824
- // Close dropdown when clicking outside
6825
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
6826
- const handleClickOutside = (event) => {
6827
- if (dropdownRef.current &&
6828
- !dropdownRef.current.contains(event.target)) {
6829
- setIsOpen(false);
6830
- }
6831
- };
6832
- document.addEventListener('mousedown', handleClickOutside);
6833
- return () => document.removeEventListener('mousedown', handleClickOutside);
6834
- }, []);
6835
- // Handle the main click (primary action)
7374
+
7375
+
7376
+
7377
+ // Constants for file handling
7378
+ const CHUNKED_UPLOAD_SIZE_CUTOFF = 25 * 1024 * 1024; // 25MB cutoff for chunked uploads
7379
+ const CHUNK_SIZE = 10 * 1024 * 1024; // 10MB chunks
7380
+ const AttachFileButton = ({ onFileUploaded, notebookTracker }) => {
7381
+ const fileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
7382
+ const [isUploading, setIsUploading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7383
+ // Helper function to get notebook directory from notebook path
7384
+ const getNotebookDirectory = (notebookPath) => {
7385
+ const lastSlashIndex = notebookPath.lastIndexOf('/');
7386
+ if (lastSlashIndex === -1) {
7387
+ // No directory, just filename (root directory)
7388
+ return '.';
7389
+ }
7390
+ return notebookPath.substring(0, lastSlashIndex);
7391
+ };
7392
+ const handleClick = () => {
7393
+ var _a;
7394
+ // Don't allow clicks if uploading
7395
+ if (isUploading)
7396
+ return;
7397
+ // Trigger the hidden file input
7398
+ (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
7399
+ };
7400
+ const handleFileSelect = async (event) => {
7401
+ const files = event.target.files;
7402
+ if (!files || files.length === 0)
7403
+ return;
7404
+ const file = files[0];
7405
+ if (!file)
7406
+ return;
7407
+ // Don't allow new uploads if already uploading
7408
+ if (isUploading)
7409
+ return;
7410
+ setIsUploading(true);
7411
+ try {
7412
+ // Check file size and handle accordingly
7413
+ if (file.size > CHUNKED_UPLOAD_SIZE_CUTOFF) {
7414
+ console.log(`File ${file.name} is larger than 25MB (${(file.size / (1024 * 1024)).toFixed(2)}MB). Splitting into chunks...`);
7415
+ await handleLargeFile(file);
7416
+ }
7417
+ else {
7418
+ // Upload file directly for files <= 25MB
7419
+ await uploadFile(file);
7420
+ }
7421
+ }
7422
+ catch (error) {
7423
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(`Upload failed: ${error}`, "error", {
7424
+ autoClose: 5 * 1000 // 5 seconds
7425
+ });
7426
+ console.error('Error during file upload:', error);
7427
+ }
7428
+ finally {
7429
+ setIsUploading(false);
7430
+ // Clear the file input
7431
+ if (fileInputRef.current) {
7432
+ fileInputRef.current.value = '';
7433
+ }
7434
+ }
7435
+ };
7436
+ const handleLargeFile = async (file) => {
7437
+ const totalChunks = Math.ceil(file.size / CHUNK_SIZE);
7438
+ console.log(`Splitting file into ${totalChunks} chunks of ${(CHUNK_SIZE / (1024 * 1024)).toFixed(2)}MB each`);
7439
+ // Get notebook directory path
7440
+ const notebookPanel = notebookTracker.currentWidget;
7441
+ if (!notebookPanel) {
7442
+ console.error('No notebook is currently active');
7443
+ throw new Error('No notebook is currently active');
7444
+ }
7445
+ const notebookPath = notebookPanel.context.path;
7446
+ const notebookDir = getNotebookDirectory(notebookPath);
7447
+ for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) {
7448
+ const start = chunkIndex * CHUNK_SIZE;
7449
+ const end = Math.min(start + CHUNK_SIZE, file.size);
7450
+ const chunk = file.slice(start, end);
7451
+ console.log(`Uploading chunk ${chunkIndex + 1}/${totalChunks}:`, {
7452
+ chunkNumber: chunkIndex + 1,
7453
+ totalChunks: totalChunks,
7454
+ chunkSize: chunk.size,
7455
+ chunkSizeMB: (chunk.size / (1024 * 1024)).toFixed(2),
7456
+ startByte: start,
7457
+ endByte: end,
7458
+ fileName: file.name,
7459
+ originalFileSize: file.size,
7460
+ originalFileSizeMB: (file.size / (1024 * 1024)).toFixed(2)
7461
+ });
7462
+ // Upload chunk to backend
7463
+ const success = await uploadChunk(chunk, file.name, chunkIndex + 1, totalChunks, notebookDir);
7464
+ if (!success) {
7465
+ console.error(`Failed to upload chunk ${chunkIndex + 1}`);
7466
+ throw new Error(`Failed to upload chunk ${chunkIndex + 1}`);
7467
+ }
7468
+ }
7469
+ console.log(`Successfully uploaded all ${totalChunks} chunks for file: ${file.name}`);
7470
+ // Notify the parent component that the file was uploaded
7471
+ onFileUploaded(file);
7472
+ };
7473
+ const uploadChunk = async (chunk, filename, chunkNumber, totalChunks, notebookDir) => {
7474
+ try {
7475
+ // Create FormData for chunk upload
7476
+ const formData = new FormData();
7477
+ formData.append('file', chunk, filename);
7478
+ formData.append('chunk_number', chunkNumber.toString());
7479
+ formData.append('total_chunks', totalChunks.toString());
7480
+ formData.append('notebook_dir', notebookDir);
7481
+ // Upload chunk to backend
7482
+ const resp = await (0,_restAPI_utils__WEBPACK_IMPORTED_MODULE_2__.requestAPI)('upload', {
7483
+ method: 'POST',
7484
+ body: formData
7485
+ });
7486
+ if (resp.error) {
7487
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(`Upload failed: ${resp.error.message}`, "error", {
7488
+ autoClose: 5 * 1000 // 5 seconds
7489
+ });
7490
+ console.error(`Chunk ${chunkNumber} upload failed:`, resp.error.message);
7491
+ return false;
7492
+ }
7493
+ else if (resp.data) {
7494
+ if (resp.data.chunk_complete) {
7495
+ console.log(`All chunks uploaded successfully. File reconstructed: ${resp.data.filename}`);
7496
+ }
7497
+ else if (resp.data.chunk_received) {
7498
+ console.log(`Chunk ${resp.data.chunk_number}/${resp.data.total_chunks} uploaded successfully`);
7499
+ }
7500
+ return true;
7501
+ }
7502
+ return false;
7503
+ }
7504
+ catch (error) {
7505
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(`Upload failed: ${error}`, "error", {
7506
+ autoClose: 5 * 1000 // 5 seconds
7507
+ });
7508
+ console.error(`Error uploading chunk ${chunkNumber}:`, error);
7509
+ return false;
7510
+ }
7511
+ };
7512
+ const uploadFile = async (file) => {
7513
+ // Get notebook directory path
7514
+ const notebookPanel = notebookTracker.currentWidget;
7515
+ if (!notebookPanel) {
7516
+ console.error('No notebook is currently active');
7517
+ throw new Error('No notebook is currently active');
7518
+ }
7519
+ const notebookPath = notebookPanel.context.path;
7520
+ const notebookDir = getNotebookDirectory(notebookPath);
7521
+ // Create FormData for file upload
7522
+ const formData = new FormData();
7523
+ formData.append('file', file);
7524
+ formData.append('notebook_dir', notebookDir);
7525
+ // Upload file to backend using FormData
7526
+ const resp = await (0,_restAPI_utils__WEBPACK_IMPORTED_MODULE_2__.requestAPI)('upload', {
7527
+ method: 'POST',
7528
+ body: formData
7529
+ });
7530
+ if (resp.error) {
7531
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(`Upload failed: ${resp.error.message}`, "error", {
7532
+ autoClose: 5 * 1000 // 5 seconds
7533
+ });
7534
+ console.error('Upload failed:', resp.error.message);
7535
+ throw new Error(resp.error.message);
7536
+ }
7537
+ else if (resp.data) {
7538
+ console.log('File uploaded successfully:', resp.data);
7539
+ // Notify the parent component that the file was uploaded,
7540
+ // which will update the context manager.
7541
+ onFileUploaded(file);
7542
+ }
7543
+ };
7544
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { position: 'relative' } },
7545
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: fileInputRef, type: "file", style: { display: 'none' }, onChange: handleFileSelect, accept: "*" }),
7546
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_3__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_PaperClipIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null), title: isUploading ? 'Uploading...' : 'Attach File', onClick: handleClick, className: 'icon-button-hover', disabled: isUploading, style: {
7547
+ opacity: isUploading ? 0.5 : 1,
7548
+ cursor: isUploading ? 'not-allowed' : 'pointer'
7549
+ } })));
7550
+ };
7551
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AttachFileButton);
7552
+
7553
+
7554
+ /***/ }),
7555
+
7556
+ /***/ "./lib/components/DatabaseButton.js":
7557
+ /*!******************************************!*\
7558
+ !*** ./lib/components/DatabaseButton.js ***!
7559
+ \******************************************/
7560
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7561
+
7562
+ __webpack_require__.r(__webpack_exports__);
7563
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7564
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
7565
+ /* harmony export */ });
7566
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7567
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7568
+ /* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IconButton */ "./lib/components/IconButton.js");
7569
+ /* harmony import */ var _icons_DatabaseOutlineIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/DatabaseOutlineIcon */ "./lib/icons/DatabaseOutlineIcon.js");
7570
+ /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
7571
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
7572
+ /*
7573
+ * Copyright (c) Saga Inc.
7574
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7575
+ */
7576
+
7577
+
7578
+
7579
+
7580
+
7581
+ const DatabaseButton = ({ app }) => {
7582
+ const [databaseConnections, setDatabaseConnections] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
7583
+ const [isIconVisible, setIsIconVisible] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);
7584
+ // Fetch database connections
7585
+ const fetchDatabaseConnections = async () => {
7586
+ const databaseConnections = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.getDatabaseConnections)();
7587
+ setDatabaseConnections(databaseConnections);
7588
+ };
7589
+ // Fetch database connections
7590
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7591
+ void fetchDatabaseConnections();
7592
+ }, []);
7593
+ // Determine notification dot type based on connections
7594
+ const getNotificationDotType = () => {
7595
+ if (!isIconVisible) {
7596
+ return null;
7597
+ }
7598
+ return Object.keys(databaseConnections).length > 0 ? 'success' : 'warning';
7599
+ };
7600
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_IconButton__WEBPACK_IMPORTED_MODULE_2__["default"], { icon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DatabaseOutlineIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null), title: 'Add Database', onClick: () => {
7601
+ void app.commands.execute(_Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_4__.COMMAND_MITO_AI_SETTINGS);
7602
+ setIsIconVisible(false);
7603
+ }, notificationDotType: getNotificationDotType(), className: 'icon-button-hover', style: {
7604
+ height: 'var(--chat-context-button-height)'
7605
+ } }));
7606
+ };
7607
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DatabaseButton);
7608
+
7609
+
7610
+ /***/ }),
7611
+
7612
+ /***/ "./lib/components/DropdownMenu.js":
7613
+ /*!****************************************!*\
7614
+ !*** ./lib/components/DropdownMenu.js ***!
7615
+ \****************************************/
7616
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
7617
+
7618
+ __webpack_require__.r(__webpack_exports__);
7619
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7620
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
7621
+ /* harmony export */ });
7622
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
7623
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7624
+ /* harmony import */ var _style_DropdownMenu_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../style/DropdownMenu.css */ "./style/DropdownMenu.css");
7625
+ /*
7626
+ * Copyright (c) Saga Inc.
7627
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
7628
+ */
7629
+
7630
+
7631
+ const DropdownMenu = ({ trigger, items, className = '', alignment = 'left', }) => {
7632
+ const [isOpen, setIsOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7633
+ const dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
7634
+ // Close dropdown when clicking outside
7635
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7636
+ const handleClickOutside = (event) => {
7637
+ if (dropdownRef.current &&
7638
+ !dropdownRef.current.contains(event.target)) {
7639
+ setIsOpen(false);
7640
+ }
7641
+ };
7642
+ document.addEventListener('mousedown', handleClickOutside);
7643
+ return () => document.removeEventListener('mousedown', handleClickOutside);
7644
+ }, []);
7645
+ // Handle the main click (primary action)
6836
7646
  const handlePrimaryClick = (onClick, disabled) => {
6837
7647
  if (disabled)
6838
7648
  return;
@@ -6888,8 +7698,8 @@ __webpack_require__.r(__webpack_exports__);
6888
7698
 
6889
7699
 
6890
7700
 
6891
- const IconButton = ({ icon, onClick, title, style, notificationDotType = null, className }) => {
6892
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_3__.classNames)("icon-button", className), onClick: onClick, title: title, style: style },
7701
+ const IconButton = ({ icon, onClick, title, style, notificationDotType = null, className, disabled = false }) => {
7702
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: (0,_utils_classNames__WEBPACK_IMPORTED_MODULE_3__.classNames)("icon-button", className), onClick: onClick, title: title, style: style, disabled: disabled },
6893
7703
  icon,
6894
7704
  notificationDotType && react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: `notification-dot notification-dot-${notificationDotType}` })));
6895
7705
  };
@@ -7155,9 +7965,10 @@ __webpack_require__.r(__webpack_exports__);
7155
7965
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
7156
7966
  /* harmony import */ var _style_SelectedContextContainer_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../style/SelectedContextContainer.css */ "./style/SelectedContextContainer.css");
7157
7967
  /* harmony import */ var _icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/RuleIcon */ "./lib/icons/RuleIcon.js");
7158
- /* harmony import */ var _icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/CodeIcon */ "./lib/icons/CodeIcon.js");
7159
- /* harmony import */ var _icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/DatabaseIcon */ "./lib/icons/DatabaseIcon.js");
7160
- /* 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");
7161
7972
  /*
7162
7973
  * Copyright (c) Saga Inc.
7163
7974
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -7168,22 +7979,24 @@ __webpack_require__.r(__webpack_exports__);
7168
7979
 
7169
7980
 
7170
7981
 
7982
+
7171
7983
  const SelectedContextContainer = ({ title, type, onRemove, onClick, notebookTracker, activeCellID }) => {
7172
7984
  const [isHovered, setIsHovered] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7173
7985
  let icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null);
7174
- switch (type) {
7175
- case 'rule':
7176
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_RuleIcon__WEBPACK_IMPORTED_MODULE_2__["default"], null);
7177
- break;
7178
- case 'variable':
7179
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null);
7180
- break;
7181
- case 'db':
7182
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_DatabaseIcon__WEBPACK_IMPORTED_MODULE_4__["default"], null);
7183
- break;
7184
- case 'active_cell':
7185
- icon = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_icons_CodeIcon__WEBPACK_IMPORTED_MODULE_3__["default"], null);
7186
- 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);
7187
8000
  }
7188
8001
  const handleClick = () => {
7189
8002
  var _a;
@@ -7191,13 +8004,13 @@ const SelectedContextContainer = ({ title, type, onRemove, onClick, notebookTrac
7191
8004
  // Handle active cell context click
7192
8005
  if (notebookTracker && activeCellID) {
7193
8006
  // Find the cell
7194
- 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);
7195
8008
  if (cell) {
7196
8009
  // Scroll to the cell
7197
8010
  void ((_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content.scrollToCell(cell, 'center'));
7198
8011
  // Highlight the cell
7199
8012
  setTimeout(() => {
7200
- (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_5__.highlightCodeCell)(notebookTracker, activeCellID);
8013
+ (0,_utils_notebook__WEBPACK_IMPORTED_MODULE_6__.highlightCodeCell)(notebookTracker, activeCellID);
7201
8014
  }, 500);
7202
8015
  }
7203
8016
  }
@@ -7715,6 +8528,31 @@ const NucleausIcon = ({ height = 20, width = 20, }) => (react__WEBPACK_IMPORTED_
7715
8528
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NucleausIcon);
7716
8529
 
7717
8530
 
8531
+ /***/ }),
8532
+
8533
+ /***/ "./lib/icons/PaperClipIcon.js":
8534
+ /*!************************************!*\
8535
+ !*** ./lib/icons/PaperClipIcon.js ***!
8536
+ \************************************/
8537
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8538
+
8539
+ __webpack_require__.r(__webpack_exports__);
8540
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8541
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
8542
+ /* harmony export */ });
8543
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
8544
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
8545
+ /*
8546
+ * Copyright (c) Saga Inc.
8547
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8548
+ */
8549
+
8550
+ const PaperClipIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { width: "14", height: "14", viewBox: "0 0 72 86", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
8551
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", { fill: "currentColor" },
8552
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M70.363 44.59C68.6013 43.258 66.0935 43.6017 64.7575 45.3634L46.4995 69.4724C39.73 78.4099 27.0735 80.6284 17.6905 74.5154C12.71 71.2693 9.39359 66.2537 8.37409 60.3904C7.31939 54.3435 8.8819 48.0154 12.6632 43.0234L35.3312 13.0894C39.5773 7.48783 47.5812 6.37853 53.1902 10.6246C58.7879 14.8668 59.8894 22.8746 55.6472 28.4766L50.8425 34.8204L32.6475 58.8434C31.1709 60.7965 28.4366 61.3629 26.5577 60.109C25.5304 59.4215 24.8546 58.3863 24.6515 57.1832C24.4484 55.984 24.7413 54.7887 25.4757 53.8199L43.8707 29.5389C45.2027 27.7772 44.859 25.2694 43.0973 23.9334C41.3356 22.6014 38.8278 22.9452 37.4918 24.7069L19.0968 48.9879C17.0499 51.691 16.1984 55.1637 16.7648 58.5113C17.296 61.6597 18.964 64.4019 21.4914 66.316C21.6945 66.4722 21.9054 66.6207 22.1203 66.7652C27.3781 70.273 34.5073 69.0933 38.6323 64.1441C38.6948 64.0699 38.769 64.0113 38.8276 63.9332L39.0229 63.6714L62.0229 33.3044C68.9291 24.1833 67.1362 11.1484 58.0112 4.23843C48.8979 -2.66387 35.8632 -0.863167 28.9522 8.25793L6.2842 38.1919L5.88967 38.7115C5.8428 38.774 5.81545 38.8404 5.77248 38.9029C1.03418 45.5435 -0.895518 53.8209 0.491282 61.7619C1.77648 69.1252 5.68268 75.5239 11.5693 79.9849C12.1357 80.4146 12.7216 80.8247 13.3232 81.2154C26.2102 89.606 43.5812 86.567 52.8782 74.2974L71.1362 50.1924C72.4721 48.4307 72.1247 45.9221 70.363 44.59Z" }))));
8553
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PaperClipIcon);
8554
+
8555
+
7718
8556
  /***/ }),
7719
8557
 
7720
8558
  /***/ "./lib/icons/Pencil.js":
@@ -7740,6 +8578,33 @@ const PencilIcon = () => (react__WEBPACK_IMPORTED_MODULE_0___default().createEle
7740
8578
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PencilIcon);
7741
8579
 
7742
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
+
7743
8608
  /***/ }),
7744
8609
 
7745
8610
  /***/ "./lib/icons/PlayButtonIcon.js":
@@ -7920,6 +8785,7 @@ __webpack_require__.r(__webpack_exports__);
7920
8785
  /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
7921
8786
  /* harmony import */ var _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Extensions/VersionCheck */ "./lib/Extensions/VersionCheck/index.js");
7922
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");
7923
8789
  /*
7924
8790
  * Copyright (c) Saga Inc.
7925
8791
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -7935,6 +8801,7 @@ __webpack_require__.r(__webpack_exports__);
7935
8801
 
7936
8802
 
7937
8803
 
8804
+
7938
8805
  // This is the main entry point to the mito-ai extension. It must export all of the top level
7939
8806
  // extensions that we want to load.
7940
8807
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([
@@ -7948,7 +8815,8 @@ __webpack_require__.r(__webpack_exports__);
7948
8815
  _Extensions_status__WEBPACK_IMPORTED_MODULE_7__.statusItem,
7949
8816
  _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__["default"],
7950
8817
  _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__.versionCheckPlugin,
7951
- _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"]
8818
+ _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"],
8819
+ _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__["default"]
7952
8820
  ]);
7953
8821
 
7954
8822
 
@@ -8193,7 +9061,8 @@ __webpack_require__.r(__webpack_exports__);
8193
9061
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8194
9062
  /* harmony export */ acceptAndRunCellUpdate: () => (/* binding */ acceptAndRunCellUpdate),
8195
9063
  /* harmony export */ acceptAndRunCode: () => (/* binding */ acceptAndRunCode),
8196
- /* harmony export */ retryIfExecutionError: () => (/* binding */ retryIfExecutionError)
9064
+ /* harmony export */ retryIfExecutionError: () => (/* binding */ retryIfExecutionError),
9065
+ /* harmony export */ runAllCells: () => (/* binding */ runAllCells)
8197
9066
  /* harmony export */ });
8198
9067
  /* harmony import */ var _Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Extensions/ErrorMimeRenderer/errorUtils */ "./lib/Extensions/ErrorMimeRenderer/errorUtils.js");
8199
9068
  /* harmony import */ var _sleep__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sleep */ "./lib/utils/sleep.js");
@@ -8249,12 +9118,14 @@ const acceptAndRunCode = async (app, notebookTracker, previewAICodeToActiveCell,
8249
9118
  await (0,_sleep__WEBPACK_IMPORTED_MODULE_1__.sleep)(1000);
8250
9119
  };
8251
9120
  const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHistoryManager, addAIMessageFromResponseAndUpdateState, sendAgentSmartDebugMessage, previewAICodeToActiveCell, acceptAICode, shouldContinueAgentExecution, finalizeAgentStop, chatHistoryManagerRef) => {
8252
- var _a, _b, _c, _d, _e;
9121
+ var _a, _b, _c;
8253
9122
  const cell = (_b = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.activeCell;
8254
9123
  // Note: If you update the max retries, update the message we display on each failure
8255
9124
  // attempt to ensure we don't say "third attempt" over and over again.
8256
9125
  const MAX_RETRIES = 3;
8257
9126
  let attempts = 0;
9127
+ let runAllCellsAttempts = 0;
9128
+ const MAX_RUN_ALL_CELLS_ATTEMPTS = 2; // Only allow two run_all_cells attempt per error cycle
8258
9129
  while ((0,_notebook__WEBPACK_IMPORTED_MODULE_0__.didCellExecutionError)(cell) && attempts < MAX_RETRIES) {
8259
9130
  if (!shouldContinueAgentExecution.current) {
8260
9131
  finalizeAgentStop();
@@ -8269,16 +9140,35 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
8269
9140
  const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
8270
9141
  await sendAgentSmartDebugMessage(errorMessage);
8271
9142
  const aiDisplayOptimizedChatItem = chatHistoryManagerRef.current.getLastAIDisplayOptimizedChatItem();
8272
- // TODO: We expect that the agent responds with a cell_update if they are prompted to fix an error.
8273
- // But we are not enforcing that right now. We can fix this by setting the response_format for agent:smartDebug
8274
- // to only allow cell_updates and then we can return the agentResponse from sendAgentSmartDebugMessage so
8275
- // typescript knows what type it is.
8276
- if (((_d = aiDisplayOptimizedChatItem === null || aiDisplayOptimizedChatItem === void 0 ? void 0 : aiDisplayOptimizedChatItem.agentResponse) === null || _d === void 0 ? void 0 : _d.type) !== 'cell_update' || ((_e = aiDisplayOptimizedChatItem === null || aiDisplayOptimizedChatItem === void 0 ? void 0 : aiDisplayOptimizedChatItem.agentResponse) === null || _e === void 0 ? void 0 : _e.cell_update) === undefined) {
9143
+ // Handle different response types from the agent when fixing errors
9144
+ const agentResponse = aiDisplayOptimizedChatItem === null || aiDisplayOptimizedChatItem === void 0 ? void 0 : aiDisplayOptimizedChatItem.agentResponse;
9145
+ if (!agentResponse) {
8277
9146
  return 'failure';
8278
9147
  }
8279
- const cellUpdate = aiDisplayOptimizedChatItem.agentResponse.cell_update;
8280
- if (cellUpdate !== undefined && cellUpdate !== null) {
8281
- await acceptAndRunCellUpdate(cellUpdate, notebookTracker, app, previewAICodeToActiveCell, acceptAICode);
9148
+ if (agentResponse.type === 'cell_update') {
9149
+ const cellUpdate = agentResponse.cell_update;
9150
+ if (cellUpdate !== undefined && cellUpdate !== null) {
9151
+ await acceptAndRunCellUpdate(cellUpdate, notebookTracker, app, previewAICodeToActiveCell, acceptAICode);
9152
+ }
9153
+ }
9154
+ else if (agentResponse.type === 'run_all_cells') {
9155
+ // Prevent infinite loops by limiting run_all_cells attempts
9156
+ if (runAllCellsAttempts >= MAX_RUN_ALL_CELLS_ATTEMPTS) {
9157
+ console.log('Maximum run_all_cells attempts reached, treating as failure');
9158
+ return 'failure';
9159
+ }
9160
+ runAllCellsAttempts++;
9161
+ // Execute runAllCells to fix NameError issues
9162
+ const result = await runAllCells(app, notebookTracker);
9163
+ if (!result.success) {
9164
+ // If run_all_cells resulted in an error, we should continue with error handling
9165
+ // The error will be caught in the main loop
9166
+ console.log('Error after running all cells:', result.errorMessage);
9167
+ }
9168
+ }
9169
+ else {
9170
+ // Agent responded with an unexpected type for error fixing
9171
+ return 'failure';
8282
9172
  }
8283
9173
  attempts++;
8284
9174
  // If this was the last attempt and it still failed
@@ -8288,6 +9178,37 @@ const retryIfExecutionError = async (notebookTracker, app, getDuplicateChatHisto
8288
9178
  }
8289
9179
  return 'success';
8290
9180
  };
9181
+ const runAllCells = async (app, notebookTracker) => {
9182
+ var _a, _b;
9183
+ await app.commands.execute("notebook:run-all-cells");
9184
+ // Give the execution some time to complete and update variables
9185
+ // This ensures that the variable manager has time to update the state
9186
+ await (0,_sleep__WEBPACK_IMPORTED_MODULE_1__.sleep)(2000);
9187
+ // Check all cells for errors after execution
9188
+ const notebook = (_a = notebookTracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content;
9189
+ if (!notebook) {
9190
+ return { success: false, errorMessage: "No active notebook found" };
9191
+ }
9192
+ // Iterate through all cells to find any with errors
9193
+ for (let i = 0; i < notebook.widgets.length; i++) {
9194
+ const cell = notebook.widgets[i];
9195
+ if (cell && cell.model.type === 'code') {
9196
+ const codeCell = cell;
9197
+ if ((0,_notebook__WEBPACK_IMPORTED_MODULE_0__.didCellExecutionError)(codeCell)) {
9198
+ const errorOutput = (_b = codeCell.model.outputs) === null || _b === void 0 ? void 0 : _b.toJSON().find(output => output.output_type === "error");
9199
+ if (errorOutput) {
9200
+ const errorMessage = (0,_Extensions_ErrorMimeRenderer_errorUtils__WEBPACK_IMPORTED_MODULE_2__.getFullErrorMessageFromTraceback)(errorOutput.traceback);
9201
+ return {
9202
+ success: false,
9203
+ errorMessage: errorMessage,
9204
+ errorCellId: codeCell.model.id
9205
+ };
9206
+ }
9207
+ }
9208
+ }
9209
+ }
9210
+ return { success: true };
9211
+ };
8291
9212
 
8292
9213
 
8293
9214
  /***/ }),
@@ -10252,15 +11173,15 @@ class AppBuilderWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
10252
11173
 
10253
11174
  /***/ }),
10254
11175
 
10255
- /***/ "./lib/websockets/completions/CompletionsWebsocketClient.js":
10256
- /*!******************************************************************!*\
10257
- !*** ./lib/websockets/completions/CompletionsWebsocketClient.js ***!
10258
- \******************************************************************/
11176
+ /***/ "./lib/websockets/appManager/appManagerWebsocketClient.js":
11177
+ /*!****************************************************************!*\
11178
+ !*** ./lib/websockets/appManager/appManagerWebsocketClient.js ***!
11179
+ \****************************************************************/
10259
11180
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10260
11181
 
10261
11182
  __webpack_require__.r(__webpack_exports__);
10262
11183
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10263
- /* harmony export */ CompletionWebsocketClient: () => (/* binding */ CompletionWebsocketClient)
11184
+ /* harmony export */ AppManagerWebsocketClient: () => (/* binding */ AppManagerWebsocketClient)
10264
11185
  /* harmony export */ });
10265
11186
  /* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
10266
11187
  /*
@@ -10269,33 +11190,27 @@ __webpack_require__.r(__webpack_exports__);
10269
11190
  */
10270
11191
 
10271
11192
  /**
10272
- * Mito AI completion client
11193
+ * Mito AI app manager client
10273
11194
  *
10274
- * It communicates with the backend over a WebSocket to allow streaming answer.
11195
+ * It communicates with the backend over a WebSocket for app managing functionality.
10275
11196
  */
10276
- class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
11197
+ class AppManagerWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
10277
11198
  /**
10278
- * Create a new completion client.
11199
+ * Create a new app manager client.
10279
11200
  */
10280
11201
  constructor(options = {}) {
10281
11202
  super(options);
10282
11203
  /**
10283
11204
  * The service URL for the websocket endpoint.
10284
11205
  */
10285
- this.SERVICE_URL = 'mito-ai/completions';
11206
+ this.SERVICE_URL = 'mito-ai/app-manager';
10286
11207
  }
10287
11208
  /**
10288
- * Completion chunk stream.
11209
+ * App manager messages stream.
10289
11210
  */
10290
11211
  get messages() {
10291
11212
  return this._messages;
10292
11213
  }
10293
- /**
10294
- * Completion chunk stream.
10295
- */
10296
- get stream() {
10297
- return this._stream;
10298
- }
10299
11214
  /**
10300
11215
  * Stream of connection status events
10301
11216
  */
@@ -10303,37 +11218,138 @@ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_M
10303
11218
  return this._connectionStatus;
10304
11219
  }
10305
11220
  /**
10306
- * Extract the message ID from a request message.
11221
+ * Get message ID from request (required by BaseWebsocketClient)
10307
11222
  */
10308
- getMessageId(message) {
10309
- return message.message_id;
11223
+ getMessageId(request) {
11224
+ return `${request.type}_${Date.now()}_${Math.random().toString(36).substring(7)}`;
10310
11225
  }
10311
11226
  /**
10312
11227
  * Process a message received from the websocket.
11228
+ * Routes responses to the appropriate pending requests.
10313
11229
  */
10314
11230
  _onMessage(message) {
10315
- /**
10316
- * Emit unconditionally the message to interested parties.
10317
- */
11231
+ // Emit the message to stream listeners
10318
11232
  this._messages.emit(message);
10319
- /**
10320
- * Dispatch completion messages
10321
- */
10322
- switch (message.type) {
10323
- case 'chunk': {
10324
- // To see the stream in action, uncomment the following line
10325
- // console.log(`[Mito AI Stream] ${message.done ? 'FINAL' : ''} Chunk:`, message.chunk.content);
10326
- this._stream.emit(message);
10327
- break;
10328
- }
10329
- case 'reply': {
10330
- const resolver = this._pendingRepliesMap.get(message.parent_id);
10331
- if (resolver) {
10332
- resolver.resolve(message);
10333
- this._pendingRepliesMap.delete(message.parent_id);
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];
10334
11250
  }
10335
- else {
10336
- // For streaming responses, emit the error through the stream
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
+
11269
+ /***/ }),
11270
+
11271
+ /***/ "./lib/websockets/completions/CompletionsWebsocketClient.js":
11272
+ /*!******************************************************************!*\
11273
+ !*** ./lib/websockets/completions/CompletionsWebsocketClient.js ***!
11274
+ \******************************************************************/
11275
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11276
+
11277
+ __webpack_require__.r(__webpack_exports__);
11278
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11279
+ /* harmony export */ CompletionWebsocketClient: () => (/* binding */ CompletionWebsocketClient)
11280
+ /* harmony export */ });
11281
+ /* harmony import */ var _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../BaseWebsocketClient */ "./lib/websockets/BaseWebsocketClient.js");
11282
+ /*
11283
+ * Copyright (c) Saga Inc.
11284
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11285
+ */
11286
+
11287
+ /**
11288
+ * Mito AI completion client
11289
+ *
11290
+ * It communicates with the backend over a WebSocket to allow streaming answer.
11291
+ */
11292
+ class CompletionWebsocketClient extends _BaseWebsocketClient__WEBPACK_IMPORTED_MODULE_0__.BaseWebsocketClient {
11293
+ /**
11294
+ * Create a new completion client.
11295
+ */
11296
+ constructor(options = {}) {
11297
+ super(options);
11298
+ /**
11299
+ * The service URL for the websocket endpoint.
11300
+ */
11301
+ this.SERVICE_URL = 'mito-ai/completions';
11302
+ }
11303
+ /**
11304
+ * Completion chunk stream.
11305
+ */
11306
+ get messages() {
11307
+ return this._messages;
11308
+ }
11309
+ /**
11310
+ * Completion chunk stream.
11311
+ */
11312
+ get stream() {
11313
+ return this._stream;
11314
+ }
11315
+ /**
11316
+ * Stream of connection status events
11317
+ */
11318
+ get connectionStatus() {
11319
+ return this._connectionStatus;
11320
+ }
11321
+ /**
11322
+ * Extract the message ID from a request message.
11323
+ */
11324
+ getMessageId(message) {
11325
+ return message.message_id;
11326
+ }
11327
+ /**
11328
+ * Process a message received from the websocket.
11329
+ */
11330
+ _onMessage(message) {
11331
+ /**
11332
+ * Emit unconditionally the message to interested parties.
11333
+ */
11334
+ this._messages.emit(message);
11335
+ /**
11336
+ * Dispatch completion messages
11337
+ */
11338
+ switch (message.type) {
11339
+ case 'chunk': {
11340
+ // To see the stream in action, uncomment the following line
11341
+ // console.log(`[Mito AI Stream] ${message.done ? 'FINAL' : ''} Chunk:`, message.chunk.content);
11342
+ this._stream.emit(message);
11343
+ break;
11344
+ }
11345
+ case 'reply': {
11346
+ const resolver = this._pendingRepliesMap.get(message.parent_id);
11347
+ if (resolver) {
11348
+ resolver.resolve(message);
11349
+ this._pendingRepliesMap.delete(message.parent_id);
11350
+ }
11351
+ else {
11352
+ // For streaming responses, emit the error through the stream
10337
11353
  // We need to do this here because errors do not come in as "chunk" messages
10338
11354
  // they come in as "reply" messages.
10339
11355
  if (message.error) {
@@ -10395,119 +11411,1031 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
10395
11411
  transition: background-color 0.2s ease, border-color 0.2s ease;
10396
11412
  }
10397
11413
 
10398
- .agent-component-header:hover {
10399
- background-color: var(--jp-layout-color3);
11414
+ .agent-component-header:hover {
11415
+ background-color: var(--jp-layout-color3);
11416
+ }
11417
+
11418
+ .agent-component-header.no-border {
11419
+ border: none;
11420
+ }
11421
+
11422
+ .agent-component-header.expanded {
11423
+ border: none;
11424
+ border-radius: 5px 5px 0 0;
11425
+ background-color: var(--jp-layout-color2);
11426
+ }
11427
+
11428
+ .agent-component-header.error-fixup {
11429
+ border: none;
11430
+ }
11431
+
11432
+ .agent-component-header.error-fixup.expanded {
11433
+ background-color: var(--jp-layout-color2);
11434
+ }
11435
+
11436
+ .agent-component-header-content {
11437
+ display: flex;
11438
+ align-items: center;
11439
+ gap: 10px;
11440
+ flex: 1;
11441
+ min-width: 0;
11442
+ }
11443
+
11444
+ .agent-component-header-content svg {
11445
+ flex-shrink: 0;
11446
+ }
11447
+
11448
+ .agent-component-header-expand-icon {
11449
+ flex-shrink: 0;
11450
+ transition: transform 0.2s ease;
11451
+ }
11452
+
11453
+ .agent-component-header-expand-icon.expanded {
11454
+ transform: rotate(90deg);
11455
+ } `, "",{"version":3,"sources":["webpack://./style/AgentComponentHeader.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,eAAe;IACf,+DAA+D;IAC/D,+BAA+B;IAC/B,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,oDAAoD;IACpD,sDAAsD;IACtD,8DAA8D;AAClE;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,YAAY;IACZ,0BAA0B;IAC1B,yCAAyC;AAC7C;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,OAAO;IACP,YAAY;AAChB;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,cAAc;IACd,+BAA+B;AACnC;;AAEA;IACI,wBAAwB;AAC5B","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.agent-component-header {\n cursor: pointer;\n padding: 10px var(--chat-taskpane-tool-call-horizontal-padding);\n color: var(--jp-ui-font-color2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--jp-cell-editor-border-color);\n border-radius: var(--chat-taskpane-item-border-radius);\n transition: background-color 0.2s ease, border-color 0.2s ease;\n}\n\n.agent-component-header:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.agent-component-header.no-border {\n border: none;\n}\n\n.agent-component-header.expanded {\n border: none;\n border-radius: 5px 5px 0 0;\n background-color: var(--jp-layout-color2);\n}\n\n.agent-component-header.error-fixup {\n border: none;\n}\n\n.agent-component-header.error-fixup.expanded {\n background-color: var(--jp-layout-color2);\n}\n\n.agent-component-header-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n}\n\n.agent-component-header-content svg {\n flex-shrink: 0;\n}\n\n.agent-component-header-expand-icon {\n flex-shrink: 0;\n transition: transform 0.2s ease;\n}\n\n.agent-component-header-expand-icon.expanded {\n transform: rotate(90deg);\n} "],"sourceRoot":""}]);
11456
+ // Exports
11457
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11458
+
11459
+
11460
+ /***/ }),
11461
+
11462
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AgentToolUIComponent.css":
11463
+ /*!******************************************************************************!*\
11464
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AgentToolUIComponent.css ***!
11465
+ \******************************************************************************/
11466
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
11467
+
11468
+ __webpack_require__.r(__webpack_exports__);
11469
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11470
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11471
+ /* harmony export */ });
11472
+ /* 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");
11473
+ /* 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__);
11474
+ /* 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");
11475
+ /* 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__);
11476
+ // Imports
11477
+
11478
+
11479
+ 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()));
11480
+ // Module
11481
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
11482
+ * Copyright (c) Saga Inc.
11483
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11484
+ */
11485
+
11486
+ .agent-tool-ui-container {
11487
+ display: flex;
11488
+ flex-direction: row;
11489
+ align-items: center;
11490
+ justify-content: start;
11491
+ background-color: transparent;
11492
+ padding: 10px;
11493
+ color: var(--jp-ui-font-color2);
11494
+ }
11495
+
11496
+ .agent-tool-ui-container:not(.agent-tool-ui-error-fixup) {
11497
+ margin: 10px 0;
11498
+ border-radius: 5px;
11499
+ border: 1px solid var(--jp-cell-editor-border-color);
11500
+ }
11501
+
11502
+ .agent-tool-ui-container:not(.agent-tool-ui-error-fixup) .agent-tool-ui-content {
11503
+ margin-left: 5px;
11504
+ }
11505
+
11506
+ .agent-tool-ui-content {
11507
+ display: flex;
11508
+ align-items: center;
11509
+ gap: 10px;
11510
+ }
11511
+ `, "",{"version":3,"sources":["webpack://./style/AgentToolUIComponent.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,aAAa;IACb,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,6BAA6B;IAC7B,aAAa;IACb,+BAA+B;AACnC;;AAEA;IACI,cAAc;IACd,kBAAkB;IAClB,oDAAoD;AACxD;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,SAAS;AACb","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.agent-tool-ui-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: start;\n background-color: transparent;\n padding: 10px;\n color: var(--jp-ui-font-color2);\n}\n\n.agent-tool-ui-container:not(.agent-tool-ui-error-fixup) {\n margin: 10px 0;\n border-radius: 5px;\n border: 1px solid var(--jp-cell-editor-border-color);\n}\n\n.agent-tool-ui-container:not(.agent-tool-ui-error-fixup) .agent-tool-ui-content {\n margin-left: 5px;\n}\n\n.agent-tool-ui-content {\n display: flex;\n align-items: center;\n gap: 10px;\n} \n"],"sourceRoot":""}]);
11512
+ // Exports
11513
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11514
+
11515
+
11516
+ /***/ }),
11517
+
11518
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AlertBlock.css":
11519
+ /*!********************************************************************!*\
11520
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AlertBlock.css ***!
11521
+ \********************************************************************/
11522
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
11523
+
11524
+ __webpack_require__.r(__webpack_exports__);
11525
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11526
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11527
+ /* harmony export */ });
11528
+ /* 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");
11529
+ /* 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__);
11530
+ /* 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");
11531
+ /* 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__);
11532
+ // Imports
11533
+
11534
+
11535
+ 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()));
11536
+ // Module
11537
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
11538
+ * Copyright (c) Saga Inc.
11539
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11540
+ */
11541
+
11542
+ /* Base alert container styles */
11543
+ .chat-message-alert-container {
11544
+ display: flex;
11545
+ flex-direction: column;
11546
+ gap: 10px;
11547
+ border-radius: 5px;
11548
+ padding: 10px;
11549
+ border: 1px solid;
11550
+ }
11551
+
11552
+ /* Red variant for errors */
11553
+ .chat-message-alert-container.error {
11554
+ background-color: var(--red-300);
11555
+ border-color: var(--red-900);
11556
+ color: var(--red-900);
11557
+ }
11558
+
11559
+ /* Purple variant for upgrades/CTAs */
11560
+ .chat-message-alert-container.upgrade {
11561
+ background-color: var(--purple-300);
11562
+ color: var(--grey-900);
11563
+ }
11564
+
11565
+ .chat-message-alert a {
11566
+ color: var(--purple-700) !important;
11567
+ text-decoration: underline;
11568
+ }
11569
+
11570
+ /* Error message styles - red variant */
11571
+ .alert-error-message {
11572
+ font-size: 14px;
11573
+ font-weight: 600;
11574
+ line-height: 1.4;
11575
+ margin-bottom: 8px;
11576
+ }
11577
+
11578
+ .chat-message-alert-container.error .alert-error-message {
11579
+ color: var(--red-900);
11580
+ }
11581
+
11582
+ .alert-actions-header {
11583
+ margin-bottom: 12px;
11584
+ }
11585
+
11586
+ .alert-actions-title {
11587
+ font-weight: 500;
11588
+ margin: 0 0 8px 0;
11589
+ font-size: 13px;
11590
+ }
11591
+
11592
+ .chat-message-alert-container.error .alert-actions-title {
11593
+ color: var(--red-900);
11594
+ }
11595
+
11596
+ .alert-actions-list {
11597
+ margin: 0;
11598
+ padding-left: 16px;
11599
+ }
11600
+
11601
+ .chat-message-alert-container.error .alert-actions-list {
11602
+ color: var(--red-800);
11603
+ }
11604
+
11605
+ .chat-message-alert-container.upgrade .alert-actions-list {
11606
+ color: var(--purple-800);
11607
+ }
11608
+
11609
+ .alert-actions-list li {
11610
+ margin-bottom: 4px;
11611
+ font-size: 13px;
11612
+ line-height: 1.4;
11613
+ }
11614
+
11615
+ .alert-action-item {
11616
+ display: flex;
11617
+ align-items: flex-start;
11618
+ gap: 8px;
11619
+ padding: 8px 0;
11620
+ font-size: 13px;
11621
+ line-height: 1.4;
11622
+ }
11623
+
11624
+ .chat-message-alert-container.error .alert-action-item {
11625
+ color: var(--red-800);
11626
+ }
11627
+
11628
+ .chat-message-alert-container.upgrade .alert-action-item {
11629
+ color: var(--purple-800);
11630
+ }
11631
+
11632
+ .action-icon {
11633
+ font-size: 16px;
11634
+ flex-shrink: 0;
11635
+ margin-top: 1px;
11636
+ }
11637
+
11638
+ .details-toggle {
11639
+ display: inline-flex;
11640
+ align-items: center;
11641
+ }
11642
+
11643
+ .toggle-button {
11644
+ background: none;
11645
+ border: none;
11646
+ padding: 0;
11647
+ cursor: pointer;
11648
+ display: flex;
11649
+ align-items: center;
11650
+ gap: 4px;
11651
+ font-size: 12px;
11652
+ font-family: inherit;
11653
+ text-decoration: underline;
11654
+ }
11655
+
11656
+ .chat-message-alert-container.error .toggle-button {
11657
+ color: var(--red-900);
11658
+ }
11659
+
11660
+ .toggle-button:hover {
11661
+ text-decoration: none;
11662
+ }
11663
+
11664
+ .chat-message-alert-container.error .toggle-button:hover {
11665
+ color: var(--red-800);
11666
+ }
11667
+
11668
+ .chat-message-alert-container.upgrade .toggle-button:hover {
11669
+ color: var(--purple-800);
11670
+ }
11671
+
11672
+ .toggle-caret {
11673
+ font-size: 10px;
11674
+ transition: transform 0.2s ease;
11675
+ display: inline-block;
11676
+ text-decoration: none !important;
11677
+ }
11678
+
11679
+ .toggle-caret.open {
11680
+ transform: rotate(180deg);
11681
+ }
11682
+
11683
+ .details-content {
11684
+ margin-top: 8px;
11685
+ margin-left: 16px;
11686
+ padding: 8px;
11687
+ background-color: var(--grey-100);
11688
+ border-radius: 4px;
11689
+ animation: slideDown 0.2s ease-out;
11690
+ }
11691
+
11692
+ @keyframes slideDown {
11693
+ from {
11694
+ opacity: 0;
11695
+ transform: translateY(-4px);
11696
+ }
11697
+ to {
11698
+ opacity: 1;
11699
+ transform: translateY(0);
11700
+ }
11701
+ }
11702
+
11703
+ .secondary-option-link {
11704
+ color: var(--purple-700) !important;
11705
+ text-decoration: underline !important;
11706
+ }
11707
+
11708
+ .secondary-option-link:hover {
11709
+ color: var(--purple-600) !important;
11710
+ }
11711
+ `, "",{"version":3,"sources":["webpack://./style/AlertBlock.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,gCAAgC;AAChC;EACE,aAAa;EACb,sBAAsB;EACtB,SAAS;EACT,kBAAkB;EAClB,aAAa;EACb,iBAAiB;AACnB;;AAEA,2BAA2B;AAC3B;EACE,gCAAgC;EAChC,4BAA4B;EAC5B,qBAAqB;AACvB;;AAEA,qCAAqC;AACrC;EACE,mCAAmC;EACnC,sBAAsB;AACxB;;AAEA;EACE,mCAAmC;EACnC,0BAA0B;AAC5B;;AAEA,uCAAuC;AACvC;EACE,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,SAAS;EACT,kBAAkB;AACpB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,kBAAkB;EAClB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,QAAQ;EACR,cAAc;EACd,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,eAAe;EACf,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,eAAe;EACf,oBAAoB;EACpB,0BAA0B;AAC5B;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,eAAe;EACf,+BAA+B;EAC/B,qBAAqB;EACrB,gCAAgC;AAClC;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iCAAiC;EACjC,kBAAkB;EAClB,kCAAkC;AACpC;;AAEA;EACE;IACE,UAAU;IACV,2BAA2B;EAC7B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;AACF;;AAEA;IACI,mCAAmC;IACnC,qCAAqC;AACzC;;AAEA;IACI,mCAAmC;AACvC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Base alert container styles */\n.chat-message-alert-container {\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-radius: 5px;\n padding: 10px;\n border: 1px solid;\n}\n\n/* Red variant for errors */\n.chat-message-alert-container.error {\n background-color: var(--red-300);\n border-color: var(--red-900);\n color: var(--red-900);\n}\n\n/* Purple variant for upgrades/CTAs */\n.chat-message-alert-container.upgrade {\n background-color: var(--purple-300);\n color: var(--grey-900);\n}\n\n.chat-message-alert a {\n color: var(--purple-700) !important;\n text-decoration: underline;\n}\n\n/* Error message styles - red variant */\n.alert-error-message {\n font-size: 14px;\n font-weight: 600;\n line-height: 1.4;\n margin-bottom: 8px;\n}\n\n.chat-message-alert-container.error .alert-error-message {\n color: var(--red-900);\n}\n\n.alert-actions-header {\n margin-bottom: 12px;\n}\n\n.alert-actions-title {\n font-weight: 500;\n margin: 0 0 8px 0;\n font-size: 13px;\n}\n\n.chat-message-alert-container.error .alert-actions-title {\n color: var(--red-900);\n}\n\n.alert-actions-list {\n margin: 0;\n padding-left: 16px;\n}\n\n.chat-message-alert-container.error .alert-actions-list {\n color: var(--red-800);\n}\n\n.chat-message-alert-container.upgrade .alert-actions-list {\n color: var(--purple-800);\n}\n\n.alert-actions-list li {\n margin-bottom: 4px;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.alert-action-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 0;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.chat-message-alert-container.error .alert-action-item {\n color: var(--red-800);\n}\n\n.chat-message-alert-container.upgrade .alert-action-item {\n color: var(--purple-800);\n}\n\n.action-icon {\n font-size: 16px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.details-toggle {\n display: inline-flex;\n align-items: center;\n}\n\n.toggle-button {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-family: inherit;\n text-decoration: underline;\n}\n\n.chat-message-alert-container.error .toggle-button {\n color: var(--red-900);\n}\n\n.toggle-button:hover {\n text-decoration: none;\n}\n\n.chat-message-alert-container.error .toggle-button:hover {\n color: var(--red-800);\n}\n\n.chat-message-alert-container.upgrade .toggle-button:hover {\n color: var(--purple-800);\n}\n\n.toggle-caret {\n font-size: 10px;\n transition: transform 0.2s ease;\n display: inline-block;\n text-decoration: none !important;\n}\n\n.toggle-caret.open {\n transform: rotate(180deg);\n}\n\n.details-content {\n margin-top: 8px;\n margin-left: 16px;\n padding: 8px;\n background-color: var(--grey-100);\n border-radius: 4px;\n animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.secondary-option-link {\n color: var(--purple-700) !important;\n text-decoration: underline !important;\n}\n\n.secondary-option-link:hover {\n color: var(--purple-600) !important;\n}\n"],"sourceRoot":""}]);
11712
+ // Exports
11713
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11714
+
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
+
11907
+ /***/ }),
11908
+
11909
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AssumptionTool.css":
11910
+ /*!************************************************************************!*\
11911
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AssumptionTool.css ***!
11912
+ \************************************************************************/
11913
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
11914
+
11915
+ __webpack_require__.r(__webpack_exports__);
11916
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11917
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11918
+ /* harmony export */ });
11919
+ /* 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");
11920
+ /* 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__);
11921
+ /* 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");
11922
+ /* 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__);
11923
+ // Imports
11924
+
11925
+
11926
+ 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()));
11927
+ // Module
11928
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
11929
+ * Copyright (c) Saga Inc.
11930
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
11931
+ */
11932
+
11933
+ .assumption-tool-container {
11934
+ color: var(--jp-ui-font-color2);
11935
+ display: flex;
11936
+ justify-content: space-between;
11937
+ align-items: center;
11938
+ margin-top: 10px;
11939
+ margin-bottom: 10px;
11940
+ position: relative;
11941
+ padding: 8px var(--chat-taskpane-tool-call-horizontal-padding);
11942
+ border-radius: var(--chat-taskpane-item-border-radius);
11943
+ border: 1px solid var(--jp-cell-editor-border-color);
11944
+ cursor: default;
11945
+ }
11946
+
11947
+ .assumption-header-label {
11948
+ position: absolute;
11949
+ top: -10px;
11950
+ left: 12px;
11951
+ background-color: var(--chat-background-color);
11952
+ padding: 2px 8px;
11953
+ border-radius: 4px;
11954
+ font-size: 12px;
11955
+ color: var(--jp-ui-font-color2);
11956
+ font-style: italic;
11957
+ }
11958
+
11959
+ .assumption-content {
11960
+ display: flex;
11961
+ align-items: flex-start;
11962
+ gap: 8px;
11963
+ color: var(--jp-ui-font-color2);
11964
+ font-size: 14px;
11965
+ line-height: 1.4;
11966
+ margin: 0;
11967
+ padding: 10px 10px 5px 10px;
11968
+ }
11969
+
11970
+ .assumption-content ul {
11971
+ margin: 0;
11972
+ padding-left: 10px;
11973
+ }`, "",{"version":3,"sources":["webpack://./style/AssumptionTool.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,+BAA+B;IAC/B,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,8DAA8D;IAC9D,sDAAsD;IACtD,oDAAoD;IACpD,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,UAAU;IACV,UAAU;IACV,8CAA8C;IAC9C,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,SAAS;IACT,2BAA2B;AAC/B;;AAEA;IACI,SAAS;IACT,kBAAkB;AACtB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.assumption-tool-container {\n color: var(--jp-ui-font-color2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 10px;\n margin-bottom: 10px;\n position: relative;\n padding: 8px var(--chat-taskpane-tool-call-horizontal-padding);\n border-radius: var(--chat-taskpane-item-border-radius);\n border: 1px solid var(--jp-cell-editor-border-color);\n cursor: default;\n}\n\n.assumption-header-label {\n position: absolute;\n top: -10px;\n left: 12px;\n background-color: var(--chat-background-color);\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--jp-ui-font-color2);\n font-style: italic;\n}\n\n.assumption-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n line-height: 1.4;\n margin: 0;\n padding: 10px 10px 5px 10px;\n}\n\n.assumption-content ul {\n margin: 0;\n padding-left: 10px;\n}"],"sourceRoot":""}]);
11974
+ // Exports
11975
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11976
+
11977
+
11978
+ /***/ }),
11979
+
11980
+ /***/ "./node_modules/css-loader/dist/cjs.js!./style/AuthPopup.css":
11981
+ /*!*******************************************************************!*\
11982
+ !*** ./node_modules/css-loader/dist/cjs.js!./style/AuthPopup.css ***!
11983
+ \*******************************************************************/
11984
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
11985
+
11986
+ __webpack_require__.r(__webpack_exports__);
11987
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11988
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
11989
+ /* harmony export */ });
11990
+ /* 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");
11991
+ /* 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__);
11992
+ /* 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");
11993
+ /* 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__);
11994
+ // Imports
11995
+
11996
+
11997
+ 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()));
11998
+ // Module
11999
+ ___CSS_LOADER_EXPORT___.push([module.id, `/*
12000
+ * Copyright (c) Saga Inc.
12001
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
12002
+ */
12003
+
12004
+ /* Auth popup specific styling to integrate AWS Amplify with Mito theme */
12005
+ .modal-content .amplify-authenticator {
12006
+ --amplify-colors-font-primary: var(--jp-ui-font-color1);
12007
+ --amplify-colors-font-secondary: var(--jp-ui-font-color2);
12008
+ --amplify-colors-background-primary: var(--jp-layout-color0);
12009
+ --amplify-colors-background-secondary: var(--jp-layout-color1);
12010
+ --amplify-colors-border-primary: var(--jp-border-color1);
12011
+ --amplify-colors-brand-primary-10: var(--purple-700);
12012
+ --amplify-colors-brand-primary-80: var(--purple-500);
12013
+ --amplify-colors-brand-primary-90: var(--purple-400);
12014
+ --amplify-colors-brand-primary-100: var(--purple-300);
12015
+ --amplify-radii-small: 4px;
12016
+ --amplify-radii-medium: 4px;
12017
+ --amplify-space-small: 8px;
12018
+ --amplify-space-medium: 12px;
12019
+ --amplify-space-large: 16px;
12020
+ --amplify-font-sizes-small: 14px;
12021
+ --amplify-font-sizes-medium: 14px;
12022
+
12023
+ /* Remove the blue top border on active tabs */
12024
+ --amplify-components-tabs-item-active-border-width: 0;
12025
+ --amplify-components-tabs-item-border-width: 0;
12026
+
12027
+ /* Ensure active tab bottom border uses purple */
12028
+ --amplify-components-tabs-item-active-border-color: var(--purple-500);
12029
+ --amplify-components-tabs-item-active-color: var(--purple-700);
12030
+ }
12031
+
12032
+ /* Ensure modal content has adequate width for auth form */
12033
+ .modal-content:has(.amplify-authenticator) {
12034
+ width: 480px;
12035
+ max-width: 90vw;
12036
+ min-width: 400px;
12037
+ }
12038
+
12039
+ /* Style the authenticator container */
12040
+ .modal-content .amplify-authenticator__modal {
12041
+ background: transparent !important;
12042
+ box-shadow: none !important;
12043
+ border: none !important;
12044
+ }
12045
+
12046
+ /* Constrain authenticator content within modal bounds */
12047
+ .modal-content .amplify-authenticator {
12048
+ width: 100% !important;
12049
+ max-width: 100% !important;
12050
+ overflow: hidden !important;
12051
+ }
12052
+
12053
+ /* Specifically target the data-amplify-container to prevent overflow */
12054
+ .modal-content [data-amplify-container] {
12055
+ width: 100% !important;
12056
+ max-width: 100% !important;
12057
+ overflow: hidden !important;
12058
+ box-sizing: border-box !important;
12059
+ }
12060
+
12061
+
12062
+
12063
+ /* Constrain the tabs container */
12064
+ .modal-content .amplify-tabs {
12065
+ width: 100% !important;
12066
+ max-width: 100% !important;
12067
+ overflow: hidden !important;
12068
+ }
12069
+
12070
+ /* Ensure form fields don't overflow */
12071
+ .modal-content .amplify-field,
12072
+ .modal-content .amplify-field__group {
12073
+ width: 100% !important;
12074
+ max-width: 100% !important;
12075
+ box-sizing: border-box !important;
12076
+ }
12077
+
12078
+ /* Align form elements with Mito styling */
12079
+ .modal-content .amplify-field__label {
12080
+ color: var(--jp-ui-font-color1) !important;
12081
+ font-weight: 500 !important;
12082
+ }
12083
+
12084
+ .modal-content .amplify-input,
12085
+ .modal-content .amplify-select {
12086
+ background: var(--jp-layout-color0) !important;
12087
+ border: 1px solid var(--jp-border-color1) !important;
12088
+ color: var(--jp-ui-font-color1) !important;
12089
+ border-radius: 4px !important;
12090
+ }
12091
+
12092
+ .modal-content .amplify-input:focus,
12093
+ .modal-content .amplify-select:focus {
12094
+ border-color: var(--purple-500) !important;
12095
+ box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1) !important;
12096
+ }
12097
+
12098
+
12099
+
12100
+ /* Style Amplify buttons to match Mito theme */
12101
+ .modal-content .amplify-button--primary {
12102
+ background-color: var(--purple-400) !important;
12103
+ color: var(--purple-700) !important;
12104
+ border: none !important;
12105
+ border-radius: 4px !important;
12106
+ font-weight: 500 !important;
12107
+ padding: 8px 16px !important;
12108
+ width: 100% !important;
12109
+ max-width: 100% !important;
12110
+ box-sizing: border-box !important;
12111
+ }
12112
+
12113
+ .modal-content .amplify-button--primary:hover {
12114
+ background-color: var(--purple-500) !important;
12115
+ }
12116
+
12117
+ .modal-content .amplify-button--link {
12118
+ color: var(--purple-600) !important;
12119
+ text-decoration: none !important;
12120
+ }
12121
+
12122
+ .modal-content .amplify-button--link:hover {
12123
+ color: var(--purple-700) !important;
12124
+ text-decoration: underline !important;
12125
+ }
12126
+
12127
+ /* Error and success message styling */
12128
+ .modal-content .amplify-alert--error {
12129
+ background-color: var(--red-300) !important;
12130
+ color: var(--red-900) !important;
12131
+ border: 1px solid var(--red-400) !important;
12132
+ border-radius: 4px !important;
12133
+ }
12134
+
12135
+ .modal-content .amplify-alert--info {
12136
+ background-color: var(--purple-300) !important;
12137
+ color: var(--purple-700) !important;
12138
+ border: 1px solid var(--purple-400) !important;
12139
+ border-radius: 4px !important;
12140
+ }
12141
+
12142
+ /* Tab styling for sign in/sign up tabs */
12143
+ .modal-content .amplify-tabs__item {
12144
+ color: var(--jp-ui-font-color2) !important;
12145
+ border-bottom: 2px solid transparent !important;
12146
+ }
12147
+
12148
+ .modal-content .amplify-tabs__item[data-state="active"] {
12149
+ color: var(--purple-700) !important;
12150
+ border-bottom-color: var(--purple-500) !important;
12151
+ }
12152
+
12153
+ /* Ensure inactive tabs don't have purple styling */
12154
+ .modal-content .amplify-tabs__item[data-state="inactive"] {
12155
+ color: var(--jp-ui-font-color2) !important;
12156
+ border-bottom: 2px solid transparent !important;
12157
+ }
12158
+
12159
+
12160
+
12161
+ .modal-content .amplify-tabs__item:hover {
12162
+ color: var(--jp-ui-font-color1) !important;
12163
+ }
12164
+
12165
+ /* Override any default blue tab styling from Amplify */
12166
+ .modal-content .amplify-tabs__list {
12167
+ border-bottom: 1px solid var(--jp-border-color1) !important;
12168
+ }
12169
+
12170
+ .modal-content .amplify-tabs__item[data-state="active"]:after,
12171
+ .modal-content .amplify-tabs__item[aria-selected="true"]:after {
12172
+ background-color: var(--purple-500) !important;
12173
+ border-color: var(--purple-500) !important;
12174
+ }
12175
+
12176
+ /* Override any Amplify default blue colors */
12177
+ .modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[data-state="active"] {
12178
+ color: var(--purple-700) !important;
12179
+ border-bottom-color: var(--purple-500) !important;
12180
+ }
12181
+
12182
+ .modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[aria-selected="true"] {
12183
+ color: var(--purple-700) !important;
12184
+ border-bottom-color: var(--purple-500) !important;
12185
+ }
12186
+
12187
+ /* Additional selectors to ensure default active state on initial load */
12188
+ .modal-content .amplify-tabs__item[aria-selected="true"] {
12189
+ color: var(--purple-700) !important;
12190
+ border-bottom: 2px solid var(--purple-500) !important;
12191
+ }
12192
+
12193
+
12194
+
12195
+ /* Loading spinner colors */
12196
+ .modal-content .amplify-loader {
12197
+ border-top-color: var(--purple-500) !important;
12198
+ }
12199
+
12200
+ /* Additional purple color overrides for any remaining blue elements */
12201
+ .modal-content .amplify-tabs__item[data-state="active"] *,
12202
+ .modal-content .amplify-tabs__item[aria-selected="true"] * {
12203
+ color: var(--purple-700) !important;
12204
+ }
12205
+
12206
+ /* Override focus states to use purple */
12207
+ .modal-content .amplify-tabs__item:focus,
12208
+ .modal-content .amplify-tabs__item:focus-visible {
12209
+ border-bottom-color: var(--purple-500) !important;
12210
+ outline-color: var(--purple-500) !important;
12211
+ }
12212
+
12213
+ /* Ensure any nested tab content uses purple theme */
12214
+ .modal-content [data-amplify-authenticator] [data-amplify-router] .amplify-tabs__item[data-state="active"] {
12215
+ color: var(--purple-700) !important;
12216
+ border-bottom-color: var(--purple-500) !important;
12217
+ }
12218
+
12219
+ /* Remove any top borders, outlines, or blue styling from tabs */
12220
+ .modal-content .amplify-tabs__item {
12221
+ border-top: none !important;
12222
+ border-left: none !important;
12223
+ border-right: none !important;
12224
+ outline: none !important;
12225
+ }
12226
+
12227
+ .modal-content .amplify-tabs__item[data-state="active"],
12228
+ .modal-content .amplify-tabs__item[aria-selected="true"] {
12229
+ border-top: none !important;
12230
+ border-left: none !important;
12231
+ border-right: none !important;
12232
+ outline: none !important;
12233
+ box-shadow: none !important;
12234
+ }
12235
+
12236
+ /* Remove any pseudo-element borders that might create blue lines */
12237
+ .modal-content .amplify-tabs__item:before,
12238
+ .modal-content .amplify-tabs__item:after,
12239
+ .modal-content .amplify-tabs__item[data-state="active"]:before,
12240
+ .modal-content .amplify-tabs__item[aria-selected="true"]:before {
12241
+ display: none !important;
12242
+ border: none !important;
12243
+ background: none !important;
12244
+ }
12245
+
12246
+
12247
+
12248
+ /* Additional containment rules for better layout */
12249
+ .modal-content .amplify-authenticator * {
12250
+ box-sizing: border-box !important;
12251
+ }
12252
+
12253
+ /* Prevent any Amplify containers from overflowing */
12254
+ .modal-content [data-amplify-authenticator],
12255
+ .modal-content [data-amplify-router],
12256
+ .modal-content [data-amplify-authenticator-signin],
12257
+ .modal-content [data-amplify-authenticator-signup] {
12258
+ width: 100% !important;
12259
+ max-width: 100% !important;
12260
+ overflow: hidden !important;
12261
+ box-sizing: border-box !important;
12262
+ }
12263
+
12264
+ /* Remove any default margins or padding that might cause overflow */
12265
+ .modal-content [data-amplify-container] * {
12266
+ max-width: 100% !important;
12267
+ }
12268
+
12269
+ /* Ensure modal content itself doesn't allow horizontal scroll */
12270
+ .modal-content:has(.amplify-authenticator) {
12271
+ overflow-x: hidden !important;
10400
12272
  }
10401
12273
 
10402
- .agent-component-header.no-border {
10403
- border: none;
12274
+ /* Target main Amplify containers but not inputs */
12275
+ .modal-content div[data-amplify-container] {
12276
+ width: 100% !important;
12277
+ max-width: 100% !important;
12278
+ box-sizing: border-box !important;
10404
12279
  }
10405
12280
 
10406
- .agent-component-header.expanded {
10407
- border: none;
10408
- border-radius: 5px 5px 0 0;
10409
- background-color: var(--jp-layout-color2);
12281
+ /* Ensure tab panels fit within bounds */
12282
+ .modal-content .amplify-tabs__panel {
12283
+ width: 100% !important;
12284
+ max-width: 100% !important;
12285
+ overflow: hidden !important;
12286
+ padding: 16px !important;
10410
12287
  }
10411
12288
 
10412
- .agent-component-header.error-fixup {
10413
- border: none;
12289
+ /* Ensure tab list doesn't overflow */
12290
+ .modal-content .amplify-tabs__list {
12291
+ width: 100% !important;
12292
+ max-width: 100% !important;
12293
+ display: flex !important;
12294
+ justify-content: space-around !important;
10414
12295
  }
10415
12296
 
10416
- .agent-component-header.error-fixup.expanded {
10417
- background-color: var(--jp-layout-color2);
12297
+ .modal-content .amplify-tabs__item {
12298
+ flex: 1 !important;
12299
+ text-align: center !important;
12300
+ max-width: 50% !important;
10418
12301
  }
10419
12302
 
10420
- .agent-component-header-content {
10421
- display: flex;
10422
- align-items: center;
10423
- gap: 10px;
10424
- flex: 1;
10425
- min-width: 0;
12303
+ /* Add this to your AuthPopup.css file */
12304
+
12305
+ /* Hide password requirements by default */
12306
+ .password-requirements {
12307
+ display: none;
12308
+ padding: 16px 20px;
12309
+ background-color: var(--jp-layout-color2);
12310
+ border-top: 1px solid var(--jp-border-color1);
12311
+ font-size: 13px;
10426
12312
  }
10427
12313
 
10428
- .agent-component-header-content svg {
10429
- flex-shrink: 0;
12314
+ /* Show password requirements when sign-up form is present */
12315
+ .modal-content:has([data-amplify-authenticator-signup]) .password-requirements {
12316
+ display: block;
10430
12317
  }
10431
12318
 
10432
- .agent-component-header-expand-icon {
10433
- flex-shrink: 0;
10434
- transition: transform 0.2s ease;
12319
+ /* Style the requirements content */
12320
+ .password-requirements p {
12321
+ margin: 0 0 8px 0;
12322
+ font-weight: bold;
12323
+ color: var(--jp-ui-font-color1);
10435
12324
  }
10436
12325
 
10437
- .agent-component-header-expand-icon.expanded {
10438
- transform: rotate(90deg);
10439
- } `, "",{"version":3,"sources":["webpack://./style/AgentComponentHeader.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,eAAe;IACf,+DAA+D;IAC/D,+BAA+B;IAC/B,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,oDAAoD;IACpD,sDAAsD;IACtD,8DAA8D;AAClE;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,YAAY;IACZ,0BAA0B;IAC1B,yCAAyC;AAC7C;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,OAAO;IACP,YAAY;AAChB;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,cAAc;IACd,+BAA+B;AACnC;;AAEA;IACI,wBAAwB;AAC5B","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.agent-component-header {\n cursor: pointer;\n padding: 10px var(--chat-taskpane-tool-call-horizontal-padding);\n color: var(--jp-ui-font-color2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border: 1px solid var(--jp-cell-editor-border-color);\n border-radius: var(--chat-taskpane-item-border-radius);\n transition: background-color 0.2s ease, border-color 0.2s ease;\n}\n\n.agent-component-header:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.agent-component-header.no-border {\n border: none;\n}\n\n.agent-component-header.expanded {\n border: none;\n border-radius: 5px 5px 0 0;\n background-color: var(--jp-layout-color2);\n}\n\n.agent-component-header.error-fixup {\n border: none;\n}\n\n.agent-component-header.error-fixup.expanded {\n background-color: var(--jp-layout-color2);\n}\n\n.agent-component-header-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n min-width: 0;\n}\n\n.agent-component-header-content svg {\n flex-shrink: 0;\n}\n\n.agent-component-header-expand-icon {\n flex-shrink: 0;\n transition: transform 0.2s ease;\n}\n\n.agent-component-header-expand-icon.expanded {\n transform: rotate(90deg);\n} "],"sourceRoot":""}]);
10440
- // Exports
10441
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
12326
+ .password-requirements ul {
12327
+ margin: 0;
12328
+ padding-left: 20px;
12329
+ color: var(--jp-ui-font-color2);
12330
+ font-size: 12px;
12331
+ }
10442
12332
 
12333
+ /* Success message styling */
12334
+ .auth-success-message {
12335
+ padding: 32px 24px;
12336
+ text-align: center;
12337
+ background: var(--jp-layout-color0);
12338
+ border-radius: 8px;
12339
+ }
10443
12340
 
10444
- /***/ }),
12341
+ .success-icon {
12342
+ margin-bottom: 20px;
12343
+ display: flex;
12344
+ justify-content: center;
12345
+ }
10445
12346
 
10446
- /***/ "./node_modules/css-loader/dist/cjs.js!./style/AssumptionTool.css":
10447
- /*!************************************************************************!*\
10448
- !*** ./node_modules/css-loader/dist/cjs.js!./style/AssumptionTool.css ***!
10449
- \************************************************************************/
10450
- /***/ ((module, __webpack_exports__, __webpack_require__) => {
12347
+ .success-title {
12348
+ color: var(--jp-ui-font-color1);
12349
+ font-size: 24px;
12350
+ font-weight: 600;
12351
+ margin: 0 0 12px 0;
12352
+ font-family: var(--jp-ui-font-family);
12353
+ }
10451
12354
 
10452
- __webpack_require__.r(__webpack_exports__);
10453
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10454
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
10455
- /* harmony export */ });
10456
- /* 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");
10457
- /* 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__);
10458
- /* 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");
10459
- /* 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__);
10460
- // Imports
12355
+ .success-description {
12356
+ color: var(--jp-ui-font-color1);
12357
+ font-size: 16px;
12358
+ margin: 0 0 16px 0;
12359
+ font-family: var(--jp-ui-font-family);
12360
+ line-height: 1.5;
12361
+ }
10461
12362
 
12363
+ .success-timer {
12364
+ color: var(--jp-ui-font-color2);
12365
+ font-size: 14px;
12366
+ margin: 0 0 24px 0;
12367
+ font-family: var(--jp-ui-font-family);
12368
+ font-style: italic;
12369
+ }
10462
12370
 
10463
- 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()));
10464
- // Module
10465
- ___CSS_LOADER_EXPORT___.push([module.id, `/*
10466
- * Copyright (c) Saga Inc.
10467
- * Distributed under the terms of the GNU Affero General Public License v3.0 License.
10468
- */
12371
+ .success-actions {
12372
+ display: flex;
12373
+ justify-content: center;
12374
+ gap: 12px;
12375
+ }
10469
12376
 
10470
- .assumption-tool-container {
10471
- color: var(--jp-ui-font-color2);
10472
- display: flex;
10473
- justify-content: space-between;
10474
- align-items: center;
10475
- margin-top: 10px;
10476
- margin-bottom: 10px;
10477
- position: relative;
10478
- padding: 8px var(--chat-taskpane-tool-call-horizontal-padding);
10479
- border-radius: var(--chat-taskpane-item-border-radius);
10480
- border: 1px solid var(--jp-cell-editor-border-color);
10481
- cursor: default;
12377
+ /* Progress bar animation */
12378
+ @keyframes progressFill {
12379
+ from { width: 0%; }
12380
+ to { width: 100%; }
10482
12381
  }
10483
12382
 
10484
- .assumption-header-label {
10485
- position: absolute;
10486
- top: -10px;
10487
- left: 12px;
10488
- background-color: var(--chat-background-color);
10489
- padding: 2px 8px;
10490
- border-radius: 4px;
10491
- font-size: 12px;
10492
- color: var(--jp-ui-font-color2);
10493
- font-style: italic;
12383
+ /* Welcome message container styling */
12384
+ .welcome-message-container {
12385
+ border: 1px solid var(--jp-border-color1);
12386
+ border-radius: 8px;
12387
+ padding: 32px 24px;
12388
+ margin: 16px 0;
12389
+ background-color: var(--jp-layout-color0);
12390
+ text-align: center;
10494
12391
  }
10495
12392
 
10496
- .assumption-content {
10497
- display: flex;
10498
- align-items: flex-start;
10499
- gap: 8px;
10500
- color: var(--jp-ui-font-color2);
10501
- font-size: 14px;
10502
- line-height: 1.4;
10503
- margin: 0;
10504
- padding: 10px 10px 5px 10px;
12393
+ /* Welcome message title */
12394
+ .welcome-message-title {
12395
+ color: var(--jp-ui-font-color1);
12396
+ font-size: 24px;
12397
+ font-weight: 600;
12398
+ margin: 0 0 12px 0;
12399
+ font-family: var(--jp-ui-font-family);
10505
12400
  }
10506
12401
 
10507
- .assumption-content ul {
10508
- margin: 0;
10509
- padding-left: 10px;
10510
- }`, "",{"version":3,"sources":["webpack://./style/AssumptionTool.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,+BAA+B;IAC/B,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,8DAA8D;IAC9D,sDAAsD;IACtD,oDAAoD;IACpD,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,UAAU;IACV,UAAU;IACV,8CAA8C;IAC9C,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,QAAQ;IACR,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,SAAS;IACT,2BAA2B;AAC/B;;AAEA;IACI,SAAS;IACT,kBAAkB;AACtB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.assumption-tool-container {\n color: var(--jp-ui-font-color2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 10px;\n margin-bottom: 10px;\n position: relative;\n padding: 8px var(--chat-taskpane-tool-call-horizontal-padding);\n border-radius: var(--chat-taskpane-item-border-radius);\n border: 1px solid var(--jp-cell-editor-border-color);\n cursor: default;\n}\n\n.assumption-header-label {\n position: absolute;\n top: -10px;\n left: 12px;\n background-color: var(--chat-background-color);\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--jp-ui-font-color2);\n font-style: italic;\n}\n\n.assumption-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n line-height: 1.4;\n margin: 0;\n padding: 10px 10px 5px 10px;\n}\n\n.assumption-content ul {\n margin: 0;\n padding-left: 10px;\n}"],"sourceRoot":""}]);
12402
+ /* Welcome message description */
12403
+ .welcome-message-description {
12404
+ color: var(--jp-ui-font-color1);
12405
+ font-size: 16px;
12406
+ margin: 0 0 16px 0;
12407
+ font-family: var(--jp-ui-font-family);
12408
+ line-height: 1.5;
12409
+ }
12410
+
12411
+ /* Progress bar container */
12412
+ .progress-bar-container {
12413
+ width: 100%;
12414
+ height: 4px;
12415
+ background-color: var(--jp-border-color1);
12416
+ border-radius: 2px;
12417
+ overflow: hidden;
12418
+ margin-top: 20px;
12419
+ margin-bottom: 12px;
12420
+ }
12421
+
12422
+ /* Progress bar fill with CSS animation */
12423
+ .progress-bar-fill {
12424
+ width: 0%;
12425
+ height: 100%;
12426
+ background-color: var(--purple-500);
12427
+ border-radius: 2px;
12428
+ animation: progressFill 3s linear forwards;
12429
+ }
12430
+
12431
+ /* Progress bar timer text */
12432
+ .progress-bar-timer {
12433
+ color: var(--jp-ui-font-color2);
12434
+ font-size: 14px;
12435
+ margin: 0;
12436
+ font-family: var(--jp-ui-font-family);
12437
+ font-style: italic;
12438
+ }`, "",{"version":3,"sources":["webpack://./style/AuthPopup.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,yEAAyE;AACzE;EACE,uDAAuD;EACvD,yDAAyD;EACzD,4DAA4D;EAC5D,8DAA8D;EAC9D,wDAAwD;EACxD,oDAAoD;EACpD,oDAAoD;EACpD,oDAAoD;EACpD,qDAAqD;EACrD,0BAA0B;EAC1B,2BAA2B;EAC3B,0BAA0B;EAC1B,4BAA4B;EAC5B,2BAA2B;EAC3B,gCAAgC;EAChC,iCAAiC;;EAEjC,8CAA8C;EAC9C,qDAAqD;EACrD,8CAA8C;;EAE9C,gDAAgD;EAChD,qEAAqE;EACrE,8DAA8D;AAChE;;AAEA,0DAA0D;AAC1D;EACE,YAAY;EACZ,eAAe;EACf,gBAAgB;AAClB;;AAEA,sCAAsC;AACtC;EACE,kCAAkC;EAClC,2BAA2B;EAC3B,uBAAuB;AACzB;;AAEA,wDAAwD;AACxD;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA,uEAAuE;AACvE;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,2BAA2B;EAC3B,iCAAiC;AACnC;;;;AAIA,iCAAiC;AACjC;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA,sCAAsC;AACtC;;EAEE,sBAAsB;EACtB,0BAA0B;EAC1B,iCAAiC;AACnC;;AAEA,0CAA0C;AAC1C;EACE,0CAA0C;EAC1C,2BAA2B;AAC7B;;AAEA;;EAEE,8CAA8C;EAC9C,oDAAoD;EACpD,0CAA0C;EAC1C,6BAA6B;AAC/B;;AAEA;;EAEE,0CAA0C;EAC1C,wDAAwD;AAC1D;;;;AAIA,8CAA8C;AAC9C;EACE,8CAA8C;EAC9C,mCAAmC;EACnC,uBAAuB;EACvB,6BAA6B;EAC7B,2BAA2B;EAC3B,4BAA4B;EAC5B,sBAAsB;EACtB,0BAA0B;EAC1B,iCAAiC;AACnC;;AAEA;EACE,8CAA8C;AAChD;;AAEA;EACE,mCAAmC;EACnC,gCAAgC;AAClC;;AAEA;EACE,mCAAmC;EACnC,qCAAqC;AACvC;;AAEA,sCAAsC;AACtC;EACE,2CAA2C;EAC3C,gCAAgC;EAChC,2CAA2C;EAC3C,6BAA6B;AAC/B;;AAEA;EACE,8CAA8C;EAC9C,mCAAmC;EACnC,8CAA8C;EAC9C,6BAA6B;AAC/B;;AAEA,yCAAyC;AACzC;EACE,0CAA0C;EAC1C,+CAA+C;AACjD;;AAEA;EACE,mCAAmC;EACnC,iDAAiD;AACnD;;AAEA,mDAAmD;AACnD;EACE,0CAA0C;EAC1C,+CAA+C;AACjD;;;;AAIA;EACE,0CAA0C;AAC5C;;AAEA,uDAAuD;AACvD;EACE,2DAA2D;AAC7D;;AAEA;;EAEE,8CAA8C;EAC9C,0CAA0C;AAC5C;;AAEA,6CAA6C;AAC7C;EACE,mCAAmC;EACnC,iDAAiD;AACnD;;AAEA;EACE,mCAAmC;EACnC,iDAAiD;AACnD;;AAEA,wEAAwE;AACxE;EACE,mCAAmC;EACnC,qDAAqD;AACvD;;;;AAIA,2BAA2B;AAC3B;EACE,8CAA8C;AAChD;;AAEA,sEAAsE;AACtE;;EAEE,mCAAmC;AACrC;;AAEA,wCAAwC;AACxC;;EAEE,iDAAiD;EACjD,2CAA2C;AAC7C;;AAEA,oDAAoD;AACpD;EACE,mCAAmC;EACnC,iDAAiD;AACnD;;AAEA,gEAAgE;AAChE;EACE,2BAA2B;EAC3B,4BAA4B;EAC5B,6BAA6B;EAC7B,wBAAwB;AAC1B;;AAEA;;EAEE,2BAA2B;EAC3B,4BAA4B;EAC5B,6BAA6B;EAC7B,wBAAwB;EACxB,2BAA2B;AAC7B;;AAEA,mEAAmE;AACnE;;;;EAIE,wBAAwB;EACxB,uBAAuB;EACvB,2BAA2B;AAC7B;;;;AAIA,mDAAmD;AACnD;EACE,iCAAiC;AACnC;;AAEA,oDAAoD;AACpD;;;;EAIE,sBAAsB;EACtB,0BAA0B;EAC1B,2BAA2B;EAC3B,iCAAiC;AACnC;;AAEA,oEAAoE;AACpE;EACE,0BAA0B;AAC5B;;AAEA,gEAAgE;AAChE;EACE,6BAA6B;AAC/B;;AAEA,kDAAkD;AAClD;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,iCAAiC;AACnC;;AAEA,wCAAwC;AACxC;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,2BAA2B;EAC3B,wBAAwB;AAC1B;;AAEA,qCAAqC;AACrC;EACE,sBAAsB;EACtB,0BAA0B;EAC1B,wBAAwB;EACxB,wCAAwC;AAC1C;;AAEA;EACE,kBAAkB;EAClB,6BAA6B;EAC7B,yBAAyB;AAC3B;;AAEA,wCAAwC;;AAExC,0CAA0C;AAC1C;EACE,aAAa;EACb,kBAAkB;EAClB,yCAAyC;EACzC,6CAA6C;EAC7C,eAAe;AACjB;;AAEA,4DAA4D;AAC5D;EACE,cAAc;AAChB;;AAEA,mCAAmC;AACnC;EACE,iBAAiB;EACjB,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,SAAS;EACT,kBAAkB;EAClB,+BAA+B;EAC/B,eAAe;AACjB;;AAEA,4BAA4B;AAC5B;EACE,kBAAkB;EAClB,kBAAkB;EAClB,mCAAmC;EACnC,kBAAkB;AACpB;;AAEA;EACE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;AACzB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,kBAAkB;EAClB,qCAAqC;AACvC;;AAEA;EACE,+BAA+B;EAC/B,eAAe;EACf,kBAAkB;EAClB,qCAAqC;EACrC,gBAAgB;AAClB;;AAEA;EACE,+BAA+B;EAC/B,eAAe;EACf,kBAAkB;EAClB,qCAAqC;EACrC,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,SAAS;AACX;;AAEA,2BAA2B;AAC3B;EACE,OAAO,SAAS,EAAE;EAClB,KAAK,WAAW,EAAE;AACpB;;AAEA,sCAAsC;AACtC;EACE,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,cAAc;EACd,yCAAyC;EACzC,kBAAkB;AACpB;;AAEA,0BAA0B;AAC1B;EACE,+BAA+B;EAC/B,eAAe;EACf,gBAAgB;EAChB,kBAAkB;EAClB,qCAAqC;AACvC;;AAEA,gCAAgC;AAChC;EACE,+BAA+B;EAC/B,eAAe;EACf,kBAAkB;EAClB,qCAAqC;EACrC,gBAAgB;AAClB;;AAEA,2BAA2B;AAC3B;EACE,WAAW;EACX,WAAW;EACX,yCAAyC;EACzC,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA,yCAAyC;AACzC;EACE,SAAS;EACT,YAAY;EACZ,mCAAmC;EACnC,kBAAkB;EAClB,0CAA0C;AAC5C;;AAEA,4BAA4B;AAC5B;EACE,+BAA+B;EAC/B,eAAe;EACf,SAAS;EACT,qCAAqC;EACrC,kBAAkB;AACpB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* Auth popup specific styling to integrate AWS Amplify with Mito theme */\n.modal-content .amplify-authenticator {\n --amplify-colors-font-primary: var(--jp-ui-font-color1);\n --amplify-colors-font-secondary: var(--jp-ui-font-color2);\n --amplify-colors-background-primary: var(--jp-layout-color0);\n --amplify-colors-background-secondary: var(--jp-layout-color1);\n --amplify-colors-border-primary: var(--jp-border-color1);\n --amplify-colors-brand-primary-10: var(--purple-700);\n --amplify-colors-brand-primary-80: var(--purple-500);\n --amplify-colors-brand-primary-90: var(--purple-400);\n --amplify-colors-brand-primary-100: var(--purple-300);\n --amplify-radii-small: 4px;\n --amplify-radii-medium: 4px;\n --amplify-space-small: 8px;\n --amplify-space-medium: 12px;\n --amplify-space-large: 16px;\n --amplify-font-sizes-small: 14px;\n --amplify-font-sizes-medium: 14px;\n \n /* Remove the blue top border on active tabs */\n --amplify-components-tabs-item-active-border-width: 0;\n --amplify-components-tabs-item-border-width: 0;\n \n /* Ensure active tab bottom border uses purple */\n --amplify-components-tabs-item-active-border-color: var(--purple-500);\n --amplify-components-tabs-item-active-color: var(--purple-700);\n}\n\n/* Ensure modal content has adequate width for auth form */\n.modal-content:has(.amplify-authenticator) {\n width: 480px;\n max-width: 90vw;\n min-width: 400px;\n}\n\n/* Style the authenticator container */\n.modal-content .amplify-authenticator__modal {\n background: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n/* Constrain authenticator content within modal bounds */\n.modal-content .amplify-authenticator {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Specifically target the data-amplify-container to prevent overflow */\n.modal-content [data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n\n\n/* Constrain the tabs container */\n.modal-content .amplify-tabs {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Ensure form fields don't overflow */\n.modal-content .amplify-field,\n.modal-content .amplify-field__group {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Align form elements with Mito styling */\n.modal-content .amplify-field__label {\n color: var(--jp-ui-font-color1) !important;\n font-weight: 500 !important;\n}\n\n.modal-content .amplify-input,\n.modal-content .amplify-select {\n background: var(--jp-layout-color0) !important;\n border: 1px solid var(--jp-border-color1) !important;\n color: var(--jp-ui-font-color1) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-input:focus,\n.modal-content .amplify-select:focus {\n border-color: var(--purple-500) !important;\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1) !important;\n}\n\n\n\n/* Style Amplify buttons to match Mito theme */\n.modal-content .amplify-button--primary {\n background-color: var(--purple-400) !important;\n color: var(--purple-700) !important;\n border: none !important;\n border-radius: 4px !important;\n font-weight: 500 !important;\n padding: 8px 16px !important;\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n.modal-content .amplify-button--primary:hover {\n background-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-button--link {\n color: var(--purple-600) !important;\n text-decoration: none !important;\n}\n\n.modal-content .amplify-button--link:hover {\n color: var(--purple-700) !important;\n text-decoration: underline !important;\n}\n\n/* Error and success message styling */\n.modal-content .amplify-alert--error {\n background-color: var(--red-300) !important;\n color: var(--red-900) !important;\n border: 1px solid var(--red-400) !important;\n border-radius: 4px !important;\n}\n\n.modal-content .amplify-alert--info {\n background-color: var(--purple-300) !important;\n color: var(--purple-700) !important;\n border: 1px solid var(--purple-400) !important;\n border-radius: 4px !important;\n}\n\n/* Tab styling for sign in/sign up tabs */\n.modal-content .amplify-tabs__item {\n color: var(--jp-ui-font-color2) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Ensure inactive tabs don't have purple styling */\n.modal-content .amplify-tabs__item[data-state=\"inactive\"] {\n color: var(--jp-ui-font-color2) !important;\n border-bottom: 2px solid transparent !important;\n}\n\n\n\n.modal-content .amplify-tabs__item:hover {\n color: var(--jp-ui-font-color1) !important;\n}\n\n/* Override any default blue tab styling from Amplify */\n.modal-content .amplify-tabs__list {\n border-bottom: 1px solid var(--jp-border-color1) !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"]:after,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:after {\n background-color: var(--purple-500) !important;\n border-color: var(--purple-500) !important;\n}\n\n/* Override any Amplify default blue colors */\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n.modal-content .amplify-tabs [data-amplify-color-mode] .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Additional selectors to ensure default active state on initial load */\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n color: var(--purple-700) !important;\n border-bottom: 2px solid var(--purple-500) !important;\n}\n\n\n\n/* Loading spinner colors */\n.modal-content .amplify-loader {\n border-top-color: var(--purple-500) !important;\n}\n\n/* Additional purple color overrides for any remaining blue elements */\n.modal-content .amplify-tabs__item[data-state=\"active\"] *,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] * {\n color: var(--purple-700) !important;\n}\n\n/* Override focus states to use purple */\n.modal-content .amplify-tabs__item:focus,\n.modal-content .amplify-tabs__item:focus-visible {\n border-bottom-color: var(--purple-500) !important;\n outline-color: var(--purple-500) !important;\n}\n\n/* Ensure any nested tab content uses purple theme */\n.modal-content [data-amplify-authenticator] [data-amplify-router] .amplify-tabs__item[data-state=\"active\"] {\n color: var(--purple-700) !important;\n border-bottom-color: var(--purple-500) !important;\n}\n\n/* Remove any top borders, outlines, or blue styling from tabs */\n.modal-content .amplify-tabs__item {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n}\n\n.modal-content .amplify-tabs__item[data-state=\"active\"],\n.modal-content .amplify-tabs__item[aria-selected=\"true\"] {\n border-top: none !important;\n border-left: none !important;\n border-right: none !important;\n outline: none !important;\n box-shadow: none !important;\n}\n\n/* Remove any pseudo-element borders that might create blue lines */\n.modal-content .amplify-tabs__item:before,\n.modal-content .amplify-tabs__item:after,\n.modal-content .amplify-tabs__item[data-state=\"active\"]:before,\n.modal-content .amplify-tabs__item[aria-selected=\"true\"]:before {\n display: none !important;\n border: none !important;\n background: none !important;\n}\n\n\n\n/* Additional containment rules for better layout */\n.modal-content .amplify-authenticator * {\n box-sizing: border-box !important;\n}\n\n/* Prevent any Amplify containers from overflowing */\n.modal-content [data-amplify-authenticator],\n.modal-content [data-amplify-router],\n.modal-content [data-amplify-authenticator-signin],\n.modal-content [data-amplify-authenticator-signup] {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n/* Remove any default margins or padding that might cause overflow */\n.modal-content [data-amplify-container] * {\n max-width: 100% !important;\n}\n\n/* Ensure modal content itself doesn't allow horizontal scroll */\n.modal-content:has(.amplify-authenticator) {\n overflow-x: hidden !important;\n}\n\n/* Target main Amplify containers but not inputs */\n.modal-content div[data-amplify-container] {\n width: 100% !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n}\n\n/* Ensure tab panels fit within bounds */\n.modal-content .amplify-tabs__panel {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n padding: 16px !important;\n}\n\n/* Ensure tab list doesn't overflow */\n.modal-content .amplify-tabs__list {\n width: 100% !important;\n max-width: 100% !important;\n display: flex !important;\n justify-content: space-around !important;\n}\n\n.modal-content .amplify-tabs__item {\n flex: 1 !important;\n text-align: center !important;\n max-width: 50% !important;\n}\n\n/* Add this to your AuthPopup.css file */\n\n/* Hide password requirements by default */\n.password-requirements {\n display: none;\n padding: 16px 20px;\n background-color: var(--jp-layout-color2);\n border-top: 1px solid var(--jp-border-color1);\n font-size: 13px;\n}\n\n/* Show password requirements when sign-up form is present */\n.modal-content:has([data-amplify-authenticator-signup]) .password-requirements {\n display: block;\n}\n\n/* Style the requirements content */\n.password-requirements p {\n margin: 0 0 8px 0;\n font-weight: bold;\n color: var(--jp-ui-font-color1);\n}\n\n.password-requirements ul {\n margin: 0;\n padding-left: 20px;\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n/* Success message styling */\n.auth-success-message {\n padding: 32px 24px;\n text-align: center;\n background: var(--jp-layout-color0);\n border-radius: 8px;\n}\n\n.success-icon {\n margin-bottom: 20px;\n display: flex;\n justify-content: center;\n}\n\n.success-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n.success-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n.success-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0 0 24px 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}\n\n.success-actions {\n display: flex;\n justify-content: center;\n gap: 12px;\n}\n\n/* Progress bar animation */\n@keyframes progressFill {\n from { width: 0%; }\n to { width: 100%; }\n}\n\n/* Welcome message container styling */\n.welcome-message-container {\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n padding: 32px 24px;\n margin: 16px 0;\n background-color: var(--jp-layout-color0);\n text-align: center;\n}\n\n/* Welcome message title */\n.welcome-message-title {\n color: var(--jp-ui-font-color1);\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 12px 0;\n font-family: var(--jp-ui-font-family);\n}\n\n/* Welcome message description */\n.welcome-message-description {\n color: var(--jp-ui-font-color1);\n font-size: 16px;\n margin: 0 0 16px 0;\n font-family: var(--jp-ui-font-family);\n line-height: 1.5;\n}\n\n/* Progress bar container */\n.progress-bar-container {\n width: 100%;\n height: 4px;\n background-color: var(--jp-border-color1);\n border-radius: 2px;\n overflow: hidden;\n margin-top: 20px;\n margin-bottom: 12px;\n}\n\n/* Progress bar fill with CSS animation */\n.progress-bar-fill {\n width: 0%;\n height: 100%;\n background-color: var(--purple-500);\n border-radius: 2px;\n animation: progressFill 3s linear forwards;\n}\n\n/* Progress bar timer text */\n.progress-bar-timer {\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n margin: 0;\n font-family: var(--jp-ui-font-family);\n font-style: italic;\n}"],"sourceRoot":""}]);
10511
12439
  // Exports
10512
12440
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
10513
12441
 
@@ -10969,173 +12897,55 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
10969
12897
  .message-action-buttons button:not(:last-child) {
10970
12898
  border-right: 1px solid var(--jp-border-color1);
10971
12899
  }
10972
-
10973
- /* Remove the individual button radius styles since we're handling it at the container level */
10974
- .message-action-buttons button:first-child,
10975
- .message-action-buttons button:last-child {
10976
- border-radius: 0;
10977
- }
10978
-
10979
- /* Standalone edit button */
10980
- .message-start-editing-button {
10981
- position: relative;
10982
- padding: 4px;
10983
- border-radius: 4px;
10984
- }
10985
-
10986
- /* SVG icon color */
10987
- .message-action-buttons button svg {
10988
- color: var(--jp-content-font-color1);
10989
- }
10990
-
10991
- /* Hover states */
10992
- .message-action-buttons button:hover,
10993
- .message-start-editing-button:hover {
10994
- background-color: var(--jp-layout-color4);
10995
- }
10996
-
10997
- /* Show buttons on message hover */
10998
- .message:hover .message-action-buttons button,
10999
- .message:hover .message-start-editing-button {
11000
- opacity: 1;
11001
- }
11002
-
11003
- .message-edit-buttons {
11004
- display: flex;
11005
- gap: 8px;
11006
- padding: 5px;
11007
- }
11008
-
11009
- .message-edit-buttons button {
11010
- padding: 4px 12px;
11011
- border-radius: 4px;
11012
- background-color: var(--jp-layout-color1);
11013
- color: var(--jp-content-font-color1);
11014
- border: 1px solid var(--jp-border-color1);
11015
- cursor: pointer;
11016
- }
11017
-
11018
- .message-edit-buttons button:hover {
11019
- background-color: var(--jp-layout-color2);
11020
- }
11021
-
11022
- .chat-message-alert-container {
11023
- display: flex;
11024
- flex-direction: column;
11025
- gap: 10px;
11026
- background-color: var(--red-300);
11027
- border-radius: 5px;
11028
- padding: 10px;
11029
- border: 1px solid var(--red-900);
11030
- color: var(--red-900);
11031
- }
11032
-
11033
- .chat-message-alert a {
11034
- color: var(--purple-700);
11035
- text-decoration: underline;
11036
- }
11037
-
11038
- /* New style for the main error message */
11039
- .alert-error-message {
11040
- font-size: 14px;
11041
- font-weight: 600;
11042
- line-height: 1.4;
11043
- color: var(--red-900);
11044
- margin-bottom: 8px;
11045
- }
11046
-
11047
- .alert-actions-header {
11048
- margin-bottom: 12px;
11049
- }
11050
-
11051
- .alert-actions-title {
11052
- font-weight: 500;
11053
- margin: 0 0 8px 0;
11054
- color: var(--red-900);
11055
- font-size: 13px;
11056
- }
11057
-
11058
- .alert-actions-list {
11059
- margin: 0;
11060
- padding-left: 16px;
11061
- color: var(--red-800);
11062
- }
11063
-
11064
- .alert-actions-list li {
11065
- margin-bottom: 4px;
11066
- font-size: 13px;
11067
- line-height: 1.4;
11068
- }
11069
-
11070
- .alert-action-item {
11071
- display: flex;
11072
- align-items: flex-start;
11073
- gap: 8px;
11074
- padding: 8px 0;
11075
- color: var(--red-800);
11076
- font-size: 13px;
11077
- line-height: 1.4;
11078
- }
11079
-
11080
- .action-icon {
11081
- font-size: 16px;
11082
- flex-shrink: 0;
11083
- margin-top: 1px;
12900
+
12901
+ /* Remove the individual button radius styles since we're handling it at the container level */
12902
+ .message-action-buttons button:first-child,
12903
+ .message-action-buttons button:last-child {
12904
+ border-radius: 0;
11084
12905
  }
11085
12906
 
11086
- .details-toggle {
11087
- display: inline-flex;
11088
- align-items: center;
12907
+ /* Standalone edit button */
12908
+ .message-start-editing-button {
12909
+ position: relative;
12910
+ padding: 4px;
12911
+ border-radius: 4px;
11089
12912
  }
11090
12913
 
11091
- .toggle-button {
11092
- background: none;
11093
- border: none;
11094
- padding: 0;
11095
- cursor: pointer;
11096
- display: flex;
11097
- align-items: center;
11098
- gap: 4px;
11099
- color: var(--red-900);
11100
- font-size: 12px;
11101
- font-family: inherit;
11102
- text-decoration: underline;
12914
+ /* SVG icon color */
12915
+ .message-action-buttons button svg {
12916
+ color: var(--jp-content-font-color1);
11103
12917
  }
11104
12918
 
11105
- .toggle-button:hover {
11106
- color: var(--red-800);
12919
+ /* Hover states */
12920
+ .message-action-buttons button:hover,
12921
+ .message-start-editing-button:hover {
12922
+ background-color: var(--jp-layout-color4);
11107
12923
  }
11108
12924
 
11109
- .toggle-caret {
11110
- font-size: 10px;
11111
- transition: transform 0.2s ease;
11112
- display: inline-block;
11113
- text-decoration: none !important;
12925
+ /* Show buttons on message hover */
12926
+ .message:hover .message-action-buttons button,
12927
+ .message:hover .message-start-editing-button {
12928
+ opacity: 1;
11114
12929
  }
11115
12930
 
11116
- .toggle-caret.open {
11117
- transform: rotate(180deg);
12931
+ .message-edit-buttons {
12932
+ display: flex;
12933
+ gap: 8px;
12934
+ padding: 5px;
11118
12935
  }
11119
12936
 
11120
- .details-content {
11121
- margin-top: 8px;
11122
- margin-left: 16px;
11123
- padding: 8px;
11124
- background-color: var(--grey-100);
12937
+ .message-edit-buttons button {
12938
+ padding: 4px 12px;
11125
12939
  border-radius: 4px;
11126
- animation: slideDown 0.2s ease-out;
12940
+ background-color: var(--jp-layout-color1);
12941
+ color: var(--jp-content-font-color1);
12942
+ border: 1px solid var(--jp-border-color1);
12943
+ cursor: pointer;
11127
12944
  }
11128
12945
 
11129
- @keyframes slideDown {
11130
- from {
11131
- opacity: 0;
11132
- transform: translateY(-4px);
11133
- }
11134
- to {
11135
- opacity: 1;
11136
- transform: translateY(0);
11137
- }
11138
- }`, "",{"version":3,"sources":["webpack://./style/ChatMessage.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,mBAAmB;EACnB,sBAAsB;EACtB,WAAW;EACX,eAAe;EACf,sDAAsD;EACtD,2CAA2C;AAC7C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,2DAA2D;EAC3D,0CAA0C;EAC1C,aAAa;AACf;;AAEA;EACE,+CAA+C;AACjD;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,sBAAsB;EACtB,SAAS;EACT,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA,qCAAqC;AACrC;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,gBAAgB,EAAE,0DAA0D;AAC9E;;AAEA,qCAAqC;AACrC;;EAEE,eAAe;EACf,UAAU;EACV;;qCAEmC;EACnC,yCAAyC;EACzC,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,oCAAoC;AACtC;;AAEA,gCAAgC;AAChC;EACE,WAAW;EACX,YAAY;EACZ,UAAU;EACV,gBAAgB,EAAE,oCAAoC;AACxD;;AAEA,yCAAyC;AACzC;EACE,+CAA+C;AACjD;;AAEA,8FAA8F;AAC9F;;EAEE,gBAAgB;AAClB;;AAEA,2BAA2B;AAC3B;EACE,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;AACpB;;AAEA,mBAAmB;AACnB;EACE,oCAAoC;AACtC;;AAEA,iBAAiB;AACjB;;EAEE,yCAAyC;AAC3C;;AAEA,kCAAkC;AAClC;;EAEE,UAAU;AACZ;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,YAAY;AACd;;AAEA;EACE,iBAAiB;EACjB,kBAAkB;EAClB,yCAAyC;EACzC,oCAAoC;EACpC,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,SAAS;EACT,gCAAgC;EAChC,kBAAkB;EAClB,aAAa;EACb,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA;EACE,wBAAwB;EACxB,0BAA0B;AAC5B;;AAEA,yCAAyC;AACzC;EACE,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,qBAAqB;EACrB,kBAAkB;AACpB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,SAAS;EACT,kBAAkB;EAClB,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;EAClB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,QAAQ;EACR,cAAc;EACd,qBAAqB;EACrB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,qBAAqB;EACrB,eAAe;EACf,oBAAoB;EACpB,0BAA0B;AAC5B;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,eAAe;EACf,+BAA+B;EAC/B,qBAAqB;EACrB,gCAAgC;AAClC;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iCAAiC;EACjC,kBAAkB;EAClB,kCAAkC;AACpC;;AAEA;EACE;IACE,UAAU;IACV,2BAA2B;EAC7B;EACA;IACE,UAAU;IACV,wBAAwB;EAC1B;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.message {\n position: relative;\n height: min-content;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n border-radius: var(--chat-taskpane-item-border-radius);\n padding: 0 var(--chat-taskpane-item-indent);\n}\n\n.message:not(.chat-input) {\n margin-bottom: 20px;\n}\n\n.message:hover .message-start-editing-button {\n opacity: 1 !important;\n}\n\n.message-user {\n background-color: var(--chat-user-message-background-color);\n color: var(--chat-user-message-font-color);\n padding: 10px;\n}\n\n.message-assistant-chat {\n color: var(--chat-assistant-message-font-color);\n}\n\n.chat-message-buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n margin-top: 10px;\n margin-bottom: 4px;\n flex-wrap: wrap;\n}\n\n.chat-taskpane-smart-debug-error-message {\n white-space: pre;\n font-family: monospace;\n margin: 0;\n overflow-x: auto;\n}\n\n.message-text {\n align-items: center;\n}\n\n/* Message Action Buttons Container */\n.message-action-buttons {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n border-radius: 4px;\n overflow: hidden; /* Ensures inner buttons don't break the rounded corners */\n}\n\n/* Common styles for action buttons */\n.message-action-buttons button,\n.message-start-editing-button {\n cursor: pointer;\n opacity: 0;\n transition:\n opacity 0.2s ease-in-out,\n background-color 0.2s ease-in-out;\n background-color: var(--jp-layout-color3);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--jp-content-font-color1);\n}\n\n/* Action buttons in the group */\n.message-action-buttons button {\n width: 28px;\n height: 28px;\n padding: 0;\n border-radius: 0; /* Remove individual button radius */\n}\n\n/* Add subtle separator between buttons */\n.message-action-buttons button:not(:last-child) {\n border-right: 1px solid var(--jp-border-color1);\n}\n\n/* Remove the individual button radius styles since we're handling it at the container level */\n.message-action-buttons button:first-child,\n.message-action-buttons button:last-child {\n border-radius: 0;\n}\n\n/* Standalone edit button */\n.message-start-editing-button {\n position: relative;\n padding: 4px;\n border-radius: 4px;\n}\n\n/* SVG icon color */\n.message-action-buttons button svg {\n color: var(--jp-content-font-color1);\n}\n\n/* Hover states */\n.message-action-buttons button:hover,\n.message-start-editing-button:hover {\n background-color: var(--jp-layout-color4);\n}\n\n/* Show buttons on message hover */\n.message:hover .message-action-buttons button,\n.message:hover .message-start-editing-button {\n opacity: 1;\n}\n\n.message-edit-buttons {\n display: flex;\n gap: 8px;\n padding: 5px;\n}\n\n.message-edit-buttons button {\n padding: 4px 12px;\n border-radius: 4px;\n background-color: var(--jp-layout-color1);\n color: var(--jp-content-font-color1);\n border: 1px solid var(--jp-border-color1);\n cursor: pointer;\n}\n\n.message-edit-buttons button:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.chat-message-alert-container {\n display: flex;\n flex-direction: column;\n gap: 10px;\n background-color: var(--red-300);\n border-radius: 5px;\n padding: 10px;\n border: 1px solid var(--red-900);\n color: var(--red-900);\n}\n\n.chat-message-alert a {\n color: var(--purple-700);\n text-decoration: underline;\n}\n\n/* New style for the main error message */\n.alert-error-message {\n font-size: 14px;\n font-weight: 600;\n line-height: 1.4;\n color: var(--red-900);\n margin-bottom: 8px;\n}\n\n.alert-actions-header {\n margin-bottom: 12px;\n}\n\n.alert-actions-title {\n font-weight: 500;\n margin: 0 0 8px 0;\n color: var(--red-900);\n font-size: 13px;\n}\n\n.alert-actions-list {\n margin: 0;\n padding-left: 16px;\n color: var(--red-800);\n}\n\n.alert-actions-list li {\n margin-bottom: 4px;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.alert-action-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 0;\n color: var(--red-800);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.action-icon {\n font-size: 16px;\n flex-shrink: 0;\n margin-top: 1px;\n}\n\n.details-toggle {\n display: inline-flex;\n align-items: center;\n}\n\n.toggle-button {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--red-900);\n font-size: 12px;\n font-family: inherit;\n text-decoration: underline;\n}\n\n.toggle-button:hover {\n color: var(--red-800);\n}\n\n.toggle-caret {\n font-size: 10px;\n transition: transform 0.2s ease;\n display: inline-block;\n text-decoration: none !important;\n}\n\n.toggle-caret.open {\n transform: rotate(180deg);\n}\n\n.details-content {\n margin-top: 8px;\n margin-left: 16px;\n padding: 8px;\n background-color: var(--grey-100);\n border-radius: 4px;\n animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}"],"sourceRoot":""}]);
12946
+ .message-edit-buttons button:hover {
12947
+ background-color: var(--jp-layout-color2);
12948
+ }`, "",{"version":3,"sources":["webpack://./style/ChatMessage.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,mBAAmB;EACnB,sBAAsB;EACtB,WAAW;EACX,eAAe;EACf,sDAAsD;EACtD,2CAA2C;AAC7C;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,2DAA2D;EAC3D,0CAA0C;EAC1C,aAAa;AACf;;AAEA;EACE,+CAA+C;AACjD;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;EACR,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,sBAAsB;EACtB,SAAS;EACT,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA,qCAAqC;AACrC;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,gBAAgB,EAAE,0DAA0D;AAC9E;;AAEA,qCAAqC;AACrC;;EAEE,eAAe;EACf,UAAU;EACV;;qCAEmC;EACnC,yCAAyC;EACzC,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,oCAAoC;AACtC;;AAEA,gCAAgC;AAChC;EACE,WAAW;EACX,YAAY;EACZ,UAAU;EACV,gBAAgB,EAAE,oCAAoC;AACxD;;AAEA,yCAAyC;AACzC;EACE,+CAA+C;AACjD;;AAEA,8FAA8F;AAC9F;;EAEE,gBAAgB;AAClB;;AAEA,2BAA2B;AAC3B;EACE,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;AACpB;;AAEA,mBAAmB;AACnB;EACE,oCAAoC;AACtC;;AAEA,iBAAiB;AACjB;;EAEE,yCAAyC;AAC3C;;AAEA,kCAAkC;AAClC;;EAEE,UAAU;AACZ;;AAEA;EACE,aAAa;EACb,QAAQ;EACR,YAAY;AACd;;AAEA;EACE,iBAAiB;EACjB,kBAAkB;EAClB,yCAAyC;EACzC,oCAAoC;EACpC,yCAAyC;EACzC,eAAe;AACjB;;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.message {\n position: relative;\n height: min-content;\n box-sizing: border-box;\n width: 100%;\n font-size: 14px;\n border-radius: var(--chat-taskpane-item-border-radius);\n padding: 0 var(--chat-taskpane-item-indent);\n}\n\n.message:not(.chat-input) {\n margin-bottom: 20px;\n}\n\n.message:hover .message-start-editing-button {\n opacity: 1 !important;\n}\n\n.message-user {\n background-color: var(--chat-user-message-background-color);\n color: var(--chat-user-message-font-color);\n padding: 10px;\n}\n\n.message-assistant-chat {\n color: var(--chat-assistant-message-font-color);\n}\n\n.chat-message-buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n margin-top: 10px;\n margin-bottom: 4px;\n flex-wrap: wrap;\n}\n\n.chat-taskpane-smart-debug-error-message {\n white-space: pre;\n font-family: monospace;\n margin: 0;\n overflow-x: auto;\n}\n\n.message-text {\n align-items: center;\n}\n\n/* Message Action Buttons Container */\n.message-action-buttons {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n border-radius: 4px;\n overflow: hidden; /* Ensures inner buttons don't break the rounded corners */\n}\n\n/* Common styles for action buttons */\n.message-action-buttons button,\n.message-start-editing-button {\n cursor: pointer;\n opacity: 0;\n transition:\n opacity 0.2s ease-in-out,\n background-color 0.2s ease-in-out;\n background-color: var(--jp-layout-color3);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--jp-content-font-color1);\n}\n\n/* Action buttons in the group */\n.message-action-buttons button {\n width: 28px;\n height: 28px;\n padding: 0;\n border-radius: 0; /* Remove individual button radius */\n}\n\n/* Add subtle separator between buttons */\n.message-action-buttons button:not(:last-child) {\n border-right: 1px solid var(--jp-border-color1);\n}\n\n/* Remove the individual button radius styles since we're handling it at the container level */\n.message-action-buttons button:first-child,\n.message-action-buttons button:last-child {\n border-radius: 0;\n}\n\n/* Standalone edit button */\n.message-start-editing-button {\n position: relative;\n padding: 4px;\n border-radius: 4px;\n}\n\n/* SVG icon color */\n.message-action-buttons button svg {\n color: var(--jp-content-font-color1);\n}\n\n/* Hover states */\n.message-action-buttons button:hover,\n.message-start-editing-button:hover {\n background-color: var(--jp-layout-color4);\n}\n\n/* Show buttons on message hover */\n.message:hover .message-action-buttons button,\n.message:hover .message-start-editing-button {\n opacity: 1;\n}\n\n.message-edit-buttons {\n display: flex;\n gap: 8px;\n padding: 5px;\n}\n\n.message-edit-buttons button {\n padding: 4px 12px;\n border-radius: 4px;\n background-color: var(--jp-layout-color1);\n color: var(--jp-content-font-color1);\n border: 1px solid var(--jp-border-color1);\n cursor: pointer;\n}\n\n.message-edit-buttons button:hover {\n background-color: var(--jp-layout-color2);\n}"],"sourceRoot":""}]);
11139
12949
  // Exports
11140
12950
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
11141
12951
 
@@ -12243,55 +14053,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
12243
14053
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
12244
14054
 
12245
14055
 
12246
- /***/ }),
12247
-
12248
- /***/ "./node_modules/css-loader/dist/cjs.js!./style/GetCellOutputToolUI.css":
12249
- /*!*****************************************************************************!*\
12250
- !*** ./node_modules/css-loader/dist/cjs.js!./style/GetCellOutputToolUI.css ***!
12251
- \*****************************************************************************/
12252
- /***/ ((module, __webpack_exports__, __webpack_require__) => {
12253
-
12254
- __webpack_require__.r(__webpack_exports__);
12255
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12256
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
12257
- /* harmony export */ });
12258
- /* 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");
12259
- /* 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__);
12260
- /* 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");
12261
- /* 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__);
12262
- // Imports
12263
-
12264
-
12265
- 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()));
12266
- // Module
12267
- ___CSS_LOADER_EXPORT___.push([module.id, `/*
12268
- * Copyright (c) Saga Inc.
12269
- * Distributed under the terms of the GNU Affero General Public License v3.0 License.
12270
- */
12271
-
12272
- .get-cell-output-container {
12273
- display: flex;
12274
- flex-direction: row;
12275
- align-items: center;
12276
- justify-content: start;
12277
- background-color: transparent;
12278
- padding: 10px;
12279
- border-radius: 5px;
12280
- border: 1px solid var(--jp-cell-editor-border-color);
12281
- margin: 10px 0;
12282
- color: var(--jp-ui-font-color2);
12283
- }
12284
-
12285
- .get-cell-output-content {
12286
- display: flex;
12287
- align-items: center;
12288
- gap: 10px;
12289
- margin-left: 5px;
12290
- } `, "",{"version":3,"sources":["webpack://./style/GetCellOutputToolUI.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,aAAa;IACb,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,6BAA6B;IAC7B,aAAa;IACb,kBAAkB;IAClB,oDAAoD;IACpD,cAAc;IACd,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,SAAS;IACT,gBAAgB;AACpB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.get-cell-output-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: start;\n background-color: transparent;\n padding: 10px;\n border-radius: 5px;\n border: 1px solid var(--jp-cell-editor-border-color);\n margin: 10px 0;\n color: var(--jp-ui-font-color2);\n}\n\n.get-cell-output-content {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-left: 5px;\n} "],"sourceRoot":""}]);
12291
- // Exports
12292
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
12293
-
12294
-
12295
14056
  /***/ }),
12296
14057
 
12297
14058
  /***/ "./node_modules/css-loader/dist/cjs.js!./style/IconButton.css":
@@ -13148,15 +14909,19 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
13148
14909
  white-space: pre !important;
13149
14910
  }
13150
14911
 
13151
- .code-block-python-code .jp-RenderedHTMLCommon > *:last-child {
14912
+ .code-block-python-code .jp-RenderedHTMLCommon {
14913
+ /* Remove default Jupyter padding */
14914
+ padding-right: 0px !important;
14915
+ }
14916
+
14917
+ .code-block-python-code .jp-RenderedHTMLCommon>*:last-child {
13152
14918
  /*
13153
14919
  Remove the default Jupyter ending margin
13154
14920
  so that the rendered code is flush with the bottom
13155
14921
  of the CodeMessagePart
13156
14922
  */
13157
14923
  margin-bottom: 0px;
13158
- }
13159
- `, "",{"version":3,"sources":["webpack://./style/PythonCode.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,YAAY;EACZ,YAAY;EACZ,WAAW;EACX,oBAAoB;EACpB,wBAAwB;EACxB,0BAA0B;EAC1B,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE;;;;KAIG;EACH,kBAAkB;AACpB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.code-block-python-code pre {\n flex-grow: 1;\n height: 100%;\n width: 100%;\n margin: 0 !important;\n padding: 10px !important;\n font-size: 12px !important;\n overflow-x: auto;\n}\n\n.code-block-python-code code {\n white-space: pre !important;\n}\n\n.code-block-python-code .jp-RenderedHTMLCommon > *:last-child {\n /* \n Remove the default Jupyter ending margin \n so that the rendered code is flush with the bottom\n of the CodeMessagePart\n */\n margin-bottom: 0px;\n}\n"],"sourceRoot":""}]);
14924
+ }`, "",{"version":3,"sources":["webpack://./style/PythonCode.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,YAAY;EACZ,YAAY;EACZ,WAAW;EACX,oBAAoB;EACpB,wBAAwB;EACxB,0BAA0B;EAC1B,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,mCAAmC;EACnC,6BAA6B;AAC/B;;AAEA;EACE;;;;KAIG;EACH,kBAAkB;AACpB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.code-block-python-code pre {\n flex-grow: 1;\n height: 100%;\n width: 100%;\n margin: 0 !important;\n padding: 10px !important;\n font-size: 12px !important;\n overflow-x: auto;\n}\n\n.code-block-python-code code {\n white-space: pre !important;\n}\n\n.code-block-python-code .jp-RenderedHTMLCommon {\n /* Remove default Jupyter padding */\n padding-right: 0px !important;\n}\n\n.code-block-python-code .jp-RenderedHTMLCommon>*:last-child {\n /* \n Remove the default Jupyter ending margin \n so that the rendered code is flush with the bottom\n of the CodeMessagePart\n */\n margin-bottom: 0px;\n}"],"sourceRoot":""}]);
13160
14925
  // Exports
13161
14926
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
13162
14927
 
@@ -13852,441 +15617,32 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
13852
15617
  background-color: var(--purple-400);
13853
15618
  }
13854
15619
 
13855
- .button-width-block {
13856
- width: 100%;
13857
- }
13858
-
13859
- .button-width-fit-contents {
13860
- width: fit-content;
13861
- }
13862
-
13863
- .button-small {
13864
- height: 20px;
13865
- font-size: 12px;
13866
- padding: 2px 5px;
13867
- }
13868
- `, "",{"version":3,"sources":["webpack://./style/button.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;;;;CAIC;;AAED;EACE,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,2EAA2E;EAC3E,mBAAmB;EACnB,iBAAiB;AACnB;;AAEA;EACE,kCAAkC;EAClC,kCAAkC;AACpC;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE,gCAAgC;EAChC,gCAAgC;AAClC;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,yCAAyC;EACzC,+CAA+C;AACjD;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mCAAmC;EACnC,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,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/* \n Classes that can be used for any button, making it easier to keep \n the theme consistent. For example, use them to make a textButton or\n textAndIconButton green.\n*/\n\n.button-base {\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n /* Make sure the button grows large enough so that the text does not wrap */\n white-space: nowrap;\n padding: 5px 10px;\n}\n\n.button-green {\n background-color: var(--green-400);\n color: var(--green-900) !important;\n}\n\n.button-green:hover {\n background-color: var(--green-500);\n}\n\n.button-red {\n background-color: var(--red-400);\n color: var(--red-900) !important;\n}\n\n.button-red:hover {\n background-color: var(--red-500);\n}\n\n.button-gray {\n background-color: var(--jp-layout-color2);\n color: var(--jp-content-font-color1) !important;\n}\n\n.button-gray:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.button-purple {\n background-color: var(--purple-300);\n color: var(--purple-700) !important;\n}\n\n.button-purple:hover {\n background-color: var(--purple-400);\n}\n\n.button-width-block {\n width: 100%;\n}\n\n.button-width-fit-contents {\n width: fit-content;\n}\n\n.button-small {\n height: 20px;\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
13869
- // Exports
13870
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
13871
-
13872
-
13873
- /***/ }),
13874
-
13875
- /***/ "./node_modules/css-loader/dist/runtime/api.js":
13876
- /*!*****************************************************!*\
13877
- !*** ./node_modules/css-loader/dist/runtime/api.js ***!
13878
- \*****************************************************/
13879
- /***/ ((module) => {
13880
-
13881
-
13882
-
13883
- /*
13884
- MIT License http://www.opensource.org/licenses/mit-license.php
13885
- Author Tobias Koppers @sokra
13886
- */
13887
- module.exports = function (cssWithMappingToString) {
13888
- var list = [];
13889
-
13890
- // return the list of modules as css string
13891
- list.toString = function toString() {
13892
- return this.map(function (item) {
13893
- var content = "";
13894
- var needLayer = typeof item[5] !== "undefined";
13895
- if (item[4]) {
13896
- content += "@supports (".concat(item[4], ") {");
13897
- }
13898
- if (item[2]) {
13899
- content += "@media ".concat(item[2], " {");
13900
- }
13901
- if (needLayer) {
13902
- content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
13903
- }
13904
- content += cssWithMappingToString(item);
13905
- if (needLayer) {
13906
- content += "}";
13907
- }
13908
- if (item[2]) {
13909
- content += "}";
13910
- }
13911
- if (item[4]) {
13912
- content += "}";
13913
- }
13914
- return content;
13915
- }).join("");
13916
- };
13917
-
13918
- // import a list of modules into the list
13919
- list.i = function i(modules, media, dedupe, supports, layer) {
13920
- if (typeof modules === "string") {
13921
- modules = [[null, modules, undefined]];
13922
- }
13923
- var alreadyImportedModules = {};
13924
- if (dedupe) {
13925
- for (var k = 0; k < this.length; k++) {
13926
- var id = this[k][0];
13927
- if (id != null) {
13928
- alreadyImportedModules[id] = true;
13929
- }
13930
- }
13931
- }
13932
- for (var _k = 0; _k < modules.length; _k++) {
13933
- var item = [].concat(modules[_k]);
13934
- if (dedupe && alreadyImportedModules[item[0]]) {
13935
- continue;
13936
- }
13937
- if (typeof layer !== "undefined") {
13938
- if (typeof item[5] === "undefined") {
13939
- item[5] = layer;
13940
- } else {
13941
- item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
13942
- item[5] = layer;
13943
- }
13944
- }
13945
- if (media) {
13946
- if (!item[2]) {
13947
- item[2] = media;
13948
- } else {
13949
- item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
13950
- item[2] = media;
13951
- }
13952
- }
13953
- if (supports) {
13954
- if (!item[4]) {
13955
- item[4] = "".concat(supports);
13956
- } else {
13957
- item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
13958
- item[4] = supports;
13959
- }
13960
- }
13961
- list.push(item);
13962
- }
13963
- };
13964
- return list;
13965
- };
13966
-
13967
- /***/ }),
13968
-
13969
- /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js":
13970
- /*!************************************************************!*\
13971
- !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!
13972
- \************************************************************/
13973
- /***/ ((module) => {
13974
-
13975
-
13976
-
13977
- module.exports = function (item) {
13978
- var content = item[1];
13979
- var cssMapping = item[3];
13980
- if (!cssMapping) {
13981
- return content;
13982
- }
13983
- if (typeof btoa === "function") {
13984
- var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
13985
- var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
13986
- var sourceMapping = "/*# ".concat(data, " */");
13987
- return [content].concat([sourceMapping]).join("\n");
13988
- }
13989
- return [content].join("\n");
13990
- };
13991
-
13992
- /***/ }),
13993
-
13994
- /***/ "./node_modules/react-dom/client.js":
13995
- /*!******************************************!*\
13996
- !*** ./node_modules/react-dom/client.js ***!
13997
- \******************************************/
13998
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13999
-
14000
-
14001
-
14002
- var m = __webpack_require__(/*! react-dom */ "webpack/sharing/consume/default/react-dom");
14003
- if (false) {} else {
14004
- var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
14005
- exports.createRoot = function(c, o) {
14006
- i.usingClientEntryPoint = true;
14007
- try {
14008
- return m.createRoot(c, o);
14009
- } finally {
14010
- i.usingClientEntryPoint = false;
14011
- }
14012
- };
14013
- exports.hydrateRoot = function(c, h, o) {
14014
- i.usingClientEntryPoint = true;
14015
- try {
14016
- return m.hydrateRoot(c, h, o);
14017
- } finally {
14018
- i.usingClientEntryPoint = false;
14019
- }
14020
- };
14021
- }
14022
-
14023
-
14024
- /***/ }),
14025
-
14026
- /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
14027
- /*!****************************************************************************!*\
14028
- !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
14029
- \****************************************************************************/
14030
- /***/ ((module) => {
14031
-
14032
-
14033
-
14034
- var stylesInDOM = [];
14035
- function getIndexByIdentifier(identifier) {
14036
- var result = -1;
14037
- for (var i = 0; i < stylesInDOM.length; i++) {
14038
- if (stylesInDOM[i].identifier === identifier) {
14039
- result = i;
14040
- break;
14041
- }
14042
- }
14043
- return result;
14044
- }
14045
- function modulesToDom(list, options) {
14046
- var idCountMap = {};
14047
- var identifiers = [];
14048
- for (var i = 0; i < list.length; i++) {
14049
- var item = list[i];
14050
- var id = options.base ? item[0] + options.base : item[0];
14051
- var count = idCountMap[id] || 0;
14052
- var identifier = "".concat(id, " ").concat(count);
14053
- idCountMap[id] = count + 1;
14054
- var indexByIdentifier = getIndexByIdentifier(identifier);
14055
- var obj = {
14056
- css: item[1],
14057
- media: item[2],
14058
- sourceMap: item[3],
14059
- supports: item[4],
14060
- layer: item[5]
14061
- };
14062
- if (indexByIdentifier !== -1) {
14063
- stylesInDOM[indexByIdentifier].references++;
14064
- stylesInDOM[indexByIdentifier].updater(obj);
14065
- } else {
14066
- var updater = addElementStyle(obj, options);
14067
- options.byIndex = i;
14068
- stylesInDOM.splice(i, 0, {
14069
- identifier: identifier,
14070
- updater: updater,
14071
- references: 1
14072
- });
14073
- }
14074
- identifiers.push(identifier);
14075
- }
14076
- return identifiers;
14077
- }
14078
- function addElementStyle(obj, options) {
14079
- var api = options.domAPI(options);
14080
- api.update(obj);
14081
- var updater = function updater(newObj) {
14082
- if (newObj) {
14083
- if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
14084
- return;
14085
- }
14086
- api.update(obj = newObj);
14087
- } else {
14088
- api.remove();
14089
- }
14090
- };
14091
- return updater;
14092
- }
14093
- module.exports = function (list, options) {
14094
- options = options || {};
14095
- list = list || [];
14096
- var lastIdentifiers = modulesToDom(list, options);
14097
- return function update(newList) {
14098
- newList = newList || [];
14099
- for (var i = 0; i < lastIdentifiers.length; i++) {
14100
- var identifier = lastIdentifiers[i];
14101
- var index = getIndexByIdentifier(identifier);
14102
- stylesInDOM[index].references--;
14103
- }
14104
- var newLastIdentifiers = modulesToDom(newList, options);
14105
- for (var _i = 0; _i < lastIdentifiers.length; _i++) {
14106
- var _identifier = lastIdentifiers[_i];
14107
- var _index = getIndexByIdentifier(_identifier);
14108
- if (stylesInDOM[_index].references === 0) {
14109
- stylesInDOM[_index].updater();
14110
- stylesInDOM.splice(_index, 1);
14111
- }
14112
- }
14113
- lastIdentifiers = newLastIdentifiers;
14114
- };
14115
- };
14116
-
14117
- /***/ }),
14118
-
14119
- /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
14120
- /*!********************************************************************!*\
14121
- !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***!
14122
- \********************************************************************/
14123
- /***/ ((module) => {
14124
-
14125
-
14126
-
14127
- var memo = {};
14128
-
14129
- /* istanbul ignore next */
14130
- function getTarget(target) {
14131
- if (typeof memo[target] === "undefined") {
14132
- var styleTarget = document.querySelector(target);
14133
-
14134
- // Special case to return head of iframe instead of iframe itself
14135
- if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
14136
- try {
14137
- // This will throw an exception if access to iframe is blocked
14138
- // due to cross-origin restrictions
14139
- styleTarget = styleTarget.contentDocument.head;
14140
- } catch (e) {
14141
- // istanbul ignore next
14142
- styleTarget = null;
14143
- }
14144
- }
14145
- memo[target] = styleTarget;
14146
- }
14147
- return memo[target];
14148
- }
14149
-
14150
- /* istanbul ignore next */
14151
- function insertBySelector(insert, style) {
14152
- var target = getTarget(insert);
14153
- if (!target) {
14154
- throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
14155
- }
14156
- target.appendChild(style);
14157
- }
14158
- module.exports = insertBySelector;
14159
-
14160
- /***/ }),
14161
-
14162
- /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
14163
- /*!**********************************************************************!*\
14164
- !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***!
14165
- \**********************************************************************/
14166
- /***/ ((module) => {
14167
-
14168
-
14169
-
14170
- /* istanbul ignore next */
14171
- function insertStyleElement(options) {
14172
- var element = document.createElement("style");
14173
- options.setAttributes(element, options.attributes);
14174
- options.insert(element, options.options);
14175
- return element;
14176
- }
14177
- module.exports = insertStyleElement;
14178
-
14179
- /***/ }),
14180
-
14181
- /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
14182
- /*!**********************************************************************************!*\
14183
- !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***!
14184
- \**********************************************************************************/
14185
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
14186
-
14187
-
14188
-
14189
- /* istanbul ignore next */
14190
- function setAttributesWithoutAttributes(styleElement) {
14191
- var nonce = true ? __webpack_require__.nc : 0;
14192
- if (nonce) {
14193
- styleElement.setAttribute("nonce", nonce);
14194
- }
15620
+ .button-dark-purple {
15621
+ background-color: var(--purple-500);
15622
+ color: var(--white) !important;
14195
15623
  }
14196
- module.exports = setAttributesWithoutAttributes;
14197
-
14198
- /***/ }),
14199
-
14200
- /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
14201
- /*!***************************************************************!*\
14202
- !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***!
14203
- \***************************************************************/
14204
- /***/ ((module) => {
14205
-
14206
-
14207
-
14208
- /* istanbul ignore next */
14209
- function apply(styleElement, options, obj) {
14210
- var css = "";
14211
- if (obj.supports) {
14212
- css += "@supports (".concat(obj.supports, ") {");
14213
- }
14214
- if (obj.media) {
14215
- css += "@media ".concat(obj.media, " {");
14216
- }
14217
- var needLayer = typeof obj.layer !== "undefined";
14218
- if (needLayer) {
14219
- css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
14220
- }
14221
- css += obj.css;
14222
- if (needLayer) {
14223
- css += "}";
14224
- }
14225
- if (obj.media) {
14226
- css += "}";
14227
- }
14228
- if (obj.supports) {
14229
- css += "}";
14230
- }
14231
- var sourceMap = obj.sourceMap;
14232
- if (sourceMap && typeof btoa !== "undefined") {
14233
- css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
14234
- }
14235
15624
 
14236
- // For old IE
14237
- /* istanbul ignore if */
14238
- options.styleTagTransform(css, styleElement, options.options);
14239
- }
14240
- function removeStyleElement(styleElement) {
14241
- // istanbul ignore if
14242
- if (styleElement.parentNode === null) {
14243
- return false;
14244
- }
14245
- styleElement.parentNode.removeChild(styleElement);
15625
+ .button-dark-purple:hover {
15626
+ background-color: var(--purple-600);
14246
15627
  }
14247
15628
 
14248
- /* istanbul ignore next */
14249
- function domAPI(options) {
14250
- if (typeof document === "undefined") {
14251
- return {
14252
- update: function update() {},
14253
- remove: function remove() {}
14254
- };
14255
- }
14256
- var styleElement = options.insertStyleElement(options);
14257
- return {
14258
- update: function update(obj) {
14259
- apply(styleElement, options, obj);
14260
- },
14261
- remove: function remove() {
14262
- removeStyleElement(styleElement);
14263
- }
14264
- };
15629
+ .button-width-block {
15630
+ width: 100%;
14265
15631
  }
14266
- module.exports = domAPI;
14267
-
14268
- /***/ }),
14269
-
14270
- /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
14271
- /*!*********************************************************************!*\
14272
- !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***!
14273
- \*********************************************************************/
14274
- /***/ ((module) => {
14275
-
14276
15632
 
15633
+ .button-width-fit-contents {
15634
+ width: fit-content;
15635
+ }
14277
15636
 
14278
- /* istanbul ignore next */
14279
- function styleTagTransform(css, styleElement) {
14280
- if (styleElement.styleSheet) {
14281
- styleElement.styleSheet.cssText = css;
14282
- } else {
14283
- while (styleElement.firstChild) {
14284
- styleElement.removeChild(styleElement.firstChild);
14285
- }
14286
- styleElement.appendChild(document.createTextNode(css));
14287
- }
15637
+ .button-small {
15638
+ height: 20px;
15639
+ font-size: 12px;
15640
+ padding: 2px 5px;
14288
15641
  }
14289
- module.exports = styleTagTransform;
15642
+ `, "",{"version":3,"sources":["webpack://./style/button.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;;;;CAIC;;AAED;EACE,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,2EAA2E;EAC3E,mBAAmB;EACnB,iBAAiB;AACnB;;AAEA;EACE,kCAAkC;EAClC,kCAAkC;AACpC;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE,gCAAgC;EAChC,gCAAgC;AAClC;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,yCAAyC;EACzC,+CAA+C;AACjD;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mCAAmC;EACnC,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;EACnC,8BAA8B;AAChC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,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/* \n Classes that can be used for any button, making it easier to keep \n the theme consistent. For example, use them to make a textButton or\n textAndIconButton green.\n*/\n\n.button-base {\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n /* Make sure the button grows large enough so that the text does not wrap */\n white-space: nowrap;\n padding: 5px 10px;\n}\n\n.button-green {\n background-color: var(--green-400);\n color: var(--green-900) !important;\n}\n\n.button-green:hover {\n background-color: var(--green-500);\n}\n\n.button-red {\n background-color: var(--red-400);\n color: var(--red-900) !important;\n}\n\n.button-red:hover {\n background-color: var(--red-500);\n}\n\n.button-gray {\n background-color: var(--jp-layout-color2);\n color: var(--jp-content-font-color1) !important;\n}\n\n.button-gray:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.button-purple {\n background-color: var(--purple-300);\n color: var(--purple-700) !important;\n}\n\n.button-purple:hover {\n background-color: var(--purple-400);\n}\n\n.button-dark-purple {\n background-color: var(--purple-500);\n color: var(--white) !important;\n}\n\n.button-dark-purple:hover {\n background-color: var(--purple-600);\n}\n\n.button-width-block {\n width: 100%;\n}\n\n.button-width-fit-contents {\n width: fit-content;\n}\n\n.button-small {\n height: 20px;\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
15643
+ // Exports
15644
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
15645
+
14290
15646
 
14291
15647
  /***/ }),
14292
15648
 
@@ -14402,6 +15758,168 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
14402
15758
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AgentComponentHeader_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AgentComponentHeader_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AgentComponentHeader_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
14403
15759
 
14404
15760
 
15761
+ /***/ }),
15762
+
15763
+ /***/ "./style/AgentToolUIComponent.css":
15764
+ /*!****************************************!*\
15765
+ !*** ./style/AgentToolUIComponent.css ***!
15766
+ \****************************************/
15767
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15768
+
15769
+ __webpack_require__.r(__webpack_exports__);
15770
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15771
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15772
+ /* harmony export */ });
15773
+ /* 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");
15774
+ /* 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__);
15775
+ /* 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");
15776
+ /* 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__);
15777
+ /* 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");
15778
+ /* 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__);
15779
+ /* 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");
15780
+ /* 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__);
15781
+ /* 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");
15782
+ /* 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__);
15783
+ /* 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");
15784
+ /* 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__);
15785
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AgentToolUIComponent.css */ "./node_modules/css-loader/dist/cjs.js!./style/AgentToolUIComponent.css");
15786
+
15787
+
15788
+
15789
+
15790
+
15791
+
15792
+
15793
+
15794
+
15795
+
15796
+
15797
+ var options = {};
15798
+
15799
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
15800
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
15801
+
15802
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
15803
+
15804
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
15805
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
15806
+
15807
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
15808
+
15809
+
15810
+
15811
+
15812
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AgentToolUIComponent_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
15813
+
15814
+
15815
+ /***/ }),
15816
+
15817
+ /***/ "./style/AlertBlock.css":
15818
+ /*!******************************!*\
15819
+ !*** ./style/AlertBlock.css ***!
15820
+ \******************************/
15821
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15822
+
15823
+ __webpack_require__.r(__webpack_exports__);
15824
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15825
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15826
+ /* harmony export */ });
15827
+ /* 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");
15828
+ /* 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__);
15829
+ /* 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");
15830
+ /* 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__);
15831
+ /* 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");
15832
+ /* 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__);
15833
+ /* 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");
15834
+ /* 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__);
15835
+ /* 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");
15836
+ /* 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__);
15837
+ /* 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");
15838
+ /* 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__);
15839
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AlertBlock_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AlertBlock.css */ "./node_modules/css-loader/dist/cjs.js!./style/AlertBlock.css");
15840
+
15841
+
15842
+
15843
+
15844
+
15845
+
15846
+
15847
+
15848
+
15849
+
15850
+
15851
+ var options = {};
15852
+
15853
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
15854
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
15855
+
15856
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
15857
+
15858
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
15859
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
15860
+
15861
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AlertBlock_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
15862
+
15863
+
15864
+
15865
+
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);
15867
+
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
+
14405
15923
  /***/ }),
14406
15924
 
14407
15925
  /***/ "./style/AssumptionTool.css":
@@ -14456,6 +15974,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
14456
15974
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AssumptionTool_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AssumptionTool_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AssumptionTool_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
14457
15975
 
14458
15976
 
15977
+ /***/ }),
15978
+
15979
+ /***/ "./style/AuthPopup.css":
15980
+ /*!*****************************!*\
15981
+ !*** ./style/AuthPopup.css ***!
15982
+ \*****************************/
15983
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15984
+
15985
+ __webpack_require__.r(__webpack_exports__);
15986
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15987
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15988
+ /* harmony export */ });
15989
+ /* 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");
15990
+ /* 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__);
15991
+ /* 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");
15992
+ /* 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__);
15993
+ /* 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");
15994
+ /* 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__);
15995
+ /* 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");
15996
+ /* 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__);
15997
+ /* 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");
15998
+ /* 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__);
15999
+ /* 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");
16000
+ /* 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__);
16001
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_AuthPopup_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./AuthPopup.css */ "./node_modules/css-loader/dist/cjs.js!./style/AuthPopup.css");
16002
+
16003
+
16004
+
16005
+
16006
+
16007
+
16008
+
16009
+
16010
+
16011
+
16012
+
16013
+ var options = {};
16014
+
16015
+ options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
16016
+ options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
16017
+
16018
+ options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
16019
+
16020
+ options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
16021
+ options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
16022
+
16023
+ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_AuthPopup_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
16024
+
16025
+
16026
+
16027
+
16028
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_AuthPopup_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_AuthPopup_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_AuthPopup_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
16029
+
16030
+
14459
16031
  /***/ }),
14460
16032
 
14461
16033
  /***/ "./style/CTACarousel.css":
@@ -15104,60 +16676,6 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
15104
16676
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_ErrorMimeRendererPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_ErrorMimeRendererPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_ErrorMimeRendererPlugin_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
15105
16677
 
15106
16678
 
15107
- /***/ }),
15108
-
15109
- /***/ "./style/GetCellOutputToolUI.css":
15110
- /*!***************************************!*\
15111
- !*** ./style/GetCellOutputToolUI.css ***!
15112
- \***************************************/
15113
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15114
-
15115
- __webpack_require__.r(__webpack_exports__);
15116
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15117
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15118
- /* harmony export */ });
15119
- /* 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");
15120
- /* 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__);
15121
- /* 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");
15122
- /* 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__);
15123
- /* 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");
15124
- /* 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__);
15125
- /* 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");
15126
- /* 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__);
15127
- /* 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");
15128
- /* 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__);
15129
- /* 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");
15130
- /* 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__);
15131
- /* harmony import */ var _node_modules_css_loader_dist_cjs_js_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./GetCellOutputToolUI.css */ "./node_modules/css-loader/dist/cjs.js!./style/GetCellOutputToolUI.css");
15132
-
15133
-
15134
-
15135
-
15136
-
15137
-
15138
-
15139
-
15140
-
15141
-
15142
-
15143
- var options = {};
15144
-
15145
- options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
15146
- options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
15147
-
15148
- options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
15149
-
15150
- options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
15151
- options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
15152
-
15153
- var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
15154
-
15155
-
15156
-
15157
-
15158
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_GetCellOutputToolUI_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
15159
-
15160
-
15161
16679
  /***/ }),
15162
16680
 
15163
16681
  /***/ "./style/IconButton.css":
@@ -15917,4 +17435,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
15917
17435
  /***/ })
15918
17436
 
15919
17437
  }]);
15920
- //# sourceMappingURL=lib_index_js.55d9f8ca386d87856d2d.js.map
17438
+ //# sourceMappingURL=lib_index_js.a9a35b6fcc54a7bcb32c.js.map